Merge remote-tracking branch 'origin/4.15'
diff --git a/INSTALL.md b/INSTALL.md
index 6fc022b..bc99e64 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -20,10 +20,10 @@
 
 Set up Maven (3.6.0):
 
-    # wget http://www.us.apache.org/dist/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
-    # tar -zxvf apache-maven-3.6.0-bin.tar.gz -C /usr/local
+    # wget http://www.us.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
+    # tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local
     # cd /usr/local
-    # ln -s apache-maven-3.6.0 maven
+    # ln -s apache-maven-3.6.3 maven
     # echo export M2_HOME=/usr/local/maven >> ~/.bashrc # or .zshrc or .profile
     # echo export PATH=/usr/local/maven/bin:${PATH} >> ~/.bashrc # or .zshrc or .profile
     # source ~/.bashrc
diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties
index 325e12d..06d8f3f 100644
--- a/agent/conf/agent.properties
+++ b/agent/conf/agent.properties
@@ -143,6 +143,9 @@
 # This parameter specifies a directory on the host local storage for temporary storing direct download templates
 #direct.download.temporary.download.location=/var/lib/libvirt/images
 
+# This parameter specifies a directory on the host local storage for creating and hosting the config drives
+#host.cache.location=/var/cache/cloud
+
 # set the rolling maintenance hook scripts directory
 #rolling.maintenance.hooks.dir=/etc/cloudstack/agent/hooks.d
 
diff --git a/agent/pom.xml b/agent/pom.xml
index 317b9f5..1d19578 100644
--- a/agent/pom.xml
+++ b/agent/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/api/pom.xml b/api/pom.xml
index d1cc731..863236a 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java b/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java
index efc735c..c472938 100644
--- a/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java
+++ b/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java
@@ -20,6 +20,7 @@
 import java.util.Map;
 import java.util.HashMap;
 
+import com.cloud.network.element.NetworkElement;
 import com.cloud.template.VirtualMachineTemplate.BootloaderType;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.Type;
@@ -73,6 +74,7 @@
     String configDriveLabel = null;
     String configDriveIsoRootFolder = null;
     String configDriveIsoFile = null;
+    NetworkElement.Location configDriveLocation = NetworkElement.Location.SECONDARY;
 
     Double cpuQuotaPercentage = null;
 
@@ -349,6 +351,18 @@
         this.configDriveIsoFile = configDriveIsoFile;
     }
 
+    public boolean isConfigDriveOnHostCache() {
+        return (this.configDriveLocation == NetworkElement.Location.HOST);
+    }
+
+    public NetworkElement.Location getConfigDriveLocation() {
+        return configDriveLocation;
+    }
+
+    public void setConfigDriveLocation(NetworkElement.Location configDriveLocation) {
+        this.configDriveLocation = configDriveLocation;
+    }
+
     public Map<String, String> getGuestOsDetails() {
         return guestOsDetails;
     }
diff --git a/api/src/main/java/com/cloud/domain/Domain.java b/api/src/main/java/com/cloud/domain/Domain.java
index 365a705..7441507 100644
--- a/api/src/main/java/com/cloud/domain/Domain.java
+++ b/api/src/main/java/com/cloud/domain/Domain.java
@@ -42,6 +42,8 @@
 
     void setName(String name);
 
+    Date getCreated();
+
     Date getRemoved();
 
     String getPath();
diff --git a/ui/legacy/modules/modules.js b/api/src/main/java/com/cloud/exception/StorageAccessException.java
similarity index 65%
copy from ui/legacy/modules/modules.js
copy to api/src/main/java/com/cloud/exception/StorageAccessException.java
index 1e4cd45..eefbcf5 100644
--- a/ui/legacy/modules/modules.js
+++ b/api/src/main/java/com/cloud/exception/StorageAccessException.java
@@ -14,11 +14,19 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-(function($, cloudStack) {
-  cloudStack.modules = [
-    'vpc',
-    'infrastructure',
-    'vnmcNetworkProvider',
-    'vnmcAsa1000v'
-  ];
-}(jQuery, cloudStack));
+package com.cloud.exception;
+
+import com.cloud.utils.SerialVersionUID;
+
+/**
+ * If the cause is due to storage pool not accessible on host, calling
+ * problem with.
+ *
+ */
+public class StorageAccessException extends RuntimeException {
+    private static final long serialVersionUID = SerialVersionUID.StorageAccessException;
+
+    public StorageAccessException(String message) {
+        super(message);
+    }
+}
diff --git a/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java b/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java
index 8a10964..96518ac 100644
--- a/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java
+++ b/api/src/main/java/com/cloud/hypervisor/HypervisorGuru.java
@@ -27,6 +27,7 @@
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.StoragePool;
+import com.cloud.storage.Volume;
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.Adapter;
 import com.cloud.vm.NicProfile;
@@ -99,5 +100,5 @@
      * @param destination the primary storage pool to migrate to
      * @return a list of commands to perform for a successful migration
      */
-    List<Command> finalizeMigrate(VirtualMachine vm, StoragePool destination);
+    List<Command> finalizeMigrate(VirtualMachine vm, Map<Volume, StoragePool> volumeToPool);
 }
diff --git a/api/src/main/java/com/cloud/network/Network.java b/api/src/main/java/com/cloud/network/Network.java
index 599bfee..37b8f33 100644
--- a/api/src/main/java/com/cloud/network/Network.java
+++ b/api/src/main/java/com/cloud/network/Network.java
@@ -452,4 +452,8 @@
     String getExternalId();
 
     PVlanType getPvlanType();
+
+    String getRouterIp();
+
+    String getRouterIpv6();
 }
diff --git a/api/src/main/java/com/cloud/network/NetworkProfile.java b/api/src/main/java/com/cloud/network/NetworkProfile.java
index 117f90e..08a420a 100644
--- a/api/src/main/java/com/cloud/network/NetworkProfile.java
+++ b/api/src/main/java/com/cloud/network/NetworkProfile.java
@@ -319,4 +319,14 @@
         return null;
     }
 
+    @Override
+    public String getRouterIp() {
+        return null;
+    }
+
+    @Override
+    public String getRouterIpv6() {
+        return null;
+    }
+
 }
diff --git a/api/src/main/java/com/cloud/network/VirtualNetworkApplianceService.java b/api/src/main/java/com/cloud/network/VirtualNetworkApplianceService.java
index 98fb8be..8504efd 100644
--- a/api/src/main/java/com/cloud/network/VirtualNetworkApplianceService.java
+++ b/api/src/main/java/com/cloud/network/VirtualNetworkApplianceService.java
@@ -26,6 +26,7 @@
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.user.Account;
+import com.cloud.utils.Pair;
 
 public interface VirtualNetworkApplianceService {
     /**
@@ -73,5 +74,5 @@
      * @param routerId id of the router
      * @return
      */
-    boolean performRouterHealthChecks(long routerId);
+    Pair<Boolean, String> performRouterHealthChecks(long routerId);
 }
diff --git a/api/src/main/java/com/cloud/network/element/NetworkElement.java b/api/src/main/java/com/cloud/network/element/NetworkElement.java
index 951732f..fa67575 100644
--- a/api/src/main/java/com/cloud/network/element/NetworkElement.java
+++ b/api/src/main/java/com/cloud/network/element/NetworkElement.java
@@ -39,6 +39,10 @@
  */
 public interface NetworkElement extends Adapter {
 
+    enum Location {
+        SECONDARY, PRIMARY, HOST
+    }
+
     Map<Service, Map<Capability, String>> getCapabilities();
 
     /**
diff --git a/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java b/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java
index 8bba19c..42d8272 100644
--- a/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java
+++ b/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java
@@ -35,7 +35,7 @@
     VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices,
                                   Map<String, List<String>> serviceProviders,
                                   Map serviceCapabilitystList,
-                                  Long serviceOfferingId, List<Long> domainIds, List<Long> zoneIds);
+                                  Long serviceOfferingId, List<Long> domainIds, List<Long> zoneIds, VpcOffering.State state);
 
     Pair<List<? extends VpcOffering>,Integer> listVpcOfferings(ListVPCOfferingsCmd cmd);
 
diff --git a/api/src/main/java/com/cloud/storage/Storage.java b/api/src/main/java/com/cloud/storage/Storage.java
index 7a229b6..362cc2c 100644
--- a/api/src/main/java/com/cloud/storage/Storage.java
+++ b/api/src/main/java/com/cloud/storage/Storage.java
@@ -135,6 +135,7 @@
         OCFS2(true, false),
         SMB(true, false),
         Gluster(true, false),
+        PowerFlex(true, true), // Dell EMC PowerFlex/ScaleIO (formerly VxFlexOS)
         ManagedNFS(true, false),
         DatastoreCluster(true, true); // for VMware, to abstract pool of clusters
 
diff --git a/api/src/main/java/com/cloud/storage/Volume.java b/api/src/main/java/com/cloud/storage/Volume.java
index 5979697..9036fa5 100644
--- a/api/src/main/java/com/cloud/storage/Volume.java
+++ b/api/src/main/java/com/cloud/storage/Volume.java
@@ -29,6 +29,11 @@
 import com.cloud.utils.fsm.StateObject;
 
 public interface Volume extends ControlledEntity, Identity, InternalIdentity, BasedOn, StateObject<Volume.State>, Displayable {
+
+    // Managed storage volume parameters (specified in the compute/disk offering for PowerFlex)
+    String BANDWIDTH_LIMIT_IN_MBPS = "bandwidthLimitInMbps";
+    String IOPS_LIMIT = "iopsLimit";
+
     enum Type {
         UNKNOWN, ROOT, SWAP, DATADISK, ISO
     };
@@ -79,6 +84,7 @@
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.OperationSucceeded, Ready, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.DestroyRequested, Destroy, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.CreateRequested, Creating, null));
+            s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.CreateRequested, Creating, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.ResizeRequested, Resizing, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Resizing, Event.OperationSucceeded, Ready, Arrays.asList(new StateMachine2.Transition.Impact[]{StateMachine2.Transition.Impact.USAGE})));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Resizing, Event.OperationFailed, Ready, null));
diff --git a/api/src/main/java/com/cloud/user/Account.java b/api/src/main/java/com/cloud/user/Account.java
index 58cedcd..39e91fa 100644
--- a/api/src/main/java/com/cloud/user/Account.java
+++ b/api/src/main/java/com/cloud/user/Account.java
@@ -50,6 +50,8 @@
 
     public State getState();
 
+    public Date getCreated();
+
     public Date getRemoved();
 
     public String getNetworkDomain();
diff --git a/api/src/main/java/com/cloud/vm/UserVmService.java b/api/src/main/java/com/cloud/vm/UserVmService.java
index 56a6dfd..eab9c73 100644
--- a/api/src/main/java/com/cloud/vm/UserVmService.java
+++ b/api/src/main/java/com/cloud/vm/UserVmService.java
@@ -488,6 +488,8 @@
 
     VirtualMachine vmStorageMigration(Long vmId, StoragePool destPool);
 
+    VirtualMachine vmStorageMigration(Long vmId, Map<String, String> volumeToPool);
+
     UserVm restoreVM(RestoreVMCmd cmd) throws InsufficientCapacityException, ResourceUnavailableException;
 
     UserVm restoreVirtualMachine(Account caller, long vmId, Long newTemplateId) throws InsufficientCapacityException, ResourceUnavailableException;
diff --git a/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java b/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java
index c17a716..f87939a 100644
--- a/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java
+++ b/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java
@@ -20,7 +20,9 @@
 import java.util.Map;
 
 import com.cloud.agent.api.to.DiskTO;
+import com.cloud.host.Host;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.element.NetworkElement;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.template.VirtualMachineTemplate;
 import com.cloud.template.VirtualMachineTemplate.BootloaderType;
@@ -54,6 +56,10 @@
 
     void setConfigDriveIsoFile(String isoFile);
 
+    NetworkElement.Location getConfigDriveLocation();
+
+    void setConfigDriveLocation(NetworkElement.Location location);
+
     public static class Param {
 
         public static final Param VmPassword = new Param("VmPassword");
@@ -100,6 +106,10 @@
         }
     }
 
+    Long getHostId();
+
+    void setHost(Host host);
+
     String getHostName();
 
     String getInstanceName();
diff --git a/api/src/main/java/com/cloud/vm/VmDetailConstants.java b/api/src/main/java/com/cloud/vm/VmDetailConstants.java
index 9991e1f..64de939 100644
--- a/api/src/main/java/com/cloud/vm/VmDetailConstants.java
+++ b/api/src/main/java/com/cloud/vm/VmDetailConstants.java
@@ -56,6 +56,8 @@
     String PASSWORD = "password";
     String ENCRYPTED_PASSWORD = "Encrypted.Password";
 
+    String CONFIG_DRIVE_LOCATION = "configDriveLocation";
+
     // VM import with nic, disk and custom params for custom compute offering
     String NIC = "nic";
     String NETWORK = "network";
diff --git a/api/src/main/java/org/apache/cloudstack/alert/AlertService.java b/api/src/main/java/org/apache/cloudstack/alert/AlertService.java
index 26c3f3c..c2cd1b2 100644
--- a/api/src/main/java/org/apache/cloudstack/alert/AlertService.java
+++ b/api/src/main/java/org/apache/cloudstack/alert/AlertService.java
@@ -16,12 +16,12 @@
 // under the License.
 package org.apache.cloudstack.alert;
 
-import com.cloud.capacity.Capacity;
-import com.cloud.exception.InvalidParameterValueException;
-
 import java.util.HashSet;
 import java.util.Set;
 
+import com.cloud.capacity.Capacity;
+import com.cloud.exception.InvalidParameterValueException;
+
 public interface AlertService {
     public static class AlertType {
         private static Set<AlertType> defaultAlertTypes = new HashSet<AlertType>();
@@ -69,6 +69,7 @@
         public static final AlertType ALERT_TYPE_OOBM_AUTH_ERROR = new AlertType((short)29, "ALERT.OOBM.AUTHERROR", true);
         public static final AlertType ALERT_TYPE_HA_ACTION = new AlertType((short)30, "ALERT.HA.ACTION", true);
         public static final AlertType ALERT_TYPE_CA_CERT = new AlertType((short)31, "ALERT.CA.CERT", true);
+        public static final AlertType ALERT_TYPE_VM_SNAPSHOT = new AlertType((short)32, "ALERT.VM.SNAPSHOT", true);
 
         public short getType() {
             return type;
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 0087fee..8b9df63 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -339,6 +339,7 @@
     public static final String SNAPSHOT_POLICY_ID = "snapshotpolicyid";
     public static final String SNAPSHOT_TYPE = "snapshottype";
     public static final String SNAPSHOT_QUIESCEVM = "quiescevm";
+    public static final String SUPPORTS_STORAGE_SNAPSHOT = "supportsstoragesnapshot";
     public static final String SOURCE_ZONE_ID = "sourcezoneid";
     public static final String START_DATE = "startdate";
     public static final String START_ID = "startid";
@@ -802,6 +803,8 @@
     public static final String ROUTER_HEALTH_CHECKS = "healthchecks";
     public static final String ROUTER_CHECK_NAME = "checkname";
     public static final String ROUTER_CHECK_TYPE = "checktype";
+    public static final String ROUTER_IP = "routerip";
+    public static final String ROUTER_IPV6 = "routeripv6";
     public static final String LAST_UPDATED = "lastupdated";
     public static final String PERFORM_FRESH_CHECKS = "performfreshchecks";
     public static final String CACHE_MODE = "cachemode";
@@ -832,6 +835,8 @@
     public static final String TEMPLATETYPE = "templatetype";
     public static final String SOURCETEMPLATEID = "sourcetemplateid";
 
+    public static final String POOL_TYPE ="pooltype";
+
     public enum BootType {
         UEFI, BIOS;
 
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java
index 1f32f62..53b0271 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.network;
 
+import org.apache.cloudstack.api.ApiArgValidator;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -42,6 +43,14 @@
     @Parameter(name=ApiConstants.HIDE_IP_ADDRESS_USAGE, type=CommandType.BOOLEAN, description="when true ip address usage for the network will not be exported by the listUsageRecords API")
     private Boolean hideIpAddressUsage;
 
+    @Parameter(name = ApiConstants.ROUTER_IP, type = CommandType.STRING, description = "IPV4 address to be assigned to a router in a shared network", since = "4.16",
+            validations = {ApiArgValidator.NotNullOrEmpty})
+    private String routerIp;
+
+    @Parameter(name = ApiConstants.ROUTER_IPV6, type = CommandType.STRING, description = "IPV6 address to be assigned to a router in a shared network", since = "4.16",
+            validations = {ApiArgValidator.NotNullOrEmpty})
+    private String routerIpv6;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -63,4 +72,12 @@
         }
         return false;
     }
+
+    public String getRouterIp() {
+        return routerIp;
+    }
+
+    public String getRouterIpv6() {
+        return routerIpv6;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
index 39c443c..cd003a7 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
@@ -158,6 +158,12 @@
             since = "4.13")
     private List<Long> zoneIds;
 
+    @Parameter(name = ApiConstants.ENABLE,
+            type = CommandType.BOOLEAN,
+            description = "set to true if the offering is to be enabled during creation. Default is false",
+            since = "4.16")
+    private Boolean enable;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -337,6 +343,13 @@
         return zoneIds;
     }
 
+    public Boolean getEnable() {
+        if (enable != null) {
+            return enable;
+        }
+        return false;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java
index a830777..e7b46be 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java
@@ -16,8 +16,11 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.offering;
 
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.cloudstack.api.APICommand;
@@ -31,6 +34,7 @@
 import org.apache.cloudstack.api.response.VsphereStoragePoliciesResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.offering.DiskOffering;
@@ -155,7 +159,10 @@
     @Parameter(name = ApiConstants.STORAGE_POLICY, type = CommandType.UUID, entityType = VsphereStoragePoliciesResponse.class,required = false, description = "Name of the storage policy defined at vCenter, this is applicable only for VMware", since = "4.15")
     private Long storagePolicy;
 
-/////////////////////////////////////////////////////
+    @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "details to specify disk offering parameters", since = "4.16")
+    private Map details;
+
+    /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
 
@@ -277,6 +284,20 @@
         return cacheMode;
     }
 
+    public Map<String, String> getDetails() {
+        Map<String, String> detailsMap = new HashMap<>();
+        if (MapUtils.isNotEmpty(details)) {
+            Collection<?> props = details.values();
+            for (Object prop : props) {
+                HashMap<String, String> detail = (HashMap<String, String>) prop;
+                for (Map.Entry<String, String> entry: detail.entrySet()) {
+                    detailsMap.put(entry.getKey(),entry.getValue());
+                }
+            }
+        }
+        return detailsMap;
+    }
+
     public Long getStoragePolicy() {
         return storagePolicy;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java
index 3219422..d2d6f38 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java
@@ -321,7 +321,15 @@
             Collection<?> props = details.values();
             for (Object prop : props) {
                 HashMap<String, String> detail = (HashMap<String, String>) prop;
-                detailsMap.put(detail.get("key"), detail.get("value"));
+                // Compatibility with key and value pairs input from API cmd for details map parameter
+                if (!Strings.isNullOrEmpty(detail.get("key")) && !Strings.isNullOrEmpty(detail.get("value"))) {
+                    detailsMap.put(detail.get("key"), detail.get("value"));
+                    continue;
+                }
+
+                for (Map.Entry<String, String> entry: detail.entrySet()) {
+                    detailsMap.put(entry.getKey(),entry.getValue());
+                }
             }
         }
         return detailsMap;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/GetRouterHealthCheckResultsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/GetRouterHealthCheckResultsCmd.java
index 5efc6de..dc1020b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/GetRouterHealthCheckResultsCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/GetRouterHealthCheckResultsCmd.java
@@ -111,7 +111,7 @@
             setResponseObject(routerResponse);
         } catch (CloudRuntimeException ex){
             ex.printStackTrace();
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to execute command due to exception: " + ex.getLocalizedMessage());
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to get health check results due to: " + ex.getLocalizedMessage());
         }
     }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java
index ab0018b..50129a5 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java
@@ -16,7 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.systemvm;
 
-import org.apache.log4j.Logger;
+import java.util.HashMap;
 
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.ACL;
@@ -27,8 +27,10 @@
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.SystemVmResponse;
 import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
@@ -37,6 +39,7 @@
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.exception.VirtualMachineMigrationException;
 import com.cloud.host.Host;
+import com.cloud.storage.StoragePool;
 import com.cloud.user.Account;
 import com.cloud.vm.VirtualMachine;
 
@@ -54,7 +57,6 @@
     @Parameter(name = ApiConstants.HOST_ID,
                type = CommandType.UUID,
                entityType = HostResponse.class,
-               required = true,
                description = "destination Host ID to migrate VM to")
     private Long hostId;
 
@@ -66,6 +68,13 @@
                description = "the ID of the virtual machine")
     private Long virtualMachineId;
 
+    @Parameter(name = ApiConstants.STORAGE_ID,
+            since = "4.16.0",
+            type = CommandType.UUID,
+            entityType = StoragePoolResponse.class,
+            description = "Destination storage pool ID to migrate VM volumes to. Required for migrating the root disk volume")
+    private Long storageId;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -78,6 +87,10 @@
         return virtualMachineId;
     }
 
+    public Long getStorageId() {
+        return storageId;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -109,15 +122,35 @@
 
     @Override
     public void execute() {
+        if (getHostId() == null && getStorageId() == null) {
+            throw new InvalidParameterValueException("Either hostId or storageId must be specified");
+        }
 
-        Host destinationHost = _resourceService.getHost(getHostId());
-        if (destinationHost == null) {
-            throw new InvalidParameterValueException("Unable to find the host to migrate the VM, host id=" + getHostId());
+        if (getHostId() != null && getStorageId() != null) {
+            throw new InvalidParameterValueException("Only one of hostId and storageId can be specified");
         }
         try {
-            CallContext.current().setEventDetails("VM Id: " + this._uuidMgr.getUuid(VirtualMachine.class, getVirtualMachineId()) + " to host Id: " + this._uuidMgr.getUuid(Host.class, getHostId()));
             //FIXME : Should not be calling UserVmService to migrate all types of VMs - need a generic VM layer
-            VirtualMachine migratedVm = _userVmService.migrateVirtualMachine(getVirtualMachineId(), destinationHost);
+            VirtualMachine migratedVm = null;
+            if (getHostId() != null) {
+                Host destinationHost = _resourceService.getHost(getHostId());
+                if (destinationHost == null) {
+                    throw new InvalidParameterValueException("Unable to find the host to migrate the VM, host id=" + getHostId());
+                }
+                if (destinationHost.getType() != Host.Type.Routing) {
+                    throw new InvalidParameterValueException("The specified host(" + destinationHost.getName() + ") is not suitable to migrate the VM, please specify another one");
+                }
+                CallContext.current().setEventDetails("VM Id: " + getVirtualMachineId() + " to host Id: " + getHostId());
+                migratedVm = _userVmService.migrateVirtualMachineWithVolume(getVirtualMachineId(), destinationHost, new HashMap<String, String>());
+            } else if (getStorageId() != null) {
+                // OfflineMigration performed when this parameter is specified
+                StoragePool destStoragePool = _storageService.getStoragePool(getStorageId());
+                if (destStoragePool == null) {
+                    throw new InvalidParameterValueException("Unable to find the storage pool to migrate the VM");
+                }
+                CallContext.current().setEventDetails("VM Id: " + getVirtualMachineId() + " to storage pool Id: " + getStorageId());
+                migratedVm = _userVmService.vmStorageMigration(getVirtualMachineId(), destStoragePool);
+            }
             if (migratedVm != null) {
                 // return the generic system VM instance response
                 SystemVmResponse response = _responseGenerator.createSystemVmResponse(migratedVm);
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java
index 65d71cc..e4fa4f1 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java
@@ -21,8 +21,6 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
@@ -32,6 +30,8 @@
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
+import org.apache.commons.collections.MapUtils;
+import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
@@ -61,7 +61,6 @@
     @Parameter(name = ApiConstants.HOST_ID,
                type = CommandType.UUID,
                entityType = HostResponse.class,
-               required = true,
                description = "Destination Host ID to migrate VM to.")
     private Long hostId;
 
@@ -97,7 +96,7 @@
 
     public Map<String, String> getVolumeToPool() {
         Map<String, String> volumeToPoolMap = new HashMap<String, String>();
-        if (migrateVolumeTo != null && !migrateVolumeTo.isEmpty()) {
+        if (MapUtils.isNotEmpty(migrateVolumeTo)) {
             Collection<?> allValues = migrateVolumeTo.values();
             Iterator<?> iter = allValues.iterator();
             while (iter.hasNext()) {
@@ -141,19 +140,35 @@
 
     @Override
     public void execute() {
+        if (hostId == null && MapUtils.isEmpty(migrateVolumeTo)) {
+            throw new InvalidParameterValueException(String.format("Either %s or %s  must be passed for migrating the VM", ApiConstants.HOST_ID, ApiConstants.MIGRATE_TO));
+        }
+
         UserVm userVm = _userVmService.getUserVm(getVirtualMachineId());
         if (userVm == null) {
             throw new InvalidParameterValueException("Unable to find the VM by id=" + getVirtualMachineId());
         }
 
-        Host destinationHost = _resourceService.getHost(getHostId());
-        // OfflineVmwareMigration: destination host would have to not be a required parameter for stopped VMs
-        if (destinationHost == null) {
-            throw new InvalidParameterValueException("Unable to find the host to migrate the VM, host id =" + getHostId());
+        if (!VirtualMachine.State.Running.equals(userVm.getState()) && hostId != null) {
+            throw new InvalidParameterValueException(String.format("VM ID: %s is not in Running state to migrate it to new host", userVm.getUuid()));
+        }
+
+        if (!VirtualMachine.State.Stopped.equals(userVm.getState()) && hostId == null) {
+            throw new InvalidParameterValueException(String.format("VM ID: %s is not in Stopped state to migrate, use %s parameter to migrate it to a new host", userVm.getUuid(), ApiConstants.HOST_ID));
         }
 
         try {
-            VirtualMachine migratedVm = _userVmService.migrateVirtualMachineWithVolume(getVirtualMachineId(), destinationHost, getVolumeToPool());
+            VirtualMachine migratedVm = null;
+            if (hostId != null) {
+                Host destinationHost = _resourceService.getHost(getHostId());
+                // OfflineVmwareMigration: destination host would have to not be a required parameter for stopped VMs
+                if (destinationHost == null) {
+                    throw new InvalidParameterValueException("Unable to find the host to migrate the VM, host id =" + getHostId());
+                }
+                migratedVm = _userVmService.migrateVirtualMachineWithVolume(getVirtualMachineId(), destinationHost, getVolumeToPool());
+            } else if (MapUtils.isNotEmpty(migrateVolumeTo)) {
+                migratedVm = _userVmService.vmStorageMigration(getVirtualMachineId(), getVolumeToPool());
+            }
             if (migratedVm != null) {
                 UserVmResponse response = _responseGenerator.createUserVmResponse(ResponseView.Full, "virtualmachine", (UserVm)migratedVm).get(0);
                 response.setResponseName(getCommandName());
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java
index d629a6e..2f4949d 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java
@@ -95,6 +95,12 @@
             since = "4.13")
     private List<Long> zoneIds;
 
+    @Parameter(name = ApiConstants.ENABLE,
+            type = CommandType.BOOLEAN,
+            description = "set to true if the offering is to be enabled during creation. Default is false",
+            since = "4.16")
+    private Boolean enable;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -165,6 +171,13 @@
         return zoneIds;
     }
 
+    public Boolean getEnable() {
+        if (enable != null) {
+            return enable;
+        }
+        return false;
+    }
+
     @Override
     public void create() throws ResourceAllocationException {
         VpcOffering vpcOff = _vpcProvSvc.createVpcOffering(this);
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/AccountResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/AccountResponse.java
index d22ee52..5cd2fd3 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/AccountResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/AccountResponse.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -238,6 +239,10 @@
     @Param(description = "true if the account requires cleanup")
     private Boolean cleanupRequired;
 
+    @SerializedName(ApiConstants.CREATED)
+    @Param(description="the date when this account was created")
+    private Date created;
+
     @SerializedName("user")
     @Param(description = "the list of users associated with account", responseObject = UserResponse.class)
     private List<UserResponse> users;
@@ -398,6 +403,10 @@
         this.state = state;
     }
 
+    public void setCreated(Date created) {
+        this.created = created;
+    }
+
     public void setCleanupRequired(Boolean cleanupRequired) {
         this.cleanupRequired = cleanupRequired;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java
index 7e5bd97..818822b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java
@@ -25,6 +25,8 @@
 import com.cloud.domain.Domain;
 import com.cloud.serializer.Param;
 
+import java.util.Date;
+
 @EntityReference(value = Domain.class)
 public class DomainResponse extends BaseResponse implements ResourceLimitAndCountResponse {
     @SerializedName(ApiConstants.ID)
@@ -62,6 +64,9 @@
     @SerializedName(ApiConstants.STATE) @Param(description="the state of the domain")
     private String state;
 
+    @SerializedName(ApiConstants.CREATED) @Param(description="the date when this domain was created")
+    private Date created;
+
     @SerializedName(ApiConstants.VM_LIMIT) @Param(description="the total number of virtual machines that can be deployed by this domain")
     private String vmLimit;
 
@@ -230,6 +235,9 @@
         this.path = path;
     }
 
+    public void setCreated(Date created) {
+        this.created = created;
+    }
 
     @Override
     public void setVmLimit(String vmLimit) {
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
index 44eaba7..7204d5a 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
@@ -310,6 +310,10 @@
     @Param(description = "Guest vm Boot Type")
     private String bootType;
 
+    @SerializedName(ApiConstants.POOL_TYPE)
+    @Param(description = "the pool type of the virtual machine", since = "4.16")
+    private String poolType;
+
     public UserVmResponse() {
         securityGroupList = new LinkedHashSet<SecurityGroupResponse>();
         nics = new LinkedHashSet<NicResponse>();
@@ -901,4 +905,8 @@
     public String getBootMode() { return bootMode; }
 
     public void setBootMode(String bootMode) { this.bootMode = bootMode; }
+
+    public String getPoolType() { return poolType; }
+
+    public void setPoolType(String poolType) { this.poolType = poolType; }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java
index 1cdd696..e9254ef 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java
@@ -248,8 +248,12 @@
     @Param(description = "need quiesce vm or not when taking snapshot", since = "4.3")
     private boolean needQuiescevm;
 
+    @SerializedName(ApiConstants.SUPPORTS_STORAGE_SNAPSHOT)
+    @Param(description = "true if storage snapshot is supported for the volume, false otherwise", since = "4.16")
+    private boolean supportsStorageSnapshot;
+
     @SerializedName(ApiConstants.PHYSICAL_SIZE)
-    @Param(description = "the bytes alloaated")
+    @Param(description = "the bytes allocated")
     private Long physicalsize;
 
     @SerializedName(ApiConstants.VIRTUAL_SIZE)
@@ -538,6 +542,14 @@
         return this.needQuiescevm;
     }
 
+    public void setSupportsStorageSnapshot(boolean supportsStorageSnapshot) {
+        this.supportsStorageSnapshot = supportsStorageSnapshot;
+    }
+
+    public boolean getSupportsStorageSnapshot() {
+        return this.supportsStorageSnapshot;
+    }
+
     public String getIsoId() {
         return isoId;
     }
diff --git a/api/src/test/java/com/cloud/storage/StorageTest.java b/api/src/test/java/com/cloud/storage/StorageTest.java
index 61909e7..bf45169 100644
--- a/api/src/test/java/com/cloud/storage/StorageTest.java
+++ b/api/src/test/java/com/cloud/storage/StorageTest.java
@@ -16,11 +16,12 @@
 // under the License.
 package com.cloud.storage;
 
-import com.cloud.storage.Storage.StoragePoolType;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.cloud.storage.Storage.StoragePoolType;
+
 public class StorageTest {
     @Before
     public void setUp() {
@@ -37,6 +38,7 @@
         Assert.assertFalse(StoragePoolType.LVM.isShared());
         Assert.assertTrue(StoragePoolType.CLVM.isShared());
         Assert.assertTrue(StoragePoolType.RBD.isShared());
+        Assert.assertTrue(StoragePoolType.PowerFlex.isShared());
         Assert.assertTrue(StoragePoolType.SharedMountPoint.isShared());
         Assert.assertTrue(StoragePoolType.VMFS.isShared());
         Assert.assertTrue(StoragePoolType.PreSetup.isShared());
@@ -59,6 +61,7 @@
         Assert.assertFalse(StoragePoolType.LVM.supportsOverProvisioning());
         Assert.assertFalse(StoragePoolType.CLVM.supportsOverProvisioning());
         Assert.assertTrue(StoragePoolType.RBD.supportsOverProvisioning());
+        Assert.assertTrue(StoragePoolType.PowerFlex.supportsOverProvisioning());
         Assert.assertFalse(StoragePoolType.SharedMountPoint.supportsOverProvisioning());
         Assert.assertTrue(StoragePoolType.VMFS.supportsOverProvisioning());
         Assert.assertTrue(StoragePoolType.PreSetup.supportsOverProvisioning());
diff --git a/client/pom.xml b/client/pom.xml
index ba7f755..904b98b 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <repositories>
         <repository>
@@ -89,6 +89,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-plugin-storage-volume-scaleio</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
             <artifactId>cloud-server</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/core/pom.xml b/core/pom.xml
index 6738dcd..36a7eb6 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/core/src/main/java/com/cloud/agent/api/HandleConfigDriveIsoAnswer.java b/core/src/main/java/com/cloud/agent/api/HandleConfigDriveIsoAnswer.java
new file mode 100644
index 0000000..769f886
--- /dev/null
+++ b/core/src/main/java/com/cloud/agent/api/HandleConfigDriveIsoAnswer.java
@@ -0,0 +1,55 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.agent.api;
+
+import com.cloud.network.element.NetworkElement;
+import com.cloud.utils.exception.ExceptionUtil;
+
+public class HandleConfigDriveIsoAnswer extends Answer {
+
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private NetworkElement.Location location = NetworkElement.Location.SECONDARY;
+
+    public HandleConfigDriveIsoAnswer(final HandleConfigDriveIsoCommand cmd) {
+        super(cmd);
+    }
+
+    public HandleConfigDriveIsoAnswer(final HandleConfigDriveIsoCommand cmd, final NetworkElement.Location location) {
+        super(cmd);
+        this.location = location;
+    }
+
+    public HandleConfigDriveIsoAnswer(final HandleConfigDriveIsoCommand cmd, final NetworkElement.Location location, final String details) {
+        super(cmd, true, details);
+        this.location = location;
+    }
+
+    public HandleConfigDriveIsoAnswer(final HandleConfigDriveIsoCommand cmd, final String details) {
+        super(cmd, false, details);
+    }
+
+    public HandleConfigDriveIsoAnswer(final HandleConfigDriveIsoCommand cmd, final Exception e) {
+        this(cmd, ExceptionUtil.toString(e));
+    }
+
+    public NetworkElement.Location getConfigDriveLocation() {
+        return location;
+    }
+}
diff --git a/core/src/main/java/com/cloud/agent/api/HandleConfigDriveIsoCommand.java b/core/src/main/java/com/cloud/agent/api/HandleConfigDriveIsoCommand.java
index 3d8d8f7..062274f 100644
--- a/core/src/main/java/com/cloud/agent/api/HandleConfigDriveIsoCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/HandleConfigDriveIsoCommand.java
@@ -25,16 +25,19 @@
 
     @LogLevel(LogLevel.Log4jLevel.Off)
     private String isoData;
-
     private String isoFile;
     private boolean create = false;
     private DataStoreTO destStore;
+    private boolean useHostCacheOnUnsupportedPool = false;
+    private boolean preferHostCache = false;
 
-    public HandleConfigDriveIsoCommand(String isoFile, String isoData, DataStoreTO destStore, boolean create) {
+    public HandleConfigDriveIsoCommand(String isoFile, String isoData, DataStoreTO destStore, boolean useHostCacheOnUnsupportedPool, boolean preferHostCache, boolean create) {
         this.isoFile = isoFile;
         this.isoData = isoData;
         this.destStore = destStore;
         this.create = create;
+        this.useHostCacheOnUnsupportedPool = useHostCacheOnUnsupportedPool;
+        this.preferHostCache = preferHostCache;
     }
 
     @Override
@@ -57,4 +60,12 @@
     public String getIsoFile() {
         return isoFile;
     }
+
+    public boolean isHostCachePreferred() {
+        return preferHostCache;
+    }
+
+    public boolean getUseHostCacheOnUnsupportedPool() {
+        return useHostCacheOnUnsupportedPool;
+    }
 }
diff --git a/core/src/main/java/com/cloud/agent/api/MigrateVmToPoolCommand.java b/core/src/main/java/com/cloud/agent/api/MigrateVmToPoolCommand.java
index 91a911d..16e2533 100644
--- a/core/src/main/java/com/cloud/agent/api/MigrateVmToPoolCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/MigrateVmToPoolCommand.java
@@ -18,9 +18,11 @@
 //
 package com.cloud.agent.api;
 
-import com.cloud.agent.api.to.VolumeTO;
+import java.util.List;
 
-import java.util.Collection;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.utils.Pair;
 
 /**
  * used to tell the agent to migrate a vm to a different primary storage pool.
@@ -28,10 +30,10 @@
  *
  */
 public class MigrateVmToPoolCommand extends Command {
-    private Collection<VolumeTO> volumes;
     private String vmName;
-    private String destinationPool;
     private boolean executeInSequence = false;
+    private List<Pair<VolumeTO, StorageFilerTO>> volumeToFilerAsList;
+    private String hostGuidInTargetCluster;
 
     protected MigrateVmToPoolCommand() {
     }
@@ -39,29 +41,30 @@
     /**
      *
      * @param vmName the name of the VM to migrate
-     * @param volumes used to supply feedback on vmware generated names
-     * @param destinationPool the primary storage pool to migrate the VM to
+     * @param volumeToFilerTo the volume to primary storage pool map to migrate the VM to
+     * @param hostGuidInTargetCluster GUID of host in target cluster when migrating across clusters
      * @param executeInSequence
      */
-    public MigrateVmToPoolCommand(String vmName, Collection<VolumeTO> volumes, String destinationPool, boolean executeInSequence) {
+    public MigrateVmToPoolCommand(String vmName, List<Pair<VolumeTO, StorageFilerTO>> volumeToFilerTo,
+                                  String hostGuidInTargetCluster, boolean executeInSequence) {
         this.vmName = vmName;
-        this.volumes = volumes;
-        this.destinationPool = destinationPool;
+        this.hostGuidInTargetCluster = hostGuidInTargetCluster;
+        this.volumeToFilerAsList = volumeToFilerTo;
         this.executeInSequence = executeInSequence;
     }
 
-    public Collection<VolumeTO> getVolumes() {
-        return volumes;
-    }
-
-    public String getDestinationPool() {
-        return destinationPool;
-    }
-
     public String getVmName() {
         return vmName;
     }
 
+    public List<Pair<VolumeTO, StorageFilerTO>> getVolumeToFilerAsList() {
+        return volumeToFilerAsList;
+    }
+
+    public String getHostGuidInTargetCluster() {
+        return hostGuidInTargetCluster;
+    }
+
     @Override
     public boolean executeInSequence() {
         return executeInSequence;
diff --git a/core/src/main/java/com/cloud/agent/api/routing/GetRouterMonitorResultsCommand.java b/core/src/main/java/com/cloud/agent/api/routing/GetRouterMonitorResultsCommand.java
index 779a0f4..e32dda3 100644
--- a/core/src/main/java/com/cloud/agent/api/routing/GetRouterMonitorResultsCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/routing/GetRouterMonitorResultsCommand.java
@@ -19,12 +19,14 @@
 
 public class GetRouterMonitorResultsCommand extends NetworkElementCommand {
     private boolean performFreshChecks;
+    private boolean validateBasicTestsOnly;
 
     protected GetRouterMonitorResultsCommand() {
     }
 
-    public GetRouterMonitorResultsCommand(boolean performFreshChecks) {
+    public GetRouterMonitorResultsCommand(boolean performFreshChecks, boolean validateBasicTestsOnly) {
         this.performFreshChecks = performFreshChecks;
+        this.validateBasicTestsOnly = validateBasicTestsOnly;
     }
 
     @Override
@@ -35,4 +37,8 @@
     public boolean shouldPerformFreshChecks() {
         return performFreshChecks;
     }
+
+    public boolean shouldValidateBasicTestsOnly() {
+        return validateBasicTestsOnly;
+    }
 }
\ No newline at end of file
diff --git a/core/src/main/java/com/cloud/agent/api/storage/MigrateVolumeCommand.java b/core/src/main/java/com/cloud/agent/api/storage/MigrateVolumeCommand.java
index 9902a86..f3ca63b 100644
--- a/core/src/main/java/com/cloud/agent/api/storage/MigrateVolumeCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/storage/MigrateVolumeCommand.java
@@ -34,6 +34,7 @@
     StorageFilerTO sourcePool;
     String attachedVmName;
     Volume.Type volumeType;
+    String hostGuidInTargetCluster;
 
     private DataTO srcData;
     private DataTO destData;
@@ -68,6 +69,11 @@
         setWait(timeout);
     }
 
+    public MigrateVolumeCommand(long volumeId, String volumePath, StoragePool sourcePool, StoragePool targetPool, String targetClusterHost) {
+        this(volumeId, volumePath, sourcePool, targetPool);
+        this.hostGuidInTargetCluster = targetClusterHost;
+    }
+
     @Override
     public boolean executeInSequence() {
         return true;
@@ -125,7 +131,11 @@
         return destDetails;
     }
 
+    public String getHostGuidInTargetCluster() {
+        return hostGuidInTargetCluster;
+    }
+
     public int getWaitInMillSeconds() {
         return getWait() * 1000;
     }
-}
\ No newline at end of file
+}
diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java
index f8cf6d4..834a11c 100644
--- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java
+++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java
@@ -75,4 +75,6 @@
     public static final String DIAGNOSTICS = "diagnostics.py";
     public static final String RETRIEVE_DIAGNOSTICS = "get_diagnostics_files.py";
     public static final String VR_FILE_CLEANUP = "cleanup.sh";
+
+    public static final String ROUTER_FILESYSTEM_WRITABLE_CHECK = "filesystem_writable_check.py";
 }
\ No newline at end of file
diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
index 8f4670d..9a55d3b 100644
--- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -44,6 +44,7 @@
 import org.apache.cloudstack.diagnostics.PrepareFilesAnswer;
 import org.apache.cloudstack.diagnostics.PrepareFilesCommand;
 import org.apache.cloudstack.utils.security.KeyStoreUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.joda.time.Duration;
 
@@ -65,6 +66,7 @@
 import com.cloud.agent.resource.virtualnetwork.facade.AbstractConfigItemFacade;
 import com.cloud.utils.ExecutionResult;
 import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.Pair;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 /**
@@ -310,6 +312,16 @@
 
     private GetRouterMonitorResultsAnswer execute(GetRouterMonitorResultsCommand cmd) {
         String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
+        Pair<Boolean, String> fileSystemTestResult = checkRouterFileSystem(routerIp);
+        if (!fileSystemTestResult.first()) {
+            return new GetRouterMonitorResultsAnswer(cmd, false, null, fileSystemTestResult.second());
+        }
+
+        if (cmd.shouldValidateBasicTestsOnly()) {
+            // Basic tests (connectivity and file system checks) are already validated
+            return new GetRouterMonitorResultsAnswer(cmd, true, null, "success");
+        }
+
         String args = cmd.shouldPerformFreshChecks() ? "true" : "false";
         s_logger.info("Fetching health check result for " + routerIp + " and executing fresh checks: " + args);
         ExecutionResult result = _vrDeployer.executeInVR(routerIp, VRScripts.ROUTER_MONITOR_RESULTS, args);
@@ -327,6 +339,27 @@
         return parseLinesForHealthChecks(cmd, result.getDetails());
     }
 
+    private Pair<Boolean, String> checkRouterFileSystem(String routerIp) {
+        ExecutionResult fileSystemWritableTestResult = _vrDeployer.executeInVR(routerIp, VRScripts.ROUTER_FILESYSTEM_WRITABLE_CHECK, null);
+        if (fileSystemWritableTestResult.isSuccess()) {
+            s_logger.debug("Router connectivity and file system writable check passed");
+            return new Pair<Boolean, String>(true, "success");
+        }
+
+        String resultDetails = fileSystemWritableTestResult.getDetails();
+        s_logger.warn("File system writable check failed with details: " + resultDetails);
+        if (StringUtils.isNotBlank(resultDetails)) {
+            final String readOnlyFileSystemError = "Read-only file system";
+            if (resultDetails.contains(readOnlyFileSystemError)) {
+                resultDetails = "Read-only file system";
+            }
+        } else {
+            resultDetails = "No results available";
+        }
+
+        return new Pair<Boolean, String>(false, resultDetails);
+    }
+
     private GetRouterAlertsAnswer execute(GetRouterAlertsCommand cmd) {
 
         String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
diff --git a/core/src/main/java/com/cloud/storage/resource/StorageSubsystemCommandHandlerBase.java b/core/src/main/java/com/cloud/storage/resource/StorageSubsystemCommandHandlerBase.java
index 910eb3d..6c5b55a 100644
--- a/core/src/main/java/com/cloud/storage/resource/StorageSubsystemCommandHandlerBase.java
+++ b/core/src/main/java/com/cloud/storage/resource/StorageSubsystemCommandHandlerBase.java
@@ -99,10 +99,13 @@
             //copy volume from image cache to primary
             return processor.copyVolumeFromImageCacheToPrimary(cmd);
         } else if (srcData.getObjectType() == DataObjectType.VOLUME && srcData.getDataStore().getRole() == DataStoreRole.Primary) {
-            if (destData.getObjectType() == DataObjectType.VOLUME && srcData instanceof VolumeObjectTO && ((VolumeObjectTO)srcData).isDirectDownload()) {
-                return processor.copyVolumeFromPrimaryToPrimary(cmd);
-            } else if (destData.getObjectType() == DataObjectType.VOLUME) {
-                return processor.copyVolumeFromPrimaryToSecondary(cmd);
+            if (destData.getObjectType() == DataObjectType.VOLUME) {
+                if ((srcData instanceof VolumeObjectTO && ((VolumeObjectTO)srcData).isDirectDownload()) ||
+                        destData.getDataStore().getRole() == DataStoreRole.Primary) {
+                    return processor.copyVolumeFromPrimaryToPrimary(cmd);
+                } else {
+                    return processor.copyVolumeFromPrimaryToSecondary(cmd);
+                }
             } else if (destData.getObjectType() == DataObjectType.TEMPLATE) {
                 return processor.createTemplateFromVolume(cmd);
             }
diff --git a/core/src/main/java/org/apache/cloudstack/agent/directdownload/CheckUrlCommand.java b/core/src/main/java/org/apache/cloudstack/agent/directdownload/CheckUrlCommand.java
index ed49997..e8618d5 100644
--- a/core/src/main/java/org/apache/cloudstack/agent/directdownload/CheckUrlCommand.java
+++ b/core/src/main/java/org/apache/cloudstack/agent/directdownload/CheckUrlCommand.java
@@ -23,14 +23,20 @@
 
 public class CheckUrlCommand extends Command {
 
+    private String format;
     private String url;
 
+    public String getFormat() {
+        return format;
+    }
+
     public String getUrl() {
         return url;
     }
 
-    public CheckUrlCommand(final String url) {
+    public CheckUrlCommand(final String format,final String url) {
         super();
+        this.format = format;
         this.url = url;
     }
 
diff --git a/core/src/main/java/org/apache/cloudstack/agent/directdownload/DirectDownloadCommand.java b/core/src/main/java/org/apache/cloudstack/agent/directdownload/DirectDownloadCommand.java
index aafcb53..7e1ff0b 100644
--- a/core/src/main/java/org/apache/cloudstack/agent/directdownload/DirectDownloadCommand.java
+++ b/core/src/main/java/org/apache/cloudstack/agent/directdownload/DirectDownloadCommand.java
@@ -23,6 +23,9 @@
 
 import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
+import org.apache.cloudstack.storage.to.TemplateObjectTO;
+
+import com.cloud.storage.Storage;
 
 public abstract class DirectDownloadCommand extends StorageSubSystemCommand {
 
@@ -32,6 +35,7 @@
 
     private String url;
     private Long templateId;
+    private TemplateObjectTO destData;
     private PrimaryDataStoreTO destPool;
     private String checksum;
     private Map<String, String> headers;
@@ -39,11 +43,12 @@
     private Integer soTimeout;
     private Integer connectionRequestTimeout;
     private Long templateSize;
-    private boolean iso;
+    private Storage.ImageFormat format;
 
     protected DirectDownloadCommand (final String url, final Long templateId, final PrimaryDataStoreTO destPool, final String checksum, final Map<String, String> headers, final Integer connectTimeout, final Integer soTimeout, final Integer connectionRequestTimeout) {
         this.url = url;
         this.templateId = templateId;
+        this.destData = destData;
         this.destPool = destPool;
         this.checksum = checksum;
         this.headers = headers;
@@ -60,6 +65,14 @@
         return templateId;
     }
 
+    public TemplateObjectTO getDestData() {
+        return destData;
+    }
+
+    public void setDestData(TemplateObjectTO destData) {
+         this.destData = destData;
+    }
+
     public PrimaryDataStoreTO getDestPool() {
         return destPool;
     }
@@ -104,12 +117,12 @@
         this.templateSize = templateSize;
     }
 
-    public boolean isIso() {
-        return iso;
+    public Storage.ImageFormat getFormat() {
+        return format;
     }
 
-    public void setIso(boolean iso) {
-        this.iso = iso;
+    public void setFormat(Storage.ImageFormat format) {
+        this.format = format;
     }
 
     @Override
@@ -120,4 +133,8 @@
     public boolean executeInSequence() {
         return false;
     }
+
+    public int getWaitInMillSeconds() {
+        return getWait() * 1000;
+    }
 }
diff --git a/core/src/main/java/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java b/core/src/main/java/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
index 7dab8d9..0bb5b79 100644
--- a/core/src/main/java/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
+++ b/core/src/main/java/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
@@ -19,12 +19,13 @@
 
 package org.apache.cloudstack.storage.to;
 
+import java.util.Map;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
+
 import com.cloud.agent.api.to.DataStoreTO;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.Storage.StoragePoolType;
-import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
-
-import java.util.Map;
 
 public class PrimaryDataStoreTO implements DataStoreTO {
     public static final String MANAGED = PrimaryDataStore.MANAGED;
diff --git a/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java b/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java
index 6cd27b1..36c35e5 100644
--- a/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java
+++ b/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java
@@ -19,7 +19,6 @@
 
 package org.apache.cloudstack.storage.to;
 
-import com.cloud.storage.MigrationOptions;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 
 import com.cloud.agent.api.to.DataObjectType;
@@ -27,6 +26,7 @@
 import com.cloud.agent.api.to.DataTO;
 import com.cloud.hypervisor.Hypervisor;
 import com.cloud.offering.DiskOffering.DiskCacheMode;
+import com.cloud.storage.MigrationOptions;
 import com.cloud.storage.Storage;
 import com.cloud.storage.Volume;
 
@@ -43,6 +43,7 @@
     private String chainInfo;
     private Storage.ImageFormat format;
     private Storage.ProvisioningType provisioningType;
+    private Long poolId;
     private long id;
 
     private Long deviceId;
@@ -62,6 +63,7 @@
     private Hypervisor.HypervisorType hypervisorType;
     private MigrationOptions migrationOptions;
     private boolean directDownload;
+    private String dataStoreUuid;
     private boolean deployAsIs;
     private String updatedDataStoreUUID;
     private String vSphereStoragePolicyId;
@@ -88,6 +90,7 @@
         setId(volume.getId());
         format = volume.getFormat();
         provisioningType = volume.getProvisioningType();
+        poolId = volume.getPoolId();
         bytesReadRate = volume.getBytesReadRate();
         bytesReadRateMax = volume.getBytesReadRateMax();
         bytesReadRateMaxLength = volume.getBytesReadRateMaxLength();
@@ -226,6 +229,14 @@
         this.provisioningType = provisioningType;
     }
 
+    public Long getPoolId(){
+        return poolId;
+    }
+
+    public void setPoolId(Long poolId){
+        this.poolId = poolId;
+    }
+
     @Override
     public String toString() {
         return new StringBuilder("volumeTO[uuid=").append(uuid).append("|path=").append(path).append("|datastore=").append(dataStore).append("]").toString();
@@ -319,6 +330,14 @@
         return directDownload;
     }
 
+    public String getDataStoreUuid() {
+        return dataStoreUuid;
+    }
+
+    public void setDataStoreUuid(String dataStoreUuid) {
+        this.dataStoreUuid = dataStoreUuid;
+    }
+
     public boolean isDeployAsIs() {
         return deployAsIs;
     }
diff --git a/debian/changelog b/debian/changelog
index e6f2333..1c79e58 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,6 @@
-cloudstack (4.15.1.0-SNAPSHOT) unstable; urgency=low
+cloudstack (4.16.0.0-SNAPSHOT) unstable; urgency=low
 
-  * Update the version to 4.15.1.0-SNAPSHOT
+  * Update the version to 4.16.0.0-SNAPSHOT
 
  -- the Apache CloudStack project <dev@cloudstack.apache.org>  Tue, 11 Jan 2021 10:51:02 +0000
 
diff --git a/developer/pom.xml b/developer/pom.xml
index df1be35..d50d375 100644
--- a/developer/pom.xml
+++ b/developer/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/engine/api/pom.xml b/engine/api/pom.xml
index d2474f8..132bf3d 100644
--- a/engine/api/pom.xml
+++ b/engine/api/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
index 49b13e1..3ca3008 100644
--- a/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
@@ -40,7 +40,6 @@
 import com.cloud.offering.DiskOffering;
 import com.cloud.offering.DiskOfferingInfo;
 import com.cloud.offering.ServiceOffering;
-import com.cloud.storage.StoragePool;
 import com.cloud.template.VirtualMachineTemplate;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
@@ -59,7 +58,13 @@
             "The default label name for the config drive", false);
 
     ConfigKey<Boolean> VmConfigDriveOnPrimaryPool = new ConfigKey<>("Advanced", Boolean.class, "vm.configdrive.primarypool.enabled", "false",
-            "If config drive need to be created and hosted on primary storage pool. Currently only supported for KVM.", true);
+            "If config drive need to be created and hosted on primary storage pool. Currently only supported for KVM.", true, ConfigKey.Scope.Zone);
+
+    ConfigKey<Boolean> VmConfigDriveUseHostCacheOnUnsupportedPool = new ConfigKey<>("Advanced", Boolean.class, "vm.configdrive.use.host.cache.on.unsupported.pool", "true",
+            "If true, config drive is created on the host cache storage when vm.configdrive.primarypool.enabled is true and the primary pool type doesn't support config drive.", true, ConfigKey.Scope.Zone);
+
+    ConfigKey<Boolean> VmConfigDriveForceHostCacheUse = new ConfigKey<>("Advanced", Boolean.class, "vm.configdrive.force.host.cache.use", "false",
+            "If true, config drive is forced to create on the host cache storage. Currently only supported for KVM.", true, ConfigKey.Scope.Zone);
 
     ConfigKey<Boolean> ResoureCountRunningVMsonly = new ConfigKey<Boolean>("Advanced", Boolean.class, "resource.count.running.vms.only", "false",
             "Count the resources of only running VMs in resource limitation.", true);
@@ -167,7 +172,7 @@
 
     VirtualMachine findById(long vmId);
 
-    void storageMigration(String vmUuid, StoragePool storagePoolId);
+    void storageMigration(String vmUuid, Map<Long, Long> volumeToPool);
 
     /**
      * @param vmInstance
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java
index 06c3a94..15e44d9 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java
@@ -182,7 +182,7 @@
 
     Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, Account owner,
                                Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr,
-                               Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException;
+                               Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException;
 
     UserDataServiceProvider getPasswordResetProvider(Network network);
 
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java
index 44e993f..c6b96bc 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java
@@ -33,6 +33,7 @@
 import com.cloud.deploy.DeployDestination;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientStorageCapacityException;
+import com.cloud.exception.StorageAccessException;
 import com.cloud.exception.StorageUnavailableException;
 import com.cloud.host.Host;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
@@ -104,6 +105,8 @@
 
     void release(VirtualMachineProfile profile);
 
+    void release(long vmId, long hostId);
+
     void cleanupVolumes(long vmId) throws ConcurrentOperationException;
 
     void revokeAccess(DataObject dataObject, Host host, DataStore dataStore);
@@ -112,11 +115,11 @@
 
     void migrateVolumes(VirtualMachine vm, VirtualMachineTO vmTo, Host srcHost, Host destHost, Map<Volume, StoragePool> volumeToPool);
 
-    boolean storageMigration(VirtualMachineProfile vm, StoragePool destPool) throws StorageUnavailableException;
+    boolean storageMigration(VirtualMachineProfile vm, Map<Volume, StoragePool> volumeToPool) throws StorageUnavailableException;
 
     void prepareForMigration(VirtualMachineProfile vm, DeployDestination dest);
 
-    void prepare(VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException, InsufficientStorageCapacityException, ConcurrentOperationException;
+    void prepare(VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException, InsufficientStorageCapacityException, ConcurrentOperationException, StorageAccessException;
 
     boolean canVmRestartOnAnotherServer(long vmId);
 
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java
index 3d73721..b197afa 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java
@@ -25,6 +25,7 @@
 
 import com.cloud.agent.api.to.DataStoreTO;
 import com.cloud.agent.api.to.DataTO;
+import com.cloud.host.Host;
 
 public interface DataStoreDriver {
     Map<String, String> getCapabilities();
@@ -37,7 +38,9 @@
 
     void deleteAsync(DataStore store, DataObject data, AsyncCompletionCallback<CommandResult> callback);
 
-    void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback);
+    void copyAsync(DataObject srcData, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback);
+
+    void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback);
 
     boolean canCopy(DataObject srcData, DataObject destData);
 
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
index 6021a43..622dda3 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
@@ -23,6 +23,7 @@
 
 import com.cloud.host.Host;
 import com.cloud.storage.StoragePool;
+import com.cloud.utils.Pair;
 
 public interface PrimaryDataStoreDriver extends DataStoreDriver {
     enum QualityOfServiceState { MIGRATION, NO_MIGRATION }
@@ -72,4 +73,34 @@
     void revertSnapshot(SnapshotInfo snapshotOnImageStore, SnapshotInfo snapshotOnPrimaryStore, AsyncCompletionCallback<CommandResult> callback);
 
     void handleQualityOfServiceForVolumeMigration(VolumeInfo volumeInfo, QualityOfServiceState qualityOfServiceState);
+
+    /**
+     * intended for managed storage
+     * returns true if the storage can provide the stats (capacity and used bytes)
+     */
+    boolean canProvideStorageStats();
+
+    /**
+     * intended for managed storage
+     * returns the total capacity and used size in bytes
+     */
+    Pair<Long, Long> getStorageStats(StoragePool storagePool);
+
+    /**
+     * intended for managed storage
+     * returns true if the storage can provide the volume stats (physical and virtual size)
+     */
+    boolean canProvideVolumeStats();
+
+    /**
+     * intended for managed storage
+     * returns the volume's physical and virtual size in bytes
+     */
+    Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumeId);
+
+    /**
+     * intended for managed storage
+     * returns true if the host can access the storage pool
+     */
+    boolean canHostAccessStoragePool(Host host, StoragePool pool);
 }
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
index 4d258f3..9584d7c 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
@@ -23,6 +23,8 @@
 import com.cloud.storage.DataStoreRole;
 
 public interface TemplateDataFactory {
+    TemplateInfo getTemplate(long templateId);
+
     TemplateInfo getTemplate(long templateId, DataStore store);
 
     TemplateInfo getReadyTemplateOnImageStore(long templateId, Long zoneId);
@@ -39,6 +41,8 @@
 
     TemplateInfo getReadyBypassedTemplateOnPrimaryStore(long templateId, Long poolId, Long hostId);
 
+    TemplateInfo getReadyBypassedTemplateOnManagedStorage(long templateId, TemplateInfo templateOnPrimary, Long poolId, Long hostId);
+
     boolean isTemplateMarkedForDirectDownload(long templateId);
 
     TemplateInfo getTemplateOnPrimaryStorage(long templateId, DataStore store, String configuration);
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateInfo.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateInfo.java
index 1e4a1b7..cc8e111 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateInfo.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateInfo.java
@@ -28,6 +28,8 @@
 
     boolean isDirectDownload();
 
+    boolean canBeDeletedFromDataStore();
+
     boolean isDeployAsIs();
 
     String getDeployAsIsConfiguration();
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
index b138122..eafc3b7 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
@@ -22,6 +22,7 @@
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.offering.DiskOffering.DiskCacheMode;
 import com.cloud.storage.MigrationOptions;
+import com.cloud.storage.Storage;
 import com.cloud.storage.Volume;
 import com.cloud.vm.VirtualMachine;
 
@@ -35,6 +36,8 @@
 
     HypervisorType getHypervisorType();
 
+    Storage.StoragePoolType getStoragePoolType();
+
     Long getLastPoolId();
 
     String getAttachedVmName();
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java
index e8b533d..d194bbb 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java
@@ -25,6 +25,7 @@
 import org.apache.cloudstack.storage.command.CommandResult;
 
 import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.exception.StorageAccessException;
 import com.cloud.host.Host;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.offering.DiskOffering;
@@ -62,13 +63,17 @@
      */
     AsyncCallFuture<VolumeApiResult> expungeVolumeAsync(VolumeInfo volume);
 
+    void ensureVolumeIsExpungeReady(long volumeId);
+
     boolean cloneVolume(long volumeId, long baseVolId);
 
     AsyncCallFuture<VolumeApiResult> createVolumeFromSnapshot(VolumeInfo volume, DataStore store, SnapshotInfo snapshot);
 
     VolumeEntity getVolumeEntity(long volumeId);
 
-    AsyncCallFuture<VolumeApiResult> createManagedStorageVolumeFromTemplateAsync(VolumeInfo volumeInfo, long destDataStoreId, TemplateInfo srcTemplateInfo, long destHostId);
+    TemplateInfo createManagedStorageTemplate(long srcTemplateId, long destDataStoreId, long destHostId) throws StorageAccessException;
+
+    AsyncCallFuture<VolumeApiResult> createManagedStorageVolumeFromTemplateAsync(VolumeInfo volumeInfo, long destDataStoreId, TemplateInfo srcTemplateInfo, long destHostId) throws StorageAccessException;
 
     AsyncCallFuture<VolumeApiResult> createVolumeFromTemplateAsync(VolumeInfo volume, long dataStoreId, TemplateInfo template);
 
diff --git a/engine/components-api/pom.xml b/engine/components-api/pom.xml
index 26f22a7..d714610 100644
--- a/engine/components-api/pom.xml
+++ b/engine/components-api/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
index 162a61e..6677200 100644
--- a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
+++ b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
@@ -214,7 +214,7 @@
     NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability,
                                             Integer networkRate, Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, Network.GuestType type, boolean systemOnly, Long serviceOfferingId,
                                             boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent,
-                                            Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive, Boolean forVpc, List<Long> domainIds, List<Long> zoneIds);
+                                            Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive, Boolean forVpc, List<Long> domainIds, List<Long> zoneIds, boolean enableOffering);
 
     Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP,
         String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr)
diff --git a/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java b/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java
index db7a27f..ade2eeb 100755
--- a/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java
+++ b/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java
@@ -21,6 +21,9 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
 import com.cloud.agent.api.VgpuTypesInfo;
@@ -38,8 +41,6 @@
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.resource.ResourceState.Event;
 import com.cloud.utils.fsm.NoTransitionException;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
 
 /**
  * ResourceManager manages how physical resources are organized within the
@@ -204,7 +205,7 @@
      */
     HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUStatistics(HostVO host);
 
-    HostVO findOneRandomRunningHostByHypervisor(HypervisorType type);
+    HostVO findOneRandomRunningHostByHypervisor(HypervisorType type, Long dcId);
 
     boolean cancelMaintenance(final long hostId);
 }
diff --git a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
index 7455f22..b20db8d 100644
--- a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
+++ b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
@@ -109,6 +109,24 @@
             ConfigKey.Scope.Cluster,
             null);
 
+    ConfigKey<Integer> STORAGE_POOL_DISK_WAIT = new ConfigKey<>(Integer.class,
+            "storage.pool.disk.wait",
+            "Storage",
+            "60",
+            "Timeout (in secs) for the storage pool disk (of managed pool) to become available in the host. Currently only supported for PowerFlex.",
+            true,
+            ConfigKey.Scope.StoragePool,
+            null);
+
+    ConfigKey<Integer> STORAGE_POOL_CLIENT_TIMEOUT = new ConfigKey<>(Integer.class,
+            "storage.pool.client.timeout",
+            "Storage",
+            "60",
+            "Timeout (in secs) for the storage pool client connection timeout (for managed pools). Currently only supported for PowerFlex.",
+            true,
+            ConfigKey.Scope.StoragePool,
+            null);
+
     ConfigKey<Integer> PRIMARY_STORAGE_DOWNLOAD_WAIT = new ConfigKey<Integer>("Storage", Integer.class, "primary.storage.download.wait", "10800",
             "In second, timeout for download template to primary storage", false);
 
@@ -144,6 +162,8 @@
 
     Pair<Long, Answer> sendToPool(StoragePool pool, long[] hostIdsToTryFirst, List<Long> hostIdsToAvoid, Command cmd) throws StorageUnavailableException;
 
+    public Answer getVolumeStats(StoragePool pool, Command cmd);
+
     /**
      * Checks if a host has running VMs that are using its local storage pool.
      * @return true if local storage is active on the host
@@ -172,6 +192,14 @@
 
     StoragePoolVO findLocalStorageOnHost(long hostId);
 
+    Host findUpAndEnabledHostWithAccessToStoragePools(List<Long> poolIds);
+
+    List<StoragePoolHostVO> findStoragePoolsConnectedToHost(long hostId);
+
+    boolean canHostAccessStoragePool(Host host, StoragePool pool);
+
+    Host getHost(long hostId);
+
     Host updateSecondaryStorage(long secStorageId, String newUrl);
 
     void removeStoragePoolFromCluster(long hostId, String iScsiName, StoragePool storagePool);
@@ -210,7 +238,9 @@
      */
     boolean storagePoolHasEnoughSpace(List<Volume> volume, StoragePool pool, Long clusterId);
 
-    boolean storagePoolHasEnoughSpaceForResize(StoragePool pool, long currentSize, long newSiz);
+    boolean storagePoolHasEnoughSpaceForResize(StoragePool pool, long currentSize, long newSize);
+
+    boolean storagePoolCompatibleWithVolumePool(StoragePool pool, Volume volume);
 
     boolean isStoragePoolComplaintWithStoragePolicy(List<Volume> volumes, StoragePool pool) throws StorageUnavailableException;
 
@@ -218,6 +248,8 @@
 
     void connectHostToSharedPool(long hostId, long poolId) throws StorageUnavailableException, StorageConflictException;
 
+    void disconnectHostFromSharedPool(long hostId, long poolId) throws StorageUnavailableException, StorageConflictException;
+
     void createCapacityEntry(long poolId);
 
     DataStore createLocalStorage(Host host, StoragePoolInfo poolInfo) throws ConnectionException;
diff --git a/engine/components-api/src/main/java/com/cloud/storage/StorageUtil.java b/engine/components-api/src/main/java/com/cloud/storage/StorageUtil.java
index 97354e2..044ae3c 100644
--- a/engine/components-api/src/main/java/com/cloud/storage/StorageUtil.java
+++ b/engine/components-api/src/main/java/com/cloud/storage/StorageUtil.java
@@ -16,6 +16,14 @@
 // under the License.
 package com.cloud.storage;
 
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.commons.collections.CollectionUtils;
+
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.host.HostVO;
@@ -25,13 +33,6 @@
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.dao.VMInstanceDao;
 
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.commons.collections.CollectionUtils;
-
-import java.util.List;
-import javax.inject.Inject;
-
 public class StorageUtil {
     @Inject private ClusterDao clusterDao;
     @Inject private HostDao hostDao;
diff --git a/engine/components-api/src/main/java/com/cloud/vm/VirtualMachineProfileImpl.java b/engine/components-api/src/main/java/com/cloud/vm/VirtualMachineProfileImpl.java
index 4d03396..efe4e2e 100644
--- a/engine/components-api/src/main/java/com/cloud/vm/VirtualMachineProfileImpl.java
+++ b/engine/components-api/src/main/java/com/cloud/vm/VirtualMachineProfileImpl.java
@@ -22,7 +22,9 @@
 import java.util.Map;
 
 import com.cloud.agent.api.to.DiskTO;
+import com.cloud.host.Host;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.element.NetworkElement;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.template.VirtualMachineTemplate;
@@ -49,6 +51,8 @@
     Float cpuOvercommitRatio = 1.0f;
     Float memoryOvercommitRatio = 1.0f;
 
+    Host _host = null;
+
     VirtualMachine.Type _type;
 
     List<String[]> vmData = null;
@@ -57,6 +61,7 @@
     String configDriveIsoBaseLocation = "/tmp/";
     String configDriveIsoRootFolder = null;
     String configDriveIsoFile = null;
+    NetworkElement.Location configDriveLocation = NetworkElement.Location.SECONDARY;
 
     public VirtualMachineProfileImpl(VirtualMachine vm, VirtualMachineTemplate template, ServiceOffering offering, Account owner, Map<Param, Object> params) {
         _vm = vm;
@@ -220,6 +225,19 @@
     }
 
     @Override
+    public Long getHostId() {
+        if (_host != null) {
+            return _host.getId();
+        }
+        return _vm.getHostId();
+    }
+
+    @Override
+    public void setHost(Host host) {
+        this._host = host;
+    }
+
+    @Override
     public String getHostName() {
         return _vm.getHostName();
     }
@@ -311,4 +329,14 @@
     public void setConfigDriveIsoFile(String isoFile) {
         this.configDriveIsoFile = isoFile;
     }
+
+    @Override
+    public NetworkElement.Location getConfigDriveLocation() {
+        return configDriveLocation;
+    }
+
+    @Override
+    public void setConfigDriveLocation(NetworkElement.Location location) {
+        this.configDriveLocation = location;
+    }
 }
diff --git a/engine/network/pom.xml b/engine/network/pom.xml
index e8888c7..2f7a7ae 100644
--- a/engine/network/pom.xml
+++ b/engine/network/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/orchestration/pom.xml b/engine/orchestration/pom.xml
index 846d48e..bc8c8e3 100755
--- a/engine/orchestration/pom.xml
+++ b/engine/orchestration/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
index f1ab9cd..dfec0b1 100755
--- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -23,14 +23,17 @@
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.TimeZone;
 import java.util.UUID;
 import java.util.concurrent.Executors;
@@ -40,7 +43,6 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.deployasis.dao.UserVmDeployAsIsDetailsDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
@@ -51,7 +53,6 @@
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 import org.apache.cloudstack.framework.ca.Certificate;
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -142,6 +143,7 @@
 import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.deploy.DeploymentPlanningManager;
+import com.cloud.deployasis.dao.UserVmDeployAsIsDetailsDao;
 import com.cloud.event.EventTypes;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.event.UsageEventVO;
@@ -154,6 +156,7 @@
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.OperationTimedoutException;
 import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageAccessException;
 import com.cloud.exception.StorageUnavailableException;
 import com.cloud.ha.HighAvailabilityManager;
 import com.cloud.ha.HighAvailabilityManager.WorkType;
@@ -741,12 +744,11 @@
         } catch (final InsufficientCapacityException e) {
             throw new CloudRuntimeException("Unable to start a VM due to insufficient capacity", e).add(VirtualMachine.class, vmUuid);
         } catch (final ResourceUnavailableException e) {
-            if(e.getScope() != null && e.getScope().equals(VirtualRouter.class)){
+            if (e.getScope() != null && e.getScope().equals(VirtualRouter.class)){
                 throw new CloudRuntimeException("Network is unavailable. Please contact administrator", e).add(VirtualMachine.class, vmUuid);
             }
             throw new CloudRuntimeException("Unable to start a VM due to unavailable resources", e).add(VirtualMachine.class, vmUuid);
         }
-
     }
 
     protected boolean checkWorkItems(final VMInstanceVO vm, final State state) throws ConcurrentOperationException {
@@ -933,7 +935,7 @@
             } catch (final InterruptedException e) {
                 throw new RuntimeException("Operation is interrupted", e);
             } catch (final java.util.concurrent.ExecutionException e) {
-                throw new RuntimeException("Execution excetion", e);
+                throw new RuntimeException("Execution exception", e);
             }
 
             final Object jobResult = _jobMgr.unmarshallResultObject(outcome.getJob());
@@ -1034,6 +1036,7 @@
 
             int retry = StartRetry.value();
             while (retry-- != 0) { // It's != so that it can match -1.
+                s_logger.debug("VM start attempt #" + (StartRetry.value() - retry));
 
                 if (reuseVolume) {
                     // edit plan if this vm's ROOT volume is in READY state already
@@ -1113,7 +1116,7 @@
                 if (dest != null) {
                     avoids.addHost(dest.getHost().getId());
                     if (!template.isDeployAsIs()) {
-                        journal.record("Deployment found ", vmProfile, dest);
+                        journal.record("Deployment found - Attempt #" + (StartRetry.value() - retry), vmProfile, dest);
                     }
                 }
 
@@ -1146,7 +1149,7 @@
 
                 try {
                     resetVmNicsDeviceId(vm.getId());
-                    _networkMgr.prepare(vmProfile, new DeployDestination(dest.getDataCenter(), dest.getPod(), null, null, dest.getStorageForDisks(), dest.isDisplayStorage()), ctx);
+                    _networkMgr.prepare(vmProfile, dest, ctx);
                     if (vm.getHypervisorType() != HypervisorType.BareMetal) {
                         volumeMgr.prepare(vmProfile, dest);
                     }
@@ -1303,6 +1306,8 @@
                 } catch (final NoTransitionException e) {
                     s_logger.error("Failed to start instance " + vm, e);
                     throw new AgentUnavailableException("Unable to start instance due to " + e.getMessage(), destHostId, e);
+                } catch (final StorageAccessException e) {
+                    s_logger.warn("Unable to access storage on host", e);
                 } finally {
                     if (startedVm == null && canRetry) {
                         final Step prevStep = work.getStep();
@@ -1630,6 +1635,7 @@
                 info.put(DiskTO.STORAGE_HOST, storagePool.getHostAddress());
                 info.put(DiskTO.STORAGE_PORT, String.valueOf(storagePool.getPort()));
                 info.put(DiskTO.IQN, volume.get_iScsiName());
+                info.put(DiskTO.PROTOCOL_TYPE, (volume.getPoolType() != null) ? volume.getPoolType().toString() : null);
 
                 volumesToDisconnect.add(info);
             }
@@ -1760,20 +1766,34 @@
                 }
             }
         } finally {
-            try {
-                _networkMgr.release(profile, cleanUpEvenIfUnableToStop);
-                s_logger.debug("Successfully released network resources for the vm " + vm);
-            } catch (final Exception e) {
-                s_logger.warn("Unable to release some network resources.", e);
-            }
-
-            volumeMgr.release(profile);
-            s_logger.debug(String.format("Successfully cleaned up resources for the VM %s in %s state", vm, state));
+            releaseVmResources(profile, cleanUpEvenIfUnableToStop);
         }
 
         return true;
     }
 
+    protected void releaseVmResources(final VirtualMachineProfile profile, final boolean forced) {
+        final VirtualMachine vm = profile.getVirtualMachine();
+        final State state = vm.getState();
+        try {
+            _networkMgr.release(profile, forced);
+            s_logger.debug(String.format("Successfully released network resources for the VM %s in %s state", vm, state));
+        } catch (final Exception e) {
+            s_logger.warn(String.format("Unable to release some network resources for the VM %s in %s state", vm, state), e);
+        }
+
+        try {
+            if (vm.getHypervisorType() != HypervisorType.BareMetal) {
+                volumeMgr.release(profile);
+                s_logger.debug(String.format("Successfully released storage resources for the VM %s in %s state", vm, state));
+            }
+        } catch (final Exception e) {
+            s_logger.warn(String.format("Unable to release storage resources for the VM %s in %s state", vm, state), e);
+        }
+
+        s_logger.debug(String.format("Successfully cleaned up resources for the VM %s in %s state", vm, state));
+    }
+
     @Override
     public void advanceStop(final String vmUuid, final boolean cleanUpEvenIfUnableToStop)
             throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
@@ -1983,21 +2003,7 @@
             s_logger.debug(vm + " is stopped on the host.  Proceeding to release resource held.");
         }
 
-        try {
-            _networkMgr.release(profile, cleanUpEvenIfUnableToStop);
-            s_logger.debug("Successfully released network resources for the vm " + vm);
-        } catch (final Exception e) {
-            s_logger.warn("Unable to release some network resources.", e);
-        }
-
-        try {
-            if (vm.getHypervisorType() != HypervisorType.BareMetal) {
-                volumeMgr.release(profile);
-                s_logger.debug("Successfully released storage resources for the vm " + vm);
-            }
-        } catch (final Exception e) {
-            s_logger.warn("Unable to release storage resources.", e);
-        }
+        releaseVmResources(profile, cleanUpEvenIfUnableToStop);
 
         try {
             if (work != null) {
@@ -2143,7 +2149,7 @@
     }
 
     @Override
-    public void storageMigration(final String vmUuid, final StoragePool destPool) {
+    public void storageMigration(final String vmUuid, final Map<Long, Long> volumeToPool) {
         final AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
         if (jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
             // avoid re-entrance
@@ -2151,14 +2157,14 @@
             final VirtualMachine vm = _vmDao.findByUuid(vmUuid);
             placeHolder = createPlaceHolderWork(vm.getId());
             try {
-                orchestrateStorageMigration(vmUuid, destPool);
+                orchestrateStorageMigration(vmUuid, volumeToPool);
             } finally {
                 if (placeHolder != null) {
                     _workJobDao.expunge(placeHolder.getId());
                 }
             }
         } else {
-            final Outcome<VirtualMachine> outcome = migrateVmStorageThroughJobQueue(vmUuid, destPool);
+            final Outcome<VirtualMachine> outcome = migrateVmStorageThroughJobQueue(vmUuid, volumeToPool);
 
             try {
                 final VirtualMachine vm = outcome.get();
@@ -2179,10 +2185,10 @@
         }
     }
 
-    private void orchestrateStorageMigration(final String vmUuid, final StoragePool destPool) {
+    private void orchestrateStorageMigration(final String vmUuid, final Map<Long, Long> volumeToPool) {
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        preStorageMigrationStateCheck(destPool, vm);
+        Map<Volume, StoragePool> volumeToPoolMap = prepareVmStorageMigration(vm, volumeToPool);
 
         try {
             if(s_logger.isDebugEnabled()) {
@@ -2191,7 +2197,7 @@
                                 vm.getInstanceName()));
             }
 
-            migrateThroughHypervisorOrStorage(destPool, vm);
+            migrateThroughHypervisorOrStorage(vm, volumeToPoolMap);
 
         } catch (ConcurrentOperationException
                 | InsufficientCapacityException // possibly InsufficientVirtualNetworkCapacityException or InsufficientAddressCapacityException
@@ -2210,24 +2216,18 @@
         }
     }
 
-    private Answer[] attemptHypervisorMigration(StoragePool destPool, VMInstanceVO vm) {
+    private Answer[] attemptHypervisorMigration(VMInstanceVO vm, Map<Volume, StoragePool> volumeToPool, Long hostId) {
+        if (hostId == null) {
+            return null;
+        }
         final HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
         // OfflineVmwareMigration: in case of vmware call vcenter to do it for us.
         // OfflineVmwareMigration: should we check the proximity of source and destination
         // OfflineVmwareMigration: if we are in the same cluster/datacentre/pool or whatever?
         // OfflineVmwareMigration: we are checking on success to optionally delete an old vm if we are not
-        List<Command> commandsToSend = hvGuru.finalizeMigrate(vm, destPool);
+        List<Command> commandsToSend = hvGuru.finalizeMigrate(vm, volumeToPool);
 
-        Long hostId = vm.getHostId();
-        // OfflineVmwareMigration: probably this is null when vm is stopped
-        if(hostId == null) {
-            hostId = vm.getLastHostId();
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug(String.format("host id is null, using last host id %d", hostId) );
-            }
-        }
-
-        if(CollectionUtils.isNotEmpty(commandsToSend)) {
+        if (CollectionUtils.isNotEmpty(commandsToSend)) {
             Commands commandsContainer = new Commands(Command.OnError.Stop);
             commandsContainer.addCommands(commandsToSend);
             try {
@@ -2241,86 +2241,164 @@
         return null;
     }
 
-    private void afterHypervisorMigrationCleanup(StoragePool destPool, VMInstanceVO vm, HostVO srcHost, Long srcClusterId, Answer[] hypervisorMigrationResults) throws InsufficientCapacityException {
+    private void afterHypervisorMigrationCleanup(VMInstanceVO vm, Map<Volume, StoragePool> volumeToPool, Long sourceClusterId, Answer[] hypervisorMigrationResults) throws InsufficientCapacityException {
         boolean isDebugEnabled = s_logger.isDebugEnabled();
         if(isDebugEnabled) {
-            String msg = String.format("cleaning up after hypervisor pool migration volumes for VM %s(%s) to pool %s(%s)", vm.getInstanceName(), vm.getUuid(), destPool.getName(), destPool.getUuid());
+            String msg = String.format("Cleaning up after hypervisor pool migration volumes for VM %s(%s)", vm.getInstanceName(), vm.getUuid());
             s_logger.debug(msg);
         }
-        setDestinationPoolAndReallocateNetwork(destPool, vm);
-        // OfflineVmwareMigration: don't set this to null or have another way to address the command; twice migrating will lead to an NPE
-        Long destPodId = destPool.getPodId();
-        Long vmPodId = vm.getPodIdToDeployIn();
-        if (destPodId == null || ! destPodId.equals(vmPodId)) {
+        StoragePool rootVolumePool = null;
+        if (MapUtils.isNotEmpty(volumeToPool)) {
+            for (Map.Entry<Volume, StoragePool> entry : volumeToPool.entrySet()) {
+                if (Type.ROOT.equals(entry.getKey().getVolumeType())) {
+                    rootVolumePool = entry.getValue();
+                    break;
+                }
+            }
+        }
+        setDestinationPoolAndReallocateNetwork(rootVolumePool, vm);
+        Long destClusterId = rootVolumePool != null ? rootVolumePool.getClusterId() : null;
+        if (destClusterId != null && !destClusterId.equals(sourceClusterId)) {
             if(isDebugEnabled) {
-                String msg = String.format("resetting lasHost for VM %s(%s) as pod (%s) is no good.", vm.getInstanceName(), vm.getUuid(), destPodId);
+                String msg = String.format("Resetting lastHost for VM %s(%s)", vm.getInstanceName(), vm.getUuid());
                 s_logger.debug(msg);
             }
 
             vm.setLastHostId(null);
-            vm.setPodIdToDeployIn(destPodId);
+            vm.setPodIdToDeployIn(rootVolumePool.getPodId());
             // OfflineVmwareMigration: a consecutive migration will fail probably (no host not pod)
         }// else keep last host set for this vm
-        markVolumesInPool(vm,destPool, hypervisorMigrationResults);
+        markVolumesInPool(vm, hypervisorMigrationResults);
         // OfflineVmwareMigration: deal with answers, if (hypervisorMigrationResults.length > 0)
         // OfflineVmwareMigration: iterate over the volumes for data updates
     }
 
-    private void markVolumesInPool(VMInstanceVO vm, StoragePool destPool, Answer[] hypervisorMigrationResults) {
+    private void markVolumesInPool(VMInstanceVO vm, Answer[] hypervisorMigrationResults) {
         MigrateVmToPoolAnswer relevantAnswer = null;
+        if (hypervisorMigrationResults.length == 1 && !hypervisorMigrationResults[0].getResult()) {
+            throw new CloudRuntimeException(String.format("VM ID: %s migration failed. %s", vm.getUuid(), hypervisorMigrationResults[0].getDetails()));
+        }
         for (Answer answer : hypervisorMigrationResults) {
             if (s_logger.isTraceEnabled()) {
-                s_logger.trace(String.format("received an %s: %s", answer.getClass().getSimpleName(), answer));
+                s_logger.trace(String.format("Received an %s: %s", answer.getClass().getSimpleName(), answer));
             }
             if (answer instanceof MigrateVmToPoolAnswer) {
                 relevantAnswer = (MigrateVmToPoolAnswer) answer;
             }
         }
         if (relevantAnswer == null) {
-            throw new CloudRuntimeException("no relevant migration results found");
+            throw new CloudRuntimeException("No relevant migration results found");
+        }
+        List<VolumeObjectTO> results = relevantAnswer.getVolumeTos();
+        if (results == null) {
+            results = new ArrayList<>();
         }
         List<VolumeVO> volumes = _volsDao.findUsableVolumesForInstance(vm.getId());
         if(s_logger.isDebugEnabled()) {
-            String msg = String.format("found %d volumes for VM %s(uuid:%s, id:%d)", volumes.size(), vm.getInstanceName(), vm.getUuid(), vm.getId());
+            String msg = String.format("Found %d volumes for VM %s(uuid:%s, id:%d)", results.size(), vm.getInstanceName(), vm.getUuid(), vm.getId());
             s_logger.debug(msg);
         }
-        for (VolumeObjectTO result : relevantAnswer.getVolumeTos() ) {
+        for (VolumeObjectTO result : results ) {
             if(s_logger.isDebugEnabled()) {
-                s_logger.debug(String.format("updating volume (%d) with path '%s' on pool '%d'", result.getId(), result.getPath(), destPool.getId()));
+                s_logger.debug(String.format("Updating volume (%d) with path '%s' on pool '%s'", result.getId(), result.getPath(), result.getDataStoreUuid()));
             }
             VolumeVO volume = _volsDao.findById(result.getId());
+            StoragePool pool = _storagePoolDao.findPoolByUUID(result.getDataStoreUuid());
+            if (volume == null || pool == null) {
+                continue;
+            }
             volume.setPath(result.getPath());
-            volume.setPoolId(destPool.getId());
+            volume.setPoolId(pool.getId());
             _volsDao.update(volume.getId(), volume);
         }
     }
 
-    private void migrateThroughHypervisorOrStorage(StoragePool destPool, VMInstanceVO vm) throws StorageUnavailableException, InsufficientCapacityException {
+    private Pair<Long, Long> findClusterAndHostIdForVm(VMInstanceVO vm) {
+        Long hostId = vm.getHostId();
+        Long clusterId = null;
+        // OfflineVmwareMigration: probably this is null when vm is stopped
+        if(hostId == null) {
+            hostId = vm.getLastHostId();
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug(String.format("host id is null, using last host id %d", hostId) );
+            }
+        }
+        if (hostId == null) {
+            List<VolumeVO> volumes = _volsDao.findByInstanceAndType(vm.getId(), Type.ROOT);
+            if (CollectionUtils.isNotEmpty(volumes)) {
+                VolumeVO rootVolume = volumes.get(0);
+                if (rootVolume.getPoolId() != null) {
+                    StoragePoolVO pool = _storagePoolDao.findById(rootVolume.getPoolId());
+                    if (pool != null && pool.getClusterId() != null) {
+                        clusterId = pool.getClusterId();
+                        List<HostVO> hosts = _hostDao.findHypervisorHostInCluster(pool.getClusterId());
+                        if (CollectionUtils.isNotEmpty(hosts)) {
+                            hostId = hosts.get(0).getId();
+                        }
+                    }
+                }
+            }
+        }
+        if (clusterId == null && hostId != null) {
+            HostVO host = _hostDao.findById(hostId);
+            if (host != null) {
+                clusterId = host.getClusterId();
+            }
+        }
+        return new Pair<>(clusterId, hostId);
+    }
+
+    private void migrateThroughHypervisorOrStorage(VMInstanceVO vm, Map<Volume, StoragePool> volumeToPool) throws StorageUnavailableException, InsufficientCapacityException {
         final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
-        final Long srchostId = vm.getHostId() != null ? vm.getHostId() : vm.getLastHostId();
-        final HostVO srcHost = _hostDao.findById(srchostId);
-        final Long srcClusterId = srcHost.getClusterId();
-        Answer[] hypervisorMigrationResults = attemptHypervisorMigration(destPool, vm);
+        Pair<Long, Long> vmClusterAndHost = findClusterAndHostIdForVm(vm);
+        final Long sourceClusterId = vmClusterAndHost.first();
+        final Long sourceHostId = vmClusterAndHost.second();
+        Answer[] hypervisorMigrationResults = attemptHypervisorMigration(vm, volumeToPool, sourceHostId);
         boolean migrationResult = false;
         if (hypervisorMigrationResults == null) {
             // OfflineVmwareMigration: if the HypervisorGuru can't do it, let the volume manager take care of it.
-            migrationResult = volumeMgr.storageMigration(profile, destPool);
+            migrationResult = volumeMgr.storageMigration(profile, volumeToPool);
             if (migrationResult) {
-                afterStorageMigrationCleanup(destPool, vm, srcHost, srcClusterId);
+                postStorageMigrationCleanup(vm, volumeToPool, _hostDao.findById(sourceHostId), sourceClusterId);
             } else {
                 s_logger.debug("Storage migration failed");
             }
         } else {
-            afterHypervisorMigrationCleanup(destPool, vm, srcHost, srcClusterId, hypervisorMigrationResults);
+            afterHypervisorMigrationCleanup(vm, volumeToPool, sourceClusterId, hypervisorMigrationResults);
         }
     }
 
-    private void preStorageMigrationStateCheck(StoragePool destPool, VMInstanceVO vm) {
-        if (destPool == null) {
-            throw new CloudRuntimeException("Unable to migrate vm: missing destination storage pool");
+    private Map<Volume, StoragePool> prepareVmStorageMigration(VMInstanceVO vm, Map<Long, Long> volumeToPool) {
+        Map<Volume, StoragePool> volumeToPoolMap = new HashMap<>();
+        if (MapUtils.isEmpty(volumeToPool)) {
+            throw new CloudRuntimeException("Unable to migrate vm: missing volume to pool mapping");
         }
-
-        checkDestinationForTags(destPool, vm);
+        Cluster cluster = null;
+        Long dataCenterId = null;
+        for (Map.Entry<Long, Long> entry: volumeToPool.entrySet()) {
+            StoragePool pool = _storagePoolDao.findById(entry.getValue());
+            if (pool.getClusterId() != null) {
+                cluster = _clusterDao.findById(pool.getClusterId());
+                break;
+            }
+            dataCenterId = pool.getDataCenterId();
+        }
+        Long podId = null;
+        Long clusterId = null;
+        if (cluster != null) {
+            dataCenterId = cluster.getDataCenterId();
+            podId = cluster.getPodId();
+            clusterId = cluster.getId();
+        }
+        if (dataCenterId == null) {
+            String msg = "Unable to migrate vm: failed to create deployment destination with given volume to pool map";
+            s_logger.debug(msg);
+            throw new CloudRuntimeException(msg);
+        }
+        final DataCenterDeployment destination = new DataCenterDeployment(dataCenterId, podId, clusterId, null, null, null);
+        // Create a map of which volume should go in which storage pool.
+        final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+        volumeToPoolMap = createMappingVolumeAndStoragePool(profile, destination, volumeToPool);
         try {
             stateTransitTo(vm, Event.StorageMigrationRequested, null);
         } catch (final NoTransitionException e) {
@@ -2328,6 +2406,7 @@
             s_logger.debug(msg);
             throw new CloudRuntimeException(msg, e);
         }
+        return volumeToPoolMap;
     }
 
     private void checkDestinationForTags(StoragePool destPool, VMInstanceVO vm) {
@@ -2366,24 +2445,35 @@
     }
 
 
-    private void afterStorageMigrationCleanup(StoragePool destPool, VMInstanceVO vm, HostVO srcHost, Long srcClusterId) throws InsufficientCapacityException {
-        setDestinationPoolAndReallocateNetwork(destPool, vm);
+    private void postStorageMigrationCleanup(VMInstanceVO vm, Map<Volume, StoragePool> volumeToPool, HostVO srcHost, Long srcClusterId) throws InsufficientCapacityException {
+        StoragePool rootVolumePool = null;
+        if (MapUtils.isNotEmpty(volumeToPool)) {
+            for (Map.Entry<Volume, StoragePool> entry : volumeToPool.entrySet()) {
+                if (Type.ROOT.equals(entry.getKey().getVolumeType())) {
+                    rootVolumePool = entry.getValue();
+                    break;
+                }
+            }
+        }
+        setDestinationPoolAndReallocateNetwork(rootVolumePool, vm);
 
         //when start the vm next time, don;'t look at last_host_id, only choose the host based on volume/storage pool
         vm.setLastHostId(null);
-        vm.setPodIdToDeployIn(destPool.getPodId());
+        if (rootVolumePool != null) {
+            vm.setPodIdToDeployIn(rootVolumePool.getPodId());
+        }
 
         // If VM was cold migrated between clusters belonging to two different VMware DCs,
         // unregister the VM from the source host and cleanup the associated VM files.
         if (vm.getHypervisorType().equals(HypervisorType.VMware)) {
-            afterStorageMigrationVmwareVMcleanup(destPool, vm, srcHost, srcClusterId);
+            afterStorageMigrationVmwareVMcleanup(rootVolumePool, vm, srcHost, srcClusterId);
         }
     }
 
     private void setDestinationPoolAndReallocateNetwork(StoragePool destPool, VMInstanceVO vm) throws InsufficientCapacityException {
         //if the vm is migrated to different pod in basic mode, need to reallocate ip
 
-        if (destPool.getPodId() != null && !destPool.getPodId().equals(vm.getPodIdToDeployIn())) {
+        if (destPool != null && destPool.getPodId() != null && !destPool.getPodId().equals(vm.getPodIdToDeployIn())) {
             if (s_logger.isDebugEnabled()) {
                 String msg = String.format("as the pod for vm %s has changed we are reallocating its network", vm.getInstanceName());
                 s_logger.debug(msg);
@@ -2397,7 +2487,7 @@
     private void afterStorageMigrationVmwareVMcleanup(StoragePool destPool, VMInstanceVO vm, HostVO srcHost, Long srcClusterId) {
         // OfflineVmwareMigration: this should only happen on storage migration, else the guru would already have issued the command
         final Long destClusterId = destPool.getClusterId();
-        if (srcClusterId != null && destClusterId != null && ! srcClusterId.equals(destClusterId)) {
+        if (srcClusterId != null && destClusterId != null && ! srcClusterId.equals(destClusterId) && srcHost != null) {
             final String srcDcName = _clusterDetailsDao.getVmwareDcName(srcClusterId);
             final String destDcName = _clusterDetailsDao.getVmwareDcName(destClusterId);
             if (srcDcName != null && destDcName != null && !srcDcName.equals(destDcName)) {
@@ -2517,11 +2607,14 @@
         }
 
         final VirtualMachineProfile vmSrc = new VirtualMachineProfileImpl(vm);
+        vmSrc.setHost(fromHost);
         for (final NicProfile nic : _networkMgr.getNicProfiles(vm)) {
             vmSrc.addNic(nic);
         }
 
         final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm, null, _offeringDao.findById(vm.getId(), vm.getServiceOfferingId()), null, null);
+        profile.setHost(dest.getHost());
+
         _networkMgr.prepareNicForMigration(profile, dest);
         volumeMgr.prepareForMigration(profile, dest);
         profile.setConfigDriveLabel(VmConfigDriveLabel.value());
@@ -2549,6 +2642,7 @@
         } finally {
             if (pfma == null) {
                 _networkMgr.rollbackNicForMigration(vmSrc, profile);
+                volumeMgr.release(vm.getId(), dstHostId);
                 work.setStep(Step.Done);
                 _workDao.update(work.getId(), work);
             }
@@ -2558,15 +2652,21 @@
         try {
             if (vm == null || vm.getHostId() == null || vm.getHostId() != srcHostId || !changeState(vm, Event.MigrationRequested, dstHostId, work, Step.Migrating)) {
                 _networkMgr.rollbackNicForMigration(vmSrc, profile);
+                if (vm != null) {
+                    volumeMgr.release(vm.getId(), dstHostId);
+                }
+
                 s_logger.info("Migration cancelled because state has changed: " + vm);
                 throw new ConcurrentOperationException("Migration cancelled because state has changed: " + vm);
             }
         } catch (final NoTransitionException e1) {
             _networkMgr.rollbackNicForMigration(vmSrc, profile);
+            volumeMgr.release(vm.getId(), dstHostId);
             s_logger.info("Migration cancelled because " + e1.getMessage());
             throw new ConcurrentOperationException("Migration cancelled because " + e1.getMessage());
         } catch (final CloudRuntimeException e2) {
             _networkMgr.rollbackNicForMigration(vmSrc, profile);
+            volumeMgr.release(vm.getId(), dstHostId);
             s_logger.info("Migration cancelled because " + e2.getMessage());
             work.setStep(Step.Done);
             _workDao.update(work.getId(), work);
@@ -2634,6 +2734,7 @@
             if (!migrated) {
                 s_logger.info("Migration was unsuccessful.  Cleaning up: " + vm);
                 _networkMgr.rollbackNicForMigration(vmSrc, profile);
+                volumeMgr.release(vm.getId(), dstHostId);
 
                 _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(),
                         "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + " in zone " + dest.getDataCenter().getName() + " and pod " +
@@ -2651,6 +2752,7 @@
                 }
             } else {
                 _networkMgr.commitNicForMigration(vmSrc, profile);
+                volumeMgr.release(vm.getId(), srcHostId);
                 _networkMgr.setHypervisorHostname(profile, dest, true);
             }
 
@@ -2661,13 +2763,23 @@
 
     /**
      * We create the mapping of volumes and storage pool to migrate the VMs according to the information sent by the user.
-     * If the user did not enter a complete mapping, the volumes that were left behind will be auto mapped using {@link #createStoragePoolMappingsForVolumes(VirtualMachineProfile, Host, Map, List)}
+     * If the user did not enter a complete mapping, the volumes that were left behind will be auto mapped using {@link #createStoragePoolMappingsForVolumes(VirtualMachineProfile, DataCenterDeployment, Map, List)}
      */
     protected Map<Volume, StoragePool> createMappingVolumeAndStoragePool(VirtualMachineProfile profile, Host targetHost, Map<Long, Long> userDefinedMapOfVolumesAndStoragePools) {
+        return createMappingVolumeAndStoragePool(profile,
+                new DataCenterDeployment(targetHost.getDataCenterId(), targetHost.getPodId(), targetHost.getClusterId(), targetHost.getId(), null, null),
+                userDefinedMapOfVolumesAndStoragePools);
+    }
+
+    private Map<Volume, StoragePool> createMappingVolumeAndStoragePool(final VirtualMachineProfile profile, final DataCenterDeployment plan, final Map<Long, Long> userDefinedMapOfVolumesAndStoragePools) {
+        Host targetHost = null;
+        if (plan.getHostId() != null) {
+            targetHost = _hostDao.findById(plan.getHostId());
+        }
         Map<Volume, StoragePool> volumeToPoolObjectMap = buildMapUsingUserInformation(profile, targetHost, userDefinedMapOfVolumesAndStoragePools);
 
         List<Volume> volumesNotMapped = findVolumesThatWereNotMappedByTheUser(profile, volumeToPoolObjectMap);
-        createStoragePoolMappingsForVolumes(profile, targetHost, volumeToPoolObjectMap, volumesNotMapped);
+        createStoragePoolMappingsForVolumes(profile, plan, volumeToPoolObjectMap, volumesNotMapped);
         return volumeToPoolObjectMap;
     }
 
@@ -2702,7 +2814,7 @@
             StoragePoolVO currentPool = _storagePoolDao.findById(volume.getPoolId());
 
             executeManagedStorageChecksWhenTargetStoragePoolProvided(currentPool, volume, targetPool);
-            if (_poolHostDao.findByPoolHost(targetPool.getId(), targetHost.getId()) == null) {
+            if (targetHost != null && _poolHostDao.findByPoolHost(targetPool.getId(), targetHost.getId()) == null) {
                 throw new CloudRuntimeException(
                         String.format("Cannot migrate the volume [%s] to the storage pool [%s] while migrating VM [%s] to target host [%s]. The host does not have access to the storage pool entered.",
                                 volume.getUuid(), targetPool.getUuid(), profile.getUuid(), targetHost.getUuid()));
@@ -2737,13 +2849,17 @@
      * For each one of the volumes we will map it to a storage pool that is available via the target host.
      * An exception is thrown if we cannot find a storage pool that is accessible in the target host to migrate the volume to.
      */
-    protected void createStoragePoolMappingsForVolumes(VirtualMachineProfile profile, Host targetHost, Map<Volume, StoragePool> volumeToPoolObjectMap, List<Volume> allVolumes) {
+    protected void createStoragePoolMappingsForVolumes(VirtualMachineProfile profile, DataCenterDeployment plan, Map<Volume, StoragePool> volumeToPoolObjectMap, List<Volume> allVolumes) {
         for (Volume volume : allVolumes) {
             StoragePoolVO currentPool = _storagePoolDao.findById(volume.getPoolId());
 
+            Host targetHost = null;
+            if (plan.getHostId() != null) {
+                targetHost = _hostDao.findById(plan.getHostId());
+            }
             executeManagedStorageChecksWhenTargetStoragePoolNotProvided(targetHost, currentPool, volume);
-            if (ScopeType.HOST.equals(currentPool.getScope()) || isStorageCrossClusterMigration(targetHost, currentPool)) {
-                createVolumeToStoragePoolMappingIfPossible(profile, targetHost, volumeToPoolObjectMap, volume, currentPool);
+            if (ScopeType.HOST.equals(currentPool.getScope()) || isStorageCrossClusterMigration(plan.getClusterId(), currentPool)) {
+                createVolumeToStoragePoolMappingIfPossible(profile, plan, volumeToPoolObjectMap, volume, currentPool);
             } else {
                 volumeToPoolObjectMap.put(volume, currentPool);
             }
@@ -2761,17 +2877,17 @@
         if (!currentPool.isManaged()) {
             return;
         }
-        if (_poolHostDao.findByPoolHost(currentPool.getId(), targetHost.getId()) == null) {
+        if (targetHost != null && _poolHostDao.findByPoolHost(currentPool.getId(), targetHost.getId()) == null) {
             throw new CloudRuntimeException(String.format("The target host does not have access to the volume's managed storage pool. [volumeId=%s, storageId=%s, targetHostId=%s].", volume.getUuid(),
                     currentPool.getUuid(), targetHost.getUuid()));
         }
     }
 
     /**
-     *  Return true if the VM migration is a cross cluster migration. To execute that, we check if the volume current storage pool cluster is different from the target host cluster.
+     *  Return true if the VM migration is a cross cluster migration. To execute that, we check if the volume current storage pool cluster is different from the target cluster.
      */
-    protected boolean isStorageCrossClusterMigration(Host targetHost, StoragePoolVO currentPool) {
-        return ScopeType.CLUSTER.equals(currentPool.getScope()) && currentPool.getClusterId() != targetHost.getClusterId();
+    protected boolean isStorageCrossClusterMigration(Long clusterId, StoragePoolVO currentPool) {
+        return clusterId != null && ScopeType.CLUSTER.equals(currentPool.getScope()) && !currentPool.getClusterId().equals(clusterId);
     }
 
     /**
@@ -2783,37 +2899,44 @@
      *
      * Side note: this method should only be called if the volume is on local storage or if we are executing a cross cluster migration.
      */
-    protected void createVolumeToStoragePoolMappingIfPossible(VirtualMachineProfile profile, Host targetHost, Map<Volume, StoragePool> volumeToPoolObjectMap, Volume volume,
+    protected void createVolumeToStoragePoolMappingIfPossible(VirtualMachineProfile profile, DataCenterDeployment plan, Map<Volume, StoragePool> volumeToPoolObjectMap, Volume volume,
             StoragePoolVO currentPool) {
-        List<StoragePool> storagePoolList = getCandidateStoragePoolsToMigrateLocalVolume(profile, targetHost, volume);
+        List<StoragePool> storagePoolList = getCandidateStoragePoolsToMigrateLocalVolume(profile, plan, volume);
 
         if (CollectionUtils.isEmpty(storagePoolList)) {
-            throw new CloudRuntimeException(String.format("There is not storage pools available at the target host [%s] to migrate volume [%s]", targetHost.getUuid(), volume.getUuid()));
+            String msg;
+            if (plan.getHostId() != null) {
+                Host targetHost = _hostDao.findById(plan.getHostId());
+                msg = String.format("There are no storage pools available at the target host [%s] to migrate volume [%s]", targetHost.getUuid(), volume.getUuid());
+            } else {
+                Cluster targetCluster = _clusterDao.findById(plan.getClusterId());
+                msg = String.format("There are no storage pools available in the target cluster [%s] to migrate volume [%s]", targetCluster.getUuid(), volume.getUuid());
+            }
+            throw new CloudRuntimeException(msg);
         }
 
         Collections.shuffle(storagePoolList);
-        boolean canTargetHostAccessVolumeCurrentStoragePool = false;
+        boolean candidatePoolsListContainsVolumeCurrentStoragePool = false;
         for (StoragePool storagePool : storagePoolList) {
             if (storagePool.getId() == currentPool.getId()) {
-                canTargetHostAccessVolumeCurrentStoragePool = true;
+                candidatePoolsListContainsVolumeCurrentStoragePool = true;
                 break;
             }
 
         }
-        if (!canTargetHostAccessVolumeCurrentStoragePool) {
+        if (!candidatePoolsListContainsVolumeCurrentStoragePool) {
             volumeToPoolObjectMap.put(volume, _storagePoolDao.findByUuid(storagePoolList.get(0).getUuid()));
         }
     }
 
     /**
-     * We use {@link StoragePoolAllocator} objects to find storage pools connected to the targetHost where we would be able to allocate the given volume.
+     * We use {@link StoragePoolAllocator} objects to find storage pools for given DataCenterDeployment where we would be able to allocate the given volume.
      */
-    protected List<StoragePool> getCandidateStoragePoolsToMigrateLocalVolume(VirtualMachineProfile profile, Host targetHost, Volume volume) {
+    protected List<StoragePool> getCandidateStoragePoolsToMigrateLocalVolume(VirtualMachineProfile profile, DataCenterDeployment plan, Volume volume) {
         List<StoragePool> poolList = new ArrayList<>();
 
         DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
         DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType());
-        DataCenterDeployment plan = new DataCenterDeployment(targetHost.getDataCenterId(), targetHost.getPodId(), targetHost.getClusterId(), targetHost.getId(), null, null);
         ExcludeList avoid = new ExcludeList();
 
         StoragePoolVO volumeStoragePool = _storagePoolDao.findById(volume.getPoolId());
@@ -2826,7 +2949,7 @@
                 continue;
             }
             for (StoragePool pool : poolListFromAllocator) {
-                if (pool.isLocal() || isStorageCrossClusterMigration(targetHost, volumeStoragePool)) {
+                if (pool.isLocal() || isStorageCrossClusterMigration(plan.getClusterId(), volumeStoragePool)) {
                     poolList.add(pool);
                 }
             }
@@ -2919,8 +3042,16 @@
         final Cluster cluster = _clusterDao.findById(destHost.getClusterId());
         final DeployDestination destination = new DeployDestination(dc, pod, cluster, destHost);
 
+        final VirtualMachineProfile vmSrc = new VirtualMachineProfileImpl(vm);
+        vmSrc.setHost(srcHost);
+        for (final NicProfile nic : _networkMgr.getNicProfiles(vm)) {
+            vmSrc.addNic(nic);
+        }
+
+        final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm, null, _offeringDao.findById(vm.getId(), vm.getServiceOfferingId()), null, null);
+        profile.setHost(destHost);
+
         // Create a map of which volume should go in which storage pool.
-        final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
         final Map<Volume, StoragePool> volumeToPoolMap = createMappingVolumeAndStoragePool(profile, destHost, volumeToPool);
 
         // If none of the volumes have to be migrated, fail the call. Administrator needs to make a call for migrating
@@ -2948,7 +3079,6 @@
         work.setResourceId(destHostId);
         work = _workDao.persist(work);
 
-
         // Put the vm in migrating state.
         vm.setLastHostId(srcHostId);
         vm.setPodIdToDeployIn(destHost.getPodId());
@@ -2964,7 +3094,7 @@
 
             Nic defaultNic = _networkModel.getDefaultNic(vm.getId());
 
-            if (defaultNic != null) {
+            if (defaultNic != null && VirtualMachine.Type.User.equals(vm.getType())) {
                 UserVmVO userVm = _userVmDao.findById(vm.getId());
                 Map<String, String> details = userVmDetailsDao.listDetailsKeyPairs(vm.getId());
                 userVm.setDetails(details);
@@ -3020,6 +3150,9 @@
         } finally {
             if (!migrated) {
                 s_logger.info("Migration was unsuccessful.  Cleaning up: " + vm);
+                _networkMgr.rollbackNicForMigration(vmSrc, profile);
+                volumeMgr.release(vm.getId(), destHostId);
+
                 _alertMgr.sendAlert(alertType, srcHost.getDataCenterId(), srcHost.getPodId(),
                         "Unable to migrate vm " + vm.getInstanceName() + " from host " + srcHost.getName() + " in zone " + dc.getName() + " and pod " + dc.getName(),
                         "Migrate Command failed.  Please check logs.");
@@ -3034,6 +3167,8 @@
                 }
                 _networkMgr.setHypervisorHostname(profile, destination, false);
             } else {
+                _networkMgr.commitNicForMigration(vmSrc, profile);
+                volumeMgr.release(vm.getId(), srcHostId);
                 _networkMgr.setHypervisorHostname(profile, destination, true);
             }
 
@@ -3308,7 +3443,7 @@
     ResourceUnavailableException {
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         // if there are active vm snapshots task, state change is not allowed
-        if(_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())){
+        if (_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) {
             s_logger.error("Unable to reboot VM " + vm + " due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
             throw new CloudRuntimeException("Unable to reboot VM " + vm + " due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
         }
@@ -4516,11 +4651,11 @@
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {ClusterDeltaSyncInterval, StartRetry, VmDestroyForcestop, VmOpCancelInterval, VmOpCleanupInterval, VmOpCleanupWait,
-            VmOpLockStateRetry,
-            VmOpWaitInterval, ExecuteInSequence, VmJobCheckInterval, VmJobTimeout, VmJobStateReportInterval, VmConfigDriveLabel, VmConfigDriveOnPrimaryPool, HaVmRestartHostUp,
-            ResoureCountRunningVMsonly, AllowExposeHypervisorHostname, AllowExposeHypervisorHostnameAccountLevel,
-            VmServiceOfferingMaxCPUCores, VmServiceOfferingMaxRAMSize };
+        return new ConfigKey<?>[] { ClusterDeltaSyncInterval, StartRetry, VmDestroyForcestop, VmOpCancelInterval, VmOpCleanupInterval, VmOpCleanupWait,
+                VmOpLockStateRetry, VmOpWaitInterval, ExecuteInSequence, VmJobCheckInterval, VmJobTimeout, VmJobStateReportInterval,
+                VmConfigDriveLabel, VmConfigDriveOnPrimaryPool, VmConfigDriveForceHostCacheUse, VmConfigDriveUseHostCacheOnUnsupportedPool,
+                HaVmRestartHostUp, ResoureCountRunningVMsonly, AllowExposeHypervisorHostname, AllowExposeHypervisorHostnameAccountLevel,
+                VmServiceOfferingMaxCPUCores, VmServiceOfferingMaxRAMSize };
     }
 
     public List<StoragePoolAllocator> getStoragePoolAllocators() {
@@ -4670,12 +4805,12 @@
                         String.format("VM %s is at %s and we received a %s report while there is no pending jobs on it"
                                 , vm.getInstanceName(), vm.getState(), vm.getPowerState()));
             }
-            if(vm.isHaEnabled() && vm.getState() == State.Running
+            if (vm.isHaEnabled() && vm.getState() == State.Running
                     && HaVmRestartHostUp.value()
                     && vm.getHypervisorType() != HypervisorType.VMware
                     && vm.getHypervisorType() != HypervisorType.Hyperv) {
                 s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart");
-                if(!_haMgr.hasPendingHaWork(vm.getId())) {
+                if (!_haMgr.hasPendingHaWork(vm.getId())) {
                     _haMgr.scheduleRestart(vm, true);
                 } else {
                     s_logger.info("VM " + vm.getInstanceName() + " already has an pending HA task working on it");
@@ -4684,13 +4819,20 @@
             }
 
             // not when report is missing
-            if(PowerState.PowerOff.equals(vm.getPowerState())) {
+            if (PowerState.PowerOff.equals(vm.getPowerState())) {
                 final VirtualMachineGuru vmGuru = getVmGuru(vm);
                 final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
                 if (!sendStop(vmGuru, profile, true, true)) {
                     // In case StopCommand fails, don't proceed further
                     return;
+                } else {
+                    // Release resources on StopCommand success
+                    releaseVmResources(profile, true);
                 }
+            } else if (PowerState.PowerReportMissing.equals(vm.getPowerState())) {
+                final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+                // VM will be sync-ed to Stopped state, release the resources
+                releaseVmResources(profile, true);
             }
 
             try {
@@ -5243,12 +5385,19 @@
     }
 
     public Outcome<VirtualMachine> migrateVmStorageThroughJobQueue(
-            final String vmUuid, final StoragePool destPool) {
+            final String vmUuid, final Map<Long, Long> volumeToPool) {
 
         final CallContext context = CallContext.current();
         final User user = context.getCallingUser();
         final Account account = context.getCallingAccount();
 
+        Collection<Long> poolIds = volumeToPool.values();
+        Set<Long> uniquePoolIds = new HashSet<>(poolIds);
+        for (Long poolId : uniquePoolIds) {
+            StoragePoolVO pool = _storagePoolDao.findById(poolId);
+            checkConcurrentJobsPerDatastoreThreshhold(pool);
+        }
+
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
         final List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
@@ -5274,7 +5423,7 @@
 
             // save work context info (there are some duplications)
             final VmWorkStorageMigration workInfo = new VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
-                    VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, destPool.getId());
+                    VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, volumeToPool);
             workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 
             _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
@@ -5460,10 +5609,9 @@
             s_logger.trace(String.format("orchestrating VM start for '%s' %s set to %s", vm.getInstanceName(), VirtualMachineProfile.Param.BootIntoSetup, enterSetup));
         }
 
-        try{
+        try {
             orchestrateStart(vm.getUuid(), work.getParams(), work.getPlan(), _dpMgr.getDeploymentPlannerByName(work.getDeploymentPlanner()));
-        }
-        catch (CloudRuntimeException e){
+        } catch (CloudRuntimeException e) {
             e.printStackTrace();
             s_logger.info("Caught CloudRuntimeException, returning job failed " + e);
             CloudRuntimeException ex = new CloudRuntimeException("Unable to start VM instance");
@@ -5620,8 +5768,7 @@
             s_logger.info("Unable to find vm " + work.getVmId());
         }
         assert vm != null;
-        final StoragePool pool = (PrimaryDataStoreInfo)dataStoreMgr.getPrimaryDataStore(work.getDestStoragePoolId());
-        orchestrateStorageMigration(vm.getUuid(), pool);
+        orchestrateStorageMigration(vm.getUuid(), work.getVolumeToPool());
 
         return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
     }
diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VmWorkStorageMigration.java b/engine/orchestration/src/main/java/com/cloud/vm/VmWorkStorageMigration.java
index 1d7d55e..07e8549 100644
--- a/engine/orchestration/src/main/java/com/cloud/vm/VmWorkStorageMigration.java
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VmWorkStorageMigration.java
@@ -16,18 +16,20 @@
 // under the License.
 package com.cloud.vm;
 
+import java.util.Map;
+
 public class VmWorkStorageMigration extends VmWork {
     private static final long serialVersionUID = -8677979691741157474L;
 
-    Long destPoolId;
+    Map<Long, Long> volumeToPool;
 
-    public VmWorkStorageMigration(long userId, long accountId, long vmId, String handlerName, Long destPoolId) {
+    public VmWorkStorageMigration(long userId, long accountId, long vmId, String handlerName, Map <Long, Long> volumeToPool) {
         super(userId, accountId, vmId, handlerName);
 
-        this.destPoolId = destPoolId;
+        this.volumeToPool = volumeToPool;
     }
 
-    public Long getDestStoragePoolId() {
-        return destPoolId;
+    public Map<Long, Long> getVolumeToPool() {
+        return volumeToPool;
     }
 }
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index aa904b3..fbdd166 100644
--- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -461,27 +461,21 @@
                 if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) {
                     offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true,
                             Availability.Optional, null, new HashMap<Network.Service, Set<Network.Provider>>(), true, Network.GuestType.Shared, false, null, true, null, true,
-                            false, null, false, null, true, false, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
-                    _networkOfferingDao.update(offering.getId(), offering);
+                            false, null, false, null, true, false, null, null, true);
                 }
 
                 //#2 - SG enabled network offering
                 if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) {
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks",
                             TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true,
-                            null, true, false, null, false, null, true, false, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
-                    _networkOfferingDao.update(offering.getId(), offering);
+                            null, true, false, null, false, null, true, false, null, null, true);
                 }
 
                 //#3 - shared network offering with no SG service
                 if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) {
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true,
                             Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false,
-                            null, true, false, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
-                    _networkOfferingDao.update(offering.getId(), offering);
+                            null, true, false, null, null, true);
                 }
 
                 //#4 - default isolated offering with Source nat service
@@ -489,19 +483,14 @@
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
                             "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null,
                             defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null,
-                            true, false, null, null);
-
-                    offering.setState(NetworkOffering.State.Enabled);
-                    _networkOfferingDao.update(offering.getId(), offering);
+                            true, false, null, null, true);
                 }
 
                 //#5 - default vpc offering with LB service
                 if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) {
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
                             "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null,
-                            defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
-                    _networkOfferingDao.update(offering.getId(), offering);
+                            defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, true);
                 }
 
                 //#6 - default vpc offering with no LB service
@@ -510,18 +499,14 @@
                     defaultVPCOffProviders.remove(Service.Lb);
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
                             "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional,
-                            null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
-                    _networkOfferingDao.update(offering.getId(), offering);
+                            null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, true);
                 }
 
                 //#7 - isolated offering with source nat disabled
                 if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) {
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service",
                             TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null,
-                            true, null, true, false, null, false, null, true, false, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
-                    _networkOfferingDao.update(offering.getId(), offering);
+                            true, null, true, false, null, false, null, true, false, null, null, true);
                 }
 
                 //#8 - network offering with internal lb service
@@ -543,8 +528,7 @@
                 if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) {
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
                             "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders,
-                            true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
+                            true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, true);
                     offering.setInternalLb(true);
                     offering.setPublicLb(false);
                     _networkOfferingDao.update(offering.getId(), offering);
@@ -575,8 +559,7 @@
                 if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) {
                     offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
                             "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null,
-                            netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true, false, null, null);
-                    offering.setState(NetworkOffering.State.Enabled);
+                            netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true, false, null, null, true);
                     offering.setDedicatedLB(false);
                     _networkOfferingDao.update(offering.getId(), offering);
                 }
@@ -640,6 +623,15 @@
         setStateMachine();
     }
 
+    private void updateRouterIpInNetworkDetails(Long networkId, String routerIp, String routerIpv6) {
+        if (isNotBlank(routerIp)) {
+            networkDetailsDao.addDetail(networkId, ApiConstants.ROUTER_IP, routerIp, true);
+        }
+        if (isNotBlank(routerIpv6)) {
+            networkDetailsDao.addDetail(networkId, ApiConstants.ROUTER_IPV6, routerIpv6, true);
+        }
+    }
+
     @Override
     public List<? extends Network> setupNetwork(final Account owner, final NetworkOffering offering, final DeploymentPlan plan, final String name, final String displayText, final boolean isDefault)
             throws ConcurrentOperationException {
@@ -722,6 +714,8 @@
                             networkDetailsDao.persist(detailVO);
                         }
 
+                        updateRouterIpInNetworkDetails(networkPersisted.getId(), network.getRouterIp(), network.getRouterIpv6());
+
                         if (predefined instanceof NetworkVO && guru instanceof NetworkGuruAdditionalFunctions){
                             final NetworkGuruAdditionalFunctions functions = (NetworkGuruAdditionalFunctions) guru;
                             functions.finalizeNetworkDesign(networkPersisted.getId(), ((NetworkVO)predefined).getVlanIdAsUUID());
@@ -2314,7 +2308,7 @@
         // create network for private gateway
         return createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
                 bypassVlanOverlapCheck, null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null,
-                vpcId, null, null, true, null, null, null, true);
+                vpcId, null, null, true, null, null, null, true, null, null);
     }
 
     @Override
@@ -2322,18 +2316,18 @@
     public Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId,
                                       boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk,
                                       final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr,
-                                      final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
+                                      final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
         // create Isolated/Shared/L2 network
         return createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck,
                 networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr,
-                isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false);
+                isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false, routerIp, routerIpv6);
     }
 
     @DB
     private Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId,
                                        boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk,
                                        final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr,
-                                       final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, final Boolean isPrivateNetwork) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
+                                       final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, final Boolean isPrivateNetwork, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
 
         final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
         final DataCenterVO zone = _dcDao.findById(zoneId);
@@ -2594,6 +2588,14 @@
                     userNetwork.setExternalId(externalId);
                 }
 
+                if (isNotBlank(routerIp)) {
+                    userNetwork.setRouterIp(routerIp);
+                }
+
+                if (isNotBlank(routerIpv6)) {
+                    userNetwork.setRouterIpv6(routerIpv6);
+                }
+
                 if (vlanIdFinal != null) {
                     if (isolatedPvlan == null) {
                         URI uri = null;
@@ -2633,7 +2635,6 @@
 
                 final List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccessFinal, vpcId,
                         isDisplayNetworkEnabled);
-
                 Network network = null;
                 if (networks == null || networks.isEmpty()) {
                     throw new CloudRuntimeException("Fail to create a network");
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index e4cb893..e6260b8 100644
--- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.engine.orchestration;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -33,8 +35,6 @@
 import javax.naming.ConfigurationException;
 
 import com.cloud.agent.api.to.DatadiskTO;
-import com.cloud.storage.VolumeDetailVO;
-import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.utils.StringUtils;
 import com.cloud.vm.SecondaryStorageVmVO;
 import com.cloud.vm.UserVmDetailVO;
@@ -73,6 +73,8 @@
 import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.framework.jobs.AsyncJobManager;
 import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
+import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO;
+import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
 import org.apache.cloudstack.storage.command.CommandResult;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
@@ -80,6 +82,7 @@
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 
@@ -100,6 +103,7 @@
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientStorageCapacityException;
 import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.StorageAccessException;
 import com.cloud.exception.StorageUnavailableException;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
@@ -119,8 +123,10 @@
 import com.cloud.storage.Volume;
 import com.cloud.storage.Volume.Type;
 import com.cloud.storage.VolumeApiService;
+import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
 import com.cloud.template.TemplateManager;
@@ -152,7 +158,6 @@
 import com.cloud.vm.VmWorkTakeVolumeSnapshot;
 import com.cloud.vm.dao.UserVmCloneSettingDao;
 import com.cloud.vm.dao.UserVmDao;
-import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
 
 import static com.cloud.storage.resource.StorageProcessor.REQUEST_TEMPLATE_RELOAD;
 
@@ -183,6 +188,8 @@
     @Inject
     protected ResourceLimitService _resourceLimitMgr;
     @Inject
+    DiskOfferingDetailsDao _diskOfferingDetailDao;
+    @Inject
     VolumeDetailsDao _volDetailDao;
     @Inject
     DataStoreManager dataStoreMgr;
@@ -746,6 +753,19 @@
         vol.setFormat(getSupportedImageFormatForCluster(vm.getHypervisorType()));
         vol = _volsDao.persist(vol);
 
+        List<VolumeDetailVO> volumeDetailsVO = new ArrayList<VolumeDetailVO>();
+        DiskOfferingDetailVO bandwidthLimitDetail = _diskOfferingDetailDao.findDetail(offering.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS);
+        if (bandwidthLimitDetail != null) {
+            volumeDetailsVO.add(new VolumeDetailVO(vol.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS, bandwidthLimitDetail.getValue(), false));
+        }
+        DiskOfferingDetailVO iopsLimitDetail = _diskOfferingDetailDao.findDetail(offering.getId(), Volume.IOPS_LIMIT);
+        if (iopsLimitDetail != null) {
+            volumeDetailsVO.add(new VolumeDetailVO(vol.getId(), Volume.IOPS_LIMIT, iopsLimitDetail.getValue(), false));
+        }
+        if (!volumeDetailsVO.isEmpty()) {
+            _volDetailDao.saveDetails(volumeDetailsVO);
+        }
+
         // Save usage event and update resource count for user vm volumes
         if (vm.getType() == VirtualMachine.Type.User) {
             UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offering.getId(), null, size,
@@ -799,6 +819,19 @@
 
         vol = _volsDao.persist(vol);
 
+        List<VolumeDetailVO> volumeDetailsVO = new ArrayList<VolumeDetailVO>();
+        DiskOfferingDetailVO bandwidthLimitDetail = _diskOfferingDetailDao.findDetail(offering.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS);
+        if (bandwidthLimitDetail != null) {
+            volumeDetailsVO.add(new VolumeDetailVO(vol.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS, bandwidthLimitDetail.getValue(), false));
+        }
+        DiskOfferingDetailVO iopsLimitDetail = _diskOfferingDetailDao.findDetail(offering.getId(), Volume.IOPS_LIMIT);
+        if (iopsLimitDetail != null) {
+            volumeDetailsVO.add(new VolumeDetailVO(vol.getId(), Volume.IOPS_LIMIT, iopsLimitDetail.getValue(), false));
+        }
+        if (!volumeDetailsVO.isEmpty()) {
+            _volDetailDao.saveDetails(volumeDetailsVO);
+        }
+
         if (StringUtils.isNotBlank(configurationId)) {
             VolumeDetailVO deployConfigurationDetail = new VolumeDetailVO(vol.getId(), VmDetailConstants.DEPLOY_AS_IS_CONFIGURATION, configurationId, false);
             _volDetailDao.persist(deployConfigurationDetail);
@@ -1008,8 +1041,39 @@
     }
 
     @Override
-    public void release(VirtualMachineProfile profile) {
-        // add code here
+    public void release(VirtualMachineProfile vmProfile) {
+        Long hostId = vmProfile.getVirtualMachine().getHostId();
+        if (hostId != null) {
+            revokeAccess(vmProfile.getId(), hostId);
+        }
+    }
+
+    @Override
+    public void release(long vmId, long hostId) {
+        List<VolumeVO> volumesForVm = _volsDao.findUsableVolumesForInstance(vmId);
+        if (volumesForVm == null || volumesForVm.isEmpty()) {
+            return;
+        }
+
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Releasing " + volumesForVm.size() + " volumes for VM: " + vmId + " from host: " + hostId);
+        }
+
+        for (VolumeVO volumeForVm : volumesForVm) {
+            VolumeInfo volumeInfo = volFactory.getVolume(volumeForVm.getId());
+
+            // pool id can be null for the VM's volumes in Allocated state
+            if (volumeForVm.getPoolId() != null) {
+                DataStore dataStore = dataStoreMgr.getDataStore(volumeForVm.getPoolId(), DataStoreRole.Primary);
+                PrimaryDataStore primaryDataStore = (PrimaryDataStore)dataStore;
+                HostVO host = _hostDao.findById(hostId);
+
+                // This might impact other managed storages, grant access for PowerFlex storage pool only
+                if (primaryDataStore.isManaged() && primaryDataStore.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                    volService.revokeAccess(volumeInfo, host, dataStore);
+                }
+            }
+        }
     }
 
     @Override
@@ -1116,6 +1180,9 @@
             VolumeApiResult result = future.get();
             if (result.isFailed()) {
                 s_logger.error("Migrate volume failed:" + result.getResult());
+                if (result.getResult() != null && result.getResult().contains("[UNSUPPORTED]")) {
+                    throw new CloudRuntimeException("Migrate volume failed: " + result.getResult());
+                }
                 throw new StorageUnavailableException("Migrate volume failed: " + result.getResult(), destPool.getId());
             } else {
                 // update the volumeId for snapshots on secondary
@@ -1193,35 +1260,32 @@
     }
 
     @Override
-    public boolean storageMigration(VirtualMachineProfile vm, StoragePool destPool) throws StorageUnavailableException {
-        List<VolumeVO> vols = _volsDao.findUsableVolumesForInstance(vm.getId());
-        List<Volume> volumesNeedToMigrate = new ArrayList<Volume>();
-
-        for (VolumeVO volume : vols) {
+    public boolean storageMigration(VirtualMachineProfile vm, Map<Volume, StoragePool> volumeToPool) throws StorageUnavailableException {
+        Map<Volume, StoragePool> volumeStoragePoolMap = new HashMap<>();
+        for (Map.Entry<Volume, StoragePool> entry : volumeToPool.entrySet()) {
+            Volume volume = entry.getKey();
+            StoragePool pool = entry.getValue();
             if (volume.getState() != Volume.State.Ready) {
                 s_logger.debug("volume: " + volume.getId() + " is in " + volume.getState() + " state");
                 throw new CloudRuntimeException("volume: " + volume.getId() + " is in " + volume.getState() + " state");
             }
 
-            if (volume.getPoolId() == destPool.getId()) {
-                s_logger.debug("volume: " + volume.getId() + " is on the same storage pool: " + destPool.getId());
+            if (volume.getPoolId() == pool.getId()) {
+                s_logger.debug("volume: " + volume.getId() + " is on the same storage pool: " + pool.getId());
                 continue;
             }
-
-            volumesNeedToMigrate.add(volume);
+            volumeStoragePoolMap.put(volume, volumeToPool.get(volume));
         }
 
-        if (volumesNeedToMigrate.isEmpty()) {
+        if (MapUtils.isEmpty(volumeStoragePoolMap)) {
             s_logger.debug("No volume need to be migrated");
             return true;
         }
-
-        // OfflineVmwareMigration: in case we can (vmware?) don't itterate over volumes but tell the hypervisor to do the thing
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Offline vm migration was not done up the stack in VirtualMachineManager so trying here.");
         }
-        for (Volume vol : volumesNeedToMigrate) {
-            Volume result = migrateVolume(vol, destPool);
+        for (Map.Entry<Volume, StoragePool> entry : volumeStoragePoolMap.entrySet()) {
+            Volume result = migrateVolume(entry.getKey(), entry.getValue());
             if (result == null) {
                 return false;
             }
@@ -1244,6 +1308,12 @@
 
             disk.setDetails(getDetails(volumeInfo, dataStore));
 
+            PrimaryDataStore primaryDataStore = (PrimaryDataStore)dataStore;
+            // This might impact other managed storages, grant access for PowerFlex storage pool only
+            if (primaryDataStore.isManaged() && primaryDataStore.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                volService.grantAccess(volFactory.getVolume(vol.getId()), dest.getHost(), dataStore);
+            }
+
             vm.addDisk(disk);
         }
 
@@ -1270,6 +1340,7 @@
 
         VolumeVO volume = _volumeDao.findById(volumeInfo.getId());
         details.put(DiskTO.PROTOCOL_TYPE, (volume.getPoolType() != null) ? volume.getPoolType().toString() : null);
+        details.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(storagePool.getId())));
 
          if (volume.getPoolId() != null) {
             StoragePoolVO poolVO = _storagePoolDao.findById(volume.getPoolId());
@@ -1387,7 +1458,7 @@
         return tasks;
     }
 
-    private Pair<VolumeVO, DataStore> recreateVolume(VolumeVO vol, VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException {
+    private Pair<VolumeVO, DataStore> recreateVolume(VolumeVO vol, VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException, StorageAccessException {
         VolumeVO newVol;
         boolean recreate = RecreatableSystemVmEnabled.value();
         DataStore destPool = null;
@@ -1431,19 +1502,28 @@
                 future = volService.createVolumeAsync(volume, destPool);
             } else {
                 TemplateInfo templ = tmplFactory.getReadyTemplateOnImageStore(templateId, dest.getDataCenter().getId());
+                PrimaryDataStore primaryDataStore = (PrimaryDataStore)destPool;
 
                 if (templ == null) {
                     if (tmplFactory.isTemplateMarkedForDirectDownload(templateId)) {
                         // Template is marked for direct download bypassing Secondary Storage
-                        templ = tmplFactory.getReadyBypassedTemplateOnPrimaryStore(templateId, destPool.getId(), dest.getHost().getId());
+                        if (!primaryDataStore.isManaged()) {
+                            templ = tmplFactory.getReadyBypassedTemplateOnPrimaryStore(templateId, destPool.getId(), dest.getHost().getId());
+                        } else {
+                            s_logger.debug("Direct download template: " + templateId + " on host: " + dest.getHost().getId() + " and copy to the managed storage pool: " + destPool.getId());
+                            templ = volService.createManagedStorageTemplate(templateId, destPool.getId(), dest.getHost().getId());
+                        }
+
+                        if (templ == null) {
+                            s_logger.debug("Failed to spool direct download template: " + templateId + " for data center " + dest.getDataCenter().getId());
+                            throw new CloudRuntimeException("Failed to spool direct download template: " + templateId + " for data center " + dest.getDataCenter().getId());
+                        }
                     } else {
                         s_logger.debug("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId());
                         throw new CloudRuntimeException("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId());
                     }
                 }
 
-                PrimaryDataStore primaryDataStore = (PrimaryDataStore)destPool;
-
                 if (primaryDataStore.isManaged()) {
                     DiskOffering diskOffering = _entityMgr.findById(DiskOffering.class, volume.getDiskOfferingId());
                     HypervisorType hyperType = vm.getVirtualMachine().getHypervisorType();
@@ -1477,11 +1557,17 @@
                     long hostId = vm.getVirtualMachine().getHostId();
                     Host host = _hostDao.findById(hostId);
 
-                    volService.grantAccess(volFactory.getVolume(newVol.getId()), host, destPool);
+                    try {
+                        volService.grantAccess(volFactory.getVolume(newVol.getId()), host, destPool);
+                    } catch (Exception e) {
+                        throw new StorageAccessException("Unable to grant access to volume: " + newVol.getId() + " on host: " + host.getId());
+                    }
                 }
 
                 newVol = _volsDao.findById(newVol.getId());
                 break; //break out of template-redeploy retry loop
+            } catch (StorageAccessException e) {
+                throw e;
             } catch (InterruptedException | ExecutionException e) {
                 s_logger.error("Unable to create " + newVol, e);
                 throw new StorageUnavailableException("Unable to create " + newVol + ":" + e.toString(), destPool.getId());
@@ -1492,7 +1578,7 @@
     }
 
     @Override
-    public void prepare(VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException, InsufficientStorageCapacityException, ConcurrentOperationException {
+    public void prepare(VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException, InsufficientStorageCapacityException, ConcurrentOperationException, StorageAccessException {
 
         if (dest == null) {
             if (s_logger.isDebugEnabled()) {
@@ -1535,7 +1621,20 @@
                             volService.revokeAccess(volFactory.getVolume(vol.getId()), lastHost, storagePool);
                         }
 
-                        volService.grantAccess(volFactory.getVolume(vol.getId()), host, (DataStore)pool);
+                        try {
+                            volService.grantAccess(volFactory.getVolume(vol.getId()), host, (DataStore)pool);
+                        } catch (Exception e) {
+                            throw new StorageAccessException("Unable to grant access to volume: " + vol.getId() + " on host: " + host.getId());
+                        }
+                    } else {
+                        // This might impact other managed storages, grant access for PowerFlex storage pool only
+                        if (pool.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                            try {
+                                volService.grantAccess(volFactory.getVolume(vol.getId()), host, (DataStore)pool);
+                            } catch (Exception e) {
+                                throw new StorageAccessException("Unable to grant access to volume: " + vol.getId() + " on host: " + host.getId());
+                            }
+                        }
                     }
                 }
             } else if (task.type == VolumeTaskType.MIGRATE) {
@@ -1848,4 +1947,4 @@
             }
         });
     }
-}
\ No newline at end of file
+}
diff --git a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
index 1725a41..d2d5fc8 100644
--- a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
@@ -49,6 +49,7 @@
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.StopAnswer;
 import com.cloud.agent.api.StopCommand;
+import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.deploy.DeploymentPlan;
 import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
@@ -96,6 +97,8 @@
     private long hostMockId = 1L;
     @Mock
     private HostVO hostMock;
+    @Mock
+    private DataCenterDeployment dataCenterDeploymentMock;
 
     @Mock
     private VirtualMachineProfile virtualMachineProfileMock;
@@ -127,6 +130,7 @@
         when(vmInstanceMock.getHostId()).thenReturn(2L);
         when(vmInstanceMock.getType()).thenReturn(VirtualMachine.Type.User);
         when(hostMock.getId()).thenReturn(hostMockId);
+        when(dataCenterDeploymentMock.getHostId()).thenReturn(hostMockId);
 
         Mockito.doReturn(vmInstanceVoMockId).when(virtualMachineProfileMock).getId();
 
@@ -227,33 +231,30 @@
 
     @Test
     public void isStorageCrossClusterMigrationTestStorageTypeEqualsCluster() {
-        Mockito.doReturn(1L).when(hostMock).getClusterId();
         Mockito.doReturn(2L).when(storagePoolVoMock).getClusterId();
         Mockito.doReturn(ScopeType.CLUSTER).when(storagePoolVoMock).getScope();
 
-        boolean returnedValue = virtualMachineManagerImpl.isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
+        boolean returnedValue = virtualMachineManagerImpl.isStorageCrossClusterMigration(1L, storagePoolVoMock);
 
         Assert.assertTrue(returnedValue);
     }
 
     @Test
     public void isStorageCrossClusterMigrationTestStorageSameCluster() {
-        Mockito.doReturn(1L).when(hostMock).getClusterId();
         Mockito.doReturn(1L).when(storagePoolVoMock).getClusterId();
         Mockito.doReturn(ScopeType.CLUSTER).when(storagePoolVoMock).getScope();
 
-        boolean returnedValue = virtualMachineManagerImpl.isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
+        boolean returnedValue = virtualMachineManagerImpl.isStorageCrossClusterMigration(1L, storagePoolVoMock);
 
         assertFalse(returnedValue);
     }
 
     @Test
     public void isStorageCrossClusterMigrationTestStorageTypeEqualsZone() {
-        Mockito.doReturn(1L).when(hostMock).getClusterId();
         Mockito.doReturn(2L).when(storagePoolVoMock).getClusterId();
         Mockito.doReturn(ScopeType.ZONE).when(storagePoolVoMock).getScope();
 
-        boolean returnedValue = virtualMachineManagerImpl.isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
+        boolean returnedValue = virtualMachineManagerImpl.isStorageCrossClusterMigration(1L, storagePoolVoMock);
 
         assertFalse(returnedValue);
     }
@@ -384,7 +385,7 @@
         Mockito.doReturn(poolListMock).when(storagePoolAllocatorMock).allocateToPool(Mockito.any(DiskProfile.class), Mockito.any(VirtualMachineProfile.class), Mockito.any(DeploymentPlan.class),
                 Mockito.any(ExcludeList.class), Mockito.eq(StoragePoolAllocator.RETURN_UPTO_ALL));
 
-        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, hostMock, volumeVoMock);
+        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, dataCenterDeploymentMock, volumeVoMock);
 
         Assert.assertEquals(1, poolList.size());
         Assert.assertEquals(storagePoolVoMock, poolList.get(0));
@@ -402,8 +403,8 @@
         Mockito.doReturn(poolListMock).when(storagePoolAllocatorMock).allocateToPool(Mockito.any(DiskProfile.class), Mockito.any(VirtualMachineProfile.class), Mockito.any(DeploymentPlan.class),
                 Mockito.any(ExcludeList.class), Mockito.eq(StoragePoolAllocator.RETURN_UPTO_ALL));
 
-        Mockito.doReturn(true).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
-        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, hostMock, volumeVoMock);
+        Mockito.doReturn(true).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMockId, storagePoolVoMock);
+        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, dataCenterDeploymentMock, volumeVoMock);
 
         Assert.assertEquals(1, poolList.size());
         Assert.assertEquals(storagePoolVoMock, poolList.get(0));
@@ -421,8 +422,8 @@
         Mockito.doReturn(poolListMock).when(storagePoolAllocatorMock).allocateToPool(Mockito.any(DiskProfile.class), Mockito.any(VirtualMachineProfile.class), Mockito.any(DeploymentPlan.class),
                 Mockito.any(ExcludeList.class), Mockito.eq(StoragePoolAllocator.RETURN_UPTO_ALL));
 
-        Mockito.doReturn(false).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
-        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, hostMock, volumeVoMock);
+        Mockito.doReturn(false).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMockId, storagePoolVoMock);
+        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, dataCenterDeploymentMock, volumeVoMock);
 
         Assert.assertTrue(poolList.isEmpty());
     }
@@ -455,8 +456,8 @@
         Mockito.doReturn(new ArrayList<>()).when(storagePoolAllocatorMock3).allocateToPool(Mockito.any(DiskProfile.class), Mockito.any(VirtualMachineProfile.class), Mockito.any(DeploymentPlan.class),
                 Mockito.any(ExcludeList.class), Mockito.eq(StoragePoolAllocator.RETURN_UPTO_ALL));
 
-        Mockito.doReturn(false).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
-        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, hostMock, volumeVoMock);
+        Mockito.doReturn(false).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMockId, storagePoolVoMock);
+        List<StoragePool> poolList = virtualMachineManagerImpl.getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, dataCenterDeploymentMock, volumeVoMock);
 
         Assert.assertTrue(poolList.isEmpty());
 
@@ -470,9 +471,9 @@
 
     @Test(expected = CloudRuntimeException.class)
     public void createVolumeToStoragePoolMappingIfPossibleTestNotStoragePoolsAvailable() {
-        Mockito.doReturn(null).when(virtualMachineManagerImpl).getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, hostMock, volumeVoMock);
+        Mockito.doReturn(null).when(virtualMachineManagerImpl).getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, dataCenterDeploymentMock, volumeVoMock);
 
-        virtualMachineManagerImpl.createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, new HashMap<>(), volumeVoMock, storagePoolVoMock);
+        virtualMachineManagerImpl.createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, new HashMap<>(), volumeVoMock, storagePoolVoMock);
     }
 
     @Test
@@ -480,10 +481,10 @@
         List<StoragePool> storagePoolList = new ArrayList<>();
         storagePoolList.add(storagePoolVoMock);
 
-        Mockito.doReturn(storagePoolList).when(virtualMachineManagerImpl).getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, hostMock, volumeVoMock);
+        Mockito.doReturn(storagePoolList).when(virtualMachineManagerImpl).getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, dataCenterDeploymentMock, volumeVoMock);
 
         HashMap<Volume, StoragePool> volumeToPoolObjectMap = new HashMap<>();
-        virtualMachineManagerImpl.createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
+        virtualMachineManagerImpl.createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
 
         Assert.assertTrue(volumeToPoolObjectMap.isEmpty());
     }
@@ -498,10 +499,10 @@
         List<StoragePool> storagePoolList = new ArrayList<>();
         storagePoolList.add(storagePoolMockOther);
 
-        Mockito.doReturn(storagePoolList).when(virtualMachineManagerImpl).getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, hostMock, volumeVoMock);
+        Mockito.doReturn(storagePoolList).when(virtualMachineManagerImpl).getCandidateStoragePoolsToMigrateLocalVolume(virtualMachineProfileMock, dataCenterDeploymentMock, volumeVoMock);
 
         HashMap<Volume, StoragePool> volumeToPoolObjectMap = new HashMap<>();
-        virtualMachineManagerImpl.createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
+        virtualMachineManagerImpl.createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
 
         assertFalse(volumeToPoolObjectMap.isEmpty());
         Assert.assertEquals(storagePoolMockOther, volumeToPoolObjectMap.get(volumeVoMock));
@@ -516,14 +517,14 @@
 
         Mockito.doReturn(ScopeType.HOST).when(storagePoolVoMock).getScope();
         Mockito.doNothing().when(virtualMachineManagerImpl).executeManagedStorageChecksWhenTargetStoragePoolNotProvided(hostMock, storagePoolVoMock, volumeVoMock);
-        Mockito.doNothing().when(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock,
+        Mockito.doNothing().when(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock,
                 storagePoolVoMock);
 
-        virtualMachineManagerImpl.createStoragePoolMappingsForVolumes(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, allVolumes);
+        virtualMachineManagerImpl.createStoragePoolMappingsForVolumes(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, allVolumes);
 
         Assert.assertTrue(volumeToPoolObjectMap.isEmpty());
         Mockito.verify(virtualMachineManagerImpl).executeManagedStorageChecksWhenTargetStoragePoolNotProvided(hostMock, storagePoolVoMock, volumeVoMock);
-        Mockito.verify(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
+        Mockito.verify(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
     }
 
     @Test
@@ -535,15 +536,15 @@
 
         Mockito.doReturn(ScopeType.CLUSTER).when(storagePoolVoMock).getScope();
         Mockito.doNothing().when(virtualMachineManagerImpl).executeManagedStorageChecksWhenTargetStoragePoolNotProvided(hostMock, storagePoolVoMock, volumeVoMock);
-        Mockito.doNothing().when(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
-        Mockito.doReturn(true).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
+        Mockito.doNothing().when(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
+        Mockito.doReturn(true).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMockId, storagePoolVoMock);
 
-        virtualMachineManagerImpl.createStoragePoolMappingsForVolumes(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, allVolumes);
+        virtualMachineManagerImpl.createStoragePoolMappingsForVolumes(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, allVolumes);
 
         Assert.assertTrue(volumeToPoolObjectMap.isEmpty());
         Mockito.verify(virtualMachineManagerImpl).executeManagedStorageChecksWhenTargetStoragePoolNotProvided(hostMock, storagePoolVoMock, volumeVoMock);
-        Mockito.verify(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
-        Mockito.verify(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
+        Mockito.verify(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
+        Mockito.verify(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMockId, storagePoolVoMock);
     }
 
     @Test
@@ -555,17 +556,17 @@
 
         Mockito.doReturn(ScopeType.CLUSTER).when(storagePoolVoMock).getScope();
         Mockito.doNothing().when(virtualMachineManagerImpl).executeManagedStorageChecksWhenTargetStoragePoolNotProvided(hostMock, storagePoolVoMock, volumeVoMock);
-        Mockito.doNothing().when(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
-        Mockito.doReturn(false).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
+        Mockito.doNothing().when(virtualMachineManagerImpl).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock, storagePoolVoMock);
+        Mockito.doReturn(false).when(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMockId, storagePoolVoMock);
 
-        virtualMachineManagerImpl.createStoragePoolMappingsForVolumes(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, allVolumes);
+        virtualMachineManagerImpl.createStoragePoolMappingsForVolumes(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, allVolumes);
 
         assertFalse(volumeToPoolObjectMap.isEmpty());
         Assert.assertEquals(storagePoolVoMock, volumeToPoolObjectMap.get(volumeVoMock));
 
         Mockito.verify(virtualMachineManagerImpl).executeManagedStorageChecksWhenTargetStoragePoolNotProvided(hostMock, storagePoolVoMock, volumeVoMock);
-        Mockito.verify(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMock, storagePoolVoMock);
-        Mockito.verify(virtualMachineManagerImpl, Mockito.times(0)).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumeVoMock,
+        Mockito.verify(virtualMachineManagerImpl).isStorageCrossClusterMigration(hostMockId, storagePoolVoMock);
+        Mockito.verify(virtualMachineManagerImpl, Mockito.times(0)).createVolumeToStoragePoolMappingIfPossible(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumeVoMock,
                 storagePoolVoMock);
     }
 
@@ -578,7 +579,7 @@
                 Mockito.anyMapOf(Long.class, Long.class));
 
         Mockito.doReturn(volumesNotMapped).when(virtualMachineManagerImpl).findVolumesThatWereNotMappedByTheUser(virtualMachineProfileMock, volumeToPoolObjectMap);
-        Mockito.doNothing().when(virtualMachineManagerImpl).createStoragePoolMappingsForVolumes(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumesNotMapped);
+        Mockito.doNothing().when(virtualMachineManagerImpl).createStoragePoolMappingsForVolumes(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumesNotMapped);
 
         Map<Volume, StoragePool> mappingVolumeAndStoragePool = virtualMachineManagerImpl.createMappingVolumeAndStoragePool(virtualMachineProfileMock, hostMock, new HashMap<>());
 
@@ -587,7 +588,7 @@
         InOrder inOrder = Mockito.inOrder(virtualMachineManagerImpl);
         inOrder.verify(virtualMachineManagerImpl).buildMapUsingUserInformation(Mockito.eq(virtualMachineProfileMock), Mockito.eq(hostMock), Mockito.anyMapOf(Long.class, Long.class));
         inOrder.verify(virtualMachineManagerImpl).findVolumesThatWereNotMappedByTheUser(virtualMachineProfileMock, volumeToPoolObjectMap);
-        inOrder.verify(virtualMachineManagerImpl).createStoragePoolMappingsForVolumes(virtualMachineProfileMock, hostMock, volumeToPoolObjectMap, volumesNotMapped);
+        inOrder.verify(virtualMachineManagerImpl).createStoragePoolMappingsForVolumes(virtualMachineProfileMock, dataCenterDeploymentMock, volumeToPoolObjectMap, volumesNotMapped);
     }
 
     @Test
diff --git a/engine/pom.xml b/engine/pom.xml
index e81b09d..b4f64bc 100644
--- a/engine/pom.xml
+++ b/engine/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/engine/schema/pom.xml b/engine/schema/pom.xml
index da91749..f5daf7a 100644
--- a/engine/schema/pom.xml
+++ b/engine/schema/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/schema/src/main/java/com/cloud/domain/DomainVO.java b/engine/schema/src/main/java/com/cloud/domain/DomainVO.java
index 34376c7..05cd4cc 100644
--- a/engine/schema/src/main/java/com/cloud/domain/DomainVO.java
+++ b/engine/schema/src/main/java/com/cloud/domain/DomainVO.java
@@ -55,6 +55,9 @@
     @Column(name = "level")
     private int level;
 
+    @Column(name = GenericDao.CREATED_COLUMN)
+    private Date created;
+
     @Column(name = GenericDao.REMOVED_COLUMN)
     private Date removed;
 
@@ -144,6 +147,11 @@
     }
 
     @Override
+    public Date getCreated() {
+        return created;
+    }
+
+    @Override
     public Date getRemoved() {
         return removed;
     }
diff --git a/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java b/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java
index 83c32b1..45c8806 100644
--- a/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java
+++ b/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java
@@ -37,4 +37,6 @@
     Boolean isVmSnapshotEnabled(HypervisorType hypervisorType, String hypervisorVersion);
 
     List<HypervisorType> getHypervisorsWithDefaultEntries();
+
+    Boolean isStorageMotionSupported(HypervisorType hypervisorType, String hypervisorVersion);
 }
diff --git a/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java b/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java
index 5cecff2..09b3974 100644
--- a/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java
@@ -119,4 +119,21 @@
         }
         return hvs;
     }
+
+    @Override
+    public Boolean isStorageMotionSupported(HypervisorType hypervisorType, String hypervisorVersion) {
+        HypervisorCapabilitiesVO hostCapabilities = findByHypervisorTypeAndVersion(hypervisorType, hypervisorVersion);
+        if (hostCapabilities == null && HypervisorType.KVM.equals(hypervisorType)) {
+            List<HypervisorCapabilitiesVO> hypervisorCapabilitiesList = listAllByHypervisorType(HypervisorType.KVM);
+            if (hypervisorCapabilitiesList != null) {
+                for (HypervisorCapabilitiesVO hypervisorCapabilities : hypervisorCapabilitiesList) {
+                    if (hypervisorCapabilities.isStorageMotionSupported()) {
+                        hostCapabilities = hypervisorCapabilities;
+                        break;
+                    }
+                }
+            }
+        }
+        return hostCapabilities != null && hostCapabilities.isStorageMotionSupported();
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java b/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java
index 6d59167..790b484 100644
--- a/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java
@@ -176,6 +176,12 @@
     String externalId;
 
     @Transient
+    String routerIp;
+
+    @Transient
+    String routerIpv6;
+
+    @Transient
     transient String vlanIdAsUUID;
 
     @Transient
@@ -672,4 +678,20 @@
     public void setPvlanType(PVlanType pvlanType) {
         this.pVlanType = pvlanType;
     }
+
+    public String getRouterIp() {
+        return routerIp;
+    }
+
+    public void setRouterIp(String routerIp) {
+        this.routerIp = routerIp;
+    }
+
+    public String getRouterIpv6() {
+        return routerIpv6;
+    }
+
+    public void setRouterIpv6(String routerIpv6) {
+        this.routerIpv6 = routerIpv6;
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDao.java
index 8dd10a7..b099a6d 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDao.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDao.java
@@ -32,6 +32,8 @@
 
     List<StoragePoolHostVO> listByHostStatus(long poolId, Status hostStatus);
 
+    List<Long> findHostsConnectedToPools(List<Long> poolIds);
+
     List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly);
 
     public void deletePrimaryRecordsForHost(long hostId);
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
index 2b7b0f7..349baf0 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
@@ -21,6 +21,7 @@
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 import org.apache.log4j.Logger;
@@ -44,6 +45,8 @@
 
     protected static final String HOST_FOR_POOL_SEARCH = "SELECT * FROM storage_pool_host_ref ph,  host h where  ph.host_id = h.id and ph.pool_id=? and h.status=? ";
 
+    protected static final String HOSTS_FOR_POOLS_SEARCH = "SELECT DISTINCT(ph.host_id) FROM storage_pool_host_ref ph, host h WHERE ph.host_id = h.id AND h.status = 'Up' AND resource_state = 'Enabled' AND ph.pool_id IN (?)";
+
     protected static final String STORAGE_POOL_HOST_INFO = "SELECT p.data_center_id,  count(ph.host_id) " + " FROM storage_pool p, storage_pool_host_ref ph "
         + " WHERE p.id = ph.pool_id AND p.data_center_id = ? " + " GROUP by p.data_center_id";
 
@@ -122,6 +125,33 @@
     }
 
     @Override
+    public List<Long> findHostsConnectedToPools(List<Long> poolIds) {
+        List<Long> hosts = new ArrayList<Long>();
+        if (poolIds == null || poolIds.isEmpty()) {
+            return hosts;
+        }
+
+        String poolIdsInStr = poolIds.stream().map(poolId -> String.valueOf(poolId)).collect(Collectors.joining(",", "(", ")"));
+        String sql = HOSTS_FOR_POOLS_SEARCH.replace("(?)", poolIdsInStr);
+
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        try(PreparedStatement pstmt = txn.prepareStatement(sql);) {
+            try(ResultSet rs = pstmt.executeQuery();) {
+                while (rs.next()) {
+                    long hostId = rs.getLong(1); // host_id column
+                    hosts.add(hostId);
+                }
+            } catch (SQLException e) {
+                s_logger.warn("findHostsConnectedToPools:Exception: ", e);
+            }
+        } catch (Exception e) {
+            s_logger.warn("findHostsConnectedToPools:Exception: ", e);
+        }
+
+        return hosts;
+    }
+
+    @Override
     public List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly) {
         ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
         String sql = sharedOnly ? SHARED_STORAGE_POOL_HOST_INFO : STORAGE_POOL_HOST_INFO;
diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java
index 8c719a3..5a6055d 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java
@@ -71,6 +71,7 @@
 import com.cloud.upgrade.dao.Upgrade41310to41400;
 import com.cloud.upgrade.dao.Upgrade41400to41500;
 import com.cloud.upgrade.dao.Upgrade41500to41510;
+import com.cloud.upgrade.dao.Upgrade41510to41600;
 import com.cloud.upgrade.dao.Upgrade420to421;
 import com.cloud.upgrade.dao.Upgrade421to430;
 import com.cloud.upgrade.dao.Upgrade430to440;
@@ -197,6 +198,7 @@
                 .next("4.14.0.0", new Upgrade41400to41500())
                 .next("4.14.1.0", new Upgrade41400to41500())
                 .next("4.15.0.0", new Upgrade41500to41510())
+                .next("4.15.1.0", new Upgrade41510to41600())
                 .build();
     }
 
diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41500.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41500.java
index 0ee9bab..ba969ae 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41500.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41500.java
@@ -23,19 +23,15 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import org.apache.log4j.Logger;
 
-import com.cloud.hypervisor.Hypervisor;
 import com.cloud.utils.exception.CloudRuntimeException;
 
-public class Upgrade41400to41500 implements DbUpgrade, DbUpgradeSystemVmTemplate {
+public class Upgrade41400to41500 implements DbUpgrade {
 
     final static Logger LOG = Logger.getLogger(Upgrade41400to41500.class);
 
@@ -70,175 +66,6 @@
         addRolePermissionsForNewReadOnlyAndSupportRoles(conn);
     }
 
-    @Override
-    @SuppressWarnings("serial")
-    public void updateSystemVmTemplates(final Connection conn) {
-        LOG.debug("Updating System Vm template IDs");
-        final Set<Hypervisor.HypervisorType> hypervisorsListInUse = new HashSet<Hypervisor.HypervisorType>();
-        try (PreparedStatement pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null"); ResultSet rs = pstmt.executeQuery()) {
-            while (rs.next()) {
-                switch (Hypervisor.HypervisorType.getType(rs.getString(1))) {
-                    case XenServer:
-                        hypervisorsListInUse.add(Hypervisor.HypervisorType.XenServer);
-                        break;
-                    case KVM:
-                        hypervisorsListInUse.add(Hypervisor.HypervisorType.KVM);
-                        break;
-                    case VMware:
-                        hypervisorsListInUse.add(Hypervisor.HypervisorType.VMware);
-                        break;
-                    case Hyperv:
-                        hypervisorsListInUse.add(Hypervisor.HypervisorType.Hyperv);
-                        break;
-                    case LXC:
-                        hypervisorsListInUse.add(Hypervisor.HypervisorType.LXC);
-                        break;
-                    case Ovm3:
-                        hypervisorsListInUse.add(Hypervisor.HypervisorType.Ovm3);
-                        break;
-                    default:
-                        break;
-                }
-            }
-        } catch (final SQLException e) {
-            LOG.error("updateSystemVmTemplates: Exception caught while getting hypervisor types from clusters: " + e.getMessage());
-            throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting hypervisor types from clusters", e);
-        }
-
-        final Map<Hypervisor.HypervisorType, String> NewTemplateNameList = new HashMap<Hypervisor.HypervisorType, String>() {
-            {
-                put(Hypervisor.HypervisorType.KVM, "systemvm-kvm-4.15.0");
-                put(Hypervisor.HypervisorType.VMware, "systemvm-vmware-4.15.0");
-                put(Hypervisor.HypervisorType.XenServer, "systemvm-xenserver-4.15.0");
-                put(Hypervisor.HypervisorType.Hyperv, "systemvm-hyperv-4.15.0");
-                put(Hypervisor.HypervisorType.LXC, "systemvm-lxc-4.15.0");
-                put(Hypervisor.HypervisorType.Ovm3, "systemvm-ovm3-4.15.0");
-            }
-        };
-
-        final Map<Hypervisor.HypervisorType, String> routerTemplateConfigurationNames = new HashMap<Hypervisor.HypervisorType, String>() {
-            {
-                put(Hypervisor.HypervisorType.KVM, "router.template.kvm");
-                put(Hypervisor.HypervisorType.VMware, "router.template.vmware");
-                put(Hypervisor.HypervisorType.XenServer, "router.template.xenserver");
-                put(Hypervisor.HypervisorType.Hyperv, "router.template.hyperv");
-                put(Hypervisor.HypervisorType.LXC, "router.template.lxc");
-                put(Hypervisor.HypervisorType.Ovm3, "router.template.ovm3");
-            }
-        };
-
-        final Map<Hypervisor.HypervisorType, String> newTemplateUrl = new HashMap<Hypervisor.HypervisorType, String>() {
-            {
-                put(Hypervisor.HypervisorType.KVM, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.0-kvm.qcow2.bz2");
-                put(Hypervisor.HypervisorType.VMware, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.0-vmware.ova");
-                put(Hypervisor.HypervisorType.XenServer, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.0-xen.vhd.bz2");
-                put(Hypervisor.HypervisorType.Hyperv, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.0-hyperv.vhd.zip");
-                put(Hypervisor.HypervisorType.LXC, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.0-kvm.qcow2.bz2");
-                put(Hypervisor.HypervisorType.Ovm3, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.0-ovm.raw.bz2");
-            }
-        };
-
-        final Map<Hypervisor.HypervisorType, String> newTemplateChecksum = new HashMap<Hypervisor.HypervisorType, String>() {
-            {
-                put(Hypervisor.HypervisorType.KVM, "81b3e48bb934784a13555a43c5ef5ffb");
-                put(Hypervisor.HypervisorType.XenServer, "1b178a5dbdbe090555515340144c6017");
-                put(Hypervisor.HypervisorType.VMware, "e6a88e518c57d6f36c096c4204c3417f");
-                put(Hypervisor.HypervisorType.Hyperv, "5c94da45337cf3e1910dcbe084d4b9ad");
-                put(Hypervisor.HypervisorType.LXC, "81b3e48bb934784a13555a43c5ef5ffb");
-                put(Hypervisor.HypervisorType.Ovm3, "875c5c65455fc06c4a012394410db375");
-            }
-        };
-
-        for (final Map.Entry<Hypervisor.HypervisorType, String> hypervisorAndTemplateName : NewTemplateNameList.entrySet()) {
-            LOG.debug("Updating " + hypervisorAndTemplateName.getKey() + " System Vms");
-            try (PreparedStatement pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = ? and removed is null order by id desc limit 1")) {
-                // Get systemvm template id for corresponding hypervisor
-                long templateId = -1;
-                pstmt.setString(1, hypervisorAndTemplateName.getValue());
-                try (ResultSet rs = pstmt.executeQuery()) {
-                    if (rs.next()) {
-                        templateId = rs.getLong(1);
-                    }
-                } catch (final SQLException e) {
-                    LOG.error("updateSystemVmTemplates: Exception caught while getting ids of templates: " + e.getMessage());
-                    throw new CloudRuntimeException("updateSystemVmTemplates: Exception caught while getting ids of templates", e);
-                }
-
-                // change template type to SYSTEM
-                if (templateId != -1) {
-                    try (PreparedStatement templ_type_pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?");) {
-                        templ_type_pstmt.setLong(1, templateId);
-                        templ_type_pstmt.executeUpdate();
-                    } catch (final SQLException e) {
-                        LOG.error("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system': " + e.getMessage());
-                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system'", e);
-                    }
-                    // update template ID of system Vms
-                    try (PreparedStatement update_templ_id_pstmt = conn
-                            .prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = ? and removed is NULL");) {
-                        update_templ_id_pstmt.setLong(1, templateId);
-                        update_templ_id_pstmt.setString(2, hypervisorAndTemplateName.getKey().toString());
-                        update_templ_id_pstmt.executeUpdate();
-                    } catch (final Exception e) {
-                        LOG.error("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " + templateId
-                                + ": " + e.getMessage());
-                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to "
-                                + templateId, e);
-                    }
-
-                    // Change value of global configuration parameter
-                    // router.template.* for the corresponding hypervisor
-                    try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) {
-                        update_pstmt.setString(1, hypervisorAndTemplateName.getValue());
-                        update_pstmt.setString(2, routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()));
-                        update_pstmt.executeUpdate();
-                    } catch (final SQLException e) {
-                        LOG.error("updateSystemVmTemplates:Exception while setting " + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to "
-                                + hypervisorAndTemplateName.getValue() + ": " + e.getMessage());
-                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting "
-                                + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " + hypervisorAndTemplateName.getValue(), e);
-                    }
-
-                    // Change value of global configuration parameter
-                    // minreq.sysvmtemplate.version for the ACS version
-                    try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) {
-                        update_pstmt.setString(1, "4.15.0");
-                        update_pstmt.setString(2, "minreq.sysvmtemplate.version");
-                        update_pstmt.executeUpdate();
-                    } catch (final SQLException e) {
-                        LOG.error("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.15.0: " + e.getMessage());
-                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.15.0", e);
-                    }
-                } else {
-                    if (hypervisorsListInUse.contains(hypervisorAndTemplateName.getKey())) {
-                        throw new CloudRuntimeException(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. Cannot upgrade system Vms");
-                    } else {
-                        LOG.warn(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. " + hypervisorAndTemplateName.getKey()
-                                + " hypervisor is not used, so not failing upgrade");
-                        // Update the latest template URLs for corresponding
-                        // hypervisor
-                        try (PreparedStatement update_templ_url_pstmt = conn
-                                .prepareStatement("UPDATE `cloud`.`vm_template` SET url = ? , checksum = ? WHERE hypervisor_type = ? AND type = 'SYSTEM' AND removed is null order by id desc limit 1");) {
-                            update_templ_url_pstmt.setString(1, newTemplateUrl.get(hypervisorAndTemplateName.getKey()));
-                            update_templ_url_pstmt.setString(2, newTemplateChecksum.get(hypervisorAndTemplateName.getKey()));
-                            update_templ_url_pstmt.setString(3, hypervisorAndTemplateName.getKey().toString());
-                            update_templ_url_pstmt.executeUpdate();
-                        } catch (final SQLException e) {
-                            LOG.error("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type "
-                                    + hypervisorAndTemplateName.getKey().toString() + ": " + e.getMessage());
-                            throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type "
-                                    + hypervisorAndTemplateName.getKey().toString(), e);
-                        }
-                    }
-                }
-            } catch (final SQLException e) {
-                LOG.error("updateSystemVmTemplates:Exception while getting ids of templates: " + e.getMessage());
-                throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting ids of templates", e);
-            }
-        }
-        LOG.debug("Updating System Vm Template IDs Complete");
-    }
-
     private void addRolePermissionsForNewReadOnlyAndSupportRoles(final Connection conn) {
         addRolePermissionsForReadOnlyAdmin(conn);
         addRolePermissionsForReadOnlyUser(conn);
diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41510to41600.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41510to41600.java
new file mode 100644
index 0000000..358fa57
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41510to41600.java
@@ -0,0 +1,248 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.upgrade.dao;
+
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class Upgrade41510to41600 implements DbUpgrade, DbUpgradeSystemVmTemplate {
+
+    final static Logger LOG = Logger.getLogger(Upgrade41510to41600.class);
+
+    @Override
+    public String[] getUpgradableVersionRange() {
+        return new String[] {"4.15.1.0", "4.16.0.0"};
+    }
+
+    @Override
+    public String getUpgradedVersion() {
+        return "4.16.0.0";
+    }
+
+    @Override
+    public boolean supportsRollingUpgrade() {
+        return false;
+    }
+
+    @Override
+    public InputStream[] getPrepareScripts() {
+        final String scriptFile = "META-INF/db/schema-41510to41600.sql";
+        final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile);
+        if (script == null) {
+            throw new CloudRuntimeException("Unable to find " + scriptFile);
+        }
+
+        return new InputStream[] {script};
+    }
+
+    @Override
+    public void performDataMigration(Connection conn) {
+    }
+
+    @Override
+    @SuppressWarnings("serial")
+    public void updateSystemVmTemplates(final Connection conn) {
+        LOG.debug("Updating System Vm template IDs");
+        final Set<Hypervisor.HypervisorType> hypervisorsListInUse = new HashSet<Hypervisor.HypervisorType>();
+        try (PreparedStatement pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null"); ResultSet rs = pstmt.executeQuery()) {
+            while (rs.next()) {
+                switch (Hypervisor.HypervisorType.getType(rs.getString(1))) {
+                    case XenServer:
+                        hypervisorsListInUse.add(Hypervisor.HypervisorType.XenServer);
+                        break;
+                    case KVM:
+                        hypervisorsListInUse.add(Hypervisor.HypervisorType.KVM);
+                        break;
+                    case VMware:
+                        hypervisorsListInUse.add(Hypervisor.HypervisorType.VMware);
+                        break;
+                    case Hyperv:
+                        hypervisorsListInUse.add(Hypervisor.HypervisorType.Hyperv);
+                        break;
+                    case LXC:
+                        hypervisorsListInUse.add(Hypervisor.HypervisorType.LXC);
+                        break;
+                    case Ovm3:
+                        hypervisorsListInUse.add(Hypervisor.HypervisorType.Ovm3);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        } catch (final SQLException e) {
+            LOG.error("updateSystemVmTemplates: Exception caught while getting hypervisor types from clusters: " + e.getMessage());
+            throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting hypervisor types from clusters", e);
+        }
+
+        final Map<Hypervisor.HypervisorType, String> NewTemplateNameList = new HashMap<Hypervisor.HypervisorType, String>() {
+            {
+                put(Hypervisor.HypervisorType.KVM, "systemvm-kvm-4.16.0");
+                put(Hypervisor.HypervisorType.VMware, "systemvm-vmware-4.16.0");
+                put(Hypervisor.HypervisorType.XenServer, "systemvm-xenserver-4.16.0");
+                put(Hypervisor.HypervisorType.Hyperv, "systemvm-hyperv-4.16.0");
+                put(Hypervisor.HypervisorType.LXC, "systemvm-lxc-4.16.0");
+                put(Hypervisor.HypervisorType.Ovm3, "systemvm-ovm3-4.16.0");
+            }
+        };
+
+        final Map<Hypervisor.HypervisorType, String> routerTemplateConfigurationNames = new HashMap<Hypervisor.HypervisorType, String>() {
+            {
+                put(Hypervisor.HypervisorType.KVM, "router.template.kvm");
+                put(Hypervisor.HypervisorType.VMware, "router.template.vmware");
+                put(Hypervisor.HypervisorType.XenServer, "router.template.xenserver");
+                put(Hypervisor.HypervisorType.Hyperv, "router.template.hyperv");
+                put(Hypervisor.HypervisorType.LXC, "router.template.lxc");
+                put(Hypervisor.HypervisorType.Ovm3, "router.template.ovm3");
+            }
+        };
+
+        final Map<Hypervisor.HypervisorType, String> newTemplateUrl = new HashMap<Hypervisor.HypervisorType, String>() {
+            {
+                put(Hypervisor.HypervisorType.KVM, "https://download.cloudstack.org/systemvm/4.16/systemvmtemplate-4.16.0-kvm.qcow2.bz2");
+                put(Hypervisor.HypervisorType.VMware, "https://download.cloudstack.org/systemvm/4.16/systemvmtemplate-4.16.0-vmware.ova");
+                put(Hypervisor.HypervisorType.XenServer, "https://download.cloudstack.org/systemvm/4.16/systemvmtemplate-4.16.0-xen.vhd.bz2");
+                put(Hypervisor.HypervisorType.Hyperv, "https://download.cloudstack.org/systemvm/4.16/systemvmtemplate-4.16.0-hyperv.vhd.zip");
+                put(Hypervisor.HypervisorType.LXC, "https://download.cloudstack.org/systemvm/4.16/systemvmtemplate-4.16.0-kvm.qcow2.bz2");
+                put(Hypervisor.HypervisorType.Ovm3, "https://download.cloudstack.org/systemvm/4.16/systemvmtemplate-4.16.0-ovm.raw.bz2");
+            }
+        };
+
+        final Map<Hypervisor.HypervisorType, String> newTemplateChecksum = new HashMap<Hypervisor.HypervisorType, String>() {
+            {
+                put(Hypervisor.HypervisorType.KVM, "81b3e48bb934784a13555a43c5ef5ffb");
+                put(Hypervisor.HypervisorType.XenServer, "1b178a5dbdbe090555515340144c6017");
+                put(Hypervisor.HypervisorType.VMware, "e6a88e518c57d6f36c096c4204c3417f");
+                put(Hypervisor.HypervisorType.Hyperv, "5c94da45337cf3e1910dcbe084d4b9ad");
+                put(Hypervisor.HypervisorType.LXC, "81b3e48bb934784a13555a43c5ef5ffb");
+                put(Hypervisor.HypervisorType.Ovm3, "875c5c65455fc06c4a012394410db375");
+            }
+        };
+
+        for (final Map.Entry<Hypervisor.HypervisorType, String> hypervisorAndTemplateName : NewTemplateNameList.entrySet()) {
+            LOG.debug("Updating " + hypervisorAndTemplateName.getKey() + " System Vms");
+            try (PreparedStatement pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = ? and removed is null order by id desc limit 1")) {
+                // Get systemvm template id for corresponding hypervisor
+                long templateId = -1;
+                pstmt.setString(1, hypervisorAndTemplateName.getValue());
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    if (rs.next()) {
+                        templateId = rs.getLong(1);
+                    }
+                } catch (final SQLException e) {
+                    LOG.error("updateSystemVmTemplates: Exception caught while getting ids of templates: " + e.getMessage());
+                    throw new CloudRuntimeException("updateSystemVmTemplates: Exception caught while getting ids of templates", e);
+                }
+
+                // change template type to SYSTEM
+                if (templateId != -1) {
+                    try (PreparedStatement templ_type_pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?");) {
+                        templ_type_pstmt.setLong(1, templateId);
+                        templ_type_pstmt.executeUpdate();
+                    } catch (final SQLException e) {
+                        LOG.error("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system': " + e.getMessage());
+                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system'", e);
+                    }
+                    // update template ID of system Vms
+                    try (PreparedStatement update_templ_id_pstmt = conn
+                            .prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = ? and removed is NULL");) {
+                        update_templ_id_pstmt.setLong(1, templateId);
+                        update_templ_id_pstmt.setString(2, hypervisorAndTemplateName.getKey().toString());
+                        update_templ_id_pstmt.executeUpdate();
+                    } catch (final Exception e) {
+                        LOG.error("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " + templateId
+                                + ": " + e.getMessage());
+                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to "
+                                + templateId, e);
+                    }
+
+                    // Change value of global configuration parameter
+                    // router.template.* for the corresponding hypervisor
+                    try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) {
+                        update_pstmt.setString(1, hypervisorAndTemplateName.getValue());
+                        update_pstmt.setString(2, routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()));
+                        update_pstmt.executeUpdate();
+                    } catch (final SQLException e) {
+                        LOG.error("updateSystemVmTemplates:Exception while setting " + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to "
+                                + hypervisorAndTemplateName.getValue() + ": " + e.getMessage());
+                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting "
+                                + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " + hypervisorAndTemplateName.getValue(), e);
+                    }
+
+                    // Change value of global configuration parameter
+                    // minreq.sysvmtemplate.version for the ACS version
+                    try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) {
+                        update_pstmt.setString(1, "4.16.0");
+                        update_pstmt.setString(2, "minreq.sysvmtemplate.version");
+                        update_pstmt.executeUpdate();
+                    } catch (final SQLException e) {
+                        LOG.error("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.16.0: " + e.getMessage());
+                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.16.0", e);
+                    }
+                } else {
+                    if (hypervisorsListInUse.contains(hypervisorAndTemplateName.getKey())) {
+                        throw new CloudRuntimeException(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. Cannot upgrade system Vms");
+                    } else {
+                        LOG.warn(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. " + hypervisorAndTemplateName.getKey()
+                                + " hypervisor is not used, so not failing upgrade");
+                        // Update the latest template URLs for corresponding
+                        // hypervisor
+                        try (PreparedStatement update_templ_url_pstmt = conn
+                                .prepareStatement("UPDATE `cloud`.`vm_template` SET url = ? , checksum = ? WHERE hypervisor_type = ? AND type = 'SYSTEM' AND removed is null order by id desc limit 1");) {
+                            update_templ_url_pstmt.setString(1, newTemplateUrl.get(hypervisorAndTemplateName.getKey()));
+                            update_templ_url_pstmt.setString(2, newTemplateChecksum.get(hypervisorAndTemplateName.getKey()));
+                            update_templ_url_pstmt.setString(3, hypervisorAndTemplateName.getKey().toString());
+                            update_templ_url_pstmt.executeUpdate();
+                        } catch (final SQLException e) {
+                            LOG.error("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type "
+                                    + hypervisorAndTemplateName.getKey().toString() + ": " + e.getMessage());
+                            throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type "
+                                    + hypervisorAndTemplateName.getKey().toString(), e);
+                        }
+                    }
+                }
+            } catch (final SQLException e) {
+                LOG.error("updateSystemVmTemplates:Exception while getting ids of templates: " + e.getMessage());
+                throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting ids of templates", e);
+            }
+        }
+        LOG.debug("Updating System Vm Template IDs Complete");
+    }
+
+    @Override
+    public InputStream[] getCleanupScripts() {
+        final String scriptFile = "META-INF/db/schema-41510to41600-cleanup.sql";
+        final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile);
+        if (script == null) {
+            throw new CloudRuntimeException("Unable to find " + scriptFile);
+        }
+
+        return new InputStream[] {script};
+    }
+}
diff --git a/engine/schema/src/main/java/com/cloud/user/AccountVO.java b/engine/schema/src/main/java/com/cloud/user/AccountVO.java
index a504d2f..9834989 100644
--- a/engine/schema/src/main/java/com/cloud/user/AccountVO.java
+++ b/engine/schema/src/main/java/com/cloud/user/AccountVO.java
@@ -54,6 +54,9 @@
     @Enumerated(value = EnumType.STRING)
     private State state;
 
+    @Column(name = GenericDao.CREATED_COLUMN)
+    private Date created;
+
     @Column(name = GenericDao.REMOVED_COLUMN)
     private Date removed;
 
@@ -169,6 +172,11 @@
     }
 
     @Override
+    public Date getCreated() {
+        return created;
+    }
+
+    @Override
     public Date getRemoved() {
         return removed;
     }
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600-cleanup.sql
new file mode 100644
index 0000000..bbba515
--- /dev/null
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600-cleanup.sql
@@ -0,0 +1,21 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+--;
+-- Schema upgrade cleanup from 4.15.1.0 to 4.16.0.0
+--;
+
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql
new file mode 100644
index 0000000..7168f88
--- /dev/null
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql
@@ -0,0 +1,303 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+--;
+-- Schema upgrade from 4.15.1.0 to 4.16.0.0
+--;
+
+
+--;
+-- Stored procedure to do idempotent column add;
+-- This is copied from schema-41000to41100.sql
+--;
+DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_ADD_COLUMN`;
+
+CREATE PROCEDURE `cloud`.`IDEMPOTENT_ADD_COLUMN` (
+    IN in_table_name VARCHAR(200),
+    IN in_column_name VARCHAR(200),
+    IN in_column_definition VARCHAR(1000)
+)
+BEGIN
+
+    DECLARE CONTINUE HANDLER FOR 1060 BEGIN END; SET @ddl = CONCAT('ALTER TABLE ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', 'ADD COLUMN') ; SET @ddl = CONCAT(@ddl, ' ', in_column_name); SET @ddl = CONCAT(@ddl, ' ', in_column_definition); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END;
+
+CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.account','created', 'datetime DEFAULT NULL COMMENT ''date created'' AFTER `state` ');
+CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.domain','created', 'datetime DEFAULT NULL COMMENT ''date created'' AFTER `next_child_seq` ');
+CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud_usage.account','created', 'datetime DEFAULT NULL COMMENT ''date created'' AFTER `state` ');
+
+DROP VIEW IF EXISTS `cloud`.`account_view`;
+CREATE VIEW `cloud`.`account_view` AS
+select
+    `account`.`id` AS `id`,
+    `account`.`uuid` AS `uuid`,
+    `account`.`account_name` AS `account_name`,
+    `account`.`type` AS `type`,
+    `account`.`role_id` AS `role_id`,
+    `account`.`state` AS `state`,
+    `account`.`created` AS `created`,
+    `account`.`removed` AS `removed`,
+    `account`.`cleanup_needed` AS `cleanup_needed`,
+    `account`.`network_domain` AS `network_domain` ,
+    `account`.`default` AS `default`,
+    `domain`.`id` AS `domain_id`,
+    `domain`.`uuid` AS `domain_uuid`,
+    `domain`.`name` AS `domain_name`,
+    `domain`.`path` AS `domain_path`,
+    `data_center`.`id` AS `data_center_id`,
+    `data_center`.`uuid` AS `data_center_uuid`,
+    `data_center`.`name` AS `data_center_name`,
+    `account_netstats_view`.`bytesReceived` AS `bytesReceived`,
+    `account_netstats_view`.`bytesSent` AS `bytesSent`,
+    `vmlimit`.`max` AS `vmLimit`,
+    `vmcount`.`count` AS `vmTotal`,
+    `runningvm`.`vmcount` AS `runningVms`,
+    `stoppedvm`.`vmcount` AS `stoppedVms`,
+    `iplimit`.`max` AS `ipLimit`,
+    `ipcount`.`count` AS `ipTotal`,
+    `free_ip_view`.`free_ip` AS `ipFree`,
+    `volumelimit`.`max` AS `volumeLimit`,
+    `volumecount`.`count` AS `volumeTotal`,
+    `snapshotlimit`.`max` AS `snapshotLimit`,
+    `snapshotcount`.`count` AS `snapshotTotal`,
+    `templatelimit`.`max` AS `templateLimit`,
+    `templatecount`.`count` AS `templateTotal`,
+    `vpclimit`.`max` AS `vpcLimit`,
+    `vpccount`.`count` AS `vpcTotal`,
+    `projectlimit`.`max` AS `projectLimit`,
+    `projectcount`.`count` AS `projectTotal`,
+    `networklimit`.`max` AS `networkLimit`,
+    `networkcount`.`count` AS `networkTotal`,
+    `cpulimit`.`max` AS `cpuLimit`,
+    `cpucount`.`count` AS `cpuTotal`,
+    `memorylimit`.`max` AS `memoryLimit`,
+    `memorycount`.`count` AS `memoryTotal`,
+    `primary_storage_limit`.`max` AS `primaryStorageLimit`,
+    `primary_storage_count`.`count` AS `primaryStorageTotal`,
+    `secondary_storage_limit`.`max` AS `secondaryStorageLimit`,
+    `secondary_storage_count`.`count` AS `secondaryStorageTotal`,
+    `async_job`.`id` AS `job_id`,
+    `async_job`.`uuid` AS `job_uuid`,
+    `async_job`.`job_status` AS `job_status`,
+    `async_job`.`account_id` AS `job_account_id`
+from
+    `cloud`.`free_ip_view`,
+    `cloud`.`account`
+        inner join
+    `cloud`.`domain` ON account.domain_id = domain.id
+        left join
+    `cloud`.`data_center` ON account.default_zone_id = data_center.id
+        left join
+    `cloud`.`account_netstats_view` ON account.id = account_netstats_view.account_id
+        left join
+    `cloud`.`resource_limit` vmlimit ON account.id = vmlimit.account_id
+        and vmlimit.type = 'user_vm'
+        left join
+    `cloud`.`resource_count` vmcount ON account.id = vmcount.account_id
+        and vmcount.type = 'user_vm'
+        left join
+    `cloud`.`account_vmstats_view` runningvm ON account.id = runningvm.account_id
+        and runningvm.state = 'Running'
+        left join
+    `cloud`.`account_vmstats_view` stoppedvm ON account.id = stoppedvm.account_id
+        and stoppedvm.state = 'Stopped'
+        left join
+    `cloud`.`resource_limit` iplimit ON account.id = iplimit.account_id
+        and iplimit.type = 'public_ip'
+        left join
+    `cloud`.`resource_count` ipcount ON account.id = ipcount.account_id
+        and ipcount.type = 'public_ip'
+        left join
+    `cloud`.`resource_limit` volumelimit ON account.id = volumelimit.account_id
+        and volumelimit.type = 'volume'
+        left join
+    `cloud`.`resource_count` volumecount ON account.id = volumecount.account_id
+        and volumecount.type = 'volume'
+        left join
+    `cloud`.`resource_limit` snapshotlimit ON account.id = snapshotlimit.account_id
+        and snapshotlimit.type = 'snapshot'
+        left join
+    `cloud`.`resource_count` snapshotcount ON account.id = snapshotcount.account_id
+        and snapshotcount.type = 'snapshot'
+        left join
+    `cloud`.`resource_limit` templatelimit ON account.id = templatelimit.account_id
+        and templatelimit.type = 'template'
+        left join
+    `cloud`.`resource_count` templatecount ON account.id = templatecount.account_id
+        and templatecount.type = 'template'
+        left join
+    `cloud`.`resource_limit` vpclimit ON account.id = vpclimit.account_id
+        and vpclimit.type = 'vpc'
+        left join
+    `cloud`.`resource_count` vpccount ON account.id = vpccount.account_id
+        and vpccount.type = 'vpc'
+        left join
+    `cloud`.`resource_limit` projectlimit ON account.id = projectlimit.account_id
+        and projectlimit.type = 'project'
+        left join
+    `cloud`.`resource_count` projectcount ON account.id = projectcount.account_id
+        and projectcount.type = 'project'
+        left join
+    `cloud`.`resource_limit` networklimit ON account.id = networklimit.account_id
+        and networklimit.type = 'network'
+        left join
+    `cloud`.`resource_count` networkcount ON account.id = networkcount.account_id
+        and networkcount.type = 'network'
+        left join
+    `cloud`.`resource_limit` cpulimit ON account.id = cpulimit.account_id
+        and cpulimit.type = 'cpu'
+        left join
+    `cloud`.`resource_count` cpucount ON account.id = cpucount.account_id
+        and cpucount.type = 'cpu'
+        left join
+    `cloud`.`resource_limit` memorylimit ON account.id = memorylimit.account_id
+        and memorylimit.type = 'memory'
+        left join
+    `cloud`.`resource_count` memorycount ON account.id = memorycount.account_id
+        and memorycount.type = 'memory'
+        left join
+    `cloud`.`resource_limit` primary_storage_limit ON account.id = primary_storage_limit.account_id
+        and primary_storage_limit.type = 'primary_storage'
+        left join
+    `cloud`.`resource_count` primary_storage_count ON account.id = primary_storage_count.account_id
+        and primary_storage_count.type = 'primary_storage'
+        left join
+    `cloud`.`resource_limit` secondary_storage_limit ON account.id = secondary_storage_limit.account_id
+        and secondary_storage_limit.type = 'secondary_storage'
+        left join
+    `cloud`.`resource_count` secondary_storage_count ON account.id = secondary_storage_count.account_id
+        and secondary_storage_count.type = 'secondary_storage'
+        left join
+    `cloud`.`async_job` ON async_job.instance_id = account.id
+        and async_job.instance_type = 'Account'
+        and async_job.job_status = 0;
+
+
+DROP VIEW IF EXISTS `cloud`.`domain_view`;
+CREATE VIEW `cloud`.`domain_view` AS
+select
+    `domain`.`id` AS `id`,
+    `domain`.`parent` AS `parent`,
+    `domain`.`name` AS `name`,
+    `domain`.`uuid` AS `uuid`,
+    `domain`.`owner` AS `owner`,
+    `domain`.`path` AS `path`,
+    `domain`.`level` AS `level`,
+    `domain`.`child_count` AS `child_count`,
+    `domain`.`next_child_seq` AS `next_child_seq`,
+    `domain`.`created` AS `created`,
+    `domain`.`removed` AS `removed`,
+    `domain`.`state` AS `state`,
+    `domain`.`network_domain` AS `network_domain`,
+    `domain`.`type` AS `type`,
+    `vmlimit`.`max` AS `vmLimit`,
+    `vmcount`.`count` AS `vmTotal`,
+    `iplimit`.`max` AS `ipLimit`,
+    `ipcount`.`count` AS `ipTotal`,
+    `volumelimit`.`max` AS `volumeLimit`,
+    `volumecount`.`count` AS `volumeTotal`,
+    `snapshotlimit`.`max` AS `snapshotLimit`,
+    `snapshotcount`.`count` AS `snapshotTotal`,
+    `templatelimit`.`max` AS `templateLimit`,
+    `templatecount`.`count` AS `templateTotal`,
+    `vpclimit`.`max` AS `vpcLimit`,
+    `vpccount`.`count` AS `vpcTotal`,
+    `projectlimit`.`max` AS `projectLimit`,
+    `projectcount`.`count` AS `projectTotal`,
+    `networklimit`.`max` AS `networkLimit`,
+    `networkcount`.`count` AS `networkTotal`,
+    `cpulimit`.`max` AS `cpuLimit`,
+    `cpucount`.`count` AS `cpuTotal`,
+    `memorylimit`.`max` AS `memoryLimit`,
+    `memorycount`.`count` AS `memoryTotal`,
+    `primary_storage_limit`.`max` AS `primaryStorageLimit`,
+    `primary_storage_count`.`count` AS `primaryStorageTotal`,
+    `secondary_storage_limit`.`max` AS `secondaryStorageLimit`,
+    `secondary_storage_count`.`count` AS `secondaryStorageTotal`
+from
+    `cloud`.`domain`
+        left join
+    `cloud`.`resource_limit` vmlimit ON domain.id = vmlimit.domain_id
+        and vmlimit.type = 'user_vm'
+        left join
+    `cloud`.`resource_count` vmcount ON domain.id = vmcount.domain_id
+        and vmcount.type = 'user_vm'
+        left join
+    `cloud`.`resource_limit` iplimit ON domain.id = iplimit.domain_id
+        and iplimit.type = 'public_ip'
+        left join
+    `cloud`.`resource_count` ipcount ON domain.id = ipcount.domain_id
+        and ipcount.type = 'public_ip'
+        left join
+    `cloud`.`resource_limit` volumelimit ON domain.id = volumelimit.domain_id
+        and volumelimit.type = 'volume'
+        left join
+    `cloud`.`resource_count` volumecount ON domain.id = volumecount.domain_id
+        and volumecount.type = 'volume'
+        left join
+    `cloud`.`resource_limit` snapshotlimit ON domain.id = snapshotlimit.domain_id
+        and snapshotlimit.type = 'snapshot'
+        left join
+    `cloud`.`resource_count` snapshotcount ON domain.id = snapshotcount.domain_id
+        and snapshotcount.type = 'snapshot'
+        left join
+    `cloud`.`resource_limit` templatelimit ON domain.id = templatelimit.domain_id
+        and templatelimit.type = 'template'
+        left join
+    `cloud`.`resource_count` templatecount ON domain.id = templatecount.domain_id
+        and templatecount.type = 'template'
+        left join
+    `cloud`.`resource_limit` vpclimit ON domain.id = vpclimit.domain_id
+        and vpclimit.type = 'vpc'
+        left join
+    `cloud`.`resource_count` vpccount ON domain.id = vpccount.domain_id
+        and vpccount.type = 'vpc'
+        left join
+    `cloud`.`resource_limit` projectlimit ON domain.id = projectlimit.domain_id
+        and projectlimit.type = 'project'
+        left join
+    `cloud`.`resource_count` projectcount ON domain.id = projectcount.domain_id
+        and projectcount.type = 'project'
+        left join
+    `cloud`.`resource_limit` networklimit ON domain.id = networklimit.domain_id
+        and networklimit.type = 'network'
+        left join
+    `cloud`.`resource_count` networkcount ON domain.id = networkcount.domain_id
+        and networkcount.type = 'network'
+        left join
+    `cloud`.`resource_limit` cpulimit ON domain.id = cpulimit.domain_id
+        and cpulimit.type = 'cpu'
+        left join
+    `cloud`.`resource_count` cpucount ON domain.id = cpucount.domain_id
+        and cpucount.type = 'cpu'
+        left join
+    `cloud`.`resource_limit` memorylimit ON domain.id = memorylimit.domain_id
+        and memorylimit.type = 'memory'
+        left join
+    `cloud`.`resource_count` memorycount ON domain.id = memorycount.domain_id
+        and memorycount.type = 'memory'
+        left join
+    `cloud`.`resource_limit` primary_storage_limit ON domain.id = primary_storage_limit.domain_id
+        and primary_storage_limit.type = 'primary_storage'
+        left join
+    `cloud`.`resource_count` primary_storage_count ON domain.id = primary_storage_count.domain_id
+        and primary_storage_count.type = 'primary_storage'
+        left join
+    `cloud`.`resource_limit` secondary_storage_limit ON domain.id = secondary_storage_limit.domain_id
+        and secondary_storage_limit.type = 'secondary_storage'
+        left join
+    `cloud`.`resource_count` secondary_storage_count ON domain.id = secondary_storage_count.domain_id
+        and secondary_storage_count.type = 'secondary_storage';
diff --git a/engine/service/pom.xml b/engine/service/pom.xml
index 7c7ecaa..f226bf1 100644
--- a/engine/service/pom.xml
+++ b/engine/service/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <artifactId>cloud-engine-service</artifactId>
     <packaging>war</packaging>
diff --git a/engine/storage/cache/pom.xml b/engine/storage/cache/pom.xml
index 1f3f5f6..b8aa889 100644
--- a/engine/storage/cache/pom.xml
+++ b/engine/storage/cache/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/configdrive/pom.xml b/engine/storage/configdrive/pom.xml
index 9570adc..abfcfae 100644
--- a/engine/storage/configdrive/pom.xml
+++ b/engine/storage/configdrive/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/datamotion/pom.xml b/engine/storage/datamotion/pom.xml
index db4e53d..c3a60ca 100644
--- a/engine/storage/datamotion/pom.xml
+++ b/engine/storage/datamotion/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java
index ac6c855..71c1dce 100644
--- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java
+++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java
@@ -61,10 +61,10 @@
         }
 
         if (srcData.getDataStore().getDriver().canCopy(srcData, destData)) {
-            srcData.getDataStore().getDriver().copyAsync(srcData, destData, callback);
+            srcData.getDataStore().getDriver().copyAsync(srcData, destData, destHost, callback);
             return;
         } else if (destData.getDataStore().getDriver().canCopy(srcData, destData)) {
-            destData.getDataStore().getDriver().copyAsync(srcData, destData, callback);
+            destData.getDataStore().getDriver().copyAsync(srcData, destData, destHost, callback);
             return;
         }
 
diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageDataMotionStrategy.java
index 9718596..bf8761e 100644
--- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageDataMotionStrategy.java
@@ -53,6 +53,7 @@
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -195,6 +196,10 @@
     @Override
     protected void copyTemplateToTargetFilesystemStorageIfNeeded(VolumeInfo srcVolumeInfo, StoragePool srcStoragePool, DataStore destDataStore, StoragePool destStoragePool,
             Host destHost) {
+        if (srcVolumeInfo.getVolumeType() != Volume.Type.ROOT || srcVolumeInfo.getTemplateId() == null) {
+            return;
+        }
+
         VMTemplateStoragePoolVO sourceVolumeTemplateStoragePoolVO = vmTemplatePoolDao.findByPoolTemplate(destStoragePool.getId(), srcVolumeInfo.getTemplateId(), null);
         if (sourceVolumeTemplateStoragePoolVO == null && destStoragePool.getPoolType() == StoragePoolType.Filesystem) {
             DataStore sourceTemplateDataStore = dataStoreManagerImpl.getRandomImageStore(srcVolumeInfo.getDataCenterId());
diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java
index 936f062..952dbb2 100644
--- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java
@@ -574,6 +574,14 @@
         }
     }
 
+    private void verifyFormatWithPoolType(ImageFormat imageFormat, StoragePoolType poolType) {
+        if (imageFormat != ImageFormat.VHD && imageFormat != ImageFormat.OVA && imageFormat != ImageFormat.QCOW2 &&
+                !(imageFormat == ImageFormat.RAW && StoragePoolType.PowerFlex == poolType)) {
+            throw new CloudRuntimeException("Only the following image types are currently supported: " +
+                    ImageFormat.VHD.toString() + ", " + ImageFormat.OVA.toString() + ", " + ImageFormat.QCOW2.toString() + ", and " + ImageFormat.RAW.toString() + "(for PowerFlex)");
+        }
+    }
+
     private void verifyFormat(ImageFormat imageFormat) {
         if (imageFormat != ImageFormat.VHD && imageFormat != ImageFormat.OVA && imageFormat != ImageFormat.QCOW2) {
             throw new CloudRuntimeException("Only the following image types are currently supported: " +
@@ -585,8 +593,9 @@
         long volumeId = snapshotInfo.getVolumeId();
 
         VolumeVO volumeVO = _volumeDao.findByIdIncludingRemoved(volumeId);
+        StoragePoolVO storagePoolVO = _storagePoolDao.findById(volumeVO.getPoolId());
 
-        verifyFormat(volumeVO.getFormat());
+        verifyFormatWithPoolType(volumeVO.getFormat(), storagePoolVO.getPoolType());
     }
 
     private boolean usingBackendSnapshotFor(SnapshotInfo snapshotInfo) {
@@ -735,6 +744,7 @@
         details.put(DiskTO.MANAGED, Boolean.TRUE.toString());
         details.put(DiskTO.IQN, destVolumeInfo.get_iScsiName());
         details.put(DiskTO.STORAGE_HOST, destPool.getHostAddress());
+        details.put(DiskTO.PROTOCOL_TYPE, (destPool.getPoolType() != null) ? destPool.getPoolType().toString() : null);
 
         command.setDestDetails(details);
 
@@ -916,6 +926,11 @@
             boolean keepGrantedAccess = false;
 
             DataStore srcDataStore = snapshotInfo.getDataStore();
+            StoragePoolVO storagePoolVO = _storagePoolDao.findById(srcDataStore.getId());
+
+            if (HypervisorType.KVM.equals(snapshotInfo.getHypervisorType()) && storagePoolVO.getPoolType() == StoragePoolType.PowerFlex) {
+                usingBackendSnapshot = false;
+            }
 
             if (usingBackendSnapshot) {
                 createVolumeFromSnapshot(snapshotInfo);
@@ -1309,7 +1324,13 @@
             Preconditions.checkArgument(volumeInfo != null, "Passing 'null' to volumeInfo of " +
                             "handleCreateVolumeFromTemplateBothOnStorageSystem is not supported.");
 
-            verifyFormat(templateInfo.getFormat());
+            DataStore dataStore = volumeInfo.getDataStore();
+            if (dataStore.getRole() == DataStoreRole.Primary) {
+                StoragePoolVO storagePoolVO = _storagePoolDao.findById(dataStore.getId());
+                verifyFormatWithPoolType(templateInfo.getFormat(), storagePoolVO.getPoolType());
+            } else {
+                verifyFormat(templateInfo.getFormat());
+            }
 
             HostVO hostVO = null;
 
@@ -1786,6 +1807,11 @@
                 StoragePoolVO destStoragePool = _storagePoolDao.findById(destDataStore.getId());
                 StoragePoolVO sourceStoragePool = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
 
+                // do not initiate migration for the same PowerFlex/ScaleIO pool
+                if (sourceStoragePool.getId() == destStoragePool.getId() && sourceStoragePool.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                    continue;
+                }
+
                 if (!shouldMigrateVolume(sourceStoragePool, destHost, destStoragePool)) {
                     continue;
                 }
@@ -1894,13 +1920,11 @@
 
                 throw new CloudRuntimeException(errMsg);
             }
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
             errMsg = "Copy operation failed in 'StorageSystemDataMotionStrategy.copyAsync': " + ex.getMessage();
-
+            LOGGER.error(errMsg, ex);
             throw new CloudRuntimeException(errMsg);
-        }
-        finally {
+        } finally {
             CopyCmdAnswer copyCmdAnswer = new CopyCmdAnswer(errMsg);
 
             CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer);
@@ -2197,10 +2221,6 @@
                 throw new CloudRuntimeException("Volume with ID " + volumeInfo.getId() + " is not associated with a storage pool.");
             }
 
-            if (srcStoragePoolVO.isManaged()) {
-                throw new CloudRuntimeException("Migrating a volume online with KVM from managed storage is not currently supported.");
-            }
-
             DataStore dataStore = entry.getValue();
             StoragePoolVO destStoragePoolVO = _storagePoolDao.findById(dataStore.getId());
 
@@ -2208,6 +2228,10 @@
                 throw new CloudRuntimeException("Destination storage pool with ID " + dataStore.getId() + " was not located.");
             }
 
+            if (srcStoragePoolVO.isManaged() && srcStoragePoolVO.getId() != destStoragePoolVO.getId()) {
+                throw new CloudRuntimeException("Migrating a volume online with KVM from managed storage is not currently supported.");
+            }
+
             if (storageTypeConsistency == null) {
                 storageTypeConsistency = destStoragePoolVO.isManaged();
             } else if (storageTypeConsistency != destStoragePoolVO.isManaged()) {
@@ -2301,7 +2325,9 @@
         CopyCmdAnswer copyCmdAnswer = null;
 
         try {
-            if (!ImageFormat.QCOW2.equals(volumeInfo.getFormat())) {
+            StoragePoolVO storagePoolVO = _storagePoolDao.findById(volumeInfo.getPoolId());
+
+            if (!ImageFormat.QCOW2.equals(volumeInfo.getFormat()) && !(ImageFormat.RAW.equals(volumeInfo.getFormat()) && StoragePoolType.PowerFlex == storagePoolVO.getPoolType())) {
                 throw new CloudRuntimeException("When using managed storage, you can only create a template from a volume on KVM currently.");
             }
 
@@ -2317,7 +2343,7 @@
             try {
                 handleQualityOfServiceForVolumeMigration(volumeInfo, PrimaryDataStoreDriver.QualityOfServiceState.MIGRATION);
 
-                if (srcVolumeDetached) {
+                if (srcVolumeDetached || StoragePoolType.PowerFlex == storagePoolVO.getPoolType()) {
                     _volumeService.grantAccess(volumeInfo, hostVO, srcDataStore);
                 }
 
@@ -2349,7 +2375,7 @@
                 throw new CloudRuntimeException(msg + ex.getMessage(), ex);
             }
             finally {
-                if (srcVolumeDetached) {
+                if (srcVolumeDetached || StoragePoolType.PowerFlex == storagePoolVO.getPoolType()) {
                     try {
                         _volumeService.revokeAccess(volumeInfo, hostVO, srcDataStore);
                     }
@@ -2415,6 +2441,8 @@
         volumeDetails.put(DiskTO.STORAGE_HOST, storagePoolVO.getHostAddress());
         volumeDetails.put(DiskTO.STORAGE_PORT, String.valueOf(storagePoolVO.getPort()));
         volumeDetails.put(DiskTO.IQN, volumeVO.get_iScsiName());
+        volumeDetails.put(DiskTO.PROTOCOL_TYPE, (volumeVO.getPoolType() != null) ? volumeVO.getPoolType().toString() : null);
+        volumeDetails.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(storagePoolVO.getId())));
 
         volumeDetails.put(DiskTO.VOLUME_SIZE, String.valueOf(volumeVO.getSize()));
         volumeDetails.put(DiskTO.SCSI_NAA_DEVICE_ID, getVolumeProperty(volumeInfo.getId(), DiskTO.SCSI_NAA_DEVICE_ID));
@@ -2442,7 +2470,12 @@
 
         long snapshotId = snapshotInfo.getId();
 
-        snapshotDetails.put(DiskTO.IQN, getSnapshotProperty(snapshotId, DiskTO.IQN));
+        if (storagePoolVO.getPoolType() == StoragePoolType.PowerFlex) {
+            snapshotDetails.put(DiskTO.IQN, snapshotInfo.getPath());
+        } else {
+            snapshotDetails.put(DiskTO.IQN, getSnapshotProperty(snapshotId, DiskTO.IQN));
+        }
+
         snapshotDetails.put(DiskTO.VOLUME_SIZE, String.valueOf(snapshotInfo.getSize()));
         snapshotDetails.put(DiskTO.SCSI_NAA_DEVICE_ID, getSnapshotProperty(snapshotId, DiskTO.SCSI_NAA_DEVICE_ID));
 
diff --git a/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageSystemDataMotionTest.java b/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageSystemDataMotionTest.java
index ba7fb74..609742b 100644
--- a/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageSystemDataMotionTest.java
+++ b/engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/KvmNonManagedStorageSystemDataMotionTest.java
@@ -70,6 +70,7 @@
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.Volume;
 import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -327,6 +328,7 @@
 
         VolumeInfo srcVolumeInfo = Mockito.mock(VolumeInfo.class);
         Mockito.when(srcVolumeInfo.getTemplateId()).thenReturn(0l);
+        Mockito.when(srcVolumeInfo.getVolumeType()).thenReturn(Volume.Type.ROOT);
 
         StoragePool srcStoragePool = Mockito.mock(StoragePool.class);
 
@@ -465,6 +467,8 @@
     @Test(expected = CloudRuntimeException.class)
     public void testVerifyLiveMigrationMapForKVMMixedManagedUnmagedStorage() {
         when(pool1.isManaged()).thenReturn(true);
+        when(pool1.getId()).thenReturn(POOL_1_ID);
+        when(pool2.getId()).thenReturn(POOL_2_ID);
         lenient().when(pool2.isManaged()).thenReturn(false);
         kvmNonManagedStorageDataMotionStrategy.verifyLiveMigrationForKVM(migrationMap, host2);
     }
diff --git a/engine/storage/image/pom.xml b/engine/storage/image/pom.xml
index 979f181..3875585 100644
--- a/engine/storage/image/pom.xml
+++ b/engine/storage/image/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
index 1590fe0..c720b28 100644
--- a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
+++ b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
@@ -44,6 +44,7 @@
 import com.cloud.host.dao.HostDao;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplatePoolDao;
@@ -80,6 +81,16 @@
     }
 
     @Override
+    public TemplateInfo getTemplate(long templateId) {
+        VMTemplateVO templ = imageDataDao.findById(templateId);
+        if (templ != null) {
+            TemplateObject tmpl = TemplateObject.getTemplate(templ, null, null);
+            return tmpl;
+        }
+        return null;
+    }
+
+    @Override
     public TemplateInfo getTemplate(long templateId, DataStore store) {
         VMTemplateVO templ = imageDataDao.findById(templateId);
         if (store == null && !templ.isDirectDownload()) {
@@ -245,6 +256,33 @@
     }
 
     @Override
+    public TemplateInfo getReadyBypassedTemplateOnManagedStorage(long templateId, TemplateInfo templateOnPrimary, Long poolId, Long hostId) {
+        VMTemplateVO templateVO = imageDataDao.findById(templateId);
+        if (templateVO == null || !templateVO.isDirectDownload()) {
+            return null;
+        }
+
+        if (poolId == null) {
+            throw new CloudRuntimeException("No storage pool specified to download template: " + templateId);
+        }
+
+        StoragePoolVO poolVO = primaryDataStoreDao.findById(poolId);
+        if (poolVO == null || !poolVO.isManaged()) {
+            return null;
+        }
+
+        VMTemplateStoragePoolVO spoolRef = templatePoolDao.findByPoolTemplate(poolId, templateId, null);
+        if (spoolRef == null) {
+            throw new CloudRuntimeException("Template not created on managed storage pool: " + poolId + " to copy the download template: " + templateId);
+        } else if (spoolRef.getDownloadState() == VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED) {
+            directDownloadManager.downloadTemplate(templateId, poolId, hostId);
+        }
+
+        DataStore store = storeMgr.getDataStore(poolId, DataStoreRole.Primary);
+        return this.getTemplate(templateId, store);
+    }
+
+    @Override
     public boolean isTemplateMarkedForDirectDownload(long templateId) {
         VMTemplateVO templateVO = imageDataDao.findById(templateId);
         return templateVO.isDirectDownload();
diff --git a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index ed9359d..ef0ef7e 100644
--- a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -917,7 +917,14 @@
         TemplateOpContext<TemplateApiResult> context = new TemplateOpContext<TemplateApiResult>(null, to, future);
         AsyncCallbackDispatcher<TemplateServiceImpl, CommandResult> caller = AsyncCallbackDispatcher.create(this);
         caller.setCallback(caller.getTarget().deleteTemplateCallback(null, null)).setContext(context);
-        to.getDataStore().getDriver().deleteAsync(to.getDataStore(), to, caller);
+
+        if (to.canBeDeletedFromDataStore()) {
+            to.getDataStore().getDriver().deleteAsync(to.getDataStore(), to, caller);
+        } else {
+            CommandResult result = new CommandResult();
+            caller.complete(result);
+        }
+
         return future;
     }
 
diff --git a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/TemplateObject.java
index b7a44cd..d96b618 100644
--- a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/TemplateObject.java
+++ b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/TemplateObject.java
@@ -375,6 +375,35 @@
     }
 
     @Override
+    public boolean canBeDeletedFromDataStore() {
+        Status downloadStatus = Status.UNKNOWN;
+        int downloadPercent = -1;
+        if (getDataStore().getRole() == DataStoreRole.Primary) {
+            VMTemplateStoragePoolVO templatePoolRef = templatePoolDao.findByPoolTemplate(getDataStore().getId(), getId(), null);
+            if (templatePoolRef != null) {
+                downloadStatus = templatePoolRef.getDownloadState();
+                downloadPercent = templatePoolRef.getDownloadPercent();
+            }
+        } else if (dataStore.getRole() == DataStoreRole.Image || dataStore.getRole() == DataStoreRole.ImageCache) {
+            TemplateDataStoreVO templateStoreRef = templateStoreDao.findByStoreTemplate(dataStore.getId(), getId());
+            if (templateStoreRef != null) {
+                downloadStatus = templateStoreRef.getDownloadState();
+                downloadPercent = templateStoreRef.getDownloadPercent();
+                templateStoreRef.getState();
+            }
+        }
+
+        // Marking downloaded templates for deletion, but might skip any deletion handled for failed templates.
+        // Only templates not downloaded and in error state (with no install path) cannot be deleted from the datastore, so doesn't impact last behavior for templates with other states
+        if (downloadStatus == null  || downloadStatus == Status.NOT_DOWNLOADED || (downloadStatus == Status.DOWNLOAD_ERROR && downloadPercent == 0)) {
+            s_logger.debug("Template: " + getId() + " cannot be deleted from the store: " + getDataStore().getId());
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
     public boolean isDeployAsIs() {
         if (this.imageVO == null) {
             return false;
diff --git a/engine/storage/integration-test/pom.xml b/engine/storage/integration-test/pom.xml
index 475ebd0..4cae6ef 100644
--- a/engine/storage/integration-test/pom.xml
+++ b/engine/storage/integration-test/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/pom.xml b/engine/storage/pom.xml
index c03f9ff..92a2c20 100644
--- a/engine/storage/pom.xml
+++ b/engine/storage/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/snapshot/pom.xml b/engine/storage/snapshot/pom.xml
index c19adc4..a5d27ae 100644
--- a/engine/storage/snapshot/pom.xml
+++ b/engine/storage/snapshot/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -50,6 +50,12 @@
             <artifactId>cloud-engine-storage-volume</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-plugin-storage-volume-scaleio</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/ScaleIOSnapshotStrategy.java b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/ScaleIOSnapshotStrategy.java
new file mode 100644
index 0000000..dfe4750
--- /dev/null
+++ b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/ScaleIOSnapshotStrategy.java
@@ -0,0 +1,93 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.snapshot;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
+
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.Storage;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.VolumeDao;
+
+public class ScaleIOSnapshotStrategy extends StorageSystemSnapshotStrategy {
+    @Inject
+    private SnapshotDataStoreDao snapshotStoreDao;
+    @Inject
+    private PrimaryDataStoreDao primaryDataStoreDao;
+    @Inject
+    private VolumeDao volumeDao;
+
+    private static final Logger LOG = Logger.getLogger(ScaleIOSnapshotStrategy.class);
+
+    @Override
+    public StrategyPriority canHandle(Snapshot snapshot, SnapshotOperation op) {
+        long volumeId = snapshot.getVolumeId();
+        VolumeVO volumeVO = volumeDao.findByIdIncludingRemoved(volumeId);
+        boolean baseVolumeExists = volumeVO.getRemoved() == null;
+        if (!baseVolumeExists) {
+            return StrategyPriority.CANT_HANDLE;
+        }
+
+        if (!isSnapshotStoredOnScaleIOStoragePool(snapshot)) {
+            return StrategyPriority.CANT_HANDLE;
+        }
+
+        if (SnapshotOperation.REVERT.equals(op)) {
+            return StrategyPriority.HIGHEST;
+        }
+
+        if (SnapshotOperation.DELETE.equals(op)) {
+            return StrategyPriority.HIGHEST;
+        }
+
+        return StrategyPriority.CANT_HANDLE;
+    }
+
+    @Override
+    public boolean revertSnapshot(SnapshotInfo snapshotInfo) {
+        VolumeInfo volumeInfo = snapshotInfo.getBaseVolume();
+        Storage.ImageFormat imageFormat = volumeInfo.getFormat();
+        if (!Storage.ImageFormat.RAW.equals(imageFormat)) {
+            LOG.error(String.format("Does not support revert snapshot of the image format [%s] on PowerFlex. Can only rollback snapshots of format RAW", imageFormat));
+            return false;
+        }
+
+        executeRevertSnapshot(snapshotInfo, volumeInfo);
+
+        return true;
+    }
+
+    protected boolean isSnapshotStoredOnScaleIOStoragePool(Snapshot snapshot) {
+        SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Primary);
+        if (snapshotStore == null) {
+            return false;
+        }
+        StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(snapshotStore.getDataStoreId());
+        return storagePoolVO != null && storagePoolVO.getPoolType() == Storage.StoragePoolType.PowerFlex;
+    }
+}
diff --git a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java
index 33d43d7..6401f8a 100644
--- a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java
@@ -16,6 +16,37 @@
 // under the License.
 package org.apache.cloudstack.storage.snapshot;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Random;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
+import org.apache.cloudstack.storage.command.SnapshotAndCopyAnswer;
+import org.apache.cloudstack.storage.command.SnapshotAndCopyCommand;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.ModifyTargetsCommand;
@@ -38,18 +69,18 @@
 import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.SnapshotDetailsDao;
 import com.cloud.storage.dao.SnapshotDetailsVO;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
-import com.cloud.storage.VolumeDetailVO;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
-import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.snapshot.VMSnapshot;
 import com.cloud.vm.snapshot.VMSnapshotService;
@@ -57,37 +88,6 @@
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
 import com.google.common.base.Preconditions;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
-import org.apache.cloudstack.storage.command.SnapshotAndCopyAnswer;
-import org.apache.cloudstack.storage.command.SnapshotAndCopyCommand;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import javax.inject.Inject;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Random;
-import java.util.UUID;
-
 @Component
 public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase {
     private static final Logger s_logger = Logger.getLogger(StorageSystemSnapshotStrategy.class);
@@ -241,15 +241,16 @@
     }
 
     private boolean isAcceptableRevertFormat(VolumeVO volumeVO) {
-        return ImageFormat.VHD.equals(volumeVO.getFormat()) || ImageFormat.OVA.equals(volumeVO.getFormat()) || ImageFormat.QCOW2.equals(volumeVO.getFormat());
+        return ImageFormat.VHD.equals(volumeVO.getFormat()) || ImageFormat.OVA.equals(volumeVO.getFormat())
+                || ImageFormat.QCOW2.equals(volumeVO.getFormat()) || ImageFormat.RAW.equals(volumeVO.getFormat());
     }
 
     private void verifyFormat(VolumeInfo volumeInfo) {
         ImageFormat imageFormat = volumeInfo.getFormat();
 
-        if (imageFormat != ImageFormat.VHD && imageFormat != ImageFormat.OVA && imageFormat != ImageFormat.QCOW2) {
+        if (imageFormat != ImageFormat.VHD && imageFormat != ImageFormat.OVA && imageFormat != ImageFormat.QCOW2 && imageFormat != ImageFormat.RAW) {
             throw new CloudRuntimeException("Only the following image types are currently supported: " +
-                    ImageFormat.VHD.toString() + ", " + ImageFormat.OVA.toString() + ", and " + ImageFormat.QCOW2);
+                    ImageFormat.VHD.toString() + ", " + ImageFormat.OVA.toString() + ", " + ImageFormat.QCOW2 + ", and " + ImageFormat.RAW);
         }
     }
 
@@ -456,7 +457,7 @@
 
             computeClusterSupportsVolumeClone = clusterDao.getSupportsResigning(hostVO.getClusterId());
         }
-        else if (volumeInfo.getFormat() == ImageFormat.OVA || volumeInfo.getFormat() == ImageFormat.QCOW2) {
+        else if (volumeInfo.getFormat() == ImageFormat.OVA || volumeInfo.getFormat() == ImageFormat.QCOW2 || volumeInfo.getFormat() == ImageFormat.RAW) {
             computeClusterSupportsVolumeClone = true;
         }
         else {
@@ -760,6 +761,7 @@
         sourceDetails.put(DiskTO.STORAGE_HOST, storagePoolVO.getHostAddress());
         sourceDetails.put(DiskTO.STORAGE_PORT, String.valueOf(storagePoolVO.getPort()));
         sourceDetails.put(DiskTO.IQN, volumeVO.get_iScsiName());
+        sourceDetails.put(DiskTO.PROTOCOL_TYPE, (storagePoolVO.getPoolType() != null) ? storagePoolVO.getPoolType().toString() : null);
 
         ChapInfo chapInfo = volService.getChapInfo(volumeInfo, volumeInfo.getDataStore());
 
@@ -778,6 +780,7 @@
 
         destDetails.put(DiskTO.STORAGE_HOST, storagePoolVO.getHostAddress());
         destDetails.put(DiskTO.STORAGE_PORT, String.valueOf(storagePoolVO.getPort()));
+        destDetails.put(DiskTO.PROTOCOL_TYPE, (storagePoolVO.getPoolType() != null) ? storagePoolVO.getPoolType().toString() : null);
 
         long snapshotId = snapshotInfo.getId();
 
diff --git a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/ScaleIOVMSnapshotStrategy.java b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/ScaleIOVMSnapshotStrategy.java
new file mode 100644
index 0000000..a124a4a
--- /dev/null
+++ b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/ScaleIOVMSnapshotStrategy.java
@@ -0,0 +1,487 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.storage.vmsnapshot;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.storage.datastore.api.SnapshotGroup;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientConnectionPool;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.VMSnapshotTO;
+import com.cloud.alert.AlertManager;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
+import com.cloud.event.UsageEventVO;
+import com.cloud.server.ManagementServerImpl;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.Storage;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.cloud.vm.snapshot.VMSnapshotDetailsVO;
+import com.cloud.vm.snapshot.VMSnapshotVO;
+import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao;
+
+public class ScaleIOVMSnapshotStrategy extends ManagerBase implements VMSnapshotStrategy {
+    private static final Logger LOGGER = Logger.getLogger(ScaleIOVMSnapshotStrategy.class);
+    @Inject
+    VMSnapshotHelper vmSnapshotHelper;
+    @Inject
+    UserVmDao userVmDao;
+    @Inject
+    VMSnapshotDao vmSnapshotDao;
+    @Inject
+    protected VMSnapshotDetailsDao vmSnapshotDetailsDao;
+    int _wait;
+    @Inject
+    ConfigurationDao configurationDao;
+    @Inject
+    VolumeDao volumeDao;
+    @Inject
+    DiskOfferingDao diskOfferingDao;
+    @Inject
+    PrimaryDataStoreDao storagePoolDao;
+    @Inject
+    StoragePoolDetailsDao storagePoolDetailsDao;
+    @Inject
+    AlertManager alertManager;
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        String value = configurationDao.getValue("vmsnapshot.create.wait");
+        _wait = NumbersUtil.parseInt(value, 1800);
+        return true;
+    }
+
+    @Override
+    public StrategyPriority canHandle(VMSnapshot vmSnapshot) {
+        List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(vmSnapshot.getVmId());
+        if (volumeTOs == null) {
+            throw new CloudRuntimeException("Failed to get the volumes for the vm snapshot: " + vmSnapshot.getUuid());
+        }
+
+        if (volumeTOs != null && !volumeTOs.isEmpty()) {
+            for (VolumeObjectTO volumeTO: volumeTOs) {
+                Long poolId  = volumeTO.getPoolId();
+                Storage.StoragePoolType poolType = vmSnapshotHelper.getStoragePoolType(poolId);
+                if (poolType != Storage.StoragePoolType.PowerFlex) {
+                    return StrategyPriority.CANT_HANDLE;
+                }
+            }
+        }
+
+        return StrategyPriority.HIGHEST;
+    }
+
+    @Override
+    public VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot) {
+        UserVm userVm = userVmDao.findById(vmSnapshot.getVmId());
+        VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+
+        try {
+            vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshotVO, VMSnapshot.Event.CreateRequested);
+        } catch (NoTransitionException e) {
+            throw new CloudRuntimeException(e.getMessage());
+        }
+
+        boolean result = false;
+        try {
+            Map<String, String> srcVolumeDestSnapshotMap = new HashMap<>();
+            List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId());
+
+            final Long storagePoolId = vmSnapshotHelper.getStoragePoolForVM(userVm.getId());
+            StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId);
+            long prev_chain_size = 0;
+            long virtual_size=0;
+            for (VolumeObjectTO volume : volumeTOs) {
+                String volumeSnapshotName = String.format("%s-%s-%s-%s-%s", ScaleIOUtil.VMSNAPSHOT_PREFIX, vmSnapshotVO.getId(), volume.getId(),
+                        storagePool.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
+                srcVolumeDestSnapshotMap.put(ScaleIOUtil.getVolumePath(volume.getPath()), volumeSnapshotName);
+
+                virtual_size += volume.getSize();
+                VolumeVO volumeVO = volumeDao.findById(volume.getId());
+                prev_chain_size += volumeVO.getVmSnapshotChainSize() == null ? 0 : volumeVO.getVmSnapshotChainSize();
+            }
+
+            VMSnapshotTO current = null;
+            VMSnapshotVO currentSnapshot = vmSnapshotDao.findCurrentSnapshotByVmId(userVm.getId());
+            if (currentSnapshot != null) {
+                current = vmSnapshotHelper.getSnapshotWithParents(currentSnapshot);
+            }
+
+            if (current == null)
+                vmSnapshotVO.setParent(null);
+            else
+                vmSnapshotVO.setParent(current.getId());
+
+            try {
+                final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+                SnapshotGroup snapshotGroup = client.takeSnapshot(srcVolumeDestSnapshotMap);
+                if (snapshotGroup == null) {
+                    throw new CloudRuntimeException("Failed to take VM snapshot on PowerFlex storage pool");
+                }
+
+                String snapshotGroupId = snapshotGroup.getSnapshotGroupId();
+                List<String> volumeIds = snapshotGroup.getVolumeIds();
+                if (volumeIds != null && !volumeIds.isEmpty()) {
+                    List<VMSnapshotDetailsVO> vmSnapshotDetails = new ArrayList<VMSnapshotDetailsVO>();
+                    vmSnapshotDetails.add(new VMSnapshotDetailsVO(vmSnapshot.getId(), "SnapshotGroupId", snapshotGroupId, false));
+
+                    for (int index = 0; index < volumeIds.size(); index++) {
+                        String volumeSnapshotName = srcVolumeDestSnapshotMap.get(ScaleIOUtil.getVolumePath(volumeTOs.get(index).getPath()));
+                        String pathWithScaleIOVolumeName = ScaleIOUtil.updatedPathWithVolumeName(volumeIds.get(index), volumeSnapshotName);
+                        vmSnapshotDetails.add(new VMSnapshotDetailsVO(vmSnapshot.getId(), "Vol_" + volumeTOs.get(index).getId() + "_Snapshot", pathWithScaleIOVolumeName, false));
+                    }
+
+                    vmSnapshotDetailsDao.saveDetails(vmSnapshotDetails);
+                }
+
+                finalizeCreate(vmSnapshotVO, volumeTOs);
+                result = true;
+                LOGGER.debug("Create vm snapshot " + vmSnapshot.getName() + " succeeded for vm: " + userVm.getInstanceName());
+
+                long new_chain_size=0;
+                for (VolumeObjectTO volumeTo : volumeTOs) {
+                    publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_CREATE, vmSnapshot, userVm, volumeTo);
+                    new_chain_size += volumeTo.getSize();
+                }
+                publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_ON_PRIMARY, vmSnapshot, userVm, new_chain_size - prev_chain_size, virtual_size);
+                return vmSnapshot;
+            } catch (Exception e) {
+                String errMsg = "Unable to take vm snapshot due to: " + e.getMessage();
+                LOGGER.warn(errMsg, e);
+                throw new CloudRuntimeException(errMsg);
+            }
+        } finally {
+            if (!result) {
+                try {
+                    vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
+
+                    String subject = "Take snapshot failed for VM: " + userVm.getDisplayName();
+                    String message = "Snapshot operation failed for VM: " + userVm.getDisplayName() + ", Please check and delete if any stale volumes created with VM snapshot id: " + vmSnapshot.getVmId();
+                    alertManager.sendAlert(AlertManager.AlertType.ALERT_TYPE_VM_SNAPSHOT, userVm.getDataCenterId(), userVm.getPodIdToDeployIn(), subject, message);
+                } catch (NoTransitionException e1) {
+                    LOGGER.error("Cannot set vm snapshot state due to: " + e1.getMessage());
+                }
+            }
+        }
+    }
+
+    @DB
+    protected void finalizeCreate(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> volumeTOs) {
+        try {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NoTransitionException>() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) throws NoTransitionException {
+                    // update chain size for the volumes in the VM snapshot
+                    for (VolumeObjectTO volume : volumeTOs) {
+                        VolumeVO volumeVO = volumeDao.findById(volume.getId());
+                        if (volumeVO != null) {
+                            long vmSnapshotChainSize = volumeVO.getVmSnapshotChainSize() == null ? 0 : volumeVO.getVmSnapshotChainSize();
+                            vmSnapshotChainSize += volumeVO.getSize();
+                            volumeVO.setVmSnapshotChainSize(vmSnapshotChainSize);
+                            volumeDao.persist(volumeVO);
+                        }
+                    }
+
+                    vmSnapshot.setCurrent(true);
+
+                    // change current snapshot
+                    if (vmSnapshot.getParent() != null) {
+                        VMSnapshotVO previousCurrent = vmSnapshotDao.findById(vmSnapshot.getParent());
+                        previousCurrent.setCurrent(false);
+                        vmSnapshotDao.persist(previousCurrent);
+                    }
+                    vmSnapshotDao.persist(vmSnapshot);
+
+                    vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+                }
+            });
+        } catch (Exception e) {
+            String errMsg = "Error while finalize create vm snapshot: " + vmSnapshot.getName() + " due to " + e.getMessage();
+            LOGGER.error(errMsg, e);
+            throw new CloudRuntimeException(errMsg);
+        }
+    }
+
+    @Override
+    public boolean revertVMSnapshot(VMSnapshot vmSnapshot) {
+        VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+        UserVmVO userVm = userVmDao.findById(vmSnapshot.getVmId());
+
+        try {
+            vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshotVO, VMSnapshot.Event.RevertRequested);
+        } catch (NoTransitionException e) {
+            throw new CloudRuntimeException(e.getMessage());
+        }
+
+        boolean result = false;
+        try {
+            List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId());
+            Long storagePoolId = vmSnapshotHelper.getStoragePoolForVM(userVm.getId());
+            Map<String, String> srcSnapshotDestVolumeMap = new HashMap<>();
+            for (VolumeObjectTO volume : volumeTOs) {
+                VMSnapshotDetailsVO vmSnapshotDetail = vmSnapshotDetailsDao.findDetail(vmSnapshotVO.getId(), "Vol_" + volume.getId() + "_Snapshot");
+                String srcSnapshotVolumeId = ScaleIOUtil.getVolumePath(vmSnapshotDetail.getValue());
+                String destVolumeId = ScaleIOUtil.getVolumePath(volume.getPath());
+                srcSnapshotDestVolumeMap.put(srcSnapshotVolumeId, destVolumeId);
+            }
+
+            String systemId = storagePoolDetailsDao.findDetail(storagePoolId, ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue();
+            if (systemId == null) {
+                throw new CloudRuntimeException("Failed to get the system id for PowerFlex storage pool for reverting VM snapshot: " + vmSnapshot.getName());
+            }
+
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+            result = client.revertSnapshot(systemId, srcSnapshotDestVolumeMap);
+            if (!result) {
+                throw new CloudRuntimeException("Failed to revert VM snapshot on PowerFlex storage pool");
+            }
+
+            finalizeRevert(vmSnapshotVO, volumeTOs);
+            result = true;
+        } catch (Exception e) {
+            String errMsg = "Revert VM: " + userVm.getInstanceName() + " to snapshot: " + vmSnapshotVO.getName() + " failed due to " + e.getMessage();
+            LOGGER.error(errMsg, e);
+            throw new CloudRuntimeException(errMsg);
+        } finally {
+            if (!result) {
+                try {
+                    vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
+                } catch (NoTransitionException e1) {
+                    LOGGER.error("Cannot set vm snapshot state due to: " + e1.getMessage());
+                }
+            }
+        }
+        return result;
+    }
+
+    @DB
+    protected void finalizeRevert(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> volumeToList) {
+        try {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NoTransitionException>() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) throws NoTransitionException {
+                    // update chain size for the volumes in the VM snapshot
+                    for (VolumeObjectTO volume : volumeToList) {
+                        VolumeVO volumeVO = volumeDao.findById(volume.getId());
+                        if (volumeVO != null && volumeVO.getVmSnapshotChainSize() != null && volumeVO.getVmSnapshotChainSize() >= volumeVO.getSize()) {
+                            long vmSnapshotChainSize = volumeVO.getVmSnapshotChainSize() - volumeVO.getSize();
+                            volumeVO.setVmSnapshotChainSize(vmSnapshotChainSize);
+                            volumeDao.persist(volumeVO);
+                        }
+                    }
+
+                    // update current snapshot, current snapshot is the one reverted to
+                    VMSnapshotVO previousCurrent = vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
+                    if (previousCurrent != null) {
+                        previousCurrent.setCurrent(false);
+                        vmSnapshotDao.persist(previousCurrent);
+                    }
+                    vmSnapshot.setCurrent(true);
+                    vmSnapshotDao.persist(vmSnapshot);
+
+                    vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+                }
+            });
+        } catch (Exception e) {
+            String errMsg = "Error while finalize revert vm snapshot: " + vmSnapshot.getName() + " due to " + e.getMessage();
+            LOGGER.error(errMsg, e);
+            throw new CloudRuntimeException(errMsg);
+        }
+    }
+
+    @Override
+    public boolean deleteVMSnapshot(VMSnapshot vmSnapshot) {
+        UserVmVO userVm = userVmDao.findById(vmSnapshot.getVmId());
+        VMSnapshotVO vmSnapshotVO = (VMSnapshotVO)vmSnapshot;
+
+        try {
+            vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.ExpungeRequested);
+        } catch (NoTransitionException e) {
+            LOGGER.debug("Failed to change vm snapshot state with event ExpungeRequested");
+            throw new CloudRuntimeException("Failed to change vm snapshot state with event ExpungeRequested: " + e.getMessage());
+        }
+
+        try {
+            List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(vmSnapshot.getVmId());
+            Long storagePoolId = vmSnapshotHelper.getStoragePoolForVM(userVm.getId());
+            String systemId = storagePoolDetailsDao.findDetail(storagePoolId, ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue();
+            if (systemId == null) {
+                throw new CloudRuntimeException("Failed to get the system id for PowerFlex storage pool for deleting VM snapshot: " + vmSnapshot.getName());
+            }
+
+            VMSnapshotDetailsVO vmSnapshotDetailsVO = vmSnapshotDetailsDao.findDetail(vmSnapshot.getId(), "SnapshotGroupId");
+            if (vmSnapshotDetailsVO == null) {
+                throw new CloudRuntimeException("Failed to get snapshot group id for the VM snapshot: " + vmSnapshot.getName());
+            }
+
+            String snapshotGroupId = vmSnapshotDetailsVO.getValue();
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+            int volumesDeleted = client.deleteSnapshotGroup(systemId, snapshotGroupId);
+            if (volumesDeleted <= 0) {
+                throw new CloudRuntimeException("Failed to delete VM snapshot: " + vmSnapshot.getName());
+            } else if (volumesDeleted != volumeTOs.size()) {
+                LOGGER.warn("Unable to delete all volumes of the VM snapshot: " + vmSnapshot.getName());
+            }
+
+            finalizeDelete(vmSnapshotVO, volumeTOs);
+            long full_chain_size=0;
+            for (VolumeObjectTO volumeTo : volumeTOs) {
+                publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_DELETE, vmSnapshot, userVm, volumeTo);
+                full_chain_size += volumeTo.getSize();
+            }
+            publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_OFF_PRIMARY, vmSnapshot, userVm, full_chain_size, 0L);
+            return true;
+        } catch (Exception e) {
+            String errMsg = "Unable to delete vm snapshot: " + vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " due to " + e.getMessage();
+            LOGGER.warn(errMsg, e);
+            throw new CloudRuntimeException(errMsg);
+        }
+    }
+
+    @DB
+    protected void finalizeDelete(VMSnapshotVO vmSnapshot, List<VolumeObjectTO> volumeTOs) {
+        try {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NoTransitionException>() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) throws NoTransitionException {
+                    // update chain size for the volumes in the VM snapshot
+                    for (VolumeObjectTO volume : volumeTOs) {
+                        VolumeVO volumeVO = volumeDao.findById(volume.getId());
+                        if (volumeVO != null && volumeVO.getVmSnapshotChainSize() != null && volumeVO.getVmSnapshotChainSize() >= volumeVO.getSize()) {
+                            long vmSnapshotChainSize = volumeVO.getVmSnapshotChainSize() - volumeVO.getSize();
+                            volumeVO.setVmSnapshotChainSize(vmSnapshotChainSize);
+                            volumeDao.persist(volumeVO);
+                        }
+                    }
+
+                    // update children's parent snapshots
+                    List<VMSnapshotVO> children = vmSnapshotDao.listByParent(vmSnapshot.getId());
+                    for (VMSnapshotVO child : children) {
+                        child.setParent(vmSnapshot.getParent());
+                        vmSnapshotDao.persist(child);
+                    }
+
+                    // update current snapshot
+                    VMSnapshotVO current = vmSnapshotDao.findCurrentSnapshotByVmId(vmSnapshot.getVmId());
+                    if (current != null && current.getId() == vmSnapshot.getId() && vmSnapshot.getParent() != null) {
+                        VMSnapshotVO parent = vmSnapshotDao.findById(vmSnapshot.getParent());
+                        parent.setCurrent(true);
+                        vmSnapshotDao.persist(parent);
+                    }
+                    vmSnapshot.setCurrent(false);
+                    vmSnapshotDao.persist(vmSnapshot);
+
+                    vmSnapshotDao.remove(vmSnapshot.getId());
+                }
+            });
+        } catch (Exception e) {
+            String errMsg = "Error while finalize delete vm snapshot: " + vmSnapshot.getName() + " due to " + e.getMessage();
+            LOGGER.error(errMsg, e);
+            throw new CloudRuntimeException(errMsg);
+        }
+    }
+
+    @Override
+    public boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot, boolean unmanage) {
+        try {
+            vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.ExpungeRequested);
+        } catch (NoTransitionException e) {
+            LOGGER.debug("Failed to change vm snapshot state with event ExpungeRequested");
+            throw new CloudRuntimeException("Failed to change vm snapshot state with event ExpungeRequested: " + e.getMessage());
+        }
+        UserVm userVm = userVmDao.findById(vmSnapshot.getVmId());
+        List<VolumeObjectTO> volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId());
+        long full_chain_size = 0;
+        for (VolumeObjectTO volumeTo: volumeTOs) {
+            volumeTo.setSize(0);
+            publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_DELETE, vmSnapshot, userVm, volumeTo);
+            full_chain_size += volumeTo.getSize();
+        }
+        if (unmanage) {
+            publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_OFF_PRIMARY, vmSnapshot, userVm, full_chain_size, 0L);
+        }
+        return vmSnapshotDao.remove(vmSnapshot.getId());
+    }
+
+    private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, VolumeObjectTO volumeTo) {
+        VolumeVO volume = volumeDao.findById(volumeTo.getId());
+        Long diskOfferingId = volume.getDiskOfferingId();
+        Long offeringId = null;
+        if (diskOfferingId != null) {
+            DiskOfferingVO offering = diskOfferingDao.findById(diskOfferingId);
+            if (offering != null && (offering.getType() == DiskOfferingVO.Type.Disk)) {
+                offeringId = offering.getId();
+            }
+        }
+        Map<String, String> details = new HashMap<>();
+        if (vmSnapshot != null) {
+            details.put(UsageEventVO.DynamicParameters.vmSnapshotId.name(), String.valueOf(vmSnapshot.getId()));
+        }
+        UsageEventUtils.publishUsageEvent(type, vmSnapshot.getAccountId(), userVm.getDataCenterId(), userVm.getId(), vmSnapshot.getName(), offeringId, volume.getId(), // save volume's id into templateId field
+                volumeTo.getSize(), VMSnapshot.class.getName(), vmSnapshot.getUuid(), details);
+    }
+
+    private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, Long vmSnapSize, Long virtualSize) {
+        try {
+            Map<String, String> details = new HashMap<>();
+            if (vmSnapshot != null) {
+                details.put(UsageEventVO.DynamicParameters.vmSnapshotId.name(), String.valueOf(vmSnapshot.getId()));
+            }
+            UsageEventUtils.publishUsageEvent(type, vmSnapshot.getAccountId(), userVm.getDataCenterId(), userVm.getId(), vmSnapshot.getName(), 0L, 0L, vmSnapSize, virtualSize,
+                    VMSnapshot.class.getName(), vmSnapshot.getUuid(), details);
+        } catch (Exception e) {
+            LOGGER.error("Failed to publish usage event " + type, e);
+        }
+    }
+
+    private ScaleIOGatewayClient getScaleIOClient(final Long storagePoolId) throws Exception {
+        return ScaleIOGatewayClientConnectionPool.getInstance().getClient(storagePoolId, storagePoolDetailsDao);
+    }
+}
diff --git a/engine/storage/snapshot/src/main/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml b/engine/storage/snapshot/src/main/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml
index 2bfb3c3..2084ce2 100644
--- a/engine/storage/snapshot/src/main/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml
+++ b/engine/storage/snapshot/src/main/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml
@@ -36,7 +36,13 @@
     <bean id="cephSnapshotStrategy"
         class="org.apache.cloudstack.storage.snapshot.CephSnapshotStrategy" />
 
+    <bean id="scaleioSnapshotStrategy"
+          class="org.apache.cloudstack.storage.snapshot.ScaleIOSnapshotStrategy" />
+
     <bean id="DefaultVMSnapshotStrategy"
         class="org.apache.cloudstack.storage.vmsnapshot.DefaultVMSnapshotStrategy" />
 
+    <bean id="ScaleIOVMSnapshotStrategy"
+          class="org.apache.cloudstack.storage.vmsnapshot.ScaleIOVMSnapshotStrategy" />
+
 </beans>
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
index 82649b9..7de40e9 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
@@ -215,12 +215,16 @@
             return false;
         }
 
+        Volume volume = volumeDao.findById(dskCh.getVolumeId());
+        if(!storageMgr.storagePoolCompatibleWithVolumePool(pool, volume)) {
+            return false;
+        }
+
         if (pool.isManaged() && !storageUtil.managedStoragePoolCanScale(pool, plan.getClusterId(), plan.getHostId())) {
             return false;
         }
 
         // check capacity
-        Volume volume = volumeDao.findById(dskCh.getVolumeId());
         List<Volume> requestVolumes = new ArrayList<>();
         requestVolumes.add(volume);
         if (dskCh.getHypervisorType() == HypervisorType.VMware) {
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
index e3b2991..34955f1 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
@@ -48,7 +48,6 @@
     @Inject
     private CapacityDao capacityDao;
 
-
     @Override
     protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
         LOGGER.debug("ZoneWideStoragePoolAllocator to find storage pool");
@@ -92,7 +91,6 @@
             avoid.addPool(pool.getId());
         }
 
-
         for (StoragePoolVO storage : storagePools) {
             if (suitablePools.size() == returnUpTo) {
                 break;
@@ -114,7 +112,6 @@
         return !ScopeType.ZONE.equals(storagePoolVO.getScope()) || !storagePoolVO.isManaged();
     }
 
-
     @Override
     protected List<StoragePool> reorderPoolsByCapacity(DeploymentPlan plan,
         List<StoragePool> pools) {
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/helper/VMSnapshotHelperImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/helper/VMSnapshotHelperImpl.java
index cadbad3..0184244 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/helper/VMSnapshotHelperImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/helper/VMSnapshotHelperImpl.java
@@ -37,6 +37,7 @@
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
+import com.cloud.storage.Storage;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.utils.fsm.NoTransitionException;
@@ -148,4 +149,33 @@
         return result;
     }
 
+    @Override
+    public Long getStoragePoolForVM(Long vmId) {
+        List<VolumeVO> rootVolumes = volumeDao.findReadyRootVolumesByInstance(vmId);
+        if (rootVolumes == null || rootVolumes.isEmpty()) {
+            throw new InvalidParameterValueException("Failed to find root volume for the user vm:" + vmId);
+        }
+
+        VolumeVO rootVolume = rootVolumes.get(0);
+        StoragePoolVO rootVolumePool = primaryDataStoreDao.findById(rootVolume.getPoolId());
+        if (rootVolumePool == null) {
+            throw new InvalidParameterValueException("Failed to find root volume storage pool for the user vm:" + vmId);
+        }
+
+        if (rootVolumePool.isInMaintenance()) {
+            throw new InvalidParameterValueException("Storage pool for the user vm:" + vmId + " is in maintenance");
+        }
+
+        return rootVolumePool.getId();
+    }
+
+    @Override
+    public Storage.StoragePoolType getStoragePoolType(Long poolId) {
+        StoragePoolVO storagePool = primaryDataStoreDao.findById(poolId);
+        if (storagePool == null) {
+            throw new InvalidParameterValueException("storage pool is not found");
+        }
+
+        return storagePool.getPoolType();
+    }
 }
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
index 9cf73e6..0c55545 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
@@ -71,6 +71,7 @@
 import com.cloud.configuration.Config;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.OperationTimedoutException;
+import com.cloud.host.Host;
 import com.cloud.host.dao.HostDao;
 import com.cloud.secstorage.CommandExecLogDao;
 import com.cloud.secstorage.CommandExecLogVO;
@@ -363,6 +364,11 @@
         }
     }
 
+    @Override
+    public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+        copyAsync(srcData, destData, callback);
+    }
+
     private Answer sendToLeastBusyEndpoint(List<EndPoint> eps, CopyCommand cmd) {
         Answer answer = null;
         EndPoint endPoint = null;
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java
index 2e7e13b..35153a1 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/vmsnapshot/VMSnapshotHelper.java
@@ -23,6 +23,7 @@
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
 import com.cloud.agent.api.VMSnapshotTO;
+import com.cloud.storage.Storage;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.vm.snapshot.VMSnapshot;
 import com.cloud.vm.snapshot.VMSnapshotVO;
@@ -35,4 +36,8 @@
     List<VolumeObjectTO> getVolumeTOList(Long vmId);
 
     VMSnapshotTO getSnapshotWithParents(VMSnapshotVO snapshot);
+
+    Long getStoragePoolForVM(Long vmId);
+
+    Storage.StoragePoolType getStoragePoolType(Long poolId);
 }
diff --git a/engine/storage/volume/pom.xml b/engine/storage/volume/pom.xml
index 38f3647..18f4413 100644
--- a/engine/storage/volume/pom.xml
+++ b/engine/storage/volume/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-engine</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java
index 18a7f3c..f557ac3 100644
--- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java
+++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java
@@ -203,8 +203,7 @@
 
     @Override
     public String getName() {
-        // TODO Auto-generated method stub
-        return null;
+        return pdsv.getName();
     }
 
     @Override
diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java
index 9750fb1..5ec9cfb 100644
--- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java
+++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java
@@ -29,11 +29,9 @@
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
 import com.cloud.vm.VmDetailConstants;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
 
+import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
@@ -44,6 +42,8 @@
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.storage.DownloadAnswer;
@@ -53,6 +53,7 @@
 import com.cloud.offering.DiskOffering.DiskCacheMode;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.ProvisioningType;
 import com.cloud.storage.Volume;
@@ -626,6 +627,11 @@
     }
 
     @Override
+    public Storage.StoragePoolType getStoragePoolType() {
+        return volumeVO.getPoolType();
+    }
+
+    @Override
     public Long getLastPoolId() {
         return volumeVO.getLastPoolId();
     }
diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index 5e3493a..68940d4 100644
--- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -31,6 +31,7 @@
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.dao.VMTemplateDao;
 import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
+import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
@@ -47,6 +48,7 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
@@ -64,6 +66,8 @@
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
@@ -88,6 +92,7 @@
 import com.cloud.event.EventTypes;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.StorageAccessException;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
@@ -101,13 +106,16 @@
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.RegisterVolumePayload;
 import com.cloud.storage.ScopeType;
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 import com.cloud.storage.Volume;
 import com.cloud.storage.Volume.State;
+import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VolumeDao;
@@ -122,6 +130,7 @@
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VirtualMachine;
+import com.google.common.base.Strings;
 
 import static com.cloud.storage.resource.StorageProcessor.REQUEST_TEMPLATE_RELOAD;
 
@@ -163,6 +172,8 @@
     @Inject
     private PrimaryDataStoreDao storagePoolDao;
     @Inject
+    private StoragePoolDetailsDao _storagePoolDetailsDao;
+    @Inject
     private HostDetailsDao hostDetailsDao;
     @Inject
     private ManagementService mgr;
@@ -172,6 +183,12 @@
     private VolumeDetailsDao _volumeDetailsDao;
     @Inject
     private VMTemplateDao templateDao;
+    @Inject
+    private TemplateDataFactory tmplFactory;
+    @Inject
+    private VolumeOrchestrationService _volumeMgr;
+    @Inject
+    private StorageManager _storageMgr;
 
     private final static String SNAPSHOT_ID = "SNAPSHOT_ID";
 
@@ -380,6 +397,14 @@
         return future;
     }
 
+    public void ensureVolumeIsExpungeReady(long volumeId) {
+        VolumeVO volume = volDao.findById(volumeId);
+        if (volume != null && volume.getPodId() != null) {
+            volume.setPodId(null);
+            volDao.update(volumeId, volume);
+        }
+    }
+
     private boolean volumeExistsOnPrimary(VolumeVO vol) {
         Long poolId = vol.getPoolId();
 
@@ -794,6 +819,39 @@
         return null;
     }
 
+    @DB
+    protected Void createVolumeFromBaseManagedImageCallBack(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback, CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
+        CopyCommandResult result = callback.getResult();
+        DataObject vo = context.vo;
+        DataObject tmplOnPrimary = context.templateOnStore;
+        VolumeApiResult volResult = new VolumeApiResult((VolumeObject)vo);
+
+        if (result.isSuccess()) {
+            VolumeVO volume = volDao.findById(vo.getId());
+            CopyCmdAnswer answer = (CopyCmdAnswer)result.getAnswer();
+            VolumeObjectTO volumeObjectTo = (VolumeObjectTO)answer.getNewData();
+            volume.setPath(volumeObjectTo.getPath());
+            if (volumeObjectTo.getFormat() != null) {
+                volume.setFormat(volumeObjectTo.getFormat());
+            }
+
+            volDao.update(volume.getId(), volume);
+            vo.processEvent(Event.OperationSuccessed);
+        } else {
+            volResult.setResult(result.getResult());
+
+            try {
+                destroyAndReallocateManagedVolume((VolumeInfo) vo);
+            } catch (CloudRuntimeException ex) {
+                s_logger.warn("Couldn't destroy managed volume: " + vo.getId());
+            }
+        }
+
+        AsyncCallFuture<VolumeApiResult> future = context.getFuture();
+        future.complete(volResult);
+        return null;
+    }
+
     /**
      * Creates a template volume on managed storage, which will be used for creating ROOT volumes by cloning.
      *
@@ -809,6 +867,9 @@
 
         if (templatePoolRef == null) {
             throw new CloudRuntimeException("Failed to find template " + srcTemplateInfo.getUniqueName() + " in storage pool " + destPrimaryDataStore.getId());
+        } else if (templatePoolRef.getState() == ObjectInDataStoreStateMachine.State.Ready) {
+            // Template already exists
+            return templateOnPrimary;
         }
 
         // At this point, we have an entry in the DB that points to our cached template.
@@ -824,13 +885,6 @@
             throw new CloudRuntimeException("Unable to acquire lock on VMTemplateStoragePool: " + templatePoolRefId);
         }
 
-        // Template already exists
-        if (templatePoolRef.getState() == ObjectInDataStoreStateMachine.State.Ready) {
-            _tmpltPoolDao.releaseFromLockTable(templatePoolRefId);
-
-            return templateOnPrimary;
-        }
-
         try {
             // create a cache volume on the back-end
 
@@ -875,27 +929,25 @@
      * @param destHost The host that we will use for the copy
      */
     private void copyTemplateToManagedTemplateVolume(TemplateInfo srcTemplateInfo, TemplateInfo templateOnPrimary, VMTemplateStoragePoolVO templatePoolRef, PrimaryDataStore destPrimaryDataStore,
-                                                     Host destHost) {
+            Host destHost) throws StorageAccessException {
         AsyncCallFuture<VolumeApiResult> copyTemplateFuture = new AsyncCallFuture<>();
         int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600);
         long templatePoolRefId = templatePoolRef.getId();
 
-        templatePoolRef = _tmpltPoolDao.acquireInLockTable(templatePoolRefId, storagePoolMaxWaitSeconds);
-
-        if (templatePoolRef == null) {
-            throw new CloudRuntimeException("Unable to acquire lock on VMTemplateStoragePool: " + templatePoolRefId);
-        }
-
-        if (templatePoolRef.getDownloadState() == Status.DOWNLOADED) {
-            // There can be cases where we acquired the lock, but the template
-            // was already copied by a previous thread. Just return in that case.
-
-            s_logger.debug("Template already downloaded, nothing to do");
-
-            return;
-        }
-
         try {
+            templatePoolRef = _tmpltPoolDao.acquireInLockTable(templatePoolRefId, storagePoolMaxWaitSeconds);
+
+            if (templatePoolRef == null) {
+                throw new CloudRuntimeException("Unable to acquire lock on VMTemplateStoragePool: " + templatePoolRefId);
+            }
+
+            if (templatePoolRef.getDownloadState() == Status.DOWNLOADED) {
+                // There can be cases where we acquired the lock, but the template
+                // was already copied by a previous thread. Just return in that case.
+                s_logger.debug("Template already downloaded, nothing to do");
+                return;
+            }
+
             // copy the template from sec storage to the created volume
             CreateBaseImageContext<CreateCmdResult> copyContext = new CreateBaseImageContext<>(null, null, destPrimaryDataStore, srcTemplateInfo, copyTemplateFuture, templateOnPrimary,
                     templatePoolRefId);
@@ -913,6 +965,7 @@
             details.put(PrimaryDataStore.MANAGED_STORE_TARGET_ROOT_VOLUME, srcTemplateInfo.getUniqueName());
             details.put(PrimaryDataStore.REMOVE_AFTER_COPY, Boolean.TRUE.toString());
             details.put(PrimaryDataStore.VOLUME_SIZE, String.valueOf(templateOnPrimary.getSize()));
+            details.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(destPrimaryDataStore.getId())));
 
             ChapInfo chapInfo = getChapInfo(templateOnPrimary, destPrimaryDataStore);
 
@@ -923,11 +976,15 @@
                 details.put(PrimaryDataStore.CHAP_TARGET_SECRET, chapInfo.getTargetSecret());
             }
 
-            templateOnPrimary.processEvent(Event.CopyingRequested);
-
             destPrimaryDataStore.setDetails(details);
 
-            grantAccess(templateOnPrimary, destHost, destPrimaryDataStore);
+            try {
+                grantAccess(templateOnPrimary, destHost, destPrimaryDataStore);
+            } catch (Exception e) {
+                throw new StorageAccessException("Unable to grant access to template: " + templateOnPrimary.getId() + " on host: " + destHost.getId());
+            }
+
+            templateOnPrimary.processEvent(Event.CopyingRequested);
 
             VolumeApiResult result;
 
@@ -955,6 +1012,8 @@
                 // something weird happens to the volume (XenServer creates an SR, but the VDI copy can fail).
                 // For now, I just retry the copy.
             }
+        } catch (StorageAccessException e) {
+            throw e;
         } catch (Throwable e) {
             s_logger.debug("Failed to create a template on primary storage", e);
 
@@ -1031,6 +1090,126 @@
         }
     }
 
+    private void createManagedVolumeCopyManagedTemplateAsync(VolumeInfo volumeInfo, PrimaryDataStore destPrimaryDataStore, TemplateInfo srcTemplateOnPrimary, Host destHost, AsyncCallFuture<VolumeApiResult> future) throws StorageAccessException {
+        VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), srcTemplateOnPrimary.getId(), null);
+
+        if (templatePoolRef == null) {
+            throw new CloudRuntimeException("Failed to find template " + srcTemplateOnPrimary.getUniqueName() + " in storage pool " + srcTemplateOnPrimary.getId());
+        }
+
+        if (templatePoolRef.getDownloadState() == Status.NOT_DOWNLOADED) {
+            throw new CloudRuntimeException("Template " + srcTemplateOnPrimary.getUniqueName() + " has not been downloaded to primary storage.");
+        }
+
+        String volumeDetailKey = "POOL_TEMPLATE_ID_COPY_ON_HOST_" + destHost.getId();
+
+        try {
+            try {
+                grantAccess(srcTemplateOnPrimary, destHost, destPrimaryDataStore);
+            } catch (Exception e) {
+                throw new StorageAccessException("Unable to grant access to src template: " + srcTemplateOnPrimary.getId() + " on host: " + destHost.getId());
+            }
+
+            _volumeDetailsDao.addDetail(volumeInfo.getId(), volumeDetailKey, String.valueOf(templatePoolRef.getId()), false);
+
+            // Create a volume on managed storage.
+            AsyncCallFuture<VolumeApiResult> createVolumeFuture = createVolumeAsync(volumeInfo, destPrimaryDataStore);
+            VolumeApiResult createVolumeResult = createVolumeFuture.get();
+
+            if (createVolumeResult.isFailed()) {
+                throw new CloudRuntimeException("Creation of a volume failed: " + createVolumeResult.getResult());
+            }
+
+            // Refresh the volume info from the DB.
+            volumeInfo = volFactory.getVolume(volumeInfo.getId(), destPrimaryDataStore);
+
+            volumeInfo.processEvent(Event.CreateRequested);
+            CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<>(null, volumeInfo, destPrimaryDataStore, srcTemplateOnPrimary, future, null, null);
+            AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+            caller.setCallback(caller.getTarget().createVolumeFromBaseManagedImageCallBack(null, null));
+            caller.setContext(context);
+
+            Map<String, String> details = new HashMap<String, String>();
+            details.put(PrimaryDataStore.MANAGED, Boolean.TRUE.toString());
+            details.put(PrimaryDataStore.STORAGE_HOST, destPrimaryDataStore.getHostAddress());
+            details.put(PrimaryDataStore.STORAGE_PORT, String.valueOf(destPrimaryDataStore.getPort()));
+            details.put(PrimaryDataStore.MANAGED_STORE_TARGET, volumeInfo.get_iScsiName());
+            details.put(PrimaryDataStore.MANAGED_STORE_TARGET_ROOT_VOLUME, volumeInfo.getName());
+            details.put(PrimaryDataStore.VOLUME_SIZE, String.valueOf(volumeInfo.getSize()));
+            details.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(destPrimaryDataStore.getId())));
+            destPrimaryDataStore.setDetails(details);
+
+            grantAccess(volumeInfo, destHost, destPrimaryDataStore);
+
+            try {
+                motionSrv.copyAsync(srcTemplateOnPrimary, volumeInfo, destHost, caller);
+            } finally {
+                revokeAccess(volumeInfo, destHost, destPrimaryDataStore);
+            }
+        } catch (StorageAccessException e) {
+            throw e;
+        } catch (Throwable e) {
+            s_logger.debug("Failed to copy managed template on primary storage", e);
+            String errMsg = "Failed due to " + e.toString();
+
+            try {
+                destroyAndReallocateManagedVolume(volumeInfo);
+            } catch (CloudRuntimeException ex) {
+                s_logger.warn("Failed to destroy managed volume: " + volumeInfo.getId());
+                errMsg += " : " + ex.getMessage();
+            }
+
+            VolumeApiResult result = new VolumeApiResult(volumeInfo);
+            result.setResult(errMsg);
+            future.complete(result);
+        } finally {
+            _volumeDetailsDao.removeDetail(volumeInfo.getId(), volumeDetailKey);
+
+            List<VolumeDetailVO> volumeDetails = _volumeDetailsDao.findDetails(volumeDetailKey, String.valueOf(templatePoolRef.getId()), false);
+            if (volumeDetails == null || volumeDetails.isEmpty()) {
+                revokeAccess(srcTemplateOnPrimary, destHost, destPrimaryDataStore);
+            }
+        }
+    }
+
+    private void destroyAndReallocateManagedVolume(VolumeInfo volumeInfo) {
+        if (volumeInfo == null) {
+            return;
+        }
+
+        VolumeVO volume = volDao.findById(volumeInfo.getId());
+        if (volume == null) {
+            return;
+        }
+
+        if (volume.getState() == State.Allocated) { // Possible states here: Allocated, Ready & Creating
+            return;
+        }
+
+        volumeInfo.processEvent(Event.DestroyRequested);
+
+        Volume newVol = _volumeMgr.allocateDuplicateVolume(volume, null);
+        VolumeVO newVolume = (VolumeVO) newVol;
+        newVolume.set_iScsiName(null);
+        volDao.update(newVolume.getId(), newVolume);
+        s_logger.debug("Allocated new volume: " + newVolume.getId() + " for the VM: " + volume.getInstanceId());
+
+        try {
+            AsyncCallFuture<VolumeApiResult> expungeVolumeFuture = expungeVolumeAsync(volumeInfo);
+            VolumeApiResult expungeVolumeResult = expungeVolumeFuture.get();
+            if (expungeVolumeResult.isFailed()) {
+                s_logger.warn("Failed to expunge volume: " + volumeInfo.getId() + " that was created");
+                throw new CloudRuntimeException("Failed to expunge volume: " + volumeInfo.getId() + " that was created");
+            }
+        } catch (Exception ex) {
+            if (canVolumeBeRemoved(volumeInfo.getId())) {
+                volDao.remove(volumeInfo.getId());
+            }
+            s_logger.warn("Unable to expunge volume: " + volumeInfo.getId() + " due to: " + ex.getMessage());
+            throw new CloudRuntimeException("Unable to expunge volume: " + volumeInfo.getId() + " due to: " + ex.getMessage());
+        }
+    }
+
     private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, PrimaryDataStore primaryDataStore, TemplateInfo srcTemplateInfo, Host destHost, AsyncCallFuture<VolumeApiResult> future) {
         try {
             // Create a volume on managed storage.
@@ -1061,6 +1240,7 @@
             details.put(PrimaryDataStore.MANAGED_STORE_TARGET, volumeInfo.get_iScsiName());
             details.put(PrimaryDataStore.MANAGED_STORE_TARGET_ROOT_VOLUME, volumeInfo.getName());
             details.put(PrimaryDataStore.VOLUME_SIZE, String.valueOf(volumeInfo.getSize()));
+            details.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(primaryDataStore.getId())));
 
             ChapInfo chapInfo = getChapInfo(volumeInfo, primaryDataStore);
 
@@ -1106,7 +1286,109 @@
     }
 
     @Override
-    public AsyncCallFuture<VolumeApiResult> createManagedStorageVolumeFromTemplateAsync(VolumeInfo volumeInfo, long destDataStoreId, TemplateInfo srcTemplateInfo, long destHostId) {
+    public TemplateInfo createManagedStorageTemplate(long srcTemplateId, long destDataStoreId, long destHostId) throws StorageAccessException {
+        Host destHost = _hostDao.findById(destHostId);
+        if (destHost == null) {
+            throw new CloudRuntimeException("Destination host should not be null.");
+        }
+
+        TemplateInfo srcTemplateInfo = tmplFactory.getTemplate(srcTemplateId);
+        if (srcTemplateInfo == null) {
+            throw new CloudRuntimeException("Failed to get info of template: " + srcTemplateId);
+        }
+
+        if (Storage.ImageFormat.ISO.equals(srcTemplateInfo.getFormat())) {
+            throw new CloudRuntimeException("Unsupported format: " + Storage.ImageFormat.ISO.toString() + " for managed storage template");
+        }
+
+        GlobalLock lock = null;
+        TemplateInfo templateOnPrimary = null;
+        try {
+            String templateIdManagedPoolIdLockString = "templateId:" + srcTemplateId + "managedPoolId:" + destDataStoreId;
+            lock = GlobalLock.getInternLock(templateIdManagedPoolIdLockString);
+            if (lock == null) {
+                throw new CloudRuntimeException("Unable to create managed storage template, couldn't get global lock on " + templateIdManagedPoolIdLockString);
+            }
+
+            int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600);
+            if (!lock.lock(storagePoolMaxWaitSeconds)) {
+                s_logger.debug("Unable to create managed storage template, couldn't lock on " + templateIdManagedPoolIdLockString);
+                throw new CloudRuntimeException("Unable to create managed storage template, couldn't lock on " + templateIdManagedPoolIdLockString);
+            }
+
+            PrimaryDataStore destPrimaryDataStore = dataStoreMgr.getPrimaryDataStore(destDataStoreId);
+
+            // Check if template exists on the storage pool. If not, downland and copy to managed storage pool
+            VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destDataStoreId, srcTemplateId, null);
+            if (templatePoolRef != null && templatePoolRef.getDownloadState() == Status.DOWNLOADED) {
+                return tmplFactory.getTemplate(srcTemplateId, destPrimaryDataStore);
+            }
+
+            templateOnPrimary = createManagedTemplateVolume(srcTemplateInfo, destPrimaryDataStore);
+            if (templateOnPrimary == null) {
+                throw new CloudRuntimeException("Failed to create template " + srcTemplateInfo.getUniqueName() + " on primary storage: " + destDataStoreId);
+            }
+
+            templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId(), null);
+            if (templatePoolRef == null) {
+                throw new CloudRuntimeException("Failed to find template " + srcTemplateInfo.getUniqueName() + " in storage pool " + destPrimaryDataStore.getId());
+            }
+
+            if (templatePoolRef.getDownloadState() == Status.NOT_DOWNLOADED) {
+                // Populate details which will be later read by the storage subsystem.
+                Map<String, String> details = new HashMap<>();
+
+                details.put(PrimaryDataStore.MANAGED, Boolean.TRUE.toString());
+                details.put(PrimaryDataStore.STORAGE_HOST, destPrimaryDataStore.getHostAddress());
+                details.put(PrimaryDataStore.STORAGE_PORT, String.valueOf(destPrimaryDataStore.getPort()));
+                details.put(PrimaryDataStore.MANAGED_STORE_TARGET, templateOnPrimary.getInstallPath());
+                details.put(PrimaryDataStore.MANAGED_STORE_TARGET_ROOT_VOLUME, srcTemplateInfo.getUniqueName());
+                details.put(PrimaryDataStore.REMOVE_AFTER_COPY, Boolean.TRUE.toString());
+                details.put(PrimaryDataStore.VOLUME_SIZE, String.valueOf(templateOnPrimary.getSize()));
+                details.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(destPrimaryDataStore.getId())));
+                destPrimaryDataStore.setDetails(details);
+
+                try {
+                    grantAccess(templateOnPrimary, destHost, destPrimaryDataStore);
+                } catch (Exception e) {
+                    throw new StorageAccessException("Unable to grant access to template: " + templateOnPrimary.getId() + " on host: " + destHost.getId());
+                }
+
+                templateOnPrimary.processEvent(Event.CopyingRequested);
+
+                try {
+                    //Download and copy template to the managed volume
+                    TemplateInfo templateOnPrimaryNow =  tmplFactory.getReadyBypassedTemplateOnManagedStorage(srcTemplateId, templateOnPrimary, destDataStoreId, destHostId);
+                    if (templateOnPrimaryNow == null) {
+                        s_logger.debug("Failed to prepare ready bypassed template: " + srcTemplateId + " on primary storage: " + templateOnPrimary.getId());
+                        throw new CloudRuntimeException("Failed to prepare ready bypassed template: " + srcTemplateId + " on primary storage: " + templateOnPrimary.getId());
+                    }
+                    templateOnPrimary.processEvent(Event.OperationSuccessed);
+                    return templateOnPrimaryNow;
+                } finally {
+                    revokeAccess(templateOnPrimary, destHost, destPrimaryDataStore);
+                }
+            }
+            return null;
+        } catch (StorageAccessException e) {
+            throw e;
+        } catch (Throwable e) {
+            s_logger.debug("Failed to create template on managed primary storage", e);
+            if (templateOnPrimary != null) {
+                templateOnPrimary.processEvent(Event.OperationFailed);
+            }
+
+            throw new CloudRuntimeException(e.getMessage());
+        } finally {
+            if (lock != null) {
+                lock.unlock();
+                lock.releaseRef();
+            }
+        }
+    }
+
+    @Override
+    public AsyncCallFuture<VolumeApiResult> createManagedStorageVolumeFromTemplateAsync(VolumeInfo volumeInfo, long destDataStoreId, TemplateInfo srcTemplateInfo, long destHostId) throws StorageAccessException {
         PrimaryDataStore destPrimaryDataStore = dataStoreMgr.getPrimaryDataStore(destDataStoreId);
         Host destHost = _hostDao.findById(destHostId);
 
@@ -1123,31 +1405,59 @@
         if (storageCanCloneVolume && computeSupportsVolumeClone) {
             s_logger.debug("Storage " + destDataStoreId + " can support cloning using a cached template and compute side is OK with volume cloning.");
 
-            TemplateInfo templateOnPrimary = destPrimaryDataStore.getTemplate(srcTemplateInfo.getId(), null);
+            GlobalLock lock = null;
+            TemplateInfo templateOnPrimary = null;
 
-            if (templateOnPrimary == null) {
-                templateOnPrimary = createManagedTemplateVolume(srcTemplateInfo, destPrimaryDataStore);
+            try {
+                String tmplIdManagedPoolIdLockString = "tmplId:" + srcTemplateInfo.getId() + "managedPoolId:" + destDataStoreId;
+                lock = GlobalLock.getInternLock(tmplIdManagedPoolIdLockString);
+                if (lock == null) {
+                    throw new CloudRuntimeException("Unable to create managed storage template/volume, couldn't get global lock on " + tmplIdManagedPoolIdLockString);
+                }
+
+                int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600);
+                if (!lock.lock(storagePoolMaxWaitSeconds)) {
+                    s_logger.debug("Unable to create managed storage template/volume, couldn't lock on " + tmplIdManagedPoolIdLockString);
+                    throw new CloudRuntimeException("Unable to create managed storage template/volume, couldn't lock on " + tmplIdManagedPoolIdLockString);
+                }
+
+                templateOnPrimary = destPrimaryDataStore.getTemplate(srcTemplateInfo.getId(), null);
 
                 if (templateOnPrimary == null) {
-                    throw new CloudRuntimeException("Failed to create template " + srcTemplateInfo.getUniqueName() + " on primary storage: " + destDataStoreId);
+                    templateOnPrimary = createManagedTemplateVolume(srcTemplateInfo, destPrimaryDataStore);
+
+                    if (templateOnPrimary == null) {
+                        throw new CloudRuntimeException("Failed to create template " + srcTemplateInfo.getUniqueName() + " on primary storage: " + destDataStoreId);
+                    }
+                }
+
+                // Copy the template to the template volume.
+                VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId(), null);
+
+                if (templatePoolRef == null) {
+                    throw new CloudRuntimeException("Failed to find template " + srcTemplateInfo.getUniqueName() + " in storage pool " + destPrimaryDataStore.getId());
+                }
+
+                if (templatePoolRef.getDownloadState() == Status.NOT_DOWNLOADED) {
+                    copyTemplateToManagedTemplateVolume(srcTemplateInfo, templateOnPrimary, templatePoolRef, destPrimaryDataStore, destHost);
+                }
+            } finally {
+                if (lock != null) {
+                    lock.unlock();
+                    lock.releaseRef();
                 }
             }
 
-            // Copy the template to the template volume.
-            VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId(), null);
+            if (destPrimaryDataStore.getPoolType() != StoragePoolType.PowerFlex) {
+                // We have a template on primary storage. Clone it to new volume.
+                s_logger.debug("Creating a clone from template on primary storage " + destDataStoreId);
 
-            if (templatePoolRef == null) {
-                throw new CloudRuntimeException("Failed to find template " + srcTemplateInfo.getUniqueName() + " in storage pool " + destPrimaryDataStore.getId());
+                createManagedVolumeCloneTemplateAsync(volumeInfo, templateOnPrimary, destPrimaryDataStore, future);
+            } else {
+                // We have a template on PowerFlex primary storage. Create new volume and copy to it.
+                s_logger.debug("Copying the template to the volume on primary storage");
+                createManagedVolumeCopyManagedTemplateAsync(volumeInfo, destPrimaryDataStore, templateOnPrimary, destHost, future);
             }
-
-            if (templatePoolRef.getDownloadState() == Status.NOT_DOWNLOADED) {
-                copyTemplateToManagedTemplateVolume(srcTemplateInfo, templateOnPrimary, templatePoolRef, destPrimaryDataStore, destHost);
-            }
-
-            // We have a template on primary storage. Clone it to new volume.
-            s_logger.debug("Creating a clone from template on primary storage " + destDataStoreId);
-
-            createManagedVolumeCloneTemplateAsync(volumeInfo, templateOnPrimary, destPrimaryDataStore, future);
         } else {
             s_logger.debug("Primary storage does not support cloning or no support for UUID resigning on the host side; copying the template normally");
 
@@ -1300,6 +1610,8 @@
         // part  here to make sure the credentials do not get stored in the db unencrypted.
         if (pool.getPoolType() == StoragePoolType.SMB && folder != null && folder.contains("?")) {
             folder = folder.substring(0, folder.indexOf("?"));
+        } else  if (pool.getPoolType() == StoragePoolType.PowerFlex) {
+            folder = volume.getFolder();
         }
 
         VolumeVO newVol = new VolumeVO(volume);
@@ -1309,6 +1621,7 @@
         newVol.setFolder(folder);
         newVol.setPodId(pool.getPodId());
         newVol.setPoolId(pool.getId());
+        newVol.setPoolType(pool.getPoolType());
         newVol.setLastPoolId(lastPoolId);
         newVol.setPodId(pool.getPodId());
         return volDao.persist(newVol);
@@ -1325,7 +1638,6 @@
             this.destVolume = destVolume;
             this.future = future;
         }
-
     }
 
     protected AsyncCallFuture<VolumeApiResult> copyVolumeFromImageToPrimary(VolumeInfo srcVolume, DataStore destStore) {
@@ -1435,8 +1747,8 @@
 
     @Override
     public AsyncCallFuture<VolumeApiResult> copyVolume(VolumeInfo srcVolume, DataStore destStore) {
+        DataStore srcStore = srcVolume.getDataStore();
         if (s_logger.isDebugEnabled()) {
-            DataStore srcStore = srcVolume.getDataStore();
             String srcRole = (srcStore != null && srcStore.getRole() != null ? srcVolume.getDataStore().getRole().toString() : "<unknown role>");
 
             String msg = String.format("copying %s(id=%d, role=%s) to %s (id=%d, role=%s)"
@@ -1457,6 +1769,11 @@
             return copyVolumeFromPrimaryToImage(srcVolume, destStore);
         }
 
+        if (srcStore.getRole() == DataStoreRole.Primary && destStore.getRole() == DataStoreRole.Primary && ((PrimaryDataStore) destStore).isManaged() &&
+                requiresNewManagedVolumeInDestStore((PrimaryDataStore) srcStore, (PrimaryDataStore) destStore)) {
+            return copyManagedVolume(srcVolume, destStore);
+        }
+
         // OfflineVmwareMigration: aren't we missing secondary to secondary in this logic?
 
         AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
@@ -1502,6 +1819,14 @@
                 destVolume.processEvent(Event.MigrationCopyFailed);
                 srcVolume.processEvent(Event.OperationFailed);
                 destroyVolume(destVolume.getId());
+                if (destVolume.getStoragePoolType() == StoragePoolType.PowerFlex) {
+                    s_logger.info("Dest volume " + destVolume.getId() + " can be removed");
+                    destVolume.processEvent(Event.ExpungeRequested);
+                    destVolume.processEvent(Event.OperationSuccessed);
+                    volDao.remove(destVolume.getId());
+                    future.complete(res);
+                    return null;
+                }
                 destVolume = volFactory.getVolume(destVolume.getId());
                 AsyncCallFuture<VolumeApiResult> destroyFuture = expungeVolumeAsync(destVolume);
                 destroyFuture.get();
@@ -1512,6 +1837,14 @@
                 volDao.updateUuid(srcVolume.getId(), destVolume.getId());
                 try {
                     destroyVolume(srcVolume.getId());
+                    if (srcVolume.getStoragePoolType() == StoragePoolType.PowerFlex) {
+                        s_logger.info("Src volume " + srcVolume.getId() + " can be removed");
+                        srcVolume.processEvent(Event.ExpungeRequested);
+                        srcVolume.processEvent(Event.OperationSuccessed);
+                        volDao.remove(srcVolume.getId());
+                        future.complete(res);
+                        return null;
+                    }
                     srcVolume = volFactory.getVolume(srcVolume.getId());
                     AsyncCallFuture<VolumeApiResult> destroyFuture = expungeVolumeAsync(srcVolume);
                     // If volume destroy fails, this could be because of vdi is still in use state, so wait and retry.
@@ -1534,6 +1867,213 @@
         return null;
     }
 
+    private class CopyManagedVolumeContext<T> extends AsyncRpcContext<T> {
+        final VolumeInfo srcVolume;
+        final VolumeInfo destVolume;
+        final Host host;
+        final AsyncCallFuture<VolumeApiResult> future;
+
+        public CopyManagedVolumeContext(AsyncCompletionCallback<T> callback, AsyncCallFuture<VolumeApiResult> future, VolumeInfo srcVolume, VolumeInfo destVolume, Host host) {
+            super(callback);
+            this.srcVolume = srcVolume;
+            this.destVolume = destVolume;
+            this.host = host;
+            this.future = future;
+        }
+    }
+
+    private AsyncCallFuture<VolumeApiResult> copyManagedVolume(VolumeInfo srcVolume, DataStore destStore) {
+        AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
+        VolumeApiResult res = new VolumeApiResult(srcVolume);
+        try {
+            if (!snapshotMgr.canOperateOnVolume(srcVolume)) {
+                s_logger.debug("There are snapshots creating for this volume, can not move this volume");
+                res.setResult("There are snapshots creating for this volume, can not move this volume");
+                future.complete(res);
+                return future;
+            }
+
+            if (snapshotMgr.backedUpSnapshotsExistsForVolume(srcVolume)) {
+                s_logger.debug("There are backed up snapshots for this volume, can not move.");
+                res.setResult("[UNSUPPORTED] There are backed up snapshots for this volume, can not move. Please try again after removing them.");
+                future.complete(res);
+                return future;
+            }
+
+            List<Long> poolIds = new ArrayList<Long>();
+            poolIds.add(srcVolume.getPoolId());
+            poolIds.add(destStore.getId());
+
+            Host hostWithPoolsAccess = _storageMgr.findUpAndEnabledHostWithAccessToStoragePools(poolIds);
+            if (hostWithPoolsAccess == null) {
+                s_logger.debug("No host(s) available with pool access, can not move this volume");
+                res.setResult("No host(s) available with pool access, can not move this volume");
+                future.complete(res);
+                return future;
+            }
+
+            VolumeVO destVol = duplicateVolumeOnAnotherStorage(srcVolume, (StoragePool)destStore);
+            VolumeInfo destVolume = volFactory.getVolume(destVol.getId(), destStore);
+
+            // Create a volume on managed storage.
+            AsyncCallFuture<VolumeApiResult> createVolumeFuture = createVolumeAsync(destVolume, destStore);
+            VolumeApiResult createVolumeResult = createVolumeFuture.get();
+            if (createVolumeResult.isFailed()) {
+                throw new CloudRuntimeException("Creation of a dest volume failed: " + createVolumeResult.getResult());
+            }
+
+            // Refresh the volume info from the DB.
+            destVolume = volFactory.getVolume(destVolume.getId(), destStore);
+
+            PrimaryDataStore srcPrimaryDataStore = (PrimaryDataStore) srcVolume.getDataStore();
+            if (srcPrimaryDataStore.isManaged()) {
+                Map<String, String> srcPrimaryDataStoreDetails = new HashMap<String, String>();
+                srcPrimaryDataStoreDetails.put(PrimaryDataStore.MANAGED, Boolean.TRUE.toString());
+                srcPrimaryDataStoreDetails.put(PrimaryDataStore.STORAGE_HOST, srcPrimaryDataStore.getHostAddress());
+                srcPrimaryDataStoreDetails.put(PrimaryDataStore.STORAGE_PORT, String.valueOf(srcPrimaryDataStore.getPort()));
+                srcPrimaryDataStoreDetails.put(PrimaryDataStore.MANAGED_STORE_TARGET, srcVolume.get_iScsiName());
+                srcPrimaryDataStoreDetails.put(PrimaryDataStore.MANAGED_STORE_TARGET_ROOT_VOLUME, srcVolume.getName());
+                srcPrimaryDataStoreDetails.put(PrimaryDataStore.VOLUME_SIZE, String.valueOf(srcVolume.getSize()));
+                srcPrimaryDataStoreDetails.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(srcPrimaryDataStore.getId())));
+                srcPrimaryDataStore.setDetails(srcPrimaryDataStoreDetails);
+                grantAccess(srcVolume, hostWithPoolsAccess, srcVolume.getDataStore());
+            }
+
+            PrimaryDataStore destPrimaryDataStore = (PrimaryDataStore) destStore;
+            Map<String, String> destPrimaryDataStoreDetails = new HashMap<String, String>();
+            destPrimaryDataStoreDetails.put(PrimaryDataStore.MANAGED, Boolean.TRUE.toString());
+            destPrimaryDataStoreDetails.put(PrimaryDataStore.STORAGE_HOST, destPrimaryDataStore.getHostAddress());
+            destPrimaryDataStoreDetails.put(PrimaryDataStore.STORAGE_PORT, String.valueOf(destPrimaryDataStore.getPort()));
+            destPrimaryDataStoreDetails.put(PrimaryDataStore.MANAGED_STORE_TARGET, destVolume.get_iScsiName());
+            destPrimaryDataStoreDetails.put(PrimaryDataStore.MANAGED_STORE_TARGET_ROOT_VOLUME, destVolume.getName());
+            destPrimaryDataStoreDetails.put(PrimaryDataStore.VOLUME_SIZE, String.valueOf(destVolume.getSize()));
+            destPrimaryDataStoreDetails.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(destPrimaryDataStore.getId())));
+            destPrimaryDataStore.setDetails(destPrimaryDataStoreDetails);
+
+            grantAccess(destVolume, hostWithPoolsAccess, destStore);
+
+            destVolume.processEvent(Event.CreateRequested);
+            srcVolume.processEvent(Event.MigrationRequested);
+
+            CopyManagedVolumeContext<VolumeApiResult> context = new CopyManagedVolumeContext<VolumeApiResult>(null, future, srcVolume, destVolume, hostWithPoolsAccess);
+            AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+            caller.setCallback(caller.getTarget().copyManagedVolumeCallBack(null, null)).setContext(context);
+
+            motionSrv.copyAsync(srcVolume, destVolume, hostWithPoolsAccess, caller);
+        } catch (Exception e) {
+            s_logger.error("Copy to managed volume failed due to: " + e);
+            if(s_logger.isDebugEnabled()) {
+                s_logger.debug("Copy to managed volume failed.", e);
+            }
+            res.setResult(e.toString());
+            future.complete(res);
+        }
+
+        return future;
+    }
+
+    protected Void copyManagedVolumeCallBack(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback, CopyManagedVolumeContext<VolumeApiResult> context) {
+        VolumeInfo srcVolume = context.srcVolume;
+        VolumeInfo destVolume = context.destVolume;
+        Host host = context.host;
+        CopyCommandResult result = callback.getResult();
+        AsyncCallFuture<VolumeApiResult> future = context.future;
+        VolumeApiResult res = new VolumeApiResult(destVolume);
+
+        try {
+            if (srcVolume.getDataStore() != null && ((PrimaryDataStore) srcVolume.getDataStore()).isManaged()) {
+                revokeAccess(srcVolume, host, srcVolume.getDataStore());
+            }
+            revokeAccess(destVolume, host, destVolume.getDataStore());
+
+            if (result.isFailed()) {
+                res.setResult(result.getResult());
+                destVolume.processEvent(Event.MigrationCopyFailed);
+                srcVolume.processEvent(Event.OperationFailed);
+                try {
+                    destroyVolume(destVolume.getId());
+                    destVolume = volFactory.getVolume(destVolume.getId());
+                    AsyncCallFuture<VolumeApiResult> destVolumeDestroyFuture = expungeVolumeAsync(destVolume);
+                    destVolumeDestroyFuture.get();
+                    // If dest managed volume destroy fails, wait and retry.
+                    if (destVolumeDestroyFuture.get().isFailed()) {
+                        Thread.sleep(5 * 1000);
+                        destVolumeDestroyFuture = expungeVolumeAsync(destVolume);
+                        destVolumeDestroyFuture.get();
+                    }
+                    future.complete(res);
+                } catch (Exception e) {
+                    s_logger.debug("failed to clean up managed volume on storage", e);
+                }
+            } else {
+                srcVolume.processEvent(Event.OperationSuccessed);
+                destVolume.processEvent(Event.MigrationCopySucceeded, result.getAnswer());
+                volDao.updateUuid(srcVolume.getId(), destVolume.getId());
+                try {
+                    destroyVolume(srcVolume.getId());
+                    srcVolume = volFactory.getVolume(srcVolume.getId());
+                    AsyncCallFuture<VolumeApiResult> srcVolumeDestroyFuture = expungeVolumeAsync(srcVolume);
+                    // If src volume destroy fails, wait and retry.
+                    if (srcVolumeDestroyFuture.get().isFailed()) {
+                        Thread.sleep(5 * 1000);
+                        srcVolumeDestroyFuture = expungeVolumeAsync(srcVolume);
+                        srcVolumeDestroyFuture.get();
+                    }
+                    future.complete(res);
+                } catch (Exception e) {
+                    s_logger.debug("failed to clean up volume on storage", e);
+                }
+            }
+        } catch (Exception e) {
+            s_logger.debug("Failed to process copy managed volume callback", e);
+            res.setResult(e.toString());
+            future.complete(res);
+        }
+
+        return null;
+    }
+
+    private boolean requiresNewManagedVolumeInDestStore(PrimaryDataStore srcDataStore, PrimaryDataStore destDataStore) {
+        if (srcDataStore == null || destDataStore == null) {
+            s_logger.warn("Unable to check for new volume, either src or dest pool is null");
+            return false;
+        }
+
+        if (srcDataStore.getPoolType() == StoragePoolType.PowerFlex && destDataStore.getPoolType() == StoragePoolType.PowerFlex) {
+            if (srcDataStore.getId() == destDataStore.getId()) {
+                return false;
+            }
+
+            final String STORAGE_POOL_SYSTEM_ID = "powerflex.storagepool.system.id";
+            String srcPoolSystemId = null;
+            StoragePoolDetailVO srcPoolSystemIdDetail = _storagePoolDetailsDao.findDetail(srcDataStore.getId(), STORAGE_POOL_SYSTEM_ID);
+            if (srcPoolSystemIdDetail != null) {
+                srcPoolSystemId = srcPoolSystemIdDetail.getValue();
+            }
+
+            String destPoolSystemId = null;
+            StoragePoolDetailVO destPoolSystemIdDetail = _storagePoolDetailsDao.findDetail(destDataStore.getId(), STORAGE_POOL_SYSTEM_ID);
+            if (destPoolSystemIdDetail != null) {
+                destPoolSystemId = destPoolSystemIdDetail.getValue();
+            }
+
+            if (Strings.isNullOrEmpty(srcPoolSystemId) || Strings.isNullOrEmpty(destPoolSystemId)) {
+                s_logger.warn("PowerFlex src pool: " + srcDataStore.getId() + " or dest pool: " + destDataStore.getId() +
+                        " storage instance details are not available");
+                return false;
+            }
+
+            if (!srcPoolSystemId.equals(destPoolSystemId)) {
+                s_logger.debug("PowerFlex src pool: " + srcDataStore.getId() + " and dest pool: "  + destDataStore.getId() +
+                        " belongs to different storage instances, create new managed volume");
+                return true;
+            }
+        }
+
+        // New volume not required for all other cases (address any cases required in future)
+        return false;
+    }
+
     private class MigrateVolumeContext<T> extends AsyncRpcContext<T> {
         final VolumeInfo srcVolume;
         final VolumeInfo destVolume;
@@ -1569,7 +2109,7 @@
             caller.setCallback(caller.getTarget().migrateVolumeCallBack(null, null)).setContext(context);
             motionSrv.copyAsync(srcVolume, destVolume, caller);
         } catch (Exception e) {
-            s_logger.debug("Failed to copy volume", e);
+            s_logger.debug("Failed to migrate volume", e);
             res.setResult(e.toString());
             future.complete(res);
         }
@@ -1588,6 +2128,10 @@
                 future.complete(res);
             } else {
                 srcVolume.processEvent(Event.OperationSuccessed);
+                if (srcVolume.getStoragePoolType() == StoragePoolType.PowerFlex) {
+                    future.complete(res);
+                    return null;
+                }
                 snapshotMgr.cleanupSnapshotsByVolume(srcVolume.getId());
                 future.complete(res);
             }
@@ -2139,4 +2683,4 @@
             volDao.remove(vol.getId());
         }
     }
-}
\ No newline at end of file
+}
diff --git a/framework/agent-lb/pom.xml b/framework/agent-lb/pom.xml
index ed58da7..3f4008c 100644
--- a/framework/agent-lb/pom.xml
+++ b/framework/agent-lb/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>cloudstack-framework</artifactId>
         <groupId>org.apache.cloudstack</groupId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/framework/ca/pom.xml b/framework/ca/pom.xml
index 2262e7e..30f0178 100644
--- a/framework/ca/pom.xml
+++ b/framework/ca/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/framework/cluster/pom.xml b/framework/cluster/pom.xml
index 0af8466..419e6a3 100644
--- a/framework/cluster/pom.xml
+++ b/framework/cluster/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/config/pom.xml b/framework/config/pom.xml
index aded63b..44b80a2 100644
--- a/framework/config/pom.xml
+++ b/framework/config/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/db/pom.xml b/framework/db/pom.xml
index 4142ba2..79953f9 100644
--- a/framework/db/pom.xml
+++ b/framework/db/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/direct-download/pom.xml b/framework/direct-download/pom.xml
index 4f2719e..3fd1fe3 100644
--- a/framework/direct-download/pom.xml
+++ b/framework/direct-download/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>cloudstack-framework</artifactId>
         <groupId>org.apache.cloudstack</groupId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
\ No newline at end of file
diff --git a/framework/direct-download/src/main/java/org/apache/cloudstack/framework/agent/direct/download/DirectDownloadService.java b/framework/direct-download/src/main/java/org/apache/cloudstack/framework/agent/direct/download/DirectDownloadService.java
index ed7bbd7..983f935 100644
--- a/framework/direct-download/src/main/java/org/apache/cloudstack/framework/agent/direct/download/DirectDownloadService.java
+++ b/framework/direct-download/src/main/java/org/apache/cloudstack/framework/agent/direct/download/DirectDownloadService.java
@@ -33,4 +33,9 @@
      * Upload a stored certificate on database with id 'certificateId' to host with id 'hostId'
      */
     boolean uploadCertificate(long certificateId, long hostId);
+
+    /**
+     * Sync the stored certificates to host with id 'hostId'
+     */
+    boolean syncCertificatesToHost(long hostId, long zoneId);
 }
diff --git a/framework/events/pom.xml b/framework/events/pom.xml
index 284f92d..f4cb89a 100644
--- a/framework/events/pom.xml
+++ b/framework/events/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/ipc/pom.xml b/framework/ipc/pom.xml
index 7fd681b..d7cc45b 100644
--- a/framework/ipc/pom.xml
+++ b/framework/ipc/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/jobs/pom.xml b/framework/jobs/pom.xml
index 401c7d1..bd86e68 100644
--- a/framework/jobs/pom.xml
+++ b/framework/jobs/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/managed-context/pom.xml b/framework/managed-context/pom.xml
index 29f36aa..e55223f 100644
--- a/framework/managed-context/pom.xml
+++ b/framework/managed-context/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/pom.xml b/framework/pom.xml
index e2edbe0..8b4025e 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <build>
         <plugins>
diff --git a/framework/quota/pom.xml b/framework/quota/pom.xml
index 35a9cc0..a6a3b47 100644
--- a/framework/quota/pom.xml
+++ b/framework/quota/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
index 942aeb9..189a097 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
@@ -62,6 +62,7 @@
 import com.sun.mail.smtp.SMTPMessage;
 import com.sun.mail.smtp.SMTPSSLTransport;
 import com.sun.mail.smtp.SMTPTransport;
+import org.apache.commons.lang3.StringUtils;
 
 @Component
 public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertManager {
@@ -114,8 +115,9 @@
         String smtpUsername = configs.get(QuotaConfig.QuotaSmtpUser.key());
         String smtpPassword = configs.get(QuotaConfig.QuotaSmtpPassword.key());
         String emailSender = configs.get(QuotaConfig.QuotaSmtpSender.key());
+        String smtpEnabledSecurityProtocols = configs.get(QuotaConfig.QuotaSmtpEnabledSecurityProtocols.key());
         _lockAccountEnforcement = "true".equalsIgnoreCase(configs.get(QuotaConfig.QuotaEnableEnforcement.key()));
-        _emailQuotaAlert = new EmailQuotaAlert(smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, _smtpDebug);
+        _emailQuotaAlert = new EmailQuotaAlert(smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpEnabledSecurityProtocols, _smtpDebug);
 
         return true;
     }
@@ -341,7 +343,7 @@
         private final String _smtpPassword;
         private final String _emailSender;
 
-        public EmailQuotaAlert(String smtpHost, int smtpPort, boolean smtpUseAuth, final String smtpUsername, final String smtpPassword, String emailSender, boolean smtpDebug) {
+        public EmailQuotaAlert(String smtpHost, int smtpPort, boolean smtpUseAuth, final String smtpUsername, final String smtpPassword, String emailSender, String smtpEnabledSecurityProtocols, boolean smtpDebug) {
             _smtpHost = smtpHost;
             _smtpPort = smtpPort;
             _smtpUseAuth = smtpUseAuth;
@@ -365,6 +367,10 @@
                     smtpProps.put("mail.smtps.user", smtpUsername);
                 }
 
+                if (StringUtils.isNotBlank(smtpEnabledSecurityProtocols)) {
+                    smtpProps.put("mail.smtp.ssl.protocols", smtpEnabledSecurityProtocols);
+                }
+
                 if (!Strings.isNullOrEmpty(smtpUsername) && !Strings.isNullOrEmpty(smtpPassword)) {
                     _smtpSession = Session.getInstance(smtpProps, new Authenticator() {
                         @Override
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java
index 73c9a80..14de1ce 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java
@@ -51,6 +51,9 @@
     public static final ConfigKey<String> QuotaSmtpSender = new ConfigKey<String>("Advanced", String.class, "quota.usage.smtp.sender", "",
             "Sender of quota alert email (will be in the From header of the email)", true);
 
+    public static final ConfigKey<String> QuotaSmtpEnabledSecurityProtocols = new ConfigKey<String>("Advanced", String.class, "quota.usage.smtp.enabledSecurityProtocols", "",
+            "White-space separated security protocols; ex: \"TLSv1 TLSv1.1\". Supported protocols: SSLv2Hello, SSLv3, TLSv1, TLSv1.1 and TLSv1.2", true);
+
     enum QuotaEmailTemplateTypes {
         QUOTA_LOW, QUOTA_EMPTY, QUOTA_UNLOCK_ACCOUNT, QUOTA_STATEMENT
     }
diff --git a/framework/rest/pom.xml b/framework/rest/pom.xml
index a43d57b..09577b4 100644
--- a/framework/rest/pom.xml
+++ b/framework/rest/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>cloud-framework-rest</artifactId>
diff --git a/framework/security/pom.xml b/framework/security/pom.xml
index 0216ee9..929643d 100644
--- a/framework/security/pom.xml
+++ b/framework/security/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-framework</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/spring/lifecycle/pom.xml b/framework/spring/lifecycle/pom.xml
index a93c76e..8725ed7 100644
--- a/framework/spring/lifecycle/pom.xml
+++ b/framework/spring/lifecycle/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/spring/module/pom.xml b/framework/spring/module/pom.xml
index b680d80..8c38c8b 100644
--- a/framework/spring/module/pom.xml
+++ b/framework/spring/module/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/packaging/build-deb.sh b/packaging/build-deb.sh
index c13fb60..3ec3ee1 100755
--- a/packaging/build-deb.sh
+++ b/packaging/build-deb.sh
@@ -43,6 +43,7 @@
 Optional arguments:
    -b, --brand string                      Set branding to be used in package name (it will override any branding string in POM version)
    -T, --use-timestamp                     Use epoch timestamp instead of SNAPSHOT in the package name (if not provided, use "SNAPSHOT")
+   -o, --output-directory                  The output directory of packages
 
 Other arguments:
    -h, --help                              Display this help message and exit
@@ -84,6 +85,16 @@
             fi
             ;;
 
+        -o | --output-directory)
+            if [ -n "$OUTPUT_DIR" ]; then
+                echo "ERROR: you have already entered value for -o, --output-directory"
+                exit 1
+            else
+                OUTPUT_DIR=$2
+                shift 2
+            fi
+            ;;
+
         -*|*)
             echo "ERROR: no such option $1. -h or --help for help"
             exit 1
@@ -96,7 +107,7 @@
     exit 1
 fi
 
-NOW="$(date +%s)"
+NOW="$(date +'%Y%m%dT%H%M%S')"
 PWD=$(cd $(dirname "$0") && pwd -P)
 cd $PWD/../
 
@@ -139,7 +150,7 @@
     fi
 fi
 
-/bin/cp debian/changelog /tmp/changelog.orig
+/bin/cp debian/changelog debian/changelog.$NOW
 
 dch -b -v "${VERSION}~${DISTCODE}" -u low -m "Apache CloudStack Release ${VERSION}"
 sed -i '0,/ UNRELEASED;/s// unstable;/g' debian/changelog
@@ -147,7 +158,13 @@
 dpkg-checkbuilddeps
 dpkg-buildpackage -uc -us -b
 
-/bin/mv /tmp/changelog.orig debian/changelog
+/bin/mv debian/changelog.$NOW debian/changelog
+
+if [ -n "$OUTPUT_DIR" ];then
+    mkdir -p "$OUTPUT_DIR"
+    mv ../*${VERSION}* "$OUTPUT_DIR"
+    echo "====== CloudStack packages have been moved to $OUTPUT_DIR ======"
+fi
 
 if [ "$USE_TIMESTAMP" == "true" ]; then
     (cd $PWD; git reset --hard)
diff --git a/plugins/acl/dynamic-role-based/pom.xml b/plugins/acl/dynamic-role-based/pom.xml
index 3ba0b67..c9b3cd8 100644
--- a/plugins/acl/dynamic-role-based/pom.xml
+++ b/plugins/acl/dynamic-role-based/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/acl/project-role-based/pom.xml b/plugins/acl/project-role-based/pom.xml
index 4618683..df785e8 100644
--- a/plugins/acl/project-role-based/pom.xml
+++ b/plugins/acl/project-role-based/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/acl/static-role-based/pom.xml b/plugins/acl/static-role-based/pom.xml
index 6e7f00c..11fd21f 100644
--- a/plugins/acl/static-role-based/pom.xml
+++ b/plugins/acl/static-role-based/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/affinity-group-processors/explicit-dedication/pom.xml b/plugins/affinity-group-processors/explicit-dedication/pom.xml
index ab306ea..177226a 100644
--- a/plugins/affinity-group-processors/explicit-dedication/pom.xml
+++ b/plugins/affinity-group-processors/explicit-dedication/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/affinity-group-processors/host-affinity/pom.xml b/plugins/affinity-group-processors/host-affinity/pom.xml
index a71ff7a..5087644 100644
--- a/plugins/affinity-group-processors/host-affinity/pom.xml
+++ b/plugins/affinity-group-processors/host-affinity/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/affinity-group-processors/host-anti-affinity/pom.xml b/plugins/affinity-group-processors/host-anti-affinity/pom.xml
index a54c594..929ffac 100644
--- a/plugins/affinity-group-processors/host-anti-affinity/pom.xml
+++ b/plugins/affinity-group-processors/host-anti-affinity/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/alert-handlers/snmp-alerts/pom.xml b/plugins/alert-handlers/snmp-alerts/pom.xml
index c25de15..46ec585 100644
--- a/plugins/alert-handlers/snmp-alerts/pom.xml
+++ b/plugins/alert-handlers/snmp-alerts/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>cloudstack-plugins</artifactId>
         <groupId>org.apache.cloudstack</groupId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/alert-handlers/syslog-alerts/pom.xml b/plugins/alert-handlers/syslog-alerts/pom.xml
index 50cb3f4..2c314e4 100644
--- a/plugins/alert-handlers/syslog-alerts/pom.xml
+++ b/plugins/alert-handlers/syslog-alerts/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>cloudstack-plugins</artifactId>
         <groupId>org.apache.cloudstack</groupId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/api/discovery/pom.xml b/plugins/api/discovery/pom.xml
index d86a928..1a11c8f 100644
--- a/plugins/api/discovery/pom.xml
+++ b/plugins/api/discovery/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/api/rate-limit/pom.xml b/plugins/api/rate-limit/pom.xml
index 8bd6c56..278f4ee 100644
--- a/plugins/api/rate-limit/pom.xml
+++ b/plugins/api/rate-limit/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/plugins/api/solidfire-intg-test/pom.xml b/plugins/api/solidfire-intg-test/pom.xml
index cd0011c..013292d 100644
--- a/plugins/api/solidfire-intg-test/pom.xml
+++ b/plugins/api/solidfire-intg-test/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/api/vmware-sioc/pom.xml b/plugins/api/vmware-sioc/pom.xml
index e50f36e..fd4147b 100644
--- a/plugins/api/vmware-sioc/pom.xml
+++ b/plugins/api/vmware-sioc/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/backup/dummy/pom.xml b/plugins/backup/dummy/pom.xml
index d309b6c..a15eeb6 100644
--- a/plugins/backup/dummy/pom.xml
+++ b/plugins/backup/dummy/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>cloudstack-plugins</artifactId>
         <groupId>org.apache.cloudstack</groupId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/backup/veeam/pom.xml b/plugins/backup/veeam/pom.xml
index 4fab8af..0c703a4 100644
--- a/plugins/backup/veeam/pom.xml
+++ b/plugins/backup/veeam/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <artifactId>cloudstack-plugins</artifactId>
     <groupId>org.apache.cloudstack</groupId>
-    <version>4.15.1.0-SNAPSHOT</version>
+    <version>4.16.0.0-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
diff --git a/plugins/ca/root-ca/pom.xml b/plugins/ca/root-ca/pom.xml
index 94f09fa..fefe865 100644
--- a/plugins/ca/root-ca/pom.xml
+++ b/plugins/ca/root-ca/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/database/mysql-ha/pom.xml b/plugins/database/mysql-ha/pom.xml
index 9a86e57..a582bf0 100644
--- a/plugins/database/mysql-ha/pom.xml
+++ b/plugins/database/mysql-ha/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/database/quota/pom.xml b/plugins/database/quota/pom.xml
index c9e9f75..78c3fa4 100644
--- a/plugins/database/quota/pom.xml
+++ b/plugins/database/quota/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
index 7ac5655..80d69b9 100644
--- a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
+++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
@@ -137,7 +137,7 @@
     @Override
     public ConfigKey<?>[] getConfigKeys() {
         return new ConfigKey<?>[] {QuotaPluginEnabled, QuotaEnableEnforcement, QuotaCurrencySymbol, QuotaStatementPeriod, QuotaSmtpHost, QuotaSmtpPort, QuotaSmtpTimeout,
-                QuotaSmtpUser, QuotaSmtpPassword, QuotaSmtpAuthType, QuotaSmtpSender};
+                QuotaSmtpUser, QuotaSmtpPassword, QuotaSmtpAuthType, QuotaSmtpSender, QuotaSmtpEnabledSecurityProtocols};
     }
 
     @Override
diff --git a/plugins/dedicated-resources/pom.xml b/plugins/dedicated-resources/pom.xml
index 3da0f29..699a735 100644
--- a/plugins/dedicated-resources/pom.xml
+++ b/plugins/dedicated-resources/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/deployment-planners/implicit-dedication/pom.xml b/plugins/deployment-planners/implicit-dedication/pom.xml
index ec79c99..835e2fc 100644
--- a/plugins/deployment-planners/implicit-dedication/pom.xml
+++ b/plugins/deployment-planners/implicit-dedication/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/deployment-planners/user-concentrated-pod/pom.xml b/plugins/deployment-planners/user-concentrated-pod/pom.xml
index edcfb59..01c27c5 100644
--- a/plugins/deployment-planners/user-concentrated-pod/pom.xml
+++ b/plugins/deployment-planners/user-concentrated-pod/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/deployment-planners/user-dispersing/pom.xml b/plugins/deployment-planners/user-dispersing/pom.xml
index 726a613..33d58ec 100644
--- a/plugins/deployment-planners/user-dispersing/pom.xml
+++ b/plugins/deployment-planners/user-dispersing/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/event-bus/inmemory/pom.xml b/plugins/event-bus/inmemory/pom.xml
index 6f3b2bd..f0be202 100644
--- a/plugins/event-bus/inmemory/pom.xml
+++ b/plugins/event-bus/inmemory/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/event-bus/kafka/pom.xml b/plugins/event-bus/kafka/pom.xml
index 4f8bdf4..5d218d1 100644
--- a/plugins/event-bus/kafka/pom.xml
+++ b/plugins/event-bus/kafka/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/event-bus/rabbitmq/pom.xml b/plugins/event-bus/rabbitmq/pom.xml
index a171ecf..de97f39 100644
--- a/plugins/event-bus/rabbitmq/pom.xml
+++ b/plugins/event-bus/rabbitmq/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/ha-planners/skip-heurestics/pom.xml b/plugins/ha-planners/skip-heurestics/pom.xml
index 3a59ec4..4ee0718 100644
--- a/plugins/ha-planners/skip-heurestics/pom.xml
+++ b/plugins/ha-planners/skip-heurestics/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/host-allocators/random/pom.xml b/plugins/host-allocators/random/pom.xml
index afe1a0a..d8e653e 100644
--- a/plugins/host-allocators/random/pom.xml
+++ b/plugins/host-allocators/random/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/hypervisors/baremetal/pom.xml b/plugins/hypervisors/baremetal/pom.xml
index a14332c..cf4dd35 100755
--- a/plugins/hypervisors/baremetal/pom.xml
+++ b/plugins/hypervisors/baremetal/pom.xml
@@ -22,7 +22,7 @@
     <parent>

         <groupId>org.apache.cloudstack</groupId>

         <artifactId>cloudstack-plugins</artifactId>

-        <version>4.15.1.0-SNAPSHOT</version>

+        <version>4.16.0.0-SNAPSHOT</version>

         <relativePath>../../pom.xml</relativePath>

     </parent>

     <artifactId>cloud-plugin-hypervisor-baremetal</artifactId>

diff --git a/plugins/hypervisors/hyperv/pom.xml b/plugins/hypervisors/hyperv/pom.xml
index b8eb356..36ce1ba 100644
--- a/plugins/hypervisors/hyperv/pom.xml
+++ b/plugins/hypervisors/hyperv/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <properties>
diff --git a/plugins/hypervisors/kvm/pom.xml b/plugins/hypervisors/kvm/pom.xml
index e2e14f8..394acdc 100644
--- a/plugins/hypervisors/kvm/pom.xml
+++ b/plugins/hypervisors/kvm/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -72,6 +72,12 @@
             <artifactId>jna-platform</artifactId>
             <version>${cs.jna.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-plugin-storage-volume-scaleio</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 4cb356c..cfa5474 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -46,9 +46,7 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceAgentExecutor;
-import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceExecutor;
-import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceServiceExecutor;
+import org.apache.cloudstack.storage.configdrive.ConfigDrive;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
@@ -91,6 +89,7 @@
 import com.cloud.agent.api.PingCommand;
 import com.cloud.agent.api.PingRoutingCommand;
 import com.cloud.agent.api.PingRoutingWithNwGroupsCommand;
+import com.cloud.agent.api.SecurityGroupRulesCmd;
 import com.cloud.agent.api.SetupGuestNetworkCommand;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
@@ -113,7 +112,6 @@
 import com.cloud.agent.resource.virtualnetwork.VRScripts;
 import com.cloud.agent.resource.virtualnetwork.VirtualRouterDeployer;
 import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
-import com.cloud.agent.api.SecurityGroupRulesCmd;
 import com.cloud.dc.Vlan;
 import com.cloud.exception.InternalErrorException;
 import com.cloud.host.Host.Type;
@@ -146,6 +144,9 @@
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogAction;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogModel;
+import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceAgentExecutor;
+import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceExecutor;
+import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceServiceExecutor;
 import com.cloud.hypervisor.kvm.resource.wrapper.LibvirtRequestWrapper;
 import com.cloud.hypervisor.kvm.resource.wrapper.LibvirtUtilitiesHelper;
 import com.cloud.hypervisor.kvm.storage.IscsiStorageCleanupMonitor;
@@ -239,6 +240,9 @@
     public static final String SSHPUBKEYPATH = SSHKEYSPATH + File.separator + "id_rsa.pub.cloud";
     public static final String DEFAULTDOMRSSHPORT = "3922";
 
+    public final static String HOST_CACHE_PATH_PARAMETER = "host.cache.location";
+    public final static String CONFIG_DIR = "config";
+
     public static final String BASH_SCRIPT_PATH = "/bin/bash";
 
     private String _mountPoint = "/mnt";
@@ -518,6 +522,14 @@
         return directDownloadTemporaryDownloadPath;
     }
 
+    public String getConfigPath() {
+        return getCachePath() + "/" + CONFIG_DIR;
+    }
+
+    public String getCachePath() {
+        return cachePath;
+    }
+
     public String getResizeVolumePath() {
         return _resizeVolumePath;
     }
@@ -570,6 +582,7 @@
     protected boolean dpdkSupport = false;
     protected String dpdkOvsPath;
     protected String directDownloadTemporaryDownloadPath;
+    protected String cachePath;
 
     private String getEndIpFromStartIp(final String startIp, final int numIps) {
         final String[] tokens = startIp.split("[.]");
@@ -621,6 +634,10 @@
         return "/var/lib/libvirt/images";
     }
 
+    private String getDefaultCachePath() {
+        return "/var/cache/cloud";
+    }
+
     protected String getDefaultNetworkScriptsDir() {
         return "scripts/vm/network/vnet";
     }
@@ -710,6 +727,11 @@
             directDownloadTemporaryDownloadPath = getDefaultDirectDownloadTemporaryPath();
         }
 
+        cachePath = (String) params.get(HOST_CACHE_PATH_PARAMETER);
+        if (org.apache.commons.lang.StringUtils.isBlank(cachePath)) {
+            cachePath = getDefaultCachePath();
+        }
+
         params.put("domr.scripts.dir", domrScriptsDir);
 
         _virtRouterResource = new VirtualRoutingResource(this);
@@ -2461,11 +2483,21 @@
     }
 
     public String getVolumePath(final Connect conn, final DiskTO volume) throws LibvirtException, URISyntaxException {
+        return getVolumePath(conn, volume, false);
+    }
+
+    public String getVolumePath(final Connect conn, final DiskTO volume, boolean diskOnHostCache) throws LibvirtException, URISyntaxException {
         final DataTO data = volume.getData();
         final DataStoreTO store = data.getDataStore();
 
         if (volume.getType() == Volume.Type.ISO && data.getPath() != null && (store instanceof NfsTO ||
                 store instanceof PrimaryDataStoreTO && data instanceof TemplateObjectTO && !((TemplateObjectTO) data).isDirectDownload())) {
+
+            if (data.getPath().startsWith(ConfigDrive.CONFIGDRIVEDIR) && diskOnHostCache) {
+                String configDrivePath = getConfigPath() + "/" + data.getPath();
+                return configDrivePath;
+            }
+
             final String isoPath = store.getUrl().split("\\?")[0] + File.separator + data.getPath();
             final int index = isoPath.lastIndexOf("/");
             final String path = isoPath.substring(0, index);
@@ -2503,7 +2535,11 @@
             if (volume.getType() == Volume.Type.ISO && data.getPath() != null) {
                 DataStoreTO dataStore = data.getDataStore();
                 String dataStoreUrl = null;
-                if (dataStore instanceof NfsTO) {
+                if (data.getPath().startsWith(ConfigDrive.CONFIGDRIVEDIR) && vmSpec.isConfigDriveOnHostCache() && data instanceof TemplateObjectTO) {
+                    String configDrivePath = getConfigPath() + "/" + data.getPath();
+                    physicalDisk = new KVMPhysicalDisk(configDrivePath, ((TemplateObjectTO) data).getUuid(), null);
+                    physicalDisk.setFormat(PhysicalDiskFormat.FILE);
+                } else if (dataStore instanceof NfsTO) {
                     NfsTO nfsStore = (NfsTO)data.getDataStore();
                     dataStoreUrl = nfsStore.getUrl();
                     physicalDisk = getPhysicalDiskFromNfsStore(dataStoreUrl, data);
@@ -2557,9 +2593,10 @@
                 diskBusType = getGuestDiskModel(vmSpec.getPlatformEmulator());
             }
 
-            // I'm not sure why previously certain DATADISKs were hard-coded VIRTIO and others not, however this
-            // maintains existing functionality with the exception that SCSI will override VIRTIO.
-            DiskDef.DiskBus diskBusTypeData = (diskBusType == DiskDef.DiskBus.SCSI) ? diskBusType : DiskDef.DiskBus.VIRTIO;
+            DiskDef.DiskBus diskBusTypeData = getDataDiskModelFromVMDetail(vmSpec);
+            if (diskBusTypeData == null) {
+                diskBusTypeData = (diskBusType == DiskDef.DiskBus.SCSI) ? diskBusType : DiskDef.DiskBus.VIRTIO;
+            }
 
             final DiskDef disk = new DiskDef();
             int devId = volume.getDiskSeq().intValue();
@@ -2591,6 +2628,8 @@
                      */
                     disk.defNetworkBasedDisk(physicalDisk.getPath().replace("rbd:", ""), pool.getSourceHost(), pool.getSourcePort(), pool.getAuthUserName(),
                             pool.getUuid(), devId, diskBusType, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW);
+                } else if (pool.getType() == StoragePoolType.PowerFlex) {
+                    disk.defBlockBasedDisk(physicalDisk.getPath(), devId, diskBusTypeData);
                 } else if (pool.getType() == StoragePoolType.Gluster) {
                     final String mountpoint = pool.getLocalPath();
                     final String path = physicalDisk.getPath();
@@ -2674,7 +2713,6 @@
                 }
             }
         }
-
     }
 
     private KVMPhysicalDisk getPhysicalDiskPrimaryStore(PrimaryDataStoreTO primaryDataStoreTO, DataTO data) {
@@ -2836,6 +2874,8 @@
                 if (attachingPool.getType() == StoragePoolType.RBD) {
                     diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), attachingPool.getAuthUserName(),
                             attachingPool.getUuid(), devId, busT, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW);
+                } else if (attachingPool.getType() == StoragePoolType.PowerFlex) {
+                    diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, busT);
                 } else if (attachingPool.getType() == StoragePoolType.Gluster) {
                     diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), null,
                             null, devId, busT, DiskProtocol.GLUSTER, DiskDef.DiskFmtType.QCOW2);
@@ -3432,12 +3472,31 @@
             return DiskDef.DiskBus.SCSI;
         }
 
-        final String rootDiskController = details.get(VmDetailConstants.ROOT_DISK_CONTROLLER);
+        String rootDiskController = details.get(VmDetailConstants.ROOT_DISK_CONTROLLER);
         if (StringUtils.isNotBlank(rootDiskController)) {
-            s_logger.debug("Passed custom disk bus " + rootDiskController);
-            for (final DiskDef.DiskBus bus : DiskDef.DiskBus.values()) {
+            s_logger.debug("Passed custom disk controller for ROOT disk " + rootDiskController);
+            for (DiskDef.DiskBus bus : DiskDef.DiskBus.values()) {
                 if (bus.toString().equalsIgnoreCase(rootDiskController)) {
-                    s_logger.debug("Found matching enum for disk bus " + rootDiskController);
+                    s_logger.debug("Found matching enum for disk controller for ROOT disk " + rootDiskController);
+                    return bus;
+                }
+            }
+        }
+        return null;
+    }
+
+    public DiskDef.DiskBus getDataDiskModelFromVMDetail(final VirtualMachineTO vmTO) {
+        Map<String, String> details = vmTO.getDetails();
+        if (details == null) {
+            return null;
+        }
+
+        String dataDiskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER);
+        if (StringUtils.isNotBlank(dataDiskController)) {
+            s_logger.debug("Passed custom disk controller for DATA disk " + dataDiskController);
+            for (DiskDef.DiskBus bus : DiskDef.DiskBus.values()) {
+                if (bus.toString().equalsIgnoreCase(dataDiskController)) {
+                    s_logger.debug("Found matching enum for disk controller for DATA disk " + dataDiskController);
                     return bus;
                 }
             }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java
index 56519ae..1bdf2db 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java
@@ -18,7 +18,7 @@
 
 public class LibvirtStoragePoolDef {
     public enum PoolType {
-        ISCSI("iscsi"), NETFS("netfs"), LOGICAL("logical"), DIR("dir"), RBD("rbd"), GLUSTERFS("glusterfs");
+        ISCSI("iscsi"), NETFS("netfs"), LOGICAL("logical"), DIR("dir"), RBD("rbd"), GLUSTERFS("glusterfs"), POWERFLEX("powerflex");
         String _poolType;
 
         PoolType(String poolType) {
@@ -178,7 +178,7 @@
             storagePoolBuilder.append("'/>\n");
             storagePoolBuilder.append("</source>\n");
         }
-        if (_poolType != PoolType.RBD) {
+        if (_poolType != PoolType.RBD && _poolType != PoolType.POWERFLEX) {
             storagePoolBuilder.append("<target>\n");
             storagePoolBuilder.append("<path>" + _targetPath + "</path>\n");
             storagePoolBuilder.append("</target>\n");
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java
index 7b70c37..bd7deaa 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java
@@ -55,7 +55,7 @@
             String host = getAttrValue("host", "name", source);
             String format = getAttrValue("format", "type", source);
 
-            if (type.equalsIgnoreCase("rbd")) {
+            if (type.equalsIgnoreCase("rbd") || type.equalsIgnoreCase("powerflex")) {
                 int port = 0;
                 String xmlPort = getAttrValue("host", "port", source);
                 if (StringUtils.isNotBlank(xmlPort)) {
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckUrlCommand.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckUrlCommand.java
index efc0090..2618f20 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckUrlCommand.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckUrlCommand.java
@@ -18,13 +18,15 @@
 //
 package com.cloud.hypervisor.kvm.resource.wrapper;
 
+import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer;
+import org.apache.cloudstack.agent.directdownload.CheckUrlCommand;
+import org.apache.log4j.Logger;
+
 import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
 import com.cloud.resource.CommandWrapper;
 import com.cloud.resource.ResourceWrapper;
 import com.cloud.utils.UriUtils;
-import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer;
-import org.apache.cloudstack.agent.directdownload.CheckUrlCommand;
-import org.apache.log4j.Logger;
+import com.cloud.utils.storage.QCOW2Utils;
 
 @ResourceWrapper(handles =  CheckUrlCommand.class)
 public class LibvirtCheckUrlCommand extends CommandWrapper<CheckUrlCommand, CheckUrlAnswer, LibvirtComputingResource> {
@@ -39,7 +41,12 @@
         Long remoteSize = null;
         try {
             UriUtils.checkUrlExistence(url);
-            remoteSize = UriUtils.getRemoteSize(url);
+
+            if ("qcow2".equalsIgnoreCase(cmd.getFormat())) {
+                remoteSize = QCOW2Utils.getVirtualSize(url);
+            } else {
+                remoteSize = UriUtils.getRemoteSize(url);
+            }
         }
         catch (IllegalArgumentException e) {
             s_logger.warn(e.getMessage());
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVolumeStatsCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVolumeStatsCommandWrapper.java
index 00bdfcd..a2f50ac 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVolumeStatsCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVolumeStatsCommandWrapper.java
@@ -50,7 +50,12 @@
             StoragePoolType poolType = cmd.getPoolType();
             HashMap<String, VolumeStatsEntry> statEntry = new HashMap<String, VolumeStatsEntry>();
             for (String volumeUuid : cmd.getVolumeUuids()) {
-                statEntry.put(volumeUuid, getVolumeStat(libvirtComputingResource, conn, volumeUuid, storeUuid, poolType));
+                VolumeStatsEntry volumeStatsEntry = getVolumeStat(libvirtComputingResource, conn, volumeUuid, storeUuid, poolType);
+                if (volumeStatsEntry == null) {
+                    String msg = "Can't get disk stats as pool or disk details unavailable for volume: " + volumeUuid + " on the storage pool: " + storeUuid;
+                    return new GetVolumeStatsAnswer(cmd, msg, null);
+                }
+                statEntry.put(volumeUuid, volumeStatsEntry);
             }
             return new GetVolumeStatsAnswer(cmd, "", statEntry);
         } catch (LibvirtException | CloudRuntimeException e) {
@@ -58,10 +63,17 @@
         }
     }
 
-
     private VolumeStatsEntry getVolumeStat(final LibvirtComputingResource libvirtComputingResource, final Connect conn, final String volumeUuid, final String storeUuid, final StoragePoolType poolType) throws LibvirtException {
         KVMStoragePool sourceKVMPool = libvirtComputingResource.getStoragePoolMgr().getStoragePool(poolType, storeUuid);
+        if (sourceKVMPool == null) {
+            return null;
+        }
+
         KVMPhysicalDisk sourceKVMVolume = sourceKVMPool.getPhysicalDisk(volumeUuid);
+        if (sourceKVMVolume == null) {
+            return null;
+        }
+
         return new VolumeStatsEntry(volumeUuid, sourceKVMVolume.getSize(), sourceKVMVolume.getVirtualSize());
     }
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtHandleConfigDriveCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtHandleConfigDriveCommandWrapper.java
index 6baae85..6067150 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtHandleConfigDriveCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtHandleConfigDriveCommandWrapper.java
@@ -24,16 +24,21 @@
 import java.nio.file.Paths;
 
 import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
+import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.HandleConfigDriveIsoAnswer;
 import com.cloud.agent.api.HandleConfigDriveIsoCommand;
+import com.cloud.agent.api.to.DataStoreTO;
 import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
 import com.cloud.hypervisor.kvm.storage.KVMStoragePool;
 import com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager;
+import com.cloud.network.element.NetworkElement;
 import com.cloud.resource.CommandWrapper;
 import com.cloud.resource.ResourceWrapper;
 import com.cloud.storage.Storage;
+import com.cloud.utils.exception.CloudRuntimeException;
 
 @ResourceWrapper(handles =  HandleConfigDriveIsoCommand.class)
 public final class LibvirtHandleConfigDriveCommandWrapper extends CommandWrapper<HandleConfigDriveIsoCommand, Answer, LibvirtComputingResource> {
@@ -41,38 +46,103 @@
 
     @Override
     public Answer execute(final HandleConfigDriveIsoCommand command, final LibvirtComputingResource libvirtComputingResource) {
-        final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr();
-        final KVMStoragePool pool = storagePoolMgr.getStoragePool(Storage.StoragePoolType.NetworkFilesystem, command.getDestStore().getUuid());
-        if (pool == null) {
-            return new Answer(command, false, "Pool not found, config drive for KVM is only supported for NFS");
-        }
+        String mountPoint = null;
 
-        final String mountPoint = pool.getLocalPath();
-        final Path isoPath = Paths.get(mountPoint, command.getIsoFile());
-        final File isoFile = new File(mountPoint, command.getIsoFile());
-        if (command.isCreate()) {
-            LOG.debug("Creating config drive: " + command.getIsoFile());
-            if (command.getIsoData() == null) {
-                return new Answer(command, false, "Invalid config drive ISO data received");
-            }
-            if (isoFile.exists()) {
-                LOG.debug("An old config drive iso already exists");
-            }
-            try {
+        try {
+            if (command.isCreate()) {
+                LOG.debug("Creating config drive: " + command.getIsoFile());
+
+                NetworkElement.Location location = NetworkElement.Location.PRIMARY;
+                if (command.isHostCachePreferred()) {
+                    LOG.debug("Using the KVM host for config drive");
+                    mountPoint = libvirtComputingResource.getConfigPath();
+                    location = NetworkElement.Location.HOST;
+                } else {
+                    final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr();
+                    KVMStoragePool pool = null;
+                    String poolUuid = null;
+                    Storage.StoragePoolType poolType = null;
+                    DataStoreTO dataStoreTO = command.getDestStore();
+                    if (dataStoreTO != null) {
+                        if (dataStoreTO instanceof PrimaryDataStoreTO) {
+                            PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO) dataStoreTO;
+                            poolType = primaryDataStoreTO.getPoolType();
+                        } else {
+                            poolType = Storage.StoragePoolType.NetworkFilesystem;
+                        }
+                        poolUuid = command.getDestStore().getUuid();
+                        pool = storagePoolMgr.getStoragePool(poolType, poolUuid);
+                    }
+
+                    if (pool == null || poolType == null) {
+                        return new HandleConfigDriveIsoAnswer(command, "Unable to create config drive, Pool " + (poolUuid != null ? poolUuid : "") + " not found");
+                    }
+
+                    if (pool.supportsConfigDriveIso()) {
+                        LOG.debug("Using the pool: " + poolUuid + " for config drive");
+                        mountPoint = pool.getLocalPath();
+                    } else if (command.getUseHostCacheOnUnsupportedPool()) {
+                        LOG.debug("Config drive for KVM is not supported for pool type: " + poolType.toString() + ", using the KVM host");
+                        mountPoint = libvirtComputingResource.getConfigPath();
+                        location = NetworkElement.Location.HOST;
+                    } else {
+                        LOG.debug("Config drive for KVM is not supported for pool type: " + poolType.toString());
+                        return new HandleConfigDriveIsoAnswer(command, "Config drive for KVM is not supported for pool type: " + poolType.toString());
+                    }
+                }
+
+                Path isoPath = Paths.get(mountPoint, command.getIsoFile());
+                File isoFile = new File(mountPoint, command.getIsoFile());
+
+                if (command.getIsoData() == null) {
+                    return new HandleConfigDriveIsoAnswer(command, "Invalid config drive ISO data received");
+                }
+                if (isoFile.exists()) {
+                    LOG.debug("An old config drive iso already exists");
+                }
+
                 Files.createDirectories(isoPath.getParent());
                 ConfigDriveBuilder.base64StringToFile(command.getIsoData(), mountPoint, command.getIsoFile());
-            } catch (IOException e) {
-                return new Answer(command, false, "Failed due to exception: " + e.getMessage());
-            }
-        } else {
-            try {
-                Files.deleteIfExists(isoPath);
-            } catch (IOException e) {
-                LOG.warn("Failed to delete config drive: " + isoPath.toAbsolutePath().toString());
-                return new Answer(command, false, "Failed due to exception: " + e.getMessage());
-            }
-        }
 
-        return new Answer(command);
+                return new HandleConfigDriveIsoAnswer(command, location);
+            } else {
+                LOG.debug("Deleting config drive: " + command.getIsoFile());
+                Path configDrivePath = null;
+
+                if (command.isHostCachePreferred()) {
+                    // Check and delete config drive in host storage if exists
+                    mountPoint = libvirtComputingResource.getConfigPath();
+                    configDrivePath = Paths.get(mountPoint, command.getIsoFile());
+                    Files.deleteIfExists(configDrivePath);
+                } else {
+                    final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr();
+                    KVMStoragePool pool = null;
+                    DataStoreTO dataStoreTO = command.getDestStore();
+                    if (dataStoreTO != null) {
+                        if (dataStoreTO instanceof PrimaryDataStoreTO) {
+                            PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO) dataStoreTO;
+                            Storage.StoragePoolType poolType = primaryDataStoreTO.getPoolType();
+                            pool = storagePoolMgr.getStoragePool(poolType, command.getDestStore().getUuid());
+                        } else {
+                            pool = storagePoolMgr.getStoragePool(Storage.StoragePoolType.NetworkFilesystem, command.getDestStore().getUuid());
+                        }
+                    }
+
+                    if (pool != null && pool.supportsConfigDriveIso()) {
+                        mountPoint = pool.getLocalPath();
+                        configDrivePath = Paths.get(mountPoint, command.getIsoFile());
+                        Files.deleteIfExists(configDrivePath);
+                    }
+                }
+
+                return new HandleConfigDriveIsoAnswer(command);
+            }
+        } catch (final IOException e) {
+            LOG.debug("Failed to handle config drive due to " + e.getMessage(), e);
+            return new HandleConfigDriveIsoAnswer(command, "Failed due to exception: " + e.getMessage());
+        } catch (final CloudRuntimeException e) {
+            LOG.debug("Failed to handle config drive due to " + e.getMessage(), e);
+            return new HandleConfigDriveIsoAnswer(command, "Failed due to exception: " + e.toString());
+        }
     }
 }
\ No newline at end of file
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java
index f3f50aa..38cd995 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java
@@ -19,11 +19,22 @@
 
 package com.cloud.hypervisor.kvm.resource.wrapper;
 
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cloudstack.storage.configdrive.ConfigDrive;
+import org.apache.commons.collections.MapUtils;
+import org.apache.log4j.Logger;
+import org.libvirt.Connect;
+import org.libvirt.LibvirtException;
+
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.PrepareForMigrationAnswer;
 import com.cloud.agent.api.PrepareForMigrationCommand;
-import com.cloud.agent.api.to.DpdkTO;
+import com.cloud.agent.api.to.DataTO;
 import com.cloud.agent.api.to.DiskTO;
+import com.cloud.agent.api.to.DpdkTO;
 import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.exception.InternalErrorException;
@@ -36,14 +47,6 @@
 import com.cloud.storage.Volume;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
-import org.apache.commons.collections.MapUtils;
-import org.apache.log4j.Logger;
-import org.libvirt.Connect;
-import org.libvirt.LibvirtException;
-
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.Map;
 
 @ResourceWrapper(handles =  PrepareForMigrationCommand.class)
 public final class LibvirtPrepareForMigrationCommandWrapper extends CommandWrapper<PrepareForMigrationCommand, Answer, LibvirtComputingResource> {
@@ -86,7 +89,12 @@
             final DiskTO[] volumes = vm.getDisks();
             for (final DiskTO volume : volumes) {
                 if (volume.getType() == Volume.Type.ISO) {
-                    libvirtComputingResource.getVolumePath(conn, volume);
+                    final DataTO data = volume.getData();
+                    if (data != null && data.getPath() != null && data.getPath().startsWith(ConfigDrive.CONFIGDRIVEDIR)) {
+                        libvirtComputingResource.getVolumePath(conn, volume, vm.isConfigDriveOnHostCache());
+                    } else {
+                        libvirtComputingResource.getVolumePath(conn, volume);
+                    }
                 }
             }
 
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
index 0418dbb..7684789 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
@@ -330,6 +330,12 @@
 
     @Override
     public boolean disconnectPhysicalDisk(Map<String, String> volumeToDisconnect) {
+        String poolType = volumeToDisconnect.get(DiskTO.PROTOCOL_TYPE);
+        // Unsupported pool types
+        if (poolType != null && poolType.equalsIgnoreCase(StoragePoolType.PowerFlex.toString())) {
+            return false;
+        }
+
         String host = volumeToDisconnect.get(DiskTO.STORAGE_HOST);
         String port = volumeToDisconnect.get(DiskTO.STORAGE_PORT);
         String path = volumeToDisconnect.get(DiskTO.IQN);
@@ -447,7 +453,7 @@
     }
 
     @Override
-    public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, KVMStoragePool destPool, boolean isIso) {
+    public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, String destTemplatePath, KVMStoragePool destPool, Storage.ImageFormat format, int timeout) {
         return null;
     }
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java
index 865dfab..8e4af76 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java
@@ -19,9 +19,9 @@
 import java.util.List;
 import java.util.Map;
 
-import com.cloud.storage.Storage;
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
 
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.StoragePoolType;
 
 public class IscsiAdmStoragePool implements KVMStoragePool {
@@ -165,4 +165,9 @@
     public String getLocalPath() {
         return _localPath;
     }
+
+    @Override
+    public boolean supportsConfigDriveIso() {
+        return false;
+    }
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
index be7a8b0..46d78e5 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
@@ -19,9 +19,9 @@
 import java.util.List;
 import java.util.Map;
 
-import com.cloud.storage.Storage;
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
 
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.StoragePoolType;
 
 public interface KVMStoragePool {
@@ -70,4 +70,6 @@
     PhysicalDiskFormat getDefaultFormat();
 
     public boolean createFolder(String path);
+
+    public boolean supportsConfigDriveIso();
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
index 544c47f..e747093 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
@@ -22,15 +22,15 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
+import org.apache.log4j.Logger;
+import org.reflections.Reflections;
 
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
@@ -44,8 +44,6 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VirtualMachine;
 
-import org.reflections.Reflections;
-
 public class KVMStoragePoolManager {
     private static final Logger s_logger = Logger.getLogger(KVMStoragePoolManager.class);
 
@@ -100,6 +98,7 @@
         // add other storage adaptors here
         // this._storageMapper.put("newadaptor", new NewStorageAdaptor(storagelayer));
         this._storageMapper.put(StoragePoolType.ManagedNFS.toString(), new ManagedNfsStorageAdaptor(storagelayer));
+        this._storageMapper.put(StoragePoolType.PowerFlex.toString(), new ScaleIOStorageAdaptor(storagelayer));
 
         // add any adaptors that wish to register themselves via annotation
         Reflections reflections = new Reflections("com.cloud.hypervisor.kvm.storage");
@@ -253,7 +252,7 @@
             if (info != null) {
                 pool = createStoragePool(info.name, info.host, info.port, info.path, info.userInfo, info.poolType, info.type);
             } else {
-                throw new CloudRuntimeException("Could not fetch storage pool " + uuid + " from libvirt");
+                throw new CloudRuntimeException("Could not fetch storage pool " + uuid + " from libvirt due to " + e.getMessage());
             }
         }
         return pool;
@@ -286,36 +285,38 @@
 
     public KVMPhysicalDisk getPhysicalDisk(StoragePoolType type, String poolUuid, String volName) {
         int cnt = 0;
-        int retries = 10;
+        int retries = 100;
         KVMPhysicalDisk vol = null;
         //harden get volume, try cnt times to get volume, in case volume is created on other host
+        //Poll more frequently and return immediately once disk is found
         String errMsg = "";
         while (cnt < retries) {
             try {
                 KVMStoragePool pool = getStoragePool(type, poolUuid);
                 vol = pool.getPhysicalDisk(volName);
                 if (vol != null) {
-                    break;
+                    return vol;
                 }
             } catch (Exception e) {
-                s_logger.debug("Failed to find volume:" + volName + " due to" + e.toString() + ", retry:" + cnt);
+                s_logger.debug("Failed to find volume:" + volName + " due to " + e.toString() + ", retry:" + cnt);
                 errMsg = e.toString();
             }
 
             try {
-                Thread.sleep(30000);
+                Thread.sleep(3000);
             } catch (InterruptedException e) {
                 s_logger.debug("[ignored] interupted while trying to get storage pool.");
             }
             cnt++;
         }
 
+        KVMStoragePool pool = getStoragePool(type, poolUuid);
+        vol = pool.getPhysicalDisk(volName);
         if (vol == null) {
             throw new CloudRuntimeException(errMsg);
         } else {
             return vol;
         }
-
     }
 
     public KVMStoragePool createStoragePool(String name, String host, int port, String path, String userInfo, StoragePoolType type) {
@@ -377,6 +378,10 @@
             return adaptor.createDiskFromTemplate(template, name,
                     PhysicalDiskFormat.DIR, provisioningType,
                     size, destPool, timeout);
+        } else if (destPool.getType() == StoragePoolType.PowerFlex) {
+            return adaptor.createDiskFromTemplate(template, name,
+                    PhysicalDiskFormat.RAW, provisioningType,
+                    size, destPool, timeout);
         } else {
             return adaptor.createDiskFromTemplate(template, name,
                     PhysicalDiskFormat.QCOW2, provisioningType,
@@ -405,9 +410,9 @@
         return adaptor.createDiskFromTemplateBacking(template, name, format, size, destPool, timeout);
     }
 
-    public KVMPhysicalDisk createPhysicalDiskFromDirectDownloadTemplate(String templateFilePath, KVMStoragePool destPool, boolean isIso) {
+    public KVMPhysicalDisk createPhysicalDiskFromDirectDownloadTemplate(String templateFilePath, String destTemplatePath, KVMStoragePool destPool, Storage.ImageFormat format, int timeout) {
         StorageAdaptor adaptor = getStorageAdaptor(destPool.getType());
-        return adaptor.createTemplateFromDirectDownloadFile(templateFilePath, destPool, isIso);
+        return adaptor.createTemplateFromDirectDownloadFile(templateFilePath, destTemplatePath, destPool, format, timeout);
     }
 
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index 016a13e..09dc8b1 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -37,7 +37,6 @@
 
 import javax.naming.ConfigurationException;
 
-import com.cloud.utils.Pair;
 import org.apache.cloudstack.agent.directdownload.DirectDownloadAnswer;
 import org.apache.cloudstack.agent.directdownload.DirectDownloadCommand;
 import org.apache.cloudstack.agent.directdownload.HttpDirectDownloadCommand;
@@ -117,6 +116,8 @@
 import com.cloud.storage.template.QCOW2Processor;
 import com.cloud.storage.template.TemplateLocation;
 import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.Pair;
+import com.cloud.utils.UriUtils;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 import com.cloud.utils.storage.S3.S3Utils;
@@ -255,11 +256,15 @@
 
                 String path = details != null ? details.get("managedStoreTarget") : null;
 
-                storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details);
+                if (!storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details)) {
+                    s_logger.warn("Failed to connect physical disk at path: " + path + ", in storage pool id: " + primaryStore.getUuid());
+                }
 
                 primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, path != null ? path : destTempl.getUuid(), primaryPool, cmd.getWaitInMillSeconds());
 
-                storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path);
+                if (!storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path)) {
+                    s_logger.warn("Failed to disconnect physical disk at path: " + path + ", in storage pool id: " + primaryStore.getUuid());
+                }
             } else {
                 primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, UUID.randomUUID().toString(), primaryPool, cmd.getWaitInMillSeconds());
             }
@@ -273,7 +278,7 @@
                 final TemplateObjectTO newTemplate = new TemplateObjectTO();
                 newTemplate.setPath(primaryVol.getName());
                 newTemplate.setSize(primaryVol.getSize());
-                if (primaryPool.getType() == StoragePoolType.RBD) {
+                if (primaryPool.getType() == StoragePoolType.RBD || primaryPool.getType() == StoragePoolType.PowerFlex) {
                     newTemplate.setFormat(ImageFormat.RAW);
                 } else {
                     newTemplate.setFormat(ImageFormat.QCOW2);
@@ -381,6 +386,27 @@
             if (primaryPool.getType() == StoragePoolType.CLVM) {
                 templatePath = ((NfsTO)imageStore).getUrl() + File.separator + templatePath;
                 vol = templateToPrimaryDownload(templatePath, primaryPool, volume.getUuid(), volume.getSize(), cmd.getWaitInMillSeconds());
+            } if (primaryPool.getType() == StoragePoolType.PowerFlex) {
+                Map<String, String> details = primaryStore.getDetails();
+                String path = details != null ? details.get("managedStoreTarget") : null;
+
+                if (!storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), templatePath, details)) {
+                    s_logger.warn("Failed to connect base template volume at path: " + templatePath + ", in storage pool id: " + primaryStore.getUuid());
+                }
+
+                BaseVol = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), templatePath);
+                if (BaseVol == null) {
+                    s_logger.debug("Failed to get the physical disk for base template volume at path: " + templatePath);
+                    throw new CloudRuntimeException("Failed to get the physical disk for base template volume at path: " + templatePath);
+                }
+
+                if (!storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details)) {
+                    s_logger.warn("Failed to connect new volume at path: " + path + ", in storage pool id: " + primaryStore.getUuid());
+                }
+
+                vol = storagePoolMgr.copyPhysicalDisk(BaseVol, path != null ? path : volume.getUuid(), primaryPool, cmd.getWaitInMillSeconds());
+
+                storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path);
             } else {
                 if (templatePath.contains("/mnt")) {
                     //upgrade issue, if the path contains path, need to extract the volume uuid from path
@@ -1344,6 +1370,9 @@
         } catch (final InternalErrorException e) {
             s_logger.debug("Failed to attach volume: " + vol.getPath() + ", due to ", e);
             return new AttachAnswer(e.toString());
+        } catch (final CloudRuntimeException e) {
+            s_logger.debug("Failed to attach volume: " + vol.getPath() + ", due to ", e);
+            return new AttachAnswer(e.toString());
         }
     }
 
@@ -1375,6 +1404,9 @@
         } catch (final InternalErrorException e) {
             s_logger.debug("Failed to detach volume: " + vol.getPath() + ", due to ", e);
             return new DettachAnswer(e.toString());
+        } catch (final CloudRuntimeException e) {
+            s_logger.debug("Failed to detach volume: " + vol.getPath() + ", due to ", e);
+            return new DettachAnswer(e.toString());
         }
     }
 
@@ -1728,6 +1760,7 @@
         final PrimaryDataStoreTO pool = cmd.getDestPool();
         DirectTemplateDownloader downloader;
         KVMPhysicalDisk template;
+        KVMStoragePool destPool = null;
 
         try {
             s_logger.debug("Verifying temporary location for downloading the template exists on the host");
@@ -1739,14 +1772,20 @@
                 return new DirectDownloadAnswer(false, msg, true);
             }
 
-            s_logger.debug("Checking for free space on the host for downloading the template");
-            if (!isEnoughSpaceForDownloadTemplateOnTemporaryLocation(cmd.getTemplateSize())) {
+            Long templateSize = null;
+            if (!org.apache.commons.lang.StringUtils.isBlank(cmd.getUrl())) {
+                String url = cmd.getUrl();
+                templateSize = UriUtils.getRemoteSize(url);
+            }
+
+            s_logger.debug("Checking for free space on the host for downloading the template with physical size: " + templateSize + " and virtual size: " + cmd.getTemplateSize());
+            if (!isEnoughSpaceForDownloadTemplateOnTemporaryLocation(templateSize)) {
                 String msg = "Not enough space on the defined temporary location to download the template " + cmd.getTemplateId();
                 s_logger.error(msg);
                 return new DirectDownloadAnswer(false, msg, true);
             }
 
-            KVMStoragePool destPool = storagePoolMgr.getStoragePool(pool.getPoolType(), pool.getUuid());
+            destPool = storagePoolMgr.getStoragePool(pool.getPoolType(), pool.getUuid());
             downloader = getDirectTemplateDownloaderFromCommand(cmd, destPool, temporaryDownloadPath);
             s_logger.debug("Trying to download template");
             Pair<Boolean, String> result = downloader.downloadTemplate();
@@ -1759,7 +1798,19 @@
                 s_logger.warn("Couldn't validate template checksum");
                 return new DirectDownloadAnswer(false, "Checksum validation failed", false);
             }
-            template = storagePoolMgr.createPhysicalDiskFromDirectDownloadTemplate(tempFilePath, destPool, cmd.isIso());
+
+            final TemplateObjectTO destTemplate = cmd.getDestData();
+            String destTemplatePath = (destTemplate != null) ? destTemplate.getPath() : null;
+
+            if (!storagePoolMgr.connectPhysicalDisk(pool.getPoolType(), pool.getUuid(), destTemplatePath, null)) {
+                s_logger.warn("Unable to connect physical disk at path: " + destTemplatePath + ", in storage pool id: " + pool.getUuid());
+            }
+
+            template = storagePoolMgr.createPhysicalDiskFromDirectDownloadTemplate(tempFilePath, destTemplatePath, destPool, cmd.getFormat(), cmd.getWaitInMillSeconds());
+
+            if (!storagePoolMgr.disconnectPhysicalDisk(pool.getPoolType(), pool.getUuid(), destTemplatePath)) {
+                s_logger.warn("Unable to disconnect physical disk at path: " + destTemplatePath + ", in storage pool id: " + pool.getUuid());
+            }
         } catch (CloudRuntimeException e) {
             s_logger.warn("Error downloading template " + cmd.getTemplateId() + " due to: " + e.getMessage());
             return new DirectDownloadAnswer(false, "Unable to download template: " + e.getMessage(), true);
@@ -1780,23 +1831,56 @@
         final ImageFormat destFormat = destVol.getFormat();
         final DataStoreTO srcStore = srcData.getDataStore();
         final DataStoreTO destStore = destData.getDataStore();
-        final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcStore;
-        final PrimaryDataStoreTO primaryStoreDest = (PrimaryDataStoreTO)destStore;
+        final PrimaryDataStoreTO srcPrimaryStore = (PrimaryDataStoreTO)srcStore;
+        final PrimaryDataStoreTO destPrimaryStore = (PrimaryDataStoreTO)destStore;
         final String srcVolumePath = srcData.getPath();
         final String destVolumePath = destData.getPath();
         KVMStoragePool destPool = null;
 
         try {
-            final String volumeName = UUID.randomUUID().toString();
+            s_logger.debug("Copying src volume (id: " + srcVol.getId() + ", format: " + srcFormat + ", path: " + srcVolumePath + ", primary storage: [id: " + srcPrimaryStore.getId() + ", type: "  + srcPrimaryStore.getPoolType() + "]) to dest volume (id: " +
+                    destVol.getId() + ", format: " + destFormat + ", path: " + destVolumePath + ", primary storage: [id: " + destPrimaryStore.getId() + ", type: "  + destPrimaryStore.getPoolType() + "]).");
 
-            final String destVolumeName = volumeName + "." + destFormat.getFileExtension();
-            final KVMPhysicalDisk volume = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), srcVolumePath);
+            if (srcPrimaryStore.isManaged()) {
+                if (!storagePoolMgr.connectPhysicalDisk(srcPrimaryStore.getPoolType(), srcPrimaryStore.getUuid(), srcVolumePath, srcPrimaryStore.getDetails())) {
+                    s_logger.warn("Failed to connect src volume at path: " + srcVolumePath + ", in storage pool id: " + srcPrimaryStore.getUuid());
+                }
+            }
+
+            final KVMPhysicalDisk volume = storagePoolMgr.getPhysicalDisk(srcPrimaryStore.getPoolType(), srcPrimaryStore.getUuid(), srcVolumePath);
+            if (volume == null) {
+                s_logger.debug("Failed to get physical disk for volume: " + srcVolumePath);
+                throw new CloudRuntimeException("Failed to get physical disk for volume at path: " + srcVolumePath);
+            }
+
             volume.setFormat(PhysicalDiskFormat.valueOf(srcFormat.toString()));
 
-            destPool = storagePoolMgr.getStoragePool(primaryStoreDest.getPoolType(), primaryStoreDest.getUuid());
+            String destVolumeName = null;
+            if (destPrimaryStore.isManaged()) {
+                if (!storagePoolMgr.connectPhysicalDisk(destPrimaryStore.getPoolType(), destPrimaryStore.getUuid(), destVolumePath, destPrimaryStore.getDetails())) {
+                    s_logger.warn("Failed to connect dest volume at path: " + destVolumePath + ", in storage pool id: " + destPrimaryStore.getUuid());
+                }
+                String managedStoreTarget = destPrimaryStore.getDetails() != null ? destPrimaryStore.getDetails().get("managedStoreTarget") : null;
+                destVolumeName = managedStoreTarget != null ? managedStoreTarget : destVolumePath;
+            } else {
+                final String volumeName = UUID.randomUUID().toString();
+                destVolumeName = volumeName + "." + destFormat.getFileExtension();
+            }
+
+            destPool = storagePoolMgr.getStoragePool(destPrimaryStore.getPoolType(), destPrimaryStore.getUuid());
             storagePoolMgr.copyPhysicalDisk(volume, destVolumeName, destPool, cmd.getWaitInMillSeconds());
+
+            if (srcPrimaryStore.isManaged()) {
+                storagePoolMgr.disconnectPhysicalDisk(srcPrimaryStore.getPoolType(), srcPrimaryStore.getUuid(), srcVolumePath);
+            }
+
+            if (destPrimaryStore.isManaged()) {
+                storagePoolMgr.disconnectPhysicalDisk(destPrimaryStore.getPoolType(), destPrimaryStore.getUuid(), destVolumePath);
+            }
+
             final VolumeObjectTO newVol = new VolumeObjectTO();
-            newVol.setPath(destVolumePath + File.separator + destVolumeName);
+            String path = destPrimaryStore.isManaged() ? destVolumeName : destVolumePath + File.separator + destVolumeName;
+            newVol.setPath(path);
             newVol.setFormat(destFormat);
             return new CopyCmdAnswer(newVol);
         } catch (final CloudRuntimeException e) {
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
index f9c627b..630b988 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
@@ -24,6 +24,10 @@
 import java.util.Map;
 import java.util.UUID;
 
+import org.apache.cloudstack.utils.qemu.QemuImg;
+import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
+import org.apache.cloudstack.utils.qemu.QemuImgException;
+import org.apache.cloudstack.utils.qemu.QemuImgFile;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
 import org.libvirt.Connect;
@@ -42,12 +46,6 @@
 import com.ceph.rbd.RbdImage;
 import com.ceph.rbd.jna.RbdImageInfo;
 import com.ceph.rbd.jna.RbdSnapInfo;
-
-import org.apache.cloudstack.utils.qemu.QemuImg;
-import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
-import org.apache.cloudstack.utils.qemu.QemuImgException;
-import org.apache.cloudstack.utils.qemu.QemuImgFile;
-
 import com.cloud.exception.InternalErrorException;
 import com.cloud.hypervisor.kvm.resource.LibvirtConnection;
 import com.cloud.hypervisor.kvm.resource.LibvirtSecretDef;
@@ -160,20 +158,20 @@
     }
 
     @Override
-    public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, KVMStoragePool destPool, boolean isIso) {
+    public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, String destTemplatePath, KVMStoragePool destPool, Storage.ImageFormat format, int timeout) {
         File sourceFile = new File(templateFilePath);
         if (!sourceFile.exists()) {
             throw new CloudRuntimeException("Direct download template file " + sourceFile + " does not exist on this host");
         }
         String templateUuid = UUID.randomUUID().toString();
-        if (isIso) {
+        if (Storage.ImageFormat.ISO.equals(format)) {
             templateUuid += ".iso";
         }
         String destinationFile = destPool.getLocalPath() + File.separator + templateUuid;
 
         if (destPool.getType() == StoragePoolType.NetworkFilesystem || destPool.getType() == StoragePoolType.Filesystem
             || destPool.getType() == StoragePoolType.SharedMountPoint) {
-            if (!isIso && isTemplateExtractable(templateFilePath)) {
+            if (!Storage.ImageFormat.ISO.equals(format) && isTemplateExtractable(templateFilePath)) {
                 extractDownloadedTemplate(templateFilePath, destPool, destinationFile);
             } else {
                 Script.runSimpleBashScript("mv " + templateFilePath + " " + destinationFile);
@@ -451,11 +449,13 @@
                 type = StoragePoolType.CLVM;
             } else if (spd.getPoolType() == LibvirtStoragePoolDef.PoolType.GLUSTERFS) {
                 type = StoragePoolType.Gluster;
+            } else if (spd.getPoolType() == LibvirtStoragePoolDef.PoolType.POWERFLEX) {
+                type = StoragePoolType.PowerFlex;
             }
 
             LibvirtStoragePool pool = new LibvirtStoragePool(uuid, storage.getName(), type, this, storage);
 
-            if (pool.getType() != StoragePoolType.RBD)
+            if (pool.getType() != StoragePoolType.RBD && pool.getType() != StoragePoolType.PowerFlex)
                 pool.setLocalPath(spd.getTargetPath());
             else
                 pool.setLocalPath("");
@@ -545,7 +545,6 @@
             s_logger.debug("Failed to get physical disk:", e);
             throw new CloudRuntimeException(e.toString());
         }
-
     }
 
     @Override
@@ -1022,7 +1021,6 @@
             }
         }
 
-
         return disk;
     }
 
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
index 1b554f7..b2e8dec 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
@@ -45,6 +45,7 @@
     protected String authSecret;
     protected String sourceHost;
     protected int sourcePort;
+
     protected String sourceDir;
 
     public LibvirtStoragePool(String uuid, String name, StoragePoolType type, StorageAdaptor adaptor, StoragePool pool) {
@@ -56,7 +57,6 @@
         this.used = 0;
         this.available = 0;
         this._pool = pool;
-
     }
 
     public void setCapacity(long capacity) {
@@ -101,7 +101,7 @@
 
     @Override
     public PhysicalDiskFormat getDefaultFormat() {
-        if (getStoragePoolType() == StoragePoolType.CLVM || getStoragePoolType() == StoragePoolType.RBD) {
+        if (getStoragePoolType() == StoragePoolType.CLVM || getStoragePoolType() == StoragePoolType.RBD || getStoragePoolType() == StoragePoolType.PowerFlex) {
             return PhysicalDiskFormat.RAW;
         } else {
             return PhysicalDiskFormat.QCOW2;
@@ -271,4 +271,12 @@
     public boolean createFolder(String path) {
         return this._storageAdaptor.createFolder(this.uuid, path);
     }
+
+    @Override
+    public boolean supportsConfigDriveIso() {
+        if (this.type == StoragePoolType.NetworkFilesystem) {
+            return true;
+        }
+        return false;
+    }
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java
index 1ea4f62..6db2f82 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java
@@ -35,6 +35,7 @@
 import com.cloud.hypervisor.kvm.resource.LibvirtStoragePoolDef.PoolType;
 import com.cloud.hypervisor.kvm.resource.LibvirtStorageVolumeDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtStorageVolumeXMLParser;
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.ProvisioningType;
 import com.cloud.storage.Storage.StoragePoolType;
@@ -319,7 +320,7 @@
     }
 
     @Override
-    public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, KVMStoragePool destPool, boolean isIso) {
+    public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, String destTemplatePath, KVMStoragePool destPool, Storage.ImageFormat format, int timeout) {
         return null;
     }
 
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
new file mode 100644
index 0000000..62eb544
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
@@ -0,0 +1,393 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.hypervisor.kvm.storage;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
+import org.apache.cloudstack.utils.qemu.QemuImg;
+import org.apache.cloudstack.utils.qemu.QemuImgException;
+import org.apache.cloudstack.utils.qemu.QemuImgFile;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+import org.apache.log4j.Logger;
+
+import com.cloud.storage.Storage;
+import com.cloud.storage.StorageLayer;
+import com.cloud.storage.StorageManager;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.OutputInterpreter;
+import com.cloud.utils.script.Script;
+import com.google.common.base.Strings;
+
+@StorageAdaptorInfo(storagePoolType= Storage.StoragePoolType.PowerFlex)
+public class ScaleIOStorageAdaptor implements StorageAdaptor {
+    private static final Logger LOGGER = Logger.getLogger(ScaleIOStorageAdaptor.class);
+    private static final Map<String, KVMStoragePool> MapStorageUuidToStoragePool = new HashMap<>();
+    private static final int DEFAULT_DISK_WAIT_TIME_IN_SECS = 60;
+    private StorageLayer storageLayer;
+
+    public ScaleIOStorageAdaptor(StorageLayer storagelayer) {
+        storageLayer = storagelayer;
+    }
+
+    @Override
+    public KVMStoragePool getStoragePool(String uuid) {
+        KVMStoragePool pool = MapStorageUuidToStoragePool.get(uuid);
+        if (pool == null) {
+            LOGGER.error("Pool: " + uuid + " not found, probably sdc not connected on agent start");
+            throw new CloudRuntimeException("Pool: " + uuid + " not found, reconnect sdc and restart agent if sdc not connected on agent start");
+        }
+
+        return pool;
+    }
+
+    @Override
+    public KVMStoragePool getStoragePool(String uuid, boolean refreshInfo) {
+        return getStoragePool(uuid);
+    }
+
+    @Override
+    public KVMPhysicalDisk getPhysicalDisk(String volumePath, KVMStoragePool pool) {
+        if (Strings.isNullOrEmpty(volumePath) || pool == null) {
+            LOGGER.error("Unable to get physical disk, volume path or pool not specified");
+            return null;
+        }
+
+        String volumeId = ScaleIOUtil.getVolumePath(volumePath);
+
+        try {
+            String diskFilePath = null;
+            String systemId = ScaleIOUtil.getSystemIdForVolume(volumeId);
+            if (!Strings.isNullOrEmpty(systemId) && systemId.length() == ScaleIOUtil.IDENTIFIER_LENGTH) {
+                // Disk path format: /dev/disk/by-id/emc-vol-<SystemID>-<VolumeID>
+                final String diskFileName = ScaleIOUtil.DISK_NAME_PREFIX + systemId + "-" + volumeId;
+                diskFilePath = ScaleIOUtil.DISK_PATH + File.separator + diskFileName;
+                final File diskFile = new File(diskFilePath);
+                if (!diskFile.exists()) {
+                    LOGGER.debug("Physical disk file: " + diskFilePath + " doesn't exists on the storage pool: " + pool.getUuid());
+                    return null;
+                }
+            } else {
+                LOGGER.debug("Try with wildcard filter to get the physical disk: " + volumeId + " on the storage pool: " + pool.getUuid());
+                final File dir = new File(ScaleIOUtil.DISK_PATH);
+                final FileFilter fileFilter = new WildcardFileFilter(ScaleIOUtil.DISK_NAME_PREFIX_FILTER + volumeId);
+                final File[] files = dir.listFiles(fileFilter);
+                if (files != null && files.length == 1) {
+                    diskFilePath = files[0].getAbsolutePath();
+                } else {
+                    LOGGER.debug("Unable to find the physical disk: " + volumeId + " on the storage pool: " + pool.getUuid());
+                    return null;
+                }
+            }
+
+            KVMPhysicalDisk disk = new KVMPhysicalDisk(diskFilePath, volumePath, pool);
+            disk.setFormat(QemuImg.PhysicalDiskFormat.RAW);
+
+            long diskSize = getPhysicalDiskSize(diskFilePath);
+            disk.setSize(diskSize);
+            disk.setVirtualSize(diskSize);
+
+            return disk;
+        } catch (Exception e) {
+            LOGGER.error("Failed to get the physical disk: " + volumePath + " on the storage pool: " + pool.getUuid() + " due to " + e.getMessage());
+            throw new CloudRuntimeException("Failed to get the physical disk: " + volumePath + " on the storage pool: " + pool.getUuid());
+        }
+    }
+
+    @Override
+    public KVMStoragePool createStoragePool(String uuid, String host, int port, String path, String userInfo, Storage.StoragePoolType type) {
+        ScaleIOStoragePool storagePool = new ScaleIOStoragePool(uuid, host, port, path, type, this);
+        MapStorageUuidToStoragePool.put(uuid, storagePool);
+        return storagePool;
+    }
+
+    @Override
+    public boolean deleteStoragePool(String uuid) {
+        return MapStorageUuidToStoragePool.remove(uuid) != null;
+    }
+
+    @Override
+    public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size) {
+        return null;
+    }
+
+    @Override
+    public boolean connectPhysicalDisk(String volumePath, KVMStoragePool pool, Map<String, String> details) {
+        if (Strings.isNullOrEmpty(volumePath) || pool == null) {
+            LOGGER.error("Unable to connect physical disk due to insufficient data");
+            throw new CloudRuntimeException("Unable to connect physical disk due to insufficient data");
+        }
+
+        volumePath = ScaleIOUtil.getVolumePath(volumePath);
+
+        int waitTimeInSec = DEFAULT_DISK_WAIT_TIME_IN_SECS;
+        if (details != null && details.containsKey(StorageManager.STORAGE_POOL_DISK_WAIT.toString())) {
+            String waitTime = details.get(StorageManager.STORAGE_POOL_DISK_WAIT.toString());
+            if (!Strings.isNullOrEmpty(waitTime)) {
+                waitTimeInSec = Integer.valueOf(waitTime).intValue();
+            }
+        }
+        return waitForDiskToBecomeAvailable(volumePath, pool, waitTimeInSec);
+    }
+
+    private boolean waitForDiskToBecomeAvailable(String volumePath, KVMStoragePool pool, int waitTimeInSec) {
+        LOGGER.debug("Waiting for the volume with id: " + volumePath + " of the storage pool: " + pool.getUuid() + " to become available for " + waitTimeInSec + " secs");
+        int timeBetweenTries = 1000; // Try more frequently (every sec) and return early if disk is found
+        KVMPhysicalDisk physicalDisk = null;
+
+        // Rescan before checking for the physical disk
+        ScaleIOUtil.rescanForNewVolumes();
+
+        while (waitTimeInSec > 0) {
+            physicalDisk = getPhysicalDisk(volumePath, pool);
+            if (physicalDisk != null && physicalDisk.getSize() > 0) {
+                LOGGER.debug("Found the volume with id: " + volumePath + " of the storage pool: " + pool.getUuid());
+                return true;
+            }
+
+            waitTimeInSec--;
+
+            try {
+                Thread.sleep(timeBetweenTries);
+            } catch (Exception ex) {
+                // don't do anything
+            }
+        }
+
+        physicalDisk = getPhysicalDisk(volumePath, pool);
+        if (physicalDisk != null && physicalDisk.getSize() > 0) {
+            LOGGER.debug("Found the volume using id: " + volumePath + " of the storage pool: " + pool.getUuid());
+            return true;
+        }
+
+        LOGGER.debug("Unable to find the volume with id: " + volumePath + " of the storage pool: " + pool.getUuid());
+        return false;
+    }
+
+    private long getPhysicalDiskSize(String diskPath) {
+        if (Strings.isNullOrEmpty(diskPath)) {
+            return 0;
+        }
+
+        Script diskCmd = new Script("blockdev", LOGGER);
+        diskCmd.add("--getsize64", diskPath);
+
+        OutputInterpreter.OneLineParser parser = new OutputInterpreter.OneLineParser();
+        String result = diskCmd.execute(parser);
+
+        if (result != null) {
+            LOGGER.warn("Unable to get the disk size at path: " + diskPath);
+            return 0;
+        } else {
+            LOGGER.info("Able to retrieve the disk size at path:" + diskPath);
+        }
+
+        return Long.parseLong(parser.getLine());
+    }
+
+    @Override
+    public boolean disconnectPhysicalDisk(String volumePath, KVMStoragePool pool) {
+        return true;
+    }
+
+    @Override
+    public boolean disconnectPhysicalDisk(Map<String, String> volumeToDisconnect) {
+        return true;
+    }
+
+    @Override
+    public boolean disconnectPhysicalDiskByPath(String localPath) {
+        return true;
+    }
+
+    @Override
+    public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool, Storage.ImageFormat format) {
+        return true;
+    }
+
+    @Override
+    public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, String name, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, KVMStoragePool destPool, int timeout) {
+        return null;
+    }
+
+    @Override
+    public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk, String name, QemuImg.PhysicalDiskFormat format, long size, KVMStoragePool destPool) {
+        return null;
+    }
+
+    @Override
+    public List<KVMPhysicalDisk> listPhysicalDisks(String storagePoolUuid, KVMStoragePool pool) {
+        return null;
+    }
+
+    @Override
+    public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name, KVMStoragePool destPool, int timeout) {
+        if (Strings.isNullOrEmpty(name) || disk == null || destPool == null) {
+            LOGGER.error("Unable to copy physical disk due to insufficient data");
+            throw new CloudRuntimeException("Unable to copy physical disk due to insufficient data");
+        }
+
+        LOGGER.debug("Copy physical disk with size: " + disk.getSize() + ", virtualsize: " + disk.getVirtualSize()+ ", format: " + disk.getFormat());
+
+        KVMPhysicalDisk destDisk = destPool.getPhysicalDisk(name);
+        if (destDisk == null) {
+            LOGGER.error("Failed to find the disk: " + name + " of the storage pool: " + destPool.getUuid());
+            throw new CloudRuntimeException("Failed to find the disk: " + name + " of the storage pool: " + destPool.getUuid());
+        }
+
+        destDisk.setFormat(QemuImg.PhysicalDiskFormat.RAW);
+        destDisk.setVirtualSize(disk.getVirtualSize());
+        destDisk.setSize(disk.getSize());
+
+        QemuImg qemu = new QemuImg(timeout);
+        QemuImgFile srcFile = null;
+        QemuImgFile destFile = null;
+
+        try {
+            srcFile = new QemuImgFile(disk.getPath(), disk.getFormat());
+            destFile = new QemuImgFile(destDisk.getPath(), destDisk.getFormat());
+
+            LOGGER.debug("Starting copy from source image " + srcFile.getFileName() + " to PowerFlex volume: " + destDisk.getPath());
+            qemu.convert(srcFile, destFile);
+            LOGGER.debug("Succesfully converted source image " + srcFile.getFileName() + " to PowerFlex volume: " + destDisk.getPath());
+        }  catch (QemuImgException e) {
+            LOGGER.error("Failed to convert from " + srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " + e.getMessage());
+            destDisk = null;
+        }
+
+        return destDisk;
+    }
+
+    @Override
+    public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot, String snapshotName, String name, KVMStoragePool destPool, int timeout) {
+        return null;
+    }
+
+    @Override
+    public boolean refresh(KVMStoragePool pool) {
+        return true;
+    }
+
+    @Override
+    public boolean deleteStoragePool(KVMStoragePool pool) {
+        return deleteStoragePool(pool.getUuid());
+    }
+
+    @Override
+    public boolean createFolder(String uuid, String path) {
+        return true;
+    }
+
+    @Override
+    public KVMPhysicalDisk createDiskFromTemplateBacking(KVMPhysicalDisk template, String name, QemuImg.PhysicalDiskFormat format, long size, KVMStoragePool destPool, int timeout) {
+        return null;
+    }
+
+    @Override
+    public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, String destTemplatePath, KVMStoragePool destPool, Storage.ImageFormat format, int timeout) {
+        if (Strings.isNullOrEmpty(templateFilePath) || Strings.isNullOrEmpty(destTemplatePath) || destPool == null) {
+            LOGGER.error("Unable to create template from direct download template file due to insufficient data");
+            throw new CloudRuntimeException("Unable to create template from direct download template file due to insufficient data");
+        }
+
+        LOGGER.debug("Create template from direct download template - file path: " + templateFilePath + ", dest path: " + destTemplatePath + ", format: " + format.toString());
+
+        File sourceFile = new File(templateFilePath);
+        if (!sourceFile.exists()) {
+            throw new CloudRuntimeException("Direct download template file " + templateFilePath + " does not exist on this host");
+        }
+
+        if (destTemplatePath == null || destTemplatePath.isEmpty()) {
+            LOGGER.error("Failed to create template, target template disk path not provided");
+            throw new CloudRuntimeException("Target template disk path not provided");
+        }
+
+        if (destPool.getType() != Storage.StoragePoolType.PowerFlex) {
+            throw new CloudRuntimeException("Unsupported storage pool type: " + destPool.getType().toString());
+        }
+
+        if (Storage.ImageFormat.RAW.equals(format) && Storage.ImageFormat.QCOW2.equals(format)) {
+            LOGGER.error("Failed to create template, unsupported template format: " + format.toString());
+            throw new CloudRuntimeException("Unsupported template format: " + format.toString());
+        }
+
+        String srcTemplateFilePath = templateFilePath;
+        KVMPhysicalDisk destDisk = null;
+        QemuImgFile srcFile = null;
+        QemuImgFile destFile = null;
+        try {
+            destDisk = destPool.getPhysicalDisk(destTemplatePath);
+            if (destDisk == null) {
+                LOGGER.error("Failed to find the disk: " + destTemplatePath + " of the storage pool: " + destPool.getUuid());
+                throw new CloudRuntimeException("Failed to find the disk: " + destTemplatePath + " of the storage pool: " + destPool.getUuid());
+            }
+
+            if (isTemplateExtractable(templateFilePath)) {
+                srcTemplateFilePath = sourceFile.getParent() + "/" + UUID.randomUUID().toString();
+                LOGGER.debug("Extract the downloaded template " + templateFilePath + " to " + srcTemplateFilePath);
+                String extractCommand = getExtractCommandForDownloadedFile(templateFilePath, srcTemplateFilePath);
+                Script.runSimpleBashScript(extractCommand);
+                Script.runSimpleBashScript("rm -f " + templateFilePath);
+            }
+
+            QemuImg.PhysicalDiskFormat srcFileFormat = QemuImg.PhysicalDiskFormat.RAW;
+            if (format == Storage.ImageFormat.RAW) {
+                srcFileFormat = QemuImg.PhysicalDiskFormat.RAW;
+            } else if (format == Storage.ImageFormat.QCOW2) {
+                srcFileFormat = QemuImg.PhysicalDiskFormat.QCOW2;
+            }
+
+            srcFile = new QemuImgFile(srcTemplateFilePath, srcFileFormat);
+            destFile = new QemuImgFile(destDisk.getPath(), destDisk.getFormat());
+
+            LOGGER.debug("Starting copy from source downloaded template " + srcFile.getFileName() + " to PowerFlex template volume: " + destDisk.getPath());
+            QemuImg qemu = new QemuImg(timeout);
+            qemu.convert(srcFile, destFile);
+            LOGGER.debug("Succesfully converted source downloaded template " + srcFile.getFileName() + " to PowerFlex template volume: " + destDisk.getPath());
+        }  catch (QemuImgException e) {
+            LOGGER.error("Failed to convert from " + srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " + e.getMessage());
+            destDisk = null;
+        } finally {
+            Script.runSimpleBashScript("rm -f " + srcTemplateFilePath);
+        }
+
+        return destDisk;
+    }
+
+    private boolean isTemplateExtractable(String templatePath) {
+        String type = Script.runSimpleBashScript("file " + templatePath + " | awk -F' ' '{print $2}'");
+        return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") || type.equalsIgnoreCase("zip");
+    }
+
+    private String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) {
+        if (downloadedTemplateFile.endsWith(".zip")) {
+            return "unzip -p " + downloadedTemplateFile + " | cat > " + templateFile;
+        } else if (downloadedTemplateFile.endsWith(".bz2")) {
+            return "bunzip2 -c " + downloadedTemplateFile + " > " + templateFile;
+        } else if (downloadedTemplateFile.endsWith(".gz")) {
+            return "gunzip -c " + downloadedTemplateFile + " > " + templateFile;
+        } else {
+            throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile);
+        }
+    }
+}
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
new file mode 100644
index 0000000..4ead92d
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
@@ -0,0 +1,181 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.hypervisor.kvm.storage;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.utils.qemu.QemuImg;
+
+import com.cloud.storage.Storage;
+
+public class ScaleIOStoragePool implements KVMStoragePool {
+    private String uuid;
+    private String sourceHost;
+    private int sourcePort;
+    private String sourceDir;
+    private Storage.StoragePoolType storagePoolType;
+    private StorageAdaptor storageAdaptor;
+    private long capacity;
+    private long used;
+    private long available;
+
+    public ScaleIOStoragePool(String uuid, String host, int port, String path, Storage.StoragePoolType poolType, StorageAdaptor adaptor) {
+        this.uuid = uuid;
+        sourceHost = host;
+        sourcePort = port;
+        sourceDir = path;
+        storagePoolType = poolType;
+        storageAdaptor = adaptor;
+        capacity = 0;
+        used = 0;
+        available = 0;
+    }
+
+    @Override
+    public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size) {
+        return null;
+    }
+
+    @Override
+    public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, Storage.ProvisioningType provisioningType, long size) {
+        return null;
+    }
+
+    @Override
+    public boolean connectPhysicalDisk(String volumeUuid, Map<String, String> details) {
+        return storageAdaptor.connectPhysicalDisk(volumeUuid, this, details);
+    }
+
+    @Override
+    public KVMPhysicalDisk getPhysicalDisk(String volumeId) {
+        return storageAdaptor.getPhysicalDisk(volumeId, this);
+    }
+
+    @Override
+    public boolean disconnectPhysicalDisk(String volumeUuid) {
+        return storageAdaptor.disconnectPhysicalDisk(volumeUuid, this);
+    }
+
+    @Override
+    public boolean deletePhysicalDisk(String volumeUuid, Storage.ImageFormat format) {
+        return true;
+    }
+
+    @Override
+    public List<KVMPhysicalDisk> listPhysicalDisks() {
+        return null;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setCapacity(long capacity) {
+        this.capacity = capacity;
+    }
+
+    @Override
+    public long getCapacity() {
+        return this.capacity;
+    }
+
+    public void setUsed(long used) {
+        this.used = used;
+    }
+
+    @Override
+    public long getUsed() {
+        return this.used;
+    }
+
+    public void setAvailable(long available) {
+        this.available = available;
+    }
+
+    @Override
+    public long getAvailable() {
+        return this.available;
+    }
+
+    @Override
+    public boolean refresh() {
+        return false;
+    }
+
+    @Override
+    public boolean isExternalSnapshot() {
+        return true;
+    }
+
+    @Override
+    public String getLocalPath() {
+        return null;
+    }
+
+    @Override
+    public String getSourceHost() {
+        return this.sourceHost;
+    }
+
+    @Override
+    public String getSourceDir() {
+        return this.sourceDir;
+    }
+
+    @Override
+    public int getSourcePort() {
+        return this.sourcePort;
+    }
+
+    @Override
+    public String getAuthUserName() {
+        return null;
+    }
+
+    @Override
+    public String getAuthSecret() {
+        return null;
+    }
+
+    @Override
+    public Storage.StoragePoolType getType() {
+        return storagePoolType;
+    }
+
+    @Override
+    public boolean delete() {
+        return false;
+    }
+
+    @Override
+    public QemuImg.PhysicalDiskFormat getDefaultFormat() {
+        return QemuImg.PhysicalDiskFormat.RAW;
+    }
+
+    @Override
+    public boolean createFolder(String path) {
+        return false;
+    }
+
+    @Override
+    public boolean supportsConfigDriveIso() {
+        return false;
+    }
+}
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
index 99f2876..570c207 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
@@ -86,7 +86,8 @@
      * Create physical disk on Primary Storage from direct download template on the host (in temporary location)
      * @param templateFilePath
      * @param destPool
-     * @param isIso
+     * @param format
+     * @param timeout
      */
-    KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, KVMStoragePool destPool, boolean isIso);
+    KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFilePath, String destTemplatePath, KVMStoragePool destPool, Storage.ImageFormat format, int timeout);
 }
diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePoolTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePoolTest.java
new file mode 100644
index 0000000..4f18c38
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePoolTest.java
@@ -0,0 +1,155 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.hypervisor.kvm.storage;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.io.FileFilter;
+
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
+import org.apache.cloudstack.utils.qemu.QemuImg;
+import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.StorageLayer;
+
+@PrepareForTest(ScaleIOUtil.class)
+@RunWith(PowerMockRunner.class)
+public class ScaleIOStoragePoolTest {
+
+    ScaleIOStoragePool pool;
+
+    StorageAdaptor adapter;
+
+    @Mock
+    StorageLayer storageLayer;
+
+    @Before
+    public void setUp() throws Exception {
+        final String uuid = "345fc603-2d7e-47d2-b719-a0110b3732e6";
+        final StoragePoolType type = StoragePoolType.PowerFlex;
+
+        adapter = spy(new ScaleIOStorageAdaptor(storageLayer));
+        pool = new ScaleIOStoragePool(uuid, "192.168.1.19", 443, "a519be2f00000000", type, adapter);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testAttributes() {
+        assertEquals(pool.getCapacity(), 0);
+        assertEquals(pool.getUsed(), 0);
+        assertEquals(pool.getAvailable(), 0);
+        assertEquals(pool.getUuid(), "345fc603-2d7e-47d2-b719-a0110b3732e6");
+        assertEquals(pool.getSourceHost(), "192.168.1.19");
+        assertEquals(pool.getSourcePort(), 443);
+        assertEquals(pool.getSourceDir(), "a519be2f00000000");
+        assertEquals(pool.getType(), StoragePoolType.PowerFlex);
+
+        pool.setCapacity(131072);
+        pool.setUsed(24576);
+        pool.setAvailable(106496);
+
+        assertEquals(pool.getCapacity(), 131072);
+        assertEquals(pool.getUsed(), 24576);
+        assertEquals(pool.getAvailable(), 106496);
+    }
+
+    @Test
+    public void testDefaults() {
+        assertEquals(pool.getDefaultFormat(), PhysicalDiskFormat.RAW);
+        assertEquals(pool.getType(), StoragePoolType.PowerFlex);
+
+        assertNull(pool.getAuthUserName());
+        assertNull(pool.getAuthSecret());
+
+        Assert.assertFalse(pool.supportsConfigDriveIso());
+        assertTrue(pool.isExternalSnapshot());
+    }
+
+    public void testGetPhysicalDiskWithWildcardFileFilter() throws Exception {
+        final String volumePath = "6c3362b500000001:vol-139-3d2c-12f0";
+        final String systemId = "218ce1797566a00f";
+
+        File dir = PowerMockito.mock(File.class);
+        PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(dir);
+
+        // TODO: Mock file in dir
+        File[] files = new File[1];
+        String volumeId = ScaleIOUtil.getVolumePath(volumePath);
+        String diskFilePath = ScaleIOUtil.DISK_PATH + File.separator + ScaleIOUtil.DISK_NAME_PREFIX + systemId + "-" + volumeId;
+        files[0] = new File(diskFilePath);
+        PowerMockito.when(dir.listFiles(any(FileFilter.class))).thenReturn(files);
+
+        KVMPhysicalDisk disk = adapter.getPhysicalDisk(volumePath, pool);
+        assertNull(disk);
+    }
+
+    @Test
+    public void testGetPhysicalDiskWithSystemId() throws Exception {
+        final String volumePath = "6c3362b500000001:vol-139-3d2c-12f0";
+        final String volumeId = ScaleIOUtil.getVolumePath(volumePath);
+        final String systemId = "218ce1797566a00f";
+        PowerMockito.mockStatic(ScaleIOUtil.class);
+        when(ScaleIOUtil.getSystemIdForVolume(volumeId)).thenReturn(systemId);
+
+        // TODO: Mock file exists
+        File file = PowerMockito.mock(File.class);
+        PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file);
+        PowerMockito.when(file.exists()).thenReturn(true);
+
+        KVMPhysicalDisk disk = adapter.getPhysicalDisk(volumePath, pool);
+        assertNull(disk);
+    }
+
+    @Test
+    public void testConnectPhysicalDisk() {
+        final String volumePath = "6c3362b500000001:vol-139-3d2c-12f0";
+        final String volumeId = ScaleIOUtil.getVolumePath(volumePath);
+        final String systemId = "218ce1797566a00f";
+        final String diskFilePath = ScaleIOUtil.DISK_PATH + File.separator + ScaleIOUtil.DISK_NAME_PREFIX + systemId + "-" + volumeId;
+        KVMPhysicalDisk disk = new KVMPhysicalDisk(diskFilePath, volumePath, pool);
+        disk.setFormat(QemuImg.PhysicalDiskFormat.RAW);
+        disk.setSize(8192);
+        disk.setVirtualSize(8192);
+
+        assertEquals(disk.getPath(), "/dev/disk/by-id/emc-vol-218ce1797566a00f-6c3362b500000001");
+
+        when(adapter.getPhysicalDisk(volumeId, pool)).thenReturn(disk);
+
+        final boolean result = adapter.connectPhysicalDisk(volumePath, pool, null);
+        assertTrue(result);
+    }
+}
\ No newline at end of file
diff --git a/plugins/hypervisors/ovm/pom.xml b/plugins/hypervisors/ovm/pom.xml
index 2e2c940..9481905 100644
--- a/plugins/hypervisors/ovm/pom.xml
+++ b/plugins/hypervisors/ovm/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/hypervisors/ovm3/pom.xml b/plugins/hypervisors/ovm3/pom.xml
index d9c6d28..f7f66fa 100644
--- a/plugins/hypervisors/ovm3/pom.xml
+++ b/plugins/hypervisors/ovm3/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/hypervisors/simulator/pom.xml b/plugins/hypervisors/simulator/pom.xml
index e81cccf..ad123aa 100644
--- a/plugins/hypervisors/simulator/pom.xml
+++ b/plugins/hypervisors/simulator/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <artifactId>cloud-plugin-hypervisor-simulator</artifactId>
diff --git a/plugins/hypervisors/ucs/pom.xml b/plugins/hypervisors/ucs/pom.xml
index 08712dc..c8a1167 100644
--- a/plugins/hypervisors/ucs/pom.xml
+++ b/plugins/hypervisors/ucs/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <artifactId>cloud-plugin-hypervisor-ucs</artifactId>
diff --git a/plugins/hypervisors/vmware/pom.xml b/plugins/hypervisors/vmware/pom.xml
index 01b31cf..0a809f6 100644
--- a/plugins/hypervisors/vmware/pom.xml
+++ b/plugins/hypervisors/vmware/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
index d48a5d9..a592126 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.hypervisor.guru;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -62,6 +64,7 @@
 import com.cloud.agent.api.to.DataStoreTO;
 import com.cloud.agent.api.to.DataTO;
 import com.cloud.agent.api.to.DiskTO;
+import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.cluster.ClusterManager;
@@ -149,8 +152,6 @@
 import com.vmware.vim25.VirtualMachineConfigSummary;
 import com.vmware.vim25.VirtualMachineRuntimeInfo;
 
-import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
-
 public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Configurable {
     private static final Logger s_logger = Logger.getLogger(VMwareGuru.class);
 
@@ -209,16 +210,35 @@
         return vmwareVmImplementer.implement(vm, toVirtualMachineTO(vm), getClusterId(vm.getId()));
     }
 
-    long getClusterId(long vmId) {
-        long clusterId;
-        Long hostId;
-
-        hostId = _vmDao.findById(vmId).getHostId();
-        if (hostId == null) {
+    Long getClusterId(long vmId) {
+        Long clusterId = null;
+        Long hostId = null;
+        VMInstanceVO vm = _vmDao.findById(vmId);
+        if (vm != null) {
+            hostId = _vmDao.findById(vmId).getHostId();
+        }
+        if (vm != null && hostId == null) {
             // If VM is in stopped state then hostId would be undefined. Hence read last host's Id instead.
             hostId = _vmDao.findById(vmId).getLastHostId();
         }
-        clusterId = _hostDao.findById(hostId).getClusterId();
+        HostVO host = null;
+        if (hostId != null) {
+            host = _hostDao.findById(hostId);
+        }
+        if (host != null) {
+            clusterId = host.getClusterId();
+        } else {
+            List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(vmId, Volume.Type.ROOT);
+            if (CollectionUtils.isNotEmpty(volumes)) {
+                VolumeVO rootVolume = volumes.get(0);
+                if (rootVolume.getPoolId() != null) {
+                    StoragePoolVO pool = _storagePoolDao.findById(rootVolume.getPoolId());
+                    if (pool != null && pool.getClusterId() != null) {
+                        clusterId = pool.getClusterId();
+                    }
+                }
+            }
+        }
 
         return clusterId;
     }
@@ -418,9 +438,11 @@
 
     @Override public Map<String, String> getClusterSettings(long vmId) {
         Map<String, String> details = new HashMap<String, String>();
-        long clusterId = getClusterId(vmId);
-        details.put(VmwareReserveCpu.key(), VmwareReserveCpu.valueIn(clusterId).toString());
-        details.put(VmwareReserveMemory.key(), VmwareReserveMemory.valueIn(clusterId).toString());
+        Long clusterId = getClusterId(vmId);
+        if (clusterId != null) {
+            details.put(VmwareReserveCpu.key(), VmwareReserveCpu.valueIn(clusterId).toString());
+            details.put(VmwareReserveMemory.key(), VmwareReserveMemory.valueIn(clusterId).toString());
+        }
         return details;
     }
 
@@ -1056,24 +1078,46 @@
         return null;
     }
 
-    @Override public List<Command> finalizeMigrate(VirtualMachine vm, StoragePool destination) {
+    @Override public List<Command> finalizeMigrate(VirtualMachine vm, Map<Volume, StoragePool> volumeToPool) {
         List<Command> commands = new ArrayList<Command>();
 
         // OfflineVmwareMigration: specialised migration command
-        List<VolumeVO> volumes = _volumeDao.findByInstance(vm.getId());
         List<VolumeTO> vols = new ArrayList<>();
-        for (Volume volume : volumes) {
-            VolumeTO vol = new VolumeTO(volume, destination);
-            vols.add(vol);
+        List<Pair<VolumeTO, StorageFilerTO>> volumeToFilerTo = new ArrayList<Pair<VolumeTO, StorageFilerTO>>();
+        Long poolClusterId = null;
+        Host hostInTargetCluster = null;
+        for (Map.Entry<Volume, StoragePool> entry : volumeToPool.entrySet()) {
+            Volume volume = entry.getKey();
+            StoragePool pool = entry.getValue();
+            VolumeTO volumeTo = new VolumeTO(volume, _storagePoolDao.findById(pool.getId()));
+            StorageFilerTO filerTo = new StorageFilerTO(pool);
+            if (pool.getClusterId() != null) {
+                poolClusterId = pool.getClusterId();
+            }
+            volumeToFilerTo.add(new Pair<VolumeTO, StorageFilerTO>(volumeTo, filerTo));
+            vols.add(volumeTo);
         }
-        MigrateVmToPoolCommand migrateVmToPoolCommand = new MigrateVmToPoolCommand(vm.getInstanceName(), vols, destination.getUuid(), true);
+        final Long destClusterId = poolClusterId;
+        final Long srcClusterId = getClusterId(vm.getId());
+        final boolean isInterClusterMigration = srcClusterId != null && destClusterId != null && ! srcClusterId.equals(destClusterId);
+        if (isInterClusterMigration) {
+            // Without host vMotion might fail between non-shared storages with error similar to,
+            // https://kb.vmware.com/s/article/1003795
+            // As this is offline migration VM won't be started on this host
+            List<HostVO> hosts = _hostDao.findHypervisorHostInCluster(destClusterId);
+            if (CollectionUtils.isNotEmpty(hosts)) {
+                hostInTargetCluster = hosts.get(0);
+            }
+            if (hostInTargetCluster == null) {
+                throw new CloudRuntimeException("Migration failed, unable to find suitable target host for VM placement while migrating between storage pools of different clusters without shared storages");
+            }
+        }
+        MigrateVmToPoolCommand migrateVmToPoolCommand = new MigrateVmToPoolCommand(vm.getInstanceName(),
+                volumeToFilerTo, hostInTargetCluster == null ? null : hostInTargetCluster.getGuid(), true);
         commands.add(migrateVmToPoolCommand);
 
         // OfflineVmwareMigration: cleanup if needed
-        final Long destClusterId = destination.getClusterId();
-        final Long srcClusterId = getClusterId(vm.getId());
-
-        if (srcClusterId != null && destClusterId != null && !srcClusterId.equals(destClusterId)) {
+        if (isInterClusterMigration) {
             final String srcDcName = _clusterDetailsDao.getVmwareDcName(srcClusterId);
             final String destDcName = _clusterDetailsDao.getVmwareDcName(destClusterId);
             if (srcDcName != null && destDcName != null && !srcDcName.equals(destDcName)) {
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 56d08a4..44add8e 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -16,6 +16,9 @@
 // under the License.
 package com.cloud.hypervisor.vmware.resource;
 
+import static com.cloud.utils.HumanReadableJson.getHumanReadableBytesJson;
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -45,16 +48,18 @@
 import javax.naming.ConfigurationException;
 import javax.xml.datatype.XMLGregorianCalendar;
 
-import com.cloud.agent.api.to.DataTO;
-import com.cloud.agent.api.to.DeployAsIsInfoTO;
-import com.cloud.agent.api.ValidateVcenterDetailsCommand;
 import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.storage.command.CopyCommand;
+import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
 import org.apache.cloudstack.storage.configdrive.ConfigDrive;
+import org.apache.cloudstack.storage.resource.NfsSecondaryStorageResource;
+import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo;
 import org.apache.cloudstack.vm.UnmanagedInstanceTO;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberUtils;
@@ -162,6 +167,7 @@
 import com.cloud.agent.api.UpgradeSnapshotCommand;
 import com.cloud.agent.api.ValidateSnapshotAnswer;
 import com.cloud.agent.api.ValidateSnapshotCommand;
+import com.cloud.agent.api.ValidateVcenterDetailsCommand;
 import com.cloud.agent.api.VmDiskStatsEntry;
 import com.cloud.agent.api.VmStatsEntry;
 import com.cloud.agent.api.VolumeStatsEntry;
@@ -178,12 +184,13 @@
 import com.cloud.agent.api.storage.DestroyCommand;
 import com.cloud.agent.api.storage.MigrateVolumeAnswer;
 import com.cloud.agent.api.storage.MigrateVolumeCommand;
-import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
 import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
 import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
 import com.cloud.agent.api.storage.ResizeVolumeAnswer;
 import com.cloud.agent.api.storage.ResizeVolumeCommand;
 import com.cloud.agent.api.to.DataStoreTO;
+import com.cloud.agent.api.to.DataTO;
+import com.cloud.agent.api.to.DeployAsIsInfoTO;
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.agent.api.to.IpAddressTO;
 import com.cloud.agent.api.to.NfsTO;
@@ -191,6 +198,7 @@
 import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
 import com.cloud.agent.resource.virtualnetwork.VRScripts;
 import com.cloud.agent.resource.virtualnetwork.VirtualRouterDeployer;
 import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
@@ -219,8 +227,8 @@
 import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
 import com.cloud.hypervisor.vmware.mo.NetworkDetails;
 import com.cloud.hypervisor.vmware.mo.PbmProfileManagerMO;
-import com.cloud.hypervisor.vmware.mo.TaskMO;
 import com.cloud.hypervisor.vmware.mo.StoragepodMO;
+import com.cloud.hypervisor.vmware.mo.TaskMO;
 import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
 import com.cloud.hypervisor.vmware.mo.VirtualMachineDiskInfoBuilder;
 import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
@@ -289,7 +297,6 @@
 import com.vmware.vim25.HostPortGroupSpec;
 import com.vmware.vim25.ManagedObjectReference;
 import com.vmware.vim25.NasDatastoreInfo;
-import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
 import com.vmware.vim25.ObjectContent;
 import com.vmware.vim25.OptionValue;
 import com.vmware.vim25.PerfCounterInfo;
@@ -324,6 +331,7 @@
 import com.vmware.vim25.VirtualIDEController;
 import com.vmware.vim25.VirtualMachineBootOptions;
 import com.vmware.vim25.VirtualMachineConfigSpec;
+import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
 import com.vmware.vim25.VirtualMachineFileInfo;
 import com.vmware.vim25.VirtualMachineFileLayoutEx;
 import com.vmware.vim25.VirtualMachineFileLayoutExFileInfo;
@@ -343,13 +351,6 @@
 import com.vmware.vim25.VmConfigSpec;
 import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec;
 import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec;
-import org.apache.cloudstack.storage.command.CopyCommand;
-import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
-import org.apache.cloudstack.storage.resource.NfsSecondaryStorageResource;
-import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
-
-import static com.cloud.utils.HumanReadableJson.getHumanReadableBytesJson;
-import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
 
 public class VmwareResource implements StoragePoolResource, ServerResource, VmwareHostService, VirtualRouterDeployer {
     private static final Logger s_logger = Logger.getLogger(VmwareResource.class);
@@ -4376,7 +4377,7 @@
 
     protected Answer execute(MigrateVmToPoolCommand cmd) {
         if (s_logger.isInfoEnabled()) {
-            s_logger.info(String.format("excuting MigrateVmToPoolCommand %s -> %s", cmd.getVmName(), cmd.getDestinationPool()));
+            s_logger.info(String.format("Executing MigrateVmToPoolCommand %s", cmd.getVmName()));
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("MigrateVmToPoolCommand: " + _gson.toJson(cmd));
             }
@@ -4388,13 +4389,17 @@
         try {
             VirtualMachineMO vmMo = getVirtualMachineMO(vmName, hyperHost);
             if (vmMo == null) {
-                String msg = "VM " + vmName + " does not exist in VMware datacenter";
-                s_logger.error(msg);
-                throw new CloudRuntimeException(msg);
+                s_logger.info("VM " + vmName + " was not found in the cluster of host " + hyperHost.getHyperHostName() + ". Looking for the VM in datacenter.");
+                ManagedObjectReference dcMor = hyperHost.getHyperHostDatacenter();
+                DatacenterMO dcMo = new DatacenterMO(hyperHost.getContext(), dcMor);
+                vmMo = dcMo.findVm(vmName);
+                if (vmMo == null) {
+                    String msg = "VM " + vmName + " does not exist in VMware datacenter";
+                    s_logger.error(msg);
+                    throw new CloudRuntimeException(msg);
+                }
             }
-
-            String poolUuid = cmd.getDestinationPool();
-            return migrateAndAnswer(vmMo, poolUuid, hyperHost, cmd);
+            return migrateAndAnswer(vmMo, null, hyperHost, cmd);
         } catch (Throwable e) { // hopefully only CloudRuntimeException :/
             if (e instanceof Exception) {
                 return new Answer(cmd, (Exception) e);
@@ -4408,37 +4413,40 @@
     }
 
     private Answer migrateAndAnswer(VirtualMachineMO vmMo, String poolUuid, VmwareHypervisorHost hyperHost, Command cmd) throws Exception {
-        ManagedObjectReference morDs = getTargetDatastoreMOReference(poolUuid, hyperHost);
+        String hostNameInTargetCluster = null;
+        List<Pair<VolumeTO, StorageFilerTO>> volToFiler = new ArrayList<>();
+        if (cmd instanceof MigrateVmToPoolCommand) {
+            MigrateVmToPoolCommand mcmd = (MigrateVmToPoolCommand)cmd;
+            hostNameInTargetCluster = mcmd.getHostGuidInTargetCluster();
+            volToFiler = mcmd.getVolumeToFilerAsList();
+        } else if (cmd instanceof MigrateVolumeCommand) {
+            hostNameInTargetCluster = ((MigrateVolumeCommand)cmd).getHostGuidInTargetCluster();
+        }
+        VmwareHypervisorHost hostInTargetCluster = VmwareHelper.getHostMOFromHostName(getServiceContext(),
+                hostNameInTargetCluster);
 
         try {
             // OfflineVmwareMigration: getVolumesFromCommand(cmd);
-            Map<Integer, Long> volumeDeviceKey = getVolumesFromCommand(vmMo, cmd);
-            if (s_logger.isTraceEnabled()) {
-                for (Integer diskId : volumeDeviceKey.keySet()) {
-                    s_logger.trace(String.format("disk to migrate has disk id %d and volumeId %d", diskId, volumeDeviceKey.get(diskId)));
+            Map<Integer, Long> volumeDeviceKey = new HashMap<>();
+            if (cmd instanceof MigrateVolumeCommand) { // Else device keys will be found in relocateVirtualMachine
+                MigrateVolumeCommand mcmd = (MigrateVolumeCommand) cmd;
+                addVolumeDiskmapping(vmMo, volumeDeviceKey, mcmd.getVolumePath(), mcmd.getVolumeId());
+                if (s_logger.isTraceEnabled()) {
+                    for (Integer diskId: volumeDeviceKey.keySet()) {
+                        s_logger.trace(String.format("Disk to migrate has disk id %d and volumeId %d", diskId, volumeDeviceKey.get(diskId)));
+                    }
                 }
             }
-            if (vmMo.changeDatastore(morDs)) {
-                // OfflineVmwareMigration: create target specification to include in answer
-                // Consolidate VM disks after successful VM migration
-                // In case of a linked clone VM, if VM's disks are not consolidated, further VM operations such as volume snapshot, VM snapshot etc. will result in DB inconsistencies.
-                if (!vmMo.consolidateVmDisks()) {
-                    s_logger.warn("VM disk consolidation failed after storage migration. Yet proceeding with VM migration.");
-                } else {
-                    s_logger.debug("Successfully consolidated disks of VM " + vmMo.getVmName() + ".");
-                }
-                return createAnswerForCmd(vmMo, poolUuid, cmd, volumeDeviceKey);
-            } else {
-                return new Answer(cmd, false, "failed to changes data store for VM" + vmMo.getVmName());
-            }
+            List<VolumeObjectTO> volumeToList = relocateVirtualMachine(hyperHost, vmMo.getName(), null, null, hostInTargetCluster, poolUuid, volToFiler);
+            return createAnswerForCmd(vmMo, volumeToList, cmd, volumeDeviceKey);
         } catch (Exception e) {
-            String msg = "change data store for VM " + vmMo.getVmName() + " failed";
+            String msg = "Change data store for VM " + vmMo.getVmName() + " failed";
             s_logger.error(msg + ": " + e.getLocalizedMessage());
             throw new CloudRuntimeException(msg, e);
         }
     }
 
-    Answer createAnswerForCmd(VirtualMachineMO vmMo, String poolUuid, Command cmd, Map<Integer, Long> volumeDeviceKey) throws Exception {
+    Answer createAnswerForCmd(VirtualMachineMO vmMo, List<VolumeObjectTO> volumeObjectToList, Command cmd, Map<Integer, Long> volumeDeviceKey) throws Exception {
         List<VolumeObjectTO> volumeToList = new ArrayList<>();
         VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
         VirtualDisk[] disks = vmMo.getAllDiskDevice();
@@ -4453,34 +4461,12 @@
             }
             throw new CloudRuntimeException("not expecting more then  one disk after migrate volume command");
         } else if (cmd instanceof MigrateVmToPoolCommand) {
-            for (VirtualDisk disk : disks) {
-                VolumeObjectTO newVol = new VolumeObjectTO();
-                String newPath = vmMo.getVmdkFileBaseName(disk);
-                VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(newPath, poolUuid);
-                newVol.setId(volumeDeviceKey.get(disk.getKey()));
-                newVol.setPath(newPath);
-                newVol.setChainInfo(_gson.toJson(diskInfo));
-                volumeToList.add(newVol);
-            }
-            return new MigrateVmToPoolAnswer((MigrateVmToPoolCommand) cmd, volumeToList);
+            volumeToList = volumeObjectToList;
+            return new MigrateVmToPoolAnswer((MigrateVmToPoolCommand)cmd, volumeToList);
         }
         return new Answer(cmd, false, null);
     }
 
-    private Map<Integer, Long> getVolumesFromCommand(VirtualMachineMO vmMo, Command cmd) throws Exception {
-        Map<Integer, Long> volumeDeviceKey = new HashMap<Integer, Long>();
-        if (cmd instanceof MigrateVmToPoolCommand) {
-            MigrateVmToPoolCommand mcmd = (MigrateVmToPoolCommand) cmd;
-            for (VolumeTO volume : mcmd.getVolumes()) {
-                addVolumeDiskmapping(vmMo, volumeDeviceKey, volume.getPath(), volume.getId());
-            }
-        } else if (cmd instanceof MigrateVolumeCommand) {
-            MigrateVolumeCommand mcmd = (MigrateVolumeCommand) cmd;
-            addVolumeDiskmapping(vmMo, volumeDeviceKey, mcmd.getVolumePath(), mcmd.getVolumeId());
-        }
-        return volumeDeviceKey;
-    }
-
     private void addVolumeDiskmapping(VirtualMachineMO vmMo, Map<Integer, Long> volumeDeviceKey, String volumePath, long volumeId) throws Exception {
         if (s_logger.isDebugEnabled()) {
             s_logger.debug(String.format("locating disk for volume (%d) using path %s", volumeId, volumePath));
@@ -4577,254 +4563,21 @@
     }
 
     protected Answer execute(MigrateWithStorageCommand cmd) {
-
         if (s_logger.isInfoEnabled()) {
             s_logger.info("Executing resource MigrateWithStorageCommand: " + getHumanReadableBytesJson(_gson.toJson(cmd)));
         }
 
-        VirtualMachineTO vmTo = cmd.getVirtualMachine();
-        String vmName = vmTo.getName();
-
-        VmwareHypervisorHost srcHyperHost = null;
-        VmwareHypervisorHost tgtHyperHost = null;
-        VirtualMachineMO vmMo = null;
-
-        ManagedObjectReference morDsAtTarget = null;
-        ManagedObjectReference morDsAtSource = null;
-        ManagedObjectReference morDc = null;
-        ManagedObjectReference morDcOfTargetHost = null;
-        ManagedObjectReference morTgtHost = new ManagedObjectReference();
-        ManagedObjectReference morTgtDatastore = new ManagedObjectReference();
-        VirtualMachineRelocateSpec relocateSpec = new VirtualMachineRelocateSpec();
-        List<VirtualMachineRelocateSpecDiskLocator> diskLocators = new ArrayList<VirtualMachineRelocateSpecDiskLocator>();
-        VirtualMachineRelocateSpecDiskLocator diskLocator = null;
-
-        String tgtDsName = "";
-        String tgtDsHost;
-        String tgtDsPath;
-        int tgtDsPort;
-        VolumeTO volume;
-        StorageFilerTO filerTo;
-        Set<String> mountedDatastoresAtSource = new HashSet<String>();
-        List<VolumeObjectTO> volumeToList = new ArrayList<VolumeObjectTO>();
-        Map<Long, Integer> volumeDeviceKey = new HashMap<Long, Integer>();
-
-        List<Pair<VolumeTO, StorageFilerTO>> volToFiler = cmd.getVolumeToFilerAsList();
-        String tgtHost = cmd.getTargetHost();
-        String tgtHostMorInfo = tgtHost.split("@")[0];
-        morTgtHost.setType(tgtHostMorInfo.split(":")[0]);
-        morTgtHost.setValue(tgtHostMorInfo.split(":")[1]);
+        final VirtualMachineTO vmTo = cmd.getVirtualMachine();
+        final List<Pair<VolumeTO, StorageFilerTO>> volToFiler = cmd.getVolumeToFilerAsList();
+        final String targetHost = cmd.getTargetHost();
 
         try {
-            srcHyperHost = getHyperHost(getServiceContext());
-            tgtHyperHost = new HostMO(getServiceContext(), morTgtHost);
-            morDc = srcHyperHost.getHyperHostDatacenter();
-            morDcOfTargetHost = tgtHyperHost.getHyperHostDatacenter();
-            if (!morDc.getValue().equalsIgnoreCase(morDcOfTargetHost.getValue())) {
-                String msg = "Source host & target host are in different datacentesr";
-                throw new CloudRuntimeException(msg);
-            }
-            VmwareManager mgr = tgtHyperHost.getContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
-            String srcHostApiVersion = ((HostMO) srcHyperHost).getHostAboutInfo().getApiVersion();
-
-            // find VM through datacenter (VM is not at the target host yet)
-            vmMo = srcHyperHost.findVmOnPeerHyperHost(vmName);
-            if (vmMo == null) {
-                String msg = "VM " + vmName + " does not exist in VMware datacenter " + morDc.getValue();
-                s_logger.error(msg);
-                throw new Exception(msg);
-            }
-            vmName = vmMo.getName();
-
-            // Specify destination datastore location for each volume
-            for (Pair<VolumeTO, StorageFilerTO> entry : volToFiler) {
-                volume = entry.first();
-                filerTo = entry.second();
-
-                s_logger.debug("Preparing spec for volume : " + volume.getName());
-                morDsAtTarget = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(tgtHyperHost, filerTo.getUuid());
-                morDsAtSource = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(srcHyperHost, volume.getPoolUuid());
-
-                if (morDsAtTarget == null) {
-                    String msg = "Unable to find the target datastore: " + filerTo.getUuid() + " on target host: " + tgtHyperHost.getHyperHostName()
-                            + " to execute MigrateWithStorageCommand";
-                    s_logger.error(msg);
-                    throw new Exception(msg);
-                }
-                morTgtDatastore = morDsAtTarget;
-
-                // If host version is below 5.1 then simultaneous change of VM's datastore and host is not supported.
-                // So since only the datastore will be changed first, ensure the target datastore is mounted on source host.
-                if (srcHostApiVersion.compareTo("5.1") < 0) {
-                    tgtDsName = filerTo.getUuid().replace("-", "");
-                    tgtDsHost = filerTo.getHost();
-                    tgtDsPath = filerTo.getPath();
-                    tgtDsPort = filerTo.getPort();
-
-                    // If datastore is NFS and target datastore is not already mounted on source host then mount the datastore.
-                    if (filerTo.getType().equals(StoragePoolType.NetworkFilesystem)) {
-                        if (morDsAtSource == null) {
-                            morDsAtSource = srcHyperHost.mountDatastore(false, tgtDsHost, tgtDsPort, tgtDsPath, tgtDsName, true);
-                            if (morDsAtSource == null) {
-                                throw new Exception("Unable to mount NFS datastore " + tgtDsHost + ":/" + tgtDsPath + " on " + _hostName);
-                            }
-                            mountedDatastoresAtSource.add(tgtDsName);
-                            s_logger.debug("Mounted datastore " + tgtDsHost + ":/" + tgtDsPath + " on " + _hostName);
-                        }
-                    }
-                    // If datastore is VMFS and target datastore is not mounted or accessible to source host then fail migration.
-                    if (filerTo.getType().equals(StoragePoolType.VMFS) || filerTo.getType().equals(StoragePoolType.PreSetup)) {
-                        if (morDsAtSource == null) {
-                            s_logger.warn(
-                                    "If host version is below 5.1, then target VMFS datastore(s) need to manually mounted on source host for a successful live storage migration.");
-                            throw new Exception("Target VMFS datastore: " + tgtDsPath + " is not mounted on source host: " + _hostName);
-                        }
-                        DatastoreMO dsAtSourceMo = new DatastoreMO(getServiceContext(), morDsAtSource);
-                        String srcHostValue = srcHyperHost.getMor().getValue();
-                        if (!dsAtSourceMo.isAccessibleToHost(srcHostValue)) {
-                            s_logger.warn("If host version is below 5.1, then target VMFS datastore(s) need to accessible to source host for a successful live storage migration.");
-                            throw new Exception("Target VMFS datastore: " + tgtDsPath + " is not accessible on source host: " + _hostName);
-                        }
-                    }
-                    morTgtDatastore = morDsAtSource;
-                }
-
-                if (volume.getType() == Volume.Type.ROOT) {
-                    relocateSpec.setDatastore(morTgtDatastore);
-                }
-
-                diskLocator = new VirtualMachineRelocateSpecDiskLocator();
-                diskLocator.setDatastore(morTgtDatastore);
-                Pair<VirtualDisk, String> diskInfo = getVirtualDiskInfo(vmMo, appendFileType(volume.getPath(), VMDK_EXTENSION));
-                String vmdkAbsFile = getAbsoluteVmdkFile(diskInfo.first());
-                if (vmdkAbsFile != null && !vmdkAbsFile.isEmpty()) {
-                    vmMo.updateAdapterTypeIfRequired(vmdkAbsFile);
-                }
-                int diskId = diskInfo.first().getKey();
-                diskLocator.setDiskId(diskId);
-
-                diskLocators.add(diskLocator);
-                volumeDeviceKey.put(volume.getId(), diskId);
-            }
-            // If a target datastore is provided for the VM, then by default all volumes associated with the VM will be migrated to that target datastore.
-            // Hence set the existing datastore as target datastore for volumes that are not to be migrated.
-            List<Pair<Integer, ManagedObjectReference>> diskDatastores = vmMo.getAllDiskDatastores();
-            for (Pair<Integer, ManagedObjectReference> diskDatastore : diskDatastores) {
-                if (!volumeDeviceKey.containsValue(diskDatastore.first().intValue())) {
-                    diskLocator = new VirtualMachineRelocateSpecDiskLocator();
-                    diskLocator.setDiskId(diskDatastore.first().intValue());
-                    diskLocator.setDatastore(diskDatastore.second());
-                    diskLocators.add(diskLocator);
-                }
-            }
-            relocateSpec.getDisk().addAll(diskLocators);
-
-            // Prepare network at target before migration
-            NicTO[] nics = vmTo.getNics();
-            for (NicTO nic : nics) {
-                // prepare network on the host
-                prepareNetworkFromNicInfo(new HostMO(getServiceContext(), morTgtHost), nic, false, vmTo.getType());
-            }
-
-            // Ensure all secondary storage mounted on target host
-            List<Pair<String, Long>> secStoreUrlAndIdList = mgr.getSecondaryStorageStoresUrlAndIdList(Long.parseLong(_dcId));
-            for (Pair<String, Long> secStoreUrlAndId : secStoreUrlAndIdList) {
-                String secStoreUrl = secStoreUrlAndId.first();
-                Long secStoreId = secStoreUrlAndId.second();
-                if (secStoreUrl == null) {
-                    String msg = String.format("Secondary storage for dc %s is not ready yet?", _dcId);
-                    throw new Exception(msg);
-                }
-
-                if (vmTo.getType() != VirtualMachine.Type.User) {
-                    mgr.prepareSecondaryStorageStore(secStoreUrl, secStoreId);
-                }
-
-                ManagedObjectReference morSecDs = prepareSecondaryDatastoreOnSpecificHost(secStoreUrl, tgtHyperHost);
-                if (morSecDs == null) {
-                    String msg = "Failed to prepare secondary storage on host, secondary store url: " + secStoreUrl;
-                    throw new Exception(msg);
-                }
-            }
-
-            if (srcHostApiVersion.compareTo("5.1") < 0) {
-                // Migrate VM's volumes to target datastore(s).
-                if (!vmMo.changeDatastore(relocateSpec)) {
-                    throw new Exception("Change datastore operation failed during storage migration");
-                } else {
-                    s_logger.debug("Successfully migrated storage of VM " + vmName + " to target datastore(s)");
-                }
-
-                // Migrate VM to target host.
-                ManagedObjectReference morPool = tgtHyperHost.getHyperHostOwnerResourcePool();
-                if (!vmMo.migrate(morPool, tgtHyperHost.getMor())) {
-                    throw new Exception("VM migration to target host failed during storage migration");
-                } else {
-                    s_logger.debug("Successfully migrated VM " + vmName + " from " + _hostName + " to " + tgtHyperHost.getHyperHostName());
-                }
-            } else {
-                // Simultaneously migrate VM's volumes to target datastore and VM to target host.
-                relocateSpec.setHost(tgtHyperHost.getMor());
-                relocateSpec.setPool(tgtHyperHost.getHyperHostOwnerResourcePool());
-                if (!vmMo.changeDatastore(relocateSpec)) {
-                    throw new Exception("Change datastore operation failed during storage migration");
-                } else {
-                    s_logger.debug(
-                            "Successfully migrated VM " + vmName + " from " + _hostName + " to " + tgtHyperHost.getHyperHostName() + " and its storage to target datastore(s)");
-                }
-            }
-
-            // Consolidate VM disks.
-            // In case of a linked clone VM, if VM's disks are not consolidated, further VM operations such as volume snapshot, VM snapshot etc. will result in DB inconsistencies.
-            if (!vmMo.consolidateVmDisks()) {
-                s_logger.warn("VM disk consolidation failed after storage migration. Yet proceeding with VM migration.");
-            } else {
-                s_logger.debug("Successfully consolidated disks of VM " + vmName + ".");
-            }
-
-            // Update and return volume path and chain info for every disk because that could have changed after migration
-            VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
-            for (Pair<VolumeTO, StorageFilerTO> entry : volToFiler) {
-                volume = entry.first();
-                long volumeId = volume.getId();
-                VirtualDisk[] disks = vmMo.getAllDiskDevice();
-                for (VirtualDisk disk : disks) {
-                    if (volumeDeviceKey.get(volumeId) == disk.getKey()) {
-                        VolumeObjectTO newVol = new VolumeObjectTO();
-                        String newPath = vmMo.getVmdkFileBaseName(disk);
-                        String poolName = entry.second().getUuid().replace("-", "");
-                        VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(newPath, poolName);
-                        newVol.setId(volumeId);
-                        newVol.setPath(newPath);
-                        newVol.setChainInfo(_gson.toJson(diskInfo));
-                        volumeToList.add(newVol);
-                        break;
-                    }
-                }
-            }
-
+            List<VolumeObjectTO> volumeToList =  relocateVirtualMachine(null, null, vmTo, targetHost, null, null, volToFiler);
             return new MigrateWithStorageAnswer(cmd, volumeToList);
         } catch (Throwable e) {
-            if (e instanceof RemoteException) {
-                s_logger.warn("Encountered remote exception at vCenter, invalidating VMware session context");
-                invalidateServiceContext();
-            }
-
-            String msg = "MigrationCommand failed due to " + VmwareHelper.getExceptionMessage(e);
+            String msg = "MigrateWithStorageCommand failed due to " + VmwareHelper.getExceptionMessage(e);
             s_logger.warn(msg, e);
-            return new MigrateWithStorageAnswer(cmd, (Exception) e);
-        } finally {
-            // Cleanup datastores mounted on source host
-            for (String mountedDatastore : mountedDatastoresAtSource) {
-                s_logger.debug("Attempting to unmount datastore " + mountedDatastore + " at " + _hostName);
-                try {
-                    srcHyperHost.unmountDatastore(mountedDatastore);
-                } catch (Exception unmountEx) {
-                    s_logger.debug("Failed to unmount datastore " + mountedDatastore + " at " + _hostName + ". Seems the datastore is still being used by " + _hostName
-                            + ". Please unmount manually to cleanup.");
-                }
-                s_logger.debug("Successfully unmounted datastore " + mountedDatastore + " at " + _hostName);
-            }
+            return new MigrateWithStorageAnswer(cmd, (Exception)e);
         }
     }
 
@@ -4834,10 +4587,10 @@
 
         VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
         VirtualMachineMO vmMo = null;
-        DatastoreMO dsMo = null;
+        DatastoreMO sourceDsMo = null;
         DatastoreMO destinationDsMo = null;
         ManagedObjectReference morSourceDS = null;
-        ManagedObjectReference morDestintionDS = null;
+        ManagedObjectReference morDestinationDS = null;
         String vmdkDataStorePath = null;
         boolean isvVolsInvolved = false;
 
@@ -4847,24 +4600,41 @@
             // OfflineVmwareMigration: this method is 100 lines and needs refactorring anyway
             // we need to spawn a worker VM to attach the volume to and move it
             morSourceDS = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getSourcePool().getUuid());
-            dsMo = new DatastoreMO(hyperHost.getContext(), morSourceDS);
-            morDestintionDS = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getTargetPool().getUuid());
-            destinationDsMo = new DatastoreMO(hyperHost.getContext(), morDestintionDS);
+            sourceDsMo = new DatastoreMO(hyperHost.getContext(), morSourceDS);
+            VmwareHypervisorHost hostInTargetCluster = VmwareHelper.getHostMOFromHostName(getServiceContext(),
+                    cmd.getHostGuidInTargetCluster());
+            VmwareHypervisorHost dsHost = hostInTargetCluster == null ? hyperHost : hostInTargetCluster;
+            String targetDsName = cmd.getTargetPool().getUuid();
+            morDestinationDS = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(dsHost, targetDsName);
+            if(morDestinationDS == null) {
+                String msg = "Unable to find the target datastore: " + targetDsName + " on host: " + dsHost.getHyperHostName();
+                s_logger.error(msg);
+                throw new CloudRuntimeException(msg);
+            }
+            destinationDsMo = new DatastoreMO(hyperHost.getContext(), morDestinationDS);
 
-            vmName = getWorkerName(getServiceContext(), cmd, 0, dsMo);
+            vmName = getWorkerName(getServiceContext(), cmd, 0, sourceDsMo);
             if (destinationDsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
                 isvVolsInvolved = true;
                 vmName = getWorkerName(getServiceContext(), cmd, 0, destinationDsMo);
             }
+            String hardwareVersion = null;
+            if (hostInTargetCluster != null) {
+                Integer sourceHardwareVersion = HypervisorHostHelper.getHostHardwareVersion(hyperHost);
+                Integer destinationHardwareVersion = HypervisorHostHelper.getHostHardwareVersion(dsHost);
+                if (sourceHardwareVersion != null && destinationHardwareVersion != null && !sourceHardwareVersion.equals(destinationHardwareVersion)) {
+                    hardwareVersion = String.valueOf(Math.min(sourceHardwareVersion, destinationHardwareVersion));
+                }
+            }
 
             // OfflineVmwareMigration: refactor for re-use
             // OfflineVmwareMigration: 1. find data(store)
             // OfflineVmwareMigration: more robust would be to find the store given the volume as it might have been moved out of band or due to error
-// example:            DatastoreMO existingVmDsMo = new DatastoreMO(dcMo.getContext(), dcMo.findDatastore(fileInDatastore.getDatastoreName()));
+            // example: DatastoreMO existingVmDsMo = new DatastoreMO(dcMo.getContext(), dcMo.findDatastore(fileInDatastore.getDatastoreName()));
 
             s_logger.info("Create worker VM " + vmName);
             // OfflineVmwareMigration: 2. create the worker with access to the data(store)
-            vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, vmName, null);
+            vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, sourceDsMo, vmName, hardwareVersion);
             if (vmMo == null) {
                 // OfflineVmwareMigration: don't throw a general Exception but think of a specific one
                 throw new CloudRuntimeException("Unable to create a worker VM for volume operation");
@@ -4873,21 +4643,21 @@
             synchronized (this) {
                 // OfflineVmwareMigration: 3. attach the disk to the worker
                 String vmdkFileName = path + VMDK_EXTENSION;
-                vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, vmdkFileName);
-                if (!dsMo.fileExists(vmdkDataStorePath)) {
+                vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(sourceDsMo, vmdkFileName);
+                if (!sourceDsMo.fileExists(vmdkDataStorePath)) {
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug(String.format("path not found (%s), trying under '%s'", vmdkFileName, path));
                     }
-                    vmdkDataStorePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, path, vmdkFileName);
+                    vmdkDataStorePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(sourceDsMo, path, vmdkFileName);
                 }
-                if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), path) || !dsMo.fileExists(vmdkDataStorePath)) {
+                if (!sourceDsMo.folderExists(String.format("[%s]", sourceDsMo.getName()), path) || !sourceDsMo.fileExists(vmdkDataStorePath)) {
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug(String.format("path not found (%s), trying under '%s'", vmdkFileName, vmName));
                     }
-                    vmdkDataStorePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkFileName);
+                    vmdkDataStorePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(sourceDsMo, vmName, vmdkFileName);
                 }
-                if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmName) || !dsMo.fileExists(vmdkDataStorePath)) {
-                    vmdkDataStorePath = dsMo.searchFileInSubFolders(vmdkFileName, true, null);
+                if (!sourceDsMo.folderExists(String.format("[%s]", sourceDsMo.getName()), vmName) || !sourceDsMo.fileExists(vmdkDataStorePath)) {
+                    vmdkDataStorePath = sourceDsMo.searchFileInSubFolders(vmdkFileName, true, null);
                 }
 
                 if (s_logger.isDebugEnabled()) {
@@ -4937,8 +4707,6 @@
             try {
                 // OfflineVmwareMigration: worker *may* have been renamed
                 vmName = vmMo.getVmName();
-                morSourceDS = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getTargetPool().getUuid());
-                dsMo = new DatastoreMO(hyperHost.getContext(), morSourceDS);
                 s_logger.info("Dettaching disks before destroying worker VM '" + vmName + "' after volume migration");
                 VirtualDisk[] disks = vmMo.getAllDiskDevice();
                 String format = "disk %d was migrated to %s";
@@ -4946,7 +4714,7 @@
                     if (s_logger.isTraceEnabled()) {
                         s_logger.trace(String.format(format, disk.getKey(), vmMo.getVmdkFileBaseName(disk)));
                     }
-                    vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, vmMo.getVmdkFileBaseName(disk) + VMDK_EXTENSION);
+                    vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(destinationDsMo, vmMo.getVmdkFileBaseName(disk) + VMDK_EXTENSION);
                     vmMo.detachDisk(vmdkDataStorePath, false);
                 }
                 s_logger.info("Destroy worker VM '" + vmName + "' after volume migration");
@@ -4960,10 +4728,10 @@
                 String newPath = ((MigrateVolumeAnswer) answer).getVolumePath();
                 String vmdkFileName = newPath + VMDK_EXTENSION;
                 try {
-                    VmwareStorageLayoutHelper.syncVolumeToRootFolder(dsMo.getOwnerDatacenter().first(), dsMo, newPath, vmName);
-                    vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, vmdkFileName);
+                    VmwareStorageLayoutHelper.syncVolumeToRootFolder(destinationDsMo.getOwnerDatacenter().first(), destinationDsMo, newPath, vmName);
+                    vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(destinationDsMo, vmdkFileName);
 
-                    if (!dsMo.fileExists(vmdkDataStorePath)) {
+                    if (!destinationDsMo.fileExists(vmdkDataStorePath)) {
                         String msg = String.format("Migration of volume '%s' failed; file (%s) not found as path '%s'", cmd.getVolumePath(), vmdkFileName, vmdkDataStorePath);
                         s_logger.error(msg);
                         answer = new Answer(cmd, false, msg);
@@ -7058,10 +6826,10 @@
 
     @Override
     @DB
-    public String getWorkerName(VmwareContext context, Command cmd, int workerSequence, DatastoreMO dsMo) throws Exception {
+    public String getWorkerName(VmwareContext context, Command cmd, int workerSequence, DatastoreMO sourceDsMo) throws Exception {
         VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
         String vmName = mgr.composeWorkerName();
-        if (dsMo!= null && dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+        if (sourceDsMo!= null && sourceDsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
             vmName = CustomFieldConstants.CLOUD_UUID + "-" + vmName;
         }
 
@@ -7515,6 +7283,281 @@
         return new PrepareUnmanageVMInstanceAnswer(cmd, true, "OK");
     }
 
+    /*
+     * Method to relocate a virtual machine. This migrates VM and its volumes to given host, datastores.
+     * It is used for MigrateVolumeCommand (detached volume case), MigrateVmToPoolCommand and MigrateVmWithStorageCommand.
+     */
+
+    private List<VolumeObjectTO> relocateVirtualMachine(final VmwareHypervisorHost hypervisorHost,
+                                                        final String name, final VirtualMachineTO vmTo,
+                                                        final String targetHost, final VmwareHypervisorHost hostInTargetCluster,
+                                                        final String poolUuid, final List<Pair<VolumeTO, StorageFilerTO>> volToFiler) throws Exception {
+        String vmName = name;
+        if (vmName == null && vmTo != null) {
+            vmName = vmTo.getName();
+        }
+        VmwareHypervisorHost sourceHyperHost = hypervisorHost;
+        VmwareHypervisorHost targetHyperHost = hostInTargetCluster;
+        VirtualMachineMO vmMo = null;
+        ManagedObjectReference morSourceHostDc = null;
+        VirtualMachineRelocateSpec relocateSpec = new VirtualMachineRelocateSpec();
+        List<VirtualMachineRelocateSpecDiskLocator> diskLocators = new ArrayList<VirtualMachineRelocateSpecDiskLocator>();
+        Set<String> mountedDatastoresAtSource = new HashSet<String>();
+        List<VolumeObjectTO> volumeToList =  new ArrayList<>();
+        Map<Long, Integer> volumeDeviceKey = new HashMap<Long, Integer>();
+
+        try {
+            if (sourceHyperHost == null) {
+                sourceHyperHost = getHyperHost(getServiceContext());
+            }
+            if (targetHyperHost == null && StringUtils.isNotBlank(targetHost)) {
+                targetHyperHost = VmwareHelper.getHostMOFromHostName(getServiceContext(), targetHost);
+            }
+            morSourceHostDc = sourceHyperHost.getHyperHostDatacenter();
+            DatacenterMO dcMo = new DatacenterMO(sourceHyperHost.getContext(), morSourceHostDc);
+            if (targetHyperHost != null) {
+                ManagedObjectReference morTargetHostDc = targetHyperHost.getHyperHostDatacenter();
+                if (!morSourceHostDc.getValue().equalsIgnoreCase(morTargetHostDc.getValue())) {
+                    String msg = "VM " + vmName + " cannot be migrated between different datacenter";
+                    throw new CloudRuntimeException(msg);
+                }
+            }
+
+            // find VM through source host (VM is not at the target host yet)
+            vmMo = sourceHyperHost.findVmOnHyperHost(vmName);
+            if (vmMo == null) {
+                String msg = "VM " + vmName + " does not exist on host: " + sourceHyperHost.getHyperHostName();
+                s_logger.warn(msg);
+                // find VM through source host (VM is not at the target host yet)
+                vmMo = dcMo.findVm(vmName);
+                if (vmMo == null) {
+                    msg = "VM " + vmName + " does not exist on datacenter: " + dcMo.getName();
+                    s_logger.error(msg);
+                    throw new Exception(msg);
+                }
+                // VM host has changed
+                sourceHyperHost = vmMo.getRunningHost();
+            }
+
+            vmName = vmMo.getName();
+            String srcHostApiVersion = ((HostMO)sourceHyperHost).getHostAboutInfo().getApiVersion();
+
+            if (StringUtils.isNotBlank(poolUuid)) {
+                VmwareHypervisorHost dsHost = targetHyperHost == null ? sourceHyperHost : targetHyperHost;
+                ManagedObjectReference morDatastore = null;
+                String msg;
+                morDatastore = getTargetDatastoreMOReference(poolUuid, dsHost);
+                if (morDatastore == null) {
+                    msg = "Unable to find the target datastore: " + poolUuid + " on host: " + dsHost.getHyperHostName() +
+                            " to execute migration";
+                    s_logger.error(msg);
+                    throw new CloudRuntimeException(msg);
+                }
+                relocateSpec.setDatastore(morDatastore);
+            } else if (CollectionUtils.isNotEmpty(volToFiler)) {
+                // Specify destination datastore location for each volume
+                VmwareHypervisorHost dsHost = targetHyperHost == null ? sourceHyperHost : targetHyperHost;
+                for (Pair<VolumeTO, StorageFilerTO> entry : volToFiler) {
+                    VolumeTO volume = entry.first();
+                    StorageFilerTO filerTo = entry.second();
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug(String.format("Preparing spec for volume: %s to migrate it to datastore: %s", volume.getName(), filerTo.getUuid()));
+                    }
+                    ManagedObjectReference morVolumeDatastore = getTargetDatastoreMOReference(filerTo.getUuid(), dsHost);
+                    if (morVolumeDatastore == null) {
+                        String msg = "Unable to find the target datastore: " + filerTo.getUuid() + " in datacenter: " + dcMo.getName() + " to execute migration";
+                        s_logger.error(msg);
+                        throw new CloudRuntimeException(msg);
+                    }
+
+                    String mountedDs = getMountedDatastoreName(sourceHyperHost, srcHostApiVersion, filerTo);
+                    if (mountedDs != null) {
+                        mountedDatastoresAtSource.add(mountedDs);
+                    }
+
+                    if (volume.getType() == Volume.Type.ROOT) {
+                        relocateSpec.setDatastore(morVolumeDatastore);
+                    }
+                    VirtualMachineRelocateSpecDiskLocator diskLocator = new VirtualMachineRelocateSpecDiskLocator();
+                    diskLocator.setDatastore(morVolumeDatastore);
+                    Pair<VirtualDisk, String> diskInfo = getVirtualDiskInfo(vmMo, volume.getPath() + VMDK_EXTENSION);
+                    String vmdkAbsFile = getAbsoluteVmdkFile(diskInfo.first());
+                    if (vmdkAbsFile != null && !vmdkAbsFile.isEmpty()) {
+                        vmMo.updateAdapterTypeIfRequired(vmdkAbsFile);
+                    }
+                    int diskId = diskInfo.first().getKey();
+                    diskLocator.setDiskId(diskId);
+
+                    diskLocators.add(diskLocator);
+                    volumeDeviceKey.put(volume.getId(), diskId);
+                }
+                // If a target datastore is provided for the VM, then by default all volumes associated with the VM will be migrated to that target datastore.
+                // Hence set the existing datastore as target datastore for volumes that are not to be migrated.
+                List<Pair<Integer, ManagedObjectReference>> diskDatastores = vmMo.getAllDiskDatastores();
+                for (Pair<Integer, ManagedObjectReference> diskDatastore : diskDatastores) {
+                    if (!volumeDeviceKey.containsValue(diskDatastore.first().intValue())) {
+                        VirtualMachineRelocateSpecDiskLocator diskLocator = new VirtualMachineRelocateSpecDiskLocator();
+                        diskLocator.setDiskId(diskDatastore.first().intValue());
+                        diskLocator.setDatastore(diskDatastore.second());
+                        diskLocators.add(diskLocator);
+                    }
+                }
+
+                relocateSpec.getDisk().addAll(diskLocators);
+            }
+
+            // Specific section for MigrateVmWithStorageCommand
+            if (vmTo != null) {
+                // Prepare network at target before migration
+                NicTO[] nics = vmTo.getNics();
+                for (NicTO nic : nics) {
+                    // prepare network on the host
+                    prepareNetworkFromNicInfo((HostMO)targetHyperHost, nic, false, vmTo.getType());
+                }
+                // Ensure secondary storage mounted on target host
+                VmwareManager mgr = targetHyperHost.getContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
+                Pair<String, Long> secStoreUrlAndId = mgr.getSecondaryStorageStoreUrlAndId(Long.parseLong(_dcId));
+                String secStoreUrl = secStoreUrlAndId.first();
+                Long secStoreId = secStoreUrlAndId.second();
+                if (secStoreUrl == null) {
+                    String msg = "secondary storage for dc " + _dcId + " is not ready yet?";
+                    throw new Exception(msg);
+                }
+                mgr.prepareSecondaryStorageStore(secStoreUrl, secStoreId);
+                ManagedObjectReference morSecDs = prepareSecondaryDatastoreOnSpecificHost(secStoreUrl, targetHyperHost);
+                if (morSecDs == null) {
+                    String msg = "Failed to prepare secondary storage on host, secondary store url: " + secStoreUrl;
+                    throw new Exception(msg);
+                }
+            }
+
+            if (srcHostApiVersion.compareTo("5.1") < 0) {
+                // Migrate VM's volumes to target datastore(s).
+                if (!vmMo.changeDatastore(relocateSpec)) {
+                    throw new Exception("Change datastore operation failed during storage migration");
+                } else {
+                    s_logger.debug("Successfully migrated storage of VM " + vmName + " to target datastore(s)");
+                }
+                // Migrate VM to target host.
+                if (targetHyperHost != null) {
+                    ManagedObjectReference morPool = targetHyperHost.getHyperHostOwnerResourcePool();
+                    if (!vmMo.migrate(morPool, targetHyperHost.getMor())) {
+                        throw new Exception("VM migration to target host failed during storage migration");
+                    } else {
+                        s_logger.debug("Successfully migrated VM " + vmName + " from " + sourceHyperHost.getHyperHostName() + " to " + targetHyperHost.getHyperHostName());
+                    }
+                }
+            } else {
+                // Add target host to relocate spec
+                if (targetHyperHost != null) {
+                    relocateSpec.setHost(targetHyperHost.getMor());
+                    relocateSpec.setPool(targetHyperHost.getHyperHostOwnerResourcePool());
+                }
+                if (!vmMo.changeDatastore(relocateSpec)) {
+                    throw new Exception("Change datastore operation failed during storage migration");
+                } else {
+                    s_logger.debug("Successfully migrated VM " + vmName +
+                            (hostInTargetCluster != null ? " from " + sourceHyperHost.getHyperHostName() + " to " + targetHyperHost.getHyperHostName() + " and " : " with ") +
+                            "its storage to target datastore(s)");
+                }
+            }
+
+            // Consolidate VM disks.
+            // In case of a linked clone VM, if VM's disks are not consolidated, further VM operations such as volume snapshot, VM snapshot etc. will result in DB inconsistencies.
+            if (!vmMo.consolidateVmDisks()) {
+                s_logger.warn("VM disk consolidation failed after storage migration. Yet proceeding with VM migration.");
+            } else {
+                s_logger.debug("Successfully consolidated disks of VM " + vmName + ".");
+            }
+
+            if (MapUtils.isNotEmpty(volumeDeviceKey)) {
+                // Update and return volume path and chain info for every disk because that could have changed after migration
+                VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
+                for (Pair<VolumeTO, StorageFilerTO> entry : volToFiler) {
+                    final VolumeTO volume = entry.first();
+                    final long volumeId = volume.getId();
+                    VirtualDisk[] disks = vmMo.getAllDiskDevice();
+                    for (VirtualDisk disk : disks) {
+                        if (volumeDeviceKey.get(volumeId) == disk.getKey()) {
+                            VolumeObjectTO newVol = new VolumeObjectTO();
+                            newVol.setDataStoreUuid(entry.second().getUuid());
+                            String newPath = vmMo.getVmdkFileBaseName(disk);
+                            String poolName = entry.second().getUuid().replace("-", "");
+                            VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(newPath, poolName);
+                            newVol.setId(volumeId);
+                            newVol.setPath(newPath);
+                            newVol.setChainInfo(_gson.toJson(diskInfo));
+                            volumeToList.add(newVol);
+                            break;
+                        }
+                    }
+                }
+            }
+        } catch (Throwable e) {
+            if (e instanceof RemoteException) {
+                s_logger.warn("Encountered remote exception at vCenter, invalidating VMware session context");
+                invalidateServiceContext();
+            }
+            throw e;
+        } finally {
+            // Cleanup datastores mounted on source host
+            for (String mountedDatastore : mountedDatastoresAtSource) {
+                s_logger.debug("Attempting to unmount datastore " + mountedDatastore + " at " + sourceHyperHost.getHyperHostName());
+                try {
+                    sourceHyperHost.unmountDatastore(mountedDatastore);
+                } catch (Exception unmountEx) {
+                    s_logger.warn("Failed to unmount datastore " + mountedDatastore + " at " + sourceHyperHost.getHyperHostName() + ". Seems the datastore is still being used by " + sourceHyperHost.getHyperHostName() +
+                            ". Please unmount manually to cleanup.");
+                }
+                s_logger.debug("Successfully unmounted datastore " + mountedDatastore + " at " + sourceHyperHost.getHyperHostName());
+            }
+        }
+
+        // Only when volToFiler is not empty a filled list of VolumeObjectTO is returned else it will be empty
+        return volumeToList;
+    }
+
+    private String getMountedDatastoreName(VmwareHypervisorHost sourceHyperHost, String sourceHostApiVersion, StorageFilerTO filerTo) throws Exception {
+        String mountedDatastoreName = null;
+        // If host version is below 5.1 then simultaneous change of VM's datastore and host is not supported.
+        // So since only the datastore will be changed first, ensure the target datastore is mounted on source host.
+        if (sourceHostApiVersion.compareTo("5.1") < 0) {
+            s_logger.debug(String.format("Host: %s version is %s, vMotion without shared storage cannot be done. Check source host has target datastore mounted or can be mounted", sourceHyperHost.getHyperHostName(), sourceHostApiVersion));
+            ManagedObjectReference morVolumeDatastoreAtSource = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(sourceHyperHost, filerTo.getUuid());
+            String volumeDatastoreName = filerTo.getUuid().replace("-", "");
+            String volumeDatastoreHost = filerTo.getHost();
+            String volumeDatastorePath = filerTo.getPath();
+            int volumeDatastorePort = filerTo.getPort();
+
+            // If datastore is NFS and target datastore is not already mounted on source host then mount the datastore.
+            if (filerTo.getType().equals(StoragePoolType.NetworkFilesystem)) {
+                if (morVolumeDatastoreAtSource == null) {
+                    morVolumeDatastoreAtSource = sourceHyperHost.mountDatastore(false, volumeDatastoreHost, volumeDatastorePort, volumeDatastorePath, volumeDatastoreName, false);
+                    if (morVolumeDatastoreAtSource == null) {
+                        throw new Exception("Unable to mount NFS datastore " + volumeDatastoreHost + ":/" + volumeDatastorePath + " on host: " + sourceHyperHost.getHyperHostName());
+                    }
+                    mountedDatastoreName = volumeDatastoreName;
+                    s_logger.debug("Mounted NFS datastore " + volumeDatastoreHost + ":/" + volumeDatastorePath + " on host: " + sourceHyperHost.getHyperHostName());
+                }
+            }
+
+            // If datastore is VMFS and target datastore is not mounted or accessible to source host then fail migration.
+            if (filerTo.getType().equals(StoragePoolType.VMFS)) {
+                if (morVolumeDatastoreAtSource == null) {
+                    s_logger.warn("Host: " + sourceHyperHost.getHyperHostName() + " version is below 5.1, target VMFS datastore(s) need to be manually mounted on host for successful storage migration.");
+                    throw new Exception("Target VMFS datastore: " + volumeDatastorePath + " is not mounted on host: " + sourceHyperHost.getHyperHostName());
+                }
+                DatastoreMO dsAtSourceMo = new DatastoreMO(getServiceContext(), morVolumeDatastoreAtSource);
+                String srcHostValue = sourceHyperHost.getMor().getValue();
+                if (!dsAtSourceMo.isAccessibleToHost(srcHostValue)) {
+                    s_logger.warn("Host " + sourceHyperHost.getHyperHostName() + " version is below 5.1, target VMFS datastore(s) need to be accessible to host for a successful storage migration.");
+                    throw new Exception("Target VMFS datastore: " + volumeDatastorePath + " is not accessible on host: " + sourceHyperHost.getHyperHostName());
+                }
+            }
+        }
+        return mountedDatastoreName;
+    }
+
     private Answer execute(ValidateVcenterDetailsCommand cmd) {
         if (s_logger.isInfoEnabled()) {
             s_logger.info("Executing resource ValidateVcenterDetailsCommand " + _gson.toJson(cmd));
diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
index 5a7b4c4..8d08c38 100644
--- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
+++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
@@ -26,6 +26,20 @@
 
 import javax.inject.Inject;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.MigrateWithStorageAnswer;
@@ -53,18 +67,6 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.dao.VMInstanceDao;
-import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.to.VolumeObjectTO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 @Component
 public class VmwareStorageMotionStrategy implements DataMotionStrategy {
@@ -88,9 +90,7 @@
         if (isOnVmware(srcData, destData)
                 && isOnPrimary(srcData, destData)
                 && isVolumesOnly(srcData, destData)
-                && isDettached(srcData)
-                && isIntraCluster(srcData, destData)
-                && isStoreScopeEqual(srcData, destData)) {
+                && isDettached(srcData)) {
             if (s_logger.isDebugEnabled()) {
                 String msg = String.format("%s can handle the request because %d(%s) and %d(%s) share the VMware cluster %s (== %s)"
                         , this.getClass()
@@ -188,20 +188,42 @@
             throw new UnsupportedOperationException();
         }
         StoragePool sourcePool = (StoragePool) srcData.getDataStore();
+        ScopeType sourceScopeType = srcData.getDataStore().getScope().getScopeType();
         StoragePool targetPool = (StoragePool) destData.getDataStore();
+        ScopeType targetScopeType = destData.getDataStore().getScope().getScopeType();
+        Long hostId = null;
+        String hostGuidInTargetCluster = null;
+        if (ScopeType.CLUSTER.equals(sourceScopeType)) {
+            // Find Volume source cluster and select any Vmware hypervisor host to attach worker VM
+            hostId = findSuitableHostIdForWorkerVmPlacement(sourcePool.getClusterId());
+            if (hostId == null) {
+                throw new CloudRuntimeException("Offline Migration failed, unable to find suitable host for worker VM placement in the cluster of storage pool: " + sourcePool.getName());
+            }
+            if (ScopeType.CLUSTER.equals(targetScopeType) && !sourcePool.getClusterId().equals(targetPool.getClusterId())) {
+                // Without host vMotion might fail between non-shared storages with error similar to,
+                // https://kb.vmware.com/s/article/1003795
+                List<HostVO> hosts = hostDao.findHypervisorHostInCluster(targetPool.getClusterId());
+                if (CollectionUtils.isNotEmpty(hosts)) {
+                    hostGuidInTargetCluster = hosts.get(0).getGuid();
+                }
+                if (hostGuidInTargetCluster == null) {
+                    throw new CloudRuntimeException("Offline Migration failed, unable to find suitable target host for worker VM placement while migrating between storage pools of different cluster without shared storages");
+                }
+            }
+        } else if (ScopeType.CLUSTER.equals(targetScopeType)) {
+            hostId = findSuitableHostIdForWorkerVmPlacement(targetPool.getClusterId());
+            if (hostId == null) {
+                throw new CloudRuntimeException("Offline Migration failed, unable to find suitable host for worker VM placement in the cluster of storage pool: " + targetPool.getName());
+            }
+        }
         MigrateVolumeCommand cmd = new MigrateVolumeCommand(srcData.getId()
                 , srcData.getTO().getPath()
                 , sourcePool
-                , targetPool);
+                , targetPool
+                , hostGuidInTargetCluster);
         // OfflineVmwareMigration: should be ((StoragePool)srcData.getDataStore()).getHypervisor() but that is NULL, so hardcoding
         Answer answer;
-        ScopeType scopeType = srcData.getDataStore().getScope().getScopeType();
-        if (ScopeType.CLUSTER == scopeType) {
-            // Find Volume source cluster and select any Vmware hypervisor host to attach worker VM
-            Long hostId = findSuitableHostIdForWorkerVmPlacement(sourcePool.getClusterId());
-            if (hostId == null) {
-                throw new CloudRuntimeException("Offline Migration failed, unable to find suitable host for worker VM placement in cluster: " + sourcePool.getName());
-            }
+        if (hostId != null) {
             answer = agentMgr.easySend(hostId, cmd);
         } else {
             answer = agentMgr.sendTo(sourcePool.getDataCenterId(), HypervisorType.VMware, cmd);
diff --git a/plugins/hypervisors/xenserver/pom.xml b/plugins/hypervisors/xenserver/pom.xml
index 1fc65df..98f0f3b 100644
--- a/plugins/hypervisors/xenserver/pom.xml
+++ b/plugins/hypervisors/xenserver/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/integrations/cloudian/pom.xml b/plugins/integrations/cloudian/pom.xml
index 7cc53d4..1dc2107 100644
--- a/plugins/integrations/cloudian/pom.xml
+++ b/plugins/integrations/cloudian/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/integrations/kubernetes-service/pom.xml b/plugins/integrations/kubernetes-service/pom.xml
index a85dd1d..9a61836 100644
--- a/plugins/integrations/kubernetes-service/pom.xml
+++ b/plugins/integrations/kubernetes-service/pom.xml
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java
index 8f124f1..f091d07 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java
@@ -797,7 +797,7 @@
 
             try {
                 network = networkMgr.createGuestNetwork(networkOffering.getId(), clusterName + "-network", owner.getAccountName() + "-network",
-                        null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ControlledEntity.ACLType.Account, null, null, null, null, true, null, null, null);
+                        null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ControlledEntity.ACLType.Account, null, null, null, null, true, null, null, null, null, null);
             } catch (ConcurrentOperationException | InsufficientCapacityException | ResourceAllocationException e) {
                 logAndThrow(Level.ERROR, String.format("Unable to create network for the Kubernetes cluster: %s", clusterName));
             }
diff --git a/plugins/integrations/prometheus/pom.xml b/plugins/integrations/prometheus/pom.xml
index 99cb2cf..b9d17ae 100644
--- a/plugins/integrations/prometheus/pom.xml
+++ b/plugins/integrations/prometheus/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/metrics/pom.xml b/plugins/metrics/pom.xml
index 943487d..3222b3d 100644
--- a/plugins/metrics/pom.xml
+++ b/plugins/metrics/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/bigswitch/pom.xml b/plugins/network-elements/bigswitch/pom.xml
index 197b78e..4ec6328 100644
--- a/plugins/network-elements/bigswitch/pom.xml
+++ b/plugins/network-elements/bigswitch/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/brocade-vcs/pom.xml b/plugins/network-elements/brocade-vcs/pom.xml
index 29ad385..7fd3e29 100644
--- a/plugins/network-elements/brocade-vcs/pom.xml
+++ b/plugins/network-elements/brocade-vcs/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/plugins/network-elements/cisco-vnmc/pom.xml b/plugins/network-elements/cisco-vnmc/pom.xml
index 87aab33..5d11cc3 100644
--- a/plugins/network-elements/cisco-vnmc/pom.xml
+++ b/plugins/network-elements/cisco-vnmc/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/dns-notifier/pom.xml b/plugins/network-elements/dns-notifier/pom.xml
index 57b49d1..b5bf324 100644
--- a/plugins/network-elements/dns-notifier/pom.xml
+++ b/plugins/network-elements/dns-notifier/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <artifactId>cloud-plugin-example-dns-notifier</artifactId>
diff --git a/plugins/network-elements/elastic-loadbalancer/pom.xml b/plugins/network-elements/elastic-loadbalancer/pom.xml
index 0600698..90bce51 100644
--- a/plugins/network-elements/elastic-loadbalancer/pom.xml
+++ b/plugins/network-elements/elastic-loadbalancer/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/f5/pom.xml b/plugins/network-elements/f5/pom.xml
index e2456f3..c457c64 100644
--- a/plugins/network-elements/f5/pom.xml
+++ b/plugins/network-elements/f5/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/globodns/pom.xml b/plugins/network-elements/globodns/pom.xml
index cb8b8bc..03adf66 100644
--- a/plugins/network-elements/globodns/pom.xml
+++ b/plugins/network-elements/globodns/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/internal-loadbalancer/pom.xml b/plugins/network-elements/internal-loadbalancer/pom.xml
index 167e2e5..9eefde1 100644
--- a/plugins/network-elements/internal-loadbalancer/pom.xml
+++ b/plugins/network-elements/internal-loadbalancer/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/juniper-contrail/pom.xml b/plugins/network-elements/juniper-contrail/pom.xml
index 09c41a9..f790db0 100644
--- a/plugins/network-elements/juniper-contrail/pom.xml
+++ b/plugins/network-elements/juniper-contrail/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <repositories>
diff --git a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java
index aee24b0..0a1bd10 100644
--- a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java
+++ b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java
@@ -219,9 +219,7 @@
         ConfigurationManager configMgr = (ConfigurationManager) _configService;
         NetworkOfferingVO voffer = configMgr.createNetworkOffering(offeringName, offeringDisplayText,
                 TrafficType.Public, null, true, Availability.Optional, null, serviceProviderMap, true,
-                Network.GuestType.Shared, false, null, false, null, true, false, null, true, null, false, false, null, null);
-
-        voffer.setState(NetworkOffering.State.Enabled);
+                Network.GuestType.Shared, false, null, false, null, true, false, null, true, null, false, false, null, null, true);
         long id = voffer.getId();
         _networkOfferingDao.update(id, voffer);
         return _networkOfferingDao.findById(id);
@@ -256,9 +254,7 @@
         ConfigurationManager configMgr = (ConfigurationManager)_configService;
         NetworkOfferingVO voffer =
                 configMgr.createNetworkOffering(offeringName, offeringDisplayText, TrafficType.Guest, null, false, Availability.Optional, null, serviceProviderMap, true,
-                        Network.GuestType.Isolated, false, null, false, null, false, true, null, true, null, false, offeringName.equals(vpcRouterOfferingName), null, null);
-
-        voffer.setState(NetworkOffering.State.Enabled);
+                        Network.GuestType.Isolated, false, null, false, null, false, true, null, true, null, false, offeringName.equals(vpcRouterOfferingName), null, null, true);
         if (offeringName.equals(vpcRouterOfferingName)) {
             voffer.setInternalLb(true);
         }
@@ -299,8 +295,7 @@
             }
             serviceProviderMap.put(svc, providerSet);
         }
-        vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, null);
-        ((VpcOfferingVO)vpcOffer).setState(VpcOffering.State.Enabled);
+        vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, null, VpcOffering.State.Enabled);
         long id = vpcOffer.getId();
         _vpcOffDao.update(id, (VpcOfferingVO)vpcOffer);
         return _vpcOffDao.findById(id);
diff --git a/plugins/network-elements/juniper-srx/pom.xml b/plugins/network-elements/juniper-srx/pom.xml
index 64ce0d7..407e5ba 100644
--- a/plugins/network-elements/juniper-srx/pom.xml
+++ b/plugins/network-elements/juniper-srx/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/netscaler/pom.xml b/plugins/network-elements/netscaler/pom.xml
index ad08d1d..61bbf8f 100644
--- a/plugins/network-elements/netscaler/pom.xml
+++ b/plugins/network-elements/netscaler/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/nicira-nvp/pom.xml b/plugins/network-elements/nicira-nvp/pom.xml
index 11bf1c9..bed19c4 100644
--- a/plugins/network-elements/nicira-nvp/pom.xml
+++ b/plugins/network-elements/nicira-nvp/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/opendaylight/pom.xml b/plugins/network-elements/opendaylight/pom.xml
index 68c1271..d766d35 100644
--- a/plugins/network-elements/opendaylight/pom.xml
+++ b/plugins/network-elements/opendaylight/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <profiles>
diff --git a/plugins/network-elements/ovs/pom.xml b/plugins/network-elements/ovs/pom.xml
index baae799..68a921c 100644
--- a/plugins/network-elements/ovs/pom.xml
+++ b/plugins/network-elements/ovs/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/palo-alto/pom.xml b/plugins/network-elements/palo-alto/pom.xml
index 33d51a3..b492799 100644
--- a/plugins/network-elements/palo-alto/pom.xml
+++ b/plugins/network-elements/palo-alto/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/stratosphere-ssp/pom.xml b/plugins/network-elements/stratosphere-ssp/pom.xml
index c749501..0b37d37 100644
--- a/plugins/network-elements/stratosphere-ssp/pom.xml
+++ b/plugins/network-elements/stratosphere-ssp/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/vxlan/pom.xml b/plugins/network-elements/vxlan/pom.xml
index 4af0eaf..e935016 100644
--- a/plugins/network-elements/vxlan/pom.xml
+++ b/plugins/network-elements/vxlan/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/outofbandmanagement-drivers/ipmitool/pom.xml b/plugins/outofbandmanagement-drivers/ipmitool/pom.xml
index 6d371a3..17e49f9 100644
--- a/plugins/outofbandmanagement-drivers/ipmitool/pom.xml
+++ b/plugins/outofbandmanagement-drivers/ipmitool/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml b/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml
index 012d176..865527c 100644
--- a/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml
+++ b/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/outofbandmanagement-drivers/redfish/pom.xml b/plugins/outofbandmanagement-drivers/redfish/pom.xml
index c1418d5..180e7d0 100644
--- a/plugins/outofbandmanagement-drivers/redfish/pom.xml
+++ b/plugins/outofbandmanagement-drivers/redfish/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/pom.xml b/plugins/pom.xml
index f9a7c29..29cfbc1 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <build>
         <plugins>
@@ -121,6 +121,7 @@
         <module>storage/volume/nexenta</module>
         <module>storage/volume/sample</module>
         <module>storage/volume/solidfire</module>
+        <module>storage/volume/scaleio</module>
 
         <module>storage-allocators/random</module>
 
diff --git a/plugins/storage-allocators/random/pom.xml b/plugins/storage-allocators/random/pom.xml
index 9efbb38..c8181c6 100644
--- a/plugins/storage-allocators/random/pom.xml
+++ b/plugins/storage-allocators/random/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/image/default/pom.xml b/plugins/storage/image/default/pom.xml
index 735a70e..fffce67 100644
--- a/plugins/storage/image/default/pom.xml
+++ b/plugins/storage/image/default/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/image/s3/pom.xml b/plugins/storage/image/s3/pom.xml
index b8b2836..b51805b 100644
--- a/plugins/storage/image/s3/pom.xml
+++ b/plugins/storage/image/s3/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/image/sample/pom.xml b/plugins/storage/image/sample/pom.xml
index 9dc04e8..348ef8e 100644
--- a/plugins/storage/image/sample/pom.xml
+++ b/plugins/storage/image/sample/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/image/swift/pom.xml b/plugins/storage/image/swift/pom.xml
index aaf4007..ab32957 100644
--- a/plugins/storage/image/swift/pom.xml
+++ b/plugins/storage/image/swift/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/cloudbyte/pom.xml b/plugins/storage/volume/cloudbyte/pom.xml
index 5ba51f8..739fcec 100644
--- a/plugins/storage/volume/cloudbyte/pom.xml
+++ b/plugins/storage/volume/cloudbyte/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/cloudbyte/src/main/java/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java b/plugins/storage/volume/cloudbyte/src/main/java/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java
index 89e8c4f..f9e6146 100644
--- a/plugins/storage/volume/cloudbyte/src/main/java/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/cloudbyte/src/main/java/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java
@@ -48,6 +48,7 @@
 import com.cloud.agent.api.to.DataObjectType;
 import com.cloud.agent.api.to.DataStoreTO;
 import com.cloud.agent.api.to.DataTO;
+import com.cloud.host.Host;
 import com.cloud.storage.DiskOfferingVO;
 import com.cloud.storage.ResizeVolumePayload;
 import com.cloud.storage.Storage.StoragePoolType;
@@ -59,6 +60,7 @@
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
 import com.cloud.user.AccountManager;
+import com.cloud.utils.Pair;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 /**
@@ -259,7 +261,11 @@
     @Override
     public void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
         throw new UnsupportedOperationException();
+    }
 
+    @Override
+    public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -409,4 +415,28 @@
         return mapCapabilities;
     }
 
+    @Override
+    public boolean canProvideStorageStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getStorageStats(StoragePool storagePool) {
+        return null;
+    }
+
+    @Override
+    public boolean canProvideVolumeStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumeId) {
+        return null;
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        return true;
+    }
 }
diff --git a/plugins/storage/volume/datera/pom.xml b/plugins/storage/volume/datera/pom.xml
index 1104237..83f77e4 100644
--- a/plugins/storage/volume/datera/pom.xml
+++ b/plugins/storage/volume/datera/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.apache.cloudstack</groupId>
     <artifactId>cloudstack-plugins</artifactId>
-    <version>4.15.1.0-SNAPSHOT</version>
+    <version>4.16.0.0-SNAPSHOT</version>
     <relativePath>../../../pom.xml</relativePath>
   </parent>
   <dependencies>
diff --git a/plugins/storage/volume/datera/src/main/java/org/apache/cloudstack/storage/datastore/driver/DateraPrimaryDataStoreDriver.java b/plugins/storage/volume/datera/src/main/java/org/apache/cloudstack/storage/datastore/driver/DateraPrimaryDataStoreDriver.java
index fa1f3d4..49559d2 100644
--- a/plugins/storage/volume/datera/src/main/java/org/apache/cloudstack/storage/datastore/driver/DateraPrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/datera/src/main/java/org/apache/cloudstack/storage/datastore/driver/DateraPrimaryDataStoreDriver.java
@@ -17,6 +17,37 @@
 
 package org.apache.cloudstack.storage.datastore.driver;
 
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.storage.command.CommandResult;
+import org.apache.cloudstack.storage.command.CreateObjectAnswer;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.datastore.util.DateraObject;
+import org.apache.cloudstack.storage.datastore.util.DateraUtil;
+import org.apache.cloudstack.storage.to.SnapshotObjectTO;
+import org.apache.log4j.Logger;
+
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.to.DataObjectType;
 import com.cloud.agent.api.to.DataStoreTO;
@@ -44,40 +75,12 @@
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
+import com.cloud.utils.Pair;
 import com.cloud.utils.StringUtils;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.google.common.base.Preconditions;
 import com.google.common.primitives.Ints;
-import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
-import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.command.CommandResult;
-import org.apache.cloudstack.storage.command.CreateObjectAnswer;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.cloudstack.storage.datastore.util.DateraObject;
-import org.apache.cloudstack.storage.datastore.util.DateraUtil;
-import org.apache.cloudstack.storage.to.SnapshotObjectTO;
-import org.apache.log4j.Logger;
-
-import javax.inject.Inject;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
 
@@ -1255,6 +1258,12 @@
     }
 
     @Override
+    public void copyAsync(DataObject srcData, DataObject destData,
+            Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public boolean canCopy(DataObject srcData, DataObject destData) {
         return false;
     }
@@ -1825,6 +1834,30 @@
     @Override
     public void handleQualityOfServiceForVolumeMigration(VolumeInfo volumeInfo,
             QualityOfServiceState qualityOfServiceState) {
+    }
 
+    @Override
+    public boolean canProvideStorageStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getStorageStats(StoragePool storagePool) {
+        return null;
+    }
+
+    @Override
+    public boolean canProvideVolumeStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumeId) {
+        return null;
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        return true;
     }
 }
diff --git a/plugins/storage/volume/default/pom.xml b/plugins/storage/volume/default/pom.xml
index 884491c..0b4e862 100644
--- a/plugins/storage/volume/default/pom.xml
+++ b/plugins/storage/volume/default/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java
index 6ce8741..3cbcc85 100644
--- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java
+++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java
@@ -76,6 +76,7 @@
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.snapshot.SnapshotManager;
 import com.cloud.template.TemplateManager;
+import com.cloud.utils.Pair;
 import com.cloud.vm.dao.VMInstanceDao;
 
 import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
@@ -278,6 +279,11 @@
     }
 
     @Override
+    public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+        copyAsync(srcData, destData, callback);
+    }
+
+    @Override
     public boolean canCopy(DataObject srcData, DataObject destData) {
         //BUG fix for CLOUDSTACK-4618
         DataStore store = destData.getDataStore();
@@ -389,4 +395,29 @@
 
     @Override
     public void handleQualityOfServiceForVolumeMigration(VolumeInfo volumeInfo, QualityOfServiceState qualityOfServiceState) {}
+
+    @Override
+    public boolean canProvideStorageStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getStorageStats(StoragePool storagePool) {
+        return null;
+    }
+
+    @Override
+    public boolean canProvideVolumeStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumeId) {
+        return null;
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        return true;
+    }
 }
diff --git a/plugins/storage/volume/nexenta/pom.xml b/plugins/storage/volume/nexenta/pom.xml
index 4959f59..66bf9d2 100644
--- a/plugins/storage/volume/nexenta/pom.xml
+++ b/plugins/storage/volume/nexenta/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/nexenta/src/main/java/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java b/plugins/storage/volume/nexenta/src/main/java/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java
index d59fce4..92f8938 100644
--- a/plugins/storage/volume/nexenta/src/main/java/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/nexenta/src/main/java/org/apache/cloudstack/storage/datastore/driver/NexentaPrimaryDataStoreDriver.java
@@ -53,6 +53,7 @@
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.user.dao.AccountDao;
+import com.cloud.utils.Pair;
 
 public class NexentaPrimaryDataStoreDriver implements PrimaryDataStoreDriver {
     private static final Logger logger = Logger.getLogger(NexentaPrimaryDataStoreDriver.class);
@@ -200,6 +201,10 @@
     public void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {}
 
     @Override
+    public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+    }
+
+    @Override
     public boolean canCopy(DataObject srcData, DataObject destData) {
         return false;
     }
@@ -209,4 +214,29 @@
 
     @Override
     public void handleQualityOfServiceForVolumeMigration(VolumeInfo volumeInfo, QualityOfServiceState qualityOfServiceState) {}
+
+    @Override
+    public boolean canProvideStorageStats() {
+        return false;
+    }
+
+    @Override
+    public boolean canProvideVolumeStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumeId) {
+        return null;
+    }
+
+    @Override
+    public Pair<Long, Long> getStorageStats(StoragePool storagePool) {
+        return null;
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        return true;
+    }
 }
diff --git a/plugins/storage/volume/sample/pom.xml b/plugins/storage/volume/sample/pom.xml
index 8c40100..d17a1d4 100644
--- a/plugins/storage/volume/sample/pom.xml
+++ b/plugins/storage/volume/sample/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/sample/src/main/java/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java b/plugins/storage/volume/sample/src/main/java/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java
index fc0186f..a416277 100644
--- a/plugins/storage/volume/sample/src/main/java/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java
+++ b/plugins/storage/volume/sample/src/main/java/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java
@@ -46,6 +46,7 @@
 import com.cloud.host.Host;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.utils.Pair;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 public class SamplePrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
@@ -225,6 +226,10 @@
     }
 
     @Override
+    public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+    }
+
+    @Override
     public void resize(DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) {
     }
 
@@ -236,4 +241,28 @@
     public void takeSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CreateCmdResult> callback) {
     }
 
+    @Override
+    public boolean canProvideStorageStats() {
+        return false;
+    }
+
+    @Override
+    public boolean canProvideVolumeStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumeId) {
+        return null;
+    }
+
+    @Override
+    public Pair<Long, Long> getStorageStats(StoragePool storagePool) {
+        return null;
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        return true;
+    }
 }
diff --git a/plugins/storage/volume/scaleio/pom.xml b/plugins/storage/volume/scaleio/pom.xml
new file mode 100644
index 0000000..e95087e
--- /dev/null
+++ b/plugins/storage/volume/scaleio/pom.xml
@@ -0,0 +1,55 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<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>
+    <artifactId>cloud-plugin-storage-volume-scaleio</artifactId>
+    <name>Apache CloudStack Plugin - Storage Volume Dell-EMC ScaleIO/PowerFlex Provider</name>
+    <parent>
+        <groupId>org.apache.cloudstack</groupId>
+        <artifactId>cloudstack-plugins</artifactId>
+        <version>4.16.0.0-SNAPSHOT</version>
+        <relativePath>../../../pom.xml</relativePath>
+    </parent>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-engine-storage-volume</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>integration-test</phase>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/ProtectionDomain.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/ProtectionDomain.java
new file mode 100644
index 0000000..5d260e0
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/ProtectionDomain.java
@@ -0,0 +1,57 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class ProtectionDomain {
+    String id;
+    String name;
+    String protectionDomainState;
+    String systemId;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getProtectionDomainState() {
+        return protectionDomainState;
+    }
+
+    public void setProtectionDomainState(String protectionDomainState) {
+        this.protectionDomainState = protectionDomainState;
+    }
+
+    public String getSystemId() {
+        return systemId;
+    }
+
+    public void setSystemId(String systemId) {
+        this.systemId = systemId;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/Sdc.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/Sdc.java
new file mode 100644
index 0000000..71e4077
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/Sdc.java
@@ -0,0 +1,138 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class Sdc {
+    String id;
+    String name;
+    String mdmConnectionState;
+    Boolean sdcApproved;
+    String perfProfile;
+    String sdcGuid;
+    String sdcIp;
+    String[] sdcIps;
+    String systemId;
+    String osType;
+    String kernelVersion;
+    String softwareVersionInfo;
+    String versionInfo;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMdmConnectionState() {
+        return mdmConnectionState;
+    }
+
+    public void setMdmConnectionState(String mdmConnectionState) {
+        this.mdmConnectionState = mdmConnectionState;
+    }
+
+    public Boolean getSdcApproved() {
+        return sdcApproved;
+    }
+
+    public void setSdcApproved(Boolean sdcApproved) {
+        this.sdcApproved = sdcApproved;
+    }
+
+    public String getPerfProfile() {
+        return perfProfile;
+    }
+
+    public void setPerfProfile(String perfProfile) {
+        this.perfProfile = perfProfile;
+    }
+
+    public String getSdcGuid() {
+        return sdcGuid;
+    }
+
+    public void setSdcGuid(String sdcGuid) {
+        this.sdcGuid = sdcGuid;
+    }
+
+    public String getSdcIp() {
+        return sdcIp;
+    }
+
+    public void setSdcIp(String sdcIp) {
+        this.sdcIp = sdcIp;
+    }
+
+    public String[] getSdcIps() {
+        return sdcIps;
+    }
+
+    public void setSdcIps(String[] sdcIps) {
+        this.sdcIps = sdcIps;
+    }
+
+    public String getSystemId() {
+        return systemId;
+    }
+
+    public void setSystemId(String systemId) {
+        this.systemId = systemId;
+    }
+
+    public String getOsType() {
+        return osType;
+    }
+
+    public void setOsType(String osType) {
+        this.osType = osType;
+    }
+
+    public String getKernelVersion() {
+        return kernelVersion;
+    }
+
+    public void setKernelVersion(String kernelVersion) {
+        this.kernelVersion = kernelVersion;
+    }
+
+    public String getSoftwareVersionInfo() {
+        return softwareVersionInfo;
+    }
+
+    public void setSoftwareVersionInfo(String softwareVersionInfo) {
+        this.softwareVersionInfo = softwareVersionInfo;
+    }
+
+    public String getVersionInfo() {
+        return versionInfo;
+    }
+
+    public void setVersionInfo(String versionInfo) {
+        this.versionInfo = versionInfo;
+    }
+}
diff --git a/ui/legacy/modules/modules.js b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SdcMappingInfo.java
similarity index 66%
copy from ui/legacy/modules/modules.js
copy to plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SdcMappingInfo.java
index 1e4cd45..1b3436a 100644
--- a/ui/legacy/modules/modules.js
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SdcMappingInfo.java
@@ -14,11 +14,26 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-(function($, cloudStack) {
-  cloudStack.modules = [
-    'vpc',
-    'infrastructure',
-    'vnmcNetworkProvider',
-    'vnmcAsa1000v'
-  ];
-}(jQuery, cloudStack));
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class SdcMappingInfo {
+    String sdcId;
+    String sdcIp;
+
+    public String getSdcId() {
+        return sdcId;
+    }
+
+    public void setSdcId(String sdcId) {
+        this.sdcId = sdcId;
+    }
+
+    public String getSdcIp() {
+        return sdcIp;
+    }
+
+    public void setSdcIp(String sdcIp) {
+        this.sdcIp = sdcIp;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotDef.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotDef.java
new file mode 100644
index 0000000..fa97360
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotDef.java
@@ -0,0 +1,48 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class SnapshotDef {
+    String volumeId;
+    String snapshotName;
+    String allowOnExtManagedVol;
+
+    public String getVolumeId() {
+        return volumeId;
+    }
+
+    public void setVolumeId(String volumeId) {
+        this.volumeId = volumeId;
+    }
+
+    public String getSnapshotName() {
+        return snapshotName;
+    }
+
+    public void setSnapshotName(String snapshotName) {
+        this.snapshotName = snapshotName;
+    }
+
+    public String getAllowOnExtManagedVol() {
+        return allowOnExtManagedVol;
+    }
+
+    public void setAllowOnExtManagedVol(String allowOnExtManagedVol) {
+        this.allowOnExtManagedVol = allowOnExtManagedVol;
+    }
+}
diff --git a/ui/legacy/modules/modules.js b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotDefs.java
similarity index 71%
rename from ui/legacy/modules/modules.js
rename to plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotDefs.java
index 1e4cd45..a86ae30 100644
--- a/ui/legacy/modules/modules.js
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotDefs.java
@@ -14,11 +14,17 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-(function($, cloudStack) {
-  cloudStack.modules = [
-    'vpc',
-    'infrastructure',
-    'vnmcNetworkProvider',
-    'vnmcAsa1000v'
-  ];
-}(jQuery, cloudStack));
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class SnapshotDefs {
+    SnapshotDef[] snapshotDefs;
+
+    public SnapshotDef[] getSnapshotDefs() {
+        return snapshotDefs;
+    }
+
+    public void setSnapshotDefs(SnapshotDef[] snapshotDefs) {
+        this.snapshotDefs = snapshotDefs;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotGroup.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotGroup.java
new file mode 100644
index 0000000..bef2cee
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/SnapshotGroup.java
@@ -0,0 +1,46 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class SnapshotGroup {
+    String snapshotGroupId;
+    String[] volumeIdList;
+
+    public String getSnapshotGroupId() {
+        return snapshotGroupId;
+    }
+
+    public void setSnapshotGroupId(String snapshotGroupId) {
+        this.snapshotGroupId = snapshotGroupId;
+    }
+
+    public List<String> getVolumeIds() {
+        return Arrays.asList(volumeIdList);
+    }
+
+    public String[] getVolumeIdList() {
+        return volumeIdList;
+    }
+
+    public void setVolumeIdList(String[] volumeIdList) {
+        this.volumeIdList = volumeIdList;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/StoragePool.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/StoragePool.java
new file mode 100644
index 0000000..df903bb
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/StoragePool.java
@@ -0,0 +1,75 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class StoragePool {
+    String id;
+    String name;
+    String mediaType;
+    String protectionDomainId;
+    String systemId;
+    StoragePoolStatistics statistics;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMediaType() {
+        return mediaType;
+    }
+
+    public void setMediaType(String mediaType) {
+        this.mediaType = mediaType;
+    }
+
+    public String getProtectionDomainId() {
+        return protectionDomainId;
+    }
+
+    public void setProtectionDomainId(String protectionDomainId) {
+        this.protectionDomainId = protectionDomainId;
+    }
+
+    public String getSystemId() {
+        return systemId;
+    }
+
+    public void setSystemId(String systemId) {
+        this.systemId = systemId;
+    }
+
+    public StoragePoolStatistics getStatistics() {
+        return statistics;
+    }
+
+    public void setStatistics(StoragePoolStatistics statistics) {
+        this.statistics = statistics;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/StoragePoolStatistics.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/StoragePoolStatistics.java
new file mode 100644
index 0000000..599aa5c
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/StoragePoolStatistics.java
@@ -0,0 +1,85 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+import com.google.common.base.Strings;
+
+public class StoragePoolStatistics {
+    String maxCapacityInKb; // total capacity
+    String spareCapacityInKb; // spare capacity, space not used for volumes creation/allocation
+    String netCapacityInUseInKb; // user data capacity in use
+    String netUnusedCapacityInKb; // capacity available for volume creation (volume space to write)
+
+    public Long getMaxCapacityInKb() {
+        if (Strings.isNullOrEmpty(maxCapacityInKb)) {
+            return Long.valueOf(0);
+        }
+        return Long.valueOf(maxCapacityInKb);
+    }
+
+    public void setMaxCapacityInKb(String maxCapacityInKb) {
+        this.maxCapacityInKb = maxCapacityInKb;
+    }
+
+    public Long getSpareCapacityInKb() {
+        if (Strings.isNullOrEmpty(spareCapacityInKb)) {
+            return Long.valueOf(0);
+        }
+        return Long.valueOf(spareCapacityInKb);
+    }
+
+    public void setSpareCapacityInKb(String spareCapacityInKb) {
+        this.spareCapacityInKb = spareCapacityInKb;
+    }
+
+    public Long getNetCapacityInUseInKb() {
+        if (Strings.isNullOrEmpty(netCapacityInUseInKb)) {
+            return Long.valueOf(0);
+        }
+        return Long.valueOf(netCapacityInUseInKb);
+    }
+
+    public void setNetCapacityInUseInKb(String netCapacityInUseInKb) {
+        this.netCapacityInUseInKb = netCapacityInUseInKb;
+    }
+
+    public Long getNetUnusedCapacityInKb() {
+        if (Strings.isNullOrEmpty(netUnusedCapacityInKb)) {
+            return Long.valueOf(0);
+        }
+        return Long.valueOf(netUnusedCapacityInKb);
+    }
+
+    public Long getNetUnusedCapacityInBytes() {
+        return (getNetUnusedCapacityInKb() * 1024);
+    }
+
+    public void setNetUnusedCapacityInKb(String netUnusedCapacityInKb) {
+        this.netUnusedCapacityInKb = netUnusedCapacityInKb;
+    }
+
+    public Long getNetMaxCapacityInBytes() {
+        // total usable capacity = ("maxCapacityInKb" - "spareCapacityInKb") / 2
+        Long netMaxCapacityInKb = getMaxCapacityInKb() - getSpareCapacityInKb();
+        return ((netMaxCapacityInKb / 2) * 1024);
+    }
+
+    public Long getNetUsedCapacityInBytes() {
+        return (getNetMaxCapacityInBytes() - getNetUnusedCapacityInBytes());
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VTree.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VTree.java
new file mode 100644
index 0000000..824a4c5
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VTree.java
@@ -0,0 +1,39 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class VTree {
+    String storagePoolId;
+    VTreeMigrationInfo vtreeMigrationInfo;
+
+    public String getStoragePoolId() {
+        return storagePoolId;
+    }
+
+    public void setStoragePoolId(String storagePoolId) {
+        this.storagePoolId = storagePoolId;
+    }
+
+    public VTreeMigrationInfo getVTreeMigrationInfo() {
+        return vtreeMigrationInfo;
+    }
+
+    public void setVTreeMigrationInfo(VTreeMigrationInfo vtreeMigrationInfo) {
+        this.vtreeMigrationInfo = vtreeMigrationInfo;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VTreeMigrationInfo.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VTreeMigrationInfo.java
new file mode 100644
index 0000000..f4e926b
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VTreeMigrationInfo.java
@@ -0,0 +1,76 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+import com.cloud.utils.EnumUtils;
+
+public class VTreeMigrationInfo {
+    public enum MigrationStatus {
+        NotInMigration,
+        MigrationNormal,
+        PendingRetry,
+        InternalPausing,
+        GracefullyPausing,
+        ForcefullyPausing,
+        Paused,
+        PendingMigration,
+        PendingRebalance,
+        None
+    }
+
+    String sourceStoragePoolId;
+    String destinationStoragePoolId;
+    MigrationStatus migrationStatus;
+    Long migrationQueuePosition;
+
+    public String getSourceStoragePoolId() {
+        return sourceStoragePoolId;
+    }
+
+    public void setSourceStoragePoolId(String sourceStoragePoolId) {
+        this.sourceStoragePoolId = sourceStoragePoolId;
+    }
+
+    public String getDestinationStoragePoolId() {
+        return destinationStoragePoolId;
+    }
+
+    public void setDestinationStoragePoolId(String destinationStoragePoolId) {
+        this.destinationStoragePoolId = destinationStoragePoolId;
+    }
+
+    public MigrationStatus getMigrationStatus() {
+        return migrationStatus;
+    }
+
+    public void setMigrationStatus(String migrationStatus) {
+        this.migrationStatus = EnumUtils.fromString(MigrationStatus.class, migrationStatus, MigrationStatus.None);
+    }
+
+    public void setMigrationStatus(MigrationStatus migrationStatus) {
+        this.migrationStatus = migrationStatus;
+    }
+
+    public Long getMigrationQueuePosition() {
+        return migrationQueuePosition;
+    }
+
+    public void setMigrationQueuePosition(Long migrationQueuePosition) {
+        this.migrationQueuePosition = migrationQueuePosition;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/Volume.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/Volume.java
new file mode 100644
index 0000000..4517a12
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/Volume.java
@@ -0,0 +1,152 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Volume {
+    public enum VolumeType {
+        ThickProvisioned,
+        ThinProvisioned,
+        Snapshot
+    }
+    String id;
+    String name;
+    String ancestorVolumeId;
+    String consistencyGroupId;
+    Long creationTime;
+    Long sizeInKb;
+    String sizeInGB;
+    String storagePoolId;
+    VolumeType volumeType;
+    String volumeSizeInGb;
+    String vtreeId;
+    SdcMappingInfo[] mappedSdcInfo;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAncestorVolumeId() {
+        return ancestorVolumeId;
+    }
+
+    public void setAncestorVolumeId(String ancestorVolumeId) {
+        this.ancestorVolumeId = ancestorVolumeId;
+    }
+
+    public String getConsistencyGroupId() {
+        return consistencyGroupId;
+    }
+
+    public void setConsistencyGroupId(String consistencyGroupId) {
+        this.consistencyGroupId = consistencyGroupId;
+    }
+
+    public Long getCreationTime() {
+        return creationTime;
+    }
+
+    public void setCreationTime(Long creationTime) {
+        this.creationTime = creationTime;
+    }
+
+    public Long getSizeInKb() {
+        return sizeInKb;
+    }
+
+    public void setSizeInKb(Long sizeInKb) {
+        this.sizeInKb = sizeInKb;
+    }
+
+    public String getSizeInGB() {
+        return sizeInGB;
+    }
+
+    public void setSizeInGB(Integer sizeInGB) {
+        this.sizeInGB = sizeInGB.toString();
+    }
+
+    public void setVolumeSizeInGb(String volumeSizeInGb) {
+        this.volumeSizeInGb = volumeSizeInGb;
+    }
+
+    public String getStoragePoolId() {
+        return storagePoolId;
+    }
+
+    public void setStoragePoolId(String storagePoolId) {
+        this.storagePoolId = storagePoolId;
+    }
+
+    public String getVolumeSizeInGb() {
+        return volumeSizeInGb;
+    }
+
+    public void setVolumeSizeInGb(Integer volumeSizeInGb) {
+        this.volumeSizeInGb = volumeSizeInGb.toString();
+    }
+
+    public VolumeType getVolumeType() {
+        return volumeType;
+    }
+
+    public void setVolumeType(String volumeType) {
+        this.volumeType = Enum.valueOf(VolumeType.class, volumeType);
+    }
+
+    public void setVolumeType(VolumeType volumeType) {
+        this.volumeType = volumeType;
+    }
+
+    public String getVtreeId() {
+        return vtreeId;
+    }
+
+    public void setVtreeId(String vtreeId) {
+        this.vtreeId = vtreeId;
+    }
+
+    public List<SdcMappingInfo> getMappedSdcList() {
+        if (mappedSdcInfo != null) {
+            return Arrays.asList(mappedSdcInfo);
+        }
+        return null;
+    }
+
+    public SdcMappingInfo[] getMappedSdcInfo() {
+        return mappedSdcInfo;
+    }
+
+    public void setMappedSdcInfo(SdcMappingInfo[] mappedSdcInfo) {
+        this.mappedSdcInfo = mappedSdcInfo;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VolumeStatistics.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VolumeStatistics.java
new file mode 100644
index 0000000..6f48e17
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/api/VolumeStatistics.java
@@ -0,0 +1,53 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.api;
+
+public class VolumeStatistics {
+    Long allocatedSizeInKb; // virtual size
+    Long netProvisionedAddressesInKb; // physical size
+
+    public Long getAllocatedSizeInKb() {
+        if (allocatedSizeInKb == null) {
+            return Long.valueOf(0);
+        }
+        return allocatedSizeInKb;
+    }
+
+    public Long getAllocatedSizeInBytes() {
+        return (getAllocatedSizeInKb() * 1024);
+    }
+
+    public void setAllocatedSizeInKb(Long allocatedSizeInKb) {
+        this.allocatedSizeInKb = allocatedSizeInKb;
+    }
+
+    public Long getNetProvisionedAddressesInKb() {
+        if (netProvisionedAddressesInKb == null) {
+            return Long.valueOf(0);
+        }
+        return netProvisionedAddressesInKb;
+    }
+
+    public Long getNetProvisionedAddressesInBytes() {
+        return (getNetProvisionedAddressesInKb() * 1024);
+    }
+
+    public void setNetProvisionedAddressesInKb(Long netProvisionedAddressesInKb) {
+        this.netProvisionedAddressesInKb = netProvisionedAddressesInKb;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClient.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClient.java
new file mode 100644
index 0000000..f6b10f8
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClient.java
@@ -0,0 +1,88 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.client;
+
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.storage.datastore.api.Sdc;
+import org.apache.cloudstack.storage.datastore.api.SnapshotGroup;
+import org.apache.cloudstack.storage.datastore.api.StoragePool;
+import org.apache.cloudstack.storage.datastore.api.StoragePoolStatistics;
+import org.apache.cloudstack.storage.datastore.api.Volume;
+import org.apache.cloudstack.storage.datastore.api.VolumeStatistics;
+
+import com.cloud.storage.Storage;
+
+public interface ScaleIOGatewayClient {
+    String GATEWAY_API_ENDPOINT = "powerflex.gw.url";
+    String GATEWAY_API_USERNAME = "powerflex.gw.username";
+    String GATEWAY_API_PASSWORD = "powerflex.gw.password";
+    String STORAGE_POOL_NAME = "powerflex.storagepool.name";
+    String STORAGE_POOL_SYSTEM_ID = "powerflex.storagepool.system.id";
+
+    static ScaleIOGatewayClient getClient(final String url, final String username, final String password,
+                                          final boolean validateCertificate, final int timeout) throws NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
+        return new ScaleIOGatewayClientImpl(url, username, password, validateCertificate, timeout);
+    }
+
+    // Volume APIs
+    Volume createVolume(final String name, final String storagePoolId,
+                        final Integer sizeInGb, final Storage.ProvisioningType volumeType);
+    List<Volume> listVolumes();
+    List<Volume> listSnapshotVolumes();
+    Volume getVolume(String volumeId);
+    Volume getVolumeByName(String name);
+    boolean renameVolume(final String volumeId, final String newName);
+    Volume resizeVolume(final String volumeId, final Integer sizeInGb);
+    Volume cloneVolume(final String sourceVolumeId, final String destVolumeName);
+    boolean deleteVolume(final String volumeId);
+    boolean migrateVolume(final String srcVolumeId, final String destPoolId, final int timeoutInSecs);
+
+    boolean mapVolumeToSdc(final String volumeId, final String sdcId);
+    boolean mapVolumeToSdcWithLimits(final String volumeId, final String sdcId, final Long iopsLimit, final Long bandwidthLimitInKbps);
+    boolean unmapVolumeFromSdc(final String volumeId, final String sdcId);
+    boolean unmapVolumeFromAllSdcs(final String volumeId);
+    boolean isVolumeMappedToSdc(final String volumeId, final String sdcId);
+
+    // Snapshot APIs
+    SnapshotGroup takeSnapshot(final Map<String, String> srcVolumeDestSnapshotMap);
+    boolean revertSnapshot(final String systemId, final Map<String, String> srcSnapshotDestVolumeMap);
+    int deleteSnapshotGroup(final String systemId, final String snapshotGroupId);
+    Volume takeSnapshot(final String volumeId, final String snapshotVolumeName);
+    boolean revertSnapshot(final String sourceSnapshotVolumeId, final String destVolumeId);
+
+    // Storage Pool APIs
+    List<StoragePool> listStoragePools();
+    StoragePool getStoragePool(String poolId);
+    StoragePoolStatistics getStoragePoolStatistics(String poolId);
+    VolumeStatistics getVolumeStatistics(String volumeId);
+    String getSystemId(String protectionDomainId);
+    List<Volume> listVolumesInStoragePool(String poolId);
+
+    // SDC APIs
+    List<Sdc> listSdcs();
+    Sdc getSdc(String sdcId);
+    Sdc getSdcByIp(String ipAddress);
+    Sdc getConnectedSdcByIp(String ipAddress);
+    List<String> listConnectedSdcIps();
+    boolean isSdcConnected(String ipAddress);
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientConnectionPool.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientConnectionPool.java
new file mode 100644
index 0000000..2daf8e4
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientConnectionPool.java
@@ -0,0 +1,90 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.client;
+
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.log4j.Logger;
+
+import com.cloud.storage.StorageManager;
+import com.cloud.utils.crypt.DBEncryptionUtil;
+import com.google.common.base.Preconditions;
+
+public class ScaleIOGatewayClientConnectionPool {
+    private static final Logger LOGGER = Logger.getLogger(ScaleIOGatewayClientConnectionPool.class);
+
+    private ConcurrentHashMap<Long, ScaleIOGatewayClient> gatewayClients;
+
+    private static final ScaleIOGatewayClientConnectionPool instance;
+
+    static {
+        instance = new ScaleIOGatewayClientConnectionPool();
+    }
+
+    public static ScaleIOGatewayClientConnectionPool getInstance() {
+        return instance;
+    }
+
+    private ScaleIOGatewayClientConnectionPool() {
+        gatewayClients = new ConcurrentHashMap<Long, ScaleIOGatewayClient>();
+    }
+
+    public ScaleIOGatewayClient getClient(Long storagePoolId, StoragePoolDetailsDao storagePoolDetailsDao)
+            throws NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
+        Preconditions.checkArgument(storagePoolId != null && storagePoolId > 0, "Invalid storage pool id");
+
+        ScaleIOGatewayClient client = null;
+        synchronized (gatewayClients) {
+            client = gatewayClients.get(storagePoolId);
+            if (client == null) {
+                final String url = storagePoolDetailsDao.findDetail(storagePoolId, ScaleIOGatewayClient.GATEWAY_API_ENDPOINT).getValue();
+                final String encryptedUsername = storagePoolDetailsDao.findDetail(storagePoolId, ScaleIOGatewayClient.GATEWAY_API_USERNAME).getValue();
+                final String username = DBEncryptionUtil.decrypt(encryptedUsername);
+                final String encryptedPassword = storagePoolDetailsDao.findDetail(storagePoolId, ScaleIOGatewayClient.GATEWAY_API_PASSWORD).getValue();
+                final String password = DBEncryptionUtil.decrypt(encryptedPassword);
+                final int clientTimeout = StorageManager.STORAGE_POOL_CLIENT_TIMEOUT.valueIn(storagePoolId);
+
+                client = new ScaleIOGatewayClientImpl(url, username, password, false, clientTimeout);
+                gatewayClients.put(storagePoolId, client);
+                LOGGER.debug("Added gateway client for the storage pool: " + storagePoolId);
+            }
+        }
+
+        return client;
+    }
+
+    public boolean removeClient(Long storagePoolId) {
+        Preconditions.checkArgument(storagePoolId != null && storagePoolId > 0, "Invalid storage pool id");
+
+        ScaleIOGatewayClient client = null;
+        synchronized (gatewayClients) {
+            client = gatewayClients.remove(storagePoolId);
+        }
+
+        if (client != null) {
+            LOGGER.debug("Removed gateway client for the storage pool: " + storagePoolId);
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImpl.java
new file mode 100644
index 0000000..5e8568d
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImpl.java
@@ -0,0 +1,1255 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.client;
+
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.X509TrustManager;
+
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.storage.datastore.api.ProtectionDomain;
+import org.apache.cloudstack.storage.datastore.api.Sdc;
+import org.apache.cloudstack.storage.datastore.api.SdcMappingInfo;
+import org.apache.cloudstack.storage.datastore.api.SnapshotDef;
+import org.apache.cloudstack.storage.datastore.api.SnapshotDefs;
+import org.apache.cloudstack.storage.datastore.api.SnapshotGroup;
+import org.apache.cloudstack.storage.datastore.api.StoragePool;
+import org.apache.cloudstack.storage.datastore.api.StoragePoolStatistics;
+import org.apache.cloudstack.storage.datastore.api.VTree;
+import org.apache.cloudstack.storage.datastore.api.VTreeMigrationInfo;
+import org.apache.cloudstack.storage.datastore.api.Volume;
+import org.apache.cloudstack.storage.datastore.api.VolumeStatistics;
+import org.apache.cloudstack.utils.security.SSLUtils;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.apache.log4j.Logger;
+
+import com.cloud.storage.Storage;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.nio.TrustAllManager;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+
+public class ScaleIOGatewayClientImpl implements ScaleIOGatewayClient {
+    private static final Logger LOG = Logger.getLogger(ScaleIOGatewayClientImpl.class);
+
+    private final URI apiURI;
+    private final HttpClient httpClient;
+    private static final String SESSION_HEADER = "X-RestSvcSessionId";
+    private static final String MDM_CONNECTED_STATE = "Connected";
+
+    private String host;
+    private String username;
+    private String password;
+    private String sessionKey = null;
+
+    // The session token is valid for 8 hours from the time it was created, unless there has been no activity for 10 minutes
+    // Reference: https://cpsdocs.dellemc.com/bundle/PF_REST_API_RG/page/GUID-92430F19-9F44-42B6-B898-87D5307AE59B.html
+    private static final long MAX_VALID_SESSION_TIME_IN_MILLISECS = 8 * 60 * 60 * 1000; // 8 hrs
+    private static final long MAX_IDLE_TIME_IN_MILLISECS = 10 * 60 * 1000; // 10 mins
+    private static final long BUFFER_TIME_IN_MILLISECS = 30 * 1000; // keep 30 secs buffer before the expiration (to avoid any last-minute operations)
+
+    private long createTime = 0;
+    private long lastUsedTime = 0;
+
+    public ScaleIOGatewayClientImpl(final String url, final String username, final String password,
+                                    final boolean validateCertificate, final int timeout)
+            throws NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(url), "Gateway client url cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(username) && !Strings.isNullOrEmpty(password), "Gateway client credentials cannot be null");
+
+        final RequestConfig config = RequestConfig.custom()
+                .setConnectTimeout(timeout * 1000)
+                .setConnectionRequestTimeout(timeout * 1000)
+                .setSocketTimeout(timeout * 1000)
+                .build();
+
+        if (!validateCertificate) {
+            final SSLContext sslcontext = SSLUtils.getSSLContext();
+            sslcontext.init(null, new X509TrustManager[]{new TrustAllManager()}, new SecureRandom());
+            final SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE);
+            this.httpClient = HttpClientBuilder.create()
+                    .setDefaultRequestConfig(config)
+                    .setSSLSocketFactory(factory)
+                    .build();
+        } else {
+            this.httpClient = HttpClientBuilder.create()
+                    .setDefaultRequestConfig(config)
+                    .build();
+        }
+
+        this.apiURI = new URI(url);
+        this.host = apiURI.getHost();
+        this.username = username;
+        this.password = password;
+
+        authenticate();
+    }
+
+    /////////////////////////////////////////////////////////////
+    //////////////// Private Helper Methods /////////////////////
+    /////////////////////////////////////////////////////////////
+
+    private void authenticate() {
+        final HttpGet request = new HttpGet(apiURI.toString() + "/login");
+        request.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes()));
+        try {
+            final HttpResponse response = httpClient.execute(request);
+            checkAuthFailure(response);
+            this.sessionKey = EntityUtils.toString(response.getEntity());
+            if (Strings.isNullOrEmpty(this.sessionKey)) {
+                throw new CloudRuntimeException("Failed to create a valid PowerFlex Gateway Session to perform API requests");
+            }
+            this.sessionKey = this.sessionKey.replace("\"", "");
+            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
+                throw new CloudRuntimeException("PowerFlex Gateway login failed, please check the provided settings");
+            }
+        } catch (final IOException e) {
+            throw new CloudRuntimeException("Failed to authenticate PowerFlex API Gateway due to:" + e.getMessage());
+        }
+        long now = System.currentTimeMillis();
+        createTime = lastUsedTime = now;
+    }
+
+    private synchronized void renewClientSessionOnExpiry() {
+        if (isSessionExpired()) {
+            LOG.debug("Session expired, renewing");
+            authenticate();
+        }
+    }
+
+    private boolean isSessionExpired() {
+        long now = System.currentTimeMillis() + BUFFER_TIME_IN_MILLISECS;
+        if ((now - createTime) > MAX_VALID_SESSION_TIME_IN_MILLISECS ||
+                (now - lastUsedTime) > MAX_IDLE_TIME_IN_MILLISECS) {
+            return true;
+        }
+        return false;
+    }
+
+    private void checkAuthFailure(final HttpResponse response) {
+        if (response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
+            throw new ServerApiException(ApiErrorCode.UNAUTHORIZED, "PowerFlex Gateway API call unauthorized, please check the provided settings");
+        }
+    }
+
+    private void checkResponseOK(final HttpResponse response) {
+        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_NO_CONTENT) {
+            LOG.debug("Requested resource does not exist");
+            return;
+        }
+        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_BAD_REQUEST) {
+            throw new ServerApiException(ApiErrorCode.MALFORMED_PARAMETER_ERROR, "Bad API request");
+        }
+        if (!(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK ||
+                response.getStatusLine().getStatusCode() == HttpStatus.SC_ACCEPTED)) {
+            String responseBody = response.toString();
+            try {
+                responseBody = EntityUtils.toString(response.getEntity());
+            } catch (IOException ignored) {
+            }
+            LOG.debug("HTTP request failed, status code is " + response.getStatusLine().getStatusCode() + ", response is: " + responseBody);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "API failed due to: " + responseBody);
+        }
+    }
+
+    private void checkResponseTimeOut(final Exception e) {
+        if (e instanceof ConnectTimeoutException || e instanceof SocketTimeoutException) {
+            throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, "API operation timed out, please try again.");
+        }
+    }
+
+    private HttpResponse get(final String path) throws IOException {
+        renewClientSessionOnExpiry();
+        final HttpGet request = new HttpGet(apiURI.toString() + path);
+        request.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder().encodeToString((this.username + ":" + this.sessionKey).getBytes()));
+        final HttpResponse response = httpClient.execute(request);
+        synchronized (this) {
+            lastUsedTime = System.currentTimeMillis();
+        }
+        String responseStatus = (response != null) ? (response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase()) : "nil";
+        LOG.debug("GET request path: " + path + ", response: " + responseStatus);
+        checkAuthFailure(response);
+        return response;
+    }
+
+    private HttpResponse post(final String path, final Object obj) throws IOException {
+        renewClientSessionOnExpiry();
+        final HttpPost request = new HttpPost(apiURI.toString() + path);
+        request.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder().encodeToString((this.username + ":" + this.sessionKey).getBytes()));
+        request.setHeader("Content-type", "application/json");
+        if (obj != null) {
+            if (obj instanceof String) {
+                request.setEntity(new StringEntity((String) obj));
+            } else {
+                JsonMapper mapper = new JsonMapper();
+                mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+                String json = mapper.writer().writeValueAsString(obj);
+                request.setEntity(new StringEntity(json));
+            }
+        }
+        final HttpResponse response = httpClient.execute(request);
+        synchronized (this) {
+            lastUsedTime = System.currentTimeMillis();
+        }
+        String responseStatus = (response != null) ? (response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase()) : "nil";
+        LOG.debug("POST request path: " + path + ", response: " + responseStatus);
+        checkAuthFailure(response);
+        return response;
+    }
+
+    //////////////////////////////////////////////////
+    //////////////// Volume APIs /////////////////////
+    //////////////////////////////////////////////////
+
+    @Override
+    public Volume createVolume(final String name, final String storagePoolId,
+                               final Integer sizeInGb, final Storage.ProvisioningType volumeType) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "Volume name cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(storagePoolId), "Storage pool id cannot be null");
+        Preconditions.checkArgument(sizeInGb != null && sizeInGb > 0, "Size(GB) must be greater than 0");
+
+        HttpResponse response = null;
+        try {
+            Volume newVolume = new Volume();
+            newVolume.setName(name);
+            newVolume.setStoragePoolId(storagePoolId);
+            newVolume.setVolumeSizeInGb(sizeInGb);
+            if (Storage.ProvisioningType.FAT.equals(volumeType)) {
+                newVolume.setVolumeType(Volume.VolumeType.ThickProvisioned);
+            } else {
+                newVolume.setVolumeType(Volume.VolumeType.ThinProvisioned);
+            }
+            // The basic allocation granularity is 8GB. The volume size will be rounded up.
+            response = post("/types/Volume/instances", newVolume);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            Volume newVolumeObject = mapper.readValue(response.getEntity().getContent(), Volume.class);
+            return getVolume(newVolumeObject.getId());
+        } catch (final IOException e) {
+            LOG.error("Failed to create PowerFlex volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<Volume> listVolumes() {
+        HttpResponse response = null;
+        try {
+            response = get("/types/Volume/instances");
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            Volume[] volumes = mapper.readValue(response.getEntity().getContent(), Volume[].class);
+            return Arrays.asList(volumes);
+        } catch (final IOException e) {
+            LOG.error("Failed to list PowerFlex volumes due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public List<Volume> listSnapshotVolumes() {
+        List<Volume> volumes = listVolumes();
+        List<Volume> snapshotVolumes = new ArrayList<>();
+        if (volumes != null && !volumes.isEmpty()) {
+            for (Volume volume : volumes) {
+                if (volume != null && volume.getVolumeType() == Volume.VolumeType.Snapshot) {
+                    snapshotVolumes.add(volume);
+                }
+            }
+        }
+
+        return snapshotVolumes;
+    }
+
+    @Override
+    public Volume getVolume(String volumeId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = get("/instances/Volume::" + volumeId);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            return mapper.readValue(response.getEntity().getContent(), Volume.class);
+        } catch (final IOException e) {
+            LOG.error("Failed to get volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Volume getVolumeByName(String name) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "Volume name cannot be null");
+
+        HttpResponse response = null;
+        try {
+            Volume searchVolume = new Volume();
+            searchVolume.setName(name);
+            response = post("/types/Volume/instances/action/queryIdByKey", searchVolume);
+            checkResponseOK(response);
+            String volumeId = EntityUtils.toString(response.getEntity());
+            if (!Strings.isNullOrEmpty(volumeId)) {
+                return getVolume(volumeId.replace("\"", ""));
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to get volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean renameVolume(final String volumeId, final String newName) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(newName), "New name for volume cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = post(
+                    "/instances/Volume::" + volumeId + "/action/setVolumeName",
+                    String.format("{\"newName\":\"%s\"}", newName));
+            checkResponseOK(response);
+            return true;
+        } catch (final IOException e) {
+            LOG.error("Failed to rename PowerFlex volume due to: ", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Volume resizeVolume(final String volumeId, final Integer sizeInGB) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+        Preconditions.checkArgument(sizeInGB != null && (sizeInGB > 0 && sizeInGB % 8 == 0),
+                "Size(GB) must be greater than 0 and in granularity of 8");
+
+        HttpResponse response = null;
+        try {
+            // Volume capacity can only be increased. sizeInGB must be a positive number in granularity of 8 GB.
+            response = post(
+                    "/instances/Volume::" + volumeId + "/action/setVolumeSize",
+                    String.format("{\"sizeInGB\":\"%s\"}", sizeInGB.toString()));
+            checkResponseOK(response);
+            return getVolume(volumeId);
+        } catch (final IOException e) {
+            LOG.error("Failed to resize PowerFlex volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Volume cloneVolume(final String sourceVolumeId, final String destVolumeName) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(sourceVolumeId), "Source volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(destVolumeName), "Dest volume name cannot be null");
+
+        Map<String, String> snapshotMap = new HashMap<>();
+        snapshotMap.put(sourceVolumeId, destVolumeName);
+        takeSnapshot(snapshotMap);
+        return getVolumeByName(destVolumeName);
+    }
+
+    @Override
+    public SnapshotGroup takeSnapshot(final Map<String, String> srcVolumeDestSnapshotMap) {
+        Preconditions.checkArgument(srcVolumeDestSnapshotMap != null && !srcVolumeDestSnapshotMap.isEmpty(), "srcVolumeDestSnapshotMap cannot be null");
+
+        HttpResponse response = null;
+        try {
+            final List<SnapshotDef> defs = new ArrayList<>();
+            for (final String volumeId : srcVolumeDestSnapshotMap.keySet()) {
+                final SnapshotDef snapshotDef = new SnapshotDef();
+                snapshotDef.setVolumeId(volumeId);
+                String snapshotName = srcVolumeDestSnapshotMap.get(volumeId);
+                if (!Strings.isNullOrEmpty(snapshotName)) {
+                    snapshotDef.setSnapshotName(srcVolumeDestSnapshotMap.get(volumeId));
+                }
+                defs.add(snapshotDef);
+            }
+            final SnapshotDefs snapshotDefs = new SnapshotDefs();
+            snapshotDefs.setSnapshotDefs(defs.toArray(new SnapshotDef[0]));
+            response = post("/instances/System/action/snapshotVolumes", snapshotDefs);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            return mapper.readValue(response.getEntity().getContent(), SnapshotGroup.class);
+        } catch (final IOException e) {
+            LOG.error("Failed to take snapshot due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean revertSnapshot(final String systemId, final Map<String, String> srcSnapshotDestVolumeMap) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(systemId), "System id cannot be null");
+        Preconditions.checkArgument(srcSnapshotDestVolumeMap != null && !srcSnapshotDestVolumeMap.isEmpty(), "srcSnapshotDestVolumeMap cannot be null");
+
+        //  Take group snapshot (needs additional storage pool capacity till revert operation) to keep the last state of all volumes ???
+        //  and delete the group snapshot after revert operation
+        //  If revert snapshot failed for any volume, use the group snapshot, to revert volumes to last state
+        Map<String, String> srcVolumeDestSnapshotMap = new HashMap<>();
+        List<String> originalVolumeIds = new ArrayList<>();
+        for (final String sourceSnapshotVolumeId : srcSnapshotDestVolumeMap.keySet()) {
+            String destVolumeId = srcSnapshotDestVolumeMap.get(sourceSnapshotVolumeId);
+            srcVolumeDestSnapshotMap.put(destVolumeId, "");
+            originalVolumeIds.add(destVolumeId);
+        }
+        SnapshotGroup snapshotGroup = takeSnapshot(srcVolumeDestSnapshotMap);
+        if (snapshotGroup == null) {
+            throw new CloudRuntimeException("Failed to snapshot the last vm state");
+        }
+
+        boolean revertSnapshotResult = true;
+        int revertStatusIndex = -1;
+
+        try {
+            // non-atomic operation, try revert each volume
+            for (final String sourceSnapshotVolumeId : srcSnapshotDestVolumeMap.keySet()) {
+                String destVolumeId = srcSnapshotDestVolumeMap.get(sourceSnapshotVolumeId);
+                boolean revertStatus = revertSnapshot(sourceSnapshotVolumeId, destVolumeId);
+                if (!revertStatus) {
+                    revertSnapshotResult = false;
+                    LOG.warn("Failed to revert snapshot for volume id: " + sourceSnapshotVolumeId);
+                    throw new CloudRuntimeException("Failed to revert snapshot for volume id: " + sourceSnapshotVolumeId);
+                } else {
+                    revertStatusIndex++;
+                }
+            }
+        } catch (final Exception e) {
+            LOG.error("Failed to revert vm snapshot due to: " + e.getMessage(), e);
+            throw new CloudRuntimeException("Failed to revert vm snapshot due to: " + e.getMessage());
+        } finally {
+            if (!revertSnapshotResult) {
+                //revert to volume with last state and delete the snapshot group, for already reverted volumes
+                List<String> volumesWithLastState = snapshotGroup.getVolumeIds();
+                for (int index = revertStatusIndex; index >= 0; index--) {
+                    // Handling failure for revert again will become recursive ???
+                    revertSnapshot(volumesWithLastState.get(index), originalVolumeIds.get(index));
+                }
+            }
+            deleteSnapshotGroup(systemId, snapshotGroup.getSnapshotGroupId());
+        }
+
+        return revertSnapshotResult;
+    }
+
+    @Override
+    public int deleteSnapshotGroup(final String systemId, final String snapshotGroupId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(systemId), "System id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(snapshotGroupId), "Snapshot group id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = post(
+                    "/instances/System::" + systemId + "/action/removeConsistencyGroupSnapshots",
+                    String.format("{\"snapGroupId\":\"%s\"}", snapshotGroupId));
+            checkResponseOK(response);
+            JsonNode node = new ObjectMapper().readTree(response.getEntity().getContent());
+            JsonNode noOfVolumesNode = node.get("numberOfVolumes");
+            return noOfVolumesNode.asInt();
+        } catch (final IOException e) {
+            LOG.error("Failed to delete PowerFlex snapshot group due to: " + e.getMessage(), e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return -1;
+    }
+
+    @Override
+    public Volume takeSnapshot(final String volumeId, final String snapshotVolumeName) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(snapshotVolumeName), "Snapshot name cannot be null");
+
+        HttpResponse response = null;
+        try {
+            final SnapshotDef[] snapshotDef = new SnapshotDef[1];
+            snapshotDef[0] = new SnapshotDef();
+            snapshotDef[0].setVolumeId(volumeId);
+            snapshotDef[0].setSnapshotName(snapshotVolumeName);
+            final SnapshotDefs snapshotDefs = new SnapshotDefs();
+            snapshotDefs.setSnapshotDefs(snapshotDef);
+
+            response = post("/instances/System/action/snapshotVolumes", snapshotDefs);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            SnapshotGroup snapshotGroup = mapper.readValue(response.getEntity().getContent(), SnapshotGroup.class);
+            if (snapshotGroup != null) {
+                List<String> volumeIds = snapshotGroup.getVolumeIds();
+                if (volumeIds != null && !volumeIds.isEmpty()) {
+                    return getVolume(volumeIds.get(0));
+                }
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to take snapshot due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean revertSnapshot(final String sourceSnapshotVolumeId, final String destVolumeId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(sourceSnapshotVolumeId), "Source snapshot volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(destVolumeId), "Destination volume id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            Volume sourceSnapshotVolume = getVolume(sourceSnapshotVolumeId);
+            if (sourceSnapshotVolume == null) {
+                throw new CloudRuntimeException("Source snapshot volume: " + sourceSnapshotVolumeId + " doesn't exists");
+            }
+
+            Volume destVolume = getVolume(destVolumeId);
+            if (sourceSnapshotVolume == null) {
+                throw new CloudRuntimeException("Destination volume: " + destVolumeId + " doesn't exists");
+            }
+
+            if (!sourceSnapshotVolume.getVtreeId().equals(destVolume.getVtreeId())) {
+                throw new CloudRuntimeException("Unable to revert, source snapshot volume and destination volume doesn't belong to same volume tree");
+            }
+
+            response = post(
+                    "/instances/Volume::" + destVolumeId + "/action/overwriteVolumeContent",
+                    String.format("{\"srcVolumeId\":\"%s\",\"allowOnExtManagedVol\":\"TRUE\"}", sourceSnapshotVolumeId));
+            checkResponseOK(response);
+            return true;
+        } catch (final IOException e) {
+            LOG.error("Failed to map PowerFlex volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean mapVolumeToSdc(final String volumeId, final String sdcId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(sdcId), "Sdc Id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            if (isVolumeMappedToSdc(volumeId, sdcId)) {
+                return true;
+            }
+
+            response = post(
+                    "/instances/Volume::" + volumeId + "/action/addMappedSdc",
+                    String.format("{\"sdcId\":\"%s\",\"allowMultipleMappings\":\"TRUE\"}", sdcId));
+            checkResponseOK(response);
+            return true;
+        } catch (final IOException e) {
+            LOG.error("Failed to map PowerFlex volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean mapVolumeToSdcWithLimits(final String volumeId, final String sdcId, final Long iopsLimit, final Long bandwidthLimitInKbps) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(sdcId), "Sdc Id cannot be null");
+        Preconditions.checkArgument(iopsLimit != null && (iopsLimit == 0 || iopsLimit > 10),
+                "IOPS limit must be 0 (unlimited) or greater than 10");
+        Preconditions.checkArgument(bandwidthLimitInKbps != null && (bandwidthLimitInKbps == 0 || (bandwidthLimitInKbps > 0 && bandwidthLimitInKbps % 1024 == 0)),
+                "Bandwidth limit(Kbps) must be 0 (unlimited) or in granularity of 1024");
+
+        HttpResponse response = null;
+        try {
+            if (mapVolumeToSdc(volumeId, sdcId)) {
+                long iopsLimitVal = 0;
+                if (iopsLimit != null && iopsLimit.longValue() > 0) {
+                    iopsLimitVal = iopsLimit.longValue();
+                }
+
+                long bandwidthLimitInKbpsVal = 0;
+                if (bandwidthLimitInKbps != null && bandwidthLimitInKbps.longValue() > 0) {
+                    bandwidthLimitInKbpsVal = bandwidthLimitInKbps.longValue();
+                }
+
+                response = post(
+                        "/instances/Volume::" + volumeId + "/action/setMappedSdcLimits",
+                        String.format("{\"sdcId\":\"%s\",\"bandwidthLimitInKbps\":\"%d\",\"iopsLimit\":\"%d\"}", sdcId, bandwidthLimitInKbpsVal, iopsLimitVal));
+                checkResponseOK(response);
+                return true;
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to map PowerFlex volume with limits due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean unmapVolumeFromSdc(final String volumeId, final String sdcId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(sdcId), "Sdc Id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            if (isVolumeMappedToSdc(volumeId, sdcId)) {
+                response = post(
+                        "/instances/Volume::" + volumeId + "/action/removeMappedSdc",
+                        String.format("{\"sdcId\":\"%s\",\"skipApplianceValidation\":\"TRUE\"}", sdcId));
+                checkResponseOK(response);
+                return true;
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to unmap PowerFlex volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean unmapVolumeFromAllSdcs(final String volumeId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            Volume volume = getVolume(volumeId);
+            if (volume == null) {
+                return false;
+            }
+
+            List<SdcMappingInfo> mappedSdcList = volume.getMappedSdcList();
+            if (mappedSdcList == null || mappedSdcList.isEmpty()) {
+                return true;
+            }
+
+            response = post(
+                    "/instances/Volume::" + volumeId + "/action/removeMappedSdc",
+                    "{\"allSdcs\": \"\"}");
+            checkResponseOK(response);
+            return true;
+        } catch (final IOException e) {
+            LOG.error("Failed to unmap PowerFlex volume from all SDCs due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean isVolumeMappedToSdc(final String volumeId, final String sdcId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(sdcId), "Sdc Id cannot be null");
+
+        if (Strings.isNullOrEmpty(volumeId) || Strings.isNullOrEmpty(sdcId)) {
+            return false;
+        }
+
+        Volume volume = getVolume(volumeId);
+        if (volume == null) {
+            return false;
+        }
+
+        List<SdcMappingInfo> mappedSdcList = volume.getMappedSdcList();
+        if (mappedSdcList != null && !mappedSdcList.isEmpty()) {
+            for (SdcMappingInfo mappedSdc : mappedSdcList) {
+                if (sdcId.equalsIgnoreCase(mappedSdc.getSdcId())) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean deleteVolume(final String volumeId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            try {
+                unmapVolumeFromAllSdcs(volumeId);
+            } catch (Exception ignored) {}
+            response = post(
+                    "/instances/Volume::" + volumeId + "/action/removeVolume",
+                    "{\"removeMode\":\"ONLY_ME\"}");
+            checkResponseOK(response);
+            return true;
+        } catch (final IOException e) {
+            LOG.error("Failed to delete PowerFlex volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean migrateVolume(final String srcVolumeId, final String destPoolId, final int timeoutInSecs) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(srcVolumeId), "src volume id cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(destPoolId), "dest pool id cannot be null");
+        Preconditions.checkArgument(timeoutInSecs > 0, "timeout must be greater than 0");
+
+        try {
+            Volume volume = getVolume(srcVolumeId);
+            if (volume == null || Strings.isNullOrEmpty(volume.getVtreeId())) {
+                LOG.warn("Couldn't find the volume(-tree), can not migrate the volume " + srcVolumeId);
+                return false;
+            }
+
+            String srcPoolId = volume.getStoragePoolId();
+            LOG.debug("Migrating the volume: " + srcVolumeId + " on the src pool: " + srcPoolId + " to the dest pool: " + destPoolId +
+                    " in the same PowerFlex cluster");
+
+            HttpResponse response = null;
+            try {
+                response = post(
+                        "/instances/Volume::" + srcVolumeId + "/action/migrateVTree",
+                        String.format("{\"destSPId\":\"%s\"}", destPoolId));
+                checkResponseOK(response);
+            } catch (final IOException e) {
+                LOG.error("Unable to migrate PowerFlex volume due to: ", e);
+                checkResponseTimeOut(e);
+                throw e;
+            } finally {
+                if (response != null) {
+                    EntityUtils.consumeQuietly(response.getEntity());
+                }
+            }
+
+            LOG.debug("Wait until the migration is complete for the volume: " + srcVolumeId);
+            long migrationStartTime = System.currentTimeMillis();
+            boolean status = waitForVolumeMigrationToComplete(volume.getVtreeId(), timeoutInSecs);
+
+            // Check volume storage pool and migration status
+            // volume, v-tree, snapshot ids remains same after the migration
+            volume = getVolume(srcVolumeId);
+            if (volume == null || volume.getStoragePoolId() == null) {
+                LOG.warn("Couldn't get the volume: " + srcVolumeId + " details after migration");
+                return status;
+            } else {
+                String volumeOnPoolId = volume.getStoragePoolId();
+                // confirm whether the volume is on the dest storage pool or not
+                if (status && destPoolId.equalsIgnoreCase(volumeOnPoolId)) {
+                    LOG.debug("Migration success for the volume: " + srcVolumeId);
+                    return true;
+                } else {
+                    try {
+                        // Check and pause any migration activity on the volume
+                        status = false;
+                        VTreeMigrationInfo.MigrationStatus migrationStatus = getVolumeTreeMigrationStatus(volume.getVtreeId());
+                        if (migrationStatus != null && migrationStatus != VTreeMigrationInfo.MigrationStatus.NotInMigration) {
+                            long timeElapsedInSecs = (System.currentTimeMillis() - migrationStartTime) / 1000;
+                            int timeRemainingInSecs = (int) (timeoutInSecs - timeElapsedInSecs);
+                            if (timeRemainingInSecs > (timeoutInSecs / 2)) {
+                                // Try to pause gracefully (continue the migration) if atleast half of the time is remaining
+                                pauseVolumeMigration(srcVolumeId, false);
+                                status = waitForVolumeMigrationToComplete(volume.getVtreeId(), timeRemainingInSecs);
+                            }
+                        }
+
+                        if (!status) {
+                            rollbackVolumeMigration(srcVolumeId);
+                        }
+
+                        return status;
+                    } catch (Exception ex) {
+                        LOG.warn("Exception on pause/rollback migration of the volume: " + srcVolumeId + " - " + ex.getLocalizedMessage());
+                    }
+                }
+            }
+        } catch (final Exception e) {
+            LOG.error("Failed to migrate PowerFlex volume due to: " + e.getMessage(), e);
+            throw new CloudRuntimeException("Failed to migrate PowerFlex volume due to: " + e.getMessage());
+        }
+
+        LOG.debug("Migration failed for the volume: " + srcVolumeId);
+        return false;
+    }
+
+    private boolean waitForVolumeMigrationToComplete(final String volumeTreeId, int waitTimeoutInSecs) {
+        LOG.debug("Waiting for the migration to complete for the volume-tree " + volumeTreeId);
+        if (Strings.isNullOrEmpty(volumeTreeId)) {
+            LOG.warn("Invalid volume-tree id, unable to check the migration status of the volume-tree " + volumeTreeId);
+            return false;
+        }
+
+        int delayTimeInSecs = 3;
+        while (waitTimeoutInSecs > 0) {
+            try {
+                // Wait and try after few secs (reduce no. of client API calls to check the migration status) and return after migration is complete
+                Thread.sleep(delayTimeInSecs * 1000);
+
+                VTreeMigrationInfo.MigrationStatus migrationStatus = getVolumeTreeMigrationStatus(volumeTreeId);
+                if (migrationStatus != null && migrationStatus == VTreeMigrationInfo.MigrationStatus.NotInMigration) {
+                    LOG.debug("Migration completed for the volume-tree " + volumeTreeId);
+                    return true;
+                }
+            } catch (Exception ex) {
+                LOG.warn("Exception while checking for migration status of the volume-tree: " + volumeTreeId + " - " + ex.getLocalizedMessage());
+                // don't do anything
+            } finally {
+                waitTimeoutInSecs = waitTimeoutInSecs - delayTimeInSecs;
+            }
+        }
+
+        LOG.debug("Unable to complete the migration for the volume-tree " + volumeTreeId);
+        return false;
+    }
+
+    private VTreeMigrationInfo.MigrationStatus getVolumeTreeMigrationStatus(final String volumeTreeId) {
+        if (Strings.isNullOrEmpty(volumeTreeId)) {
+            LOG.warn("Invalid volume-tree id, unable to get the migration status of the volume-tree " + volumeTreeId);
+            return null;
+        }
+
+        HttpResponse response = null;
+        try {
+            response = get("/instances/VTree::" + volumeTreeId);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            VTree volumeTree = mapper.readValue(response.getEntity().getContent(), VTree.class);
+            if (volumeTree != null && volumeTree.getVTreeMigrationInfo() != null) {
+                return volumeTree.getVTreeMigrationInfo().getMigrationStatus();
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to migrate PowerFlex volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    private boolean rollbackVolumeMigration(final String srcVolumeId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(srcVolumeId), "src volume id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            Volume volume = getVolume(srcVolumeId);
+            VTreeMigrationInfo.MigrationStatus migrationStatus = getVolumeTreeMigrationStatus(volume.getVtreeId());
+            if (migrationStatus != null && migrationStatus == VTreeMigrationInfo.MigrationStatus.NotInMigration) {
+                LOG.debug("Volume: " + srcVolumeId + " is not migrating, no need to rollback");
+                return true;
+            }
+
+            pauseVolumeMigration(srcVolumeId, true); // Pause forcefully
+            // Wait few secs for volume migration to change to Paused state
+            boolean paused = false;
+            int retryCount = 3;
+            while (retryCount > 0) {
+                try {
+                    Thread.sleep(3000); // Try after few secs
+                    migrationStatus = getVolumeTreeMigrationStatus(volume.getVtreeId()); // Get updated migration status
+                    if (migrationStatus != null && migrationStatus == VTreeMigrationInfo.MigrationStatus.Paused) {
+                        LOG.debug("Migration for the volume: " + srcVolumeId + " paused");
+                        paused = true;
+                        break;
+                    }
+                } catch (Exception ex) {
+                    LOG.warn("Exception while checking for migration pause status of the volume: " + srcVolumeId + " - " + ex.getLocalizedMessage());
+                    // don't do anything
+                } finally {
+                    retryCount--;
+                }
+            }
+
+            if (paused) {
+                // Rollback migration to the src pool (should be quick)
+                response = post(
+                        "/instances/Volume::" + srcVolumeId + "/action/migrateVTree",
+                        String.format("{\"destSPId\":\"%s\"}", volume.getStoragePoolId()));
+                checkResponseOK(response);
+                return true;
+            } else {
+                LOG.warn("Migration for the volume: " + srcVolumeId + " didn't pause, couldn't rollback");
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to rollback volume migration due to: ", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    private boolean pauseVolumeMigration(final String volumeId, final boolean forced) {
+        if (Strings.isNullOrEmpty(volumeId)) {
+            LOG.warn("Invalid Volume Id, Unable to pause migration of the volume " + volumeId);
+            return false;
+        }
+
+        HttpResponse response = null;
+        try {
+            // When paused gracefully, all data currently being moved is allowed to complete the migration.
+            // When paused forcefully, migration of unfinished data is aborted and data is left at the source, if possible.
+            // Pausing forcefully carries a potential risk to data.
+            response = post(
+                    "/instances/Volume::" + volumeId + "/action/pauseVTreeMigration",
+                    String.format("{\"pauseType\":\"%s\"}", forced ? "Forcefully" : "Gracefully"));
+            checkResponseOK(response);
+            return true;
+        } catch (final IOException e) {
+            LOG.error("Failed to pause migration of the volume due to: ", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return false;
+    }
+
+    ///////////////////////////////////////////////////////
+    //////////////// StoragePool APIs /////////////////////
+    ///////////////////////////////////////////////////////
+
+    @Override
+    public List<StoragePool> listStoragePools() {
+        HttpResponse response = null;
+        try {
+            response = get("/types/StoragePool/instances");
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            StoragePool[] pools = mapper.readValue(response.getEntity().getContent(), StoragePool[].class);
+            return Arrays.asList(pools);
+        } catch (final IOException e) {
+            LOG.error("Failed to list PowerFlex storage pools due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public StoragePool getStoragePool(String poolId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(poolId), "Storage pool id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = get("/instances/StoragePool::" + poolId);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            return mapper.readValue(response.getEntity().getContent(), StoragePool.class);
+        } catch (final IOException e) {
+            LOG.error("Failed to get storage pool due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public StoragePoolStatistics getStoragePoolStatistics(String poolId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(poolId), "Storage pool id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = get("/instances/StoragePool::" + poolId + "/relationships/Statistics");
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            return mapper.readValue(response.getEntity().getContent(), StoragePoolStatistics.class);
+        } catch (final IOException e) {
+            LOG.error("Failed to get storage pool due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public VolumeStatistics getVolumeStatistics(String volumeId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumeId), "Volume id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            Volume volume = getVolume(volumeId);
+            if (volume != null) {
+                String volumeTreeId = volume.getVtreeId();
+                if (!Strings.isNullOrEmpty(volumeTreeId)) {
+                    response = get("/instances/VTree::" + volumeTreeId + "/relationships/Statistics");
+                    checkResponseOK(response);
+                    ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+                    VolumeStatistics volumeStatistics = mapper.readValue(response.getEntity().getContent(), VolumeStatistics.class);
+                    if (volumeStatistics != null) {
+                        volumeStatistics.setAllocatedSizeInKb(volume.getSizeInKb());
+                        return volumeStatistics;
+                    }
+                }
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to get volume stats due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public String getSystemId(String protectionDomainId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(protectionDomainId), "Protection domain id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = get("/instances/ProtectionDomain::" + protectionDomainId);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            ProtectionDomain protectionDomain = mapper.readValue(response.getEntity().getContent(), ProtectionDomain.class);
+            if (protectionDomain != null) {
+                return protectionDomain.getSystemId();
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to get protection domain details due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<Volume> listVolumesInStoragePool(String poolId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(poolId), "Storage pool id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = get("/instances/StoragePool::" + poolId + "/relationships/Volume");
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            Volume[] volumes = mapper.readValue(response.getEntity().getContent(), Volume[].class);
+            return Arrays.asList(volumes);
+        } catch (final IOException e) {
+            LOG.error("Failed to list volumes in storage pool due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return new ArrayList<>();
+    }
+
+    ///////////////////////////////////////////////
+    //////////////// SDC APIs /////////////////////
+    ///////////////////////////////////////////////
+
+    @Override
+    public List<Sdc> listSdcs() {
+        HttpResponse response = null;
+        try {
+            response = get("/types/Sdc/instances");
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            Sdc[] sdcs = mapper.readValue(response.getEntity().getContent(), Sdc[].class);
+            return Arrays.asList(sdcs);
+        } catch (final IOException e) {
+            LOG.error("Failed to list SDCs due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public Sdc getSdc(String sdcId) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(sdcId), "Sdc id cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = get("/instances/Sdc::" + sdcId);
+            checkResponseOK(response);
+            ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            return mapper.readValue(response.getEntity().getContent(), Sdc.class);
+        } catch (final IOException e) {
+            LOG.error("Failed to get volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Sdc getSdcByIp(String ipAddress) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(ipAddress), "IP address cannot be null");
+
+        HttpResponse response = null;
+        try {
+            response = post("/types/Sdc/instances/action/queryIdByKey", String.format("{\"ip\":\"%s\"}", ipAddress));
+            checkResponseOK(response);
+            String sdcId = EntityUtils.toString(response.getEntity());
+            if (!Strings.isNullOrEmpty(sdcId)) {
+                return getSdc(sdcId.replace("\"", ""));
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to get volume due to:", e);
+            checkResponseTimeOut(e);
+        } finally {
+            if (response != null) {
+                EntityUtils.consumeQuietly(response.getEntity());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Sdc getConnectedSdcByIp(String ipAddress) {
+        Sdc sdc = getSdcByIp(ipAddress);
+        if (sdc != null && MDM_CONNECTED_STATE.equalsIgnoreCase(sdc.getMdmConnectionState())) {
+            return sdc;
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<String> listConnectedSdcIps() {
+        List<String> sdcIps = new ArrayList<>();
+        List<Sdc> sdcs = listSdcs();
+        if(sdcs != null) {
+            for (Sdc sdc : sdcs) {
+                if (MDM_CONNECTED_STATE.equalsIgnoreCase(sdc.getMdmConnectionState())) {
+                    sdcIps.add(sdc.getSdcIp());
+                }
+            }
+        }
+
+        return sdcIps;
+    }
+
+    @Override
+    public boolean isSdcConnected(String ipAddress) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(ipAddress), "IP address cannot be null");
+
+        List<Sdc> sdcs = listSdcs();
+        if(sdcs != null) {
+            for (Sdc sdc : sdcs) {
+                if (ipAddress.equalsIgnoreCase(sdc.getSdcIp()) && MDM_CONNECTED_STATE.equalsIgnoreCase(sdc.getMdmConnectionState())) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
new file mode 100644
index 0000000..f840bae
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
@@ -0,0 +1,950 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.storage.datastore.driver;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.storage.RemoteHostEndPoint;
+import org.apache.cloudstack.storage.command.CommandResult;
+import org.apache.cloudstack.storage.command.CopyCommand;
+import org.apache.cloudstack.storage.command.CreateObjectAnswer;
+import org.apache.cloudstack.storage.datastore.api.Sdc;
+import org.apache.cloudstack.storage.datastore.api.StoragePoolStatistics;
+import org.apache.cloudstack.storage.datastore.api.VolumeStatistics;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientConnectionPool;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
+import org.apache.cloudstack.storage.to.SnapshotObjectTO;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.to.DataObjectType;
+import com.cloud.agent.api.to.DataStoreTO;
+import com.cloud.agent.api.to.DataTO;
+import com.cloud.alert.AlertManager;
+import com.cloud.configuration.Config;
+import com.cloud.host.Host;
+import com.cloud.server.ManagementServerImpl;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ResizeVolumePayload;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.Storage;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeDetailVO;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.dao.VolumeDetailsDao;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.Pair;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VirtualMachineManager;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+
+public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver {
+    private static final Logger LOGGER = Logger.getLogger(ScaleIOPrimaryDataStoreDriver.class);
+
+    @Inject
+    EndPointSelector selector;
+    @Inject
+    private PrimaryDataStoreDao storagePoolDao;
+    @Inject
+    private StoragePoolDetailsDao storagePoolDetailsDao;
+    @Inject
+    private VolumeDao volumeDao;
+    @Inject
+    private VolumeDetailsDao volumeDetailsDao;
+    @Inject
+    private VMTemplatePoolDao vmTemplatePoolDao;
+    @Inject
+    private SnapshotDataStoreDao snapshotDataStoreDao;
+    @Inject
+    protected SnapshotDao snapshotDao;
+    @Inject
+    private AlertManager alertMgr;
+    @Inject
+    private ConfigurationDao configDao;
+
+    public ScaleIOPrimaryDataStoreDriver() {
+
+    }
+
+    private ScaleIOGatewayClient getScaleIOClient(final Long storagePoolId) throws Exception {
+        return ScaleIOGatewayClientConnectionPool.getInstance().getClient(storagePoolId, storagePoolDetailsDao);
+    }
+
+    @Override
+    public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) {
+        try {
+            if (DataObjectType.VOLUME.equals(dataObject.getType())) {
+                final VolumeVO volume = volumeDao.findById(dataObject.getId());
+                LOGGER.debug("Granting access for PowerFlex volume: " + volume.getPath());
+
+                Long bandwidthLimitInKbps = Long.valueOf(0); // Unlimited
+                // Check Bandwidht Limit parameter in volume details
+                final VolumeDetailVO bandwidthVolumeDetail = volumeDetailsDao.findDetail(volume.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS);
+                if (bandwidthVolumeDetail != null && bandwidthVolumeDetail.getValue() != null) {
+                    bandwidthLimitInKbps = Long.parseLong(bandwidthVolumeDetail.getValue()) * 1024;
+                }
+
+                Long iopsLimit = Long.valueOf(0); // Unlimited
+                // Check IOPS Limit parameter in volume details, else try MaxIOPS
+                final VolumeDetailVO iopsVolumeDetail = volumeDetailsDao.findDetail(volume.getId(), Volume.IOPS_LIMIT);
+                if (iopsVolumeDetail != null && iopsVolumeDetail.getValue() != null) {
+                    iopsLimit = Long.parseLong(iopsVolumeDetail.getValue());
+                } else if (volume.getMaxIops() != null) {
+                    iopsLimit = volume.getMaxIops();
+                }
+                if (iopsLimit > 0 && iopsLimit < ScaleIOUtil.MINIMUM_ALLOWED_IOPS_LIMIT) {
+                    iopsLimit = ScaleIOUtil.MINIMUM_ALLOWED_IOPS_LIMIT;
+                }
+
+                final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId());
+                final Sdc sdc = client.getConnectedSdcByIp(host.getPrivateIpAddress());
+                if (sdc == null) {
+                    alertHostSdcDisconnection(host);
+                    throw new CloudRuntimeException("Unable to grant access to volume: " + dataObject.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress());
+                }
+
+                return client.mapVolumeToSdcWithLimits(ScaleIOUtil.getVolumePath(volume.getPath()), sdc.getId(), iopsLimit, bandwidthLimitInKbps);
+            } else if (DataObjectType.TEMPLATE.equals(dataObject.getType())) {
+                final VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(dataStore.getId(), dataObject.getId(), null);
+                LOGGER.debug("Granting access for PowerFlex template volume: " + templatePoolRef.getInstallPath());
+
+                final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId());
+                final Sdc sdc = client.getConnectedSdcByIp(host.getPrivateIpAddress());
+                if (sdc == null) {
+                    alertHostSdcDisconnection(host);
+                    throw new CloudRuntimeException("Unable to grant access to template: " + dataObject.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress());
+                }
+
+                return client.mapVolumeToSdc(ScaleIOUtil.getVolumePath(templatePoolRef.getInstallPath()), sdc.getId());
+            } else if (DataObjectType.SNAPSHOT.equals(dataObject.getType())) {
+                SnapshotInfo snapshot = (SnapshotInfo) dataObject;
+                LOGGER.debug("Granting access for PowerFlex volume snapshot: " + snapshot.getPath());
+
+                final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId());
+                final Sdc sdc = client.getConnectedSdcByIp(host.getPrivateIpAddress());
+                if (sdc == null) {
+                    alertHostSdcDisconnection(host);
+                    throw new CloudRuntimeException("Unable to grant access to snapshot: " + dataObject.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress());
+                }
+
+                return client.mapVolumeToSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), sdc.getId());
+            }
+
+            return false;
+        } catch (Exception e) {
+            throw new CloudRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void revokeAccess(DataObject dataObject, Host host, DataStore dataStore) {
+        try {
+            if (DataObjectType.VOLUME.equals(dataObject.getType())) {
+                final VolumeVO volume = volumeDao.findById(dataObject.getId());
+                LOGGER.debug("Revoking access for PowerFlex volume: " + volume.getPath());
+
+                final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId());
+                final Sdc sdc = client.getConnectedSdcByIp(host.getPrivateIpAddress());
+                if (sdc == null) {
+                    throw new CloudRuntimeException("Unable to revoke access for volume: " + dataObject.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress());
+                }
+
+                client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(volume.getPath()), sdc.getId());
+            } else if (DataObjectType.TEMPLATE.equals(dataObject.getType())) {
+                final VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(dataStore.getId(), dataObject.getId(), null);
+                LOGGER.debug("Revoking access for PowerFlex template volume: " + templatePoolRef.getInstallPath());
+
+                final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId());
+                final Sdc sdc = client.getConnectedSdcByIp(host.getPrivateIpAddress());
+                if (sdc == null) {
+                    throw new CloudRuntimeException("Unable to revoke access for template: " + dataObject.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress());
+                }
+
+                client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(templatePoolRef.getInstallPath()), sdc.getId());
+            } else if (DataObjectType.SNAPSHOT.equals(dataObject.getType())) {
+                SnapshotInfo snapshot = (SnapshotInfo) dataObject;
+                LOGGER.debug("Revoking access for PowerFlex volume snapshot: " + snapshot.getPath());
+
+                final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId());
+                final Sdc sdc = client.getConnectedSdcByIp(host.getPrivateIpAddress());
+                if (sdc == null) {
+                    throw new CloudRuntimeException("Unable to revoke access for snapshot: " + dataObject.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress());
+                }
+
+                client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), sdc.getId());
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Failed to revoke access due to: " + e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public long getUsedBytes(StoragePool storagePool) {
+        long usedSpaceBytes = 0;
+        // Volumes
+        List<VolumeVO> volumes = volumeDao.findByPoolIdAndState(storagePool.getId(), Volume.State.Ready);
+        if (volumes != null) {
+            for (VolumeVO volume : volumes) {
+                usedSpaceBytes += volume.getSize();
+
+                long vmSnapshotChainSize = volume.getVmSnapshotChainSize() == null ? 0 : volume.getVmSnapshotChainSize();
+                usedSpaceBytes += vmSnapshotChainSize;
+            }
+        }
+
+        //Snapshots
+        List<SnapshotDataStoreVO> snapshots = snapshotDataStoreDao.listByStoreIdAndState(storagePool.getId(), ObjectInDataStoreStateMachine.State.Ready);
+        if (snapshots != null) {
+            for (SnapshotDataStoreVO snapshot : snapshots) {
+                usedSpaceBytes += snapshot.getSize();
+            }
+        }
+
+        // Templates
+        List<VMTemplateStoragePoolVO> templates = vmTemplatePoolDao.listByPoolIdAndState(storagePool.getId(), ObjectInDataStoreStateMachine.State.Ready);
+        if (templates != null) {
+            for (VMTemplateStoragePoolVO template : templates) {
+                usedSpaceBytes += template.getTemplateSize();
+            }
+        }
+
+        LOGGER.debug("Used/Allocated storage space (in bytes): " + String.valueOf(usedSpaceBytes));
+
+        return usedSpaceBytes;
+    }
+
+    @Override
+    public long getUsedIops(StoragePool storagePool) {
+        return 0;
+    }
+
+    @Override
+    public long getDataObjectSizeIncludingHypervisorSnapshotReserve(DataObject dataObject, StoragePool pool) {
+        return ((dataObject != null && dataObject.getSize() != null) ? dataObject.getSize() : 0);
+    }
+
+    @Override
+    public long getBytesRequiredForTemplate(TemplateInfo templateInfo, StoragePool storagePool) {
+        if (templateInfo == null || storagePool == null) {
+            return 0;
+        }
+
+        VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(storagePool.getId(), templateInfo.getId(), null);
+        if (templatePoolRef != null) {
+            // Template exists on this primary storage, do not require additional space
+            return 0;
+        }
+
+        return getDataObjectSizeIncludingHypervisorSnapshotReserve(templateInfo, storagePool);
+    }
+
+    @Override
+    public Map<String, String> getCapabilities() {
+        Map<String, String> mapCapabilities = new HashMap<>();
+        mapCapabilities.put(DataStoreCapabilities.CAN_CREATE_VOLUME_FROM_VOLUME.toString(), Boolean.TRUE.toString());
+        mapCapabilities.put(DataStoreCapabilities.CAN_CREATE_VOLUME_FROM_SNAPSHOT.toString(), Boolean.TRUE.toString());
+        mapCapabilities.put(DataStoreCapabilities.CAN_REVERT_VOLUME_TO_SNAPSHOT.toString(), Boolean.TRUE.toString());
+        mapCapabilities.put(DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString(), Boolean.TRUE.toString());
+        return mapCapabilities;
+    }
+
+    @Override
+    public ChapInfo getChapInfo(DataObject dataObject) {
+        return null;
+    }
+
+    @Override
+    public DataTO getTO(DataObject data) {
+        return null;
+    }
+
+    @Override
+    public DataStoreTO getStoreTO(DataStore store) {
+        return null;
+    }
+
+    @Override
+    public void takeSnapshot(SnapshotInfo snapshotInfo, AsyncCompletionCallback<CreateCmdResult> callback) {
+        LOGGER.debug("Taking PowerFlex volume snapshot");
+
+        Preconditions.checkArgument(snapshotInfo != null, "snapshotInfo cannot be null");
+
+        VolumeInfo volumeInfo = snapshotInfo.getBaseVolume();
+        Preconditions.checkArgument(volumeInfo != null, "volumeInfo cannot be null");
+
+        VolumeVO volumeVO = volumeDao.findById(volumeInfo.getId());
+
+        long storagePoolId = volumeVO.getPoolId();
+        Preconditions.checkArgument(storagePoolId > 0, "storagePoolId should be > 0");
+
+        StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId);
+        Preconditions.checkArgument(storagePool != null && storagePool.getHostAddress() != null, "storagePool and host address should not be null");
+
+        CreateCmdResult result;
+
+        try {
+            SnapshotObjectTO snapshotObjectTo = (SnapshotObjectTO)snapshotInfo.getTO();
+
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+            final String scaleIOVolumeId = ScaleIOUtil.getVolumePath(volumeVO.getPath());
+            String snapshotName = String.format("%s-%s-%s-%s", ScaleIOUtil.SNAPSHOT_PREFIX, snapshotInfo.getId(),
+                    storagePool.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
+
+            org.apache.cloudstack.storage.datastore.api.Volume scaleIOVolume = null;
+            scaleIOVolume = client.takeSnapshot(scaleIOVolumeId, snapshotName);
+
+            if (scaleIOVolume == null) {
+                throw new CloudRuntimeException("Failed to take snapshot on PowerFlex cluster");
+            }
+
+            snapshotObjectTo.setPath(ScaleIOUtil.updatedPathWithVolumeName(scaleIOVolume.getId(), snapshotName));
+            CreateObjectAnswer createObjectAnswer = new CreateObjectAnswer(snapshotObjectTo);
+            result = new CreateCmdResult(null, createObjectAnswer);
+            result.setResult(null);
+        } catch (Exception e) {
+            String errMsg = "Unable to take PowerFlex volume snapshot for volume: " + volumeInfo.getId() + " due to " + e.getMessage();
+            LOGGER.warn(errMsg);
+            result = new CreateCmdResult(null, new CreateObjectAnswer(e.toString()));
+            result.setResult(e.toString());
+        }
+
+        callback.complete(result);
+    }
+
+    @Override
+    public void revertSnapshot(SnapshotInfo snapshot, SnapshotInfo snapshotOnPrimaryStore, AsyncCompletionCallback<CommandResult> callback) {
+        LOGGER.debug("Reverting to PowerFlex volume snapshot");
+
+        Preconditions.checkArgument(snapshot != null, "snapshotInfo cannot be null");
+
+        VolumeInfo volumeInfo = snapshot.getBaseVolume();
+        Preconditions.checkArgument(volumeInfo != null, "volumeInfo cannot be null");
+
+        VolumeVO volumeVO = volumeDao.findById(volumeInfo.getId());
+
+        try {
+            if (volumeVO == null || volumeVO.getRemoved() != null) {
+                String errMsg = "The volume that the snapshot belongs to no longer exists.";
+                CommandResult commandResult = new CommandResult();
+                commandResult.setResult(errMsg);
+                callback.complete(commandResult);
+                return;
+            }
+
+            long storagePoolId = volumeVO.getPoolId();
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+            String snapshotVolumeId = ScaleIOUtil.getVolumePath(snapshot.getPath());
+            final String destVolumeId = ScaleIOUtil.getVolumePath(volumeVO.getPath());
+            client.revertSnapshot(snapshotVolumeId, destVolumeId);
+
+            CommandResult commandResult = new CommandResult();
+            callback.complete(commandResult);
+        } catch (Exception ex) {
+            LOGGER.debug("Unable to revert to PowerFlex snapshot: " + snapshot.getId(), ex);
+            throw new CloudRuntimeException(ex.getMessage());
+        }
+    }
+
+    private String createVolume(VolumeInfo volumeInfo, long storagePoolId) {
+        LOGGER.debug("Creating PowerFlex volume");
+
+        StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId);
+
+        Preconditions.checkArgument(volumeInfo != null, "volumeInfo cannot be null");
+        Preconditions.checkArgument(storagePoolId > 0, "storagePoolId should be > 0");
+        Preconditions.checkArgument(storagePool != null && storagePool.getHostAddress() != null, "storagePool and host address should not be null");
+
+        try {
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+            final String scaleIOStoragePoolId = storagePool.getPath();
+            final Long sizeInBytes = volumeInfo.getSize();
+            final long sizeInGb = (long) Math.ceil(sizeInBytes / (1024.0 * 1024.0 * 1024.0));
+            final String scaleIOVolumeName = String.format("%s-%s-%s-%s", ScaleIOUtil.VOLUME_PREFIX, volumeInfo.getId(),
+                    storagePool.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
+
+            org.apache.cloudstack.storage.datastore.api.Volume scaleIOVolume = null;
+            scaleIOVolume = client.createVolume(scaleIOVolumeName, scaleIOStoragePoolId, (int) sizeInGb, volumeInfo.getProvisioningType());
+
+            if (scaleIOVolume == null) {
+                throw new CloudRuntimeException("Failed to create volume on PowerFlex cluster");
+            }
+
+            VolumeVO volume = volumeDao.findById(volumeInfo.getId());
+            String volumePath = ScaleIOUtil.updatedPathWithVolumeName(scaleIOVolume.getId(), scaleIOVolumeName);
+            volume.set_iScsiName(volumePath);
+            volume.setPath(volumePath);
+            volume.setFolder(scaleIOVolume.getVtreeId());
+            volume.setSize(scaleIOVolume.getSizeInKb() * 1024);
+            volume.setPoolType(Storage.StoragePoolType.PowerFlex);
+            volume.setFormat(Storage.ImageFormat.RAW);
+            volume.setPoolId(storagePoolId);
+            volumeDao.update(volume.getId(), volume);
+
+            long capacityBytes = storagePool.getCapacityBytes();
+            long usedBytes = storagePool.getUsedBytes();
+            usedBytes += volume.getSize();
+            storagePool.setUsedBytes(usedBytes > capacityBytes ? capacityBytes : usedBytes);
+            storagePoolDao.update(storagePoolId, storagePool);
+
+            return volumePath;
+        } catch (Exception e) {
+            String errMsg = "Unable to create PowerFlex Volume due to " + e.getMessage();
+            LOGGER.warn(errMsg);
+            throw new CloudRuntimeException(errMsg, e);
+        }
+    }
+
+    private String  createTemplateVolume(TemplateInfo templateInfo, long storagePoolId) {
+        LOGGER.debug("Creating PowerFlex template volume");
+
+        StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId);
+        Preconditions.checkArgument(templateInfo != null, "templateInfo cannot be null");
+        Preconditions.checkArgument(storagePoolId > 0, "storagePoolId should be > 0");
+        Preconditions.checkArgument(storagePool != null && storagePool.getHostAddress() != null, "storagePool and host address should not be null");
+
+        try {
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+            final String scaleIOStoragePoolId = storagePool.getPath();
+            final Long sizeInBytes = templateInfo.getSize();
+            final long sizeInGb = (long) Math.ceil(sizeInBytes / (1024.0 * 1024.0 * 1024.0));
+            final String scaleIOVolumeName = String.format("%s-%s-%s-%s", ScaleIOUtil.TEMPLATE_PREFIX, templateInfo.getId(),
+                    storagePool.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
+
+            org.apache.cloudstack.storage.datastore.api.Volume scaleIOVolume = null;
+            scaleIOVolume = client.createVolume(scaleIOVolumeName, scaleIOStoragePoolId, (int) sizeInGb, Storage.ProvisioningType.THIN);
+
+            if (scaleIOVolume == null) {
+                throw new CloudRuntimeException("Failed to create template volume on PowerFlex cluster");
+            }
+
+            VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(storagePoolId, templateInfo.getId(), null);
+            String templatePath = ScaleIOUtil.updatedPathWithVolumeName(scaleIOVolume.getId(), scaleIOVolumeName);
+            templatePoolRef.setInstallPath(templatePath);
+            templatePoolRef.setLocalDownloadPath(scaleIOVolume.getId());
+            templatePoolRef.setTemplateSize(scaleIOVolume.getSizeInKb() * 1024);
+            vmTemplatePoolDao.update(templatePoolRef.getId(), templatePoolRef);
+
+            long capacityBytes = storagePool.getCapacityBytes();
+            long usedBytes = storagePool.getUsedBytes();
+            usedBytes += templatePoolRef.getTemplateSize();
+            storagePool.setUsedBytes(usedBytes > capacityBytes ? capacityBytes : usedBytes);
+            storagePoolDao.update(storagePoolId, storagePool);
+
+            return templatePath;
+        } catch (Exception e) {
+            String errMsg = "Unable to create PowerFlex template volume due to " + e.getMessage();
+            LOGGER.warn(errMsg);
+            throw new CloudRuntimeException(errMsg, e);
+        }
+    }
+
+    @Override
+    public void createAsync(DataStore dataStore, DataObject dataObject, AsyncCompletionCallback<CreateCmdResult> callback) {
+        String scaleIOVolumePath = null;
+        String errMsg = null;
+        try {
+            if (dataObject.getType() == DataObjectType.VOLUME) {
+                LOGGER.debug("createAsync - creating volume");
+                scaleIOVolumePath = createVolume((VolumeInfo) dataObject, dataStore.getId());
+            } else if (dataObject.getType() == DataObjectType.TEMPLATE) {
+                LOGGER.debug("createAsync - creating template");
+                scaleIOVolumePath = createTemplateVolume((TemplateInfo)dataObject, dataStore.getId());
+            } else {
+                errMsg = "Invalid DataObjectType (" + dataObject.getType() + ") passed to createAsync";
+                LOGGER.error(errMsg);
+            }
+        } catch (Exception ex) {
+            errMsg = ex.getMessage();
+            LOGGER.error(errMsg);
+            if (callback == null) {
+                throw ex;
+            }
+        }
+
+        if (callback != null) {
+            CreateCmdResult result = new CreateCmdResult(scaleIOVolumePath, new Answer(null, errMsg == null, errMsg));
+            result.setResult(errMsg);
+            callback.complete(result);
+        }
+    }
+
+    @Override
+    public void deleteAsync(DataStore dataStore, DataObject dataObject, AsyncCompletionCallback<CommandResult> callback) {
+        Preconditions.checkArgument(dataObject != null, "dataObject cannot be null");
+
+        long storagePoolId = dataStore.getId();
+        StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId);
+        Preconditions.checkArgument(storagePoolId > 0, "storagePoolId should be > 0");
+        Preconditions.checkArgument(storagePool != null && storagePool.getHostAddress() != null, "storagePool and host address should not be null");
+
+        String errMsg = null;
+        String scaleIOVolumePath = null;
+        try {
+            boolean deleteResult = false;
+            if (dataObject.getType() == DataObjectType.VOLUME) {
+                LOGGER.debug("deleteAsync - deleting volume");
+                scaleIOVolumePath = ((VolumeInfo) dataObject).getPath();
+            } else if (dataObject.getType() == DataObjectType.SNAPSHOT) {
+                LOGGER.debug("deleteAsync - deleting snapshot");
+                scaleIOVolumePath = ((SnapshotInfo) dataObject).getPath();
+            } else if (dataObject.getType() == DataObjectType.TEMPLATE) {
+                LOGGER.debug("deleteAsync - deleting template");
+                scaleIOVolumePath = ((TemplateInfo) dataObject).getInstallPath();
+            } else {
+                errMsg = "Invalid DataObjectType (" + dataObject.getType() + ") passed to deleteAsync";
+                LOGGER.error(errMsg);
+                throw new CloudRuntimeException(errMsg);
+            }
+
+            try {
+                String scaleIOVolumeId = ScaleIOUtil.getVolumePath(scaleIOVolumePath);
+                final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+                deleteResult =  client.deleteVolume(scaleIOVolumeId);
+                if (!deleteResult) {
+                    errMsg = "Failed to delete PowerFlex volume with id: " + scaleIOVolumeId;
+                }
+
+                long usedBytes = storagePool.getUsedBytes();
+                usedBytes -= dataObject.getSize();
+                storagePool.setUsedBytes(usedBytes < 0 ? 0 : usedBytes);
+                storagePoolDao.update(storagePoolId, storagePool);
+            } catch (Exception e) {
+                errMsg = "Unable to delete PowerFlex volume: " + scaleIOVolumePath + " due to " + e.getMessage();
+                LOGGER.warn(errMsg);
+                throw new CloudRuntimeException(errMsg, e);
+            }
+        } catch (Exception ex) {
+            errMsg = ex.getMessage();
+            LOGGER.error(errMsg);
+            if (callback == null) {
+                throw ex;
+            }
+        }
+
+        if (callback != null) {
+            CommandResult result = new CommandResult();
+            result.setResult(errMsg);
+            callback.complete(result);
+        }
+    }
+
+    @Override
+    public void copyAsync(DataObject srcData, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
+        copyAsync(srcData, destData, null, callback);
+    }
+
+    @Override
+    public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+        Answer answer = null;
+        String errMsg = null;
+
+        try {
+            DataStore srcStore = srcData.getDataStore();
+            DataStore destStore = destData.getDataStore();
+            if (srcStore.getRole() == DataStoreRole.Primary && (destStore.getRole() == DataStoreRole.Primary && destData.getType() == DataObjectType.VOLUME)) {
+                if (srcData.getType() == DataObjectType.TEMPLATE) {
+                    answer = copyTemplateToVolume(srcData, destData, destHost);
+                    if (answer == null) {
+                        errMsg = "No answer for copying template to PowerFlex volume";
+                    } else if (!answer.getResult()) {
+                        errMsg = answer.getDetails();
+                    }
+                } else if (srcData.getType() == DataObjectType.VOLUME) {
+                    if (isSameScaleIOStorageInstance(srcStore, destStore)) {
+                        answer = migrateVolume(srcData, destData);
+                    } else {
+                        answer = copyVolume(srcData, destData, destHost);
+                    }
+
+                    if (answer == null) {
+                        errMsg = "No answer for migrate PowerFlex volume";
+                    } else if (!answer.getResult()) {
+                        errMsg = answer.getDetails();
+                    }
+                } else {
+                    errMsg = "Unsupported copy operation from src object: (" + srcData.getType() + ", " + srcData.getDataStore() + "), dest object: ("
+                            + destData.getType() + ", " + destData.getDataStore() + ")";
+                    LOGGER.warn(errMsg);
+                }
+            } else {
+                errMsg = "Unsupported copy operation";
+            }
+        } catch (Exception e) {
+            LOGGER.debug("Failed to copy due to " + e.getMessage(), e);
+            errMsg = e.toString();
+        }
+
+        CopyCommandResult result = new CopyCommandResult(null, answer);
+        result.setResult(errMsg);
+        callback.complete(result);
+    }
+
+    private Answer copyTemplateToVolume(DataObject srcData, DataObject destData, Host destHost) {
+        // Copy PowerFlex/ScaleIO template to volume
+        LOGGER.debug("Initiating copy from PowerFlex template volume on host " + destHost != null ? destHost.getId() : "");
+        int primaryStorageDownloadWait = StorageManager.PRIMARY_STORAGE_DOWNLOAD_WAIT.value();
+        CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value());
+
+        Answer answer = null;
+        EndPoint ep = destHost != null ? RemoteHostEndPoint.getHypervisorHostEndPoint(destHost) : selector.select(srcData.getDataStore());
+        if (ep == null) {
+            String errorMsg = "No remote endpoint to send command, check if host or ssvm is down?";
+            LOGGER.error(errorMsg);
+            answer = new Answer(cmd, false, errorMsg);
+        } else {
+            answer = ep.sendMessage(cmd);
+        }
+
+        return answer;
+    }
+
+    private Answer copyVolume(DataObject srcData, DataObject destData, Host destHost) {
+        // Copy PowerFlex/ScaleIO volume
+        LOGGER.debug("Initiating copy from PowerFlex volume on host " + destHost != null ? destHost.getId() : "");
+        String value = configDao.getValue(Config.CopyVolumeWait.key());
+        int copyVolumeWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
+
+        CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), copyVolumeWait, VirtualMachineManager.ExecuteInSequence.value());
+
+        Answer answer = null;
+        EndPoint ep = destHost != null ? RemoteHostEndPoint.getHypervisorHostEndPoint(destHost) : selector.select(srcData.getDataStore());
+        if (ep == null) {
+            String errorMsg = "No remote endpoint to send command, check if host or ssvm is down?";
+            LOGGER.error(errorMsg);
+            answer = new Answer(cmd, false, errorMsg);
+        } else {
+            answer = ep.sendMessage(cmd);
+        }
+
+        return answer;
+    }
+
+    private Answer migrateVolume(DataObject srcData, DataObject destData) {
+        // Volume migration within same PowerFlex/ScaleIO cluster (with same System ID)
+        DataStore srcStore = srcData.getDataStore();
+        DataStore destStore = destData.getDataStore();
+        Answer answer = null;
+        try {
+            long srcPoolId = srcStore.getId();
+            long destPoolId = destStore.getId();
+
+            final ScaleIOGatewayClient client = getScaleIOClient(srcPoolId);
+            final String srcVolumePath = ((VolumeInfo) srcData).getPath();
+            final String srcVolumeId = ScaleIOUtil.getVolumePath(srcVolumePath);
+            final StoragePoolVO destStoragePool = storagePoolDao.findById(destPoolId);
+            final String destStoragePoolId = destStoragePool.getPath();
+            int migrationTimeout = StorageManager.KvmStorageOfflineMigrationWait.value();
+            boolean migrateStatus = client.migrateVolume(srcVolumeId, destStoragePoolId, migrationTimeout);
+            if (migrateStatus) {
+                String newVolumeName = String.format("%s-%s-%s-%s", ScaleIOUtil.VOLUME_PREFIX, destData.getId(),
+                        destStoragePool.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
+                boolean renamed = client.renameVolume(srcVolumeId, newVolumeName);
+
+                if (srcData.getId() != destData.getId()) {
+                    VolumeVO destVolume = volumeDao.findById(destData.getId());
+                    // Volume Id in the PowerFlex/ScaleIO pool remains the same after the migration
+                    // Update PowerFlex volume name only after it is renamed, to maintain the consistency
+                    if (renamed) {
+                        String newVolumePath = ScaleIOUtil.updatedPathWithVolumeName(srcVolumeId, newVolumeName);
+                        destVolume.set_iScsiName(newVolumePath);
+                        destVolume.setPath(newVolumePath);
+                    } else {
+                        destVolume.set_iScsiName(srcVolumePath);
+                        destVolume.setPath(srcVolumePath);
+                    }
+                    volumeDao.update(destData.getId(), destVolume);
+
+                    VolumeVO srcVolume = volumeDao.findById(srcData.getId());
+                    srcVolume.set_iScsiName(null);
+                    srcVolume.setPath(null);
+                    srcVolume.setFolder(null);
+                    volumeDao.update(srcData.getId(), srcVolume);
+                } else {
+                    // Live migrate volume
+                    VolumeVO volume = volumeDao.findById(srcData.getId());
+                    Long oldPoolId = volume.getPoolId();
+                    volume.setPoolId(destPoolId);
+                    volume.setLastPoolId(oldPoolId);
+                    volumeDao.update(srcData.getId(), volume);
+                }
+
+                List<SnapshotVO> snapshots = snapshotDao.listByVolumeId(srcData.getId());
+                if (CollectionUtils.isNotEmpty(snapshots)) {
+                    for (SnapshotVO snapshot : snapshots) {
+                        SnapshotDataStoreVO snapshotStore = snapshotDataStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Primary);
+                        if (snapshotStore == null) {
+                            continue;
+                        }
+
+                        String snapshotVolumeId = ScaleIOUtil.getVolumePath(snapshotStore.getInstallPath());
+                        String newSnapshotName = String.format("%s-%s-%s-%s", ScaleIOUtil.SNAPSHOT_PREFIX, snapshot.getId(),
+                                destStoragePool.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
+                        renamed = client.renameVolume(snapshotVolumeId, newSnapshotName);
+
+                        snapshotStore.setDataStoreId(destPoolId);
+                        // Snapshot Id in the PowerFlex/ScaleIO pool remains the same after the migration
+                        // Update PowerFlex snapshot name only after it is renamed, to maintain the consistency
+                        if (renamed) {
+                            snapshotStore.setInstallPath(ScaleIOUtil.updatedPathWithVolumeName(snapshotVolumeId, newSnapshotName));
+                        }
+                        snapshotDataStoreDao.update(snapshotStore.getId(), snapshotStore);
+                    }
+                }
+
+                answer = new Answer(null, true, null);
+            } else {
+                String errorMsg = "Failed to migrate PowerFlex volume: " + srcData.getId() + " to storage pool " + destPoolId;
+                LOGGER.debug(errorMsg);
+                answer = new Answer(null, false, errorMsg);
+            }
+        } catch (Exception e) {
+            LOGGER.error("Failed to migrate PowerFlex volume: " + srcData.getId() + " due to: " + e.getMessage());
+            answer = new Answer(null, false, e.getMessage());
+        }
+
+        return answer;
+    }
+
+    private boolean isSameScaleIOStorageInstance(DataStore srcStore, DataStore destStore) {
+        long srcPoolId = srcStore.getId();
+        String srcPoolSystemId = null;
+        StoragePoolDetailVO srcPoolSystemIdDetail = storagePoolDetailsDao.findDetail(srcPoolId, ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID);
+        if (srcPoolSystemIdDetail != null) {
+            srcPoolSystemId = srcPoolSystemIdDetail.getValue();
+        }
+
+        long destPoolId = destStore.getId();
+        String destPoolSystemId = null;
+        StoragePoolDetailVO destPoolSystemIdDetail = storagePoolDetailsDao.findDetail(destPoolId, ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID);
+        if (destPoolSystemIdDetail != null) {
+            destPoolSystemId = destPoolSystemIdDetail.getValue();
+        }
+
+        if (Strings.isNullOrEmpty(srcPoolSystemId) || Strings.isNullOrEmpty(destPoolSystemId)) {
+            throw new CloudRuntimeException("Failed to validate PowerFlex pools compatibility for migration as storage instance details are not available");
+        }
+
+        if (srcPoolSystemId.equals(destPoolSystemId)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean canCopy(DataObject srcData, DataObject destData) {
+        DataStore srcStore = destData.getDataStore();
+        DataStore destStore = destData.getDataStore();
+        if ((srcStore.getRole() == DataStoreRole.Primary && (srcData.getType() == DataObjectType.TEMPLATE || srcData.getType() == DataObjectType.VOLUME))
+                && (destStore.getRole() == DataStoreRole.Primary && destData.getType() == DataObjectType.VOLUME)) {
+            StoragePoolVO srcPoolVO = storagePoolDao.findById(srcStore.getId());
+            StoragePoolVO destPoolVO = storagePoolDao.findById(destStore.getId());
+            if (srcPoolVO != null && srcPoolVO.getPoolType() == Storage.StoragePoolType.PowerFlex
+                    && destPoolVO != null && destPoolVO.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void resizeVolume(VolumeInfo volumeInfo) {
+        LOGGER.debug("Resizing PowerFlex volume");
+
+        Preconditions.checkArgument(volumeInfo != null, "volumeInfo cannot be null");
+
+        try {
+            String scaleIOVolumeId = ScaleIOUtil.getVolumePath(volumeInfo.getPath());
+            Long storagePoolId = volumeInfo.getPoolId();
+
+            ResizeVolumePayload payload = (ResizeVolumePayload)volumeInfo.getpayload();
+            long newSizeInBytes = payload.newSize != null ? payload.newSize : volumeInfo.getSize();
+            // Only increase size is allowed and size should be specified in granularity of 8 GB
+            if (newSizeInBytes <= volumeInfo.getSize()) {
+                throw new CloudRuntimeException("Only increase size is allowed for volume: " + volumeInfo.getName());
+            }
+
+            org.apache.cloudstack.storage.datastore.api.Volume scaleIOVolume = null;
+            long newSizeInGB = newSizeInBytes / (1024 * 1024 * 1024);
+            long newSizeIn8gbBoundary = (long) (Math.ceil(newSizeInGB / 8.0) * 8.0);
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePoolId);
+            scaleIOVolume = client.resizeVolume(scaleIOVolumeId, (int) newSizeIn8gbBoundary);
+            if (scaleIOVolume == null) {
+                throw new CloudRuntimeException("Failed to resize volume: " + volumeInfo.getName());
+            }
+
+            VolumeVO volume = volumeDao.findById(volumeInfo.getId());
+            long oldVolumeSize = volume.getSize();
+            volume.setSize(scaleIOVolume.getSizeInKb() * 1024);
+            volumeDao.update(volume.getId(), volume);
+
+            StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId);
+            long capacityBytes = storagePool.getCapacityBytes();
+            long usedBytes = storagePool.getUsedBytes();
+
+            long newVolumeSize = volume.getSize();
+            usedBytes += newVolumeSize - oldVolumeSize;
+            storagePool.setUsedBytes(usedBytes > capacityBytes ? capacityBytes : usedBytes);
+            storagePoolDao.update(storagePoolId, storagePool);
+        } catch (Exception e) {
+            String errMsg = "Unable to resize PowerFlex volume: " + volumeInfo.getId() + " due to " + e.getMessage();
+            LOGGER.warn(errMsg);
+            throw new CloudRuntimeException(errMsg, e);
+        }
+    }
+
+    @Override
+    public void resize(DataObject dataObject, AsyncCompletionCallback<CreateCmdResult> callback) {
+        String scaleIOVolumePath = null;
+        String errMsg = null;
+        try {
+            if (dataObject.getType() == DataObjectType.VOLUME) {
+                scaleIOVolumePath = ((VolumeInfo) dataObject).getPath();
+                resizeVolume((VolumeInfo) dataObject);
+            } else {
+                errMsg = "Invalid DataObjectType (" + dataObject.getType() + ") passed to resize";
+            }
+        } catch (Exception ex) {
+            errMsg = ex.getMessage();
+            LOGGER.error(errMsg);
+            if (callback == null) {
+                throw ex;
+            }
+        }
+
+        if (callback != null) {
+            CreateCmdResult result = new CreateCmdResult(scaleIOVolumePath, new Answer(null, errMsg == null, errMsg));
+            result.setResult(errMsg);
+            callback.complete(result);
+        }
+    }
+
+    @Override
+    public void handleQualityOfServiceForVolumeMigration(VolumeInfo volumeInfo, QualityOfServiceState qualityOfServiceState) {
+    }
+
+    @Override
+    public boolean canProvideStorageStats() {
+        return true;
+    }
+
+    @Override
+    public Pair<Long, Long> getStorageStats(StoragePool storagePool) {
+        Preconditions.checkArgument(storagePool != null, "storagePool cannot be null");
+
+        try {
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePool.getId());
+            StoragePoolStatistics poolStatistics = client.getStoragePoolStatistics(storagePool.getPath());
+            if (poolStatistics != null && poolStatistics.getNetMaxCapacityInBytes() != null && poolStatistics.getNetUsedCapacityInBytes() != null) {
+                Long capacityBytes = poolStatistics.getNetMaxCapacityInBytes();
+                Long usedBytes = poolStatistics.getNetUsedCapacityInBytes();
+                return new Pair<Long, Long>(capacityBytes, usedBytes);
+            }
+        }  catch (Exception e) {
+            String errMsg = "Unable to get storage stats for the pool: " + storagePool.getId() + " due to " + e.getMessage();
+            LOGGER.warn(errMsg);
+            throw new CloudRuntimeException(errMsg, e);
+        }
+
+        return null;
+    }
+
+    @Override
+    public boolean canProvideVolumeStats() {
+        return true;
+    }
+
+    @Override
+    public Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumePath) {
+        Preconditions.checkArgument(storagePool != null, "storagePool cannot be null");
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(volumePath), "volumePath cannot be null");
+
+        try {
+            final ScaleIOGatewayClient client = getScaleIOClient(storagePool.getId());
+            VolumeStatistics volumeStatistics = client.getVolumeStatistics(ScaleIOUtil.getVolumePath(volumePath));
+            if (volumeStatistics != null) {
+                Long provisionedSizeInBytes = volumeStatistics.getNetProvisionedAddressesInBytes();
+                Long allocatedSizeInBytes = volumeStatistics.getAllocatedSizeInBytes();
+                return new Pair<Long, Long>(provisionedSizeInBytes, allocatedSizeInBytes);
+            }
+        }  catch (Exception e) {
+            String errMsg = "Unable to get stats for the volume: " + volumePath + " in the pool: " + storagePool.getId() + " due to " + e.getMessage();
+            LOGGER.warn(errMsg);
+            throw new CloudRuntimeException(errMsg, e);
+        }
+
+        return null;
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        if (host == null || pool == null) {
+            return false;
+        }
+
+        try {
+            final ScaleIOGatewayClient client = getScaleIOClient(pool.getId());
+            return client.isSdcConnected(host.getPrivateIpAddress());
+        } catch (Exception e) {
+            LOGGER.warn("Unable to check the host: " + host.getId() + " access to storage pool: " + pool.getId() + " due to " + e.getMessage(), e);
+            return false;
+        }
+    }
+
+    private void alertHostSdcDisconnection(Host host) {
+        if (host == null) {
+            return;
+        }
+
+        LOGGER.warn("SDC not connected on the host: " + host.getId());
+        String msg = "SDC not connected on the host: " + host.getId() + ", reconnect the SDC to MDM";
+        alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "SDC disconnected on host: " + host.getUuid(), msg);
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
new file mode 100644
index 0000000..5c9ddea
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
@@ -0,0 +1,452 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.storage.datastore.lifecycle;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientConnectionPool;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.storage.datastore.api.StoragePoolStatistics;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.DeleteStoragePoolCommand;
+import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.capacity.CapacityManager;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.resource.ResourceManager;
+import com.cloud.storage.Storage;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolAutomation;
+import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.template.TemplateManager;
+import com.cloud.utils.UriUtils;
+import com.cloud.utils.crypt.DBEncryptionUtil;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class ScaleIOPrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeCycle {
+    private static final Logger LOGGER = Logger.getLogger(ScaleIOPrimaryDataStoreLifeCycle.class);
+
+    @Inject
+    private ClusterDao clusterDao;
+    @Inject
+    private PrimaryDataStoreDao primaryDataStoreDao;
+    @Inject
+    private StoragePoolDetailsDao storagePoolDetailsDao;
+    @Inject
+    private StoragePoolHostDao storagePoolHostDao;
+    @Inject
+    private PrimaryDataStoreHelper dataStoreHelper;
+    @Inject
+    private ResourceManager resourceManager;
+    @Inject
+    private StorageManager storageMgr;
+    @Inject
+    private StoragePoolAutomation storagePoolAutomation;
+    @Inject
+    private CapacityManager capacityMgr;
+    @Inject
+    private TemplateManager templateMgr;
+    @Inject
+    private AgentManager agentMgr;
+
+    public ScaleIOPrimaryDataStoreLifeCycle() {
+    }
+
+    private org.apache.cloudstack.storage.datastore.api.StoragePool findStoragePool(String url, String username, String password, String storagePoolName) {
+        try {
+            final int clientTimeout = StorageManager.STORAGE_POOL_CLIENT_TIMEOUT.value();
+            ScaleIOGatewayClient client = ScaleIOGatewayClient.getClient(url, username, password, false, clientTimeout);
+            List<org.apache.cloudstack.storage.datastore.api.StoragePool> storagePools = client.listStoragePools();
+            for (org.apache.cloudstack.storage.datastore.api.StoragePool pool : storagePools) {
+                if (pool.getName().equals(storagePoolName)) {
+                    LOGGER.info("Found PowerFlex storage pool: " + storagePoolName);
+                    final org.apache.cloudstack.storage.datastore.api.StoragePoolStatistics poolStatistics = client.getStoragePoolStatistics(pool.getId());
+                    pool.setStatistics(poolStatistics);
+
+                    String systemId = client.getSystemId(pool.getProtectionDomainId());
+                    pool.setSystemId(systemId);
+                    return pool;
+                }
+            }
+        } catch (NoSuchAlgorithmException | KeyManagementException | URISyntaxException e) {
+            LOGGER.error("Failed to add storage pool", e);
+            throw new CloudRuntimeException("Failed to establish connection with PowerFlex Gateway to validate storage pool");
+        }
+        throw new CloudRuntimeException("Failed to find the provided storage pool name in discovered PowerFlex storage pools");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public DataStore initialize(Map<String, Object> dsInfos) {
+        String url = (String) dsInfos.get("url");
+        Long zoneId = (Long) dsInfos.get("zoneId");
+        Long podId = (Long)dsInfos.get("podId");
+        Long clusterId = (Long)dsInfos.get("clusterId");
+        String dataStoreName = (String) dsInfos.get("name");
+        String providerName = (String) dsInfos.get("providerName");
+        Long capacityBytes = (Long)dsInfos.get("capacityBytes");
+        Long capacityIops = (Long)dsInfos.get("capacityIops");
+        String tags = (String)dsInfos.get("tags");
+        Map<String, String> details = (Map<String, String>) dsInfos.get("details");
+
+        if (zoneId == null) {
+            throw new CloudRuntimeException("Zone Id must be specified.");
+        }
+
+        PrimaryDataStoreParameters parameters = new PrimaryDataStoreParameters();
+        if (clusterId != null) {
+            // Primary datastore is cluster-wide, check and set the podId and clusterId parameters
+            if (podId == null) {
+                throw new CloudRuntimeException("Pod Id must also be specified when the Cluster Id is specified for Cluster-wide primary storage.");
+            }
+
+            Hypervisor.HypervisorType hypervisorType = getHypervisorTypeForCluster(clusterId);
+            if (!isSupportedHypervisorType(hypervisorType)) {
+                throw new CloudRuntimeException("Unsupported hypervisor type: " + hypervisorType.toString());
+            }
+
+            parameters.setPodId(podId);
+            parameters.setClusterId(clusterId);
+        } else if (podId != null) {
+            throw new CloudRuntimeException("Cluster Id must also be specified when the Pod Id is specified for Cluster-wide primary storage.");
+        }
+
+        URI uri = null;
+        try {
+            uri = new URI(UriUtils.encodeURIComponent(url));
+            if (uri.getScheme() == null || !uri.getScheme().equalsIgnoreCase("powerflex")) {
+                throw new InvalidParameterValueException("scheme is invalid for url: " + url + ", should be powerflex://username:password@gatewayhost/pool");
+            }
+        } catch (Exception ignored) {
+            throw new InvalidParameterValueException(url + " is not a valid uri");
+        }
+
+        String storagePoolName = null;
+        try {
+            storagePoolName = URLDecoder.decode(uri.getPath(), "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            LOGGER.error("[ignored] we are on a platform not supporting \"UTF-8\"!?!", e);
+        }
+        if (storagePoolName == null) { // if decoding fails, use getPath() anyway
+            storagePoolName = uri.getPath();
+        }
+        storagePoolName = storagePoolName.replaceFirst("/", "");
+
+        final String storageHost = uri.getHost();
+        final int port = uri.getPort();
+        String gatewayApiURL = null;
+        if (port == -1) {
+            gatewayApiURL = String.format("https://%s/api", storageHost);
+        } else {
+            gatewayApiURL = String.format("https://%s:%d/api", storageHost, port);
+        }
+
+        final String userInfo = uri.getUserInfo();
+        final String gatewayUsername = userInfo.split(":")[0];
+        final String gatewayPassword = userInfo.split(":")[1];
+
+        List<StoragePoolVO> storagePoolVO = primaryDataStoreDao.findPoolsByProvider(ScaleIOUtil.PROVIDER_NAME);
+        if (CollectionUtils.isNotEmpty(storagePoolVO)) {
+            for (StoragePoolVO poolVO : storagePoolVO) {
+                Map <String, String> poolDetails = primaryDataStoreDao.getDetails(poolVO.getId());
+                String poolUrl = poolDetails.get(ScaleIOGatewayClient.GATEWAY_API_ENDPOINT);
+                String poolName = poolDetails.get(ScaleIOGatewayClient.STORAGE_POOL_NAME);
+
+                if (gatewayApiURL.equals(poolUrl) && storagePoolName.equals(poolName)) {
+                    throw new IllegalArgumentException("PowerFlex storage pool: " + storagePoolName + " already exists, please specify other storage pool.");
+                }
+            }
+        }
+
+        final org.apache.cloudstack.storage.datastore.api.StoragePool scaleIOPool = this.findStoragePool(gatewayApiURL,
+                gatewayUsername, gatewayPassword, storagePoolName);
+
+        parameters.setZoneId(zoneId);
+        parameters.setName(dataStoreName);
+        parameters.setProviderName(providerName);
+        parameters.setManaged(true);
+        parameters.setHost(storageHost);
+        parameters.setPath(scaleIOPool.getId());
+        parameters.setUserInfo(userInfo);
+        parameters.setType(Storage.StoragePoolType.PowerFlex);
+        parameters.setHypervisorType(Hypervisor.HypervisorType.KVM);
+        parameters.setUuid(UUID.randomUUID().toString());
+        parameters.setTags(tags);
+
+        StoragePoolStatistics poolStatistics = scaleIOPool.getStatistics();
+        if (poolStatistics != null) {
+            if (capacityBytes == null) {
+                parameters.setCapacityBytes(poolStatistics.getNetMaxCapacityInBytes());
+            }
+            parameters.setUsedBytes(poolStatistics.getNetUsedCapacityInBytes());
+        }
+
+        if (capacityBytes != null) {
+            parameters.setCapacityBytes(capacityBytes);
+        }
+
+        if (capacityIops != null) {
+            parameters.setCapacityIops(capacityIops);
+        }
+
+        details.put(ScaleIOGatewayClient.GATEWAY_API_ENDPOINT, gatewayApiURL);
+        details.put(ScaleIOGatewayClient.GATEWAY_API_USERNAME, DBEncryptionUtil.encrypt(gatewayUsername));
+        details.put(ScaleIOGatewayClient.GATEWAY_API_PASSWORD, DBEncryptionUtil.encrypt(gatewayPassword));
+        details.put(ScaleIOGatewayClient.STORAGE_POOL_NAME, storagePoolName);
+        details.put(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID, scaleIOPool.getSystemId());
+        parameters.setDetails(details);
+
+        return dataStoreHelper.createPrimaryDataStore(parameters);
+    }
+
+    @Override
+    public boolean attachCluster(DataStore dataStore, ClusterScope scope) {
+        final ClusterVO cluster = clusterDao.findById(scope.getScopeId());
+        if (!isSupportedHypervisorType(cluster.getHypervisorType())) {
+            throw new CloudRuntimeException("Unsupported hypervisor type: " + cluster.getHypervisorType().toString());
+        }
+
+        List<String> connectedSdcIps = null;
+        try {
+            ScaleIOGatewayClient client = ScaleIOGatewayClientConnectionPool.getInstance().getClient(dataStore.getId(), storagePoolDetailsDao);
+            connectedSdcIps = client.listConnectedSdcIps();
+        } catch (NoSuchAlgorithmException | KeyManagementException | URISyntaxException e) {
+            LOGGER.error("Failed to create storage pool", e);
+            throw new CloudRuntimeException("Failed to establish connection with PowerFlex Gateway to create storage pool");
+        }
+
+        if (connectedSdcIps == null || connectedSdcIps.isEmpty()) {
+            LOGGER.debug("No connected SDCs found for the PowerFlex storage pool");
+            throw new CloudRuntimeException("Failed to create storage pool as connected SDCs not found");
+        }
+
+        PrimaryDataStoreInfo primaryDataStoreInfo = (PrimaryDataStoreInfo) dataStore;
+
+        List<HostVO> hostsInCluster = resourceManager.listAllUpAndEnabledHosts(Host.Type.Routing, primaryDataStoreInfo.getClusterId(),
+                primaryDataStoreInfo.getPodId(), primaryDataStoreInfo.getDataCenterId());
+        if (hostsInCluster.isEmpty()) {
+            primaryDataStoreDao.expunge(primaryDataStoreInfo.getId());
+            throw new CloudRuntimeException("No hosts are Up to associate a storage pool with in cluster: " + primaryDataStoreInfo.getClusterId());
+        }
+
+        LOGGER.debug("Attaching the pool to each of the hosts in the cluster: " + primaryDataStoreInfo.getClusterId());
+        List<HostVO> poolHosts = new ArrayList<HostVO>();
+        for (HostVO host : hostsInCluster) {
+            try {
+                if (connectedSdcIps.contains(host.getPrivateIpAddress())) {
+                    storageMgr.connectHostToSharedPool(host.getId(), primaryDataStoreInfo.getId());
+                    poolHosts.add(host);
+                }
+            } catch (Exception e) {
+                LOGGER.warn("Unable to establish a connection between " + host + " and " + primaryDataStoreInfo, e);
+            }
+        }
+
+        if (poolHosts.isEmpty()) {
+            LOGGER.warn("No host can access storage pool '" + primaryDataStoreInfo + "' on cluster '" + primaryDataStoreInfo.getClusterId() + "'.");
+            primaryDataStoreDao.expunge(primaryDataStoreInfo.getId());
+            throw new CloudRuntimeException("Failed to create storage pool in the cluster: " + primaryDataStoreInfo.getClusterId() + " as it is not accessible to hosts");
+        }
+
+        dataStoreHelper.attachCluster(dataStore);
+        return true;
+    }
+
+    @Override
+    public boolean attachHost(DataStore store, HostScope scope, StoragePoolInfo existingInfo) {
+        return true;
+    }
+
+    @Override
+    public boolean attachZone(DataStore dataStore, ZoneScope scope, Hypervisor.HypervisorType hypervisorType) {
+        if (!isSupportedHypervisorType(hypervisorType)) {
+            throw new CloudRuntimeException("Unsupported hypervisor type: " + hypervisorType.toString());
+        }
+
+        List<String> connectedSdcIps = null;
+        try {
+            ScaleIOGatewayClient client = ScaleIOGatewayClientConnectionPool.getInstance().getClient(dataStore.getId(), storagePoolDetailsDao);
+            connectedSdcIps = client.listConnectedSdcIps();
+        } catch (NoSuchAlgorithmException | KeyManagementException | URISyntaxException e) {
+            LOGGER.error("Failed to create storage pool", e);
+            throw new CloudRuntimeException("Failed to establish connection with PowerFlex Gateway to create storage pool");
+        }
+
+        if (connectedSdcIps == null || connectedSdcIps.isEmpty()) {
+            LOGGER.debug("No connected SDCs found for the PowerFlex storage pool");
+            throw new CloudRuntimeException("Failed to create storage pool as connected SDCs not found");
+        }
+
+        LOGGER.debug("Attaching the pool to each of the hosts in the zone: " + scope.getScopeId());
+        List<HostVO> hosts = resourceManager.listAllUpAndEnabledHostsInOneZoneByHypervisor(hypervisorType, scope.getScopeId());
+        List<HostVO> poolHosts = new ArrayList<HostVO>();
+        for (HostVO host : hosts) {
+            try {
+                if (connectedSdcIps.contains(host.getPrivateIpAddress())) {
+                    storageMgr.connectHostToSharedPool(host.getId(), dataStore.getId());
+                    poolHosts.add(host);
+                }
+            } catch (Exception e) {
+                LOGGER.warn("Unable to establish a connection between " + host + " and " + dataStore, e);
+            }
+        }
+        if (poolHosts.isEmpty()) {
+            LOGGER.warn("No host can access storage pool " + dataStore + " in this zone.");
+            primaryDataStoreDao.expunge(dataStore.getId());
+            throw new CloudRuntimeException("Failed to create storage pool as it is not accessible to hosts.");
+        }
+
+        dataStoreHelper.attachZone(dataStore);
+        return true;
+    }
+
+    @Override
+    public boolean maintain(DataStore store) {
+        storagePoolAutomation.maintain(store);
+        dataStoreHelper.maintain(store);
+        return true;
+    }
+
+    @Override
+    public boolean cancelMaintain(DataStore store) {
+        dataStoreHelper.cancelMaintain(store);
+        storagePoolAutomation.cancelMaintain(store);
+        return true;
+    }
+
+    @Override
+    public void enableStoragePool(DataStore dataStore) {
+        dataStoreHelper.enable(dataStore);
+    }
+
+    @Override
+    public void disableStoragePool(DataStore dataStore) {
+        dataStoreHelper.disable(dataStore);
+    }
+
+    @Override
+    public boolean deleteDataStore(DataStore dataStore) {
+        StoragePool storagePool = (StoragePool)dataStore;
+        StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(storagePool.getId());
+        if (storagePoolVO == null) {
+            return false;
+        }
+
+        List<VMTemplateStoragePoolVO> unusedTemplatesInPool = templateMgr.getUnusedTemplatesInPool(storagePoolVO);
+        for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
+            if (templatePoolVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
+                templateMgr.evictTemplateFromStoragePool(templatePoolVO);
+            }
+        }
+
+        List<StoragePoolHostVO> poolHostVOs = storagePoolHostDao.listByPoolId(dataStore.getId());
+        for (StoragePoolHostVO poolHostVO : poolHostVOs) {
+            DeleteStoragePoolCommand deleteStoragePoolCommand = new DeleteStoragePoolCommand(storagePool);
+            final Answer answer = agentMgr.easySend(poolHostVO.getHostId(), deleteStoragePoolCommand);
+            if (answer != null && answer.getResult()) {
+                LOGGER.info("Successfully deleted storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
+            } else {
+                if (answer != null) {
+                    LOGGER.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId() + " , result: " + answer.getResult());
+                } else {
+                    LOGGER.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
+                }
+            }
+        }
+
+        ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
+
+        return dataStoreHelper.deletePrimaryDataStore(dataStore);
+    }
+
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
+    @Override
+    public void updateStoragePool(StoragePool storagePool, Map<String, String> details) {
+        String capacityBytes = details.get(PrimaryDataStoreLifeCycle.CAPACITY_BYTES);
+        StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(storagePool.getId());
+
+        try {
+            if (capacityBytes == null || capacityBytes.isBlank()) {
+                return;
+            }
+
+            long usedBytes = capacityMgr.getUsedBytes(storagePoolVO);
+            if (Long.parseLong(capacityBytes) < usedBytes) {
+                throw new CloudRuntimeException("Cannot reduce the number of bytes for this storage pool as it would lead to an insufficient number of bytes");
+            }
+
+            primaryDataStoreDao.updateCapacityBytes(storagePool.getId(), Long.parseLong(capacityBytes));
+            LOGGER.info("Storage pool successfully updated");
+        } catch (Throwable e) {
+            throw new CloudRuntimeException("Failed to update the storage pool" + e);
+        }
+    }
+
+    private Hypervisor.HypervisorType getHypervisorTypeForCluster(long clusterId) {
+        ClusterVO cluster = clusterDao.findById(clusterId);
+        if (cluster == null) {
+            throw new CloudRuntimeException("Unable to locate the specified cluster: " + clusterId);
+        }
+
+        return cluster.getHypervisorType();
+    }
+
+    private static boolean isSupportedHypervisorType(Hypervisor.HypervisorType hypervisorType) {
+        return Hypervisor.HypervisorType.KVM.equals(hypervisorType);
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOHostListener.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOHostListener.java
new file mode 100644
index 0000000..f672231
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOHostListener.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.storage.datastore.provider;
+
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientConnectionPool;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ModifyStoragePoolAnswer;
+import com.cloud.agent.api.ModifyStoragePoolCommand;
+import com.cloud.alert.AlertManager;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class ScaleIOHostListener implements HypervisorHostListener {
+    private static final Logger s_logger = Logger.getLogger(ScaleIOHostListener.class);
+
+    @Inject private AgentManager _agentMgr;
+    @Inject private AlertManager _alertMgr;
+    @Inject private DataStoreManager _dataStoreMgr;
+    @Inject private HostDao _hostDao;
+    @Inject private StoragePoolHostDao _storagePoolHostDao;
+    @Inject private PrimaryDataStoreDao _primaryDataStoreDao;
+    @Inject private StoragePoolDetailsDao _storagePoolDetailsDao;
+
+    @Override
+    public boolean hostAdded(long hostId) {
+        return true;
+    }
+
+    @Override
+    public boolean hostConnect(long hostId, long poolId) {
+        HostVO host = _hostDao.findById(hostId);
+        if (host == null) {
+            s_logger.error("Failed to add host by HostListener as host was not found with id : " + hostId);
+            return false;
+        }
+
+        if (!isHostSdcConnected(host.getPrivateIpAddress(), poolId)) {
+            s_logger.warn("SDC not connected on the host: " + hostId);
+            String msg = "SDC not connected on the host: " + hostId + ", reconnect the SDC to MDM and restart agent";
+            _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "SDC disconnected on host: " + host.getUuid(), msg);
+            return false;
+        }
+
+        StoragePoolHostVO storagePoolHost = _storagePoolHostDao.findByPoolHost(poolId, hostId);
+        if (storagePoolHost == null) {
+            storagePoolHost = new StoragePoolHostVO(poolId, hostId, "");
+            _storagePoolHostDao.persist(storagePoolHost);
+        }
+
+        StoragePool storagePool = (StoragePool)_dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);
+        ModifyStoragePoolCommand cmd = new ModifyStoragePoolCommand(true, storagePool);
+        sendModifyStoragePoolCommand(cmd, storagePool, hostId);
+        return true;
+    }
+
+    private boolean isHostSdcConnected(String hostIpAddress, long poolId) {
+        try {
+            ScaleIOGatewayClient client = ScaleIOGatewayClientConnectionPool.getInstance().getClient(poolId, _storagePoolDetailsDao);
+            return client.isSdcConnected(hostIpAddress);
+        } catch (NoSuchAlgorithmException | KeyManagementException | URISyntaxException e) {
+            s_logger.error("Failed to check host sdc connection", e);
+            throw new CloudRuntimeException("Failed to establish connection with PowerFlex Gateway to check host sdc connection");
+        }
+    }
+
+    private void sendModifyStoragePoolCommand(ModifyStoragePoolCommand cmd, StoragePool storagePool, long hostId) {
+        Answer answer = _agentMgr.easySend(hostId, cmd);
+
+        if (answer == null) {
+            throw new CloudRuntimeException("Unable to get an answer to the modify storage pool command (" + storagePool.getId() + ")");
+        }
+
+        if (!answer.getResult()) {
+            String msg = "Unable to attach storage pool " + storagePool.getId() + " to host " + hostId;
+
+            _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, storagePool.getDataCenterId(), storagePool.getPodId(), msg, msg);
+
+            throw new CloudRuntimeException("Unable to establish a connection from agent to storage pool " + storagePool.getId() + " due to " + answer.getDetails() +
+                    " (" + storagePool.getId() + ")");
+        }
+
+        assert (answer instanceof ModifyStoragePoolAnswer) : "ModifyStoragePoolAnswer expected ; Pool = " + storagePool.getId() + " Host = " + hostId;
+
+        s_logger.info("Connection established between storage pool " + storagePool + " and host: " + hostId);
+    }
+
+    @Override
+    public boolean hostDisconnected(long hostId, long poolId) {
+        StoragePoolHostVO storagePoolHost = _storagePoolHostDao.findByPoolHost(poolId, hostId);
+        if (storagePoolHost != null) {
+            _storagePoolHostDao.deleteStoragePoolHostDetails(hostId, poolId);
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean hostAboutToBeRemoved(long hostId) {
+        return true;
+    }
+
+    @Override
+    public boolean hostRemoved(long hostId, long clusterId) {
+        return true;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOPrimaryDatastoreProvider.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOPrimaryDatastoreProvider.java
new file mode 100644
index 0000000..0cc82c0
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOPrimaryDatastoreProvider.java
@@ -0,0 +1,77 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.storage.datastore.provider;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
+import org.apache.cloudstack.storage.datastore.driver.ScaleIOPrimaryDataStoreDriver;
+import org.apache.cloudstack.storage.datastore.lifecycle.ScaleIOPrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
+import org.apache.log4j.Logger;
+
+import com.cloud.utils.component.ComponentContext;
+
+public class ScaleIOPrimaryDatastoreProvider implements PrimaryDataStoreProvider {
+    private static final Logger LOGGER = Logger.getLogger(ScaleIOPrimaryDatastoreProvider.class);
+
+    private DataStoreLifeCycle lifeCycle;
+    private PrimaryDataStoreDriver driver;
+    private HypervisorHostListener listener;
+
+    @Override
+    public DataStoreLifeCycle getDataStoreLifeCycle() {
+        return lifeCycle;
+    }
+
+    @Override
+    public DataStoreDriver getDataStoreDriver() {
+        return driver;
+    }
+
+    @Override
+    public HypervisorHostListener getHostListener() {
+        return listener;
+    }
+
+    @Override
+    public String getName() {
+        return ScaleIOUtil.PROVIDER_NAME;
+    }
+
+    @Override
+    public boolean configure(Map<String, Object> params) {
+        lifeCycle = ComponentContext.inject(ScaleIOPrimaryDataStoreLifeCycle.class);
+        driver = ComponentContext.inject(ScaleIOPrimaryDataStoreDriver.class);
+        listener = ComponentContext.inject(ScaleIOHostListener.class);
+
+        return true;
+    }
+
+    @Override
+    public Set<DataStoreProviderType> getTypes() {
+        Set<DataStoreProviderType> types = new HashSet<DataStoreProviderType>();
+        types.add(DataStoreProviderType.PRIMARY);
+        return types;
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/util/ScaleIOUtil.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/util/ScaleIOUtil.java
new file mode 100644
index 0000000..0180f17
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/util/ScaleIOUtil.java
@@ -0,0 +1,119 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.storage.datastore.util;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.utils.script.Script;
+import com.google.common.base.Strings;
+
+public class ScaleIOUtil {
+    private static final Logger LOGGER = Logger.getLogger(ScaleIOUtil.class);
+
+    public static final String PROVIDER_NAME = "PowerFlex";
+
+    // Use prefix for CloudStack resources
+    public static final String VOLUME_PREFIX = "vol";
+    public static final String TEMPLATE_PREFIX = "tmpl";
+    public static final String SNAPSHOT_PREFIX = "snap";
+    public static final String VMSNAPSHOT_PREFIX = "vmsnap";
+
+    public static final int IDENTIFIER_LENGTH = 16;
+    public static final Long MINIMUM_ALLOWED_IOPS_LIMIT = Long.valueOf(10);
+
+    public static final String DISK_PATH = "/dev/disk/by-id";
+    public static final String DISK_NAME_PREFIX = "emc-vol-";
+    public static final String DISK_NAME_PREFIX_FILTER = DISK_NAME_PREFIX + "*-";
+
+    private static final String AGENT_PROPERTIES_FILE = "/etc/cloudstack/agent/agent.properties";
+
+    private static final String DEFAULT_SDC_HOME_PATH = "/opt/emc/scaleio/sdc";
+    private static final String SDC_HOME_PARAMETER = "powerflex.sdc.home.dir";
+    private static final String SDC_HOME_PATH = getSdcHomePath();
+
+    private static final String RESCAN_CMD = "drv_cfg --rescan";
+    private static final String QUERY_VOLUMES_CMD = "drv_cfg --query_vols";
+    // Sample output for cmd: drv_cfg --query_vols:
+    // Retrieved 2 volume(s)
+    // VOL-ID 6c33633100000009 MDM-ID 218ce1797566a00f
+    // VOL-ID 6c3362a30000000a MDM-ID 218ce1797566a00f
+
+    public static String getSdcHomePath() {
+        String sdcHomePath = DEFAULT_SDC_HOME_PATH;
+        String sdcHomePropertyCmdFormat = "sed -n '/%s/p' '%s' 2>/dev/null  | sed 's/%s=//g' 2>/dev/null";
+        String sdcHomeCmd = String.format(sdcHomePropertyCmdFormat, SDC_HOME_PARAMETER, AGENT_PROPERTIES_FILE, SDC_HOME_PARAMETER);
+
+        String result = Script.runSimpleBashScript(sdcHomeCmd);
+        if (result == null) {
+            LOGGER.warn("Failed to get sdc home path from agent.properties, fallback to default path");
+        } else {
+            sdcHomePath = result;
+        }
+
+        return sdcHomePath;
+    }
+
+    public static final void rescanForNewVolumes() {
+        // Detecting new volumes
+        String rescanCmd = ScaleIOUtil.SDC_HOME_PATH + "/bin/" + ScaleIOUtil.RESCAN_CMD;
+
+        String result = Script.runSimpleBashScript(rescanCmd);
+        if (result == null) {
+            LOGGER.warn("Failed to rescan for new volumes");
+        }
+    }
+
+    public static final String getSystemIdForVolume(String volumeId) {
+        //query_vols outputs "VOL-ID <VolumeID> MDM-ID <SystemID>" for a volume with ID: <VolumeID>
+        String queryDiskCmd = SDC_HOME_PATH + "/bin/" + ScaleIOUtil.QUERY_VOLUMES_CMD;
+        queryDiskCmd += "|grep " + volumeId + "|awk '{print $4}'";
+
+        String result = Script.runSimpleBashScript(queryDiskCmd);
+        if (result == null) {
+            LOGGER.warn("Query volumes failed to get volume: " + volumeId + " details for system id");
+            return null;
+        }
+
+        if (result.isEmpty()) {
+            LOGGER.warn("Query volumes doesn't list volume: " + volumeId + ", probably volume is not mapped yet, or sdc not connected");
+            return null;
+        }
+
+        return result;
+    }
+
+    public static final String getVolumePath(String volumePathWithName) {
+        if (Strings.isNullOrEmpty(volumePathWithName)) {
+            return volumePathWithName;
+        }
+
+        if (volumePathWithName.contains(":")) {
+            return volumePathWithName.substring(0, volumePathWithName.indexOf(':'));
+        }
+
+        return volumePathWithName;
+    }
+
+    public static final String updatedPathWithVolumeName(String volumePath, String volumeName) {
+        if (Strings.isNullOrEmpty(volumePath) || Strings.isNullOrEmpty(volumeName)) {
+            return volumePath;
+        }
+
+        return String.format("%s:%s", volumePath, volumeName);
+    }
+}
diff --git a/plugins/storage/volume/scaleio/src/main/resources/META-INF/cloudstack/storage-volume-scaleio/module.properties b/plugins/storage/volume/scaleio/src/main/resources/META-INF/cloudstack/storage-volume-scaleio/module.properties
new file mode 100755
index 0000000..5bf9aa0
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/resources/META-INF/cloudstack/storage-volume-scaleio/module.properties
@@ -0,0 +1,21 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+name=storage-volume-scaleio
+parent=storage
diff --git a/plugins/storage/volume/scaleio/src/main/resources/META-INF/cloudstack/storage-volume-scaleio/spring-storage-volume-scaleio-context.xml b/plugins/storage/volume/scaleio/src/main/resources/META-INF/cloudstack/storage-volume-scaleio/spring-storage-volume-scaleio-context.xml
new file mode 100755
index 0000000..8b86e21
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/main/resources/META-INF/cloudstack/storage-volume-scaleio/spring-storage-volume-scaleio-context.xml
@@ -0,0 +1,35 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans.xsd
+                      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
+                      http://www.springframework.org/schema/context
+                      http://www.springframework.org/schema/context/spring-context.xsd"
+                      >
+
+    <bean id="scaleioDataStoreProvider"
+          class="org.apache.cloudstack.storage.datastore.provider.ScaleIOPrimaryDatastoreProvider" />
+
+</beans>
diff --git a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImplTest.java b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImplTest.java
new file mode 100644
index 0000000..1082310
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImplTest.java
@@ -0,0 +1,48 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package org.apache.cloudstack.storage.datastore.client;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ScaleIOGatewayClientImplTest {
+
+    ScaleIOGatewayClientImpl client;
+
+    @Before
+    public void setUp() throws Exception {
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test(expected = CloudRuntimeException.class)
+    public void testClient() throws Exception {
+        client = (ScaleIOGatewayClientImpl) ScaleIOGatewayClient.getClient("https://10.2.3.149/api",
+                "admin", "P@ssword123", false, 60);
+    }
+}
\ No newline at end of file
diff --git a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycleTest.java b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycleTest.java
new file mode 100644
index 0000000..eed82ff
--- /dev/null
+++ b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycleTest.java
@@ -0,0 +1,250 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package org.apache.cloudstack.storage.datastore.lifecycle;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientConnectionPool;
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientImpl;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.datastore.provider.ScaleIOHostListener;
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
+import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.Spy;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.ModifyStoragePoolAnswer;
+import com.cloud.agent.api.ModifyStoragePoolCommand;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ResourceState;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.Storage;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.StorageManagerImpl;
+import com.cloud.storage.StoragePoolAutomation;
+import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.template.TemplateManager;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@PrepareForTest(ScaleIOGatewayClient.class)
+@RunWith(PowerMockRunner.class)
+public class ScaleIOPrimaryDataStoreLifeCycleTest {
+
+    @Mock
+    private PrimaryDataStoreDao primaryDataStoreDao;
+    @Mock
+    private StoragePoolDetailsDao storagePoolDetailsDao;
+    @Mock
+    private PrimaryDataStoreHelper dataStoreHelper;
+    @Mock
+    private ResourceManager resourceManager;
+    @Mock
+    private StoragePoolAutomation storagePoolAutomation;
+    @Mock
+    private HostDao hostDao;
+    @Mock
+    private StoragePoolHostDao storagePoolHostDao;
+    @Mock
+    private DataStoreProviderManager dataStoreProviderMgr;
+    @Mock
+    private DataStoreProvider dataStoreProvider;
+    @Mock
+    private DataStoreManager dataStoreMgr;
+    @Mock
+    private PrimaryDataStore store;
+    @Mock
+    private TemplateManager templateMgr;
+    @Mock
+    private AgentManager agentMgr;
+    @Mock
+    ModifyStoragePoolAnswer answer;
+
+    @Spy
+    @InjectMocks
+    private StorageManager storageMgr = new StorageManagerImpl();
+
+    @Spy
+    @InjectMocks
+    private HypervisorHostListener hostListener = new ScaleIOHostListener();
+
+    @InjectMocks
+    private ScaleIOPrimaryDataStoreLifeCycle scaleIOPrimaryDataStoreLifeCycleTest;
+
+    @Before
+    public void setUp() {
+        initMocks(this);
+    }
+
+    @Test
+    public void testAttachZone() throws Exception {
+        final DataStore dataStore = mock(DataStore.class);
+        when(dataStore.getId()).thenReturn(1L);
+
+        PowerMockito.mockStatic(ScaleIOGatewayClient.class);
+        ScaleIOGatewayClientImpl client = mock(ScaleIOGatewayClientImpl.class);
+        when(ScaleIOGatewayClientConnectionPool.getInstance().getClient(1L, storagePoolDetailsDao)).thenReturn(client);
+
+        List<String> connectedSdcIps = new ArrayList<>();
+        connectedSdcIps.add("192.168.1.1");
+        connectedSdcIps.add("192.168.1.2");
+        when(client.listConnectedSdcIps()).thenReturn(connectedSdcIps);
+        when(client.isSdcConnected(anyString())).thenReturn(true);
+
+        final ZoneScope scope = new ZoneScope(1L);
+
+        List<HostVO> hostList = new ArrayList<HostVO>();
+        HostVO host1 = new HostVO(1L, "host01", Host.Type.Routing, "192.168.1.1", "255.255.255.0", null, null, null, null, null, null, null, null, null, null,
+                UUID.randomUUID().toString(), Status.Up, "1.0", null, null, 1L, null, 0, 0, "aa", 0, Storage.StoragePoolType.PowerFlex);
+        HostVO host2 = new HostVO(2L, "host02", Host.Type.Routing, "192.168.1.2", "255.255.255.0", null, null, null, null, null, null, null, null, null, null,
+                UUID.randomUUID().toString(), Status.Up, "1.0", null, null, 1L, null, 0, 0, "aa", 0, Storage.StoragePoolType.PowerFlex);
+
+        host1.setResourceState(ResourceState.Enabled);
+        host2.setResourceState(ResourceState.Enabled);
+        hostList.add(host1);
+        hostList.add(host2);
+        when(resourceManager.listAllUpAndEnabledHostsInOneZoneByHypervisor(Hypervisor.HypervisorType.KVM, 1L)).thenReturn(hostList);
+
+        when(dataStoreMgr.getDataStore(anyLong(), eq(DataStoreRole.Primary))).thenReturn(store);
+        when(store.getId()).thenReturn(1L);
+        when(store.getPoolType()).thenReturn(Storage.StoragePoolType.PowerFlex);
+        when(store.isShared()).thenReturn(true);
+        when(store.getName()).thenReturn("ScaleIOPool");
+        when(store.getStorageProviderName()).thenReturn(ScaleIOUtil.PROVIDER_NAME);
+
+        when(dataStoreProviderMgr.getDataStoreProvider(ScaleIOUtil.PROVIDER_NAME)).thenReturn(dataStoreProvider);
+        when(dataStoreProvider.getName()).thenReturn(ScaleIOUtil.PROVIDER_NAME);
+        storageMgr.registerHostListener(ScaleIOUtil.PROVIDER_NAME, hostListener);
+
+        when(agentMgr.easySend(anyLong(), Mockito.any(ModifyStoragePoolCommand.class))).thenReturn(answer);
+        when(answer.getResult()).thenReturn(true);
+
+        when(storagePoolHostDao.findByPoolHost(anyLong(), anyLong())).thenReturn(null);
+
+        when(hostDao.findById(1L)).thenReturn(host1);
+        when(hostDao.findById(2L)).thenReturn(host2);
+
+        when(dataStoreHelper.attachZone(Mockito.any(DataStore.class))).thenReturn(null);
+
+        scaleIOPrimaryDataStoreLifeCycleTest.attachZone(dataStore, scope, Hypervisor.HypervisorType.KVM);
+        verify(storageMgr,times(2)).connectHostToSharedPool(Mockito.any(Long.class), Mockito.any(Long.class));
+        verify(storagePoolHostDao,times(2)).persist(Mockito.any(StoragePoolHostVO.class));
+    }
+
+    @Test(expected = CloudRuntimeException.class)
+    public void testAttachZone_UnsupportedHypervisor() throws Exception {
+        final DataStore dataStore = mock(DataStore.class);
+        final ZoneScope scope = new ZoneScope(1L);
+        scaleIOPrimaryDataStoreLifeCycleTest.attachZone(dataStore, scope, Hypervisor.HypervisorType.VMware);
+    }
+
+    @Test
+    public void testMaintain() {
+        final DataStore store = mock(DataStore.class);
+        when(storagePoolAutomation.maintain(any(DataStore.class))).thenReturn(true);
+        when(dataStoreHelper.maintain(any(DataStore.class))).thenReturn(true);
+        final boolean result = scaleIOPrimaryDataStoreLifeCycleTest.maintain(store);
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    public void testCancelMaintain() {
+        final DataStore store = mock(DataStore.class);
+        when(dataStoreHelper.cancelMaintain(any(DataStore.class))).thenReturn(true);
+        when(storagePoolAutomation.cancelMaintain(any(DataStore.class))).thenReturn(true);
+        final boolean result = scaleIOPrimaryDataStoreLifeCycleTest.cancelMaintain(store);
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    public void testEnableStoragePool() {
+        final DataStore dataStore = mock(DataStore.class);
+        when(dataStoreHelper.enable(any(DataStore.class))).thenReturn(true);
+        scaleIOPrimaryDataStoreLifeCycleTest.enableStoragePool(dataStore);
+    }
+
+    @Test
+    public void testDisableStoragePool() {
+        final DataStore dataStore = mock(DataStore.class);
+        when(dataStoreHelper.disable(any(DataStore.class))).thenReturn(true);
+        scaleIOPrimaryDataStoreLifeCycleTest.disableStoragePool(dataStore);
+    }
+
+    @Test
+    public void testDeleteDataStoreWithStoragePoolNull() {
+        final PrimaryDataStore store = mock(PrimaryDataStore.class);
+        when(primaryDataStoreDao.findById(anyLong())).thenReturn(null);
+        when(dataStoreHelper.deletePrimaryDataStore(any(DataStore.class))).thenReturn(true);
+        final boolean result = scaleIOPrimaryDataStoreLifeCycleTest.deleteDataStore(store);
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    public void testDeleteDataStore() {
+        final PrimaryDataStore store = mock(PrimaryDataStore.class);
+        final StoragePoolVO storagePoolVO = mock(StoragePoolVO.class);
+        when(primaryDataStoreDao.findById(anyLong())).thenReturn(storagePoolVO);
+        List<VMTemplateStoragePoolVO> unusedTemplates = new ArrayList<>();
+        when(templateMgr.getUnusedTemplatesInPool(storagePoolVO)).thenReturn(unusedTemplates);
+        List<StoragePoolHostVO> poolHostVOs = new ArrayList<>();
+        when(storagePoolHostDao.listByPoolId(anyLong())).thenReturn(poolHostVOs);
+        when(dataStoreHelper.deletePrimaryDataStore(any(DataStore.class))).thenReturn(true);
+        final boolean result = scaleIOPrimaryDataStoreLifeCycleTest.deleteDataStore(store);
+        assertThat(result).isTrue();
+    }
+}
diff --git a/plugins/storage/volume/solidfire/pom.xml b/plugins/storage/volume/solidfire/pom.xml
index 3551ccd..403723a 100644
--- a/plugins/storage/volume/solidfire/pom.xml
+++ b/plugins/storage/volume/solidfire/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java b/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java
index 0651f2e..f73a8fd 100644
--- a/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java
@@ -82,6 +82,7 @@
 import com.cloud.user.AccountDetailsDao;
 import com.cloud.user.AccountVO;
 import com.cloud.user.dao.AccountDao;
+import com.cloud.utils.Pair;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.google.common.base.Preconditions;
@@ -831,6 +832,11 @@
     }
 
     @Override
+    public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public boolean canCopy(DataObject srcData, DataObject destData) {
         return false;
     }
@@ -1588,4 +1594,29 @@
 
         return lstSnapshots2;
     }
+
+    @Override
+    public boolean canProvideStorageStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getStorageStats(StoragePool storagePool) {
+        return null;
+    }
+
+    @Override
+    public boolean canProvideVolumeStats() {
+        return false;
+    }
+
+    @Override
+    public Pair<Long, Long> getVolumeStats(StoragePool storagePool, String volumeId) {
+        return null;
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        return true;
+    }
 }
diff --git a/plugins/user-authenticators/ldap/pom.xml b/plugins/user-authenticators/ldap/pom.xml
index 7972cd8..1eba27c 100644
--- a/plugins/user-authenticators/ldap/pom.xml
+++ b/plugins/user-authenticators/ldap/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/plugins/user-authenticators/md5/pom.xml b/plugins/user-authenticators/md5/pom.xml
index 5218e68..edd572f 100644
--- a/plugins/user-authenticators/md5/pom.xml
+++ b/plugins/user-authenticators/md5/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/user-authenticators/pbkdf2/pom.xml b/plugins/user-authenticators/pbkdf2/pom.xml
index 6d62236..353a42a 100644
--- a/plugins/user-authenticators/pbkdf2/pom.xml
+++ b/plugins/user-authenticators/pbkdf2/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/user-authenticators/plain-text/pom.xml b/plugins/user-authenticators/plain-text/pom.xml
index 7b4c120..b2afc38 100644
--- a/plugins/user-authenticators/plain-text/pom.xml
+++ b/plugins/user-authenticators/plain-text/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/user-authenticators/saml2/pom.xml b/plugins/user-authenticators/saml2/pom.xml
index 9a9524e..538a371 100644
--- a/plugins/user-authenticators/saml2/pom.xml
+++ b/plugins/user-authenticators/saml2/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/user-authenticators/sha256salted/pom.xml b/plugins/user-authenticators/sha256salted/pom.xml
index f86d801..3df8b18 100644
--- a/plugins/user-authenticators/sha256salted/pom.xml
+++ b/plugins/user-authenticators/sha256salted/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-plugins</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/pom.xml b/pom.xml
index d2b1182..cd7c18b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
 
     <groupId>org.apache.cloudstack</groupId>
     <artifactId>cloudstack</artifactId>
-    <version>4.15.1.0-SNAPSHOT</version>
+    <version>4.16.0.0-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>Apache CloudStack</name>
     <description>Apache CloudStack is an IaaS ("Infrastructure as a Service") cloud orchestration platform.</description>
diff --git a/quickcloud/pom.xml b/quickcloud/pom.xml
index 5f37d68..dc54e0c 100644
--- a/quickcloud/pom.xml
+++ b/quickcloud/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/server/pom.xml b/server/pom.xml
index 72dd1ae..13e7ac7 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
index 42f91d1..22d320e 100644
--- a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
+++ b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
@@ -124,7 +124,7 @@
                 isVMDeployedWithUefi = true;
             }
         }
-        s_logger.info(" Guest VM is requested with Cusotm[UEFI] Boot Type "+ isVMDeployedWithUefi);
+        s_logger.info(" Guest VM is requested with Custom[UEFI] Boot Type "+ isVMDeployedWithUefi);
 
 
         if (type == Host.Type.Storage) {
diff --git a/server/src/main/java/com/cloud/alert/AlertManagerImpl.java b/server/src/main/java/com/cloud/alert/AlertManagerImpl.java
index 75b8cc7..d48f2a3 100644
--- a/server/src/main/java/com/cloud/alert/AlertManagerImpl.java
+++ b/server/src/main/java/com/cloud/alert/AlertManagerImpl.java
@@ -769,7 +769,8 @@
                     (alertType != AlertManager.AlertType.ALERT_TYPE_UPLOAD_FAILED) &&
                     (alertType != AlertManager.AlertType.ALERT_TYPE_OOBM_AUTH_ERROR) &&
                     (alertType != AlertManager.AlertType.ALERT_TYPE_HA_ACTION) &&
-                    (alertType != AlertManager.AlertType.ALERT_TYPE_CA_CERT)) {
+                    (alertType != AlertManager.AlertType.ALERT_TYPE_CA_CERT) &&
+                    (alertType != AlertManager.AlertType.ALERT_TYPE_VM_SNAPSHOT)) {
                 alert = _alertDao.getLastAlert(alertType.getType(), dataCenterId, podId, clusterId);
             }
 
diff --git a/server/src/main/java/com/cloud/api/ApiDBUtils.java b/server/src/main/java/com/cloud/api/ApiDBUtils.java
index 87b9f36..0d396c6 100644
--- a/server/src/main/java/com/cloud/api/ApiDBUtils.java
+++ b/server/src/main/java/com/cloud/api/ApiDBUtils.java
@@ -311,6 +311,7 @@
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.EnumUtils;
 import com.cloud.utils.Pair;
+import com.cloud.utils.StringUtils;
 import com.cloud.vm.ConsoleProxyVO;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.InstanceGroup;
@@ -1208,7 +1209,7 @@
                 type = HypervisorType.Hyperv;
             }
         } if (format == ImageFormat.RAW) {
-            // Currently, KVM only suppoorts RBD images of type RAW.
+            // Currently, KVM only supports RBD and PowerFlex images of type RAW.
             // This results in a weird collision with OVM volumes which
             // can only be raw, thus making KVM RBD volumes show up as OVM
             // rather than RBD. This block of code can (hopefuly) by checking to
@@ -1220,7 +1221,7 @@
             ListIterator<StoragePoolVO> itr = pools.listIterator();
             while(itr.hasNext()) {
                 StoragePoolVO pool = itr.next();
-                if(pool.getPoolType() == StoragePoolType.RBD || pool.getPoolType() == StoragePoolType.CLVM) {
+                if(pool.getPoolType() == StoragePoolType.RBD || pool.getPoolType() == StoragePoolType.PowerFlex || pool.getPoolType() == StoragePoolType.CLVM) {
                   // This case will note the presence of non-qcow2 primary stores, suggesting KVM without NFS. Otherwse,
                   // If this check is not passed, the hypervisor type will remain OVM.
                   type = HypervisorType.KVM;
@@ -1736,7 +1737,17 @@
     ///////////////////////////////////////////////////////////////////////
 
     public static DomainRouterResponse newDomainRouterResponse(DomainRouterJoinVO vr, Account caller) {
-        return s_domainRouterJoinDao.newDomainRouterResponse(vr, caller);
+        DomainRouterResponse response = s_domainRouterJoinDao.newDomainRouterResponse(vr, caller);
+        if (StringUtils.isBlank(response.getHypervisor())) {
+            VMInstanceVO vm = ApiDBUtils.findVMInstanceById(vr.getId());
+            if (vm.getLastHostId() != null) {
+                HostVO lastHost = ApiDBUtils.findHostById(vm.getLastHostId());
+                if (lastHost != null) {
+                    response.setHypervisor(lastHost.getHypervisorType().toString());
+                }
+            }
+        }
+        return  response;
     }
 
     public static DomainRouterResponse fillRouterDetails(DomainRouterResponse vrData, DomainRouterJoinVO vr) {
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index 473c501..d1ce339 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -426,6 +426,7 @@
         domainResponse.setDomainName(domain.getName());
         domainResponse.setId(domain.getUuid());
         domainResponse.setLevel(domain.getLevel());
+        domainResponse.setCreated(domain.getCreated());
         domainResponse.setNetworkDomain(domain.getNetworkDomain());
         Domain parentDomain = ApiDBUtils.findDomainById(domain.getParent());
         if (parentDomain != null) {
@@ -1402,6 +1403,11 @@
                     vmResponse.setHostName(host.getName());
                     vmResponse.setHypervisor(host.getHypervisorType().toString());
                 }
+            } else if (vm.getLastHostId() != null) {
+                Host lastHost = ApiDBUtils.findHostById(vm.getLastHostId());
+                if (lastHost != null) {
+                    vmResponse.setHypervisor(lastHost.getHypervisorType().toString());
+                }
             }
 
             if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) {
diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
index cf01b8d..6cad8d1 100644
--- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
@@ -1901,6 +1901,9 @@
             if (caps != null) {
                 boolean quiescevm = Boolean.parseBoolean(caps.get(DataStoreCapabilities.VOLUME_SNAPSHOT_QUIESCEVM.toString()));
                 vr.setNeedQuiescevm(quiescevm);
+
+                boolean supportsStorageSnapshot = Boolean.parseBoolean(caps.get(DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString()));
+                vr.setSupportsStorageSnapshot(supportsStorageSnapshot);
             }
         }
         response.setResponses(volumeResponses, result.second());
@@ -4115,13 +4118,18 @@
             throw new CloudRuntimeException("Router health checks are not enabled for router " + routerId);
         }
 
-        if (cmd.shouldPerformFreshChecks() && !routerService.performRouterHealthChecks(routerId)) {
-            throw new CloudRuntimeException("Unable to perform fresh checks on router.");
+        if (cmd.shouldPerformFreshChecks()) {
+            Pair<Boolean, String> healthChecksresult = routerService.performRouterHealthChecks(routerId);
+            if (healthChecksresult == null) {
+                throw new CloudRuntimeException("Failed to initiate fresh checks on router.");
+            } else if (!healthChecksresult.first()) {
+                throw new CloudRuntimeException("Unable to perform fresh checks on router - " + healthChecksresult.second());
+            }
         }
 
         List<RouterHealthCheckResult> result = new ArrayList<>(routerHealthCheckResultDao.getHealthCheckResults(routerId));
         if (result == null || result.size() == 0) {
-            throw new CloudRuntimeException("Database had no entries for health checks for router. This could happen for " +
+            throw new CloudRuntimeException("No health check results found for the router. This could happen for " +
                     "a newly created router. Please wait for periodic results to populate or manually call for checks to execute.");
         }
 
diff --git a/server/src/main/java/com/cloud/api/query/ViewResponseHelper.java b/server/src/main/java/com/cloud/api/query/ViewResponseHelper.java
index a4de366..1067ff2 100644
--- a/server/src/main/java/com/cloud/api/query/ViewResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/query/ViewResponseHelper.java
@@ -288,16 +288,17 @@
             vrDataList.put(vr.getId(), vrData);
 
             VolumeStats vs = null;
-            if (vr.getFormat() == ImageFormat.VHD || vr.getFormat() == ImageFormat.QCOW2) {
-                vs = ApiDBUtils.getVolumeStatistics(vrData.getPath());
-            }
-            else if (vr.getFormat() == ImageFormat.OVA) {
+            if (vr.getFormat() == ImageFormat.VHD || vr.getFormat() == ImageFormat.QCOW2 || vr.getFormat() == ImageFormat.RAW) {
+                if (vrData.getPath() != null) {
+                    vs = ApiDBUtils.getVolumeStatistics(vrData.getPath());
+                }
+            } else if (vr.getFormat() == ImageFormat.OVA) {
                 if (vrData.getChainInfo() != null) {
                     vs = ApiDBUtils.getVolumeStatistics(vrData.getChainInfo());
                 }
             }
 
-            if (vs != null){
+            if (vs != null) {
                 long vsz = vs.getVirtualSize();
                 long psz = vs.getPhysicalSize() ;
                 double util = (double)psz/vsz;
diff --git a/server/src/main/java/com/cloud/api/query/dao/AccountJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/AccountJoinDaoImpl.java
index c5f8ad5..fa2049e 100644
--- a/server/src/main/java/com/cloud/api/query/dao/AccountJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/AccountJoinDaoImpl.java
@@ -70,6 +70,7 @@
         (domainPath.append(account.getDomainPath())).deleteCharAt(domainPath.length() - 1);
         accountResponse.setDomainPath(domainPath.toString());
         accountResponse.setState(account.getState().toString());
+        accountResponse.setCreated(account.getCreated());
         accountResponse.setNetworkDomain(account.getNetworkDomain());
         accountResponse.setDefaultZone(account.getDataCenterUuid());
         accountResponse.setIsDefault(account.isDefault());
diff --git a/server/src/main/java/com/cloud/api/query/dao/DomainJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/DomainJoinDaoImpl.java
index a613fcb..d65afd2 100644
--- a/server/src/main/java/com/cloud/api/query/dao/DomainJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/DomainJoinDaoImpl.java
@@ -71,6 +71,7 @@
         }
 
         domainResponse.setState(domain.getState().toString());
+        domainResponse.setCreated(domain.getCreated());
         domainResponse.setNetworkDomain(domain.getNetworkDomain());
 
         if (details.contains(DomainDetails.all) || details.contains(DomainDetails.resource)) {
diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
index 8e489f8..ff2b66c 100644
--- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
@@ -336,6 +336,11 @@
                 userVmResponse.setBootType("Bios");
                 userVmResponse.setBootMode("legacy");
             }
+
+            if (userVm.getPoolType() != null) {
+                userVmResponse.setPoolType(userVm.getPoolType().toString());
+            }
+
             // Remove blacklisted settings if user is not admin
             if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
                 String[] userVmSettingsToHide = QueryService.UserVMBlacklistedDetails.value().split(",");
diff --git a/server/src/main/java/com/cloud/api/query/vo/AccountJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/AccountJoinVO.java
index f251abc..146de0c 100644
--- a/server/src/main/java/com/cloud/api/query/vo/AccountJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/AccountJoinVO.java
@@ -55,6 +55,9 @@
     @Enumerated(value = EnumType.STRING)
     private State state;
 
+    @Column(name = GenericDao.CREATED_COLUMN)
+    private Date created;
+
     @Column(name = GenericDao.REMOVED_COLUMN)
     private Date removed;
 
@@ -213,6 +216,10 @@
         return state;
     }
 
+    public Date getCreated() {
+        return created;
+    }
+
     public Date getRemoved() {
         return removed;
     }
diff --git a/server/src/main/java/com/cloud/api/query/vo/DomainJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/DomainJoinVO.java
index 6f4d6b7..84456e4 100644
--- a/server/src/main/java/com/cloud/api/query/vo/DomainJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/DomainJoinVO.java
@@ -53,6 +53,9 @@
     @Column(name="level")
     private int level;
 
+    @Column(name=GenericDao.CREATED_COLUMN)
+    private Date created;
+
     @Column(name=GenericDao.REMOVED_COLUMN)
     private Date removed;
 
@@ -208,6 +211,10 @@
         return accountId;
     }
 
+    public Date getCreated() {
+        return created;
+    }
+
     public Date getRemoved() {
         return removed;
     }
diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
index fba24e0..543c977 100644
--- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
+++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
@@ -585,9 +585,19 @@
         // if the storage pool is managed, the used bytes can be larger than the sum of the sizes of all of the non-destroyed volumes
         // in this case, call getUsedBytes(StoragePoolVO)
         if (pool.isManaged()) {
-            return getUsedBytes(pool);
-        }
-        else {
+            totalAllocatedSize = getUsedBytes(pool);
+
+            if (templateForVmCreation != null) {
+                VMTemplateStoragePoolVO templatePoolVO = _templatePoolDao.findByPoolTemplate(pool.getId(), templateForVmCreation.getId(), null);
+                if (templatePoolVO == null) {
+                    // template is not installed in the pool, consider the template size for allocation
+                    long templateForVmCreationSize = templateForVmCreation.getSize() != null ? templateForVmCreation.getSize() : 0;
+                    totalAllocatedSize += templateForVmCreationSize;
+                }
+            }
+
+            return totalAllocatedSize;
+        } else {
             // Get size for all the non-destroyed volumes.
             Pair<Long, Long> sizes = _volumeDao.getNonDestroyedCountAndTotalByPool(pool.getId());
 
diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index 1db461d..f5de35a 100755
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -209,6 +209,7 @@
 import com.cloud.storage.DiskOfferingVO;
 import com.cloud.storage.Storage.ProvisioningType;
 import com.cloud.storage.StorageManager;
+import com.cloud.storage.Volume;
 import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.VMTemplateZoneDao;
 import com.cloud.storage.dao.VolumeDao;
@@ -2600,6 +2601,10 @@
                         continue;
                     }
                 }
+                if (detailEntry.getKey().equalsIgnoreCase(Volume.BANDWIDTH_LIMIT_IN_MBPS) || detailEntry.getKey().equalsIgnoreCase(Volume.IOPS_LIMIT)) {
+                    // Add in disk offering details
+                    continue;
+                }
                 detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), detailEntry.getKey(), detailEntryValue, true));
             }
         }
@@ -2623,6 +2628,21 @@
                 }
                 _serviceOfferingDetailsDao.saveDetails(detailsVO);
             }
+
+            if (details != null && !details.isEmpty()) {
+                List<DiskOfferingDetailVO> diskDetailsVO = new ArrayList<DiskOfferingDetailVO>();
+                // Support disk offering details for below parameters
+                if (details.containsKey(Volume.BANDWIDTH_LIMIT_IN_MBPS)) {
+                    diskDetailsVO.add(new DiskOfferingDetailVO(offering.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS, details.get(Volume.BANDWIDTH_LIMIT_IN_MBPS), false));
+                }
+                if (details.containsKey(Volume.IOPS_LIMIT)) {
+                    diskDetailsVO.add(new DiskOfferingDetailVO(offering.getId(), Volume.IOPS_LIMIT, details.get(Volume.IOPS_LIMIT), false));
+                }
+                if (!diskDetailsVO.isEmpty()) {
+                    diskOfferingDetailsDao.saveDetails(diskDetailsVO);
+                }
+            }
+
             CallContext.current().setEventDetails("Service offering id=" + offering.getId());
             return offering;
         } else {
@@ -2868,7 +2888,7 @@
                                                 Long bytesWriteRate, Long bytesWriteRateMax, Long bytesWriteRateMaxLength,
                                                 Long iopsReadRate, Long iopsReadRateMax, Long iopsReadRateMaxLength,
                                                 Long iopsWriteRate, Long iopsWriteRateMax, Long iopsWriteRateMaxLength,
-                                                final Integer hypervisorSnapshotReserve, String cacheMode, final Long storagePolicyID) {
+                                                final Integer hypervisorSnapshotReserve, String cacheMode, final Map<String, String> details, final Long storagePolicyID) {
         long diskSize = 0;// special case for custom disk offerings
         if (numGibibytes != null && numGibibytes <= 0) {
             throw new InvalidParameterValueException("Please specify a disk size of at least 1 Gb.");
@@ -2963,6 +2983,15 @@
                     detailsVO.add(new DiskOfferingDetailVO(offering.getId(), ApiConstants.ZONE_ID, String.valueOf(zoneId), false));
                 }
             }
+            if (details != null && !details.isEmpty()) {
+                // Support disk offering details for below parameters
+                if (details.containsKey(Volume.BANDWIDTH_LIMIT_IN_MBPS)) {
+                    detailsVO.add(new DiskOfferingDetailVO(offering.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS, details.get(Volume.BANDWIDTH_LIMIT_IN_MBPS), false));
+                }
+                if (details.containsKey(Volume.IOPS_LIMIT)) {
+                    detailsVO.add(new DiskOfferingDetailVO(offering.getId(), Volume.IOPS_LIMIT, details.get(Volume.IOPS_LIMIT), false));
+                }
+            }
             if (storagePolicyID != null) {
                 detailsVO.add(new DiskOfferingDetailVO(offering.getId(), ApiConstants.STORAGE_POLICY, String.valueOf(storagePolicyID), false));
             }
@@ -2987,6 +3016,7 @@
         final String tags = cmd.getTags();
         final List<Long> domainIds = cmd.getDomainIds();
         final List<Long> zoneIds = cmd.getZoneIds();
+        final Map<String, String> details = cmd.getDetails();
         final Long storagePolicyId = cmd.getStoragePolicy();
 
         // check if valid domain
@@ -3063,7 +3093,7 @@
                 localStorageRequired, isDisplayOfferingEnabled, isCustomizedIops, minIops,
                 maxIops, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength,
                 iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate, iopsWriteRateMax, iopsWriteRateMaxLength,
-                hypervisorSnapshotReserve, cacheMode, storagePolicyId);
+                hypervisorSnapshotReserve, cacheMode, details, storagePolicyId);
     }
 
     /**
@@ -4759,7 +4789,7 @@
         String servicePackageuuid = cmd.getServicePackageId();
         final List<Long> domainIds = cmd.getDomainIds();
         final List<Long> zoneIds = cmd.getZoneIds();
-
+        final boolean enable = cmd.getEnable();
         // check if valid domain
         if (CollectionUtils.isNotEmpty(domainIds)) {
             for (final Long domainId: domainIds) {
@@ -5032,8 +5062,8 @@
             forVpc = false;
         }
 
-        final NetworkOffering offering = createNetworkOffering(name, displayText, trafficType, tags, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false,
-                serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent, details, egressDefaultPolicy, maxconn, enableKeepAlive, forVpc, domainIds, zoneIds);
+        final NetworkOfferingVO offering = createNetworkOffering(name, displayText, trafficType, tags, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false,
+                serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent, details, egressDefaultPolicy, maxconn, enableKeepAlive, forVpc, domainIds, zoneIds, enable);
         CallContext.current().setEventDetails(" Id: " + offering.getId() + " Name: " + name);
         return offering;
     }
@@ -5171,7 +5201,7 @@
             final Long serviceOfferingId,
             final boolean conserveMode, final Map<Service, Map<Capability, String>> serviceCapabilityMap, final boolean specifyIpRanges, final boolean isPersistent,
             final Map<Detail, String> details, final boolean egressDefaultPolicy, final Integer maxconn, final boolean enableKeepAlive, Boolean forVpc,
-            final List<Long> domainIds, final List<Long> zoneIds) {
+            final List<Long> domainIds, final List<Long> zoneIds, final boolean enableOffering) {
 
         String servicePackageUuid;
         String spDescription = null;
@@ -5341,6 +5371,10 @@
             offeringFinal.setServiceOfferingId(serviceOfferingId);
         }
 
+        if (enableOffering) {
+            offeringFinal.setState(NetworkOffering.State.Enabled);
+        }
+
         //Set Service package id
         offeringFinal.setServicePackage(servicePackageUuid);
         // validate the details
diff --git a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index 6c00709..fed29aa 100644
--- a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@ -30,24 +30,14 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.utils.StringUtils;
-import com.cloud.exception.StorageUnavailableException;
-import com.cloud.utils.db.Filter;
-import com.cloud.utils.fsm.StateMachine2;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
-import org.apache.log4j.Logger;
+import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
 import org.apache.cloudstack.affinity.AffinityGroupProcessor;
 import org.apache.cloudstack.affinity.AffinityGroupService;
 import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
 import org.apache.cloudstack.affinity.AffinityGroupVO;
-import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
 import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
-import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao;
+import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO;
 import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
@@ -60,6 +50,9 @@
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
@@ -91,6 +84,7 @@
 import com.cloud.exception.AffinityConflictException;
 import com.cloud.exception.ConnectionException;
 import com.cloud.exception.InsufficientServerCapacityException;
+import com.cloud.exception.StorageUnavailableException;
 import com.cloud.gpu.GPU;
 import com.cloud.host.DetailVO;
 import com.cloud.host.Host;
@@ -113,26 +107,31 @@
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.user.AccountManager;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
+import com.cloud.utils.StringUtils;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.StateListener;
+import com.cloud.utils.fsm.StateMachine2;
 import com.cloud.vm.DiskProfile;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
@@ -1435,7 +1434,7 @@
         boolean hostCanAccessSPool = false;
 
         StoragePoolHostVO hostPoolLinkage = _poolHostDao.findByPoolHost(pool.getId(), host.getId());
-        if (hostPoolLinkage != null) {
+        if (hostPoolLinkage != null && _storageMgr.canHostAccessStoragePool(host, pool)) {
             hostCanAccessSPool = true;
         }
 
diff --git a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java
index 2ae35fc..1d3f34e 100644
--- a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java
+++ b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java
@@ -47,6 +47,7 @@
 import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.service.dao.ServiceOfferingDetailsDao;
 import com.cloud.storage.StoragePool;
+import com.cloud.storage.Volume;
 import com.cloud.utils.Pair;
 import com.cloud.utils.StringUtils;
 import com.cloud.utils.component.AdapterBase;
@@ -248,6 +249,7 @@
         to.setConfigDriveLabel(vmProfile.getConfigDriveLabel());
         to.setConfigDriveIsoRootFolder(vmProfile.getConfigDriveIsoRootFolder());
         to.setConfigDriveIsoFile(vmProfile.getConfigDriveIsoFile());
+        to.setConfigDriveLocation(vmProfile.getConfigDriveLocation());
         to.setState(vm.getState());
 
         return to;
@@ -297,7 +299,7 @@
         return false;
     }
 
-    public List<Command> finalizeMigrate(VirtualMachine vm, StoragePool destination) {
+    public List<Command> finalizeMigrate(VirtualMachine vm, Map<Volume, StoragePool> volumeToPool) {
         return null;
     }
 }
diff --git a/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java b/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java
index eaa5fea..e63a992 100644
--- a/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java
+++ b/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java
@@ -31,6 +31,7 @@
 import org.apache.cloudstack.agent.lb.IndirectAgentLB;
 import org.apache.cloudstack.ca.CAManager;
 import org.apache.cloudstack.ca.SetupCertificateCommand;
+import org.apache.cloudstack.direct.download.DirectDownloadManager;
 import org.apache.cloudstack.framework.ca.Certificate;
 import org.apache.cloudstack.utils.security.KeyStoreUtils;
 import org.apache.log4j.Logger;
@@ -53,6 +54,7 @@
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
 import com.cloud.host.Status;
+import com.cloud.host.dao.HostDao;
 import com.cloud.hypervisor.Hypervisor;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.PhysicalNetworkSetupInfo;
@@ -80,7 +82,11 @@
     @Inject
     private CAManager caManager;
     @Inject
+    DirectDownloadManager directDownloadManager;
+    @Inject
     private IndirectAgentLB indirectAgentLB;
+    @Inject
+    private HostDao hostDao;
 
     @Override
     public abstract Hypervisor.HypervisorType getHypervisorType();
@@ -105,6 +111,10 @@
 
     @Override
     public void processHostAdded(long hostId) {
+        HostVO host = hostDao.findById(hostId);
+        if (host != null) {
+            directDownloadManager.syncCertificatesToHost(hostId, host.getDataCenterId());
+        }
     }
 
     @Override
@@ -405,6 +415,7 @@
             _kvmGuestNic = _kvmPrivateNic;
         }
 
+        agentMgr.registerForHostEvents(this, true, false, false);
         _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
         return true;
     }
diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index e5f06c6..51af56a 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -32,6 +32,7 @@
 
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -850,10 +851,16 @@
                     errorMessage.append(", network id=" + guestNetworkId);
                 }
                 sc.setJoinParameters("vlan", "type", vlanUse);
-
+                String routerIpAddress = null;
+                if (network != null) {
+                    NetworkDetailVO routerIpDetail = _networkDetailsDao.findDetail(network.getId(), ApiConstants.ROUTER_IP);
+                    routerIpAddress = routerIpDetail != null ? routerIpDetail.getValue() : null;
+                }
                 if (requestedIp != null) {
                     sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
                     errorMessage.append(": requested ip " + requestedIp + " is not available");
+                } else if (routerIpAddress != null) {
+                    sc.addAnd("address", Op.NEQ, routerIpAddress);
                 }
 
                 boolean ascOrder = ! forSystemVms;
@@ -1729,7 +1736,7 @@
                             s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId()
                                     + " as a part of createVlanIpRange process");
                             guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName()
-                                    + "-network", null, null, null, false, null, owner, null, physicalNetwork, zoneId, ACLType.Account, null, null, null, null, true, null, null, null);
+                                    + "-network", null, null, null, false, null, owner, null, physicalNetwork, zoneId, ACLType.Account, null, null, null, null, true, null, null, null, null, null);
                             if (guestNetwork == null) {
                                 s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId);
                                 throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT "
@@ -2104,7 +2111,6 @@
             public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException {
                 //This method allocates direct ip for the Shared network in Advance zones
                 boolean ipv4 = false;
-
                 if (network.getGateway() != null) {
                     if (nic.getIPv4Address() == null) {
                         PublicIp ip = null;
diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
index 4a4603c..21d0724 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -1029,6 +1029,46 @@
         }
     }
 
+    private void validateRouterIps(String routerIp, String routerIpv6, String startIp, String endIp, String gateway,
+                                   String netmask, String startIpv6, String endIpv6, String ip6Cidr) {
+        if (isNotBlank(routerIp)) {
+            if (startIp != null && endIp == null) {
+                endIp = startIp;
+            }
+            if (!NetUtils.isValidIp4(routerIp)) {
+                throw new CloudRuntimeException("Router IPv4 IP provided is of incorrect format");
+            }
+            if (isNotBlank(startIp) && isNotBlank(endIp)) {
+                if (!NetUtils.isIpInRange(routerIp, startIp, endIp)) {
+                    throw new CloudRuntimeException("Router IPv4 IP provided is not within the specified range: " + startIp + " - " + endIp);
+                }
+            } else {
+                String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+                if (!NetUtils.isIpWithInCidrRange(routerIp, cidr)) {
+                    throw new CloudRuntimeException("Router IP provided in not within the network range");
+                }
+            }
+        }
+        if (isNotBlank(routerIpv6)) {
+            if (startIpv6 != null && endIpv6 == null) {
+                endIpv6 = startIpv6;
+            }
+            if (!NetUtils.isValidIp6(routerIpv6)) {
+                throw new CloudRuntimeException("Router IPv6 address provided is of incorrect format");
+            }
+            if (isNotBlank(startIpv6) && isNotBlank(endIpv6)) {
+                String ipv6Range = startIpv6 + "-" + endIpv6;
+                if (!NetUtils.isIp6InRange(routerIpv6, ipv6Range)) {
+                    throw new CloudRuntimeException("Router IPv6 address provided is not within the specified range: " + startIpv6 + " - " + endIpv6);
+                }
+            } else {
+                if (!NetUtils.isIp6InNetwork(routerIpv6, ip6Cidr)) {
+                    throw new CloudRuntimeException("Router IPv6 address provided is not with the network range");
+                }
+            }
+        }
+    }
+
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_NETWORK_CREATE, eventDescription = "creating network")
@@ -1042,10 +1082,14 @@
         String vlanId = null;
         boolean bypassVlanOverlapCheck = false;
         boolean hideIpAddressUsage = false;
+        String routerIp = null;
+        String routerIpv6 = null;
         if (cmd instanceof CreateNetworkCmdByAdmin) {
             vlanId = ((CreateNetworkCmdByAdmin)cmd).getVlan();
             bypassVlanOverlapCheck = ((CreateNetworkCmdByAdmin)cmd).getBypassVlanOverlapCheck();
             hideIpAddressUsage = ((CreateNetworkCmdByAdmin)cmd).getHideIpAddressUsage();
+            routerIp = ((CreateNetworkCmdByAdmin)cmd).getRouterIp();
+            routerIpv6 = ((CreateNetworkCmdByAdmin)cmd).getRouterIpv6();
         }
 
         String name = cmd.getNetworkName();
@@ -1150,6 +1194,15 @@
             throw new InvalidParameterValueException("Only Admins can create network with guest type " + GuestType.Shared);
         }
 
+        if (ntwkOff.getGuestType() != GuestType.Shared && (isNotBlank(routerIp) || isNotBlank(routerIpv6))) {
+            throw new InvalidParameterValueException("Router IP can be specified only for Shared networks");
+        }
+
+        if (ntwkOff.getGuestType() == GuestType.Shared && !_networkModel.isProviderForNetworkOffering(Provider.VirtualRouter, networkOfferingId)
+                && (isNotBlank(routerIp) || isNotBlank(routerIpv6))) {
+            throw new InvalidParameterValueException("Virtual Router is not a supported provider for the Shared network, hence router ip should not be provided");
+        }
+
         // Check if the network is domain specific
         if (aclType == ACLType.Domain) {
             // only Admin can create domain with aclType=Domain
@@ -1279,6 +1332,8 @@
             }
         }
 
+        validateRouterIps(routerIp, routerIpv6, startIP, endIP, gateway, netmask, startIPv6, endIPv6, ip6Cidr);
+
         if (isNotBlank(isolatedPvlan) && (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() == GuestType.Isolated)) {
             throw new InvalidParameterValueException("Can only support create Private VLAN network with advanced shared or L2 network!");
         }
@@ -1365,7 +1420,7 @@
 
         Network network = commitNetwork(networkOfferingId, gateway, startIP, endIP, netmask, networkDomain, vlanId, bypassVlanOverlapCheck, name, displayText, caller, physicalNetworkId, zoneId,
                 domainId, isDomainSpecific, subdomainAccess, vpcId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, displayNetwork, aclId, secondaryVlanId, privateVlanType, ntwkOff, pNtwk, aclType, owner, cidr, createVlan,
-                externalId);
+                externalId, routerIp, routerIpv6);
 
         if (hideIpAddressUsage) {
             _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.hideIpAddressUsage, String.valueOf(hideIpAddressUsage), false));
@@ -1445,7 +1500,7 @@
                                   final Boolean bypassVlanOverlapCheck, final String name, final String displayText, final Account caller, final Long physicalNetworkId, final Long zoneId, final Long domainId,
                                   final boolean isDomainSpecific, final Boolean subdomainAccessFinal, final Long vpcId, final String startIPv6, final String endIPv6, final String ip6Gateway, final String ip6Cidr,
                                   final Boolean displayNetwork, final Long aclId, final String isolatedPvlan, final PVlanType isolatedPvlanType, final NetworkOfferingVO ntwkOff, final PhysicalNetwork pNtwk, final ACLType aclType, final Account ownerFinal,
-                                  final String cidr, final boolean createVlan, final String externalId) throws InsufficientCapacityException, ResourceAllocationException {
+                                  final String cidr, final boolean createVlan, final String externalId, String routerIp, String routerIpv6) throws InsufficientCapacityException, ResourceAllocationException {
         try {
             Network network = Transaction.execute(new TransactionCallbackWithException<Network, Exception>() {
                 @Override
@@ -1500,7 +1555,7 @@
                         }
 
                         network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, networkDomain, owner, sharedDomainId, pNtwk,
-                                zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan, isolatedPvlanType, externalId);
+                                zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan, isolatedPvlanType, externalId, routerIp, routerIpv6);
                     }
 
                     if (_accountMgr.isRootAdmin(caller.getId()) && createVlan && network != null) {
diff --git a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
index 7482eca..60e4dec 100644
--- a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
+++ b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
@@ -36,7 +36,7 @@
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.HandleConfigDriveIsoAnswer;
 import com.cloud.agent.api.HandleConfigDriveIsoCommand;
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.configuration.ConfigurationManager;
@@ -338,7 +338,16 @@
         if (_networkModel.getUserDataUpdateProvider(network).getProvider().equals(Provider.ConfigDrive)) {
             LOG.trace(String.format("[prepareMigration] for vm: %s", vm.getInstanceName()));
             try {
-                addPasswordAndUserdata(network, nic, vm, dest, context);
+                if (isConfigDriveIsoOnHostCache(vm.getId())) {
+                    vm.setConfigDriveLocation(Location.HOST);
+                    configureConfigDriveData(vm, nic, dest);
+
+                    // Create the config drive on dest host cache
+                    createConfigDriveIsoOnHostCache(vm, dest.getHost().getId());
+                } else {
+                    vm.setConfigDriveLocation(getConfigDriveLocation(vm.getId()));
+                    addPasswordAndUserdata(network, nic, vm, dest, context);
+                }
             } catch (InsufficientCapacityException | ResourceUnavailableException e) {
                 LOG.error("Failed to add config disk drive due to: ", e);
                 return false;
@@ -349,10 +358,28 @@
 
     @Override
     public void rollbackMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+        try {
+            if (isConfigDriveIsoOnHostCache(vm.getId())) {
+                vm.setConfigDriveLocation(Location.HOST);
+                // Delete the config drive on dest host cache
+                deleteConfigDriveIsoOnHostCache(vm.getVirtualMachine(), vm.getHostId());
+            }
+        } catch (ConcurrentOperationException | ResourceUnavailableException e) {
+            LOG.error("rollbackMigration failed.", e);
+        }
     }
 
     @Override
     public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+        try {
+            if (isConfigDriveIsoOnHostCache(vm.getId())) {
+                vm.setConfigDriveLocation(Location.HOST);
+                // Delete the config drive on src host cache
+                deleteConfigDriveIsoOnHostCache(vm.getVirtualMachine(), vm.getHostId());
+            }
+        } catch (ConcurrentOperationException | ResourceUnavailableException e) {
+            LOG.error("commitMigration failed.", e);
+        }
     }
 
     private void recreateConfigDriveIso(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest) throws ResourceUnavailableException {
@@ -383,7 +410,8 @@
 
     private DataStore findDataStore(VirtualMachineProfile profile, DeployDestination dest) {
         DataStore dataStore = null;
-        if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
+        if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.valueIn(dest.getDataCenter().getId()) ||
+                VirtualMachineManager.VmConfigDriveForceHostCacheUse.valueIn(dest.getDataCenter().getId())) {
             if(MapUtils.isNotEmpty(dest.getStorageForDisks())) {
                 dataStore = getPlannedDataStore(dest, dataStore);
             }
@@ -472,12 +500,86 @@
         } else {
             agentId = dest.getHost().getId();
         }
-        if (!VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
+        if (!VirtualMachineManager.VmConfigDriveOnPrimaryPool.valueIn(dest.getDataCenter().getId()) &&
+                !VirtualMachineManager.VmConfigDriveForceHostCacheUse.valueIn(dest.getDataCenter().getId())) {
             agentId = findAgentIdForImageStore(dataStore);
         }
         return agentId;
     }
 
+    private Location getConfigDriveLocation(long vmId) {
+        final UserVmDetailVO vmDetailConfigDriveLocation = _userVmDetailsDao.findDetail(vmId, VmDetailConstants.CONFIG_DRIVE_LOCATION);
+        if (vmDetailConfigDriveLocation != null) {
+            if (Location.HOST.toString().equalsIgnoreCase(vmDetailConfigDriveLocation.getValue())) {
+                return Location.HOST;
+            } else if (Location.PRIMARY.toString().equalsIgnoreCase(vmDetailConfigDriveLocation.getValue())) {
+                return Location.PRIMARY;
+            } else {
+                return Location.SECONDARY;
+            }
+        }
+        return Location.SECONDARY;
+    }
+
+    private boolean isConfigDriveIsoOnHostCache(long vmId) {
+        final UserVmDetailVO vmDetailConfigDriveLocation = _userVmDetailsDao.findDetail(vmId, VmDetailConstants.CONFIG_DRIVE_LOCATION);
+        if (vmDetailConfigDriveLocation != null && Location.HOST.toString().equalsIgnoreCase(vmDetailConfigDriveLocation.getValue())) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean createConfigDriveIsoOnHostCache(VirtualMachineProfile profile, Long hostId) throws ResourceUnavailableException {
+        if (hostId == null) {
+            throw new ResourceUnavailableException("Config drive iso creation failed, dest host not available",
+                    ConfigDriveNetworkElement.class, 0L);
+        }
+
+        LOG.debug("Creating config drive ISO for vm: " + profile.getInstanceName() + " on host: " + hostId);
+
+        final String isoFileName = ConfigDrive.configIsoFileName(profile.getInstanceName());
+        final String isoPath = ConfigDrive.createConfigDrivePath(profile.getInstanceName());
+        final String isoData = ConfigDriveBuilder.buildConfigDrive(profile.getVmData(), isoFileName, profile.getConfigDriveLabel());
+        final HandleConfigDriveIsoCommand configDriveIsoCommand = new HandleConfigDriveIsoCommand(isoPath, isoData, null, false, true, true);
+
+        final HandleConfigDriveIsoAnswer answer = (HandleConfigDriveIsoAnswer) agentManager.easySend(hostId, configDriveIsoCommand);
+        if (answer == null) {
+            throw new CloudRuntimeException("Unable to get an answer to handle config drive creation for vm: " + profile.getInstanceName() + " on host: " + hostId);
+        }
+
+        if (!answer.getResult()) {
+            throw new ResourceUnavailableException(String.format("Config drive iso creation failed, details: %s",
+                    answer.getDetails()), ConfigDriveNetworkElement.class, 0L);
+        }
+
+        profile.setConfigDriveLocation(answer.getConfigDriveLocation());
+        _userVmDetailsDao.addDetail(profile.getId(), VmDetailConstants.CONFIG_DRIVE_LOCATION, answer.getConfigDriveLocation().toString(), false);
+        addConfigDriveDisk(profile, null);
+        return true;
+    }
+
+    private boolean deleteConfigDriveIsoOnHostCache(final VirtualMachine vm, final Long hostId) throws ResourceUnavailableException {
+        if (hostId == null) {
+            throw new ResourceUnavailableException("Config drive iso deletion failed, host not available",
+                    ConfigDriveNetworkElement.class, 0L);
+        }
+
+        LOG.debug("Deleting config drive ISO for vm: " + vm.getInstanceName() + " on host: " + hostId);
+        final String isoPath = ConfigDrive.createConfigDrivePath(vm.getInstanceName());
+        final HandleConfigDriveIsoCommand configDriveIsoCommand = new HandleConfigDriveIsoCommand(isoPath, null, null, false, true, false);
+
+        final HandleConfigDriveIsoAnswer answer = (HandleConfigDriveIsoAnswer) agentManager.easySend(hostId, configDriveIsoCommand);
+        if (answer == null) {
+            throw new CloudRuntimeException("Unable to get an answer to handle config drive deletion for vm: " + vm.getInstanceName() + " on host: " + hostId);
+        }
+
+        if (!answer.getResult()) {
+            LOG.error("Failed to remove config drive for instance: " + vm.getInstanceName());
+            return false;
+        }
+        return true;
+    }
+
     private boolean createConfigDriveIso(VirtualMachineProfile profile, DeployDestination dest, DiskTO disk) throws ResourceUnavailableException {
         DataStore dataStore = getDatastoreForConfigDriveIso(disk, profile, dest);
 
@@ -492,13 +594,17 @@
         final String isoFileName = ConfigDrive.configIsoFileName(profile.getInstanceName());
         final String isoPath = ConfigDrive.createConfigDrivePath(profile.getInstanceName());
         final String isoData = ConfigDriveBuilder.buildConfigDrive(profile.getVmData(), isoFileName, profile.getConfigDriveLabel());
-        final HandleConfigDriveIsoCommand configDriveIsoCommand = new HandleConfigDriveIsoCommand(isoPath, isoData, dataStore.getTO(), true);
+        boolean useHostCacheOnUnsupportedPool = VirtualMachineManager.VmConfigDriveUseHostCacheOnUnsupportedPool.valueIn(dest.getDataCenter().getId());
+        boolean preferHostCache = VirtualMachineManager.VmConfigDriveForceHostCacheUse.valueIn(dest.getDataCenter().getId());
+        final HandleConfigDriveIsoCommand configDriveIsoCommand = new HandleConfigDriveIsoCommand(isoPath, isoData, dataStore.getTO(), useHostCacheOnUnsupportedPool, preferHostCache, true);
 
-        final Answer answer = agentManager.easySend(agentId, configDriveIsoCommand);
+        final HandleConfigDriveIsoAnswer answer = (HandleConfigDriveIsoAnswer) agentManager.easySend(agentId, configDriveIsoCommand);
         if (!answer.getResult()) {
             throw new ResourceUnavailableException(String.format("Config drive iso creation failed, details: %s",
                     answer.getDetails()), ConfigDriveNetworkElement.class, 0L);
         }
+        profile.setConfigDriveLocation(answer.getConfigDriveLocation());
+        _userVmDetailsDao.addDetail(profile.getId(), VmDetailConstants.CONFIG_DRIVE_LOCATION, answer.getConfigDriveLocation().toString(), false);
         addConfigDriveDisk(profile, dataStore);
         return true;
     }
@@ -526,28 +632,37 @@
     }
 
     private boolean deleteConfigDriveIso(final VirtualMachine vm) throws ResourceUnavailableException {
-        DataStore dataStore = _dataStoreMgr.getImageStoreWithFreeCapacity(vm.getDataCenterId());
-        Long agentId = findAgentIdForImageStore(dataStore);
+        Long hostId  = (vm.getHostId() != null) ? vm.getHostId() : vm.getLastHostId();
+        Location location = getConfigDriveLocation(vm.getId());
+        if (location == Location.HOST) {
+            return deleteConfigDriveIsoOnHostCache(vm, hostId);
+        }
 
-        if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
+        Long agentId = null;
+        DataStore dataStore = null;
+
+        if (location == Location.SECONDARY) {
+            dataStore = _dataStoreMgr.getImageStoreWithFreeCapacity(vm.getDataCenterId());
+            agentId = findAgentIdForImageStore(dataStore);
+        } else if (location == Location.PRIMARY) {
             List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(vm.getId(), Volume.Type.ROOT);
             if (volumes != null && volumes.size() > 0) {
                 dataStore = _dataStoreMgr.getDataStore(volumes.get(0).getPoolId(), DataStoreRole.Primary);
             }
-            agentId = (vm.getHostId() != null) ? vm.getHostId() : vm.getLastHostId();
+            agentId = hostId;
         }
 
         if (agentId == null || dataStore == null) {
-            throw new ResourceUnavailableException("Config drive iso creation failed, agent or datastore not available",
+            throw new ResourceUnavailableException("Config drive iso deletion failed, agent or datastore not available",
                     ConfigDriveNetworkElement.class, 0L);
         }
 
         LOG.debug("Deleting config drive ISO for vm: " + vm.getInstanceName());
 
         final String isoPath = ConfigDrive.createConfigDrivePath(vm.getInstanceName());
-        final HandleConfigDriveIsoCommand configDriveIsoCommand = new HandleConfigDriveIsoCommand(isoPath, null, dataStore.getTO(), false);
+        final HandleConfigDriveIsoCommand configDriveIsoCommand = new HandleConfigDriveIsoCommand(isoPath, null, dataStore.getTO(), false, false, false);
 
-        final Answer answer = agentManager.easySend(agentId, configDriveIsoCommand);
+        final HandleConfigDriveIsoAnswer answer = (HandleConfigDriveIsoAnswer) agentManager.easySend(agentId, configDriveIsoCommand);
         if (!answer.getResult()) {
             LOG.error("Failed to remove config drive for instance: " + vm.getInstanceName());
             return false;
@@ -566,11 +681,13 @@
         }
         if (!isoAvailable) {
             TemplateObjectTO dataTO = new TemplateObjectTO();
-            if (dataStore == null) {
+            if (dataStore == null && !isConfigDriveIsoOnHostCache(profile.getId())) {
                 throw new ResourceUnavailableException("Config drive disk add failed, datastore not available",
                         ConfigDriveNetworkElement.class, 0L);
+            } else if (dataStore != null) {
+                dataTO.setDataStore(dataStore.getTO());
             }
-            dataTO.setDataStore(dataStore.getTO());
+
             dataTO.setUuid(profile.getUuid());
             dataTO.setPath(isoPath);
             dataTO.setFormat(Storage.ImageFormat.ISO);
diff --git a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java
index 22811da..07a5635 100644
--- a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java
@@ -205,6 +205,13 @@
             if (userSpecified.getPvlanType() != null) {
                 config.setPvlanType(userSpecified.getPvlanType());
             }
+
+            if (userSpecified.getRouterIp() != null) {
+                config.setRouterIp(userSpecified.getRouterIp());
+            }
+            if (userSpecified.getRouterIpv6() != null) {
+                config.setRouterIpv6(userSpecified.getRouterIpv6());
+            }
         }
 
         boolean isSecurityGroupEnabled = _networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup);
diff --git a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
index 9751ddb..cc947bd 100644
--- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
+++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
@@ -27,6 +27,7 @@
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.log4j.Logger;
 import org.cloud.network.router.deployment.RouterDeploymentDefinition;
 
@@ -71,6 +72,9 @@
 import com.cloud.network.addr.PublicIp;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkDetailVO;
+import com.cloud.network.dao.NetworkDetailsDao;
+import com.cloud.network.dao.RouterHealthCheckResultDao;
 import com.cloud.network.dao.UserIpv6AddressDao;
 import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.network.router.VirtualRouter.RedundantState;
@@ -156,6 +160,10 @@
     ConfigurationDao _configDao;
     @Inject
     VpcVirtualNetworkApplianceManager _vpcRouterMgr;
+    @Inject
+    NetworkDetailsDao networkDetailsDao;
+    @Inject
+    RouterHealthCheckResultDao _routerHealthCheckResultDao;
 
     protected final Map<HypervisorType, ConfigKey<String>> hypervisorsMap = new HashMap<>();
 
@@ -254,6 +262,7 @@
         _accountMgr.checkAccess(caller, null, true, router);
 
         _itMgr.expunge(router.getUuid());
+        _routerHealthCheckResultDao.expungeHealthChecks(router.getId());
         _routerDao.remove(router.getId());
         return router;
     }
@@ -718,13 +727,19 @@
                                 + guestNetwork);
                         defaultNetworkStartIp = placeholder.getIPv4Address();
                     } else {
-                        final String startIp = _networkModel.getStartIpAddress(guestNetwork.getId());
-                        if (startIp != null
-                                && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) {
-                            defaultNetworkStartIp = startIp;
-                        } else if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("First ipv4 " + startIp + " in network id=" + guestNetwork.getId()
-                                    + " is already allocated, can't use it for domain router; will get random ip address from the range");
+                        NetworkDetailVO routerIpDetail = networkDetailsDao.findDetail(guestNetwork.getId(), ApiConstants.ROUTER_IP);
+                        String routerIp = routerIpDetail != null ? routerIpDetail.getValue() : null;
+                        if (routerIp != null) {
+                            defaultNetworkStartIp = routerIp;
+                        } else {
+                            final String startIp = _networkModel.getStartIpAddress(guestNetwork.getId());
+                            if (startIp != null
+                                    && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) {
+                                defaultNetworkStartIp = startIp;
+                            } else if (s_logger.isDebugEnabled()) {
+                                s_logger.debug("First ipv4 " + startIp + " in network id=" + guestNetwork.getId()
+                                        + " is already allocated, can't use it for domain router; will get random ip address from the range");
+                            }
                         }
                     }
                 }
@@ -735,12 +750,18 @@
                                 + guestNetwork);
                         defaultNetworkStartIpv6 = placeholder.getIPv6Address();
                     } else {
-                        final String startIpv6 = _networkModel.getStartIpv6Address(guestNetwork.getId());
-                        if (startIpv6 != null && _ipv6Dao.findByNetworkIdAndIp(guestNetwork.getId(), startIpv6) == null) {
-                            defaultNetworkStartIpv6 = startIpv6;
-                        } else if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("First ipv6 " + startIpv6 + " in network id=" + guestNetwork.getId()
-                                    + " is already allocated, can't use it for domain router; will get random ipv6 address from the range");
+                        NetworkDetailVO routerIpDetail = networkDetailsDao.findDetail(guestNetwork.getId(), ApiConstants.ROUTER_IPV6);
+                        String routerIpv6 = routerIpDetail != null ? routerIpDetail.getValue() : null;
+                        if (routerIpv6 != null) {
+                            defaultNetworkStartIpv6 = routerIpv6;
+                        } else {
+                            final String startIpv6 = _networkModel.getStartIpv6Address(guestNetwork.getId());
+                            if (startIpv6 != null && _ipv6Dao.findByNetworkIdAndIp(guestNetwork.getId(), startIpv6) == null) {
+                                defaultNetworkStartIpv6 = startIpv6;
+                            } else if (s_logger.isDebugEnabled()) {
+                                s_logger.debug("First ipv6 " + startIpv6 + " in network id=" + guestNetwork.getId()
+                                        + " is already allocated, can't use it for domain router; will get random ipv6 address from the range");
+                            }
                         }
                     }
                 }
diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java
index 26b2045..18f669e 100644
--- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -98,7 +98,7 @@
             false, ConfigKey.Scope.Global, null);
     static final ConfigKey<String> RouterHealthChecksFailuresToRecreateVr = new ConfigKey<String>(String.class, RouterHealthChecksFailuresToRecreateVrCK, "Advanced", "",
             "Health checks failures defined by this config are the checks that should cause router recreation. If empty the recreate is not attempted for any health check failure. Possible values are comma separated script names " +
-                    "from systemvm’s /root/health_scripts/ (namely - cpu_usage_check.py, dhcp_check.py, disk_space_check.py, dns_check.py, gateways_check.py, haproxy_check.py, iptables_check.py, memory_usage_check.py, router_version_check.py), connectivity.test " +
+                    "from systemvm’s /root/health_scripts/ (namely - cpu_usage_check.py, dhcp_check.py, disk_space_check.py, dns_check.py, gateways_check.py, haproxy_check.py, iptables_check.py, memory_usage_check.py, router_version_check.py), connectivity.test, filesystem.writable.test " +
                     " or services (namely - loadbalancing.service, webserver.service, dhcp.service) ",
             true, ConfigKey.Scope.Zone, null);
     static final ConfigKey<String> RouterHealthChecksToExclude = new ConfigKey<String>(String.class, "router.health.checks.to.exclude", "Advanced", "",
diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 1103ff9..8e38fb9 100644
--- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -280,6 +280,8 @@
 Configurable, StateListener<VirtualMachine.State, VirtualMachine.Event, VirtualMachine> {
     private static final Logger s_logger = Logger.getLogger(VirtualNetworkApplianceManagerImpl.class);
     private static final String CONNECTIVITY_TEST = "connectivity.test";
+    private static final String FILESYSTEM_WRITABLE_TEST = "filesystem.writable.test";
+    private static final String READONLY_FILESYSTEM_ERROR = "Read-only file system";
     private static final String BACKUP_ROUTER_EXCLUDED_TESTS = "gateways_check.py";
 
     @Inject private EntityManager _entityMgr;
@@ -1269,63 +1271,68 @@
                 ex.printStackTrace();
             }
         }
+    }
 
-        private List<String> getFailingChecks(DomainRouterVO router, GetRouterMonitorResultsAnswer answer) {
+    private List<String> getFailingChecks(DomainRouterVO router, GetRouterMonitorResultsAnswer answer) {
 
-            if (answer == null) {
-                s_logger.warn("Unable to fetch monitor results for router " + router);
-                resetRouterHealthChecksAndConnectivity(router.getId(), false, "Communication failed");
-                return Arrays.asList(CONNECTIVITY_TEST);
-            } else if (!answer.getResult()) {
-                s_logger.warn("Failed to fetch monitor results from router " + router + " with details: " + answer.getDetails());
-                resetRouterHealthChecksAndConnectivity(router.getId(), false, "Failed to fetch results with details: " + answer.getDetails());
-                return Arrays.asList(CONNECTIVITY_TEST);
+        if (answer == null) {
+            s_logger.warn("Unable to fetch monitor results for router " + router);
+            resetRouterHealthChecksAndConnectivity(router.getId(), false, false, "Communication failed");
+            return Arrays.asList(CONNECTIVITY_TEST);
+        } else if (!answer.getResult()) {
+            s_logger.warn("Failed to fetch monitor results from router " + router + " with details: " + answer.getDetails());
+            if (StringUtils.isNotBlank(answer.getDetails()) && answer.getDetails().equalsIgnoreCase(READONLY_FILESYSTEM_ERROR)) {
+                resetRouterHealthChecksAndConnectivity(router.getId(), true, false, "Failed to write: " + answer.getDetails());
+                return Arrays.asList(FILESYSTEM_WRITABLE_TEST);
             } else {
-                resetRouterHealthChecksAndConnectivity(router.getId(), true, "Successfully fetched data");
-                updateDbHealthChecksFromRouterResponse(router.getId(), answer.getMonitoringResults());
-                return answer.getFailingChecks();
+                resetRouterHealthChecksAndConnectivity(router.getId(), false, false, "Failed to fetch results with details: " + answer.getDetails());
+                return Arrays.asList(CONNECTIVITY_TEST);
+            }
+        } else {
+            resetRouterHealthChecksAndConnectivity(router.getId(), true, true, "Successfully fetched data");
+            updateDbHealthChecksFromRouterResponse(router.getId(), answer.getMonitoringResults());
+            return answer.getFailingChecks();
+        }
+    }
+
+    private void handleFailingChecks(DomainRouterVO router, List<String> failingChecks) {
+        if (failingChecks == null || failingChecks.size() == 0) {
+            return;
+        }
+
+        String alertMessage = "Health checks failed: " + failingChecks.size() + " failing checks on router " + router.getUuid();
+        _alertMgr.sendAlert(AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(),
+                alertMessage, alertMessage);
+        s_logger.warn(alertMessage + ". Checking failed health checks to see if router needs recreate");
+
+        String checkFailsToRecreateVr = RouterHealthChecksFailuresToRecreateVr.valueIn(router.getDataCenterId());
+        StringBuilder failingChecksEvent = new StringBuilder();
+        boolean recreateRouter = false;
+        for (int i = 0; i < failingChecks.size(); i++) {
+            String failedCheck = failingChecks.get(i);
+            if (i == 0) {
+                failingChecksEvent.append("Router ")
+                        .append(router.getUuid())
+                        .append(" has failing checks: ");
+            }
+
+            failingChecksEvent.append(failedCheck);
+            if (i < failingChecks.size() - 1) {
+                failingChecksEvent.append(", ");
+            }
+
+            if (StringUtils.isNotBlank(checkFailsToRecreateVr) && checkFailsToRecreateVr.contains(failedCheck)) {
+                recreateRouter = true;
             }
         }
 
-        private void handleFailingChecks(DomainRouterVO router, List<String> failingChecks) {
-            if (failingChecks == null || failingChecks.size() == 0) {
-                return;
-            }
+        ActionEventUtils.onActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM,
+                Domain.ROOT_DOMAIN, EventTypes.EVENT_ROUTER_HEALTH_CHECKS, failingChecksEvent.toString());
 
-            String alertMessage = "Health checks failed: " + failingChecks.size() + " failing checks on router " + router.getUuid();
-            _alertMgr.sendAlert(AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(),
-                    alertMessage, alertMessage);
-            s_logger.warn(alertMessage + ". Checking failed health checks to see if router needs recreate");
-
-            String checkFailsToRecreateVr = RouterHealthChecksFailuresToRecreateVr.valueIn(router.getDataCenterId());
-            StringBuilder failingChecksEvent = new StringBuilder();
-            boolean recreateRouter = false;
-            for (int i = 0; i < failingChecks.size(); i++) {
-                String failedCheck = failingChecks.get(i);
-                if (i == 0) {
-                    failingChecksEvent.append("Router ")
-                            .append(router.getUuid())
-                            .append(" has failing checks: ");
-                }
-
-                failingChecksEvent.append(failedCheck);
-                if (i < failingChecks.size() - 1) {
-                    failingChecksEvent.append(", ");
-                }
-
-                if (StringUtils.isNotBlank(checkFailsToRecreateVr) && checkFailsToRecreateVr.contains(failedCheck)) {
-                    recreateRouter = true;
-                }
-            }
-
-            ActionEventUtils.onActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM,
-                    Domain.ROOT_DOMAIN, EventTypes.EVENT_ROUTER_HEALTH_CHECKS, failingChecksEvent.toString());
-
-            if (recreateRouter) {
-                s_logger.warn("Health Check Alert: Found failing checks in " +
-                        RouterHealthChecksFailuresToRecreateVrCK + ", attempting recreating router.");
-                recreateRouter(router.getId());
-            }
+        if (recreateRouter) {
+            s_logger.warn("Health Check Alert: Found failing checks in " +
+                    RouterHealthChecksFailuresToRecreateVrCK + ", attempting recreating router.");
+            recreateRouter(router.getId());
         }
     }
 
@@ -1418,28 +1425,31 @@
         return healthCheckResults;
     }
 
-    private RouterHealthCheckResultVO resetRouterHealthChecksAndConnectivity(final long routerId, boolean connected, String message) {
+    private void resetRouterHealthChecksAndConnectivity(final long routerId, boolean connected, boolean writable, String message) {
         routerHealthCheckResultDao.expungeHealthChecks(routerId);
-        boolean newEntry = false;
-        RouterHealthCheckResultVO connectivityVO = routerHealthCheckResultDao.getRouterHealthCheckResult(routerId, CONNECTIVITY_TEST, "basic");
+        updateRouterHealthCheckResult(routerId, CONNECTIVITY_TEST, "basic", connected, connected ? "Successfully connected to router" : message);
+        updateRouterHealthCheckResult(routerId, FILESYSTEM_WRITABLE_TEST, "basic", writable, writable ? "Successfully written to file system" : message);
+    }
+
+    private void updateRouterHealthCheckResult(final long routerId, String checkName, String checkType, boolean checkResult, String checkMessage) {
+        boolean newHealthCheckEntry = false;
+        RouterHealthCheckResultVO connectivityVO = routerHealthCheckResultDao.getRouterHealthCheckResult(routerId, checkName, checkType);
         if (connectivityVO == null) {
-            connectivityVO = new RouterHealthCheckResultVO(routerId, CONNECTIVITY_TEST, "basic");
-            newEntry = true;
+            connectivityVO = new RouterHealthCheckResultVO(routerId, checkName, checkType);
+            newHealthCheckEntry = true;
         }
 
-        connectivityVO.setCheckResult(connected);
+        connectivityVO.setCheckResult(checkResult);
         connectivityVO.setLastUpdateTime(new Date());
-        if (StringUtils.isNotEmpty(message)) {
-            connectivityVO.setCheckDetails(message.getBytes(com.cloud.utils.StringUtils.getPreferredCharset()));
+        if (StringUtils.isNotEmpty(checkMessage)) {
+            connectivityVO.setCheckDetails(checkMessage.getBytes(com.cloud.utils.StringUtils.getPreferredCharset()));
         }
 
-        if (newEntry) {
+        if (newHealthCheckEntry) {
             routerHealthCheckResultDao.persist(connectivityVO);
         } else {
             routerHealthCheckResultDao.update(connectivityVO.getId(), connectivityVO);
         }
-
-        return routerHealthCheckResultDao.getRouterHealthCheckResult(routerId, CONNECTIVITY_TEST, "basic");
     }
 
     private RouterHealthCheckResultVO parseHealthCheckVOFromJson(final long routerId,
@@ -1544,7 +1554,7 @@
 
         String controlIP = getRouterControlIP(router);
         if (StringUtils.isNotBlank(controlIP) && !controlIP.equals("0.0.0.0")) {
-            final GetRouterMonitorResultsCommand command = new GetRouterMonitorResultsCommand(performFreshChecks);
+            final GetRouterMonitorResultsCommand command = new GetRouterMonitorResultsCommand(performFreshChecks, false);
             command.setAccessDetail(NetworkElementCommand.ROUTER_IP, controlIP);
             command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
             try {
@@ -1569,8 +1579,40 @@
         return null;
     }
 
+    private GetRouterMonitorResultsAnswer performBasicTestsOnRouter(DomainRouterVO router) {
+        if (!RouterHealthChecksEnabled.value()) {
+            return null;
+        }
+
+        String controlIP = getRouterControlIP(router);
+        if (StringUtils.isNotBlank(controlIP) && !controlIP.equals("0.0.0.0")) {
+            final GetRouterMonitorResultsCommand command = new GetRouterMonitorResultsCommand(false, true);
+            command.setAccessDetail(NetworkElementCommand.ROUTER_IP, controlIP);
+            command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+            try {
+                final Answer answer = _agentMgr.easySend(router.getHostId(), command);
+
+                if (answer == null) {
+                    s_logger.warn("Unable to fetch basic router test results data from router " + router.getHostName());
+                    return null;
+                }
+                if (answer instanceof GetRouterMonitorResultsAnswer) {
+                    return (GetRouterMonitorResultsAnswer) answer;
+                } else {
+                    s_logger.warn("Unable to fetch basic router test results from router " + router.getHostName() + " Received answer " + answer.getDetails());
+                    return new GetRouterMonitorResultsAnswer(command, false, null, answer.getDetails());
+                }
+            } catch (final Exception e) {
+                s_logger.warn("Error while performing basic tests on router: " + router.getInstanceName(), e);
+                return null;
+            }
+        }
+
+        return null;
+    }
+
     @Override
-    public boolean performRouterHealthChecks(long routerId) {
+    public Pair<Boolean, String> performRouterHealthChecks(long routerId) {
         DomainRouterVO router = _routerDao.findById(routerId);
 
         if (router == null) {
@@ -1583,29 +1625,45 @@
 
         s_logger.info("Running health check results for router " + router.getUuid());
 
-        final GetRouterMonitorResultsAnswer answer;
+        GetRouterMonitorResultsAnswer answer = null;
+        String resultDetails = "";
         boolean success = true;
-        // Step 1: Update health check data on router and perform and retrieve health checks on router
-        if (!updateRouterHealthChecksConfig(router)) {
-            s_logger.warn("Unable to update health check config for fresh run successfully for router: " + router + ", so trying to fetch last result.");
+
+        // Step 1: Perform basic tests to check the connectivity and file system on router
+        answer = performBasicTestsOnRouter(router);
+        if (answer == null) {
+            s_logger.debug("No results received for the basic tests on router: " + router);
+            resultDetails = "Basic tests results unavailable";
             success = false;
-            answer = fetchAndUpdateRouterHealthChecks(router, false);
+        } else if (!answer.getResult()) {
+            s_logger.debug("Basic tests failed on router: " + router);
+            resultDetails = "Basic tests failed - " + answer.getMonitoringResults();
+            success = false;
         } else {
-            s_logger.info("Successfully updated health check config for fresh run successfully for router: " + router);
-            answer = fetchAndUpdateRouterHealthChecks(router, true);
+            // Step 2: Update health check data on router and perform and retrieve health checks on router
+            if (!updateRouterHealthChecksConfig(router)) {
+                s_logger.warn("Unable to update health check config for fresh run successfully for router: " + router + ", so trying to fetch last result.");
+                success = false;
+                answer = fetchAndUpdateRouterHealthChecks(router, false);
+            } else {
+                s_logger.info("Successfully updated health check config for fresh run successfully for router: " + router);
+                answer = fetchAndUpdateRouterHealthChecks(router, true);
+            }
+
+            if (answer == null) {
+                resultDetails = "Failed to fetch and update health checks";
+                success = false;
+            } else if (!answer.getResult()) {
+                resultDetails = "Get health checks failed - " + answer.getMonitoringResults();
+                success = false;
+            }
         }
 
-        // Step 2: Update health checks values in database. We do this irrespective of new health check config.
-        if (answer == null || !answer.getResult()) {
-            success = false;
-            resetRouterHealthChecksAndConnectivity(routerId, false,
-                    answer == null ? "Communication failed " : "Failed to fetch results with details: " + answer.getDetails());
-        } else {
-            resetRouterHealthChecksAndConnectivity(routerId, true, "Successfully fetched data");
-            updateDbHealthChecksFromRouterResponse(routerId, answer.getMonitoringResults());
-        }
+        // Step 3: Update health checks values in database. We do this irrespective of new health check config.
+        List<String> failingChecks = getFailingChecks(router, answer);
+        handleFailingChecks(router, failingChecks);
 
-        return success;
+        return new Pair<Boolean, String>(success, resultDetails);
     }
 
     protected class UpdateRouterHealthChecksConfigTask extends ManagedContextRunnable {
@@ -1619,7 +1677,13 @@
                 s_logger.debug("Found " + routers.size() + " running routers. ");
 
                 for (final DomainRouterVO router : routers) {
-                    updateRouterHealthChecksConfig(router);
+                    GetRouterMonitorResultsAnswer answer = performBasicTestsOnRouter(router);
+                    if (answer != null && answer.getResult()) {
+                        updateRouterHealthChecksConfig(router);
+                    } else {
+                        String resultDetails = (answer == null) ? "" : ", " + answer.getMonitoringResults();
+                        s_logger.debug("Couldn't update health checks config on router: " + router + " as basic tests didn't succeed" + resultDetails);
+                    }
                 }
             } catch (final Exception ex) {
                 s_logger.error("Fail to complete the UpdateRouterHealthChecksConfigTask! ", ex);
@@ -1656,7 +1720,6 @@
             return false;
         }
 
-        SetMonitorServiceCommand command = createMonitorServiceCommand(router, null,true, true);
         String controlIP = getRouterControlIP(router);
         if (StringUtils.isBlank(controlIP) || controlIP.equals("0.0.0.0")) {
             s_logger.debug("Skipping update data on router " + router.getUuid() + " because controlIp is not correct.");
@@ -1666,6 +1729,7 @@
         s_logger.info("Updating data for router health checks for router " + router.getUuid());
         Answer origAnswer = null;
         try {
+            SetMonitorServiceCommand command = createMonitorServiceCommand(router, null, true, true);
             origAnswer = _agentMgr.easySend(router.getHostId(), command);
         } catch (final Exception e) {
             s_logger.error("Error while sending update data for health check to router: " + router.getInstanceName(), e);
diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index ca2fb00..a03e3de 100644
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@ -369,7 +369,7 @@
         final Long serviceOfferingId = cmd.getServiceOfferingId();
         final List<Long> domainIds = cmd.getDomainIds();
         final List<Long> zoneIds = cmd.getZoneIds();
-
+        final boolean enable = cmd.getEnable();
         // check if valid domain
         if (CollectionUtils.isNotEmpty(cmd.getDomainIds())) {
             for (final Long domainId: cmd.getDomainIds()) {
@@ -389,13 +389,13 @@
 
         return createVpcOffering(vpcOfferingName, displayText, supportedServices,
                 serviceProviderList, serviceCapabilitystList, serviceOfferingId,
-                domainIds, zoneIds);
+                domainIds, zoneIds, (enable ? State.Enabled : State.Disabled));
     }
 
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_CREATE, eventDescription = "creating vpc offering", create = true)
     public VpcOffering createVpcOffering(final String name, final String displayText, final List<String> supportedServices, final Map<String, List<String>> serviceProviders,
-            final Map serviceCapabilitystList, final Long serviceOfferingId, List<Long> domainIds, List<Long> zoneIds) {
+            final Map serviceCapabilitystList, final Long serviceOfferingId, List<Long> domainIds, List<Long> zoneIds, State state) {
 
         // Filter child domains when both parent and child domains are present
         List<Long> filteredDomainIds = filterChildSubDomains(domainIds);
@@ -475,7 +475,7 @@
         final boolean supportsDistributedRouter = isVpcOfferingSupportsDistributedRouter(serviceCapabilitystList);
         final boolean offersRegionLevelVPC = isVpcOfferingForRegionLevelVpc(serviceCapabilitystList);
         final boolean redundantRouter = isVpcOfferingRedundantRouter(serviceCapabilitystList);
-        final VpcOffering offering = createVpcOffering(name, displayText, svcProviderMap, false, null, serviceOfferingId, supportsDistributedRouter, offersRegionLevelVPC,
+        final VpcOfferingVO offering = createVpcOffering(name, displayText, svcProviderMap, false, state, serviceOfferingId, supportsDistributedRouter, offersRegionLevelVPC,
                 redundantRouter);
 
         if (offering != null) {
@@ -498,13 +498,13 @@
     }
 
     @DB
-    protected VpcOffering createVpcOffering(final String name, final String displayText, final Map<Network.Service, Set<Network.Provider>> svcProviderMap,
+    protected VpcOfferingVO createVpcOffering(final String name, final String displayText, final Map<Network.Service, Set<Network.Provider>> svcProviderMap,
             final boolean isDefault, final State state, final Long serviceOfferingId, final boolean supportsDistributedRouter, final boolean offersRegionLevelVPC,
             final boolean redundantRouter) {
 
-        return Transaction.execute(new TransactionCallback<VpcOffering>() {
+        return Transaction.execute(new TransactionCallback<VpcOfferingVO>() {
             @Override
-            public VpcOffering doInTransaction(final TransactionStatus status) {
+            public VpcOfferingVO doInTransaction(final TransactionStatus status) {
                 // create vpc offering object
                 VpcOfferingVO offering = new VpcOfferingVO(name, displayText, isDefault, serviceOfferingId, supportsDistributedRouter, offersRegionLevelVPC, redundantRouter);
 
@@ -2596,7 +2596,7 @@
 
         // 2) Create network
         final Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId, false, networkDomain, owner, domainId, pNtwk, zoneId, aclType,
-                                                                 subdomainAccess, vpcId, null, null, isDisplayNetworkEnabled, null, null, externalId);
+                                                                 subdomainAccess, vpcId, null, null, isDisplayNetworkEnabled, null, null, externalId, null, null);
 
         if (guestNetwork != null) {
             guestNetwork.setNetworkACLId(aclId);
diff --git a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
index f2a3caa..f245502 100755
--- a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
@@ -3030,12 +3030,15 @@
     }
 
     @Override
-    public HostVO findOneRandomRunningHostByHypervisor(HypervisorType type) {
+    public HostVO findOneRandomRunningHostByHypervisor(final HypervisorType type, final Long dcId) {
         final QueryBuilder<HostVO> sc = QueryBuilder.create(HostVO.class);
         sc.and(sc.entity().getHypervisorType(), Op.EQ, type);
         sc.and(sc.entity().getType(),Op.EQ, Type.Routing);
         sc.and(sc.entity().getStatus(), Op.EQ, Status.Up);
         sc.and(sc.entity().getResourceState(), Op.EQ, ResourceState.Enabled);
+        if (dcId != null) {
+            sc.and(sc.entity().getDataCenterId(), Op.EQ, dcId);
+        }
         sc.and(sc.entity().getRemoved(), Op.NULL);
         List<HostVO> hosts = sc.list();
         if (CollectionUtils.isEmpty(hosts)) {
diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
index 8f0007a..3ef1c20 100644
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@ -30,10 +30,13 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.TimeZone;
+import java.util.UUID;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
+
+
 import java.util.stream.Collectors;
 
 import javax.crypto.Mac;
@@ -733,6 +736,7 @@
     static final ConfigKey<Integer> vmPasswordLength = new ConfigKey<Integer>("Advanced", Integer.class, "vm.password.length", "6", "Specifies the length of a randomly generated password", false);
     static final ConfigKey<Integer> sshKeyLength = new ConfigKey<Integer>("Advanced", Integer.class, "ssh.key.length", "2048", "Specifies custom SSH key length (bit)", true, ConfigKey.Scope.Global);
     static final ConfigKey<Boolean> humanReadableSizes = new ConfigKey<Boolean>("Advanced", Boolean.class, "display.human.readable.sizes", "true", "Enables outputting human readable byte sizes to logs and usage records.", false, ConfigKey.Scope.Global);
+    public static final ConfigKey<String> customCsIdentifier = new ConfigKey<String>("Advanced", String.class, "custom.cs.identifier", UUID.randomUUID().toString().split("-")[0].substring(4), "Custom identifier for the cloudstack installation", true, ConfigKey.Scope.Global);
 
     @Inject
     public AccountManager _accountMgr;
@@ -1258,15 +1262,16 @@
             ex.addProxyObject(vm.getUuid(), "vmId");
             throw ex;
         }
+        String srcHostVersion = srcHost.getHypervisorVersion();
+        if (HypervisorType.KVM.equals(srcHost.getHypervisorType()) && srcHostVersion == null) {
+            srcHostVersion = "";
+        }
 
         // Check if the vm can be migrated with storage.
         boolean canMigrateWithStorage = false;
 
-        if (vm.getType() == VirtualMachine.Type.User) {
-            final HypervisorCapabilitiesVO capabilities = _hypervisorCapabilitiesDao.findByHypervisorTypeAndVersion(srcHost.getHypervisorType(), srcHost.getHypervisorVersion());
-            if (capabilities != null) {
-                canMigrateWithStorage = capabilities.isStorageMotionSupported();
-            }
+        if (VirtualMachine.Type.User.equals(vm.getType()) || HypervisorType.VMware.equals(vm.getHypervisorType())) {
+            canMigrateWithStorage = Boolean.TRUE.equals(_hypervisorCapabilitiesDao.isStorageMotionSupported(srcHost.getHypervisorType(), srcHostVersion));
         }
 
         // Check if the vm is using any disks on local storage.
@@ -1293,8 +1298,9 @@
         final Map<Host, Boolean> requiresStorageMotion = new HashMap<Host, Boolean>();
         DataCenterDeployment plan = null;
         if (canMigrateWithStorage) {
-            allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null, null, null, keyword,
-                null, null, srcHost.getHypervisorType(), srcHost.getHypervisorVersion(), srcHost.getId());
+            Long podId = !VirtualMachine.Type.User.equals(vm.getType()) ? srcHost.getPodId() : null;
+            allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), podId, null, null, keyword,
+                null, null, srcHost.getHypervisorType(), null, srcHost.getId());
             allHosts = allHostsPair.first();
             hostsForMigrationWithStorage = new ArrayList<>(allHosts);
 
@@ -1304,6 +1310,10 @@
 
                 for (Iterator<HostVO> iterator = hostsForMigrationWithStorage.iterator(); iterator.hasNext();) {
                     final Host host = iterator.next();
+                    String hostVersion = host.getHypervisorVersion();
+                    if (HypervisorType.KVM.equals(host.getHypervisorType()) && hostVersion == null) {
+                        hostVersion = "";
+                    }
 
                     if (volClusterId != null) {
                         if (storagePool.isLocal() || !host.getClusterId().equals(volClusterId) || usesLocal) {
@@ -1315,7 +1325,12 @@
                                 // source volume.
                                 iterator.remove();
                             } else {
-                                if (hasSuitablePoolsForVolume(volume, host, vmProfile)) {
+                                boolean hostSupportsStorageMigration = false;
+                                if ((srcHostVersion != null && srcHostVersion.equals(hostVersion)) ||
+                                        Boolean.TRUE.equals(_hypervisorCapabilitiesDao.isStorageMotionSupported(host.getHypervisorType(), hostVersion))) {
+                                    hostSupportsStorageMigration = true;
+                                }
+                                if (hostSupportsStorageMigration && hasSuitablePoolsForVolume(volume, host, vmProfile)) {
                                     requiresStorageMotion.put(host, true);
                                 } else {
                                     iterator.remove();
@@ -1325,6 +1340,11 @@
                     } else {
                         if (storagePool.isManaged()) {
                             if (srcHost.getClusterId() != host.getClusterId()) {
+                                if (storagePool.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                                    // No need of new volume creation for zone wide PowerFlex/ScaleIO pool
+                                    // Simply, changing volume access to host should work: grant access on dest host and revoke access on source host
+                                    continue;
+                                }
                                 // If the volume's storage pool is managed and at the zone level, then we still have to perform a storage migration
                                 // because we need to create a new target volume and copy the contents of the source volume into it before deleting
                                 // the source volume.
@@ -1335,7 +1355,7 @@
                 }
             }
 
-            plan = new DataCenterDeployment(srcHost.getDataCenterId(), null, null, null, null, null);
+            plan = new DataCenterDeployment(srcHost.getDataCenterId(), podId, null, null, null, null);
         } else {
             final Long cluster = srcHost.getClusterId();
             if (s_logger.isDebugEnabled()) {
@@ -1570,6 +1590,7 @@
                 storagePools.addAll(clusterAndLocalStoragePools);
             }
         }
+
         return storagePools;
     }
 
@@ -1609,7 +1630,6 @@
                 if (isLocalPoolSameHostAsVmHost || pool.isShared()) {
                     suitablePools.add(pool);
                 }
-
             }
         }
         return suitablePools;
@@ -3279,7 +3299,7 @@
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {vmPasswordLength, sshKeyLength, humanReadableSizes};
+        return new ConfigKey<?>[] {vmPasswordLength, sshKeyLength, humanReadableSizes, customCsIdentifier};
     }
 
     protected class EventPurgeTask extends ManagedContextRunnable {
diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java b/server/src/main/java/com/cloud/server/StatsCollector.java
index 86db544..d78a106 100644
--- a/server/src/main/java/com/cloud/server/StatsCollector.java
+++ b/server/src/main/java/com/cloud/server/StatsCollector.java
@@ -110,6 +110,7 @@
 import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.ImageStoreDetailsUtil;
 import com.cloud.storage.ScopeType;
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StorageStats;
@@ -931,7 +932,7 @@
                 for (StoragePoolVO pool : pools) {
                     List<VolumeVO> volumes = _volsDao.findByPoolId(pool.getId(), null);
                     for (VolumeVO volume : volumes) {
-                        if (volume.getFormat() != ImageFormat.QCOW2 && volume.getFormat() != ImageFormat.VHD && volume.getFormat() != ImageFormat.OVA) {
+                        if (volume.getFormat() != ImageFormat.QCOW2 && volume.getFormat() != ImageFormat.VHD && volume.getFormat() != ImageFormat.OVA && (volume.getFormat() != ImageFormat.RAW || pool.getPoolType() != Storage.StoragePoolType.PowerFlex)) {
                             s_logger.warn("Volume stats not implemented for this format type " + volume.getFormat());
                             break;
                         }
diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index 96589f1..a7cc772 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -111,7 +111,12 @@
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.DeleteStoragePoolCommand;
+import com.cloud.agent.api.GetStorageStatsAnswer;
+import com.cloud.agent.api.GetStorageStatsCommand;
+import com.cloud.agent.api.GetVolumeStatsAnswer;
+import com.cloud.agent.api.GetVolumeStatsCommand;
 import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.agent.api.VolumeStatsEntry;
 import com.cloud.agent.api.to.DataTO;
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.agent.manager.Commands;
@@ -442,6 +447,12 @@
 
     @Override
     public Answer sendToPool(StoragePool pool, Command cmd) throws StorageUnavailableException {
+        if (cmd instanceof GetStorageStatsCommand && pool.getPoolType() == StoragePoolType.PowerFlex) {
+            // Get stats from the pool directly instead of sending cmd to host
+            // Added support for ScaleIO/PowerFlex pool only
+            return getStoragePoolStats(pool, (GetStorageStatsCommand) cmd);
+        }
+
         Answer[] answers = sendToPool(pool, new Commands(cmd));
         if (answers == null) {
             return null;
@@ -449,6 +460,52 @@
         return answers[0];
     }
 
+    private GetStorageStatsAnswer getStoragePoolStats(StoragePool pool, GetStorageStatsCommand cmd) {
+        DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+        DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
+        GetStorageStatsAnswer answer = null;
+
+        if (storeDriver instanceof PrimaryDataStoreDriver && ((PrimaryDataStoreDriver)storeDriver).canProvideStorageStats()) {
+            PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver)storeDriver;
+            Pair<Long, Long> storageStats = primaryStoreDriver.getStorageStats(pool);
+            if (storageStats == null) {
+                answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, "Failed to get storage stats for pool: " + pool.getId());
+            } else {
+                answer = new GetStorageStatsAnswer((GetStorageStatsCommand) cmd, storageStats.first(), storageStats.second());
+            }
+        }
+
+        return answer;
+    }
+
+    @Override
+    public Answer getVolumeStats(StoragePool pool, Command cmd) {
+        if (!(cmd instanceof GetVolumeStatsCommand)) {
+            return null;
+        }
+
+        DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+        DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
+
+        if (storeDriver instanceof PrimaryDataStoreDriver && ((PrimaryDataStoreDriver)storeDriver).canProvideVolumeStats()) {
+            PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver)storeDriver;
+            HashMap<String, VolumeStatsEntry> statEntry = new HashMap<String, VolumeStatsEntry>();
+            GetVolumeStatsCommand getVolumeStatsCommand = (GetVolumeStatsCommand) cmd;
+            for (String volumeUuid : getVolumeStatsCommand.getVolumeUuids()) {
+                Pair<Long, Long> volumeStats = primaryStoreDriver.getVolumeStats(pool, volumeUuid);
+                if (volumeStats == null) {
+                    return new GetVolumeStatsAnswer(getVolumeStatsCommand, "Failed to get stats for volume: " + volumeUuid, null);
+                } else {
+                    VolumeStatsEntry volumeStatsEntry = new VolumeStatsEntry(volumeUuid, volumeStats.first(), volumeStats.second());
+                    statEntry.put(volumeUuid, volumeStatsEntry);
+                }
+            }
+            return new GetVolumeStatsAnswer(getVolumeStatsCommand, "", statEntry);
+        }
+
+        return null;
+    }
+
     public Long chooseHostForStoragePool(StoragePoolVO poolVO, List<Long> avoidHosts, boolean sendToVmResidesOn, Long vmId) {
         if (sendToVmResidesOn) {
             if (vmId != null) {
@@ -1029,6 +1086,17 @@
     }
 
     @Override
+    public void disconnectHostFromSharedPool(long hostId, long poolId) throws StorageUnavailableException, StorageConflictException {
+        StoragePool pool = (StoragePool)_dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);
+        assert (pool.isShared()) : "Now, did you actually read the name of this method?";
+        s_logger.debug("Removing pool " + pool.getName() + " from  host " + hostId);
+
+        DataStoreProvider provider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+        HypervisorHostListener listener = hostListeners.get(provider.getName());
+        listener.hostDisconnected(hostId, pool.getId());
+    }
+
+    @Override
     public BigDecimal getStorageOverProvisioningFactor(Long poolId) {
         return new BigDecimal(CapacityManager.StorageOverprovisioningFactor.valueIn(poolId));
     }
@@ -1215,6 +1283,7 @@
                         try {
                             VolumeInfo volumeInfo = volFactory.getVolume(vol.getId());
                             if (volumeInfo != null) {
+                                volService.ensureVolumeIsExpungeReady(vol.getId());
                                 volService.expungeVolumeAsync(volumeInfo);
                             } else {
                                 s_logger.debug("Volume " + vol.getUuid() + " is already destroyed");
@@ -1350,6 +1419,9 @@
 
             if (storagePool != null && storagePool.isManaged()) {
                 VMInstanceVO vmInstanceVO = _vmInstanceDao.findById(instanceId);
+                if (vmInstanceVO == null) {
+                    return;
+                }
 
                 Long lastHostId = vmInstanceVO.getLastHostId();
 
@@ -1773,6 +1845,70 @@
     }
 
     @Override
+    public Host findUpAndEnabledHostWithAccessToStoragePools(List<Long> poolIds) {
+        List<Long> hostIds = _storagePoolHostDao.findHostsConnectedToPools(poolIds);
+        if (hostIds.isEmpty()) {
+            return null;
+        }
+
+        for (Long hostId : hostIds) {
+            Host host = _hostDao.findById(hostId);
+            if (canHostAccessStoragePools(host, poolIds)) {
+                return host;
+            }
+        }
+
+        return null;
+    }
+
+    private boolean canHostAccessStoragePools(Host host, List<Long> poolIds) {
+        if (poolIds == null || poolIds.isEmpty()) {
+            return false;
+        }
+
+        for (Long poolId : poolIds) {
+            StoragePool pool = _storagePoolDao.findById(poolId);
+            if (!canHostAccessStoragePool(host, pool)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    @DB
+    public List<StoragePoolHostVO> findStoragePoolsConnectedToHost(long hostId) {
+        return _storagePoolHostDao.listByHostId(hostId);
+    }
+
+    @Override
+    public boolean canHostAccessStoragePool(Host host, StoragePool pool) {
+        if (host == null || pool == null) {
+            return false;
+        }
+
+        if (!pool.isManaged()) {
+            return true;
+        }
+
+        DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
+        DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
+
+        if (storeDriver instanceof PrimaryDataStoreDriver && ((PrimaryDataStoreDriver)storeDriver).canHostAccessStoragePool(host, pool)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    @DB
+    public Host getHost(long hostId) {
+        return _hostDao.findById(hostId);
+    }
+
+    @Override
     public Host updateSecondaryStorage(long secStorageId, String newUrl) {
         HostVO secHost = _hostDao.findById(secStorageId);
         if (secHost == null) {
@@ -1847,7 +1983,8 @@
 
     private boolean checkUsagedSpace(StoragePool pool) {
         // Managed storage does not currently deal with accounting for physically used space (only provisioned space). Just return true if "pool" is managed.
-        if (pool.isManaged()) {
+        // StatsCollector gets the storage stats from the ScaleIO/PowerFlex pool directly, limit the usage based on the capacity disable threshold
+        if (pool.isManaged() && pool.getPoolType() != StoragePoolType.PowerFlex) {
             return true;
         }
 
@@ -1965,14 +2102,14 @@
     }
 
     @Override
-    public boolean storagePoolHasEnoughSpaceForResize(StoragePool pool, long currentSize, long newSiz) {
+    public boolean storagePoolHasEnoughSpaceForResize(StoragePool pool, long currentSize, long newSize) {
         if (!checkUsagedSpace(pool)) {
             return false;
         }
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Destination pool id: " + pool.getId());
         }
-        long totalAskingSize = newSiz - currentSize;
+        long totalAskingSize = newSize - currentSize;
 
         if (totalAskingSize <= 0) {
             return true;
@@ -2147,6 +2284,10 @@
     }
 
     private long getBytesRequiredForTemplate(VMTemplateVO tmpl, StoragePool pool) {
+        if (tmplFactory.isTemplateMarkedForDirectDownload(tmpl.getId())) {
+            return tmpl.getSize();
+        }
+
         DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
         DataStoreDriver storeDriver = storeProvider.getDataStoreDriver();
 
@@ -2162,6 +2303,36 @@
     }
 
     @Override
+    public boolean storagePoolCompatibleWithVolumePool(StoragePool pool, Volume volume) {
+        if (pool == null || volume == null) {
+            return false;
+        }
+
+        if (volume.getPoolId() == null) {
+            // Volume is not allocated to any pool. Not possible to check compatibility with other pool, let it try
+            return true;
+        }
+
+        StoragePool volumePool = _storagePoolDao.findById(volume.getPoolId());
+        if (volumePool == null) {
+            // Volume pool doesn't exist. Not possible to check compatibility with other pool, let it try
+            return true;
+        }
+
+        if (volume.getState() == Volume.State.Ready) {
+            if (volumePool.getPoolType() == Storage.StoragePoolType.PowerFlex && pool.getPoolType() != Storage.StoragePoolType.PowerFlex) {
+                return false;
+            } else if (volumePool.getPoolType() != Storage.StoragePoolType.PowerFlex && pool.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                return false;
+            }
+        } else {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
     public void createCapacityEntry(long poolId) {
         StoragePoolVO storage = _storagePoolDao.findById(poolId);
         createCapacityEntry(storage, Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED, 0);
@@ -2685,6 +2856,8 @@
                 KvmStorageOnlineMigrationWait,
                 KvmAutoConvergence,
                 MaxNumberOfManagedClusteredFileSystems,
+                STORAGE_POOL_DISK_WAIT,
+                STORAGE_POOL_CLIENT_TIMEOUT,
                 PRIMARY_STORAGE_DOWNLOAD_WAIT,
                 SecStorageMaxMigrateSessions,
                 MaxDataMigrationWaitTime
diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
index 0adeb83..6f362a7 100644
--- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
@@ -70,11 +70,15 @@
 import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl;
 import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
 import org.apache.cloudstack.jobs.JobInfo;
+import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO;
+import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
 import org.apache.cloudstack.storage.command.AttachAnswer;
 import org.apache.cloudstack.storage.command.AttachCommand;
 import org.apache.cloudstack.storage.command.DettachCommand;
 import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommand;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
@@ -129,6 +133,7 @@
 import com.cloud.storage.dao.StoragePoolTagsDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.dao.VolumeDetailsDao;
 import com.cloud.storage.snapshot.SnapshotApiService;
 import com.cloud.storage.snapshot.SnapshotManager;
 import com.cloud.template.TemplateManager;
@@ -211,10 +216,14 @@
     @Inject
     private VolumeDao _volsDao;
     @Inject
+    private VolumeDetailsDao _volsDetailsDao;
+    @Inject
     private HostDao _hostDao;
     @Inject
     private SnapshotDao _snapshotDao;
     @Inject
+    private SnapshotDataStoreDao _snapshotDataStoreDao;
+    @Inject
     private ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
     @Inject
     private UserVmDao _userVmDao;
@@ -229,6 +238,8 @@
     @Inject
     private DiskOfferingDao _diskOfferingDao;
     @Inject
+    private DiskOfferingDetailsDao _diskOfferingDetailsDao;
+    @Inject
     private AccountDao _accountDao;
     @Inject
     private DataCenterDao _dcDao;
@@ -590,6 +601,7 @@
             parentVolume = null;
         }
 
+        Map<String, String> details = new HashMap<>();
         if (cmd.getDiskOfferingId() != null) { // create a new volume
 
             diskOfferingId = cmd.getDiskOfferingId();
@@ -631,6 +643,15 @@
                 size = diskOffering.getDiskSize();
             }
 
+            DiskOfferingDetailVO bandwidthLimitDetail = _diskOfferingDetailsDao.findDetail(diskOfferingId, Volume.BANDWIDTH_LIMIT_IN_MBPS);
+            if (bandwidthLimitDetail != null) {
+                details.put(Volume.BANDWIDTH_LIMIT_IN_MBPS, bandwidthLimitDetail.getValue());
+            }
+            DiskOfferingDetailVO iopsLimitDetail = _diskOfferingDetailsDao.findDetail(diskOfferingId, Volume.IOPS_LIMIT);
+            if (iopsLimitDetail != null) {
+                details.put(Volume.IOPS_LIMIT, iopsLimitDetail.getValue());
+            }
+
             Boolean isCustomizedIops = diskOffering.isCustomizedIops();
 
             if (isCustomizedIops != null) {
@@ -658,6 +679,9 @@
                     minIops = diskOffering.getMinIops();
                     maxIops = diskOffering.getMaxIops();
                 }
+            } else {
+                minIops = diskOffering.getMinIops();
+                maxIops = diskOffering.getMaxIops();
             }
 
             if (!validateVolumeSizeRange(size)) {// convert size from mb to gb
@@ -676,6 +700,15 @@
             if (snapshotCheck.getState() != Snapshot.State.BackedUp) {
                 throw new InvalidParameterValueException("Snapshot id=" + snapshotId + " is not in " + Snapshot.State.BackedUp + " state yet and can't be used for volume creation");
             }
+
+            SnapshotDataStoreVO snapshotStore = _snapshotDataStoreDao.findBySnapshot(snapshotId, DataStoreRole.Primary);
+            if (snapshotStore != null) {
+                StoragePoolVO storagePoolVO = _storagePoolDao.findById(snapshotStore.getDataStoreId());
+                if (storagePoolVO.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                    throw new InvalidParameterValueException("Create volume from snapshot is not supported for PowerFlex volume snapshots");
+                }
+            }
+
             parentVolume = _volsDao.findByIdIncludingRemoved(snapshotCheck.getVolumeId());
 
             if (zoneId == null) {
@@ -747,11 +780,11 @@
         String userSpecifiedName = getVolumeNameFromCommand(cmd);
 
         return commitVolume(cmd, caller, owner, displayVolume, zoneId, diskOfferingId, provisioningType, size, minIops, maxIops, parentVolume, userSpecifiedName,
-                _uuidMgr.generateUuid(Volume.class, cmd.getCustomId()));
+                _uuidMgr.generateUuid(Volume.class, cmd.getCustomId()), details);
     }
 
     private VolumeVO commitVolume(final CreateVolumeCmd cmd, final Account caller, final Account owner, final Boolean displayVolume, final Long zoneId, final Long diskOfferingId,
-            final Storage.ProvisioningType provisioningType, final Long size, final Long minIops, final Long maxIops, final VolumeVO parentVolume, final String userSpecifiedName, final String uuid) {
+            final Storage.ProvisioningType provisioningType, final Long size, final Long minIops, final Long maxIops, final VolumeVO parentVolume, final String userSpecifiedName, final String uuid, final Map<String, String> details) {
         return Transaction.execute(new TransactionCallback<VolumeVO>() {
             @Override
             public VolumeVO doInTransaction(TransactionStatus status) {
@@ -783,6 +816,19 @@
                             Volume.class.getName(), volume.getUuid(), displayVolume);
                 }
 
+                if (volume != null && details != null) {
+                    List<VolumeDetailVO> volumeDetailsVO = new ArrayList<VolumeDetailVO>();
+                    if (details.containsKey(Volume.BANDWIDTH_LIMIT_IN_MBPS)) {
+                        volumeDetailsVO.add(new VolumeDetailVO(volume.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS, details.get(Volume.BANDWIDTH_LIMIT_IN_MBPS), false));
+                    }
+                    if (details.containsKey(Volume.IOPS_LIMIT)) {
+                        volumeDetailsVO.add(new VolumeDetailVO(volume.getId(), Volume.IOPS_LIMIT, details.get(Volume.IOPS_LIMIT), false));
+                    }
+                    if (!volumeDetailsVO.isEmpty()) {
+                        _volsDetailsDao.saveDetails(volumeDetailsVO);
+                    }
+                }
+
                 CallContext.current().setEventDetails("Volume Id: " + volume.getUuid());
 
                 // Increment resource count during allocation; if actual creation fails,
@@ -962,7 +1008,7 @@
                 newMaxIops = volume.getMaxIops();
             }
 
-            validateIops(newMinIops, newMaxIops);
+            validateIops(newMinIops, newMaxIops, volume.getPoolType());
         } else {
             if (newDiskOffering.getRemoved() != null) {
                 throw new InvalidParameterValueException("Requested disk offering has been removed.");
@@ -1005,7 +1051,7 @@
                 newMinIops = cmd.getMinIops() != null ? cmd.getMinIops() : volume.getMinIops();
                 newMaxIops = cmd.getMaxIops() != null ? cmd.getMaxIops() : volume.getMaxIops();
 
-                validateIops(newMinIops, newMaxIops);
+                validateIops(newMinIops, newMaxIops, volume.getPoolType());
             } else {
                 newMinIops = newDiskOffering.getMinIops();
                 newMaxIops = newDiskOffering.getMaxIops();
@@ -1155,7 +1201,12 @@
         }
     }
 
-    private void validateIops(Long minIops, Long maxIops) {
+    private void validateIops(Long minIops, Long maxIops, Storage.StoragePoolType poolType) {
+        if (poolType == Storage.StoragePoolType.PowerFlex) {
+            // PowerFlex takes iopsLimit as input, skip minIops validation
+            minIops = (maxIops != null) ? Long.valueOf(0) : null;
+        }
+
         if ((minIops == null && maxIops != null) || (minIops != null && maxIops == null)) {
             throw new InvalidParameterValueException("Either 'miniops' and 'maxiops' must both be provided or neither must be provided.");
         }
@@ -1266,7 +1317,9 @@
                 volume.setDiskOfferingId(newDiskOfferingId);
             }
 
-            if (currentSize != newSize) {
+            // Update size if volume has same size as before, else it is already updated
+            final VolumeVO volumeNow = _volsDao.findById(volumeId);
+            if (currentSize == volumeNow.getSize() && currentSize != newSize) {
                 volume.setSize(newSize);
             }
 
@@ -1283,9 +1336,8 @@
                     volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
 
             return volume;
-
         } catch (Exception e) {
-            throw new CloudRuntimeException("Exception caught during resize volume operation of volume UUID: " + volume.getUuid(), e);
+            throw new CloudRuntimeException("Couldn't resize volume: " + volume.getName() + ", " + e.getMessage(), e);
         }
     }
 
@@ -2219,6 +2271,12 @@
             if (_serviceOfferingDetailsDao.findDetail(vm.getServiceOfferingId(), GPU.Keys.pciDevice.toString()) != null) {
                 throw new InvalidParameterValueException("Live Migration of GPU enabled VM is not supported");
             }
+
+            StoragePoolVO storagePoolVO = _storagePoolDao.findById(vol.getPoolId());
+            if (storagePoolVO.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                throw new InvalidParameterValueException("Migrate volume of a running VM is unsupported on storage pool type " + storagePoolVO.getPoolType());
+            }
+
             // Check if the underlying hypervisor supports storage motion.
             Long hostId = vm.getHostId();
             if (hostId != null) {
@@ -2265,6 +2323,10 @@
             destPool = _volumeMgr.findChildDataStoreInDataStoreCluster(dc, destPoolPod, destPool.getClusterId(), null, null, destPool.getId());
         }
 
+        if (!storageMgr.storagePoolCompatibleWithVolumePool(destPool, (Volume) vol)) {
+            throw new CloudRuntimeException("Storage pool " + destPool.getName() + " is not suitable to migrate volume " + vol.getName());
+        }
+
         if (!storageMgr.storagePoolHasEnoughSpace(Collections.singletonList(vol), destPool)) {
             throw new CloudRuntimeException("Storage pool " + destPool.getName() + " does not have enough space to migrate volume " + vol.getName());
         }
@@ -2739,6 +2801,10 @@
             throw new InvalidParameterValueException("VolumeId: " + volumeId + " please attach this volume to a VM before create snapshot for it");
         }
 
+        if (storagePool.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+            throw new InvalidParameterValueException("Cannot perform this operation, unsupported on storage pool type " + storagePool.getPoolType());
+        }
+
         return snapshotMgr.allocSnapshot(volumeId, Snapshot.MANUAL_POLICY_ID, snapshotName, null);
     }
 
@@ -2769,7 +2835,13 @@
         }
         if (volume.getPoolId() == null) {
             throw new InvalidParameterValueException("The volume doesn't belong to a storage pool so can't extract it");
+        } else {
+            StoragePoolVO poolVO = _storagePoolDao.findById(volume.getPoolId());
+            if (poolVO != null && poolVO.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                throw new InvalidParameterValueException("Cannot extract volume, this operation is unsupported for volumes on storage pool type " + poolVO.getPoolType());
+            }
         }
+
         // Extract activity only for detached volumes or for volumes whose
         // instance is stopped
         if (volume.getInstanceId() != null && ApiDBUtils.findVMInstanceById(volume.getInstanceId()).getState() != State.Stopped) {
@@ -3151,6 +3223,7 @@
                 details.put(DiskTO.IQN, volumeToAttach.get_iScsiName());
                 details.put(DiskTO.MOUNT_POINT, volumeToAttach.get_iScsiName());
                 details.put(DiskTO.PROTOCOL_TYPE, (volumeToAttach.getPoolType() != null) ? volumeToAttach.getPoolType().toString() : null);
+                details.put(StorageManager.STORAGE_POOL_DISK_WAIT.toString(), String.valueOf(StorageManager.STORAGE_POOL_DISK_WAIT.valueIn(volumeToAttachStoragePool.getId())));
 
                 if (chapInfo != null) {
                     details.put(DiskTO.CHAP_INITIATOR_USERNAME, chapInfo.getInitiatorUsername());
@@ -3216,6 +3289,11 @@
                         volumeToAttach.setPath(volumeToAttach.get_iScsiName());
                         _volsDao.update(volumeToAttach.getId(), volumeToAttach);
                     }
+
+                    if (host != null && volumeToAttachStoragePool.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+                        // Unmap the volume on PowerFlex/ScaleIO pool for stopped VM
+                        volService.revokeAccess(volFactory.getVolume(volumeToAttach.getId()), host, dataStore);
+                    }
                 }
 
                 // insert record for disk I/O statistics
diff --git a/server/src/main/java/com/cloud/storage/listener/StoragePoolMonitor.java b/server/src/main/java/com/cloud/storage/listener/StoragePoolMonitor.java
index 0b14918..eca96ef 100644
--- a/server/src/main/java/com/cloud/storage/listener/StoragePoolMonitor.java
+++ b/server/src/main/java/com/cloud/storage/listener/StoragePoolMonitor.java
@@ -20,14 +20,13 @@
 
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.Listener;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -44,6 +43,7 @@
 import com.cloud.storage.ScopeType;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.StorageManagerImpl;
+import com.cloud.storage.StoragePoolHostVO;
 import com.cloud.storage.StoragePoolStatus;
 
 public class StoragePoolMonitor implements Listener {
@@ -137,7 +137,49 @@
 
     @Override
     public synchronized boolean processDisconnect(long agentId, Status state) {
-        return true;
+        Host host = _storageManager.getHost(agentId);
+        if (host == null) {
+            s_logger.warn("Agent: " + agentId + " not found, not disconnecting pools");
+            return false;
+        }
+
+        if (host.getType() != Host.Type.Routing) {
+            return false;
+        }
+
+        List<StoragePoolHostVO> storagePoolHosts = _storageManager.findStoragePoolsConnectedToHost(host.getId());
+        if (storagePoolHosts == null) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("No pools to disconnect for host: " + host.getId());
+            }
+            return true;
+        }
+
+        boolean disconnectResult = true;
+        for (StoragePoolHostVO storagePoolHost : storagePoolHosts) {
+            StoragePoolVO pool = _poolDao.findById(storagePoolHost.getPoolId());
+            if (pool == null) {
+                continue;
+            }
+
+            if (!pool.isShared()) {
+                continue;
+            }
+
+            // Handle only PowerFlex pool for now, not to impact other pools behavior
+            if (pool.getPoolType() != StoragePoolType.PowerFlex) {
+                continue;
+            }
+
+            try {
+                _storageManager.disconnectHostFromSharedPool(host.getId(), pool.getId());
+            } catch (Exception e) {
+                s_logger.error("Unable to disconnect host " + host.getId() + " from storage pool id " + pool.getId() + " due to " + e.toString());
+                disconnectResult = false;
+            }
+        }
+
+        return disconnectResult;
     }
 
     @Override
diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
index c900b2d..b22d3b4 100644
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
@@ -77,6 +77,8 @@
 
     boolean canOperateOnVolume(Volume volume);
 
+    boolean backedUpSnapshotsExistsForVolume(Volume volume);
+
     void cleanupSnapshotsByVolume(Long volumeId);
 
     Answer sendToPool(Volume vol, Command cmd);
diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index f463678..630adde 100755
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -1288,7 +1288,7 @@
         }
 
         StoragePoolVO storagePoolVO = _storagePoolDao.findById(storagePoolId);
-        if (storagePoolVO.getPoolType() == StoragePoolType.RBD && !BackupSnapshotAfterTakingSnapshot.value()) {
+        if ((storagePoolVO.getPoolType() == StoragePoolType.RBD || storagePoolVO.getPoolType() == StoragePoolType.PowerFlex) && !BackupSnapshotAfterTakingSnapshot.value()) {
             return DataStoreRole.Primary;
         }
 
@@ -1391,6 +1391,15 @@
     }
 
     @Override
+    public boolean backedUpSnapshotsExistsForVolume(Volume volume) {
+        List<SnapshotVO> snapshots = _snapshotDao.listByStatus(volume.getId(), Snapshot.State.BackedUp);
+        if (snapshots.size() > 0) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
     public void cleanupSnapshotsByVolume(Long volumeId) {
         List<SnapshotInfo> infos = snapshotFactory.getSnapshots(volumeId, DataStoreRole.Primary);
         for (SnapshotInfo info : infos) {
diff --git a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java
index 055d48f..afda506 100644
--- a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java
+++ b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.template;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -142,12 +143,23 @@
      * Validate on random running KVM host that URL is reachable
      * @param url url
      */
-    private Long performDirectDownloadUrlValidation(final String url) {
-        HostVO host = resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM);
+    private Long performDirectDownloadUrlValidation(final String format, final String url, final List<Long> zoneIds) {
+        HostVO host = null;
+        if (zoneIds != null && !zoneIds.isEmpty()) {
+            for (Long zoneId : zoneIds) {
+                host = resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM, zoneId);
+                if (host != null) {
+                    break;
+                }
+            }
+        } else {
+            host = resourceManager.findOneRandomRunningHostByHypervisor(Hypervisor.HypervisorType.KVM, null);
+        }
+
         if (host == null) {
             throw new CloudRuntimeException("Couldn't find a host to validate URL " + url);
         }
-        CheckUrlCommand cmd = new CheckUrlCommand(url);
+        CheckUrlCommand cmd = new CheckUrlCommand(format, url);
         s_logger.debug("Performing URL " + url + " validation on host " + host.getId());
         Answer answer = _agentMgr.easySend(host.getId(), cmd);
         if (answer == null || !answer.getResult()) {
@@ -164,7 +176,12 @@
         UriUtils.validateUrl(ImageFormat.ISO.getFileExtension(), url);
         if (cmd.isDirectDownload()) {
             DigestHelper.validateChecksumString(cmd.getChecksum());
-            Long templateSize = performDirectDownloadUrlValidation(url);
+            List<Long> zoneIds = null;
+            if (cmd.getZoneId() != null) {
+                zoneIds =  new ArrayList<>();
+                zoneIds.add(cmd.getZoneId());
+            }
+            Long templateSize = performDirectDownloadUrlValidation(ImageFormat.ISO.getFileExtension(), url, zoneIds);
             profile.setSize(templateSize);
         }
         profile.setUrl(url);
@@ -189,7 +206,7 @@
         UriUtils.validateUrl(cmd.getFormat(), url);
         if (cmd.isDirectDownload()) {
             DigestHelper.validateChecksumString(cmd.getChecksum());
-            Long templateSize = performDirectDownloadUrlValidation(url);
+            Long templateSize = performDirectDownloadUrlValidation(cmd.getFormat(), url, cmd.getZoneIds());
             profile.setSize(templateSize);
         }
         profile.setUrl(url);
@@ -583,6 +600,14 @@
             // find all eligible image stores for this template
             List<DataStore> iStores = templateMgr.getImageStoreByTemplate(template.getId(), null);
             if (iStores == null || iStores.size() == 0) {
+                // remove any references from template_zone_ref
+                List<VMTemplateZoneVO> templateZones = templateZoneDao.listByTemplateId(template.getId());
+                if (templateZones != null) {
+                    for (VMTemplateZoneVO templateZone : templateZones) {
+                        templateZoneDao.remove(templateZone.getId());
+                    }
+                }
+
                 // Mark template as Inactive.
                 template.setState(VirtualMachineTemplate.State.Inactive);
                 _tmpltDao.update(template.getId(), template);
@@ -606,7 +631,6 @@
 
         }
         return success;
-
     }
 
     @Override
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index d94c00c..31bad15 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.vm;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 import java.io.IOException;
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
@@ -48,12 +50,6 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
-import com.cloud.deployasis.UserVmDeployAsIsDetailVO;
-import com.cloud.deployasis.dao.UserVmDeployAsIsDetailsDao;
-import com.cloud.exception.UnsupportedServiceException;
-import com.cloud.hypervisor.Hypervisor;
-import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -84,7 +80,6 @@
 import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
 import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
 import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
-import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity;
 import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMNetworkMapDao;
@@ -145,6 +140,8 @@
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
 import com.cloud.agent.manager.Commands;
 import com.cloud.alert.AlertManager;
 import com.cloud.api.ApiDBUtils;
@@ -174,6 +171,9 @@
 import com.cloud.deploy.DeploymentPlanningManager;
 import com.cloud.deploy.PlannerHostReservationVO;
 import com.cloud.deploy.dao.PlannerHostReservationDao;
+import com.cloud.deployasis.UserVmDeployAsIsDetailVO;
+import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
+import com.cloud.deployasis.dao.UserVmDeployAsIsDetailsDao;
 import com.cloud.domain.Domain;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;
@@ -195,6 +195,7 @@
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.exception.StorageUnavailableException;
+import com.cloud.exception.UnsupportedServiceException;
 import com.cloud.exception.VirtualMachineMigrationException;
 import com.cloud.gpu.GPU;
 import com.cloud.ha.HighAvailabilityManager;
@@ -202,8 +203,8 @@
 import com.cloud.host.HostVO;
 import com.cloud.host.Status;
 import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.hypervisor.HypervisorCapabilitiesVO;
 import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 import com.cloud.hypervisor.kvm.dpdk.DpdkHelper;
 import com.cloud.network.IpAddressManager;
@@ -334,8 +335,6 @@
 import com.cloud.vm.snapshot.VMSnapshotVO;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
 
-import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
-
 public class UserVmManagerImpl extends ManagerBase implements UserVmManager, VirtualMachineGuru, UserVmService, Configurable {
     private static final Logger s_logger = Logger.getLogger(UserVmManagerImpl.class);
 
@@ -513,7 +512,7 @@
     @Inject
     private UserVmDeployAsIsDetailsDao userVmDeployAsIsDetailsDao;
     @Inject
-    private StorageManager storageMgr;
+    private StorageManager _storageManager;
 
     private ScheduledExecutorService _executor = null;
     private ScheduledExecutorService _vmIpFetchExecutor = null;
@@ -2020,14 +2019,21 @@
             if (!CollectionUtils.isEmpty(volumeLocators)) {
 
                 GetVolumeStatsCommand cmd = new GetVolumeStatsCommand(poolType, poolUuid, volumeLocators);
+                Answer answer = null;
 
-                if (timeout > 0) {
-                    cmd.setWait(timeout/1000);
+                if (poolType == StoragePoolType.PowerFlex) {
+                    // Get volume stats from the pool directly instead of sending cmd to host
+                    // Added support for ScaleIO/PowerFlex pool only
+                    answer = _storageManager.getVolumeStats(storagePool, cmd);
+                } else {
+                    if (timeout > 0) {
+                        cmd.setWait(timeout/1000);
+                    }
+
+                    answer = _agentMgr.easySend(neighbor.getId(), cmd);
                 }
 
-                Answer answer = _agentMgr.easySend(neighbor.getId(), cmd);
-
-                if (answer instanceof GetVolumeStatsAnswer){
+                if (answer != null && answer instanceof GetVolumeStatsAnswer){
                     GetVolumeStatsAnswer volstats = (GetVolumeStatsAnswer)answer;
                     if (volstats.getVolumeStats() != null) {
                         volumeStatsByUuid.putAll(volstats.getVolumeStats());
@@ -3489,7 +3495,7 @@
         s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + " as a part of deployVM process");
         Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() + "-network",
                 null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ACLType.Account, null, null, null, null, true, null, null,
-                null);
+                null, null, null);
         if (newNetwork != null) {
             defaultNetwork = _networkDao.findById(newNetwork.getId());
         }
@@ -4983,6 +4989,8 @@
             destinationHost = _hostDao.findById(hostId);
             if (destinationHost == null) {
                 throw new InvalidParameterValueException("Unable to find the host to deploy the VM, host id=" + hostId);
+            } else if (destinationHost.getResourceState() != ResourceState.Enabled || destinationHost.getStatus() != Status.Up ) {
+                throw new InvalidParameterValueException("Unable to deploy the VM as the host: " + destinationHost.getName() + " is not in the right state");
             }
         }
         return destinationHost;
@@ -5250,8 +5258,6 @@
             throw new InvalidParameterValueException("Unable to find service offering: " + serviceOfferingId);
         }
 
-        Long templateId = cmd.getTemplateId();
-
         if (!serviceOffering.isDynamic()) {
             for(String detail: cmd.getDetails().keySet()) {
                 if(detail.equalsIgnoreCase(VmDetailConstants.CPU_NUMBER) || detail.equalsIgnoreCase(VmDetailConstants.CPU_SPEED) || detail.equalsIgnoreCase(VmDetailConstants.MEMORY)) {
@@ -5260,6 +5266,8 @@
             }
         }
 
+        Long templateId = cmd.getTemplateId();
+
         VirtualMachineTemplate template = _entityMgr.findById(VirtualMachineTemplate.class, templateId);
         // Make sure a valid template ID was specified
         if (template == null) {
@@ -5295,6 +5303,14 @@
             networkIds = new ArrayList<>(userVmNetworkMap.values());
         }
 
+        Account caller = CallContext.current().getCallingAccount();
+        Long callerId = caller.getId();
+
+        boolean isRootAdmin = _accountService.isRootAdmin(callerId);
+
+        Long hostId = cmd.getHostId();
+        getDestinationHost(hostId, isRootAdmin);
+
         String ipAddress = cmd.getIpAddress();
         String ip6Address = cmd.getIp6Address();
         String macAddress = cmd.getMacAddress();
@@ -5345,8 +5361,6 @@
         }
 
         // Add extraConfig to user_vm_details table
-        Account caller = CallContext.current().getCallingAccount();
-        Long callerId = caller.getId();
         String extraConfig = cmd.getExtraConfig();
         if (StringUtils.isNotBlank(extraConfig)) {
             if (EnableAdditionalVmConfig.valueIn(callerId)) {
@@ -5665,8 +5679,7 @@
         return _vmDao.findById(vmId);
     }
 
-    @Override
-    public VirtualMachine vmStorageMigration(Long vmId, StoragePool destPool) {
+    private VMInstanceVO preVmStorageMigrationCheck(Long vmId) {
         // access check - only root admin can migrate VM
         Account caller = CallContext.current().getCallingAccount();
         if (!_accountMgr.isRootAdmin(caller.getId())) {
@@ -5687,9 +5700,8 @@
             throw ex;
         }
 
-        if (vm.getType() != VirtualMachine.Type.User) {
-            // OffLineVmwareMigration: *WHY* ?
-            throw new InvalidParameterValueException("can only do storage migration on user vm");
+        if (vm.getType() != VirtualMachine.Type.User && !HypervisorType.VMware.equals(vm.getHypervisorType())) {
+            throw new InvalidParameterValueException("cannot do storage migration on non-user vm for hypervisor: " + vm.getHypervisorType().toString() + ", only supported for VMware");
         }
 
         List<VolumeVO> vols = _volsDao.findByInstance(vm.getId());
@@ -5707,17 +5719,62 @@
             throw new InvalidParameterValueException("VM's disk cannot be migrated, please remove all the VM Snapshots for this VM");
         }
 
-        checkDestinationHypervisorType(destPool, vm);
-        if (destPool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
-            DataCenter dc = _entityMgr.findById(DataCenter.class, vm.getDataCenterId());
-            Pod destPoolPod = _entityMgr.findById(Pod.class, destPool.getPodId());
+        return vm;
+    }
 
-            destPool = volumeMgr.findChildDataStoreInDataStoreCluster(dc, destPoolPod, destPool.getClusterId(), null, null, destPool.getId());
+    private VirtualMachine findMigratedVm(long vmId, VirtualMachine.Type vmType) {
+        if (VirtualMachine.Type.User.equals(vmType)) {
+            return _vmDao.findById(vmId);
         }
+        return _vmInstanceDao.findById(vmId);
+    }
 
-        _itMgr.storageMigration(vm.getUuid(), destPool);
-        return _vmDao.findById(vm.getId());
+    @Override
+    public VirtualMachine vmStorageMigration(Long vmId, StoragePool destPool) {
+        VMInstanceVO vm = preVmStorageMigrationCheck(vmId);
+        Map<Long, Long> volumeToPoolIds = new HashMap<>();
+        checkDestinationHypervisorType(destPool, vm);
+        List<VolumeVO> volumes = _volsDao.findByInstance(vm.getId());
+        StoragePoolVO destinationPoolVo = _storagePoolDao.findById(destPool.getId());
+        Long destPoolPodId = ScopeType.CLUSTER.equals(destinationPoolVo.getScope()) || ScopeType.HOST.equals(destinationPoolVo.getScope()) ?
+                destinationPoolVo.getPodId() : null;
+        for (VolumeVO volume : volumes) {
+            if (!VirtualMachine.Type.User.equals(vm.getType())) {
+                // Migrate within same pod as source storage and same cluster for all disks only. Hypervisor check already done
+                StoragePoolVO pool = _storagePoolDao.findById(volume.getPoolId());
+                if (destPoolPodId != null &&
+                        (ScopeType.CLUSTER.equals(pool.getScope()) || ScopeType.HOST.equals(pool.getScope())) &&
+                        !destPoolPodId.equals(pool.getPodId())) {
+                    throw new InvalidParameterValueException("Storage migration of non-user VMs cannot be done between storage pools of different pods");
+                }
+            }
+            volumeToPoolIds.put(volume.getId(), destPool.getId());
+        }
+        _itMgr.storageMigration(vm.getUuid(), volumeToPoolIds);
+        return findMigratedVm(vm.getId(), vm.getType());
+    }
 
+    @Override
+    public VirtualMachine vmStorageMigration(Long vmId, Map<String, String> volumeToPool) {
+        VMInstanceVO vm = preVmStorageMigrationCheck(vmId);
+        Map<Long, Long> volumeToPoolIds = new HashMap<>();
+        Long poolClusterId = null;
+        for (Map.Entry<String, String> entry : volumeToPool.entrySet()) {
+            Volume volume = _volsDao.findByUuid(entry.getKey());
+            StoragePoolVO pool = _storagePoolDao.findPoolByUUID(entry.getValue());
+            if (poolClusterId != null &&
+                    (ScopeType.CLUSTER.equals(pool.getScope()) || ScopeType.HOST.equals(pool.getScope())) &&
+                    !poolClusterId.equals(pool.getClusterId())) {
+                throw new InvalidParameterValueException("VM's disk cannot be migrated, input destination storage pools belong to different clusters");
+            }
+            if (pool.getClusterId() != null) {
+                poolClusterId = pool.getClusterId();
+            }
+            checkDestinationHypervisorType(pool, vm);
+            volumeToPoolIds.put(volume.getId(), pool.getId());
+        }
+        _itMgr.storageMigration(vm.getUuid(), volumeToPoolIds);
+        return findMigratedVm(vm.getId(), vm.getType());
     }
 
     private void checkDestinationHypervisorType(StoragePool destPool, VMInstanceVO vm) {
@@ -5805,6 +5862,12 @@
 
         // check if migrating to same host
         long srcHostId = vm.getHostId();
+        Host srcHost = _resourceMgr.getHost(srcHostId);
+        if (srcHost == null) {
+            throw new InvalidParameterValueException("Cannot migrate VM, host with id: " + srcHostId + " for VM not found");
+        }
+
+
         if (destinationHost.getId() == srcHostId) {
             throw new InvalidParameterValueException("Cannot migrate VM, VM is already present on this host, please specify valid destination host to migrate the VM");
         }
@@ -5816,13 +5879,9 @@
         }
 
         if (vm.getType() != VirtualMachine.Type.User) {
-            // for System VMs check that the destination host is within the same
-            // cluster
-            HostVO srcHost = _hostDao.findById(srcHostId);
-            if (srcHost != null && srcHost.getClusterId() != null && destinationHost.getClusterId() != null) {
-                if (srcHost.getClusterId().longValue() != destinationHost.getClusterId().longValue()) {
-                    throw new InvalidParameterValueException("Cannot migrate the VM, destination host is not in the same cluster as current host of the VM");
-                }
+            // for System VMs check that the destination host is within the same pod
+            if (srcHost.getPodId() != null && !srcHost.getPodId().equals(destinationHost.getPodId())) {
+                throw new InvalidParameterValueException("Cannot migrate the VM, destination host is not in the same pod as current host of the VM");
             }
         }
 
@@ -5861,12 +5920,7 @@
             collectVmNetworkStatistics(uservm);
         }
         _itMgr.migrate(vm.getUuid(), srcHostId, dest);
-        VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
-        if (vmInstance.getType().equals(VirtualMachine.Type.User)) {
-            return _vmDao.findById(vmId);
-        } else {
-            return vmInstance;
-        }
+        return findMigratedVm(vm.getId(), vm.getType());
     }
 
     private boolean isOnSupportedHypevisorForMigration(VMInstanceVO vm) {
@@ -6104,6 +6158,23 @@
         return implicitPlannerUsed;
     }
 
+    private boolean isVmVolumesOnZoneWideStore(VMInstanceVO vm) {
+        final List<VolumeVO> volumes = _volsDao.findCreatedByInstance(vm.getId());
+        if (CollectionUtils.isEmpty(volumes)) {
+            return false;
+        }
+        for (Volume volume : volumes) {
+            if (volume == null || volume.getPoolId() == null) {
+                return false;
+            }
+            StoragePoolVO pool = _storagePoolDao.findById(volume.getPoolId());
+            if (pool == null || !ScopeType.ZONE.equals(pool.getScope())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_MIGRATE, eventDescription = "migrating VM", async = true)
     public VirtualMachine migrateVirtualMachineWithVolume(Long vmId, Host destinationHost, Map<String, String> volumeToPool) throws ResourceUnavailableException,
@@ -6147,61 +6218,52 @@
         long srcHostId = vm.getHostId();
         Host srcHost = _resourceMgr.getHost(srcHostId);
 
-        if(srcHost == null ){
-            throw new InvalidParameterValueException("Cannot migrate VM, there is not Host with id: " + srcHostId);
+        if (srcHost == null) {
+            throw new InvalidParameterValueException("Cannot migrate VM, host with id: " + srcHostId + " for VM not found");
         }
 
-        // Check if src and destination hosts are valid and migrating to same host
+        // Check if source and destination hosts are valid and migrating to same host
         if (destinationHost.getId() == srcHostId) {
             throw new InvalidParameterValueException("Cannot migrate VM, VM is already present on this host, please" + " specify valid destination host to migrate the VM");
         }
 
+        String srcHostVersion = srcHost.getHypervisorVersion();
+        String destHostVersion = destinationHost.getHypervisorVersion();
+
         // Check if the source and destination hosts are of the same type and support storage motion.
         if (!srcHost.getHypervisorType().equals(destinationHost.getHypervisorType())) {
             throw new CloudRuntimeException("The source and destination hosts are not of the same type and version. Source hypervisor type and version: " +
-                    srcHost.getHypervisorType().toString() + " " + srcHost.getHypervisorVersion() + ", Destination hypervisor type and version: " +
-                    destinationHost.getHypervisorType().toString() + " " + destinationHost.getHypervisorVersion());
+                    srcHost.getHypervisorType().toString() + " " + srcHostVersion + ", Destination hypervisor type and version: " +
+                    destinationHost.getHypervisorType().toString() + " " + destHostVersion);
         }
 
-        String srcHostVersion = srcHost.getHypervisorVersion();
-        String destinationHostVersion = destinationHost.getHypervisorVersion();
+        if (!VirtualMachine.Type.User.equals(vm.getType())) {
+            // for System VMs check that the destination host is within the same pod
+            if (srcHost.getPodId() != null && !srcHost.getPodId().equals(destinationHost.getPodId())) {
+                throw new InvalidParameterValueException("Cannot migrate the VM, destination host is not in the same pod as current host of the VM");
+            }
+        }
 
         if (HypervisorType.KVM.equals(srcHost.getHypervisorType())) {
             if (srcHostVersion == null) {
                 srcHostVersion = "";
             }
 
-            if (destinationHostVersion == null) {
-                destinationHostVersion = "";
+            if (destHostVersion == null) {
+                destHostVersion = "";
             }
         }
 
-        if (!srcHostVersion.equals(destinationHostVersion)) {
-            throw new CloudRuntimeException("The source and destination hosts are not of the same type and version. Source hypervisor type and version: " +
-                    srcHost.getHypervisorType().toString() + " " + srcHost.getHypervisorVersion() + ", Destination hypervisor type and version: " +
-                    destinationHost.getHypervisorType().toString() + " " + destinationHost.getHypervisorVersion());
+        if (!Boolean.TRUE.equals(_hypervisorCapabilitiesDao.isStorageMotionSupported(srcHost.getHypervisorType(), srcHostVersion))) {
+            throw new CloudRuntimeException("Migration with storage isn't supported for source host ID: " + srcHost.getUuid() + " on hypervisor " + srcHost.getHypervisorType() + " of version " + srcHost.getHypervisorVersion());
         }
 
-        HypervisorCapabilitiesVO capabilities = _hypervisorCapabilitiesDao.findByHypervisorTypeAndVersion(srcHost.getHypervisorType(), srcHost.getHypervisorVersion());
-
-        if (capabilities == null && HypervisorType.KVM.equals(srcHost.getHypervisorType())) {
-            List<HypervisorCapabilitiesVO> lstHypervisorCapabilities = _hypervisorCapabilitiesDao.listAllByHypervisorType(HypervisorType.KVM);
-
-            if (lstHypervisorCapabilities != null) {
-                for (HypervisorCapabilitiesVO hypervisorCapabilities : lstHypervisorCapabilities) {
-                    if (hypervisorCapabilities.isStorageMotionSupported()) {
-                        capabilities = hypervisorCapabilities;
-
-                        break;
-                    }
-                }
+        if (srcHostVersion == null || !srcHostVersion.equals(destHostVersion)) {
+            if (!Boolean.TRUE.equals(_hypervisorCapabilitiesDao.isStorageMotionSupported(destinationHost.getHypervisorType(), destHostVersion))) {
+                throw new CloudRuntimeException("Migration with storage isn't supported for target host ID: " + srcHost.getUuid() + " on hypervisor " + srcHost.getHypervisorType() + " of version " + srcHost.getHypervisorVersion());
             }
         }
 
-        if (!capabilities.isStorageMotionSupported()) {
-            throw new CloudRuntimeException("Migration with storage isn't supported on hypervisor " + srcHost.getHypervisorType() + " of version " + srcHost.getHypervisorVersion());
-        }
-
         // Check if destination host is up.
         if (destinationHost.getState() != com.cloud.host.Status.Up || destinationHost.getResourceState() != ResourceState.Enabled) {
             throw new CloudRuntimeException("Cannot migrate VM, destination host is not in correct state, has " + "status: " + destinationHost.getState() + ", state: "
@@ -6215,16 +6277,18 @@
 
         List<VolumeVO> vmVolumes = _volsDao.findUsableVolumesForInstance(vm.getId());
         Map<Long, Long> volToPoolObjectMap = new HashMap<Long, Long>();
-        if (!isVMUsingLocalStorage(vm) && destinationHost.getClusterId().equals(srcHost.getClusterId())) {
-            if (volumeToPool.isEmpty()) {
-                // If the destination host is in the same cluster and volumes do not have to be migrated across pools
-                // then fail the call. migrateVirtualMachine api should have been used.
-                throw new InvalidParameterValueException("Migration of the vm " + vm + "from host " + srcHost + " to destination host " + destinationHost
-                        + " doesn't involve migrating the volumes.");
+        if (!isVMUsingLocalStorage(vm) && MapUtils.isEmpty(volumeToPool)
+            && (destinationHost.getClusterId().equals(srcHost.getClusterId()) || isVmVolumesOnZoneWideStore(vm))){
+            // If volumes do not have to be migrated
+            // call migrateVirtualMachine for non-user VMs else throw exception
+            if (!VirtualMachine.Type.User.equals(vm.getType())) {
+                return migrateVirtualMachine(vmId, destinationHost);
             }
+            throw new InvalidParameterValueException("Migration of the vm " + vm + "from host " + srcHost + " to destination host " + destinationHost
+                    + " doesn't involve migrating the volumes.");
         }
 
-        if (!volumeToPool.isEmpty()) {
+        if (MapUtils.isNotEmpty(volumeToPool)) {
             // Check if all the volumes and pools passed as parameters are valid.
             for (Map.Entry<String, String> entry : volumeToPool.entrySet()) {
                 VolumeVO volume = _volsDao.findByUuid(entry.getKey());
@@ -6246,7 +6310,7 @@
                 HypervisorType hypervisorType = _volsDao.getHypervisorType(volume.getId());
                 if (hypervisorType.equals(HypervisorType.VMware)) {
                     try {
-                        boolean isStoragePoolStoragepolicyComplaince = storageMgr.isStoragePoolComplaintWithStoragePolicy(Arrays.asList(volume), pool);
+                        boolean isStoragePoolStoragepolicyComplaince = _storageManager.isStoragePoolComplaintWithStoragePolicy(Arrays.asList(volume), pool);
                         if (!isStoragePoolStoragepolicyComplaince) {
                             throw new CloudRuntimeException(String.format("Storage pool %s is not storage policy compliance with the volume %s", pool.getUuid(), volume.getUuid()));
                         }
@@ -6274,7 +6338,7 @@
         checkHostsDedication(vm, srcHostId, destinationHost.getId());
 
         _itMgr.migrateWithStorage(vm.getUuid(), srcHostId, destinationHost.getId(), volToPoolObjectMap);
-        return _vmDao.findById(vm.getId());
+        return findMigratedVm(vm.getId(), vm.getType());
     }
 
     @DB
@@ -6726,7 +6790,7 @@
                             Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), newAccount.getAccountName() + "-network",
                                     newAccount.getAccountName() + "-network", null, null, null, false, null, newAccount,
                                     null, physicalNetwork, zone.getId(), ACLType.Account, null, null,
-                                    null, null, true, null, null, null);
+                                    null, null, true, null, null, null, null, null);
                             // if the network offering has persistent set to true, implement the network
                             if (requiredOfferings.get(0).isPersistent()) {
                                 DeployDestination dest = new DeployDestination(zone, null, null, null);
diff --git a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index a117af2..4a7840e 100644
--- a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -50,6 +50,8 @@
 import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl;
 import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
 import org.apache.cloudstack.jobs.JobInfo;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
 
@@ -76,6 +78,7 @@
 import com.cloud.storage.GuestOSVO;
 import com.cloud.storage.Snapshot;
 import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Volume;
 import com.cloud.storage.Volume.Type;
@@ -109,12 +112,12 @@
 import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.UserVmManager;
 import com.cloud.vm.UserVmVO;
-import com.cloud.vm.VmDetailConstants;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.VirtualMachineManager;
 import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VmDetailConstants;
 import com.cloud.vm.VmWork;
 import com.cloud.vm.VmWorkConstants;
 import com.cloud.vm.VmWorkJobHandler;
@@ -166,6 +169,8 @@
     protected UserVmDetailsDao _userVmDetailsDao;
     @Inject
     protected VMSnapshotDetailsDao _vmSnapshotDetailsDao;
+    @Inject
+    PrimaryDataStoreDao _storagePoolDao;
 
     VmWorkJobHandlerProxy _jobHandlerProxy = new VmWorkJobHandlerProxy(this);
 
@@ -358,9 +363,33 @@
             throw new InvalidParameterValueException("Can not snapshot memory when VM is not in Running state");
         }
 
+        List<VolumeVO> rootVolumes = _volumeDao.findReadyRootVolumesByInstance(userVmVo.getId());
+        if (rootVolumes == null || rootVolumes.isEmpty()) {
+            throw new CloudRuntimeException("Unable to find root volume for the user vm:" + userVmVo.getUuid());
+        }
+
+        VolumeVO rootVolume = rootVolumes.get(0);
+        StoragePoolVO rootVolumePool = _storagePoolDao.findById(rootVolume.getPoolId());
+        if (rootVolumePool == null) {
+            throw new CloudRuntimeException("Unable to find root volume storage pool for the user vm:" + userVmVo.getUuid());
+        }
+
         // for KVM, only allow snapshot with memory when VM is in running state
-        if (userVmVo.getHypervisorType() == HypervisorType.KVM && userVmVo.getState() == State.Running && !snapshotMemory) {
-            throw new InvalidParameterValueException("KVM VM does not allow to take a disk-only snapshot when VM is in running state");
+        if (userVmVo.getHypervisorType() == HypervisorType.KVM) {
+            if (rootVolumePool.getPoolType() != Storage.StoragePoolType.PowerFlex) {
+                if (userVmVo.getState() == State.Running && !snapshotMemory) {
+                    throw new InvalidParameterValueException("KVM VM does not allow to take a disk-only snapshot when VM is in running state");
+                }
+            } else {
+                if (snapshotMemory) {
+                    throw new InvalidParameterValueException("Can not snapshot memory for PowerFlex storage pool");
+                }
+
+                // All volumes should be on the same PowerFlex storage pool for VM Snapshot
+                if (!isVolumesOfUserVmOnSameStoragePool(userVmVo.getId(), rootVolumePool.getId())) {
+                    throw new InvalidParameterValueException("All volumes of the VM: " + userVmVo.getUuid() + " should be on the same PowerFlex storage pool");
+                }
+            }
         }
 
         // check access
@@ -379,8 +408,14 @@
             if (activeSnapshots.size() > 0) {
                 throw new CloudRuntimeException("There is other active volume snapshot tasks on the instance to which the volume is attached, please try again later.");
             }
-            if (userVmVo.getHypervisorType() == HypervisorType.KVM && volume.getFormat() != ImageFormat.QCOW2) {
-                throw new CloudRuntimeException("We only support create vm snapshots from vm with QCOW2 image");
+            if (userVmVo.getHypervisorType() == HypervisorType.KVM) {
+                if (volume.getPoolType() != Storage.StoragePoolType.PowerFlex) {
+                    if (volume.getFormat() != ImageFormat.QCOW2) {
+                        throw new CloudRuntimeException("We only support create vm snapshots from vm with QCOW2 image");
+                    }
+                } else if (volume.getFormat() != ImageFormat.RAW) {
+                    throw new CloudRuntimeException("Only support create vm snapshots for volumes on PowerFlex with RAW image");
+                }
             }
         }
 
@@ -393,6 +428,10 @@
         if (snapshotMemory && userVmVo.getState() == VirtualMachine.State.Running)
             vmSnapshotType = VMSnapshot.Type.DiskAndMemory;
 
+        if (rootVolumePool.getPoolType() == Storage.StoragePoolType.PowerFlex) {
+            vmSnapshotType = VMSnapshot.Type.Disk;
+        }
+
         try {
             return createAndPersistVMSnapshot(userVmVo, vsDescription, vmSnapshotName, vsDisplayName, vmSnapshotType);
         } catch (Exception e) {
@@ -402,6 +441,21 @@
         return null;
     }
 
+    private boolean isVolumesOfUserVmOnSameStoragePool(Long userVmId, Long poolId) {
+        List<VolumeVO> volumesOfVm = _volumeDao.findCreatedByInstance(userVmId);
+        if (volumesOfVm == null || volumesOfVm.isEmpty()) {
+            throw new CloudRuntimeException("Unable to find volumes for the user vm:" + userVmId);
+        }
+
+        for (VolumeVO volume : volumesOfVm) {
+            if (volume == null || volume.getPoolId() != poolId) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     /**
      * Create, persist and return vm snapshot for userVmVo with given parameters.
      * Persistence and support for custom service offerings are done on the same transaction
diff --git a/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java b/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java
index dcbc965..8efe865 100644
--- a/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java
@@ -20,32 +20,6 @@
 
 import static com.cloud.storage.Storage.ImageFormat;
 
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.event.ActionEventUtils;
-import com.cloud.event.EventTypes;
-import com.cloud.event.EventVO;
-import com.cloud.exception.AgentUnavailableException;
-import com.cloud.exception.OperationTimedoutException;
-import com.cloud.host.Host;
-import com.cloud.host.HostVO;
-import com.cloud.host.Status;
-import com.cloud.host.dao.HostDao;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
-import com.cloud.storage.Storage;
-import com.cloud.storage.VMTemplateStoragePoolVO;
-import com.cloud.storage.VMTemplateStorageResourceAssoc;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.storage.dao.VMTemplatePoolDao;
-import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.concurrency.NamedThreadFactory;
-import com.cloud.utils.exception.CloudRuntimeException;
-
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.security.cert.Certificate;
@@ -79,6 +53,9 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
@@ -86,12 +63,39 @@
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
+import org.apache.cloudstack.storage.to.TemplateObjectTO;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.log4j.Logger;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.event.ActionEventUtils;
+import com.cloud.event.EventTypes;
+import com.cloud.event.EventVO;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
+import com.cloud.storage.Storage;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.concurrency.NamedThreadFactory;
+import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.security.CertificateHelper;
 
 import sun.security.x509.X509CertImpl;
@@ -126,6 +130,10 @@
     private DataCenterDao dataCenterDao;
     @Inject
     private ConfigurationDao configDao;
+    @Inject
+    private TemplateDataFactory tmplFactory;
+    @Inject
+    private VolumeService volService;
 
     protected ScheduledExecutorService executorService;
 
@@ -259,7 +267,14 @@
         DownloadProtocol protocol = getProtocolFromUrl(url);
         DirectDownloadCommand cmd = getDirectDownloadCommandFromProtocol(protocol, url, templateId, to, checksum, headers);
         cmd.setTemplateSize(template.getSize());
-        cmd.setIso(template.getFormat() == ImageFormat.ISO);
+        cmd.setFormat(template.getFormat());
+
+        if (tmplFactory.getTemplate(templateId, store) != null) {
+            cmd.setDestData((TemplateObjectTO) tmplFactory.getTemplate(templateId, store).getTO());
+        }
+
+        int cmdTimeOut = StorageManager.PRIMARY_STORAGE_DOWNLOAD_WAIT.value();
+        cmd.setWait(cmdTimeOut);
 
         Answer answer = sendDirectDownloadCommand(cmd, template, poolId, host);
 
@@ -277,6 +292,16 @@
             sPoolRef.setLocalDownloadPath(ans.getInstallPath());
             sPoolRef.setInstallPath(ans.getInstallPath());
             vmTemplatePoolDao.persist(sPoolRef);
+        } else {
+            // For managed storage, update after template downloaded and copied to the disk
+            DirectDownloadAnswer ans = (DirectDownloadAnswer) answer;
+            sPoolRef.setDownloadPercent(100);
+            sPoolRef.setDownloadState(VMTemplateStorageResourceAssoc.Status.DOWNLOADED);
+            sPoolRef.setState(ObjectInDataStoreStateMachine.State.Ready);
+            sPoolRef.setTemplateSize(ans.getTemplateSize());
+            sPoolRef.setLocalDownloadPath(ans.getInstallPath());
+            sPoolRef.setInstallPath(ans.getInstallPath());
+            vmTemplatePoolDao.update(sPoolRef.getId(), sPoolRef);
         }
     }
 
@@ -294,20 +319,39 @@
         int retry = 3;
 
         StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(poolId);
+        // TODO: Move the host retry attempts to upper layer
         Long[] hostsToRetry = getHostsToRetryOn(host, storagePoolVO);
         int hostIndex = 0;
         Answer answer = null;
         Long hostToSendDownloadCmd = hostsToRetry[hostIndex];
         boolean continueRetrying = true;
         while (!downloaded && retry > 0 && continueRetrying) {
-            s_logger.debug("Sending Direct download command to host " + hostToSendDownloadCmd);
-            answer = agentManager.easySend(hostToSendDownloadCmd, cmd);
-            if (answer != null) {
-                DirectDownloadAnswer ans = (DirectDownloadAnswer)answer;
-                downloaded = answer.getResult();
-                continueRetrying = ans.isRetryOnOtherHosts();
+            PrimaryDataStore primaryDataStore = null;
+            TemplateInfo templateOnPrimary = null;
+
+            try {
+                if (hostToSendDownloadCmd != host.getId() && storagePoolVO.isManaged()) {
+                    primaryDataStore = (PrimaryDataStore) dataStoreManager.getPrimaryDataStore(poolId);
+                    templateOnPrimary = primaryDataStore.getTemplate(template.getId(), null);
+                    if (templateOnPrimary != null) {
+                        volService.grantAccess(templateOnPrimary, host, primaryDataStore);
+                    }
+                }
+
+                s_logger.debug("Sending Direct download command to host " + hostToSendDownloadCmd);
+                answer = agentManager.easySend(hostToSendDownloadCmd, cmd);
+                if (answer != null) {
+                    DirectDownloadAnswer ans = (DirectDownloadAnswer)answer;
+                    downloaded = answer.getResult();
+                    continueRetrying = ans.isRetryOnOtherHosts();
+                }
+                hostToSendDownloadCmd = hostsToRetry[(hostIndex + 1) % hostsToRetry.length];
+            } finally {
+                if (templateOnPrimary != null) {
+                    volService.revokeAccess(templateOnPrimary, host, primaryDataStore);
+                }
             }
-            hostToSendDownloadCmd = hostsToRetry[(hostIndex + 1) % hostsToRetry.length];
+
             retry --;
         }
         if (!downloaded) {
@@ -489,6 +533,39 @@
     }
 
     @Override
+    public boolean syncCertificatesToHost(long hostId, long zoneId) {
+        List<DirectDownloadCertificateVO> zoneCertificates = directDownloadCertificateDao.listByZone(zoneId);
+        if (CollectionUtils.isEmpty(zoneCertificates)) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("No certificates to sync on host: " + hostId);
+            }
+            return true;
+        }
+
+        boolean syncCertificatesResult = true;
+        int certificatesSyncCount = 0;
+        s_logger.debug("Syncing certificates on host: " + hostId);
+        for (DirectDownloadCertificateVO certificateVO : zoneCertificates) {
+            DirectDownloadCertificateHostMapVO mapping = directDownloadCertificateHostMapDao.findByCertificateAndHost(certificateVO.getId(), hostId);
+            if (mapping == null) {
+                s_logger.debug("Syncing certificate " + certificateVO.getId() + " (" + certificateVO.getAlias() + ") on host: " + hostId + ", uploading it");
+                if (!uploadCertificate(certificateVO.getId(), hostId)) {
+                    String msg = "Could not sync certificate " + certificateVO.getId() + " (" + certificateVO.getAlias() + ") on host: " + hostId + ", upload failed";
+                    s_logger.error(msg);
+                    syncCertificatesResult = false;
+                } else {
+                    certificatesSyncCount++;
+                }
+            } else {
+                s_logger.debug("Certificate " + certificateVO.getId() + " (" + certificateVO.getAlias() + ") already synced on host: " + hostId);
+            }
+        }
+
+        s_logger.debug("Synced " + certificatesSyncCount + " out of " + zoneCertificates.size() + " certificates on host: " + hostId);
+        return syncCertificatesResult;
+    }
+
+    @Override
     public boolean revokeCertificateAlias(String certificateAlias, String hypervisor, Long zoneId, Long hostId) {
         HypervisorType hypervisorType = HypervisorType.getType(hypervisor);
         DirectDownloadCertificateVO certificateVO = directDownloadCertificateDao.findByAlias(certificateAlias, hypervisorType, zoneId);
diff --git a/server/src/main/java/org/apache/cloudstack/network/ssl/CertServiceImpl.java b/server/src/main/java/org/apache/cloudstack/network/ssl/CertServiceImpl.java
index ae34748..00ea94a 100644
--- a/server/src/main/java/org/apache/cloudstack/network/ssl/CertServiceImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/network/ssl/CertServiceImpl.java
@@ -169,14 +169,14 @@
         final List<LoadBalancerCertMapVO> lbCertRule = _lbCertDao.listByCertId(certId);
 
         if (lbCertRule != null && !lbCertRule.isEmpty()) {
-            String lbUuids = "";
+            StringBuilder lbNames = new StringBuilder();
 
             for (final LoadBalancerCertMapVO rule : lbCertRule) {
                 final LoadBalancerVO lb = _entityMgr.findById(LoadBalancerVO.class, rule.getLbId());
-                lbUuids += " " + lb.getUuid();
+                lbNames.append(lb.getName()).append(" ");
             }
 
-            throw new CloudRuntimeException("Certificate in use by a loadbalancer(s)" + lbUuids);
+            throw new CloudRuntimeException("Certificate in use by a loadbalancer(s) " + lbNames.toString());
         }
 
         _sslCertDao.remove(certId);
@@ -311,9 +311,8 @@
             {
                 response.setProjectId(project.getUuid());
                 response.setProjectName(project.getName());
-            } else {
-                response.setAccountName(account.getAccountName());
             }
+            response.setAccountName(account.getAccountName());
         } else {
             response.setAccountName(account.getAccountName());
         }
diff --git a/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java b/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java
index 72685c2..04e3e63 100644
--- a/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java
+++ b/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java
@@ -123,7 +123,7 @@
                 ACLType.Account, false, 1L, false);
         when(networkService._networkMgr.createGuestNetwork(eq(ntwkOff.getId()), eq("bla"), eq("fake"), eq("10.1.1.1"), eq("10.1.1.0/24"), nullable(String.class), nullable(Boolean.class), nullable(String.class),
                         eq(account), nullable(Long.class), eq(physicalNetwork), eq(physicalNetwork.getDataCenterId()), eq(ACLType.Account), nullable(Boolean.class), eq(1L), nullable(String.class), nullable(String.class),
-                        nullable(Boolean.class), nullable(String.class), nullable(Network.PVlanType.class), nullable(String.class))).thenReturn(net);
+                        nullable(Boolean.class), nullable(String.class), nullable(Network.PVlanType.class), nullable(String.class), nullable(String.class), nullable(String.class))).thenReturn(net);
         when(
             networkService._networkMgr.createPrivateNetwork(eq(ntwkOff.getId()), eq("bla"), eq("fake"), eq("10.1.1.1"), eq("10.1.1.0/24"), anyString(), anyBoolean(), eq(account), eq(physicalNetwork), eq(1L))).thenReturn(net);
 
diff --git a/server/src/test/java/com/cloud/network/element/ConfigDriveNetworkElementTest.java b/server/src/test/java/com/cloud/network/element/ConfigDriveNetworkElementTest.java
index 5d206f4..ab3489f 100644
--- a/server/src/test/java/com/cloud/network/element/ConfigDriveNetworkElementTest.java
+++ b/server/src/test/java/com/cloud/network/element/ConfigDriveNetworkElementTest.java
@@ -60,6 +60,7 @@
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.HandleConfigDriveIsoAnswer;
 import com.cloud.agent.api.HandleConfigDriveIsoCommand;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenterVO;
@@ -228,7 +229,7 @@
         when(virtualMachine.getState()).thenReturn(VirtualMachine.State.Stopped);
         when(_vmInstanceDao.updateState(VirtualMachine.State.Stopped, VirtualMachine.Event.ExpungeOperation, VirtualMachine.State.Expunging, virtualMachine, null)).thenReturn(true);
 
-        final Answer answer = mock(Answer.class);
+        final HandleConfigDriveIsoAnswer answer = mock(HandleConfigDriveIsoAnswer.class);
         when(agentManager.easySend(anyLong(), any(HandleConfigDriveIsoCommand.class))).thenReturn(answer);
         when(answer.getResult()).thenReturn(true);
 
@@ -267,10 +268,11 @@
         Method method = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("buildConfigDrive")).iterator().next();
         PowerMockito.when(ConfigDriveBuilder.class, method).withArguments(Mockito.anyListOf(String[].class), Mockito.anyString(), Mockito.anyString()).thenReturn("content");
 
-        final Answer answer = mock(Answer.class);
+        final HandleConfigDriveIsoAnswer answer = mock(HandleConfigDriveIsoAnswer.class);
         final UserVmDetailVO userVmDetailVO = mock(UserVmDetailVO.class);
         when(agentManager.easySend(anyLong(), any(HandleConfigDriveIsoCommand.class))).thenReturn(answer);
         when(answer.getResult()).thenReturn(true);
+        when(answer.getConfigDriveLocation()).thenReturn(NetworkElement.Location.PRIMARY);
         when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest);
         when(virtualMachine.getState()).thenReturn(VirtualMachine.State.Stopped);
         when(virtualMachine.getUuid()).thenReturn("vm-uuid");
diff --git a/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java b/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java
index 5fc9a4d..4e1daa8 100755
--- a/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java
+++ b/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java
@@ -617,7 +617,7 @@
     }
 
     @Override
-    public HostVO findOneRandomRunningHostByHypervisor(HypervisorType type) {
+    public HostVO findOneRandomRunningHostByHypervisor(HypervisorType type, Long dcId) {
         // TODO Auto-generated method stub
         return null;
     }
diff --git a/server/src/test/java/com/cloud/vm/snapshot/VMSnapshotManagerTest.java b/server/src/test/java/com/cloud/vm/snapshot/VMSnapshotManagerTest.java
index 2cf763f..91cdbb5 100644
--- a/server/src/test/java/com/cloud/vm/snapshot/VMSnapshotManagerTest.java
+++ b/server/src/test/java/com/cloud/vm/snapshot/VMSnapshotManagerTest.java
@@ -23,9 +23,9 @@
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -33,6 +33,12 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.api.ResourceDetail;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
@@ -42,12 +48,6 @@
 import org.mockito.MockitoAnnotations;
 import org.mockito.Spy;
 
-import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.acl.SecurityChecker.AccessType;
-import org.apache.cloudstack.api.ResourceDetail;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConcurrentOperationException;
@@ -183,6 +183,7 @@
         _vmSnapshotMgr._userVMDao = _userVMDao;
         _vmSnapshotMgr._vmSnapshotDao = _vmSnapshotDao;
         _vmSnapshotMgr._volumeDao = _volumeDao;
+        _vmSnapshotMgr._storagePoolDao = _storagePoolDao;
         _vmSnapshotMgr._accountMgr = _accountMgr;
         _vmSnapshotMgr._snapshotDao = _snapshotDao;
         _vmSnapshotMgr._guestOSDao = _guestOSDao;
@@ -208,6 +209,8 @@
         mockVolumeList.add(volumeMock);
         when(volumeMock.getInstanceId()).thenReturn(TEST_VM_ID);
         when(_volumeDao.findByInstance(anyLong())).thenReturn(mockVolumeList);
+        when(_volumeDao.findReadyRootVolumesByInstance(anyLong())).thenReturn(mockVolumeList);
+        when(_storagePoolDao.findById(anyLong())).thenReturn(mock(StoragePoolVO.class));
 
         when(vmMock.getId()).thenReturn(TEST_VM_ID);
         when(vmMock.getServiceOfferingId()).thenReturn(SERVICE_OFFERING_ID);
@@ -299,7 +302,6 @@
     public void testCreateVMSnapshot() throws AgentUnavailableException, OperationTimedoutException, ResourceAllocationException, NoTransitionException {
         when(vmMock.getState()).thenReturn(State.Running);
         _vmSnapshotMgr.allocVMSnapshot(TEST_VM_ID, "", "", true);
-
     }
 
     @Test
diff --git a/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java
index b42996b..9618f8d 100644
--- a/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java
+++ b/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java
@@ -486,7 +486,7 @@
     public NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability,
                                                    Integer networkRate, Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, GuestType type, boolean systemOnly, Long serviceOfferingId,
                                                    boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent,
-                                                   Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive, Boolean forVpc, List<Long> domainIds, List<Long> zoneIds) {
+                                                   Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive, Boolean forVpc, List<Long> domainIds, List<Long> zoneIds, boolean enableOffering) {
         // TODO Auto-generated method stub
         return null;
     }
diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java
index 1b2b0b5..728effa 100644
--- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -646,7 +646,7 @@
     @Override
     public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain,
                                       Account owner, Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String gatewayv6,
-                                      String cidrv6, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId) throws ConcurrentOperationException, InsufficientCapacityException,
+                                      String cidrv6, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException,
         ResourceAllocationException {
         // TODO Auto-generated method stub
         return null;
diff --git a/server/src/test/java/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/src/test/java/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
index 45bf4c1..abb1863 100644
--- a/server/src/test/java/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
+++ b/server/src/test/java/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
@@ -39,6 +39,7 @@
 import com.cloud.network.vpc.PrivateGateway;
 import com.cloud.user.Account;
 import com.cloud.user.User;
+import com.cloud.utils.Pair;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.VirtualMachineProfile;
@@ -249,8 +250,8 @@
     }
 
     @Override
-    public boolean performRouterHealthChecks(long routerId) {
-        return false;
+    public Pair<Boolean, String> performRouterHealthChecks(long routerId) {
+        return null;
     }
 
     @Override
diff --git a/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java b/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
index 3c9f186..78e70f3 100644
--- a/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
+++ b/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
@@ -128,7 +128,7 @@
     public void createSharedNtwkOffWithVlan() {
         NetworkOfferingVO off =
             configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true, Availability.Optional, 200, null, false, Network.GuestType.Shared, false,
-                null, false, null, true, false, null, false, null, true, false, null, null);
+                null, false, null, true, false, null, false, null, true, false, null, null, false);
         assertNotNull("Shared network offering with specifyVlan=true failed to create ", off);
     }
 
@@ -136,7 +136,7 @@
     public void createSharedNtwkOffWithNoVlan() {
         NetworkOfferingVO off =
                 configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, false, Availability.Optional, 200, null, false, Network.GuestType.Shared,
-                    false, null, false, null, true, false, null, false, null, true, false, null, null);
+                    false, null, false, null, true, false, null, false, null, true, false, null, null, false);
         assertNull("Shared network offering with specifyVlan=false was created", off);
     }
 
@@ -144,7 +144,7 @@
     public void createSharedNtwkOffWithSpecifyIpRanges() {
         NetworkOfferingVO off =
             configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true, Availability.Optional, 200, null, false, Network.GuestType.Shared, false,
-                null, false, null, true, false, null, false, null, true, false, null, null);
+                null, false, null, true, false, null, false, null, true, false, null, null, false);
 
         assertNotNull("Shared network offering with specifyIpRanges=true failed to create ", off);
     }
@@ -153,7 +153,7 @@
     public void createSharedNtwkOffWithoutSpecifyIpRanges() {
         NetworkOfferingVO off =
                 configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true, Availability.Optional, 200, null, false, Network.GuestType.Shared,
-                        false, null, false, null, false, false, null, false, null, true, false, null, null);
+                        false, null, false, null, false, false, null, false, null, true, false, null, null, false);
         assertNull("Shared network offering with specifyIpRanges=false was created", off);
     }
 
@@ -166,7 +166,7 @@
         serviceProviderMap.put(Network.Service.SourceNat, vrProvider);
         NetworkOfferingVO off =
             configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false, Availability.Optional, 200, serviceProviderMap, false,
-                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, null, null);
+                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, null, null, false);
 
         assertNotNull("Isolated network offering with specifyIpRanges=false failed to create ", off);
     }
@@ -179,7 +179,7 @@
         serviceProviderMap.put(Network.Service.SourceNat, vrProvider);
         NetworkOfferingVO off =
             configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true, Availability.Optional, 200, serviceProviderMap, false,
-                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, null, null);
+                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, null, null, false);
         assertNotNull("Isolated network offering with specifyVlan=true wasn't created", off);
 
     }
@@ -192,7 +192,7 @@
         serviceProviderMap.put(Network.Service.SourceNat, vrProvider);
         NetworkOfferingVO off =
                 configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false, Availability.Optional, 200, serviceProviderMap, false,
-                        Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, null, null);
+                        Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, null, null, false);
         assertNull("Isolated network offering with specifyIpRanges=true and source nat service enabled, was created", off);
     }
 
@@ -203,7 +203,7 @@
         Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
         NetworkOfferingVO off =
             configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false, Availability.Optional, 200, serviceProviderMap, false,
-                Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, null, null);
+                Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, null, null, false);
         assertNotNull("Isolated network offering with specifyIpRanges=true and with no sourceNatService, failed to create", off);
 
     }
@@ -221,7 +221,7 @@
         serviceProviderMap.put(Network.Service.Lb, vrProvider);
         NetworkOfferingVO off =
             configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true, Availability.Optional, 200, serviceProviderMap, false,
-                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null);
+                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, false);
         // System.out.println("Creating Vpc Network Offering");
         assertNotNull("Vpc Isolated network offering with Vpc provider ", off);
     }
@@ -241,7 +241,7 @@
         serviceProviderMap.put(Network.Service.Lb, lbProvider);
         NetworkOfferingVO off =
             configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true, Availability.Optional, 200, serviceProviderMap, false,
-                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null);
+                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, false);
         // System.out.println("Creating Vpc Network Offering");
         assertNotNull("Vpc Isolated network offering with Vpc and Netscaler provider ", off);
     }
diff --git a/services/console-proxy/pom.xml b/services/console-proxy/pom.xml
index 10797fb..6343605 100644
--- a/services/console-proxy/pom.xml
+++ b/services/console-proxy/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-services</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/services/console-proxy/rdpconsole/pom.xml b/services/console-proxy/rdpconsole/pom.xml
index 6b8d4f8..9aa2324 100644
--- a/services/console-proxy/rdpconsole/pom.xml
+++ b/services/console-proxy/rdpconsole/pom.xml
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-service-console-proxy</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/services/console-proxy/server/pom.xml b/services/console-proxy/server/pom.xml
index 342bb8a..200f079 100644
--- a/services/console-proxy/server/pom.xml
+++ b/services/console-proxy/server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-service-console-proxy</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/services/pom.xml b/services/pom.xml
index 03d90f1..9ce818e 100644
--- a/services/pom.xml
+++ b/services/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/services/secondary-storage/controller/pom.xml b/services/secondary-storage/controller/pom.xml
index a5b558c..d15b988 100644
--- a/services/secondary-storage/controller/pom.xml
+++ b/services/secondary-storage/controller/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-service-secondary-storage</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/services/secondary-storage/pom.xml b/services/secondary-storage/pom.xml
index 205bd5a..4962c70 100644
--- a/services/secondary-storage/pom.xml
+++ b/services/secondary-storage/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-services</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/services/secondary-storage/server/pom.xml b/services/secondary-storage/server/pom.xml
index f1b451c..202b430 100644
--- a/services/secondary-storage/server/pom.xml
+++ b/services/secondary-storage/server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack-service-secondary-storage</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
index 636a336..0db5301 100644
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
@@ -101,6 +101,7 @@
 import com.cloud.agent.api.DeleteSnapshotsDirCommand;
 import com.cloud.agent.api.GetStorageStatsAnswer;
 import com.cloud.agent.api.GetStorageStatsCommand;
+import com.cloud.agent.api.HandleConfigDriveIsoAnswer;
 import com.cloud.agent.api.HandleConfigDriveIsoCommand;
 import com.cloud.agent.api.PingCommand;
 import com.cloud.agent.api.PingStorageCommand;
@@ -139,6 +140,7 @@
 import com.cloud.host.Host;
 import com.cloud.host.Host.Type;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.element.NetworkElement;
 import com.cloud.resource.ServerResourceBase;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.Storage;
@@ -320,7 +322,7 @@
     private Answer execute(HandleConfigDriveIsoCommand cmd) {
         if (cmd.isCreate()) {
             if (cmd.getIsoData() == null) {
-                return new Answer(cmd, false, "Invalid config drive ISO data");
+                return new HandleConfigDriveIsoAnswer(cmd, "Invalid config drive ISO data");
             }
             String nfsMountPoint = getRootDir(cmd.getDestStore().getUrl(), _nfsVersion);
             File isoFile = new File(nfsMountPoint, cmd.getIsoFile());
@@ -333,7 +335,7 @@
                 File tmpIsoFile = ConfigDriveBuilder.base64StringToFile(cmd.getIsoData(), tempDir.toAbsolutePath().toString(), cmd.getIsoFile());
                 copyLocalToNfs(tmpIsoFile, new File(cmd.getIsoFile()), cmd.getDestStore());
             } catch (IOException | ConfigurationException e) {
-                return new Answer(cmd, false, "Failed due to exception: " + e.getMessage());
+                return new HandleConfigDriveIsoAnswer(cmd, "Failed due to exception: " + e.getMessage());
             } finally {
                 try {
                     if (tempDir != null) {
@@ -343,7 +345,7 @@
                     s_logger.warn("Failed to delete ConfigDrive temporary directory: " + tempDir.toString(), ioe);
                 }
             }
-            return new Answer(cmd, true, "Successfully saved config drive at secondary storage");
+            return new HandleConfigDriveIsoAnswer(cmd, NetworkElement.Location.SECONDARY, "Successfully saved config drive at secondary storage");
         } else {
             DataStoreTO dstore = cmd.getDestStore();
             if (dstore instanceof NfsTO) {
@@ -354,11 +356,11 @@
                 try {
                     Files.deleteIfExists(tmpltPath.toPath());
                 } catch (IOException e) {
-                    return new Answer(cmd, e);
+                    return new HandleConfigDriveIsoAnswer(cmd, e);
                 }
-                return new Answer(cmd);
+                return new HandleConfigDriveIsoAnswer(cmd);
             } else {
-                return new Answer(cmd, false, "Not implemented yet");
+                return new HandleConfigDriveIsoAnswer(cmd, "Not implemented yet");
             }
         }
     }
diff --git a/systemvm/debian/opt/cloud/bin/filesystem_writable_check.py b/systemvm/debian/opt/cloud/bin/filesystem_writable_check.py
new file mode 100644
index 0000000..eac7d9c
--- /dev/null
+++ b/systemvm/debian/opt/cloud/bin/filesystem_writable_check.py
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import os
+
+
+def check_filesystem():
+    ST_RDONLY = 1
+    if os.ST_RDONLY is not None:
+        ST_RDONLY = os.ST_RDONLY
+
+    stat1 = os.statvfs('/root')
+    readOnly1 = bool(stat1.f_flag & ST_RDONLY)
+
+    if (readOnly1):
+        print "Read-only file system : monitor results (/root) file system is mounted as read-only"
+        exit(1)
+
+    stat2 = os.statvfs('/var/cache/cloud')
+    readOnly2 = bool(stat2.f_flag & ST_RDONLY)
+
+    if (readOnly2):
+        print "Read-only file system : config info (/var/cache/cloud) file system is mounted as read-only"
+        exit(1)
+
+    print "file system is writable"
+    exit(0)
+
+
+if __name__ == "__main__":
+    check_filesystem()
diff --git a/systemvm/pom.xml b/systemvm/pom.xml
index 43ad109..0c54067 100644
--- a/systemvm/pom.xml
+++ b/systemvm/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <properties>
diff --git a/test/integration/component/test_interpod_migration.py b/test/integration/component/test_interpod_migration.py
new file mode 100644
index 0000000..b8b2e97
--- /dev/null
+++ b/test/integration/component/test_interpod_migration.py
@@ -0,0 +1,464 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+""" BVT tests for Virtual Machine Life Cycle
+"""
+# Import Local Modules
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.cloudstackAPI import (attachVolume,
+                                  detachVolume,
+                                  deleteVolume,
+                                  attachIso,
+                                  detachIso,
+                                  deleteIso,
+                                  startVirtualMachine,
+                                  stopVirtualMachine,
+                                  migrateVirtualMachineWithVolume)
+from marvin.lib.utils import (cleanup_resources)
+from marvin.lib.base import (Account,
+                             Host,
+                             Pod,
+                             StoragePool,
+                             ServiceOffering,
+                             DiskOffering,
+                             VirtualMachine,
+                             Iso,
+                             Volume)
+from marvin.lib.common import (get_domain,
+                               get_zone,
+                               get_template)
+from marvin.lib.decoratorGenerators import skipTestIf
+from marvin.codes import FAILED, PASS
+from nose.plugins.attrib import attr
+# Import System modules
+import time
+
+_multiprocess_shared_ = True
+
+
+class TestVMMigration(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        testClient = super(TestVMMigration, cls).getClsTestClient()
+        cls.apiclient = testClient.getApiClient()
+        cls.services = testClient.getParsedTestDataConfig()
+
+        # Get Zone, Domain and templates
+        cls.domain = get_domain(cls.apiclient)
+        cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
+        cls.services['mode'] = cls.zone.networktype
+
+        cls.cleanup = []
+        cls.hypervisorNotSupported = False
+        cls.hypervisor = cls.testClient.getHypervisorInfo()
+        if cls.hypervisor.lower() not in ['vmware']:
+            cls.hypervisorNotSupported = True
+
+        if cls.hypervisorNotSupported == False:
+            cls.pods = Pod.list(cls.apiclient, zoneid=cls.zone.id, listall=True)
+            if len(cls.pods) < 2:
+                assert False, "Not enough pods found: %d" % len(cls.pods)
+            cls.computeOfferingStorageTags = None
+            cls.diskOfferingStorageTags = None
+
+            for pod in cls.pods:
+                podStoragePools = StoragePool.list(
+                    cls.apiclient,
+                    scope='CLUSTER',
+                    podid=pod.id)
+                if len(podStoragePools) < 1:
+                    assert False, "Not enough CLUSTER scope storage pools found for pod: %s" % pod.id
+                taggedPool = []
+                for pool in podStoragePools:
+                    if pool.tags != None and len(pool.tags) > 0:
+                        taggedPool.append(pool)
+                if len(taggedPool) < 2:
+                    assert False, "No CLUSTER scope, tagged storage pools found for pod: %s" % pod.id
+                if cls.computeOfferingStorageTags == None:
+                    cls.computeOfferingStorageTags = taggedPool[0].tags
+                if cls.diskOfferingStorageTags == None:
+                    cls.diskOfferingStorageTags = taggedPool[1].tags
+
+            template = get_template(
+                cls.apiclient,
+                cls.zone.id,
+                cls.services["ostype"])
+            if template == FAILED:
+                assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
+
+            # Set Zones and disk offerings
+            cls.services["small"]["zoneid"] = cls.zone.id
+            cls.services["small"]["template"] = template.id
+
+            cls.services["iso"]["zoneid"] = cls.zone.id
+
+            cls.account = Account.create(
+                cls.apiclient,
+                cls.services["account"],
+                domainid=cls.domain.id)
+            cls.debug(cls.account.id)
+
+            compute_offering_service = cls.services["service_offerings"]["tiny"].copy()
+            compute_offering_service["tags"] = cls.computeOfferingStorageTags
+            cls.service_offering = ServiceOffering.create(
+                cls.apiclient,
+                compute_offering_service)
+            disk_offering_service = cls.services["disk_offering"].copy()
+            disk_offering_service["disksize"] = 1
+            cls.untagged_disk_offering = DiskOffering.create(
+                cls.apiclient,
+                disk_offering_service)
+            disk_offering_service["tags"] = cls.diskOfferingStorageTags
+            cls.tagged_disk_offering = DiskOffering.create(
+                cls.apiclient,
+                disk_offering_service)
+            cls.hostId = None
+            host = cls.getOldestHost(cls.pods[0].id, cls.pods[1].id)
+            if host != None:
+                cls.hostId = host.id
+
+            cls.cleanup = [
+                cls.service_offering,
+                cls.untagged_disk_offering,
+                cls.tagged_disk_offering,
+                cls.account
+            ]
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            cleanup_resources(cls.apiclient, cls.cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.dbclient = self.testClient.getDbConnection()
+        self.virtual_machine = None
+        if self.hypervisorNotSupported == False:
+            self.virtual_machine = VirtualMachine.create(
+                self.apiclient,
+                self.services["small"],
+                accountid=self.account.name,
+                domainid=self.account.domainid,
+                serviceofferingid=self.service_offering.id,
+                mode=self.services['mode'],
+                hostid=self.hostId
+            )
+
+        self.cleanup = []
+
+    def tearDown(self):
+        try:
+            if self.virtual_machine != None:
+                self.virtual_machine.delete(self.apiclient, expunge=True)
+            # Clean up, terminate the created accounts, domains etc
+            cleanup_resources(self.apiclient, self.cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+
+        return
+
+    @classmethod
+    def getOldestHost(cls, pod1_id, pod2_id):
+        selectedHost = None
+        hosts = Host.list(cls.apiclient, type='Routing', podid=pod1_id)
+        morehosts = Host.list(cls.apiclient, type='Routing', podid=pod2_id)
+        if isinstance(morehosts, list) and len(morehosts)>0:
+            if isinstance(hosts, list) and len(hosts)>0:
+                hosts.extend(morehosts)
+        if isinstance(hosts, list) and len(hosts)>0:
+            selectedHost = hosts[0]
+            # Very basic way to get lowest version host
+            for host in hosts:
+                if int(host.hypervisorversion.replace(".",  "")) < int(selectedHost.hypervisorversion.replace(".",  "")):
+                    selectedHost = host
+        return selectedHost
+
+    @skipTestIf("hypervisorNotSupported")
+    @attr(tags=["devcloud", "advanced", "advancedns", "smoke", "basic", "sg"], required_hardware="false")
+    def test_01_migrate_running_vm(self):
+        """Test Running Virtual Machine Migration Without DATA disk or ISO
+        """
+        # Validate the following:
+        # 1. Start VM if not running
+        # 2. Migrate VM to a different pod multiple times
+        vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id)
+        if vmResponse.state != 'Running':
+            self.startVm(vmResponse.id)
+        migrationCount = 1
+        while migrationCount > 0:
+            vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id, 'Running')
+            hostId = self.getDifferentPodHost(vmResponse.id, vmResponse.hostid).id
+            self.debug("#%d migration, current host ID: %s, new host ID: %s" % ((2-migrationCount), vmResponse.hostid, hostId))
+            self.migrateVmWithVolume(vmResponse.id, hostId)
+            migrationCount = migrationCount - 1
+            if migrationCount > 0:
+                time.sleep(self.services["sleep"])
+        return
+
+    @skipTestIf("hypervisorNotSupported")
+    @attr(tags=["devcloud", "advanced", "advancedns", "smoke", "basic", "sg"], required_hardware="false")
+    def test_02_migrate_running_vm_with_disk_and_iso(self):
+        """Test Running Virtual Machine Migration With DATA disks or ISO
+        """
+        # Validate the following:
+        # 1. Start VM if not running
+        # 2. Add disks and ISO to the VM
+        # 3. Migrate VM to a different pod multiple times
+        # 4. Remove disks and ISO from the VM
+        vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id)
+        if vmResponse.state != 'Running':
+            self.startVm(vmResponse.id)
+        vol1 = self.addVolumeToVm(vmResponse.id, self.tagged_disk_offering)
+        vol2 = self.addVolumeToVm(vmResponse.id, self.untagged_disk_offering)
+        # self.addIsoToVm(vmResponse.id)
+        migrationCount = 1
+        while migrationCount > 0:
+            vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id, 'Running')
+            hostId = self.getDifferentPodHost(vmResponse.id, vmResponse.hostid).id
+            self.debug("#%d migration, current host ID: %s, new host ID: %s" % ((2-migrationCount), vmResponse.hostid, hostId))
+            self.migrateVmWithVolume(vmResponse.id, hostId)
+            migrationCount = migrationCount - 1
+            if migrationCount > 0:
+                time.sleep(self.services["sleep"])
+        self.removeVolumeFromVm(vol1.id)
+        self.removeVolumeFromVm(vol2.id)
+        # self.removeIsoFromVm(vmResponse.id, vmResponse.isoid)
+        return
+
+    @skipTestIf("hypervisorNotSupported")
+    @attr(tags=["devcloud", "advanced", "advancedns", "smoke", "basic", "sg"], required_hardware="false")
+    def test_03_migrate_stopped_vm(self):
+        """Test Stopped Virtual Machine Migration Without DATA disk or ISO
+        """
+        # Validate the following:
+        # 1. Stop VM if not already stopped
+        # 2. Migrate VM to a different pod multiple times with volume to pool mapping
+        vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id)
+        if vmResponse.state != 'Stopped':
+            self.stopVm(vmResponse.id)
+        migrationCount = 3
+        while migrationCount > 0:
+            vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id, 'Stopped')
+            migrateTo = self.getDifferentPodVolumeStoragePoolMapping(vmResponse.id)
+            self.debug("#%d migration, mapping: %s" % ((4-migrationCount), migrateTo))
+            self.migrateVmWithVolume(vmResponse.id, None, migrateTo)
+            migrationCount = migrationCount - 1
+            if migrationCount > 0:
+                time.sleep(self.services["sleep"])
+        return
+
+    @skipTestIf("hypervisorNotSupported")
+    @attr(tags=["devcloud", "advanced", "advancedns", "smoke", "basic", "sg"], required_hardware="false")
+    def test_04_migrate_stopped_vm_with_disk_and_iso(self):
+        """Test Stopped Virtual Machine Migration With DATA disk or ISO
+        """
+        # Validate the following:
+        # 1. Start VM if not running
+        # 2. Add disks and ISO to the VM
+        # 3. Stop the VM
+        # 4. Migrate VM to a different pod multiple times with volume to pool mapping
+        # 5. Start VM and remove disks and ISO from the VM
+        vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id)
+        if vmResponse.state != 'Running':
+            self.startVm(vmResponse.id)
+        vol1 = self.addVolumeToVm(vmResponse.id, self.tagged_disk_offering)
+        vol2 = self.addVolumeToVm(vmResponse.id, self.untagged_disk_offering)
+        # self.addIsoToVm(vmResponse.id)
+        self.stopVm(vmResponse.id)
+        migrationCount = 3
+        while migrationCount > 0:
+            vmResponse = self.getVmVerifiedResponse(self.virtual_machine.id, 'Stopped')
+            migrateTo = self.getDifferentPodVolumeStoragePoolMapping(vmResponse.id)
+            self.debug("#%d migration, mapping: %s" % ((4-migrationCount), migrateTo))
+            self.migrateVmWithVolume(vmResponse.id, None, migrateTo)
+            migrationCount = migrationCount - 1
+            if migrationCount > 0:
+                time.sleep(self.services["sleep"])
+        self.removeVolumeFromVm(vol1.id)
+        self.removeVolumeFromVm(vol2.id)
+        # self.removeIsoFromVm(vmResponse.id, vmResponse.isoid)
+        return
+
+    def startVm(self, vm_id):
+        startVirtualMachineCmd = startVirtualMachine.startVirtualMachineCmd()
+        startVirtualMachineCmd.id = vm_id
+        self.apiclient.startVirtualMachine(startVirtualMachineCmd)
+
+    def stopVm(self, vm_id):
+        stopVirtualMachineCmd = stopVirtualMachine.stopVirtualMachineCmd()
+        stopVirtualMachineCmd.id = vm_id
+        self.apiclient.stopVirtualMachine(stopVirtualMachineCmd)
+
+    def addVolumeToVm(self, vm_id, disk_offering):
+        volume = Volume.create(
+            self.apiclient,
+            self.services["volume"],
+            zoneid=self.zone.id,
+            diskofferingid=disk_offering.id,
+            account=self.account.name,
+            domainid=self.account.domainid)
+        cmd = attachVolume.attachVolumeCmd()
+        cmd.id = volume.id
+        cmd.virtualmachineid = vm_id
+        attachedVolume = self.apiclient.attachVolume(cmd)
+        return attachedVolume
+
+    def removeVolumeFromVm(self, volume_id):
+        cmd = detachVolume.detachVolumeCmd()
+        cmd.id = volume_id
+        detachedVolume = self.apiclient.detachVolume(cmd)
+        cmd = deleteVolume.deleteVolumeCmd()
+        cmd.id = volume_id
+        self.apiclient.deleteVolume(cmd)
+        return
+
+    def addIsoToVm(self, vm_id):
+        iso = Iso.create(
+           self.apiclient,
+           self.services["iso"],
+           account=self.account.name,
+           domainid=self.account.domainid)
+        cmd = attachIso.attachIsoCmd()
+        cmd.id = iso.id
+        cmd.virtualmachineid = vm_id
+        attachedIso = self.apiclient.attachIso(cmd)
+        return
+
+    def removeIsoFromVm(self, vm_id, iso_id):
+        cmd = detachIso.detachIsoCmd()
+        cmd.virtualmachineid = vm_id
+        self.apiclient.detachIso(cmd)
+        cmd = deleteIso.deleteIsoCmd()
+        cmd.id = iso_id
+        self.apiclient.deleteIso(cmd)
+        return
+
+    def getVmVerifiedResponse(self, vm_id, state=None):
+        list_vm_response = VirtualMachine.list(
+            self.apiclient,
+            id=self.virtual_machine.id)
+        self.debug(
+            "Verify listVirtualMachines response for virtual machine: %s" \
+            % self.virtual_machine.id)
+        self.assertEqual(
+            isinstance(list_vm_response, list),
+            True,
+            "Check list response returns a valid list")
+        self.assertNotEqual(
+            len(list_vm_response),
+            0,
+            "Check VM available in List Virtual Machines")
+        vmResponse = list_vm_response[0]
+        if state != None:
+            self.assertEqual(
+                vmResponse.state,
+                state,
+                "VM not in state: %s" % state)
+        return vmResponse
+
+    def getDifferentPodHost(self, vm_id, host_id):
+        host = None
+        currentHost = Host.list(self.apiclient, id=host_id)
+        self.assertEqual(
+            isinstance(currentHost, list),
+            True,
+            "Check host list response returns a valid list")
+        self.assertNotEqual(
+            len(currentHost),
+            0,
+            "Check current host for VM  ID: %s available in List Hosts" % vm_id)
+        currentHost = currentHost[0]
+        hosts = Host.listForMigration(self.apiclient, virtualmachineid=vm_id)
+        self.assertEqual(
+            isinstance(hosts, list),
+            True,
+            "Check host list response returns a valid list")
+        self.assertNotEqual(
+            len(hosts),
+            0,
+            "Hosts suitable for migration for VM ID: %s not found" % vm_id)
+        for hostForMigration in hosts:
+            if hostForMigration.podid != currentHost.podid:
+                host = hostForMigration
+                break
+        self.assertNotEqual(
+            host,
+            None,
+            "Host suitable for migration for VM ID: %s in a different pod not found" % vm_id)
+        return host
+
+    def getPodStoragePoolWithTags(self, pod_id, tags=None):
+        pool = None
+        storage_pools = StoragePool.list(
+            self.apiclient,
+            podid=pod_id,
+            listall=True)
+        if isinstance(storage_pools, list) and len(storage_pools) > 0:
+            if tags != None:
+                for storage_pool in storage_pools:
+                    if storage_pool.tags == tags:
+                        pool = storage_pool
+                        break
+            else:
+                pool = storage_pool[0]
+        return pool
+
+    def getDifferentPodVolumeStoragePoolMapping(self, vm_id):
+        rootVolume = Volume.list(self.apiclient, virtualmachineid=vm_id, listall=True, type='ROOT')
+        self.assertEqual(
+            isinstance(rootVolume, list),
+            True,
+            "Check VM volumes list response returns a valid list")
+        self.assertNotEqual(
+            len(rootVolume),
+            0,
+            "Check VM ROOT volume available in List Volumes")
+        rootVolume = rootVolume[0]
+        volumeStoragePool = StoragePool.list(
+            self.apiclient,
+            id=rootVolume.storageid)
+        self.assertEqual(
+            isinstance(volumeStoragePool, list),
+            True,
+            "Check VM ROOT Volume storage list response returns a valid list")
+        self.assertNotEqual(
+            len(volumeStoragePool),
+            0,
+            "Check VM ROOT Volume storage available in List Storage Pools")
+        volumeStoragePool = volumeStoragePool[0]
+        podId = self.pods[0].id
+        if volumeStoragePool.podid == podId:
+            podId = self.pods[1].id
+        pool = self.getPodStoragePoolWithTags(podId, self.computeOfferingStorageTags)
+        self.assertNotEqual(
+            pool,
+            None,
+            "Target storage pool mapping for VM ID: %s failed" % vm_id)
+        migrateTo = { "volume": rootVolume.id, "pool": pool.id}
+        return [migrateTo]
+
+    def migrateVmWithVolume(self, vm_id, host_id, migrate_to=None):
+        migrateVirtualMachineWithVolumeCmd = migrateVirtualMachineWithVolume.migrateVirtualMachineWithVolumeCmd()
+        migrateVirtualMachineWithVolumeCmd.virtualmachineid = vm_id
+        if host_id != None:
+            migrateVirtualMachineWithVolumeCmd.hostid = host_id
+        if migrate_to != None:
+            migrateVirtualMachineWithVolumeCmd.migrateto = migrate_to
+        response = self.apiclient.migrateVirtualMachineWithVolume(migrateVirtualMachineWithVolumeCmd)
+        return response
diff --git a/test/integration/plugins/scaleio/README.md b/test/integration/plugins/scaleio/README.md
new file mode 100644
index 0000000..0e48fc1
--- /dev/null
+++ b/test/integration/plugins/scaleio/README.md
@@ -0,0 +1,46 @@
+# PowerFlex/ScaleIO storage plugin
+==================================
+This directory contains the basic VM, Volume life cycle tests for PowerFlex/ScaleIO storage pool (in KVM hypervisor).
+
+# Running tests
+===============
+To run the basic volume tests, first update the below test data of the CloudStack environment
+
+````
+TestData.zoneId: <id of zone>
+TestData.clusterId: <id of cluster>
+TestData.domainId: <id of domain>
+TestData.url: <management server IP>
+TestData.primaryStorage "url": <PowerFlex/ScaleIO storage pool url (see the format below) to use as primary storage>
+````
+
+and to enable and run volume migration tests, update the below test data
+
+````
+TestData.migrationTests: True
+TestData.primaryStorageSameInstance "url": <PowerFlex/ScaleIO storage pool url (see the format below) of the pool on same storage cluster as TestData.primaryStorage>
+TestData.primaryStorageDistinctInstance "url": <PowerFlex/ScaleIO storage pool url (see the format below) of the pool not on the same storage cluster as TestData.primaryStorage>
+````
+
+PowerFlex/ScaleIO storage pool url format:
+
+````
+powerflex://<api_user>:<api_password>@<gateway>/<storagepool>
+
+    where,
+    -	<api_user> : user name for API access
+    -	<api_password> : url-encoded password for API access
+    -	<gateway> : scaleio gateway host
+    -	<storagepool> : storage pool name (case sensitive)
+
+
+For example: "powerflex://admin:P%40ssword123@10.10.2.130/cspool"
+````
+
+Then run the tests using python unittest runner: nosetests
+
+````
+nosetests --with-marvin --marvin-config=<marvin-cfg-file> <cloudstack-dir>/test/integration/plugins/scaleio/test_scaleio_volumes.py --zone=<zone> --hypervisor=kvm
+````
+
+You can also run these tests out of the box with PyDev or PyCharm or whatever.
diff --git a/test/integration/plugins/scaleio/test_scaleio_volumes.py b/test/integration/plugins/scaleio/test_scaleio_volumes.py
new file mode 100644
index 0000000..c67f838
--- /dev/null
+++ b/test/integration/plugins/scaleio/test_scaleio_volumes.py
@@ -0,0 +1,1213 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import logging
+import random
+import time
+
+# All tests inherit from cloudstackTestCase
+from marvin.cloudstackTestCase import cloudstackTestCase
+
+# Import Integration Libraries
+# base - contains all resources as entities and defines create, delete, list operations on them
+from marvin.lib.base import Account, DiskOffering, ServiceOffering, Snapshot, StoragePool, Template, User, VirtualMachine, Volume
+
+# common - commonly used methods for all tests are listed here
+from marvin.lib.common import get_domain, get_template, get_zone, list_clusters, list_hosts, list_virtual_machines, \
+    list_volumes
+
+# utils - utility classes for common cleanup, external library wrappers, etc.
+from marvin.lib.utils import cleanup_resources, validateList
+from marvin.codes import PASS
+from nose.plugins.attrib import attr
+
+# Prerequisites:
+#  Only one zone
+#  Only one pod
+#  Only one cluster
+#
+#  One PowerFlex/ScaleIO storage pool for basic tests
+#  Only KVM hypervisor is supported for PowerFlex/ScaleIO storage pool
+#  KVM host(s) with ScaleIO Data Client (SDC) installed and connected to Metadata Manager (MDM)
+#
+#  For volume migration tests, additional storage pool(s) are required
+#  One PowerFlex/ScaleIO storage pool on the same ScaleIO storage cluster/instance
+#  One PowerFlex/ScaleIO storage pool on different ScaleIO storage cluster/instance
+#
+
+class TestData():
+    # constants
+    account = "account"
+    clusterId = "clusterId"
+    computeOffering = "computeoffering"
+    diskName = "diskname"
+    diskOffering = "diskoffering"
+    diskOfferingSameInstance = "diskOfferingSameInstance"
+    diskOfferingDistinctInstance = "diskOfferingDistinctInstance"
+    domainId = "domainId"
+    hypervisor = "hypervisor"
+    kvm = "kvm"
+    login = "login"
+    gatewayip = "gatewayip"
+    one_GB_in_bytes = 1073741824
+    password = "password"
+    port = "port"
+    primaryStorage = "primarystorage"
+    primaryStorageSameInstance = "primaryStorageSameInstance"
+    primaryStorageDistinctInstance = "primaryStorageDistinctInstance"
+    provider = "provider"
+    scope = "scope"
+    powerFlex = "powerflex"
+    storageTag = "pflex"
+    storageTagSameInstance = "pflexsame"
+    storageTagDistinctInstance = "pflexdiff"
+    tags = "tags"
+    templateCacheNameKvm = "centos55-x86-64"
+    testAccount = "testaccount"
+    url = "url"
+    user = "user"
+    username = "username"
+    virtualMachine = "virtualmachine"
+    virtualMachine2 = "virtualmachine2"
+    virtualMachine3 = "virtualmachine3"
+    virtualMachine4 = "virtualmachine4"
+    volume_1 = "volume_1"
+    volume_2 = "volume_2"
+    volume_3 = "volume_3"
+    volume_4 = "volume_4"
+    kvm = "kvm"
+    zoneId = "zoneId"
+    migrationTests = "migrationTests"
+
+    # hypervisor type to test
+    hypervisor_type = kvm
+
+    def __init__(self):
+        self.testdata = {
+            TestData.kvm: {
+                TestData.username: "root",
+                TestData.password: "P@ssword123"
+            },
+            TestData.account: {
+                "email": "test1@test1.com",
+                "firstname": "John",
+                "lastname": "Doe",
+                "username": "test1",
+                "password": "test"
+            },
+            TestData.testAccount: {
+                "email": "test2@test2.com",
+                "firstname": "Jane",
+                "lastname": "Doe",
+                "username": "test2",
+                "password": "test"
+            },
+            TestData.user: {
+                "email": "user@test1.com",
+                "firstname": "Jane",
+                "lastname": "Doe",
+                "username": "test1user",
+                "password": "password"
+            },
+            TestData.primaryStorage: {
+                "name": "PowerFlexPool-%d" % random.randint(0, 100),
+                TestData.scope: "ZONE",
+                "url": "powerflex://admin:P%40ssword123@10.10.4.141/cspool01",
+                TestData.provider: "PowerFlex",
+                TestData.tags: TestData.storageTag + "," + TestData.storageTagSameInstance + "," + TestData.storageTagDistinctInstance,
+                TestData.hypervisor: "KVM"
+            },
+            TestData.virtualMachine: {
+                "name": "TestVM1",
+                "displayname": "Test VM 1"
+            },
+            TestData.virtualMachine2: {
+                "name": "TestVM2",
+                "displayname": "Test VM 2"
+            },
+            TestData.virtualMachine3: {
+                "name": "TestVM3",
+                "displayname": "Test VM 3"
+            },
+            TestData.virtualMachine4: {
+                "name": "TestVM4",
+                "displayname": "Test VM 4"
+            },
+            TestData.computeOffering: {
+                "name": "PowerFlex_Compute",
+                "displaytext": "PowerFlex_Compute",
+                "cpunumber": 1,
+                "cpuspeed": 500,
+                "memory": 512,
+                "storagetype": "shared",
+                TestData.tags: TestData.storageTag
+            },
+            TestData.diskOffering: {
+                "name": "PowerFlex_Disk",
+                "displaytext": "PowerFlex_Disk",
+                "disksize": 8,
+                TestData.tags: TestData.storageTag,
+                "storagetype": "shared"
+            },
+            TestData.volume_1: {
+                TestData.diskName: "test-volume-1",
+            },
+            TestData.volume_2: {
+                TestData.diskName: "test-volume-2",
+            },
+            TestData.volume_3: {
+                TestData.diskName: "test-volume-3",
+            },
+            TestData.volume_4: {
+                TestData.diskName: "test-volume-4",
+            },
+            TestData.zoneId: 1,
+            TestData.clusterId: 1,
+            TestData.domainId: 1,
+            TestData.url: "10.10.3.226",
+            # for volume migration tests
+            TestData.migrationTests: True,
+            # PowerFlex/ScaleIO storage pool on the same ScaleIO storage instance
+            TestData.primaryStorageSameInstance: {
+                "name": "PowerFlexPool-%d" % random.randint(0, 100),
+                TestData.scope: "ZONE",
+                "url": "powerflex://admin:P%40ssword123@10.10.4.141/cspool02",
+                TestData.provider: "PowerFlex",
+                TestData.tags: TestData.storageTag + "," + TestData.storageTagSameInstance,
+                TestData.hypervisor: "KVM"
+            },
+            # PowerFlex/ScaleIO storage pool on different ScaleIO storage instance
+            TestData.primaryStorageDistinctInstance: {
+                "name": "PowerFlexPool-%d" % random.randint(0, 100),
+                TestData.scope: "ZONE",
+                "url": "powerflex://admin:P%40ssword123@10.10.4.194/cloudstackpool",
+                TestData.provider: "PowerFlex",
+                TestData.tags: TestData.storageTag + "," + TestData.storageTagDistinctInstance,
+                TestData.hypervisor: "KVM"
+            },
+            TestData.diskOfferingSameInstance: {
+                "name": "PowerFlex_Disk_Same_Inst",
+                "displaytext": "PowerFlex_Disk_Same_Inst",
+                "disksize": 8,
+                TestData.tags: TestData.storageTagSameInstance,
+                "storagetype": "shared"
+            },
+            TestData.diskOfferingDistinctInstance: {
+                "name": "PowerFlex_Disk_Diff_Inst",
+                "displaytext": "PowerFlex_Disk_Diff_Inst",
+                "disksize": 8,
+                TestData.tags: TestData.storageTagDistinctInstance,
+                "storagetype": "shared"
+            },
+        }
+
+
+class TestScaleIOVolumes(cloudstackTestCase):
+    _volume_vm_id_and_vm_id_do_not_match_err_msg = "The volume's VM ID and the VM's ID do not match."
+    _vm_not_in_running_state_err_msg = "The VM is not in the 'Running' state."
+    _vm_not_in_stopped_state_err_msg = "The VM is not in the 'Stopped' state."
+
+    @classmethod
+    def setUpClass(cls):
+        # Set up API client
+        testclient = super(TestScaleIOVolumes, cls).getClsTestClient()
+
+        cls.apiClient = testclient.getApiClient()
+        cls.configData = testclient.getParsedTestDataConfig()
+        cls.dbConnection = testclient.getDbConnection()
+        cls.testdata = TestData().testdata
+
+        # Get Resources from Cloud Infrastructure
+        cls.zone = get_zone(cls.apiClient, zone_id=cls.testdata[TestData.zoneId])
+        cls.cluster = list_clusters(cls.apiClient)[0]
+        cls.template = get_template(cls.apiClient, cls.zone.id, hypervisor=TestData.hypervisor_type)
+        cls.domain = get_domain(cls.apiClient, cls.testdata[TestData.domainId])
+
+        # Create test account
+        cls.account = Account.create(
+            cls.apiClient,
+            cls.testdata["account"],
+            admin=1
+        )
+
+        # Set up connection to make customized API calls
+        cls.user = User.create(
+            cls.apiClient,
+            cls.testdata["user"],
+            account=cls.account.name,
+            domainid=cls.domain.id
+        )
+
+        url = cls.testdata[TestData.url]
+
+        primarystorage = cls.testdata[TestData.primaryStorage]
+
+        cls.primary_storage = StoragePool.create(
+            cls.apiClient,
+            primarystorage,
+            scope=primarystorage[TestData.scope],
+            zoneid=cls.zone.id,
+            provider=primarystorage[TestData.provider],
+            tags=primarystorage[TestData.tags],
+            hypervisor=primarystorage[TestData.hypervisor]
+        )
+
+        cls.compute_offering = ServiceOffering.create(
+            cls.apiClient,
+            cls.testdata[TestData.computeOffering]
+        )
+
+        cls.disk_offering = DiskOffering.create(
+            cls.apiClient,
+            cls.testdata[TestData.diskOffering]
+        )
+
+        if TestData.migrationTests:
+            primarystorage_sameinst = cls.testdata[TestData.primaryStorageSameInstance]
+            cls.primary_storage_same_inst = StoragePool.create(
+                cls.apiClient,
+                primarystorage_sameinst,
+                scope=primarystorage_sameinst[TestData.scope],
+                zoneid=cls.zone.id,
+                provider=primarystorage_sameinst[TestData.provider],
+                tags=primarystorage_sameinst[TestData.tags],
+                hypervisor=primarystorage_sameinst[TestData.hypervisor]
+            )
+
+            primarystorage_distinctinst = cls.testdata[TestData.primaryStorageDistinctInstance]
+            cls.primary_storage_distinct_inst = StoragePool.create(
+                cls.apiClient,
+                primarystorage_distinctinst,
+                scope=primarystorage_distinctinst[TestData.scope],
+                zoneid=cls.zone.id,
+                provider=primarystorage_distinctinst[TestData.provider],
+                tags=primarystorage_distinctinst[TestData.tags],
+                hypervisor=primarystorage_distinctinst[TestData.hypervisor]
+            )
+
+            cls.disk_offering_same_inst = DiskOffering.create(
+                cls.apiClient,
+                cls.testdata[TestData.diskOfferingSameInstance]
+            )
+
+            cls.disk_offering_distinct_inst = DiskOffering.create(
+                cls.apiClient,
+                cls.testdata[TestData.diskOfferingDistinctInstance]
+            )
+
+
+        # Create VM and volume for tests
+        cls.virtual_machine = VirtualMachine.create(
+            cls.apiClient,
+            cls.testdata[TestData.virtualMachine],
+            accountid=cls.account.name,
+            zoneid=cls.zone.id,
+            serviceofferingid=cls.compute_offering.id,
+            templateid=cls.template.id,
+            domainid=cls.domain.id,
+            startvm=False
+        )
+
+        TestScaleIOVolumes._start_vm(cls.virtual_machine)
+
+        cls.volume = Volume.create(
+            cls.apiClient,
+            cls.testdata[TestData.volume_1],
+            account=cls.account.name,
+            domainid=cls.domain.id,
+            zoneid=cls.zone.id,
+            diskofferingid=cls.disk_offering.id
+        )
+
+        # Resources that are to be destroyed
+        cls._cleanup = [
+            cls.volume,
+            cls.virtual_machine,
+            cls.compute_offering,
+            cls.disk_offering,
+            cls.user,
+            cls.account
+        ]
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            if TestData.migrationTests:
+                cls._cleanup.append(cls.disk_offering_same_inst)
+                cls._cleanup.append(cls.disk_offering_distinct_inst)
+
+            cleanup_resources(cls.apiClient, cls._cleanup)
+
+            cls.primary_storage.delete(cls.apiClient)
+
+            if TestData.migrationTests:
+                cls.primary_storage_same_inst.delete(cls.apiClient)
+                cls.primary_storage_distinct_inst.delete(cls.apiClient)
+
+        except Exception as e:
+            logging.debug("Exception in tearDownClass(cls): %s" % e)
+
+    def setUp(self):
+        self.attached = False
+        self.cleanup = []
+
+    def tearDown(self):
+        if self.attached:
+            self.virtual_machine.detach_volume(self.apiClient, self.volume)
+
+        cleanup_resources(self.apiClient, self.cleanup)
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_01_create_vm_with_volume(self):
+        '''Create VM with attached volume and expunge VM'''
+
+        #######################################
+        # STEP 1: Create VM and attach volume #
+        #######################################
+
+        test_virtual_machine = VirtualMachine.create(
+            self.apiClient,
+            self.testdata[TestData.virtualMachine2],
+            accountid=self.account.name,
+            zoneid=self.zone.id,
+            serviceofferingid=self.compute_offering.id,
+            templateid=self.template.id,
+            domainid=self.domain.id,
+            startvm=False
+        )
+
+        TestScaleIOVolumes._start_vm(test_virtual_machine)
+
+        self.volume = test_virtual_machine.attach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = True
+
+        vm = self._get_vm(test_virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+        #######################################
+        #   STEP 2: Destroy and Expunge VM    #
+        #######################################
+
+        test_virtual_machine.delete(self.apiClient, True)
+
+        self.attached = False
+
+        vol = self._get_volume(self.volume.id)
+
+        self.assertEqual(
+            vol.virtualmachineid,
+            None,
+            "Check if attached to virtual machine"
+        )
+
+        self.assertEqual(
+            vol.vmname,
+            None,
+            "Check if VM was expunged"
+        )
+
+        list_virtual_machine_response = list_virtual_machines(
+            self.apiClient,
+            id=test_virtual_machine.id
+        )
+
+        self.assertEqual(
+            list_virtual_machine_response,
+            None,
+            "Check if VM was actually expunged"
+        )
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_02_attach_new_volume_to_stopped_vm(self):
+        '''Attach a volume to a stopped virtual machine, then start VM'''
+
+        self.virtual_machine.stop(self.apiClient)
+
+        new_volume = Volume.create(
+            self.apiClient,
+            self.testdata[TestData.volume_2],
+            account=self.account.name,
+            domainid=self.domain.id,
+            zoneid=self.zone.id,
+            diskofferingid=self.disk_offering.id
+        )
+
+        self.cleanup.append(new_volume)
+
+        new_volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            vm.state.lower(),
+            "running",
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+        # Detach volume
+        new_volume = self.virtual_machine.detach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        self.assertEqual(
+            new_volume.virtualmachineid,
+            None,
+            "The volume should not be attached to a VM."
+        )
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_03_attach_detach_attach_volume_to_vm(self):
+        '''Attach, detach, and attach volume to a running VM'''
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        #######################################
+        # STEP 1: Attach volume to running VM #
+        #######################################
+
+        self.volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = True
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+        #########################################
+        # STEP 2: Detach volume from running VM #
+        #########################################
+
+        self.volume = self.virtual_machine.detach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = False
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            None,
+            "The volume should not be attached to a VM."
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            str(vm.state)
+        )
+
+        #######################################
+        # STEP 3: Attach volume to running VM #
+        #######################################
+
+        self.volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = True
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_04_detach_vol_stopped_vm_start(self):
+        '''Detach volume from a stopped VM, then start.'''
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        #######################################
+        # STEP 1: Attach volume to running VM #
+        #######################################
+
+        self.volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = True
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+        #########################################
+        # STEP 2: Detach volume from stopped VM #
+        #########################################
+
+        self.virtual_machine.stop(self.apiClient)
+
+        self.volume = self.virtual_machine.detach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = False
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            None,
+            "The volume should not be attached to a VM."
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'stopped',
+            TestScaleIOVolumes._vm_not_in_stopped_state_err_msg
+        )
+
+        #######################################
+        # STEP 3: Start VM with detached vol  #
+        #######################################
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_05_attach_volume_to_stopped_vm(self):
+        '''Attach a volume to a stopped virtual machine, then start VM'''
+
+        self.virtual_machine.stop(self.apiClient)
+
+        #######################################
+        # STEP 1: Attach volume to stopped VM #
+        #######################################
+
+        self.volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = True
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'stopped',
+            TestScaleIOVolumes._vm_not_in_stopped_state_err_msg
+        )
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_06_attached_volume_reboot_vm(self):
+        '''Attach volume to running VM, then reboot.'''
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        #######################################
+        # STEP 1: Attach volume to running VM #
+        #######################################
+
+        self.volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = True
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+        #######################################
+        # STEP 2: Reboot VM with attached vol #
+        #######################################
+        TestScaleIOVolumes._reboot_vm(self.virtual_machine)
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_07_detach_volume_reboot_vm(self):
+        '''Detach volume from a running VM, then reboot.'''
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        #######################################
+        # STEP 1: Attach volume to running VM #
+        #######################################
+
+        self.volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = True
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            vm.id,
+            TestScaleIOVolumes._volume_vm_id_and_vm_id_do_not_match_err_msg
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+        #########################################
+        # STEP 2: Detach volume from running VM #
+        #########################################
+
+        self.volume = self.virtual_machine.detach_volume(
+            self.apiClient,
+            self.volume
+        )
+
+        self.attached = False
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            self.volume.virtualmachineid,
+            None,
+            "The volume should not be attached to a VM."
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+        #######################################
+        # STEP 3: Reboot VM with detached vol #
+        #######################################
+
+        self.virtual_machine.reboot(self.apiClient)
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            TestScaleIOVolumes._vm_not_in_running_state_err_msg
+        )
+
+    @attr(tags=['basic'], required_hardware=False)
+    def test_08_delete_volume_was_attached(self):
+        '''Delete volume that was attached to a VM and is detached now'''
+
+        TestScaleIOVolumes._start_vm(self.virtual_machine)
+
+        #######################################
+        # STEP 1: Create vol and attach to VM #
+        #######################################
+
+        new_volume = Volume.create(
+            self.apiClient,
+            self.testdata[TestData.volume_2],
+            account=self.account.name,
+            domainid=self.domain.id,
+            zoneid=self.zone.id,
+            diskofferingid=self.disk_offering.id
+        )
+
+        volume_to_delete_later = new_volume
+
+        new_volume = self.virtual_machine.attach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            new_volume.virtualmachineid,
+            vm.id,
+            "Check if attached to virtual machine"
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            str(vm.state)
+        )
+
+        #######################################
+        #  STEP 2: Detach and delete volume   #
+        #######################################
+
+        new_volume = self.virtual_machine.detach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        vm = self._get_vm(self.virtual_machine.id)
+
+        self.assertEqual(
+            new_volume.virtualmachineid,
+            None,
+            "Check if attached to virtual machine"
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            str(vm.state)
+        )
+
+        volume_to_delete_later.delete(self.apiClient)
+
+        list_volumes_response = list_volumes(
+            self.apiClient,
+            id=new_volume.id
+        )
+
+        self.assertEqual(
+            list_volumes_response,
+            None,
+            "Check volume was deleted"
+        )
+
+    @attr(tags=['advanced', 'migration'], required_hardware=False)
+    def test_09_migrate_volume_to_same_instance_pool(self):
+        '''Migrate volume to the same instance pool'''
+
+        if not TestData.migrationTests:
+            self.skipTest("Volume migration tests not enabled, skipping test")
+
+        #######################################
+        # STEP 1: Create VM and Start VM      #
+        #######################################
+
+        test_virtual_machine = VirtualMachine.create(
+            self.apiClient,
+            self.testdata[TestData.virtualMachine3],
+            accountid=self.account.name,
+            zoneid=self.zone.id,
+            serviceofferingid=self.compute_offering.id,
+            templateid=self.template.id,
+            domainid=self.domain.id,
+            startvm=False
+        )
+
+        TestScaleIOVolumes._start_vm(test_virtual_machine)
+
+        #######################################
+        # STEP 2: Create vol and attach to VM #
+        #######################################
+
+        new_volume = Volume.create(
+            self.apiClient,
+            self.testdata[TestData.volume_3],
+            account=self.account.name,
+            domainid=self.domain.id,
+            zoneid=self.zone.id,
+            diskofferingid=self.disk_offering_same_inst.id
+        )
+
+        volume_to_delete_later = new_volume
+
+        new_volume = test_virtual_machine.attach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        vm = self._get_vm(test_virtual_machine.id)
+
+        self.assertEqual(
+            new_volume.virtualmachineid,
+            vm.id,
+            "Check if attached to virtual machine"
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            str(vm.state)
+        )
+
+        #######################################
+        # STEP 3: Stop VM and Migrate volume  #
+        #######################################
+
+        test_virtual_machine.stop(self.apiClient)
+
+        vm = self._get_vm(test_virtual_machine.id)
+
+        self.assertEqual(
+            vm.state.lower(),
+            'stopped',
+            str(vm.state)
+        )
+
+        pools = StoragePool.listForMigration(
+            self.apiClient,
+            id=new_volume.id
+        )
+
+        if not pools:
+            self.skipTest("No suitable storage pools found for volume migration, skipping test")
+
+        self.assertEqual(
+            validateList(pools)[0],
+            PASS,
+            "Invalid pool response from findStoragePoolsForMigration API"
+        )
+
+        pool = pools[0]
+        self.debug("Migrating Volume-ID: %s to Same Instance Pool: %s" % (new_volume.id, pool.id))
+
+        try:
+            Volume.migrate(
+                self.apiClient,
+                volumeid=new_volume.id,
+                storageid=pool.id
+            )
+        except Exception as e:
+            self.fail("Volume migration failed with error %s" % e)
+
+        #######################################
+        #  STEP 4: Detach and delete volume   #
+        #######################################
+
+        new_volume = test_virtual_machine.detach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        self.assertEqual(
+            new_volume.virtualmachineid,
+            None,
+            "Check if attached to virtual machine"
+        )
+
+        volume_to_delete_later.delete(self.apiClient)
+
+        list_volumes_response = list_volumes(
+            self.apiClient,
+            id=new_volume.id
+        )
+
+        self.assertEqual(
+            list_volumes_response,
+            None,
+            "Check volume was deleted"
+        )
+
+        #######################################
+        #  STEP 4: Delete VM                  #
+        #######################################
+
+        test_virtual_machine.delete(self.apiClient, True)
+
+    @attr(tags=['advanced', 'migration'], required_hardware=False)
+    def test_10_migrate_volume_to_distinct_instance_pool(self):
+        '''Migrate volume to distinct instance pool'''
+
+        if not TestData.migrationTests:
+            self.skipTest("Volume migration tests not enabled, skipping test")
+
+        #######################################
+        # STEP 1: Create VM and Start VM      #
+        #######################################
+
+        test_virtual_machine = VirtualMachine.create(
+            self.apiClient,
+            self.testdata[TestData.virtualMachine4],
+            accountid=self.account.name,
+            zoneid=self.zone.id,
+            serviceofferingid=self.compute_offering.id,
+            templateid=self.template.id,
+            domainid=self.domain.id,
+            startvm=False
+        )
+
+        TestScaleIOVolumes._start_vm(test_virtual_machine)
+
+        #######################################
+        # STEP 2: Create vol and attach to VM #
+        #######################################
+
+        new_volume = Volume.create(
+            self.apiClient,
+            self.testdata[TestData.volume_4],
+            account=self.account.name,
+            domainid=self.domain.id,
+            zoneid=self.zone.id,
+            diskofferingid=self.disk_offering_distinct_inst.id
+        )
+
+        volume_to_delete_later = new_volume
+
+        new_volume = test_virtual_machine.attach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        vm = self._get_vm(test_virtual_machine.id)
+
+        self.assertEqual(
+            new_volume.virtualmachineid,
+            vm.id,
+            "Check if attached to virtual machine"
+        )
+
+        self.assertEqual(
+            vm.state.lower(),
+            'running',
+            str(vm.state)
+        )
+
+        #######################################
+        # STEP 3: Stop VM and Migrate volume  #
+        #######################################
+
+        test_virtual_machine.stop(self.apiClient)
+
+        vm = self._get_vm(test_virtual_machine.id)
+
+        self.assertEqual(
+            vm.state.lower(),
+            'stopped',
+            str(vm.state)
+        )
+
+        pools = StoragePool.listForMigration(
+            self.apiClient,
+            id=new_volume.id
+        )
+
+        if not pools:
+            self.skipTest("No suitable storage pools found for volume migration, skipping test")
+
+        self.assertEqual(
+            validateList(pools)[0],
+            PASS,
+            "Invalid pool response from findStoragePoolsForMigration API"
+        )
+
+        pool = pools[0]
+        self.debug("Migrating Volume-ID: %s to Distinct Instance Pool: %s" % (new_volume.id, pool.id))
+
+        try:
+            Volume.migrate(
+                self.apiClient,
+                volumeid=new_volume.id,
+                storageid=pool.id
+            )
+        except Exception as e:
+            self.fail("Volume migration failed with error %s" % e)
+
+        #######################################
+        #  STEP 4: Detach and delete volume   #
+        #######################################
+
+        new_volume = test_virtual_machine.detach_volume(
+            self.apiClient,
+            new_volume
+        )
+
+        self.assertEqual(
+            new_volume.virtualmachineid,
+            None,
+            "Check if attached to virtual machine"
+        )
+
+        volume_to_delete_later.delete(self.apiClient)
+
+        list_volumes_response = list_volumes(
+            self.apiClient,
+            id=new_volume.id
+        )
+
+        self.assertEqual(
+            list_volumes_response,
+            None,
+            "Check volume was deleted"
+        )
+
+        #######################################
+        #  STEP 4: Delete VM                  #
+        #######################################
+
+        test_virtual_machine.delete(self.apiClient, True)
+
+
+    def _create_vm_using_template_and_destroy_vm(self, template):
+        vm_name = "VM-%d" % random.randint(0, 100)
+
+        virtual_machine_dict = {"name": vm_name, "displayname": vm_name}
+
+        virtual_machine = VirtualMachine.create(
+            self.apiClient,
+            virtual_machine_dict,
+            accountid=self.account.name,
+            zoneid=self.zone.id,
+            serviceofferingid=self.compute_offering.id,
+            templateid=template.id,
+            domainid=self.domain.id,
+            startvm=True
+        )
+
+        list_volumes_response = list_volumes(
+            self.apiClient,
+            virtualmachineid=virtual_machine.id,
+            listall=True
+        )
+
+        vm_root_volume = list_volumes_response[0]
+        vm_root_volume_name = vm_root_volume.name
+
+        virtual_machine.delete(self.apiClient, True)
+
+    def _get_bytes_from_gb(self, number_in_gb):
+        return number_in_gb * 1024 * 1024 * 1024
+
+    def _get_volume(self, volume_id):
+        list_vols_response = list_volumes(self.apiClient, id=volume_id)
+        return list_vols_response[0]
+
+    def _get_vm(self, vm_id):
+        list_vms_response = list_virtual_machines(self.apiClient, id=vm_id)
+        return list_vms_response[0]
+
+    def _get_template_cache_name(self):
+        if TestData.hypervisor_type == TestData.kvm:
+            return TestData.templateCacheNameKvm
+
+        self.assert_(False, "Invalid hypervisor type")
+
+
+    @classmethod
+    def _start_vm(cls, vm):
+        vm_for_check = list_virtual_machines(
+            cls.apiClient,
+            id=vm.id
+        )[0]
+
+        if vm_for_check.state == VirtualMachine.STOPPED:
+            vm.start(cls.apiClient)
+
+            # For KVM, just give it 90 seconds to boot up.
+            if TestData.hypervisor_type == TestData.kvm:
+                time.sleep(90)
+
+    @classmethod
+    def _reboot_vm(cls, vm):
+        vm.reboot(cls.apiClient)
+
+        # For KVM, just give it 90 seconds to boot up.
+        if TestData.hypervisor_type == TestData.kvm:
+            time.sleep(90)
diff --git a/test/integration/smoke/test_network.py b/test/integration/smoke/test_network.py
index 99d96d7..fd1e4e6 100644
--- a/test/integration/smoke/test_network.py
+++ b/test/integration/smoke/test_network.py
@@ -23,7 +23,7 @@
 from marvin.cloudstackException import CloudstackAPIException
 from marvin.cloudstackAPI import rebootRouter
 from marvin.sshClient import SshClient
-from marvin.lib.utils import cleanup_resources, get_process_status
+from marvin.lib.utils import cleanup_resources, get_process_status, get_host_credentials
 from marvin.lib.base import (Account,
                              VirtualMachine,
                              ServiceOffering,
@@ -38,7 +38,9 @@
                              NIC,
                              Cluster)
 from marvin.lib.common import (get_domain,
+                               get_free_vlan,
                                get_zone,
+                               get_template,
                                get_test_template,
                                list_hosts,
                                list_publicIP,
@@ -54,6 +56,7 @@
 # Import System modules
 import time
 import logging
+import random
 
 _multiprocess_shared_ = True
 
@@ -1838,3 +1841,203 @@
             self.fail("Failing test. Error: %s" % e)
 
         return
+
+
+class TestSharedNetwork(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls.testClient = super(TestSharedNetwork, cls).getClsTestClient()
+        cls.apiclient = cls.testClient.getApiClient()
+
+        cls.services = cls.testClient.getParsedTestDataConfig()
+        # Get Zone, Domain and templates
+        cls.domain = get_domain(cls.apiclient)
+        cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests())
+        cls.template = get_template(cls.apiclient, cls.zone.id,
+                                    cls.services["ostype"])
+
+        cls.services["virtual_machine"]["zoneid"] = cls.zone.id
+        cls.services["virtual_machine"]["template"] = cls.template.id
+        # Create Network Offering
+        cls.services["shared_network_offering"]["specifyVlan"] = "True"
+        cls.services["shared_network_offering"]["specifyIpRanges"] = "True"
+        cls.hv = cls.testClient.getHypervisorInfo()
+        cls.shared_network_offering = NetworkOffering.create(cls.apiclient, cls.services["shared_network_offering"],
+                                                             conservemode=False)
+
+        # Update network offering state from disabled to enabled.
+        NetworkOffering.update(cls.shared_network_offering, cls.apiclient, state="enabled")
+
+        cls.service_offering = ServiceOffering.create(cls.apiclient, cls.services["service_offering"])
+        physical_network, vlan = get_free_vlan(cls.apiclient, cls.zone.id)
+        # create network using the shared network offering created
+
+        cls.services["shared_network"]["acltype"] = "domain"
+        cls.services["shared_network"]["vlan"] = vlan
+        cls.services["shared_network"]["networkofferingid"] = cls.shared_network_offering.id
+        cls.services["shared_network"]["physicalnetworkid"] = physical_network.id
+
+        cls.setSharedNetworkParams("shared_network")
+        cls.shared_network = Network.create(cls.apiclient,
+                                            cls.services["shared_network"],
+                                            networkofferingid=cls.shared_network_offering.id,
+                                            zoneid=cls.zone.id)
+        cls._cleanup = [
+            cls.service_offering,
+            cls.shared_network,
+            cls.shared_network_offering
+        ]
+        return
+
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.dbclient = self.testClient.getDbConnection()
+        self.cleanup = []
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            # Cleanup resources used
+            cleanup_resources(cls.apiclient, cls._cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return
+
+    def tearDown(self):
+        cleanup_resources(self.apiclient, self.cleanup)
+        return
+
+    @classmethod
+    def setSharedNetworkParams(cls, network, range=20):
+
+        # @range: range decides the endip. Pass the range as "x" if you want the difference between the startip
+        # and endip as "x"
+        # Set the subnet number of shared networks randomly prior to execution
+        # of each test case to avoid overlapping of ip addresses
+        shared_network_subnet_number = random.randrange(1, 254)
+        cls.services[network]["routerip"] = "172.16." + str(shared_network_subnet_number) + "." + str(15)
+        cls.services[network]["gateway"] = "172.16." + str(shared_network_subnet_number) + ".1"
+        cls.services[network]["startip"] = "172.16." + str(shared_network_subnet_number) + ".2"
+        cls.services[network]["endip"] = "172.16." + str(shared_network_subnet_number) + "." + str(range + 1)
+        cls.services[network]["netmask"] = "255.255.255.0"
+        logger.debug("Executing command '%s'" % cls.services[network])
+
+    def get_router_host(self, router):
+        self.assertEqual(
+            router.state,
+            'Running',
+            "Check list router response for router state"
+        )
+        hosts = list_hosts(
+            self.apiclient,
+            id=router.hostid)
+        self.assertEqual(
+            isinstance(hosts, list),
+            True,
+            "Check for list hosts response return valid data")
+        host = hosts[0]
+        if host.hypervisor.lower() in ("vmware", "hyperv"):
+            host.ipaddress = self.apiclient.connection.mgtSvr
+            host.user = self.apiclient.connection.user
+            host.password = self.apiclient.connection.passwd
+            host.port = 22
+        else:
+            host.user, host.password = get_host_credentials(self.config, host.ipaddress)
+            host.port = 22
+        return host
+
+    def verify_ip_address_in_router(self, router, host, ipaddress, device, isExist=True):
+        command = 'ip addr show %s |grep "inet "|cut -d " " -f6 |cut -d "/" -f1 |grep -w %s' % (device, ipaddress)
+        logger.debug("Executing command '%s'" % command)
+        result = get_process_status(
+            host.ipaddress,
+            host.port,
+            host.user,
+            host.password,
+            router.linklocalip,
+            command,
+            host.hypervisor.lower())
+        self.assertEqual(len(result) > 0 and result[0] == ipaddress, isExist, "ip %s verification failed" % ipaddress)
+
+    @attr(tags=["advanced", "shared"])
+    def test_01_deployVMInSharedNetwork(self):
+        if self.hv.lower() == 'simulator':
+            self.skipTest("Hypervisor is simulator - skipping Test..")
+        try:
+            self.virtual_machine = VirtualMachine.create(self.apiclient, self.services["virtual_machine"],
+                                                         networkids=[self.shared_network.id],
+                                                         serviceofferingid=self.service_offering.id
+                                                         )
+        except Exception as e:
+            self.fail("Exception while deploying virtual machine: %s" % e)
+
+        routerIp = self.services["shared_network"]["routerip"]
+        nic_ip_address = self.dbclient.execute(
+            "select ip4_address from nics where strategy='Placeholder' and ip4_address = '%s';" % routerIp);
+
+        self.assertNotEqual(
+            len(nic_ip_address),
+            0,
+            "Placeholder ip for the VR in shared network isn't the same as what was passed"
+        )
+
+        routers = Router.list(
+            self.apiclient,
+            networkid=self.shared_network.id,
+            listall=True
+        )
+
+        for router in routers:
+            host = self.get_router_host(router)
+            self.verify_ip_address_in_router(router, host, routerIp, "eth0", True)
+
+        # expunge VM
+        VirtualMachine.delete(self.virtual_machine, self.apiclient, expunge=True)
+
+    @attr(tags=["advanced", "shared"])
+    def test_02_verifyRouterIpAfterNetworkRestart(self):
+        if self.hv.lower() == 'simulator':
+            self.skipTest("Hypervisor is simulator - skipping Test..")
+        routerIp = self.services["shared_network"]["routerip"]
+        self.debug("restarting network with cleanup")
+        try:
+            self.shared_network.restart(self.apiclient, cleanup=True)
+        except Exception as e:
+            self.fail("Failed to cleanup network - %s" % e)
+
+        self.debug("Listing routers for network: %s" % self.shared_network.name)
+        routers = Router.list(
+            self.apiclient,
+            networkid=self.shared_network.id,
+            listall=True
+        )
+        self.assertEqual(
+            len(routers),
+            1,
+            "Router for the shared network wasn't found)"
+        )
+
+        for router in routers:
+            host = self.get_router_host(router)
+            self.verify_ip_address_in_router(router, host, routerIp, "eth0", True)
+
+    @attr(tags=["advanced", "shared"])
+    def test_03_destroySharedNetwork(self):
+        if self.hv.lower() == 'simulator':
+            self.skipTest("Hypervisor is simulator - skipping Test..")
+        routerIp = self.services["shared_network"]["routerip"]
+        try:
+            self.shared_network.delete(self.apiclient)
+        except Exception as e:
+            self.fail("Failed to destroy the shared network")
+        self._cleanup.remove(self.shared_network)
+        self.debug("Fetch the placeholder record for the router")
+        nic_ip_address = self.dbclient.execute(
+            "select ip4_address from nics where strategy='Placeholder' and ip4_address = '%s' and removed is NOT NULL;" % routerIp);
+
+        self.assertNotEqual(
+            len(nic_ip_address),
+            0,
+            "Failed to find the placeholder IP"
+        )
\ No newline at end of file
diff --git a/test/integration/smoke/test_service_offerings.py b/test/integration/smoke/test_service_offerings.py
index 0ee055a..8a7682e 100644
--- a/test/integration/smoke/test_service_offerings.py
+++ b/test/integration/smoke/test_service_offerings.py
@@ -502,22 +502,28 @@
             self.skipTest("Skipping this test for {} due to bug CS-38153".format(self.hypervisor))
         try:
             self.medium_virtual_machine.stop(self.apiclient)
+
             timeout = self.services["timeout"]
+
             while True:
                 time.sleep(self.services["sleep"])
+
                 # Ensure that VM is in stopped state
                 list_vm_response = list_virtual_machines(
-                                            self.apiclient,
-                                            id=self.medium_virtual_machine.id
-                                            )
+                    self.apiclient,
+                    id=self.medium_virtual_machine.id
+                )
+
                 if isinstance(list_vm_response, list):
                     vm = list_vm_response[0]
                     if vm.state == 'Stopped':
                         self.debug("VM state: %s" % vm.state)
                         break
+
                 if timeout == 0:
                     raise Exception(
                         "Failed to stop VM (ID: %s) in change service offering" % vm.id)
+
                 timeout = timeout - 1
         except Exception as e:
             self.fail("Failed to stop VM: %s" % e)
diff --git a/test/integration/smoke/test_vm_snapshots.py b/test/integration/smoke/test_vm_snapshots.py
index 047ed20..b8590bc 100644
--- a/test/integration/smoke/test_vm_snapshots.py
+++ b/test/integration/smoke/test_vm_snapshots.py
@@ -457,6 +457,7 @@
         self.debug("Stopping VM - ID: %s" % virtual_machine.id)
         try:
             virtual_machine.stop(self.apiclient)
+
             timeout = self.services["timeout"]
 
             while True:
@@ -469,7 +470,6 @@
                 )
 
                 if isinstance(list_vm_response, list):
-
                     vm = list_vm_response[0]
                     if vm.state == 'Stopped':
                         self.debug("VM state: %s" % vm.state)
@@ -480,7 +480,6 @@
                         "Failed to stop VM (ID: %s) in change service offering" % vm.id)
 
                 timeout = timeout - 1
-
         except Exception as e:
             self.fail("Failed to stop VM: %s" % e)
 
diff --git a/test/pom.xml b/test/pom.xml
index 41112bf..17f623a 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/tools/apidoc/pom.xml b/tools/apidoc/pom.xml
index 2f528c9..fd74768 100644
--- a/tools/apidoc/pom.xml
+++ b/tools/apidoc/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-tools</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <properties>
diff --git a/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh b/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
index 4e8605d..5160857 100644
--- a/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
+++ b/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
@@ -19,7 +19,7 @@
 set -e
 set -x
 
-CLOUDSTACK_RELEASE=4.15.0
+CLOUDSTACK_RELEASE=4.16.0
 
 function configure_apache2() {
    # Enable ssl, rewrite and auth
diff --git a/tools/appliance/systemvmtemplate/template.json b/tools/appliance/systemvmtemplate/template.json
index e87effc..3de676b 100644
--- a/tools/appliance/systemvmtemplate/template.json
+++ b/tools/appliance/systemvmtemplate/template.json
@@ -36,8 +36,8 @@
       "disk_size": 2500,
       "disk_interface": "virtio",
       "net_device": "virtio-net",
-      "iso_url": "https://download.cloudstack.org/systemvm/debian/debian-10.5.0-amd64-netinst.iso",
-      "iso_checksum": "0a6aee1d9aafc1ed095105c052f9fdd65ed00ea9274188c9cd0072c8e6838ab40e246d45a1e6956d74ef1b04a1fc042151762f25412e9ff0cbf49418eef7992e",
+      "iso_url": "https://download.cloudstack.org/systemvm/debian/debian-10.7.0-amd64-netinst.iso",
+      "iso_checksum": "cb6795ca61326e9fa58099898e53dc6c708f4b1473687fab5679f824adc78bbe1d543f3b4aed9e56613e7b150e27d6be317efc499e25a92efefed1ed623a90a6",
       "iso_checksum_type": "sha512",
       "output_directory": "../dist",
       "http_directory": "http",
diff --git a/tools/checkstyle/pom.xml b/tools/checkstyle/pom.xml
index 53ca24e..c5a06fd 100644
--- a/tools/checkstyle/pom.xml
+++ b/tools/checkstyle/pom.xml
@@ -22,7 +22,7 @@
     <name>Apache CloudStack Developer Tools - Checkstyle Configuration</name>
     <groupId>org.apache.cloudstack</groupId>
     <artifactId>checkstyle</artifactId>
-    <version>4.15.1.0-SNAPSHOT</version>
+    <version>4.16.0.0-SNAPSHOT</version>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/tools/devcloud-kvm/pom.xml b/tools/devcloud-kvm/pom.xml
index 1d5d2d8..2712bec 100644
--- a/tools/devcloud-kvm/pom.xml
+++ b/tools/devcloud-kvm/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-tools</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/tools/devcloud4/pom.xml b/tools/devcloud4/pom.xml
index a2aad9b..0631c4e 100644
--- a/tools/devcloud4/pom.xml
+++ b/tools/devcloud4/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-tools</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile
index a3e5276..466942a 100644
--- a/tools/docker/Dockerfile
+++ b/tools/docker/Dockerfile
@@ -20,7 +20,7 @@
 FROM ubuntu:18.04
 
 MAINTAINER "Apache CloudStack" <dev@cloudstack.apache.org>
-LABEL Vendor="Apache.org" License="ApacheV2" Version="4.15.1.0-SNAPSHOT"
+LABEL Vendor="Apache.org" License="ApacheV2" Version="4.16.0.0-SNAPSHOT"
 
 ARG DEBIAN_FRONTEND=noninteractive
 
diff --git a/tools/docker/Dockerfile.marvin b/tools/docker/Dockerfile.marvin
index 76175aa..ecbb1bc 100644
--- a/tools/docker/Dockerfile.marvin
+++ b/tools/docker/Dockerfile.marvin
@@ -20,11 +20,11 @@
 FROM python:2
 
 MAINTAINER "Apache CloudStack" <dev@cloudstack.apache.org>
-LABEL Vendor="Apache.org" License="ApacheV2" Version="4.15.1.0-SNAPSHOT"
+LABEL Vendor="Apache.org" License="ApacheV2" Version="4.16.0.0-SNAPSHOT"
 
 ENV WORK_DIR=/marvin
 
-ENV PKG_URL=https://builds.cloudstack.org/job/build-master-marvin/lastSuccessfulBuild/artifact/tools/marvin/dist/Marvin-4.15.1.0-SNAPSHOT.tar.gz
+ENV PKG_URL=https://builds.cloudstack.org/job/build-master-marvin/lastSuccessfulBuild/artifact/tools/marvin/dist/Marvin-4.16.0.0-SNAPSHOT.tar.gz
 
 RUN apt-get update && apt-get install -y vim
 RUN pip install --upgrade paramiko nose requests
diff --git a/tools/marvin/marvin/lib/base.py b/tools/marvin/marvin/lib/base.py
index 6bb7b66..20e116a 100755
--- a/tools/marvin/marvin/lib/base.py
+++ b/tools/marvin/marvin/lib/base.py
@@ -3158,6 +3158,18 @@
             cmd.isolatedpvlan = services["isolatedpvlan"]
         if "isolatedpvlantype" in services:
             cmd.isolatedpvlantype = services["isolatedpvlantype"]
+        if "routerip" in services:
+            cmd.routerip = services["routerip"]
+        if "ip6gateway" in services:
+            cmd.ip6gateway = services["ip6gateway"]
+        if "ip6cidr" in services:
+            cmd.ip6cidr = services["ip6cidr"]
+        if "startipv6" in services:
+            cmd.startipv6 = services["startipv6"]
+        if "endipv6" in services:
+            cmd.endipv6 = services["endipv6"]
+        if "routeripv6" in services:
+            cmd.routeripv6 = services["routeripv6"]
 
         if accountid:
             cmd.account = accountid
diff --git a/tools/marvin/pom.xml b/tools/marvin/pom.xml
index 5fe69f2..b339536 100644
--- a/tools/marvin/pom.xml
+++ b/tools/marvin/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloud-tools</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/tools/marvin/setup.py b/tools/marvin/setup.py
index 67f632c..275b6e3 100644
--- a/tools/marvin/setup.py
+++ b/tools/marvin/setup.py
@@ -27,7 +27,7 @@
         raise RuntimeError("python setuptools is required to build Marvin")
 
 
-VERSION = "4.15.1.0-SNAPSHOT"
+VERSION = "4.16.0.0-SNAPSHOT"
 
 setup(name="Marvin",
       version=VERSION,
diff --git a/tools/pom.xml b/tools/pom.xml
index 3fec137..29d9576 100644
--- a/tools/pom.xml
+++ b/tools/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/ui/legacy/config.js b/ui/legacy/config.js
deleted file mode 100644
index 0203eaa..0000000
--- a/ui/legacy/config.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-// Define custom options configurable by admins for UI
-cloudStackOptions = {
-    aboutText: "label.app.name", // This is the text shown in the 'About' box
-    aboutTitle: "label.about.app", // This is the Application 'Title' shown in the 'About' box
-    docTitle: "label.app.name", // This is the Application 'Title' shown on browser tab.
-
-    helpURL: "http://docs.cloudstack.apache.org/", // This is the URL that opens when users click Help
-    keyboardOptions: {
-        "us": "label.standard.us.keyboard",
-        "uk": "label.uk.keyboard",
-        "fr": "label.french.azerty.keyboard",
-        "jp": "label.japanese.keyboard",
-        "sc": "label.simplified.chinese.keyboard"
-    },
-    hiddenFields: { // Fields to be hidden only for users in the tables below
-        "metrics.instances": [], // Options - "name", "state", "ipaddress", "zonename", "cpuused", "memused", "network", "disk"
-        "metrics.volumes": [] // Options - "name", "state", "vmname", "sizegb", "physicalsize", "utilization", "storagetype", "storage"
-    }
-};
diff --git a/ui/legacy/css/cloudstack3.css b/ui/legacy/css/cloudstack3.css
deleted file mode 100644
index 98871c9..0000000
--- a/ui/legacy/css/cloudstack3.css
+++ /dev/null
@@ -1,13408 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-body {
-  min-width: 1224px;
-  background: #ede8e8;
-  font-family: sans-serif;
-  overflow: auto;
-}
-
-table {
-  position: relative;
-  width: 955px;
-  max-width: 977px;
-  margin: 15px 15px 12px 12px;
-  border-bottom: 1px solid #c4c5c5;
-  font-size: 13px;
-  text-align: left;
-  text-indent: 10px;
-  border-collapse: collapse;
-}
-
-table thead {
-  background: url("../images/bg-table-head.png") repeat-x;
-  cursor: default;
-}
-
-table thead th {
-  border: 1px solid #c6c3c3;
-  border-top: 0;
-  border-bottom: 1px solid #cfc9c9;
-  font-weight: bold;
-  white-space: nowrap;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  color: #525252;
-  text-align: left;
-  text-shadow: 0 1px 1px #ffffff;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-table thead th.sorted {
-  color: #312f2f;
-  /*+text-shadow:0px 1px 1px #BFBFBF;*/
-  text-shadow: 0 1px 1px #bfbfbf;
-  -moz-text-shadow: 0 1px 1px #bfbfbf;
-  -webkit-text-shadow: 0 1px 1px #bfbfbf;
-  -o-text-shadow: 0 1px 1px #bfbfbf;
-}
-
-table thead th.sorted.desc {
-  background-position: 102% -111px;
-}
-
-table thead th.sorted.asc {
-  background-position: 102% -157px;
-}
-
-table tbody td,
-table th {
-  clear: none;
-  vertical-align: middle;
-  min-width: 88px;
-  padding: 10px 5px 6px;
-  border-right: 1px solid #bfbfbf;
-  font-size: 11px;
-  color: #282828;
-  overflow: hidden;
-}
-
-table tbody td.loading {
-  border-top: 1px solid #fbfbfb;
-  background: #dbe2e9;
-  text-align: center;
-}
-
-table tbody td.truncated {
-  max-width: 120px;
-  overflow: visible;
-}
-
-table tbody td.truncated > span {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.list-view-select table th.name,
-.list-view-select table td.name {
-  width: 170px;
-  min-width: 170px;
-  max-width: 170px;
-}
-
-.list-view-select table th.availableHostSuitability,
-.list-view-select table td.availableHostSuitability {
-  max-width: 250px;
-}
-
-/** Multiselect*/
-table thead th.multiselect,
-table tbody td.multiselect {
-  width: 20px;
-  min-width: 20px;
-  max-width: 20px;
-}
-
-table thead th.multiselect input,
-table tbody td.multiselect input {
-  position: relative;
-  /*+placement:shift -8px 0px;*/
-  top: 0;
-  left: -8px;
-  margin: 0;
-}
-
-table thead th.multiselect input {
-  margin-left: 2px;
-}
-
-/** Actions table cell*/
-table tbody td.actions {
-  vertical-align: middle;
-  width: 130px;
-  min-width: 130px !important;
-  max-width: 130px !important;
-}
-
-table tbody td.actions input {
-  /*+placement:shift 10px -6px;*/
-  position: relative;
-  top: -6px;
-  left: 10px;
-  margin: 11px 0 0;
-}
-
-.list-view-select table tbody td.actions {
-  width: 40px !important;
-  min-width: 40px !important;
-  max-width: 40px !important;
-}
-
-.list-view-select table tbody td.actions input {
-  margin: 0 0 0 -7px;
-}
-
-.list-view-select table thead th.actions {
-  width: 40px !important;
-  min-width: 40px !important;
-  max-width: 40px !important;
-  text-indent: 5px;
-}
-
-/** Quick view table cell*/
-table tbody td.quick-view,
-table thead th.quick-view {
-  width: 58px !important;
-  min-width: 58px;
-  max-width: 58px !important;
-  height: 14px !important;
-  white-space: nowrap;
-  text-indent: 2px;
-  cursor: default;
-}
-
-table tbody td.quick-view .icon {
-  margin-top: 3px;
-  margin-left: 22px;
-  padding: 0 0 6px 12px;
-  background: url("../images/sprites.png") no-repeat -44px -62px;
-}
-
-table tbody td.quick-view:hover .icon {
-  background-position: -44px -644px;
-}
-
-table tbody tr.loading td.quick-view .icon {
-  display: none;
-}
-
-table tbody tr.loading td.quick-view {
-  cursor: default;
-}
-
-table tbody tr.loading td.quick-view .loading {
-  background-position: center center;
-}
-
-/** Row styling*/
-table tbody tr {
-  border-top: 1px solid transparent;
-  border-right: 1px solid #c4c5c5;
-  border-left: 1px solid #c4c5c5;
-}
-
-table tbody tr.even {
-  background: #ffffff;
-}
-
-table tbody tr.odd {
-  background: #f2f0f0;
-}
-
-table tbody tr.selected {
-  border-top: 1px solid #edf0f7 !important;
-  border-bottom: 1px solid #babfd9;
-  background: #cbddf3;
-  text-shadow: 0 1px 1px #fcfbf7;
-}
-
-table tbody tr.to-remove {
-  border-top: 1px solid #edf0f7 !important;
-  border-bottom: 1px solid #babfd9;
-  background: #e05959;
-  text-shadow: 0 1px 1px #fcfbf7;
-}
-
-table tbody tr.loading {
-  background: #e2e9f0;
-}
-
-table tbody tr.loading td {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-table tbody tr.loading td.loading.icon {
-  height: 35px;
-  padding: 0;
-  background: url("../images/ajax-loader.gif") no-repeat center;
-}
-
-table tbody tr div.loading {
-  display: block;
-  width: 50px;
-  height: 14px;
-  margin: auto;
-  background: transparent url("../images/ajax-loader-small.gif") no-repeat center;
-}
-
-table th.resizable {
-  position: relative;
-  cursor: col-resize;
-}
-
-table th div.ui-resizable-handle {
-  position: relative;
-  float: right;
-  top: -30px;
-}
-
-div.list-view table tbody td span {
-  display: block;
-  float: left;
-  max-width: 89%;
-  margin-left: 12px;
-  line-height: 15px;
-  word-break: break-all;
-  word-wrap: break-word;
-  text-indent: 0;
-}
-
-td.alert-notification-threshold {
-  background-color: rgba(255, 231, 175, 0.75);
-  color: #e87900;
-}
-
-td.alert-disable-threshold {
-  background-color: rgba(255, 190, 190, 0.75);
-  color: #f50000;
-}
-
-span.compact {
-  height: 16px;
-}
-
-.horizontal-overflow tbody td,
-.horizontal-overflow thead th {
-  min-width: 40px;
-  padding: 10px 10px 5px 0;
-}
-
-.horizontal-overflow th.quick-view {
-  padding-left: 5px;
-}
-
-.groupable-header {
-  border-right: 1px solid #c6c3c3;
-  border-left: 1px solid #c6c3c3;
-  background: url("../images/bg-table-head.png");
-}
-
-.groupable-header-columns th {
-  border: 0;
-}
-
-table.horizontal-overflow td.state {
-  width: 55px;
-  min-width: 55px;
-  max-width: 55px;
-}
-
-table.no-split td.first {
-  min-width: 150px;
-}
-
-.groupable-header-border {
-  border-right: 1px solid #c6c3c3;
-  border-left: 1px solid #c6c3c3;
-}
-
-a {
-  color: #0b84dc;
-  text-decoration: none;
-}
-
-a:hover {
-  color: #000000;
-  text-decoration: underline;
-}
-
-input.error {
-  background: #fee5e5;
-}
-
-label.error {
-  color: #ff0000;
-}
-
-.label-hovered {
-  color: #0000ff !important;
-  cursor: pointer;
-}
-
-.button {
-  float: left;
-  background: url("../images/buttons.png") no-repeat;
-  cursor: pointer;
-}
-
-#main-area {
-  width: 1224px;
-  height: 729px;
-  margin: auto;
-  border: 1px solid #d4d4d4;
-  /*+box-shadow:0px -5px 11px #B7B7B7;*/
-  border: 1px solid #e8e8e8;
-  box-shadow: 0 -5px 11px #b7b7b7;
-  -moz-box-shadow: 0 -5px 11px #b7b7b7;
-  -webkit-box-shadow: 0 -5px 11px #b7b7b7;
-  -o-box-shadow: 0 -5px 11px #b7b7b7;
-}
-
-#container {
-  /*[empty]width:;*/
-  position: relative;
-  height: 100%;
-  margin: auto;
-}
-
-#sections {
-  display: none;
-}
-
-#template {
-  display: none;
-}
-
-body.login {
-  background: url("../images/overlay-pattern.png") repeat center, #106ca9 url("../images/bg-login.jpg") no-repeat center;
-  background-size: auto, cover;
-  overflow: hidden;
-}
-
-.login {
-  display: block;
-  position: relative;
-  top: 80px;
-  /*+placement:shift 0 80px;*/
-  left: 0;
-  width: 100%;
-  height: 350px;
-  background: #053663;
-}
-
-.login .select-language {
-  float: left;
-  margin-top: 10px;
-}
-
-.login .select-language select {
-  width: 260px;
-  margin-top: 20px;
-  border: 1px solid #808080;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px 1px #838383;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:inset 0px 1px 1px #838383;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px 1px #838383;
-  -webkit-box-shadow: inset 0 1px 1px #838383;
-  -o-box-shadow: inset 0 1px 1px #838383;
-}
-
-.login .fields {
-  float: left;
-  width: 409px;
-  margin: 72px 0 0 88px;
-}
-
-.login .fields .field {
-  position: relative;
-}
-
-.login .fields .field label {
-  position: absolute;
-  margin-top: 14px;
-  /*+placement:displace 9px 14px;*/
-  margin-left: 9px;
-  font-size: 12px;
-  color: #4e4f53;
-}
-
-.login .fields .field label.error {
-  float: right;
-  top: 0;
-  left: 264px;
-  color: #ff0000;
-}
-
-.login .fields input {
-  width: 248px;
-  height: 20px;
-  margin: 5px 0 0;
-  padding: 5px;
-  border: 0;
-  border-radius: 3px;
-  box-shadow: inset 0 1px 1px #4e4e4e;
-  /*+border-radius:3px;*/
-  background: #ececec;
-  font-size: 13px;
-  text-indent: 1px;
-  -moz-border-radius: 3px;
-  /*+box-shadow:inset 0px 1px 1px #4E4E4E;*/
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: inset 0 1px 1px #4e4e4e;
-  -webkit-box-shadow: inset 0 1px 1px #4e4e4e;
-  -o-box-shadow: inset 0 1px 1px #4e4e4e;
-}
-
-.login .fields input.error {
-  border-color: #ff8080;
-  background: #ffeaea;
-}
-
-.login .fields input[type='submit'] {
-  display: block;
-  float: left;
-  width: 69px;
-  height: 25px;
-  margin: 7px 120px 0 -1px;
-  border: 0;
-  background: transparent url("../images/sprites.png") -563px -747px;
-  font-weight: bold;
-  color: #ffffff;
-  text-align: center;
-  text-indent: -1px;
-  text-shadow: 0 1px 2px #000000;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.login .fields input[type='samlsubmit'] {
-  display: block;
-  width: 60px;
-  height: 15px;
-  border: 0;
-  background: transparent url("../images/sprites.png") -563px -747px;
-  font-size: 10px;
-  font-weight: bold;
-  color: #ffffff;
-  text-align: center;
-  text-indent: -1px;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-shadow: 0 1px 2px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.login .fields input[type='submit']:hover {
-  background-position: -563px -772px;
-}
-
-.login .logo {
-  float: left;
-  width: 290px;
-  height: 40px;
-  margin: 72px 0 0 209px;
-  background: url("../images/logo-login.png") no-repeat 0 0;
-}
-
-.login.nologo .logo {
-  background-image: url("../images/logo-login-oss.png");
-}
-
-.login form {
-  display: block;
-  width: 1000px;
-  height: 100%;
-  margin: auto;
-  background: #053663;
-}
-
-.dialog-about .ui-widget-content {
-  width: 100% !important;
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.dialog-about .logo {
-  padding-top: 20px;
-  font-size: 26px;
-  color: #636363;
-}
-
-.dialog-about .version {
-  padding-top: 10px;
-  font-size: 12px;
-}
-
-.dialog-about .ui-button {
-  float: none;
-  margin: 0 auto;
-}
-
-.blocking-overlay {
-  opacity: 0.7;
-  position: absolute;
-  z-index: 500;
-  top: 0;
-  left: 0;
-  width: 100%;
-  /*+opacity:70%;*/
-  height: 100%;
-  background: #f2f2f2;
-  filter: alpha(opacity=70);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
-  -moz-opacity: 0.7;
-}
-
-.loading-overlay {
-  opacity: 0.7;
-  position: absolute;
-  z-index: 500;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  /*+opacity:70%;*/
-  background: #f2f2f2 url("../images/ajax-loader.gif") no-repeat center;
-  filter: alpha(opacity=70);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
-  -moz-opacity: 0.7;
-}
-
-.loading-overlay span {
-  display: block;
-  margin: 155px 0 0 5px;
-  color: #4b4b4b;
-  text-align: center;
-}
-
-.detail-view .ui-tabs-panel .loading-overlay {
-  background-position: 50% 250px;
-}
-
-.install-wizard {
-  position: relative;
-  width: 1024px;
-  height: 768px;
-  margin: auto;
-  border-top: 0;
-}
-
-body.install-wizard {
-  height: 769px !important;
-  background: #ffffff url("../images/bg-login.png");
-  font-family: sans-serif;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.install-wizard .header {
-  z-index: 9;
-  height: 365px;
-  padding: 32px 0 89px;
-  background: url("../images/bg-login.png");
-  color: #626e82;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  text-align: center;
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-.install-wizard .header h3 {
-  font-size: 20px;
-}
-
-.install-wizard .step {
-  max-width: 691px;
-  margin: auto;
-  padding: 56px 0 0;
-}
-
-.install-wizard .step .title {
-  clear: both;
-  width: 303px;
-  margin: auto auto 30px;
-  font-size: 22px;
-  color: #626e82;
-}
-
-.install-wizard .step .subtitle {
-  font-size: 12px;
-  font-weight: bold;
-  color: #4b5e69;
-}
-
-.install-wizard .step p {
-  background: url("../images/bg-gradient-white-transparent.png") repeat-x -114px -270px;
-  font-size: 15px;
-  line-height: 23px;
-  color: #4a4a4a;
-}
-
-.install-wizard .step ul li {
-  width: 465px;
-  margin: 14px 0 0 18px;
-  font-size: 13px;
-  list-style: disc;
-}
-
-.install-wizard .step .field {
-  margin: 0 0 12px;
-  text-align: left;
-}
-
-.install-wizard .step .field label {
-  display: block;
-  clear: both;
-  font-size: 11px;
-  color: #4d4d4d;
-}
-
-.install-wizard .step .field label.error {
-  font-size: 11px;
-  color: #ff2424;
-}
-
-.install-wizard .body {
-  z-index: 10;
-  width: 1012px;
-  height: 762px;
-  margin: -352px auto auto;
-  box-shadow: 0 -3px 4px #cfcfcf;
-  /*+box-shadow:0px -3px 4px #CFCFCF;*/
-  background: url("../images/bg-gradient-white-transparent.png") repeat-x -114px -141px;
-  -moz-box-shadow: 0 -3px 4px #cfcfcf;
-  -webkit-box-shadow: 0 -3px 4px #cfcfcf;
-  -o-box-shadow: 0 -3px 4px #cfcfcf;
-}
-
-.install-wizard h2 {
-  margin: 0 0 19px;
-  font-size: 28px;
-}
-
-.install-wizard input[type='text'],
-.install-wizard input[type='password'],
-.install-wizard input[type='text'],
-.install-wizard select {
-  width: 288px;
-  /*+border-radius:4px;*/
-  padding: 6px;
-  border: 1px solid #cdcdcd;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px #aeaeae;
-  background: #f7f7f7;
-  /*+box-shadow:inset 0px 1px #AEAEAE;*/
-  font-size: 14px;
-  color: #232323;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px #aeaeae;
-  -webkit-box-shadow: inset 0 1px #aeaeae;
-  -o-box-shadow: inset 0 1px #aeaeae;
-  -moz-box-shadow: inset 0 1px 0 #aeaeae;
-  -webkit-box-shadow: inset 0 1px 0 #aeaeae;
-  -o-box-shadow: inset 0 1px 0 #aeaeae;
-}
-
-.install-wizard .button {
-  float: right;
-  margin-top: 15px;
-  /*+border-radius:4px;*/
-  padding: 7px 16px 7px 18px;
-  border: 1px solid #505050;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url("../images/bg-gradients.png") 0 -221px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 3px #3f4351;
-  /*+text-shadow:0px -1px 3px #3F4351;*/
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 3px #3f4351;
-  -webkit-text-shadow: 0 -1px 3px #3f4351;
-  -o-text-shadow: 0 -1px 3px #3f4351;
-}
-
-.install-wizard .button.advanced-installation,
-.install-wizard .button.go-back {
-  float: left;
-  border: 1px solid #c7c2c2;
-  background: #e0dede;
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  color: #3b3b3b;
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  -o-text-shadow: 0 0 #ffffff;
-}
-
-.install-wizard .button.go-back {
-  padding: 9px 16px 10px 18px;
-  font-size: 12px;
-}
-
-.install-wizard .setup-form .button.go-back {
-  /*+placement:shift 15px -14px;*/
-  position: relative;
-  top: -14px;
-  left: 15px;
-}
-
-.install-wizard .step {
-  position: relative;
-  z-index: 11;
-}
-
-.install-wizard .step .tooltip-info {
-  /*+placement:shift 547px 50px;*/
-  position: relative;
-  position: absolute;
-  top: 50px;
-  left: 547px;
-}
-
-/*** Intro*/
-.install-wizard .step.intro.what-is-cloudstack p {
-  height: 540px;
-  background: url("../images/bg-what-is-cloudstack.png") no-repeat 50% 237px;
-}
-
-/*** Diagram*/
-.install-wizard .diagram {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 65px 496px;*/
-  z-index: 10;
-  top: 496px;
-  left: 65px;
-  width: 910px;
-  height: 385px;
-}
-
-.install-wizard .diagram .part {
-  display: none;
-  background: url("../images/install-wizard-parts.png") no-repeat;
-}
-
-.install-wizard .diagram .part.zone {
-  position: relative;
-  position: absolute;
-  top: 222px;
-  /*+placement:shift 77px 222px;*/
-  left: 77px;
-  width: 742px;
-  height: 135px;
-  background-position: -267px -580px;
-}
-
-.install-wizard .diagram .part.loading {
-  position: relative;
-  position: absolute;
-  top: -67px;
-  /*+placement:shift 105px -67px;*/
-  left: 105px;
-  width: 742px;
-  height: 432px;
-  background-position: -1264px -487px;
-}
-
-.install-wizard .diagram .part.loading .icon {
-  position: relative;
-  top: 130px;
-  left: 322px;
-  /*+placement:shift 322px 130px;*/
-  width: 61px;
-  height: 76px;
-  background: url("../images/ajax-loader.gif") no-repeat;
-}
-
-.install-wizard .diagram .part.pod {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 313px -76px;*/
-  left: 313px;
-  width: 266px;
-  height: 396px;
-  background-position: -47px -3px;
-}
-
-.install-wizard .diagram .part.cluster {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 313px -76px;*/
-  left: 313px;
-  width: 266px;
-  height: 396px;
-  background-position: -364px 1px;
-}
-
-.install-wizard .diagram .part.host {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 313px -76px;*/
-  left: 313px;
-  width: 266px;
-  height: 396px;
-  background-position: -688px 1px;
-}
-
-.install-wizard .diagram .part.primaryStorage {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 306px -76px;*/
-  left: 306px;
-  width: 275px;
-  height: 396px;
-  background-position: -1046px 1px;
-}
-
-.install-wizard .diagram .part.secondaryStorage {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 306px -76px;*/
-  left: 306px;
-  width: 385px;
-  height: 396px;
-  background-position: -1469px 1px;
-}
-
-/*** Setup form*/
-.install-wizard .step .setup-form {
-  display: inline-block;
-  width: 469px;
-  border: 1px solid #dfdfdf;
-  box-shadow: 0 5px 9px #9f9f9f;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  background: url("../images/bg-transparent-white.png");
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px 0 #ffffff;
-  -webkit-text-shadow: 0 1px 0 #ffffff;
-  /*+box-shadow:0px 5px 9px #9F9F9F;*/
-  -o-text-shadow: 0 1px 0 #ffffff;
-  -moz-box-shadow: 0 5px 9px #9f9f9f;
-  -webkit-box-shadow: 0 5px 9px #9f9f9f;
-  -o-box-shadow: 0 5px 9px #9f9f9f;
-}
-
-.install-wizard .step .setup-form .title {
-  float: left;
-  margin: 17px 0 0 29px;
-  color: #626f7c;
-}
-
-.install-wizard .step .setup-form .field {
-  display: inline-block;
-  width: 389px;
-  margin: 6px 0 1px 31px;
-  padding: 9px;
-  color: #57646d;
-}
-
-.install-wizard .step .setup-form .field .name {
-  float: left;
-  width: 98px;
-  padding: 10px 0 0 0;
-  font-size: 13px;
-  text-align: right;
-}
-
-.install-wizard .step .setup-form .field .value {
-  float: right;
-}
-
-.install-wizard .step .setup-form input[type='text'],
-.install-wizard .step .setup-form input[type='password'] {
-  width: 278px;
-  margin: 6px 4px 0 0;
-  padding: 2px 2px 1px;
-  border: 1px solid #8d8d8d;
-}
-
-.install-wizard .step .setup-form .range-item {
-  float: left;
-  width: 142px;
-}
-
-.install-wizard .step .setup-form .range-item input {
-  width: 131px;
-}
-
-.install-wizard .step .setup-form .multi-range input[type='text'] {
-  width: 128px;
-}
-
-.install-wizard .step .setup-form input.button {
-  margin: 0 30px 14px 15px;
-}
-
-/*** Step: Change user*/
-.install-wizard .step.change-user {
-  width: 316px;
-  margin: auto;
-  padding-top: 95px;
-  text-align: center;
-}
-
-.install-wizard .step.intro iframe {
-  width: 99%;
-  height: 99%;
-  margin: 4px;
-}
-
-.install-wizard .step.intro .title {
-  margin-bottom: 21px;
-  margin-left: 0;
-  font-size: 25px;
-  color: #565454;
-}
-
-.install-wizard .step.intro .subtitle {
-  margin-bottom: 9px;
-}
-
-.install-wizard .step.intro .subtitle li {
-  position: relative;
-  width: 45%;
-  height: 24px;
-  padding: 1px 0 1px 30px;
-  background: url("../images/ajax-loader-small.gif") no-repeat 3px 0;
-  list-style: none;
-}
-
-.install-wizard .step.intro .subtitle li.complete {
-  background: url("../images/icons.png") -1px -224px;
-}
-
-.install-wizard .step.intro .subtitle li.error {
-  background: url("../images/icons.png") -1px -190px;
-}
-
-.install-wizard .step.intro .subtitle li img {
-  float: right;
-}
-
-div.notification-box {
-  width: 323px;
-  height: 354px;
-  background: url("../images/bg-notifications.png") no-repeat 0 0;
-}
-
-div.notification-box h3 {
-  position: relative;
-  /*+placement:shift 0px 35px;*/
-  top: 35px;
-  left: 0;
-  font-size: 21px;
-  letter-spacing: 1px;
-  color: #ffffff;
-  text-align: center;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-shadow: 0 1px 2px #000000;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-div.notification-box .container {
-  position: relative;
-  top: 46px;
-  left: 3px;
-  width: 296px;
-  /*+placement:shift 3px 46px;*/
-  height: 241px;
-  margin: auto;
-  border: 1px solid #8198ae;
-  /*+box-shadow:inset 0px 3px 7px #656565;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 3px 7px #656565;
-  background: #ffffff;
-  /*+border-radius:4px;*/
-  -moz-box-shadow: inset 0 3px 7px #656565;
-  -webkit-box-shadow: inset 0 3px 7px #656565;
-  -o-box-shadow: inset 0 3px 7px #656565;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-div.notification-box .container ul {
-  width: 294px;
-  height: 229px;
-  margin-top: 8px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-div.notification-box .container ul li {
-  width: 100%;
-  height: 41px;
-  border-bottom: 1px solid #cecece;
-  background: url("../images/icons.png") no-repeat 10px -213px;
-  font-size: 12px;
-  color: #4d5e6e;
-  text-indent: 0;
-  cursor: pointer;
-  overflow-x: hidden;
-}
-
-div.notification-box .container ul li.error {
-  height: 53px;
-  background: url("../images/icons.png") no-repeat 10px -171px;
-}
-
-div.notification-box .container ul li.error .subtitle {
-  display: block;
-  position: relative;
-  float: left;
-  top: 17px;
-  left: 48px;
-  width: 213px;
-  height: 10px;
-  margin: 0;
-  padding: 0;
-  white-space: nowrap;
-  color: #808080;
-  /*+placement:shift 48px 17px;*/
-  text-indent: 0;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-div.notification-box .container ul li span {
-  position: relative;
-  /*+placement:shift 48px 15px;*/
-  float: left;
-  top: 15px;
-  left: 48px;
-  max-width: 202px;
-  font-size: 14px;
-  font-weight: 100;
-  overflow: hidden;
-}
-
-div.notification-box .container ul li span:hover {
-  color: #5faaf7;
-  text-decoration: underline;
-}
-
-div.notification-box .container ul div.remove {
-  position: relative;
-  float: right;
-  top: 16px;
-  left: 0;
-  width: 17px;
-  height: 21px;
-  /*+placement:shift 0px 16px;*/
-  margin: -4px 8px 0 0;
-  background: url("../images/buttons.png") no-repeat -623px -8px;
-  cursor: pointer;
-}
-
-div.notification-box .container ul div.remove:hover {
-  background-position: -606px -8px;
-}
-
-div.notification-box .container ul li.pending {
-  background: url("../images/ajax-loader.gif") no-repeat 8px 6px;
-  color: #7e96ac;
-}
-
-div.notification-box .container ul li.first {
-  border-top: 0;
-}
-
-div.notification-box .button {
-  position: relative;
-  float: left;
-  top: 51px;
-  /*+placement:shift 0px 51px;*/
-  left: 0;
-  padding: 5px 10px 6px;
-  border-bottom: 1px solid #2b2b2b;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: 0 0 2px #272727;
-  background: url("../images/buttons.png") no-repeat;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+box-shadow:0px 0px 2px #272727;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 0 2px #272727;
-  -webkit-box-shadow: 0 0 2px #272727;
-  -o-box-shadow: 0 0 2px #272727;
-}
-
-div.notification-box .button span {
-  font-size: 11px;
-  font-weight: bold;
-  letter-spacing: 1px;
-  color: #ffffff;
-  /*+text-shadow:0px -1px 2px #171717;*/
-  text-shadow: 0 -1px 2px #171717;
-  -moz-text-shadow: 0 -1px 2px #171717;
-  -webkit-text-shadow: 0 -1px 2px #171717;
-  -o-text-shadow: 0 -1px 2px #171717;
-}
-
-div.notification-box .button.clear-list {
-  margin-left: 16px;
-  background: url("../images/gradients.png") 0 -10px;
-}
-
-div.notification-box .button.clear-list:hover {
-  background-position: 0 -51px;
-}
-
-div.notification-box .button.close {
-  float: right;
-  margin-right: 10px;
-  border-bottom: 1px solid #232323;
-  background: url("../images/gradients.png") 0 -317px;
-}
-
-div.notification-box .button.close:hover {
-  background-position: -4px -368px;
-}
-
-/*** Corner alert*/
-div.notification.corner-alert {
-  opacity: 0.7;
-  position: absolute;
-  /*+box-shadow:0px 2px 10px #000000;*/
-  z-index: 100;
-  width: 300px;
-  height: 75px;
-  margin: 38px 0 0 -56px;
-  padding: 7px 7px 0;
-  border-radius: 3px;
-  /*+border-radius:3px;*/
-  box-shadow: 0 2px 10px #000000;
-  background: #ffffff;
-  background: rgba(255, 255, 255, 0.95);
-  font-size: 12px;
-  text-indent: 10px;
-  -moz-box-shadow: 0 2px 10px #000000;
-  -webkit-box-shadow: 0 2px 10px #000000;
-  -o-box-shadow: 0 2px 10px #000000;
-  /*+opacity:70%;*/
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  filter: alpha(opacity=70);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
-  -moz-opacity: 0.7;
-}
-
-div.notification.corner-alert .top-arrow {
-  position: absolute;
-  top: -15px;
-  left: 50px;
-  width: 36px;
-  height: 15px;
-  background: url("../images/sprites.png") no-repeat -580px -1353px;
-}
-
-div.notification.corner-alert div.title {
-  width: 100%;
-  height: 33px;
-  color: #ffffff;
-}
-
-div.notification.corner-alert div.title span {
-  /*+placement:shift 0px 10px;*/
-  position: relative;
-  top: 10px;
-  left: 0;
-  padding: 3px 0 12px 24px;
-  padding-left: 33px;
-  background: url("../images/icons.png") no-repeat 3px -223px;
-  font-size: 14px;
-  font-weight: 100;
-  color: #6d6d6d;
-}
-
-div.notification.corner-alert.error div.title span {
-  background: url("../images/icons.png") no-repeat -2px -190px;
-}
-
-div.notification.corner-alert div.message span {
-  display: block;
-  position: relative;
-  position: relative;
-  top: -2px;
-  left: 17px;
-  /*+placement:shift 17px -2px;*/
-  padding-top: 6px;
-  font-size: 14px;
-  color: #000000;
-}
-
-.tooltip-info {
-  display: inline-block;
-  position: absolute;
-  z-index: 1000;
-  width: 239px;
-  min-height: 83px;
-  border: 1px solid #beb8b8;
-  border-radius: 22px;
-  /*+border-radius:22px;*/
-  border-radius: 22px 22px 22px 22px;
-  background: #ffffff;
-  -moz-border-radius: 22px;
-  -webkit-border-radius: 22px;
-  -khtml-border-radius: 22px;
-}
-
-.tooltip-info .arrow {
-  position: absolute;
-  top: 17px;
-  left: -18px;
-  width: 27px;
-  height: 47px;
-  background: url("../images/sprites.png") -583px -939px;
-}
-
-.tooltip-info .title {
-  margin: 12px;
-  font-size: 19px;
-  color: #485766;
-}
-
-.tooltip-info .content {
-  width: 182px;
-  margin: auto;
-  padding-bottom: 13px;
-  font-size: 11px;
-  line-height: 19px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-div.panel div.list-view {
-  height: 632px;
-  margin-top: 30px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.detail-view div.list-view {
-  width: 930px;
-  height: 536px !important;
-  margin: 41px auto auto !important;
-  border: 1px solid #dad4d4;
-  background: #f7f7f7;
-}
-
-div.panel div.list-view div.data-table table {
-  width: 955px;
-}
-
-.detail-view div.list-view div.data-table table {
-  width: 903px !important;
-}
-
-.detail-view div.list-view div.data-table table td {
-  border-left: 1px solid #cacaca;
-}
-
-div.panel div.list-view div.fixed-header {
-  display: table;
-  position: absolute;
-  z-index: 1;
-  top: 29px;
-  left: 12px;
-  width: 960px;
-  height: 47px;
-  margin: 0;
-  background-color: #f7f7f7;
-}
-
-.detail-view div.list-view div.fixed-header {
-  top: 49px !important;
-  left: 29px !important;
-  width: 903px !important;
-  background: #ffffff;
-}
-
-.detail-view div#details-tab-zones div.fixed-header {
-  left: 25px !important;
-}
-
-.detail-view div.list-view div.fixed-header table {
-  width: 100% !important;
-}
-
-.project-view div.panel div.list-view div.fixed-header {
-  background: #6d747d;
-}
-
-div.panel div.list-view div.fixed-header table {
-  position: relative;
-  /*+placement:shift 0px 18px;*/
-  top: 18px;
-  left: 0;
-  width: 955px;
-  margin: 0;
-  /*+box-shadow:0px 4px 10px #DFE1E3;*/
-  box-shadow: 0 4px 10px #dfe1e3;
-  -moz-box-shadow: 0 4px 10px #dfe1e3;
-  -webkit-box-shadow: 0 4px 10px #dfe1e3;
-  -o-box-shadow: 0 4px 10px #dfe1e3;
-}
-
-.project-view div.panel div.list-view div.fixed-header table {
-  /*+box-shadow:0px 2px 2px #CACDD1;*/
-  box-shadow: 0 2px 2px #cacdd1;
-  -moz-box-shadow: 0 2px 2px #cacdd1;
-  -webkit-box-shadow: 0 2px 2px #cacdd1;
-  -o-box-shadow: 0 2px 2px #cacdd1;
-}
-
-div.list-view td.state {
-  width: 120px;
-  min-width: 120px;
-  max-width: 120px;
-}
-
-div.list-view td.first {
-  cursor: pointer;
-}
-
-div.list-view tr:not(.multi-edit-selected) td.first:hover {
-  color: #3a82cd;
-}
-
-div.list-view td.state span {
-  width: 80px;
-  padding: 1px 0 0 18px;
-  background: url("../images/sprites.png") 1px -526px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-div.list-view td.state.on span {
-  background-image: url("../images/sprites.png");
-  background-repeat: no-repeat;
-  background-position: 1px -460px;
-  color: #008000;
-}
-
-div.list-view td.state.off span {
-  background-image: url("../images/sprites.png");
-  background-repeat: no-repeat;
-  background-position: 1px -492px;
-  color: #b90606;
-}
-
-div.list-view td.state.warning span {
-  background-image: url("../images/sprites.png");
-  background-repeat: no-repeat;
-  background-position: 1px -558px;
-  color: #b90606;
-}
-
-div.list-view td.state.transition span {
-  background-image: url("../images/sprites.png");
-  background-repeat: no-repeat;
-  background-position: 1px -432px;
-  color: #b90606;
-}
-
-div.list-view td.state.suitable span {
-  height: 18px;
-  background: url("../images/icons.png") no-repeat scroll 1px -224px;
-  color: #008000;
-}
-
-div.list-view td.state.suitable-storage-migration-required span {
-  width: 200px;
-}
-
-div.list-view td.state.notsuitable span {
-  width: 100px;
-  height: 19px;
-  background: url("../images/icons.png") no-repeat scroll 1px -190px;
-  color: #b90606;
-}
-
-div.list-view td.state.notsuitable-storage-migration-required span {
-  width: 220px !important;
-}
-
-.quick-view-tooltip {
-  display: inline-block;
-  width: 470px;
-  margin-left: 0;
-  padding-top: 0;
-}
-
-.quick-view-tooltip > div.title {
-  position: absolute;
-  top: 20px;
-  left: 10px;
-  width: 444px;
-  font-weight: 100;
-  color: #808080;
-}
-
-.quick-view-tooltip > div.title .icon {
-  position: relative;
-  float: right;
-  top: -2px;
-  left: -7px;
-  padding: 0 13px 0 0;
-  background: url("../images/sprites.png") no-repeat -42px -67px;
-}
-
-.quick-view-tooltip .loading-overlay {
-  opacity: 0.35;
-  /*+opacity:35%;*/
-  filter: alpha(opacity=35);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=35);
-  -moz-opacity: 0.35;
-}
-
-.quick-view-tooltip .container {
-  display: inline-block;
-  position: relative;
-  width: 471px;
-  height: auto;
-  min-height: 100px;
-  border: 1px solid #9ea2a5;
-  box-shadow: 0 7px 9px #676f76;
-  background: #ffffff;
-  /*+box-shadow:0px 7px 9px #676F76;*/
-  overflow: hidden;
-  -moz-box-shadow: 0 7px 9px #676f76;
-  -webkit-box-shadow: 0 7px 9px #676f76;
-  -o-box-shadow: 0 7px 9px #676f76;
-}
-
-/*** Quick view detail view*/
-.quick-view-tooltip .detail-view .main-groups {
-  position: absolute;
-  top: 55px;
-  width: 456px;
-  height: 170px;
-  padding-top: 7px;
-  border: 1px solid #808080;
-  border-right: 0;
-  border-left: 0;
-  box-shadow: 0 1px #e6e6e6;
-  /*+box-shadow:0px 1px #E6E6E6;*/
-  overflow: hidden;
-  -moz-box-shadow: 0 1px #e6e6e6;
-  -webkit-box-shadow: 0 1px #e6e6e6;
-  -o-box-shadow: 0 1px #e6e6e6;
-}
-
-.quick-view-tooltip .detail-view .tagger {
-  display: none;
-}
-
-.quick-view-tooltip .detail-view ul {
-  display: none !important;
-}
-
-.quick-view-tooltip .detail-view.ui-tabs div.ui-tabs-panel {
-  display: inline-block;
-  float: left;
-  width: 100% !important;
-  height: auto;
-  background-color: inherit;
-  overflow: hidden;
-}
-
-.quick-view-tooltip .detail-view .details {
-  display: inline-block;
-  height: auto;
-  padding-bottom: 224px;
-}
-
-.quick-view-tooltip .detail-view .detail-group {
-  left: -9px;
-  width: 365px;
-  margin: 0;
-  padding: 0;
-  border: 0;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group table {
-  margin: 0;
-  border: 0;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group table tr {
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group table td.name {
-  padding: 0 29px 0 5px !important;
-  font-size: 13px;
-  color: #000000 !important;
-}
-
-.quick-view-tooltip .detail-view .detail-group table td.value {
-  font-size: 12px;
-  /*+text-shadow:0px 1px #EAEAEA;*/
-  text-shadow: 0 1px #eaeaea;
-  overflow: hidden;
-  -moz-text-shadow: 0 1px #eaeaea;
-  -webkit-text-shadow: 0 1px #eaeaea;
-  -o-text-shadow: 0 1px #eaeaea;
-}
-
-.quick-view-tooltip .detail-view .detail-group table td.value input[type='text'] {
-  width: 258px;
-  height: 10px;
-  margin-left: 0;
-}
-
-.quick-view-tooltip .detail-view .detail-group .main-groups table td.value span {
-  top: 7px;
-  height: 25px;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions {
-  position: relative;
-  float: left;
-  top: 202px;
-  width: 100%;
-  height: auto;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .button {
-  top: 160px;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text {
-  display: inline-block;
-  float: left;
-  width: 112px;
-  height: 41px;
-  margin-left: 5px;
-  border: 0;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text:hover {
-  /*+box-shadow:none;*/
-  box-shadow: none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text .icon {
-  display: block;
-  float: left;
-  width: 4px;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text .label {
-  display: block;
-  float: right;
-  width: 81px;
-  font-size: 11px;
-  color: #454c53;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-indent: 0;
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text:hover .label {
-  color: #000000;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .detail-actions {
-  position: relative;
-  float: left;
-  top: 27px;
-  vertical-align: top;
-  width: 460px;
-  height: auto;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions td.view-all {
-  position: relative;
-  float: left;
-  top: 26px;
-  left: 0;
-  height: 26px;
-  /*+box-shadow:inset 0px 1px #FFFFFF;*/
-  box-shadow: inset 0 1px #ffffff;
-  -moz-box-shadow: inset 0 1px #ffffff;
-  -webkit-box-shadow: inset 0 1px #ffffff;
-  -o-box-shadow: inset 0 1px #ffffff;
-}
-
-.quick-view-tooltip .detail-view .detail-actions a {
-  width: 30px;
-  background: none;
-}
-
-.detail-view {
-  padding: 0 0 0 14px;
-}
-
-.ui-tabs .info {
-  display: inline-block;
-  width: 91%;
-  height: auto;
-  margin: 10px;
-  padding: 14px 14px 0;
-  border: 1px dashed #d7d7d7;
-  /*+box-shadow:inset 0px 1px 2px #FFFFFF;*/
-  box-shadow: inset 0 1px 2px #ffffff;
-  background: #efefef;
-  overflow: visible;
-  -moz-box-shadow: inset 0 1px 2px #ffffff;
-  -webkit-box-shadow: inset 0 1px 2px #ffffff;
-  -o-box-shadow: inset 0 1px 2px #ffffff;
-}
-
-.ui-tabs .info li {
-  margin: 0 0 18px;
-  font-size: 12px;
-  color: #3e4c59;
-}
-
-.ui-tabs .info li strong {
-  font-weight: bold;
-  color: #506273;
-}
-
-.project-view .ui-tabs ul li.ui-state-default a {
-  box-shadow: inset -1px -2px 12px #596066;
-  /*+box-shadow:inset -1px -2px 12px #596066;*/
-  background: #6d747d;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #3a3e42;
-  -moz-box-shadow: inset -1px -2px 12px #596066;
-  -webkit-box-shadow: inset -1px -2px 12px #596066;
-  /*+text-shadow:0px -1px 1px #3A3E42;*/
-  -o-box-shadow: inset -1px -2px 12px #596066;
-  -moz-text-shadow: 0 -1px 1px #3a3e42;
-  -webkit-text-shadow: 0 -1px 1px #3a3e42;
-  -o-text-shadow: 0 -1px 1px #3a3e42;
-}
-
-.project-view .ui-tabs ul li.ui-state-hover a {
-  background: #878e97 0 8px;
-}
-
-.project-view .ui-tabs ul li.ui-state-active a {
-  box-shadow: 0 0;
-  background: #dbdddf;
-  font-weight: bold;
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  color: #4f6270;
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  /*+box-shadow:0px 0px;*/
-  -o-text-shadow: 0 0 #ffffff;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 none;
-  -webkit-box-shadow: 0 0 none;
-  -o-box-shadow: 0 0 none;
-}
-
-.ui-tabs li.ui-state-active.first.last a,
-.ui-tabs li.ui-state-default.first.last a {
-  /*+border-radius:4px 4px 0 0;*/
-  border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-.ui-tabs .ui-tabs-hide {
-  display: none !important;
-}
-
-.ui-tabs .ui-tabs-panel {
-  clear: both;
-  width: 97%;
-  height: 591px;
-  padding: 7px 0 0 0;
-  border: 1px solid #d9d9d9;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-div#details-tab-settings.detail-group.ui-tabs-panel {
-  overflow: hidden;
-  overflow-x: scroll;
-}
-
-.detail-view .main-groups {
-  width: 100%;
-  max-height: 407px;
-  margin-right: 12px;
-  overflow: auto;
-  /*[empty]padding:;*/
-  overflow-x: hidden;
-}
-
-.detail-view.edit-mode .main-groups {
-  max-height: 360px;
-}
-
-.detail-group table {
-  width: 98%;
-  margin-top: 10px;
-  border-bottom: 1px solid #dfdfdf;
-  font-size: 12px;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-}
-
-.detail-group table tbody {
-  border: 0;
-}
-
-.detail-group table tr,
-.detail-group table td {
-  vertical-align: middle;
-  border: 0;
-  cursor: default;
-}
-
-.detail-group table tr.odd {
-  background: none;
-}
-
-.details.group-multiple table {
-  border: 0;
-  border-top: 0;
-}
-
-.details.group-multiple table.header {
-  width: 94%;
-  margin-bottom: 1px;
-}
-
-.details.group-multiple table tbody {
-  border-top: 1px solid #f2f0f0;
-}
-
-.detail-group .main-groups table td.name {
-  width: 113px;
-  padding: 14px 12px 13px 13px;
-  border: 0;
-  font-weight: bold;
-  color: #6d6d6d;
-  text-indent: 0;
-}
-
-.detail-group .main-groups table td.value {
-  text-indent: 0;
-}
-
-.detail-group .main-groups table td.value > span {
-  display: block;
-  position: relative;
-  float: left;
-  top: 9px;
-  width: 550px;
-  height: 30px;
-  overflow: auto;
-}
-
-.detail-group .main-groups table td.value > span.copypasteenabledvalue {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  -o-text-overflow: ellipsis;
-}
-
-.detail-group .main-groups table td.value > .copypasteactive {
-  display: auto;
-  white-space: nowrap;
-  overflow: none;
-}
-
-div.copypasteicon {
-  float: left;
-  width: 18px;
-  height: 21px;
-  margin-top: 0;
-  margin-left: 6px;
-  background: url("../images/sprites.png") no-repeat -271px -65px;
-}
-
-div.copypasteicon:hover {
-  background: url("../images/sprites.png") no-repeat -271px -646px;
-}
-
-.detail-group .main-groups table td.value > span.copypasteenabledvalue {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  -o-text-overflow: ellipsis;
-}
-
-.detail-group .main-groups table td.value > .copypasteactive {
-  display: auto;
-  white-space: nowrap;
-  overflow: none;
-}
-
-div.copypasteicon {
-  float: left;
-  width: 18px;
-  height: 21px;
-  margin-top: 0;
-  margin-left: 6px;
-  background: url("../images/sprites.png") no-repeat -271px -65px;
-}
-
-div.copypasteicon:hover {
-  background: url("../images/sprites.png") no-repeat -271px -646px;
-}
-
-.detail-group .main-groups table td.value > span select {
-  width: 100% !important;
-}
-
-.detail-group .main-groups table td.value .view-all {
-  float: right;
-  /*[empty]height:;*/
-  /*+border-radius:4px 0 0 4px;*/
-  margin: 7px 0 0;
-  padding: 0;
-  border-radius: 4px 0 0 4px;
-  cursor: pointer;
-  -moz-border-radius: 4px 0 0 4px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -khtml-border-radius: 4px 0 0 4px;
-}
-
-.detail-group .main-groups table td.value .view-all span {
-  display: block;
-  float: left;
-  margin-top: -5px;
-  padding: 5px 2px 8px 4px;
-  border-left: 1px solid #9fa2a6;
-  /*+border-radius:4px 0 0 4px;*/
-  border-radius: 4px 0 0 4px;
-  background: url("../images/gradients.png") repeat-x 0 -529px;
-  -moz-border-radius: 4px 0 0 4px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -khtml-border-radius: 4px 0 0 4px;
-}
-
-.detail-group .main-groups table td.value .view-all .end {
-  float: right;
-  width: 22px;
-  height: 25px;
-  margin: -6px 0 0;
-  padding: 0;
-  background: url("../images/sprites.png") no-repeat 100% -397px;
-}
-
-.detail-group .main-groups table td.value .view-all:hover {
-  background-position: 100% -431px;
-}
-
-.detail-group .main-groups table td.value .view-all:hover span {
-  background-position: 0 -566px;
-}
-
-.detail-group .main-groups table td.value .view-all:hover div.end {
-  background-position: -618px -430px;
-}
-
-.detail-view .detail-group .button.add {
-  clear: both;
-  margin: 0 21px 13px 0 !important;
-}
-
-.detail-view .details.group-multiple {
-  float: left;
-  width: 100%;
-  height: 600px;
-  margin-bottom: 30px;
-}
-
-.detail-view .details.group-multiple .main-groups {
-  width: 98%;
-  margin-bottom: 35px;
-  overflow: visible;
-}
-
-.detail-group .main-groups table td.value .view-all:hover {
-  background-position: 100% -431px;
-}
-
-.panel.always-maximized .detail-group .main-groups table td.value span {
-  width: 565px;
-}
-
-.detail-group.head table td.name {
-  padding: 20px 0 17px;
-}
-
-.detail-view .button.done,
-.detail-view .button.cancel {
-  display: inline-block;
-  position: relative;
-  position: absolute;
-  top: 550px;
-  /*+border-radius:4px;*/
-  left: -1px;
-  margin: 0 0 0 12px;
-  padding: 9px 20px;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+text-shadow:0px -1px 2px #000000;*/
-  box-shadow: 0 1px 4px #adadad;
-  background: url("../images/bg-gradients.png") 0 -221px;
-  font-size: 12px;
-  font-weight: bold;
-  /*+box-shadow:0px 1px 4px #ADADAD;*/
-  color: #ffffff;
-  text-shadow: 0 -1px 2px #000000;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 2px #000000;
-  -webkit-text-shadow: 0 -1px 2px #000000;
-  /*+placement:shift -1px 550px;*/
-  -o-text-shadow: 0 -1px 2px #000000;
-  -moz-box-shadow: 0 1px 4px #adadad;
-  -webkit-box-shadow: 0 1px 4px #adadad;
-  -o-box-shadow: 0 1px 4px #adadad;
-}
-
-.detail-view .button.cancel {
-  left: 85px;
-  background-position: 0 -795px;
-  color: #808080;
-  /*+text-shadow:0px -1px 2px #000000;*/
-  text-shadow: 0 -1px 2px #000000;
-  text-shadow: 0 -1px 2px #cccccc;
-  -moz-text-shadow: 0 -1px 2px #000000;
-  -webkit-text-shadow: 0 -1px 2px #000000;
-  -o-text-shadow: 0 -1px 2px #000000;
-  -moz-text-shadow: 0 -1px 2px #cccccc;
-  -webkit-text-shadow: 0 -1px 2px #cccccc;
-  -o-text-shadow: 0 -1px 2px #cccccc;
-}
-
-.detail-view .button.done:hover {
-  box-shadow: inset 0 1px 3px #000000;
-  /*+box-shadow:inset 0px 1px 3px #000000;*/
-  background-position: 0 -950px;
-  -moz-box-shadow: inset 0 1px 3px #000000;
-  -webkit-box-shadow: inset 0 1px 3px #000000;
-  -o-box-shadow: inset 0 1px 3px #000000;
-}
-
-.detail-view .button.cancel:hover {
-  background-position: 0 -834px;
-}
-
-div.group-multiple div.detail-group table {
-  margin-top: -1px;
-}
-
-div.group-multiple div.detail-group table.header {
-  margin-top: 11px;
-  border: 0;
-}
-
-div.group-multiple div.detail-group table.header thead th {
-  border: 0;
-  background: transparent;
-}
-
-div.ui-tabs-panel table span.none {
-  color: #9d9d9d;
-}
-
-div.detail-group td.view-all div.view-all {
-  float: right;
-  width: auto;
-}
-
-div.detail-group td.view-all a {
-  display: block;
-  float: left;
-  font-size: 13px;
-  font-weight: 100;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  color: #0373b7;
-  text-decoration: none;
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-div.detail-group td.view-all:hover a {
-  background-position: 0 -566px;
-}
-
-div.detail-group td.view-all a span {
-  /*+placement:shift -4px -1px;*/
-  position: relative;
-  top: -1px;
-  left: -4px;
-}
-
-div.detail-group td.view-all:hover a span {
-  color: #000000;
-  text-decoration: underline;
-}
-
-div.detail-group td.view-all div.view-all div.end {
-  display: none;
-  float: left;
-  width: 15px;
-  height: 25px;
-  background: url("../images/sprites.png") -617px -398px;
-}
-
-div.detail-group td.view-all:hover div.view-all div.end {
-  background-position: -617px -431px;
-}
-
-div.details div.detail-group td.value input,
-div.details div.detail-group td.value select {
-  width: 282px;
-}
-
-div.details div.detail-group td.value input,
-div.details div.detail-group td.value input[type='checkbox'] {
-  float: left;
-  width: 15px;
-  margin-left: 10px;
-}
-
-div.details div.detail-group td.value input,
-div.details div.detail-group td.value input[type='text'] {
-  width: 93%;
-}
-
-div.details .main-groups label.error {
-  position: absolute;
-  top: 6px;
-  right: 10%;
-}
-
-.detail-view td.view-all.multiple {
-  display: block;
-  float: left;
-  max-width: 145px;
-  height: 28px;
-  margin-left: 0;
-  text-align: left;
-}
-
-div.detail-group.actions {
-  margin: 0;
-  padding: 0;
-}
-
-div.detail-group.actions table {
-  padding: 0;
-}
-
-div.detail-group.actions tr {
-  margin: 0;
-}
-
-div.detail-group.actions td {
-  vertical-align: middle;
-  height: 50px;
-}
-
-.details.group-multiple div.detail-group.actions {
-  position: relative;
-  float: right;
-  max-width: 75%;
-  height: 23px;
-  margin: -15px 0 -5px;
-}
-
-.details.group-multiple div.detail-group.actions table {
-  background: none;
-}
-
-.details.group-multiple div.detail-group.actions td.detail-actions {
-  display: block;
-  float: right;
-  min-width: 120px;
-  height: 35px;
-  padding: 0;
-  background: none;
-}
-
-.details.group-multiple div.detail-group.actions .detail-actions .action {
-  position: relative;
-  float: left;
-  /*+placement:shift 11px 7px;*/
-  top: 7px;
-  left: 11px;
-  width: 32px;
-}
-
-.details.group-multiple div.detail-group.actions .detail-actions .action a {
-  width: 31px;
-  background: none;
-}
-
-.detail-group table td.detail-actions {
-  height: 26px;
-}
-
-.detail-group table td.detail-actions.full-length {
-  display: block;
-  float: left;
-  width: 99%;
-}
-
-.detail-group table td.detail-actions .action.text {
-  display: inline-block;
-  float: right;
-  margin-right: 8px;
-  padding: 0 6px 0 0;
-  border: 1px solid #c2c2c2;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  background: url("../images/bg-gradients.png") repeat-x 0 -83px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.detail-group table td.detail-actions .action.text .label {
-  position: relative;
-  /*+placement:shift -1px 8px;*/
-  top: 8px;
-  left: -1px;
-  font-size: 12px;
-}
-
-.detail-group table td.detail-actions .action.text:hover {
-  /*+box-shadow:inset 0px 1px 3px #171717;*/
-  box-shadow: inset 0 1px 3px #171717;
-  -moz-box-shadow: inset 0 1px 3px #171717;
-  -webkit-box-shadow: inset 0 1px 3px #171717;
-  -o-box-shadow: inset 0 1px 3px #171717;
-}
-
-.detail-group table td.detail-actions a {
-  display: block;
-  float: left;
-  width: 30px;
-  height: 25px;
-  margin: 0;
-  text-indent: -9999px;
-}
-
-.detail-group table td.detail-actions a:hover {
-  background-position: -417px -43px;
-}
-
-.detail-group table td.detail-actions div.action.first a {
-  width: 32px;
-  background-position: -385px -11px;
-}
-
-.detail-group table td.detail-actions div.action.first a:hover {
-  background-position: -385px -43px;
-}
-
-.detail-group table td.detail-actions div.action.last a {
-  width: 30px;
-  background-position: -596px -11px;
-}
-
-.detail-group table td.detail-actions div.action.last a:hover {
-  background-position: -596px -43px;
-}
-
-.detail-group table td.detail-actions div.action.single a {
-  width: 31px;
-  height: 26px;
-  background-position: -414px -625px;
-}
-
-.detail-group table td.detail-actions div.action.text a {
-  background: none;
-}
-
-.detail-group table td.detail-actions div.action.single a:hover {
-  background-position: -414px -587px;
-}
-
-.detail-group table td.detail-actions a span.icon {
-  display: block;
-  padding: 10px;
-  background-image: url("../images/sprites.png");
-}
-
-#header {
-  position: relative;
-  width: 100%;
-  height: 135px;
-  background: url("../images/overlay-pattern.png") repeat 0, #1b5070 url("../images/header-gradient.png") no-repeat center;
-  background-size: auto, cover;
-}
-
-#header div.button {
-  font-size: 12px;
-  color: #ffffff;
-  cursor: pointer;
-}
-
-#header.nologo div.logo {
-  position: relative;
-  top: 15px;
-  left: 0;
-  width: 1224px;
-  /*+placement:shift 0px 15px;*/
-  height: 47px;
-  margin: auto;
-  background: url("../images/logo.png") no-repeat 0 center;
-}
-
-#header div.controls {
-  position: relative;
-  width: 1226px;
-  height: 48px;
-  margin: 27px auto 0;
-  padding-top: 13px;
-  /*+border-radius:4px 4px 0 0;*/
-  border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-#header div.controls.nologo {
-  box-shadow: 0 -1px 6px #0e3955;
-  background: #666666;
-  background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMzZDNkM2QiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+");
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #666666), color-stop(100%, #3d3d3d));
-  background: -webkit-linear-gradient(top, #666666 0%, #3d3d3d 100%);
-  background: linear-gradient(to bottom, #666666 0%, #3d3d3d 100%);
-  /*+box-shadow:0px -1px 6px #0E3955;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#666666', endColorstr='#3d3d3d', GradientType=0);
-  -moz-box-shadow: 0 -1px 6px #0e3955;
-  -webkit-box-shadow: 0 -1px 6px #0e3955;
-  -o-box-shadow: 0 -1px 6px #0e3955;
-}
-
-#header div.notifications {
-  position: relative;
-  float: right;
-  top: -57px;
-  left: -239px;
-  /*+placement:shift -174px -57px;*/
-  height: 18px;
-  padding: 1px 0 0;
-  background: transparent;
-}
-
-#header div.notifications:after {
-  content: '|';
-  /*+placement:shift 28px 7px;*/
-  position: relative;
-  top: 7px;
-  left: 28px;
-}
-
-#header div.notifications span {
-  position: relative;
-  top: 5px;
-  left: 7px;
-  /*+text-shadow:0px -1px 1px #464646;*/
-  text-shadow: 0 -1px 1px #464646;
-  -moz-text-shadow: 0 -1px 1px #464646;
-  -webkit-text-shadow: 0 -1px 1px #464646;
-  -o-text-shadow: 0 -1px 1px #464646;
-}
-
-#header div.notifications:hover {
-  color: #5faaf7;
-}
-
-#header div.notifications div.total {
-  float: left;
-  width: 22px;
-  height: 19px;
-  margin: 3px;
-  background: url("../images/sprites.png") no-repeat -593px -870px;
-  font-size: 11px;
-  color: #ffffff;
-  /*+text-shadow:0px -1px #6C7283;*/
-  text-shadow: 0 -1px #6c7283;
-  -moz-text-shadow: 0 -1px #6c7283;
-  -webkit-text-shadow: 0 -1px #6c7283;
-  -o-text-shadow: 0 -1px #6c7283;
-  -moz-text-shadow: 0 -1px 0 #6c7283;
-  -webkit-text-shadow: 0 -1px 0 #6c7283;
-  -o-text-shadow: 0 -1px 0 #6c7283;
-}
-
-#header div.notifications div.total.pending {
-  background-position: -593px -846px;
-  font-weight: bold;
-}
-
-#header div.notifications div.total span {
-  /*+placement:shift 0px 3px;*/
-  display: block;
-  position: relative;
-  top: 3px;
-  left: 0;
-  width: 21px;
-  font-size: 12px;
-  text-align: center;
-}
-
-#user {
-  display: inline-block;
-  position: absolute;
-  float: left;
-  top: -47px;
-  left: 1025px;
-  height: 30px;
-  margin: 0;
-  background: transparent;
-  cursor: default !important;
-}
-
-#user div.name {
-  display: inline-block;
-  float: left;
-  min-width: 110px;
-  max-width: 220px;
-  /*[empty]border-top:;*/
-  height: 12px;
-  margin: 0;
-  padding: 9px 18px 7px 12px;
-  border-right: 0;
-  text-align: center;
-  /*+text-shadow:0px -1px 1px #464646;*/
-  text-shadow: 0 -1px 1px #464646;
-  overflow: hidden;
-  -moz-text-shadow: 0 -1px 1px #464646;
-  -webkit-text-shadow: 0 -1px 1px #464646;
-  -o-text-shadow: 0 -1px 1px #464646;
-}
-
-#user div.options {
-  position: relative;
-  float: left;
-  top: 0;
-  /*+placement:shift 0px 0px;*/
-  left: 0;
-  width: 31px;
-  height: 28px;
-  background-position: 0 -867px;
-  cursor: pointer;
-}
-
-#user div.options .arrow {
-  position: relative;
-  top: 11px;
-  left: 8px;
-  /*+placement:shift 8px 11px;*/
-  width: 11px;
-  height: 8px;
-  background: url("../images/buttons.png") -402px -23px;
-}
-
-#user-options {
-  position: absolute;
-  z-index: 10000;
-  top: 30px;
-  width: 150px;
-  padding: 15px;
-  border-radius: 0 0 3px 3px;
-  /*+border-radius:0 0 3px 3px;*/
-  box-shadow: 0 1px 7px #000000;
-  background: #ffffff;
-  -moz-border-radius: 0 0 3px 3px;
-  -webkit-border-radius: 0 0 3px 3px;
-  /*+box-shadow:0px 1px 7px #000000;*/
-  -khtml-border-radius: 0 0 3px 3px;
-  -moz-box-shadow: 0 1px 7px #000000;
-  -webkit-box-shadow: 0 1px 7px #000000;
-  -o-box-shadow: 0 1px 7px #000000;
-}
-
-#user-options a {
-  float: left;
-  width: 100%;
-  padding: 10px 0;
-}
-
-#header .zone-filter {
-  float: left;
-  width: 111px;
-  margin: 9px 20px 0 2px;
-}
-
-#header .zone-filter label {
-  position: absolute;
-  top: -3px;
-  font-size: 11px;
-  color: #ffffff;
-}
-
-#header .zone-filter select {
-  width: 100%;
-  margin-top: 2px;
-  border: 1px solid #000000;
-  border-bottom: #ffffff;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: #ececec;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-#navigation {
-  position: relative;
-  float: left;
-  width: 230px;
-  /*+box-shadow:inset -1px 4px 7px #DDDDDD;*/
-  box-shadow: inset -1px 4px 7px #dddddd;
-  background: #ede8e8;
-  background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjYlIiBzdG9wLWNvbG9yPSIjZWRlOGU4IiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZ3JhZC11Y2dnLWdlbmVyYXRlZCkiIC8+Cjwvc3ZnPg==");
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(6%, #ede8e8));
-  background: -webkit-linear-gradient(top, #ffffff 0%, #ede8e8 6%);
-  background: linear-gradient(to bottom, #ffffff 0%, #ede8e8 6%);
-  -moz-box-shadow: inset -1px 4px 7px #dddddd;
-  -webkit-box-shadow: inset -1px 4px 7px #dddddd;
-  -o-box-shadow: inset -1px 4px 7px #dddddd;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ede8e8', GradientType=0);
-}
-
-.project-view #navigation {
-  background: #6d747d;
-}
-
-#navigation ul {
-  height: 700px;
-  padding-top: 29px;
-}
-
-.project-view #navigation ul {
-  border-right: 1px solid #464c53;
-  background: #6d747d;
-}
-
-#navigation ul li {
-  height: 42px;
-  border-bottom: 1px solid #d2d2d2;
-  cursor: pointer;
-}
-
-.project-view #navigation ul li {
-  border: 0;
-  background-image: url("../images/bg-nav-item-project-view.png");
-  background-position: 0 0;
-}
-
-.project-view #navigation ul li span {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-#navigation ul li:hover,
-#navigation ul li.active {
-  width: 230px;
-  box-shadow: inset 0 0 7px #000000;
-  /*+box-shadow:inset 0px 0px 7px #000000;*/
-  background: #2c5d7b;
-  -moz-box-shadow: inset 0 0 7px #000000;
-  -webkit-box-shadow: inset 0 0 7px #000000;
-  -o-box-shadow: inset 0 0 7px #000000;
-}
-
-#navigation ul li.disabled {
-  /*+opacity:60%;*/
-  opacity: 0.6;
-  filter: alpha(opacity=60);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
-  -moz-opacity: 0.6;
-}
-
-.project-view #navigation ul li:hover,
-.project-view #navigation ul li.active {
-  width: 230px;
-  background: url("../images/bg-nav-item-active-project-view.png");
-  background-position: 0 0;
-}
-
-.project-view #navigation ul li.disabled:hover {
-  background: #d5d5d5;
-  color: #596d7f;
-  cursor: default;
-}
-
-#navigation ul li:hover span,
-#navigation ul li.active span {
-  color: #ffffff;
-  /*+text-shadow:0px 1px #000000;*/
-  text-shadow: 0 1px #000000;
-  -moz-text-shadow: 0 1px #000000;
-  -webkit-text-shadow: 0 1px #000000;
-  -o-text-shadow: 0 1px #000000;
-}
-
-#navigation ul li.disabled:hover {
-  cursor: not-allowed !important;
-}
-
-#navigation ul li.disabled:hover span {
-  color: #596d7f;
-  /*+text-shadow:0px 0px;*/
-  text-shadow: 0 0;
-  -moz-text-shadow: 0 0;
-  -webkit-text-shadow: 0 0;
-  -o-text-shadow: 0 0;
-  -moz-text-shadow: 0 0 none;
-  -webkit-text-shadow: 0 0 none;
-  -o-text-shadow: 0 0 none;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-#navigation ul li.last {
-  background-repeat: repeat;
-  background-position: 0 0;
-  /*[empty]color:;*/
-}
-
-#navigation ul li span {
-  /*+placement:shift 14px 13px;*/
-  position: relative;
-  top: 13px;
-  left: 14px;
-  padding-left: 19px;
-  font-size: 12px;
-  color: #515151;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-#navigation ul li span.icon {
-  position: relative;
-  top: 10px;
-  /*+placement:shift 17px 10px;*/
-  left: 17px;
-  padding: 16px 16px 13px;
-  background: url("../images/icons.png") no-repeat 0 0;
-}
-
-#navigation ul li.custom-icon span.icon {
-  display: block;
-  position: relative;
-  float: left;
-  width: 50px;
-  height: 50px;
-  margin-right: -47px;
-  background: none;
-}
-
-#navigation ul li.custom-icon span.icon img {
-  position: relative;
-  position: absolute;
-  float: left;
-  /*+placement:shift -6px -17px;*/
-  top: -17px;
-  left: -6px;
-  width: 50px;
-  height: 50px;
-  margin-right: -14px;
-}
-
-/*Navigation icons*/
-#navigation ul li.dashboard span.icon,
-#navigation ul li.dashboard-user span.icon {
-  background-position: -14px -18px;
-}
-
-#navigation ul li.dashboard:hover span.icon,
-#navigation ul li.dashboard-user:hover span.icon span.icon,
-#navigation ul li.dashboard.active span.icon,
-#navigation ul li.dashboard-user.active span.icon span.icon {
-  background-position: -23px -687px;
-}
-
-#navigation ul li.instances span.icon {
-  background-position: -73px -18px;
-}
-
-#navigation ul li.instances.active span.icon,
-#navigation ul li.instances:hover span.icon {
-  background-position: -82px -686px;
-}
-
-#navigation ul li.vmsnapshots span.icon {
-  background: url("../images/sprites.png") no-repeat -34px -666px;
-}
-
-#navigation ul li.affinityGroups span.icon {
-  background-position: -73px -87px;
-}
-
-#navigation ul li.affinityGroups.active span.icon,
-#navigation ul li.affinityGroups:hover span.icon {
-  background-position: -82px -755px;
-}
-
-#navigation ul li.storage span.icon {
-  background-position: -127px -19px;
-}
-
-#navigation ul li.storage.active span.icon,
-#navigation ul li.storage:hover span.icon {
-  background-position: -137px -687px;
-}
-
-#navigation ul li.network span.icon {
-  background-position: -180px -20px;
-}
-
-#navigation ul li.network.active span.icon,
-#navigation ul li.network:hover span.icon {
-  background-position: -189px -690px;
-}
-
-#navigation ul li.templates span.icon {
-  background-position: -233px -21px;
-}
-
-#navigation ul li.templates.active span.icon,
-#navigation ul li.templates:hover span.icon {
-  background-position: -242px -690px;
-}
-
-#navigation ul li.projects span.icon {
-  background-position: -294px -21px;
-}
-
-#navigation ul li.projects.active span.icon,
-#navigation ul li.projects:hover span.icon {
-  background-position: -303px -690px;
-}
-
-#navigation ul li.events span.icon {
-  background-position: -351px -23px;
-}
-
-#navigation ul li.events.active span.icon,
-#navigation ul li.events:hover span.icon {
-  background-position: -359px -692px;
-}
-
-#navigation ul li.configuration span.icon {
-  background-position: -401px -21px;
-}
-
-#navigation ul li.configuration.active span.icon,
-#navigation ul li.configuration:hover span.icon {
-  background-position: -410px -690px;
-}
-
-#navigation ul li.global-settings span.icon {
-  background-image: url("../images/sprites.png");
-  background-position: -143px -240px;
-}
-
-#navigation ul li.global-settings.active span.icon,
-#navigation ul li.global-settings:hover span.icon {
-  background-image: url("../images/sprites.png");
-  background-position: -366px -239px;
-}
-
-#navigation ul li.roles span.icon {
-  background-position: -460px -80px;
-}
-
-#navigation ul li.roles.active span.icon,
-#navigation ul li.roles:hover span.icon {
-  background-position: -469px -750px;
-}
-
-#navigation ul li.accounts span.icon {
-  background-position: -458px -19px;
-}
-
-#navigation ul li.accounts.active span.icon,
-#navigation ul li.accounts:hover span.icon {
-  background-position: -467px -688px;
-}
-
-#navigation ul li.system span.icon {
-  background-position: -569px -24px;
-}
-
-#navigation ul li.system.active span.icon,
-#navigation ul li.system:hover span.icon {
-  background-position: -578px -692px;
-}
-
-#navigation ul li.domains span.icon {
-  background-position: -520px -21px;
-}
-
-#navigation ul li.domains.active span.icon,
-#navigation ul li.domains:hover span.icon {
-  background-position: -529px -690px;
-}
-
-#navigation ul li.plugins span.icon {
-  background: url("../images/sprites.png") no-repeat -140px -291px;
-}
-
-#navigation ul li.regions span.icon {
-  background: url("../images/sprites.png") no-repeat -141px -379px;
-}
-
-#navigation ul li.regions.active span.icon,
-#navigation ul li.regions:hover span.icon {
-  background: url("../images/sprites.png") no-repeat -365px -377px;
-}
-
-#browser {
-  position: relative;
-  float: left;
-  width: 994px;
-  max-width: 994px;
-  height: 100%;
-  overflow: hidden;
-}
-
-#browser.panel-highlight {
-  overflow: visible;
-}
-
-#browser div.panel {
-  height: 100%;
-  border-right: 1px solid #a5a5a5;
-  background-color: #f7f7f7;
-  overflow: visible;
-}
-
-#browser div.panel.panel-highlight-wrapper {
-  display: inline-block;
-  position: absolute;
-  /*+border-radius:9px;*/
-  z-index: 10000;
-  height: 542px;
-  margin-top: 7px;
-  padding: 78px 0 67px 51px;
-  border: 3px solid #ffffff;
-  /*+box-shadow:0px 0px 12px #000000;*/
-  border-radius: 9px;
-  box-shadow: 0 0 12px #000000;
-  background: none;
-  overflow: hidden;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-  -moz-box-shadow: 0 0 12px #000000;
-  -webkit-box-shadow: 0 0 12px #000000;
-  -o-box-shadow: 0 0 12px #000000;
-}
-
-#browser div.panel.panel-highlight-wrapper .panel {
-  top: 3px;
-  left: 20px !important;
-  height: 631px;
-  overflow: hidden;
-}
-
-.project-view #browser div.panel {
-  background: #6d747d;
-}
-
-.ui-tabs div.ui-tabs-panel {
-  position: relative;
-}
-
-.project-view .ui-tabs div.ui-tabs-panel {
-  background: #dbdddf;
-}
-
-#browser div.panel .shadow {
-  position: absolute;
-  top: 0;
-  left: -10px;
-  width: 10px;
-  height: 100%;
-  background: url("../images/bg-panel-shadow.png") repeat-y 0 0;
-}
-
-#browser.panel-highlight {
-  overflow: visible;
-}
-
-#browser.panel-highlight .panel.highlighted {
-  /*+box-shadow:0px 10px 11px #5C5C5C;*/
-  margin-top: 21px;
-  border: 5px solid #ffffff;
-  border-radius: 6px;
-  box-shadow: 0 10px 11px #5c5c5c;
-  -moz-box-shadow: 0 10px 11px #5c5c5c;
-  /*+border-radius:6px;*/
-  -webkit-box-shadow: 0 10px 11px #5c5c5c;
-  -o-box-shadow: 0 10px 11px #5c5c5c;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-#browser.panel-highlight .panel > .shadow {
-  display: none;
-}
-
-#browser .highlight-arrow {
-  position: absolute;
-  top: -22px;
-  left: 80px;
-  width: 24px;
-  height: 19px;
-  background: url("../images/sprites.png") -590px -1295px;
-}
-
-div.toolbar {
-  position: relative;
-  position: absolute;
-  /*+box-shadow:0px 1px 4px #CFCFCF;*/
-  z-index: 6;
-  top: -1px;
-  top: 0;
-  left: 0;
-  /*+placement:shift 0px -1px;*/
-  width: 100%;
-  height: 32px;
-  box-shadow: 0 1px 4px #cfcfcf;
-  background: #ececec 0 -6px;
-  -moz-box-shadow: 0 1px 4px #cfcfcf;
-  -webkit-box-shadow: 0 1px 4px #cfcfcf;
-  -o-box-shadow: 0 1px 4px #cfcfcf;
-}
-
-.detail-view .ui-tabs-panel div.toolbar {
-  width: 968px;
-  margin-top: 8px;
-  border: 0;
-  background: transparent;
-}
-
-.project-view div.toolbar {
-  background: #808080 url("../images/bg-nav-item-active-project-view.png") 0 -210px;
-}
-
-div.toolbar div.filters {
-  margin: 5px 0 0 12px;
-}
-
-div.toolbar div.filters label {
-  display: block;
-  float: left;
-  padding: 5px 11px 0 0;
-  font-size: 12px;
-  font-weight: 100;
-  color: #3f3b3b;
-}
-
-.project-view div.toolbar div.filters label {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-div.toolbar div.filters select {
-  width: 142px;
-  border: 1px solid #808080;
-}
-
-div.toolbar div.text-search {
-  position: relative;
-  float: right;
-}
-
-div.toolbar div.text-search div.search-bar {
-  position: relative;
-  z-index: 4;
-  float: left;
-  width: 141px;
-  height: 20px;
-  margin: 5px 0 0 12px;
-  border: 1px solid #8b7e7e;
-  border-right: 1px solid #8b8989;
-  border-radius: 4px 0 0 4px;
-  /*+border-radius:4px 0 0 4px;*/
-  background: #ffffff;
-  -moz-border-radius: 4px 0 0 4px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -khtml-border-radius: 4px 0 0 4px;
-}
-
-div.toolbar div.text-search div.search-bar input {
-  float: left;
-  width: 90%;
-  height: 68%;
-  margin: 1px 0 0;
-  border: 0;
-}
-
-div.toolbar div.text-search div.search-bar div.filter {
-  float: left;
-  width: 74px;
-  height: 15px;
-  margin: 2px 0 0;
-  padding: 1px;
-  border-left: 1px solid #6d6d6d;
-  background: #ffffff;
-  font-size: 12px;
-  text-align: center;
-}
-
-div.toolbar div.button.search {
-  position: relative;
-  z-index: 3;
-  top: 5px;
-  /*+placement:shift -10px 5px;*/
-  left: -10px;
-  width: 33px;
-  height: 22px;
-  background: url("../images/sprites.png") no-repeat -592px -328px;
-  cursor: pointer;
-}
-
-div.toolbar div.button.search:hover {
-  background-position: -592px -359px;
-}
-
-div.toolbar div.button.add,
-div.toolbar div.button.refresh,
-div.toolbar div.button.add,
-div.toolbar div.button.main-action,
-.toolbar div.button.header-action,
-.detail-group .button.add {
-  /*+placement:shift 0px 5px;*/
-  position: relative;
-  float: right;
-  top: 5px;
-  left: 0;
-  height: 12px;
-  margin: 0 10px 0 0;
-  padding: 5px 5px 5px 5px;
-  border: 1px solid #b7b7b7;
-  border-radius: 4px;
-  /*+text-shadow:0px 1px 1px #DEE5EA;*/
-  border-radius: 4px 4px 4px 4px;
-  background: #eaeaea;
-  background: #f7f7f7;
-  background: #f7f7f7;
-  background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlYWVhZWEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+");
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #f7f7f7), color-stop(100%, #eaeaea));
-  background: -webkit-linear-gradient(top, #f7f7f7 1%, #eaeaea 100%);
-  background: linear-gradient(to bottom, #f7f7f7 1%, #eaeaea 100%);
-  font-size: 12px;
-  font-weight: 100;
-  color: #000000;
-  text-shadow: 0 1px 1px #dee5ea;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #dee5ea;
-  /*+border-radius:4px;*/
-  -webkit-text-shadow: 0 1px 1px #dee5ea;
-  -o-text-shadow: 0 1px 1px #dee5ea;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-div.toolbar div.button.export:hover,
-div.toolbar div.button.add:hover,
-div.toolbar div.button.refresh:hover,
-div.toolbar div.button.main-action:hover,
-.toolbar div.button.header-action:hover,
-.detail-group .button.add:hover {
-  box-shadow: inset 0 0 5px #c3c3c3;
-  /*+box-shadow:inset 0px 0px 5px #C3C3C3;*/
-  background: #e5e5e5;
-  -moz-box-shadow: inset 0 0 5px #c3c3c3;
-  -webkit-box-shadow: inset 0 0 5px #c3c3c3;
-  -o-box-shadow: inset 0 0 5px #c3c3c3;
-}
-
-div.toolbar div.button.main-action span.icon {
-  display: block;
-  position: relative;
-  float: left;
-  top: -7px;
-  left: 0;
-  width: 34px;
-  /*+placement:shift 0px -7px;*/
-  height: 20px;
-  background-image: url("../images/sprites.png");
-  cursor: pointer;
-}
-
-div.toolbar div.button.refresh {
-  float: right;
-  margin: 0 20px 0 0;
-}
-
-div.toolbar div.button.refresh span {
-  padding: 1px 1px 1px 16px;
-  background-image: url("../images/icons.png");
-  background-repeat: no-repeat;
-  background-position: -629px -232px;
-}
-
-div.toolbar div.button.add span,
-.detail-group .button.add span.icon {
-  position: relative;
-  top: 0;
-  /*+placement:shift 0px 0px;*/
-  left: 0;
-  padding: 0 0 3px 18px;
-  background: url("../images/icons.png") no-repeat -626px -209px;
-}
-
-#browser div.panel.selected div.toolbar {
-  border-right: 1px solid #43586b;
-}
-
-#browser div.panel div.detail-view .toolbar {
-  width: 100%;
-}
-
-#advanced_search {
-  position: absolute;
-  z-index: 4;
-  top: 4px;
-  left: 139px;
-  width: 15px;
-  background: none;
-}
-
-#advanced_search .icon {
-  /*+opacity:56%;*/
-  opacity: 0.56;
-  position: absolute;
-  z-index: 10;
-  top: 1px;
-  left: -1px;
-  padding: 10px;
-  background: url("../images/sprites.png") no-repeat -62px -162px;
-  filter: alpha(opacity=56);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=56);
-  -moz-opacity: 0.56;
-}
-
-#advanced_search:hover .icon {
-  /*+opacity:100%;*/
-  opacity: 1;
-  filter: alpha(opacity=100);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
-  -moz-opacity: 1;
-}
-
-#advanced_search .form-container {
-  /*+opacity:91%;*/
-  opacity: 0.91;
-  display: inline-block;
-  position: absolute;
-  top: 2px;
-  /*+box-shadow:0px 5px 9px #B6B0B0;*/
-  left: -290px;
-  padding: 18px;
-  border: 1px solid #808080;
-  border-radius: 0 0 4px 4px;
-  box-shadow: 0 5px 9px #b6b0b0;
-  /*+border-radius:0 0 4px 4px;*/
-  background: #ffffff;
-  cursor: default;
-  filter: alpha(opacity=91);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=91);
-  -moz-opacity: 0.91;
-  -moz-box-shadow: 0 5px 9px #b6b0b0;
-  -webkit-box-shadow: 0 5px 9px #b6b0b0;
-  -o-box-shadow: 0 5px 9px #b6b0b0;
-  -moz-border-radius: 0 0 4px 4px;
-  -webkit-border-radius: 0 0 4px 4px;
-  -khtml-border-radius: 0 0 4px 4px;
-}
-
-#advanced_search .form-container .name {
-  float: left;
-  width: 66px;
-}
-
-#advanced_search .form-container .value {
-  float: left;
-  width: 186px;
-}
-
-#advanced_search .form-container .form-item {
-  width: 268px;
-  height: 40px;
-  margin-bottom: 15px;
-}
-
-#advanced_search .form-container .form-item input,
-#advanced_search .form-container .form-item select {
-  width: 97%;
-  padding: 3px;
-}
-
-#advanced_search input[type='submit'] {
-  float: right;
-  padding: 8px 20px;
-  /*+box-shadow:0px 2px 5px #858585;*/
-  border: 1px solid #606060;
-  border-top: 0;
-  border-radius: 4px;
-  box-shadow: 0 2px 5px #858585;
-  background: url("../images/bg-gradients.png") 0 -220px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 1px 1px #000000;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  cursor: pointer;
-  -moz-box-shadow: 0 2px 5px #858585;
-  -webkit-box-shadow: 0 2px 5px #858585;
-  -o-box-shadow: 0 2px 5px #858585;
-  /*+border-radius:4px;*/
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-#advanced_search input[type='submit']:hover {
-  /*+box-shadow:inset 0px 2px 3px #000000;*/
-  box-shadow: inset 0 2px 3px #000000;
-  -moz-box-shadow: inset 0 2px 3px #000000;
-  -webkit-box-shadow: inset 0 2px 3px #000000;
-  -o-box-shadow: inset 0 2px 3px #000000;
-}
-
-#advanced_search .button.cancel {
-  position: relative;
-  float: right;
-  top: 13px;
-  left: -32px;
-  /*+placement:shift -32px 13px;*/
-  background: url("noen");
-  font-size: 12px;
-  font-weight: bold;
-  color: #9a9a9a;
-}
-
-#advanced_search .button.cancel:hover {
-  color: #494949;
-}
-
-#browser div.panel div.toolbar div.panel-controls {
-  display: none;
-  float: right;
-  width: 42px;
-  height: 23px;
-}
-
-#browser div.panel.reduced div.toolbar div.panel-controls {
-  display: block;
-  float: left;
-  width: 194px;
-}
-
-#browser div.panel.maximized div.toolbar div.panel-controls {
-  display: block;
-}
-
-#browser div.panel div.toolbar div.panel-controls div.control {
-  float: right;
-  width: 25px;
-  height: 26px;
-  margin-right: 6px;
-  background: url("../images/buttons.png") no-repeat -599px -335px;
-  cursor: pointer;
-}
-
-#browser div.panel.maximized.single div.toolbar div.panel-controls div.control {
-  display: none;
-}
-
-#browser div.panel div.toolbar div.panel-controls div.control:hover {
-  background-position: -593px -309px;
-}
-
-#browser div.panel.maximized div.toolbar div.panel-controls div.control {
-  background-position: -621px -334px;
-}
-
-#browser div.panel.maximized div.toolbar div.panel-controls div.control:hover {
-  background-position: -617px -308px;
-}
-
-div.panel div.toolbar div.section-switcher {
-  float: left;
-  margin-top: 6px;
-  margin-left: 10px;
-}
-
-#browser div.panel.maximize-if-selected.selected div.toolbar div.panel-controls div.control {
-  display: none;
-}
-
-div.toolbar div.section-switcher div.section-select {
-  float: right;
-  font-size: 12px;
-  font-weight: 100;
-}
-
-div.list-view div.toolbar div.section-switcher div.section-select label {
-  margin: 0 9px 0 0;
-}
-
-div.toolbar div.section-switcher div.section {
-  float: left;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  /*+border-radius:10px;*/
-  font-size: 11px;
-  font-weight: bold;
-  text-shadow: 0 1px 1px #ededed;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  /*+text-shadow:0px 1px 1px #EDEDED;*/
-  -khtml-border-radius: 10px;
-  -moz-text-shadow: 0 1px 1px #ededed;
-  -webkit-text-shadow: 0 1px 1px #ededed;
-  -o-text-shadow: 0 1px 1px #ededed;
-}
-
-div.toolbar div.section-switcher div.section a {
-  display: block;
-  padding: 5px 10px 3px;
-  border: 1px solid #979fa4;
-  background: url("../images/bg-section-switcher.png") repeat-x 0 -22px;
-  color: #516374;
-  text-decoration: none;
-}
-
-div.toolbar div.section-switcher div.section a.active {
-  padding-top: 6px;
-  padding-bottom: 2px;
-  border: 0;
-  border-bottom: 1px solid #ccd1d4;
-  box-shadow: inset 0 1px 5px #546874;
-  background: url("../images/bg-section-switcher.png") repeat-x 0 -21px;
-  /*+box-shadow:inset 0px 1px 5px #546874;*/
-  background-position: 0 0;
-  -moz-box-shadow: inset 0 1px 5px #546874;
-  -webkit-box-shadow: inset 0 1px 5px #546874;
-  -o-box-shadow: inset 0 1px 5px #546874;
-}
-
-div.toolbar div.section-switcher div.section.first a {
-  /*+border-radius:4px 0 0 5px;*/
-  border-radius: 4px 0 0 5px;
-  -moz-border-radius: 4px 0 0 5px;
-  -webkit-border-radius: 4px 0 0 5px;
-  -khtml-border-radius: 4px 0 0 5px;
-}
-
-div.toolbar div.section-switcher div.section.last a {
-  /*+border-radius:0 4px 4px 0px;*/
-  border-radius: 0 4px 4px 0;
-  -moz-border-radius: 0 4px 4px 0;
-  -webkit-border-radius: 0 4px 4px 0;
-  -khtml-border-radius: 0 4px 4px 0;
-}
-
-div.toolbar div.section-switcher div.section.first.last a {
-  /*+border-radius:5px;*/
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-div.toolbar div.section-switcher div.section-select {
-  float: left;
-  height: 26px;
-}
-
-.project-view div.toolbar div.section-switcher div.section-select {
-  background: transparent;
-}
-
-div.toolbar div.section-switcher div.section-select select {
-  height: 21px;
-  margin-right: 13px;
-  border: 1px solid #808080;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-div.toolbar div.section-switcher div.section-select label {
-  margin: 0 9px 0 0;
-}
-
-.project-view div.list-view div.toolbar div.section-switcher div.section-select label {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-div.toolbar div.filters {
-  float: left;
-  width: 200px;
-  margin: 5px 0 0 12px;
-}
-
-div.toolbar div.filters select {
-  width: 104px;
-  height: 21px;
-  margin: 1px 0 0;
-  padding: 0 0 0;
-  /*+border-radius:4px;*/
-  border: 1px solid #808080;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-#breadcrumbs {
-  width: 100%;
-  height: 29px;
-  max-height: 29px;
-  background: #ffffff;
-  overflow: hidden;
-}
-
-.project-view #breadcrumbs {
-  background-color: #828282;
-  background-image: url("../images/bg-breadcrumbs-project-view.png");
-  background-position: 0 1px;
-}
-
-#breadcrumbs div.home {
-  position: relative;
-  z-index: 5;
-  float: left;
-  /*+placement:shift -1px 0px;*/
-  top: 0;
-  left: -1px;
-  width: auto;
-  height: 23px;
-  cursor: pointer;
-}
-
-.project-view #breadcrumbs div.home {
-  background-position: -63px -98px;
-}
-
-.project-view #breadcrumbs div.end {
-  background-position: -89px -98px;
-}
-
-#breadcrumbs ul li,
-#breadcrumbs div.active-project,
-#breadcrumbs .home {
-  position: relative;
-  position: relative;
-  float: left;
-  top: 0;
-  left: -13px;
-  height: 21px;
-  /*+placement:shift -13px 0px;*/
-  margin: 0 0 0 2px;
-  padding: 9px 5px 0 0;
-  font-size: 13px;
-  color: #ffffff;
-  cursor: pointer;
-}
-
-#breadcrumbs ul li:after,
-#breadcrumbs .home:after {
-  content: '>';
-  position: relative;
-  /*+placement:shift 7px -1px;*/
-  top: -1px;
-  left: 7px;
-  font-size: 11px;
-  color: #c4c4c4;
-}
-
-.project-view #breadcrumbs ul li {
-  color: #ffffff !important;
-}
-
-#breadcrumbs ul li,
-#breadcrumbs div.active-project,
-#breadcrumbs .home {
-  /*+placement:shift 0px 0px;*/
-  position: relative;
-  top: 0;
-  left: 0;
-  padding: 9px 5px 0 8px;
-  color: #63a9f1;
-}
-
-#breadcrumbs ul li:hover,
-#breadcrumbs ul li.active,
-#breadcrumbs ul li.maximized {
-  color: #000000;
-}
-
-/*NOTE: End divs are not displayed per UI changes*/
-#breadcrumbs ul div.end {
-  /*+placement:shift -37px -1px;*/
-  display: none;
-  position: relative;
-  top: -1px;
-  left: -37px;
-  /*Disabled*/
-  margin-right: 0;
-}
-
-#breadcrumbs ul li {
-  position: relative;
-  /*+placement:shift -36px 0px;*/
-  top: 0;
-  font-size: 13px;
-}
-
-#breadcrumbs div.active-project {
-  display: none;
-  z-index: 2;
-  text-indent: 9px;
-}
-
-div.panel div.view.group-thumbnail ul.groups li {
-  position: relative;
-  float: left;
-  width: 142px;
-  height: 80px;
-  margin: 16px -1px -5px 16px;
-  background: url("../images/buttons.png") no-repeat -1px -399px;
-  cursor: pointer;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.active {
-  background-position: -1px -489px;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.drop-hover {
-  background-position: -1px -310px !important;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.new {
-  background-position: -147px -401px;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.new.drop-hover {
-  background-position: -148px -312px !important;
-}
-
-div.panel div.view.group-thumbnail ul.groups li span.name {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 9px 7px;*/
-  top: 7px;
-  left: 9px;
-  font-size: 12px;
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  color: #49596b;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-div.panel div.view.group-thumbnail ul.groups li span.vm-count {
-  position: absolute;
-  /*+placement:displace 54px 27px;*/
-  position: absolute;
-  margin-top: 27px;
-  margin-left: 54px;
-  font-size: 21px;
-  color: #3a4857;
-}
-
-#browser div.panel.reduced .reduced-hide {
-  color: #bbb8b8;
-}
-
-#browser div.panel.reduced div.toolbar .reduced-hide {
-  display: none;
-}
-
-/*List view -- edit field*/
-div.view table td.editable div.edit {
-  position: relative;
-  top: 0;
-  /*+placement:shift 6px 0px;*/
-  left: 6px;
-  width: 106%;
-  height: 20px;
-}
-
-div.view table td.truncated.editable div.edit {
-  top: 1px;
-  left: 1px;
-  width: 285px;
-}
-
-div.view table td.editable div.edit input {
-  position: relative;
-  z-index: 1;
-  float: left;
-  width: 66%;
-  height: 17px;
-  border: 0;
-}
-
-.detail-view div.view table td.editable div.edit {
-  width: 116px;
-}
-
-div.view table td.editable div.action {
-  position: relative;
-  float: left;
-  top: 0;
-  left: -2px;
-  width: 16px;
-  /*+placement:shift -2px 0px;*/
-  height: 19px;
-  padding-left: 2px;
-  background: #ffffff url("../images/buttons.png") -614px -684px;
-  cursor: pointer;
-}
-
-div.view table td.editable div.action.save {
-  margin-left: 2px;
-}
-
-div.view table td.editable div.action.cancel {
-  background-position: -628px -684px;
-}
-
-table td.actions {
-  width: 200px;
-  /*Make fixed*/
-  min-width: 200px;
-  max-width: 200px;
-  cursor: default;
-}
-
-table td.actions span {
-  margin: 0 0 0 2px !important;
-}
-
-table td.actions .action span.icon {
-  float: left;
-  width: 23px;
-  height: 21px;
-  background-image: url("../images/sprites.png");
-  cursor: pointer;
-}
-
-table td.actions .action.disabled .icon {
-  opacity: 0.2;
-  /*+opacity:20%;*/
-  cursor: not-allowed;
-  filter: alpha(opacity=20);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);
-  -moz-opacity: 0.2;
-}
-
-table tr.odd td.actions .action.disabled .icon {
-  background-color: #f2f0f0;
-}
-
-table tr.even td.actions .action.disabled .icon {
-  background-color: #dfe1e3;
-}
-
-table tr td.actions .action.text {
-  display: inline-block;
-  border: 1px solid #c2c2c2;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  background: url("../images/bg-gradients.png") repeat-x 0 -83px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-table tr td.actions .action.text:hover {
-  /*+box-shadow:inset 0px 1px 3px #171717;*/
-  box-shadow: inset 0 1px 3px #171717;
-  -moz-box-shadow: inset 0 1px 3px #171717;
-  -webkit-box-shadow: inset 0 1px 3px #171717;
-  -o-box-shadow: inset 0 1px 3px #171717;
-}
-
-table tr td.actions .action.text .label {
-  padding: 4px 0 0 4px;
-}
-
-table tr td.actions .action.text .icon {
-  padding-bottom: 4px;
-}
-
-table tr.selected td.actions .action.disabled .icon {
-  background-color: #cbddf3;
-}
-
-.ui-dialog {
-  position: absolute;
-  padding: 15px;
-  /*+box-shadow:0px -4px 15px #4C4A4A;*/
-  box-shadow: 0 -4px 15px #4c4a4a;
-  background: #ffffff;
-  text-align: left;
-  -moz-box-shadow: 0 -4px 15px #4c4a4a;
-  -webkit-box-shadow: 0 -4px 15px #4c4a4a;
-  -o-box-shadow: 0 -4px 15px #4c4a4a;
-}
-
-.ui-dialog.ui-corner-all {
-  border-radius: 0;
-}
-
-.ui-dialog .ui-widget-content {
-  display: inline-block;
-  padding: 8px 0 8px 8px;
-  text-align: center;
-}
-
-.ui-dialog .ui-widget-content .nothing-to-select {
-  width: 386px;
-  margin: 57px 0 0;
-  padding: 4px 25px 180px 28px;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: #ffffff;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  font-size: 16px;
-  line-height: 21px;
-  color: #3d3d3d;
-  text-align: left;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  /*+border-radius:10px;*/
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.ui-dialog .ui-widget-content .nothing-to-select p {
-  margin: 18px 0 0;
-}
-
-.ui-dialog .ui-widget-content .nothing-to-select .specify-ip {
-  margin-top: 28px;
-  padding-top: 21px;
-  border-top: 1px solid #dfdfdf;
-  font-size: 12px;
-}
-
-.ui-dialog-buttonset {
-  width: 285px;
-  margin: 0;
-}
-
-.ui-dialog .ui-button {
-  display: block;
-  float: left;
-  width: 110px;
-  height: 31px;
-  border: 0;
-  border: 1px solid #bfbcbc;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  background: url("../images/gradients.png") -2px -481px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog .ui-button:hover {
-  background-position: -4px -426px;
-}
-
-.ui-dialog.notice .close.ui-button {
-  display: inline;
-  float: right;
-  padding: 0;
-  background: transparent;
-  color: #516374;
-  /*+text-shadow:0px -1px 1px #FFFFFF;*/
-  text-shadow: 0 -1px 1px #ffffff;
-  -moz-text-shadow: 0 -1px 1px #ffffff;
-  -webkit-text-shadow: 0 -1px 1px #ffffff;
-  -o-text-shadow: 0 -1px 1px #ffffff;
-}
-
-.ui-dialog .ui-button.ok {
-  border: 1px solid #0065c5;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+text-shadow:0px -1px 1px #011238;*/
-  background-position: 0 -317px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #011238;
-  -moz-text-shadow: 0 -1px 1px #011238;
-  /*+border-radius:4px;*/
-  -webkit-text-shadow: 0 -1px 1px #011238;
-  -o-text-shadow: 0 -1px 1px #011238;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog .ui-button.ok:hover {
-  border: 1px solid #004ff7;
-  background-position: -3px -368px;
-}
-
-.ui-dialog select {
-  overflow: scroll;
-}
-
-.ui-dialog.confirm .ui-button {
-  margin-top: 0;
-  margin-left: 11px;
-}
-
-.ui-dialog.confirm .ui-button.cancel {
-  margin-left: 50px;
-}
-
-.ui-dialog span.message {
-  display: block;
-  padding-bottom: 40px;
-  font-size: 14px;
-  color: #445361;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.ui-dialog span.message ul {
-  margin-top: 14px;
-  margin-left: 30px;
-  text-align: left;
-  list-style: disc;
-}
-
-.ui-dialog span.message ul li {
-  margin-top: 3px;
-}
-
-.ui-dialog span.message p {
-  margin-top: 20px;
-  text-align: left;
-}
-
-.ui-dialog-titlebar {
-  height: 33px;
-  margin: auto;
-  border-radius: 7px 7px 0 0;
-  /*+border-radius:7px 7px 0 0;*/
-  background: #ffffff;
-  color: #000000;
-  -moz-border-radius: 7px 7px 0 0;
-  -webkit-border-radius: 7px 7px 0 0;
-  -khtml-border-radius: 7px 7px 0 0;
-}
-
-.ui-dialog-titlebar.ui-widget-header {
-  border: 0;
-  font-weight: inherit;
-}
-
-.ui-dialog-titlebar .ui-icon-closethick {
-  display: none;
-}
-
-.ui-dialog-title {
-  /*+placement:shift 8px 9px;*/
-  position: relative;
-  top: 9px;
-  left: 8px;
-  padding: 2px 0 5px 30px;
-  background: url("../images/icons.png") no-repeat 0 -255px;
-  font-size: 14px;
-}
-
-.notice .ui-dialog-title {
-  background-position: 0 -288px;
-}
-
-.ui-dialog.confirm .ui-dialog-title {
-  background: url("../images/icons.png") no-repeat 0 -224px;
-}
-
-.ui-dialog.create-form .ui-dialog-title {
-  background: url("../images/icons.png") no-repeat 0 -255px;
-}
-
-.ui-dialog.warning .ui-dialog-title {
-  background: url("../images/icons.png") no-repeat 0 -286px;
-}
-
-.ui-dialog.confirm .ui-button {
-  /*+placement:shift 0px -8px;*/
-  position: relative;
-  top: -8px;
-  left: 0;
-}
-
-.ui-dialog div.form-container {
-  display: inline-block;
-  width: 94% !important;
-  height: 106px;
-  text-align: left;
-}
-
-.ui-dialog div.form-container span.message {
-  padding: 0 0 23px 5px;
-  font-size: 15px;
-  text-align: left;
-}
-
-.ui-dialog div.form-container span.message br {
-  margin-bottom: 13px;
-}
-
-.ui-dialog div.form-container div.form-item {
-  display: inline-block;
-  width: 100%;
-  margin: 0 0 12px;
-}
-
-.ui-dialog div.form-container div.name {
-  float: left;
-  clear: both;
-  width: 115px;
-  margin: 3px 0 0;
-  font-size: 15px;
-  /*+text-shadow:0px 2px 1px #FFFFFF;*/
-  color: #485867;
-  text-shadow: 0 2px 1px #ffffff;
-  -moz-text-shadow: 0 2px 1px #ffffff;
-  -webkit-text-shadow: 0 2px 1px #ffffff;
-  -o-text-shadow: 0 2px 1px #ffffff;
-}
-
-.ui-dialog div.form-container div.name label {
-  display: block;
-  width: 119px;
-  margin-top: 2px;
-  font-size: 13px;
-  text-align: right;
-}
-
-.field-required {
-  padding: 0 3px 0 0;
-  font-size: 14px;
-  font-weight: bold;
-  color: #ee7b7b;
-}
-
-.ui-dialog div.form-container div.value {
-  display: inline-block;
-  float: left;
-  width: 61%;
-  margin: 0 0 0 15px;
-}
-
-.ui-dialog div.form-container div.value input,
-textarea {
-  float: left;
-  width: 98%;
-  padding: 4px;
-  border: 1px solid #afafaf;
-  background: #f6f6f6;
-  font-size: 14px;
-}
-
-#label_delete_volumes label {
-  display: block;
-  width: 119px;
-  margin-top: 2px;
-  margin-left: -10px;
-  font-size: 13px;
-  text-align: left;
-}
-
-.ui-dialog div.form-container div.value input.hasDatepicker {
-  font-size: 13px;
-  color: #2f5d86;
-  text-indent: 3px;
-  cursor: pointer;
-}
-
-.ui-dialog div.form-container div.value input.hasDatepicker:hover {
-  /*+box-shadow:inset 0px 0px 3px;*/
-  box-shadow: inset 0 0 3px;
-  -moz-box-shadow: inset 0 0 3px;
-  -webkit-box-shadow: inset 0 0 3px;
-  -o-box-shadow: inset 0 0 3px;
-}
-
-.ui-dialog div.form-container div.value .range-edit {
-  width: 249px;
-  height: 33px;
-  margin: 2px 0 0;
-}
-
-.ui-dialog div.form-container div.value .range-edit .range-item {
-  position: relative;
-  float: left;
-  width: 124px;
-  height: 32px;
-}
-
-.ui-dialog div.form-container div.value .range-edit input {
-  width: 105px;
-  margin: 0 9px 0 0;
-}
-
-.ui-dialog div.form-container div.value .range-edit label.error {
-  position: absolute;
-  top: 25px;
-  left: 3px;
-}
-
-.ui-dialog div.form-container div.value select {
-  float: right;
-  width: 100%;
-}
-
-.ui-dialog div.form-container div.value input[type='checkbox'] {
-  width: 14px;
-}
-
-.ui-dialog div.form-container div.value label.error {
-  display: block;
-  display: none;
-  clear: both;
-  font-size: 10px;
-  color: #fa0000;
-}
-
-.ui-dialog div.form-container div.multi-array {
-  display: inline-block;
-  padding: 4px;
-  border: 1px solid #808080;
-  /*+border-radius:10px;*/
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  box-shadow: inset 0 1px 1px #929292;
-  background: #ffffff;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  /*+box-shadow:inset 0px 1px 1px #929292;*/
-  -khtml-border-radius: 10px;
-  -moz-box-shadow: inset 0 1px 1px #929292;
-  -webkit-box-shadow: inset 0 1px 1px #929292;
-  -o-box-shadow: inset 0 1px 1px #929292;
-}
-
-.ui-dialog div.form-container div.multi-array .item {
-  float: left;
-  width: 111px;
-  margin: 0 0 13px;
-}
-
-.ui-dialog div.form-container div.multi-array .item .name {
-  float: left;
-  width: 61px;
-  font-size: 11px;
-}
-
-.ui-dialog div.form-container div.multi-array .item .value {
-  float: left;
-  width: 13px;
-}
-
-.ui-dialog div.form-container div.multi-array .item .value input {
-  float: left;
-  margin: 0;
-  padding: 0;
-}
-
-.ui-dialog.create-form .ui-dialog-buttonpane {
-  margin-left: 25px;
-}
-
-.ui-dialog.create-form .ui-button.ok {
-  float: right;
-  margin-left: 0;
-}
-
-.ui-dialog.create-form .ui-button.cancel {
-  float: right;
-  margin-right: 13px;
-  border: 1px solid #aaaaaa;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  background: #b6b6b6 url("../images/gradients.png") 0 -480px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog.create-form .ui-button.cancel:hover {
-  border-color: #878787;
-  background-position: -4px -426px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input {
-  clear: both;
-  width: calc(100% + 4px);
-  min-height: 50px;
-  max-height: 211px;
-  border: 1px solid #cdcdcd;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  /*+border-radius:4px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .form-item {
-  width: 97%;
-  margin: 4px 0 0 5px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .name {
-  width: 99px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .name label {
-  width: inherit;
-  margin-left: 0;
-  font-size: 12px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .value {
-  width: 40%;
-}
-
-.dashboard.admin {
-  height: 100%;
-  padding: 10px;
-  background: #f2f0f0;
-  font-size: 13px;
-  color: #3d5873;
-}
-
-.dashboard.admin .dashboard-container {
-  /*+border-radius:3px;*/
-  border: 1px solid #c8c2c2;
-  border-radius: 3px;
-  background: #ffffff;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.dashboard.admin .dashboard-container.sub {
-  width: 49.5%;
-}
-
-.dashboard.admin .dashboard-container.sub .button.view-all,
-.dashboard.admin .dashboard-container .button.fetch-latest {
-  float: right;
-  clear: none;
-  padding: 3px 8px 3px 10px;
-  /*+text-shadow:none;*/
-  border: 1px solid #9d9d9d;
-  border-radius: 3px;
-  box-shadow: 0 1px #cacaca;
-  background: #eaeaea;
-  background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZWFlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNkNmQ2ZDYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+");
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaeaea), color-stop(100%, #d6d6d6));
-  background: -webkit-linear-gradient(top, #eaeaea 0%, #d6d6d6 100%);
-  background: linear-gradient(to bottom, #eaeaea 0%, #d6d6d6 100%);
-  font-size: 13px;
-  font-weight: 100;
-  color: #000000;
-  text-shadow: none;
-  cursor: pointer;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  /*+border-radius:3px;*/
-  -o-text-shadow: none;
-  -moz-text-shadow: 0 1px 0 #333e49;
-  -webkit-text-shadow: 0 1px 0 #333e49;
-  -o-text-shadow: 0 1px 0 #333e49;
-  /*+box-shadow:0px 1px #CACACA;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eaeaea', endColorstr='#d6d6d6', GradientType=0);
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: 0 1px #cacaca;
-  -webkit-box-shadow: 0 1px #cacaca;
-  -o-box-shadow: 0 1px #cacaca;
-}
-
-.dashboard.admin .dashboard-container.sub .button.view-all:hover,
-.dashboard.admin .dashboard-container .button.fetch-latest:hover {
-  box-shadow: inset 0 0 6px #636363;
-  /*+box-shadow:inset 0px 0px 6px #636363;*/
-  background: #e8e8e8;
-  -moz-box-shadow: inset 0 0 6px #636363;
-  -webkit-box-shadow: inset 0 0 6px #636363;
-  -o-box-shadow: inset 0 0 6px #636363;
-}
-
-.dashboard.admin .dashboard-container.sub .title {
-  float: left;
-}
-
-/**** Head*/
-.dashboard.admin .dashboard-container.head {
-  float: left;
-  box-sizing: border-box;
-  width: 100%;
-  margin: 9px 0 0;
-  padding: 0 0;
-}
-
-.dashboard.admin .dashboard-container .top {
-  float: left;
-  box-sizing: border-box;
-  width: 100%;
-  margin: 0;
-  padding: 4px 4px 8px;
-  background: #efefef 0 -4px;
-  color: #ffffff;
-}
-
-.dashboard.admin .dashboard-container .title {
-  float: left;
-  padding: 5px 0 0 4px;
-  font-size: 13px;
-  /*+text-shadow:0px 1px 1px #9A9A9A;*/
-  font-weight: 100;
-  text-shadow: 0 1px 1px #9a9a9a;
-  -moz-text-shadow: 0 1px 1px #9a9a9a;
-  -webkit-text-shadow: 0 1px 1px #9a9a9a;
-  -o-text-shadow: 0 1px 1px #9a9a9a;
-}
-
-.dashboard.admin .dashboard-container .title span {
-  color: #000000;
-  /*+text-shadow:none;*/
-  text-shadow: none;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-.dashboard.admin .dashboard-container.head .selects {
-  float: right;
-}
-
-.dashboard.admin .dashboard-container.head .selects .select {
-  float: left;
-  margin: 0 0 0 21px;
-  padding: 0;
-}
-
-.dashboard.admin .dashboard-container.head .selects .select label {
-  display: block;
-  float: left;
-  padding: 5px 0 0;
-}
-
-.dashboard.admin .dashboard-container.head .selects .select select {
-  width: 124px;
-  margin: 3px 0 0 10px;
-  padding: 0;
-}
-
-/**** Charts / stats*/
-.dashboard.admin .zone-stats {
-  position: relative;
-  width: 100%;
-  padding: 11px 0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.dashboard.admin .zone-stats ul {
-  position: relative;
-  width: 100%;
-}
-
-.dashboard.admin .zone-stats ul li {
-  position: relative;
-  z-index: 1;
-  float: left;
-  width: 50%;
-  height: 79px;
-  font-size: 14px;
-  cursor: pointer;
-}
-
-.dashboard.admin .zone-stats ul li canvas {
-  position: relative;
-  z-index: -1;
-}
-
-.dashboard.admin .zone-stats ul li:hover {
-  background: #fff2da;
-}
-
-.dashboard.admin .zone-stats ul li .label {
-  float: left;
-  width: 161px;
-  margin: 5px 0 0 22px;
-  padding: 22px 0 7px;
-  border-bottom: 1px solid #e2e2e2;
-  font-weight: 100;
-}
-
-.dashboard.admin .zone-stats ul li .info {
-  float: left;
-  width: 151px;
-  margin: 12px 0 0;
-  white-space: nowrap;
-  color: #636363;
-}
-
-.dashboard.admin .zone-stats ul li .info .name {
-  margin-top: 8px;
-  margin-bottom: 9px;
-  font-size: 12px;
-  font-weight: bold;
-  font-weight: 100;
-  /*[empty]color:;*/
-}
-
-.dashboard.admin .zone-stats ul li .pie-chart-container {
-  position: relative;
-  position: relative;
-  float: left;
-  top: 7px;
-  left: -8px;
-  /*+placement:shift -8px 7px;*/
-  width: 91px;
-  height: 69px;
-  overflow: hidden;
-}
-
-.dashboard.admin .zone-stats ul li .pie-chart-container .percent-label {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 28px 31px;*/
-  top: 31px;
-  left: 28px;
-  width: 52px;
-  font-weight: bold;
-  color: #c98200;
-  text-align: center;
-}
-
-.dashboard.admin .zone-stats ul li .pie-chart {
-  position: relative;
-  z-index: -1;
-  float: left;
-  width: 70px;
-  height: 66px;
-  margin: 3px 27px 0 16px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li {
-  display: block;
-  clear: both;
-  width: 97%;
-  height: 40px;
-  margin: 0 0 10px;
-  padding: 0 12px 0;
-  /*+border-radius:10px;*/
-  border: 1px solid #c8c2c2;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: url("../images/bg-gradients.png") 0 -29px;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .name {
-  float: left;
-  width: 178px;
-  margin: 15px 15px 0 0;
-  font-size: 11px;
-  font-weight: bold;
-}
-
-.dashboard.admin .dashboard-container .stats ul li div.value {
-  float: left;
-  width: 295px;
-  height: 100%;
-  margin: 0 9px 0 0;
-  border-right: 1px solid #c8c2c2;
-  border-left: 1px solid #c8c2c2;
-  background: url("../images/bg-gradients.png") 0 -51px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .value .content {
-  margin: 6px 9px 9px;
-  padding: 9px;
-  border-right: 1px solid #6a6a6a;
-  border-bottom: 1px solid #ffffff;
-  /*Adjusting the font size for proper display*/
-  border-left: 1px solid #6a6a6a;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url("../images/bg-gradients.png") repeat-x 0 0;
-  /*+border-radius:4px;*/
-  font-size: 10px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #6f6f6f;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+text-shadow:0px -1px 1px #6F6F6F;*/
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 1px #6f6f6f;
-  -webkit-text-shadow: 0 -1px 1px #6f6f6f;
-  -o-text-shadow: 0 -1px 1px #6f6f6f;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .chart {
-  float: left;
-  width: 290px;
-  height: 17px;
-  margin: 12px 23px 0 0;
-  padding: 0 1px;
-  border-top: 1px solid #727272;
-  /*+border-radius:7px;*/
-  border-bottom: 1px solid #ffffff;
-  border-radius: 7px;
-  border-radius: 7px 7px 7px 7px;
-  background: url("../images/bg-gradients.png") 0 -130px;
-  -moz-border-radius: 7px;
-  -webkit-border-radius: 7px;
-  -khtml-border-radius: 7px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .chart .chart-line {
-  height: 15px;
-  margin: 1px 0 0;
-  /*+border-radius:10px;*/
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: url("../images/bg-gradients.png") 0 -149px;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .percentage {
-  float: left;
-  margin: 13px 0 0;
-  font-size: 20px;
-  font-weight: bold;
-  /*+text-shadow:0px -2px 1px #FFFFFF;*/
-  text-shadow: 0 -2px 1px #ffffff;
-  -moz-text-shadow: 0 -2px 1px #ffffff;
-  -webkit-text-shadow: 0 -2px 1px #ffffff;
-  -o-text-shadow: 0 -2px 1px #ffffff;
-}
-
-/**** Alerts*/
-.dashboard.admin .dashboard-container.sub.alerts {
-  position: relative;
-  float: left;
-  box-sizing: border-box;
-  height: 190px;
-  overflow: hidden;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts.first {
-  margin-right: 1%;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts .top {
-  height: 18%;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul {
-  position: relative;
-  width: 100%;
-  height: 82%;
-  overflow-y: scroll;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li {
-  float: left;
-  margin: 9px;
-  padding: 8px;
-  /*+border-radius:3px;*/
-  border: 1px solid #d4d0d0;
-  border-radius: 3px;
-  background: #f0f0f0;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li {
-  border: 1px solid #ff7070;
-  background: #ffefef;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li span.title {
-  width: 100%;
-  margin: 3px 0 5px;
-  padding: 0;
-  font-size: 14px;
-  font-weight: bold;
-  font-weight: 100;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  color: #266e9a;
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li p {
-  float: left;
-  margin: 4px 0 0;
-  color: #252525;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li p br {
-  display: none;
-}
-
-/*** User*/
-#browser div.panel .dashboard.user .toolbar {
-  position: relative;
-  height: 60px;
-}
-
-.dashboard.user .button.view-all {
-  float: right;
-  margin: -4px 4px -4px 0;
-  /*+border-radius:4px;*/
-  padding: 2px 3px 3px;
-  border: 1px solid #4b5b6b;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url("../images/bg-gradients.png") 0 -147px;
-  color: #ffffff;
-  /*+text-shadow:0px -1px 2px #13293E;*/
-  text-indent: 0;
-  text-shadow: 0 -1px 2px #13293e;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 2px #13293e;
-  -webkit-text-shadow: 0 -1px 2px #13293e;
-  -o-text-shadow: 0 -1px 2px #13293e;
-}
-
-.dashboard.user .button.view-all:hover {
-  background-position: 0 0;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-/**** Actions*/
-.dashboard.user .dashboard-actions ul {
-  padding: 11px;
-}
-
-.dashboard.user .dashboard-actions ul li {
-  float: left;
-  width: 123px;
-  height: 40px;
-  margin: 0 9px 0 0;
-  border: 1px solid #395268;
-  /*+border-radius:4px;*/
-  border-right: 1px solid #556778;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 0 1px #dde3ec;
-  background: url("../images/bg-gradients.png") repeat-x 0 -181px;
-  /*+box-shadow:inset 0px 0px 1px #DDE3EC;*/
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 0 1px #dde3ec;
-  -webkit-box-shadow: inset 0 0 1px #dde3ec;
-  -o-box-shadow: inset 0 0 1px #dde3ec;
-}
-
-.dashboard.user .dashboard-actions ul li span {
-  position: relative;
-  top: 10px;
-  /*+text-shadow:0px 1px 2px #444444;*/
-  left: 4px;
-  padding: 8px 12px 11px 34px;
-  background: url("../images/icons.png") no-repeat -613px -309px;
-  font-size: 11px;
-  color: #ffffff;
-  text-shadow: 0 1px 2px #444444;
-  /*+placement:shift 4px 10px;*/
-  -moz-text-shadow: 0 1px 2px #444444;
-  -webkit-text-shadow: 0 1px 2px #444444;
-  -o-text-shadow: 0 1px 2px #444444;
-}
-
-.dashboard.user .dashboard-actions ul li.add-iso span {
-  background-position: -613px -352px;
-}
-
-.dashboard.user .dashboard-actions ul li.add-volume span {
-  background-position: -613px -264px;
-}
-
-.dashboard.user .dashboard-actions ul li.acquire-ip span {
-  background-position: -613px -389px;
-}
-
-/**** VM Status*/
-.dashboard.user .vm-status {
-  width: 98%;
-  margin: 19px auto auto;
-  border: 1px solid #d2cdcd;
-  /*+border-radius:9px;*/
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.dashboard.user .vm-status .title {
-  width: 100%;
-  padding: 13px 0 12px;
-  /*+border-radius:10px 10px 0 0;*/
-  border-bottom: 1px solid #c8c2c2;
-  border-radius: 10px 10px 0 0;
-  background: url("../images/bg-gradients.png") 0 -53px;
-  font-size: 13px;
-  color: #4a5967;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 10px 10px 0 0;
-  -webkit-border-radius: 10px 10px 0 0;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -khtml-border-radius: 10px 10px 0 0;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.dashboard.user .vm-status .title span {
-  padding: 0 0 0 8px;
-}
-
-.dashboard.user .vm-status .content {
-  padding: 9px 0;
-}
-
-.dashboard.user .vm-status .content ul {
-  display: inline-block;
-  margin: auto;
-}
-
-.dashboard.user .vm-status .content ul li {
-  float: left;
-  width: 243px;
-  height: 237px;
-  margin: 0 0 0 11px;
-  border: 1px solid #e6ebee;
-  /*+border-radius:10px;*/
-  border-top: 2px solid #d3d9de;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: #ebedf1;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.dashboard.user .vm-status .content ul li .name {
-  margin: 14px 0 0;
-  padding: 0 0 0 35px;
-  background: url("../images/icons.png") -617px -488px;
-  font-size: 28px;
-  /*+text-shadow:0px 2px 2px #FFFFFF;*/
-  color: #5c7082;
-  text-shadow: 0 2px 2px #ffffff;
-  -moz-text-shadow: 0 2px 2px #ffffff;
-  -webkit-text-shadow: 0 2px 2px #ffffff;
-  -o-text-shadow: 0 2px 2px #ffffff;
-}
-
-.dashboard.user .vm-status .content ul li .value {
-  width: 229px;
-  margin: 12px auto auto;
-  padding: 59px 0;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  background: #dfe9cc;
-  font-size: 58px;
-  color: #5d7c98;
-  text-align: center;
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-.dashboard.user .vm-status .content ul li.stopped .name {
-  background-position: -617px -524px;
-}
-
-.dashboard.user .vm-status .content ul li.stopped .value {
-  background: #edcbce;
-}
-
-.dashboard.user .vm-status .content ul li.total .name {
-  background-position: -617px -559px;
-}
-
-.dashboard.user .vm-status .content ul li.total .value {
-  background: #dfe4e9;
-}
-
-/***** Tables / status list*/
-.dashboard.user .status-lists {
-  margin: 15px 0 0 8px;
-}
-
-.dashboard.user .status-lists ul li.events {
-  width: 512px;
-}
-
-.dashboard.user .status-lists ul li.events .content li {
-  width: 97%;
-  margin: 6px 11px 0 0;
-  padding: 13px 0 12px 16px;
-  border: 1px solid #dbdbdb;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  box-shadow: 0 2px 4px #c0c0c0;
-  background: #efefef url("../images/bg-gradients.png") repeat-x 0 -29px;
-  font-size: 11px;
-  color: #495a76;
-  text-shadow: 0 1px #ffffff;
-  /*+box-shadow:0px 2px 4px #C0C0C0;*/
-  cursor: default;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-  -moz-box-shadow: 0 2px 4px #c0c0c0;
-  /*+border-radius:4px;*/
-  -webkit-box-shadow: 0 2px 4px #c0c0c0;
-  -o-box-shadow: 0 2px 4px #c0c0c0;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.dashboard.user .status-lists ul li.events .content li .title {
-  margin-bottom: 9px;
-  font-weight: bold;
-  color: #4a5a6a;
-}
-
-.dashboard.user .status-lists ul li {
-  float: left;
-  margin: 0 10px 0 0;
-}
-
-.dashboard.user .status-lists table {
-  width: 252px;
-  margin: 0;
-  cursor: default;
-}
-
-.dashboard.user .status-lists table th {
-  padding: 8px 0 6px;
-}
-
-.dashboard.user .status-lists .events table {
-  width: 515px;
-}
-
-.dashboard.user .status-lists table tbody {
-  display: block;
-  height: 256px;
-  padding: 0 0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.dashboard.user .status-lists table td.value {
-  cursor: default;
-}
-
-.dashboard.user .status-lists table td.desc {
-  width: 151px;
-  cursor: default;
-  overflow: hidden;
-}
-
-.dashboard.user .status-lists .my-account table tbody tr td {
-  padding-top: 19px;
-  padding-bottom: 19px;
-}
-
-.dashboard.user .status-lists table thead {
-  border-top: 1px solid #c4c5c5;
-  background: url("../images/bg-gradients.png") 0 -351px;
-}
-
-.dashboard.user .status-lists table tr.odd {
-  background: #dfe1e3;
-}
-
-.dashboard.user .status-lists table td {
-  vertical-align: middle;
-}
-
-/****** IP addresses*/
-.dashboard.user .status-lists li.ip-addresses td {
-  width: 250px;
-  padding: 28px 0 51px;
-}
-
-.dashboard.user .status-lists li.ip-addresses .desc {
-  color: #3f5468;
-}
-
-.dashboard.user .status-lists li.ip-addresses .value {
-  margin: 7px 0 0;
-  font-size: 29px;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-.system-chart {
-  width: 100%;
-  height: 100%;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.system-chart ul.resources li {
-  position: absolute;
-  width: 100px;
-  height: 60px;
-  border: 1px solid #99a0a5;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  box-shadow: 0 0 2px #a6a6a6;
-  background: transparent url("../images/bg-gradients.png") repeat-x 0 -1340px;
-  text-align: left;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 0px 2px #A6A6A6;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 0 2px #a6a6a6;
-  -webkit-box-shadow: 0 0 2px #a6a6a6;
-  -o-box-shadow: 0 0 2px #a6a6a6;
-}
-
-.system-chart ul.resources li .button.view-all {
-  position: relative;
-  position: absolute;
-  top: 34px;
-  /*+placement:shift 32px 34px;*/
-  left: 32px;
-  width: 65px;
-  height: 25px;
-  background: url("../images/buttons.png") no-repeat -458px -504px;
-}
-
-.system-chart ul.resources li .button.view-all:hover {
-  background-position: -537px -504px;
-}
-
-.system-chart ul.resources li .button.view-all .view-all-label {
-  position: relative;
-  top: 0;
-  /*+text-shadow:0px -1px 1px #000000;*/
-  left: 9px;
-  font-size: 11px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #000000;
-  /*+placement:shift 9px 0px;*/
-  -moz-text-shadow: 0 -1px 1px #000000;
-  -webkit-text-shadow: 0 -1px 1px #000000;
-  -o-text-shadow: 0 -1px 1px #000000;
-}
-
-.system-chart ul.resources li .label {
-  position: relative;
-  position: absolute;
-  top: 3px;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  left: 3px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #5c7485;
-  /*+placement:shift 3px 3px;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-/** Resources*/
-.system-chart.dashboard.admin {
-  width: 97%;
-  height: 96%;
-  background: transparent;
-}
-
-.system-chart.dashboard.admin .dashboard-container {
-  width: 930px;
-  border: 0;
-}
-
-.system-chart.dashboard.admin .dashboard-container .top {
-  background: transparent;
-}
-
-.system-chart.dashboard.admin .dashboard-container .top .title {
-  color: #55687a;
-}
-
-.system-chart.dashboard.admin .dashboard-container .top .title span {
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  -o-text-shadow: 0 0 #ffffff;
-}
-
-.system-chart.dashboard.admin .dashboard-container .stats .chart {
-  width: 300px;
-}
-
-/** Compute*/
-.system-chart.compute {
-  background: url("../images/bg-system-chart-compute.png") no-repeat center;
-}
-
-/*** Compute resources*/
-.system-chart.compute ul.resources {
-  position: relative;
-  width: 98%;
-  height: 97%;
-  margin: 0;
-}
-
-.system-chart.compute ul.resources li.zone {
-  left: 196px;
-}
-
-.system-chart.compute ul.resources li.zone .label {
-  top: 20px;
-  left: 0;
-  width: 100%;
-  font-size: 14px;
-  text-align: center;
-}
-
-.system-chart.compute ul.resources li.pods {
-  top: 112px;
-  left: 299px;
-}
-
-.system-chart.compute ul.resources li.clusters {
-  top: 189px;
-  left: 396px;
-}
-
-.system-chart.compute ul.resources li.hosts {
-  top: 265px;
-  left: 507px;
-}
-
-.system-chart.compute ul.resources li.primaryStorage {
-  top: 375px;
-  left: 507px;
-}
-
-.system-chart.compute ul.resources li.secondaryStorage {
-  top: 497px;
-  left: 299px;
-}
-
-.system-chart.compute ul.resources li.ucs {
-  top: 406px;
-  left: 299px;
-}
-
-/** Network*/
-.system-chart.network .network-switch-icon {
-  position: relative;
-  position: absolute;
-  z-index: 3;
-  top: 76px;
-  left: 187px;
-  /*+box-shadow:0px 0px 2px #A4A4A4;*/
-  padding: 8px 7px;
-  border: 1px solid #cdcdcd;
-  border-top: 2px solid #ffffff;
-  border-radius: 2px;
-  /*+border-radius:2px;*/
-  border-radius: 2px 2px 2px 2px;
-  box-shadow: 0 0 2px #a4a4a4;
-  background: url("../images/bg-gradients.png") repeat-x 0 -38px;
-  font-weight: bold;
-  color: #506980;
-  -moz-box-shadow: 0 0 2px #a4a4a4;
-  /*+placement:shift 187px 76px;*/
-  -webkit-box-shadow: 0 0 2px #a4a4a4;
-  -o-box-shadow: 0 0 2px #a4a4a4;
-  -moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  -khtml-border-radius: 2px;
-}
-
-.system-chart.network .base-circle-icon {
-  position: relative;
-  position: absolute;
-  z-index: 5;
-  /*+placement:shift 227px 557px;*/
-  top: 557px;
-  left: 227px;
-  width: 35px;
-  height: 34px;
-  background: url("../images/bg-system-network-traffic.png") 0 -853px;
-}
-
-.system-chart.network ul.resources {
-  position: absolute;
-  z-index: 2;
-  width: 100%;
-  height: 98%;
-}
-
-.system-chart.network ul.resources li {
-  border: 0;
-  /*+box-shadow:0px 0px;*/
-  border-radius: 0;
-  border-radius: 0 0 0 0;
-  box-shadow: 0 0;
-  background: transparent;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 none;
-  -webkit-box-shadow: 0 0 none;
-  -o-box-shadow: 0 0 none;
-  -moz-box-shadow: none;
-  /*+border-radius:0px;*/
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-  -khtml-border-radius: 0;
-}
-
-.system-chart.network ul.resources li .view-all {
-  /*+placement:shift 19px 21px;*/
-  position: relative;
-  top: 21px;
-  left: 19px;
-}
-
-.system-chart.network ul.resources li.public {
-  /*+placement:shift 356px 23px;*/
-  position: relative;
-  position: absolute;
-  top: 23px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.guest {
-  /*+placement:shift 356px 155px;*/
-  position: relative;
-  position: absolute;
-  top: 155px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.management {
-  /*+placement:shift 356px 242px;*/
-  position: relative;
-  position: absolute;
-  top: 242px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.storage {
-  /*+placement:shift 356px 333px;*/
-  position: relative;
-  position: absolute;
-  top: 333px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.providers {
-  /*+placement:shift 248px 427px;*/
-  position: relative;
-  position: absolute;
-  top: 427px;
-  left: 248px;
-  width: 258px;
-  height: 77px;
-  background: url("../images/bg-system-network-traffic.png") no-repeat -50px -848px;
-}
-
-.system-chart.network ul.resources li.providers span {
-  /*+placement:shift 99px 5px;*/
-  position: relative;
-  position: absolute;
-  top: 5px;
-  left: 99px;
-  font-size: 12px;
-}
-
-.system-chart.network ul.resources li.providers .view-all {
-  /*+placement:shift 186px 48px;*/
-  position: relative;
-  position: absolute;
-  top: 48px;
-  left: 186px;
-}
-
-.system-chart.network .system-network-chart {
-  position: relative;
-  z-index: 1;
-  width: 100%;
-  height: 100%;
-}
-
-.system-chart.network .system-network-chart .network-chart-item {
-  width: 213px;
-  height: 539px;
-  background: url("../images/bg-system-network-traffic.png") no-repeat;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.public {
-  position: relative;
-  /*+placement:shift 245px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 245px;
-  background-position: -793px -1px;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.management {
-  position: relative;
-  /*+placement:shift 239px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 239px;
-  background-position: -273px 12px;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.storage {
-  position: relative;
-  /*+placement:shift 231px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 231px;
-  background-position: -523px 12px;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.guest {
-  position: relative;
-  /*+placement:shift 251px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 251px;
-  background-position: -43px 12px;
-}
-
-.panel .add-first-network-resource {
-  margin: 37px;
-  padding: 19px 19px 79px;
-  border: 1px solid #ececec;
-  border-radius: 12px;
-  /*+border-radius:12px;*/
-  border-radius: 12px 12px 12px 12px;
-  background: #ffffff;
-  font-size: 14px;
-  -moz-border-radius: 12px;
-  -webkit-border-radius: 12px;
-  -khtml-border-radius: 12px;
-}
-
-.panel .add-first-network-resource form {
-  display: inline-block;
-  height: 442px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.panel .add-first-network-resource .title {
-  margin: 0 0 17px;
-  font-size: 26px;
-  /*+text-shadow:0px 1px 2px #BCBCBC;*/
-  color: #3984d1;
-  text-shadow: 0 1px 2px #bcbcbc;
-  -moz-text-shadow: 0 1px 2px #bcbcbc;
-  -webkit-text-shadow: 0 1px 2px #bcbcbc;
-  -o-text-shadow: 0 1px 2px #bcbcbc;
-}
-
-.panel .add-first-network-resource .message {
-  display: block;
-  margin: 0 0 30px;
-  color: #545151;
-}
-
-.panel .add-first-network-resource .form-item {
-  display: inline-block;
-  position: relative;
-  width: 409px;
-  margin: 0 0 2px;
-  padding: 5px;
-}
-
-.panel .add-first-network-resource .form-item label {
-  float: left;
-  width: 109px;
-  text-align: right;
-}
-
-.panel .add-first-network-resource .form-item label.error {
-  display: none;
-  position: absolute;
-  top: 30px;
-  left: 137px;
-  font-size: 10px;
-}
-
-.panel .add-first-network-resource .form-item input {
-  float: right;
-  /*+border-radius:6px;*/
-  border: 1px solid #b7b7b7;
-  border-radius: 6px;
-  border-radius: 6px 6px 6px 6px;
-  font-size: 16px;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-.panel .add-first-network-resource .form-item input[type='checkbox'] {
-  float: right;
-  margin: 0 266px 0 0;
-}
-
-.panel .add-first-network-resource .form-item input[type='text'],
-.panel .add-first-network-resource .form-item input[type='password'],
-.panel .add-first-network-resource .form-item input[type='text'],
-.panel .add-first-network-resource .form-item select {
-  width: 276px;
-}
-
-.panel .add-first-network-resource .form-item select {
-  width: 280px;
-  margin: 0 0 0 20px;
-}
-
-.panel .add-first-network-resource .button {
-  clear: both;
-  margin: 29px 0 0;
-  padding: 11px 23px 11px 21px;
-  border: 1px solid #858585;
-  /*+border-radius:10px;*/
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: url("../images/bg-gradients.png") repeat-x 0 -221px;
-  color: #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-  /*[empty]position:;*/
-}
-
-.panel .add-first-network-resource .multi-array {
-  display: inline-block;
-  float: left;
-  clear: both;
-  width: 383px;
-  margin: 3px 0 10px;
-  padding: 12px;
-  border: 1px solid #dcdcdc;
-  border-radius: 7px;
-  /*+border-radius:7px;*/
-  border-radius: 7px 7px 7px 7px;
-  background: #ffffff;
-  -moz-border-radius: 7px;
-  -webkit-border-radius: 7px;
-  -khtml-border-radius: 7px;
-}
-
-.panel .add-first-network-resource .multi-array .item {
-  float: left;
-  max-width: 155px;
-  margin: 6px 0 0 24px;
-}
-
-.panel .add-first-network-resource .multi-array .item .name {
-  float: left;
-}
-
-.panel .add-first-network-resource .multi-array .item .value {
-  float: right;
-  margin: 0 0 0 13px;
-}
-
-.panel .add-first-network-resource .multi-array .item .value input {
-  margin: 0;
-}
-
-.multi-wizard {
-  display: inline-block;
-  width: 500px;
-  height: 550px;
-}
-
-/*** Progress bar*/
-.multi-wizard .progress {
-  font-size: 11px;
-  color: #ffffff;
-}
-
-.multi-wizard .progress ul {
-  float: left;
-  clear: both;
-  height: 40px;
-}
-
-/*[clearfix]*/
-.multi-wizard .progress ul li {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  position: relative;
-  float: left;
-  -webkit-box-align: center;
-  -ms-flex-align: center;
-  align-items: center;
-  width: 128px;
-  height: 40px;
-  -webkit-box-pack: center;
-  -ms-flex-pack: center;
-  justify-content: center;
-}
-
-.multi-wizard.instance-wizard .progress ul li {
-  width: 102px;
-  margin-left: 8px;
-}
-
-.multi-wizard .progress ul li.active {
-  border-radius: 5px;
-  background: url("../images/bg-gradients.png") 0 -221px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-wizard .progress ul li span {
-  position: relative;
-  width: 62px;
-  color: #000000;
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard .progress ul li span.arrow {
-  display: none;
-  position: absolute;
-  /*+placement:displace 74px -3px;*/
-  z-index: 1000;
-  width: 17px;
-  height: 15px;
-  margin-top: -3px;
-  margin-left: 74px;
-  background: url("../images/icons.png") no-repeat 0 -422px;
-}
-
-.multi-wizard.instance-wizard .progress ul li span.arrow {
-  left: 19px;
-}
-
-.multi-wizard .progress ul li.active span.arrow {
-  background-position: -1px -396px;
-}
-
-.multi-wizard .progress ul li span.number {
-  width: auto;
-  background: transparent;
-  font-size: 27px;
-  font-weight: bold;
-  color: #bbbbbb;
-}
-
-.multi-wizard .progress ul li.active span {
-  /*+text-shadow:0px -1px 1px #004AFF;*/
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #004aff;
-  -moz-text-shadow: 0 -1px 1px #004aff;
-  -webkit-text-shadow: 0 -1px 1px #004aff;
-  -o-text-shadow: 0 -1px 1px #004aff;
-}
-
-/*** Content*/
-.multi-wizard .main-desc {
-  position: relative;
-  top: 25px;
-  left: 3px;
-  /*+placement:shift 3px 25px;*/
-  width: 437px;
-  font-size: 11px;
-  line-height: 17px;
-  text-align: left;
-}
-
-.multi-wizard .review .main-desc,
-.multi-wizard .select-template .main-desc {
-  left: 0;
-  margin-left: 10px;
-}
-
-.multi-wizard .content {
-  display: inline-block;
-  float: left;
-  width: 440px;
-  min-height: 366px;
-  margin: 24px 0 0;
-  /*+border-radius:4px;*/
-  padding-bottom: 8px;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .select-security-group .content {
-  height: 366px;
-}
-
-.multi-wizard .content .section {
-  width: 416px;
-  margin: 16px auto auto;
-  border: 1px solid #e0dfdf;
-  background: #e9e9e9;
-  font-size: 12px;
-  color: #505a62;
-  text-align: left;
-  overflow: hidden;
-}
-
-.multi-wizard.instance-wizard .service-offering .content {
-  width: 463px;
-  max-height: 365px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.multi-wizard .content .section .select-area {
-  width: 334px;
-  height: 45px;
-  margin: 9px auto auto;
-  background: #d6d6d6;
-}
-
-.multi-wizard .content .section .larger-area {
-  height: 134px !important;
-}
-
-.multi-wizard .content .section .lower-area {
-  height: 35px !important ;
-  margin: 7px auto auto !important ;
-}
-
-.multi-wizard .content .section .select-area .desc {
-  float: right;
-  width: 155px;
-  padding: 9px 0 0;
-  font-size: 12px;
-  color: #989898;
-  text-align: left;
-}
-
-.multi-wizard .content .section .select-area input {
-  float: left;
-  margin: 0;
-  padding: 9px;
-}
-
-.multi-wizard .content .section .select-area select {
-  float: left;
-  width: 158px;
-  /*+border-radius:4px;*/
-  margin: 11px 0 0 14px;
-  padding: 0;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .content .section .select-area input[type='radio'],
-.multi-wizard.instance-wizard .content .section.select-template input[type='radio'] {
-  margin: 14px 16px 0;
-}
-
-.multi-wizard .content .section .select-area label {
-  float: left;
-  margin: 12px 12px 12px 2px;
-  font-size: 18px;
-  color: #62798e;
-  /*+text-shadow:0px 2px 2px #EFEFEF;*/
-  text-align: left;
-  text-shadow: 0 2px 2px #efefef;
-  -moz-text-shadow: 0 2px 2px #efefef;
-  -webkit-text-shadow: 0 2px 2px #efefef;
-  -o-text-shadow: 0 2px 2px #efefef;
-}
-
-.multi-wizard .content .section.select-deployment .select-area select {
-  margin: 9px 0 0 14px;
-}
-
-.multi-wizard .content .section.select-deployment .select-area label.desc {
-  padding: 0;
-}
-
-.multi-wizard .content .section .select-area label.error {
-  margin: 2px 0 0 14px;
-  font-size: 10px;
-  color: #ff0000;
-}
-
-.multi-wizard .content .section p {
-  padding: 0 0 0 40px;
-  font-size: 11px;
-  color: #808080;
-  text-align: left;
-}
-
-.multi-wizard .content .section h3 {
-  margin: 0;
-  padding: 14px 14px 3px 39px;
-  font-weight: bold;
-  color: #62798e;
-  /*+text-shadow:0px 1px 1px #EFEFEF;*/
-  text-align: left;
-  text-shadow: 0 1px 1px #efefef;
-  -moz-text-shadow: 0 1px 1px #efefef;
-  -webkit-text-shadow: 0 1px 1px #efefef;
-  -o-text-shadow: 0 1px 1px #efefef;
-}
-
-.multi-wizard .content .section.select-zone {
-  height: 117px;
-}
-
-.multi-wizard .content .section.select-template {
-  height: 206px;
-}
-
-.multi-wizard .content .section.select-template {
-  height: 206px;
-}
-
-.multi-wizard .content .section.smaller-height {
-  height: 126px !important;
-}
-
-.multi-wizard .content.tab-view {
-  margin: 31px 0 0;
-  padding: 0 8px;
-  background: transparent;
-}
-
-.multi-wizard .content.tab-view div.ui-tabs-panel {
-  clear: both;
-  width: 98%;
-  height: 72% !important;
-  height: 591px;
-  border: 1px solid #e2dddd;
-  border-radius: 0 3px 10px 10px;
-  background: #ffffff;
-  /*+border-radius:0 3px 10px 10px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 0 3px 10px 10px;
-  -webkit-border-radius: 0 3px 10px 10px;
-  -khtml-border-radius: 0 3px 10px 10px;
-}
-
-.multi-wizard .content.tab-view div.ui-tabs-panel.ui-tabs-hide {
-  display: none;
-}
-
-.multi-wizard.instance-wizard .select-iso .content .select .hypervisor {
-  display: block;
-  position: relative;
-  float: left;
-  clear: both;
-  /*+placement:shift 0px -6px;*/
-  top: -6px;
-  left: 0;
-  margin: 12px 0 0 58px;
-}
-
-.multi-wizard.instance-wizard .select-iso .content .select .hypervisor select {
-  width: 160px;
-}
-
-.multi-wizard.instance-wizard .select-iso .content .select .hypervisor label {
-  position: relative;
-  top: 0;
-  left: 0;
-  margin-right: 9px;
-  /*+placement:shift;*/
-  margin-left: 2px;
-  font-size: 11px;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-iso .wizard-step-conditional.select-iso .content .select.selected {
-  height: 90px;
-}
-
-/*** UI widgets*/
-.multi-wizard .ui-tabs ul.ui-tabs-nav {
-  display: block;
-  display: inline-block;
-  position: relative;
-  z-index: 10;
-  top: 5px;
-  /*+placement:shift -6px 5px;*/
-  left: -6px;
-  height: 41px;
-  margin-top: 7px;
-  border: 0;
-  background: transparent;
-  overflow: hidden;
-}
-
-.multi-wizard .select-iso .ui-tabs ul {
-  float: left;
-  top: 1px;
-  left: 0;
-}
-
-.multi-wizard .ui-tabs li.ui-state-active {
-  background: #ffffff;
-}
-
-.multi-wizard .ui-tabs li.ui-state-default a {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.multi-wizard .ui-slider {
-  float: left;
-  width: 136px;
-  margin: 8px -2px 3px;
-  padding: 0;
-  background: url("../images/bg-gradients.png") 0 -307px !important;
-}
-
-.multi-wizard.instance-wizard .ui-slider {
-  margin: 8px 0 0 2px;
-  padding: 7px 0 0 8px;
-}
-
-.multi-wizard .ui-slider .ui-slider-handle {
-  display: block;
-  position: relative;
-  top: -0.5rem;
-  width: 18px;
-  height: 18px;
-  margin-left: -0.9rem;
-  border: 0;
-  outline: none;
-  background: url("../images/buttons.png") -622px -274px;
-}
-
-/*** Select container*/
-.multi-wizard .select-container {
-  height: 352px;
-  margin: 10px 10px 0;
-  border: 1px solid #d9dfe1;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .select-container p {
-  padding: 11px;
-  background: #dfdfdf;
-  color: #424242;
-}
-
-.multi-wizard .select-container .select {
-  display: inline-block;
-  float: left;
-  width: 100%;
-  min-height: 35px;
-  margin: -1px 0 0;
-  padding: 0 0 14px;
-  border: 0;
-  background: #ffffff;
-  font-size: 13px;
-  text-align: left;
-}
-
-.multi-wizard .select-container .select.odd {
-  background: #ebeff4;
-}
-
-.multi-wizard .select-container .select input {
-  float: left;
-  margin: 21px 24px 0;
-}
-
-.multi-wizard .select-container .select .select-desc {
-  display: inline-block;
-  float: left;
-  clear: none;
-  max-width: 335px;
-  min-height: 28px;
-  margin: 21px 0 0;
-  overflow: hidden;
-}
-
-.multi-wizard .select-container .select .ovf-property {
-  max-width: 352px;
-  padding-left: 21px;
-}
-
-.multi-wizard .select-container .select .select-desc .name {
-  margin: 0 0 5px;
-  font-weight: bold;
-}
-
-.multi-wizard .select-container .select .select-desc .desc {
-  display: inline-block;
-  font-size: 11px;
-  color: #808080;
-  /*[empty]height:;*/
-}
-
-/*** Buttons*/
-.multi-wizard .buttons {
-  position: absolute;
-  bottom: 10px;
-  left: 0;
-  width: 100%;
-}
-
-.multi-wizard .buttons .button {
-  width: 88px;
-  height: 16px;
-  padding: 11px 0 8px;
-  /*+box-shadow:0px 1px 1px #FFFFFF;*/
-  border: 1px solid #78818f;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: 0 1px 1px #ffffff;
-  font-size: 12px;
-  font-weight: bold;
-  cursor: pointer;
-  -moz-box-shadow: 0 1px 1px #ffffff;
-  /*+border-radius:4px;*/
-  -webkit-box-shadow: 0 1px 1px #ffffff;
-  -o-box-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .buttons .button.next {
-  /*+placement:float-right 77px 0px;*/
-  position: relative;
-  float: right;
-  top: 0;
-  left: 77px;
-  border: 1px solid #0069cf;
-  /*+text-shadow:0px -1px 1px #465259;*/
-  border-top: 1px solid #0070fc;
-  background: #0049ff url("../images/gradients.png") 0 -317px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #465259;
-  -moz-text-shadow: 0 -1px 1px #465259;
-  -webkit-text-shadow: 0 -1px 1px #465259;
-  -o-text-shadow: 0 -1px 1px #465259;
-}
-
-.multi-wizard .buttons .button.next:hover {
-  border: 1px solid #0035b8;
-  border-bottom: 1px solid #0062fa;
-  background-position: -3px -368px;
-}
-
-.multi-wizard .buttons .button.next.final {
-  width: 115px;
-  margin: 3px 0 0;
-  padding: 4px 0 9px;
-}
-
-.multi-wizard .buttons .button.next.final span {
-  position: relative;
-  /*+placement:shift 0px 5px;*/
-  top: 5px;
-  left: 0;
-  padding: 5px 0 5px 30px;
-  background: url("../images/icons.png") 0 -349px;
-}
-
-.multi-wizard .buttons .button.cancel {
-  position: relative;
-  /*+placement:float-right -127px 0px;*/
-  float: right;
-  top: 0;
-  left: -127px;
-  padding: 14px 0 0 0;
-  border: 0;
-  /*+border-radius:0;*/
-  border-radius: 0;
-  border-radius: 0 0 0 0;
-  box-shadow: 0 0;
-  background: transparent;
-  color: #808080;
-  text-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:0px 0px;*/
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-  -khtml-border-radius: 0;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 inherit;
-  -webkit-box-shadow: 0 0 inherit;
-  -o-box-shadow: 0 0 inherit;
-  -moz-box-shadow: inherit;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -webkit-box-shadow: inherit;
-  -o-box-shadow: inherit;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard .buttons .button.cancel:hover {
-  color: #5e5e5e;
-}
-
-.multi-wizard .buttons .button.previous {
-  margin-left: 27px;
-  background: #d6d6d6;
-  color: #62798e;
-}
-
-.multi-wizard .buttons .button.previous:hover {
-  background: #c6c6c6;
-}
-
-/** Instance wizard
-** Select ISO*/
-.multi-wizard.instance-wizard .select-iso .select-container {
-  height: 260px;
-  margin: 0;
-  /*+border-radius:0 0 5px 5px;*/
-  border-radius: 0 0 5px 5px;
-  -moz-border-radius: 0 0 5px 5px;
-  -webkit-border-radius: 0 0 5px 5px;
-  -khtml-border-radius: 0 0 5px 5px;
-}
-
-/*** Data disk offering*/
-.multi-wizard.instance-wizard .content .section {
-  margin: 12px 0 15px 8px;
-  padding: 9px 0 16px;
-}
-
-.multi-wizard.instance-wizard .content .section.no-thanks {
-  box-sizing: border-box;
-  width: 426px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .select-container,
-.multi-wizard.instance-wizard .sshkeyPairs .select-container {
-  height: 300px;
-  margin: -7px 6px 0 8px;
-  /*+border-radius:6px;*/
-  border-radius: 6px;
-  border-radius: 6px 6px 6px 6px;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group {
-  float: left;
-  width: 100%;
-  margin-top: 12px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-header {
-  height: 17px;
-  /*+border-radius:4px;*/
-  padding: 6px;
-  border-bottom: 1px solid #d4d4d4;
-  border-radius: 4px;
-  background: #c2c2c2 0 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.instance-wizard .disk-select-group.selected .disk-select-header {
-  border-radius: 4px 4px 0 0;
-  /*+border-radius:4px 4px 0 0;*/
-  background: #505050;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-header input {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-header .title {
-  float: left;
-  padding: 2px;
-  font-size: 14px;
-}
-
-.multi-wizard.instance-wizard .disk-select-group.selected .disk-select-header .title {
-  color: #ffffff;
-  /*+text-shadow:0px -1px #000000;*/
-  text-shadow: 0 -1px #000000;
-  -moz-text-shadow: 0 -1px #000000;
-  -webkit-text-shadow: 0 -1px #000000;
-  -o-text-shadow: 0 -1px #000000;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .multi-disk-select-container {
-  max-height: 257px;
-  padding: 13px;
-  border: 1px solid #dddbdb;
-  background: #e4e4e4;
-  overflow: auto;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select-container {
-  display: none;
-  float: left;
-  max-height: 114px;
-  margin: 0;
-  /*+border-radius:0;*/
-  border: 0;
-  border-radius: 0;
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-  -khtml-border-radius: 0;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group.selected .select-container {
-  display: block;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select {
-  height: 0;
-  padding: 0 0 17px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group.custom-size .section.custom-size {
-  display: block !important;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select input {
-  margin: 13px 12px 12px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select-desc {
-  margin: 13px 0 0;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering.required .select-container {
-  position: relative;
-  height: 344px;
-  margin-top: 9px !important;
-}
-
-.multi-wizard.instance-wizard .custom-slider-container .select-container {
-  height: 279px;
-}
-
-.multi-wizard.instance-wizard .custom-slider-container .select-container {
-  height: 213px;
-  margin: -7px 6px 0 8px;
-  /*+border-radius:6px;*/
-  border-radius: 6px;
-  border-radius: 6px 6px 6px 6px;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-.multi-wizard.instance-wizard .content .section input {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .content .section input[type='radio'] {
-  margin: 8px 2px 0 17px;
-}
-
-.multi-wizard.instance-wizard .content .section label {
-  display: block;
-  float: left;
-  margin: 10px 7px 7px;
-}
-
-.multi-wizard.instance-wizard .content .section .select-area label {
-  margin: 12px 0 0;
-}
-
-.multi-wizard.instance-wizard .content .section label.size {
-  font-weight: bold;
-  color: #647a8e;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard.instance-wizard .section.custom-size {
-  position: relative;
-  box-sizing: border-box;
-  width: 100%;
-  margin: 12px 0;
-  padding: 7px;
-  border-radius: 4px;
-  background: #f4f4f4;
-}
-
-.multi-wizard.instance-wizard .section.custom-size.custom-disk-size {
-  width: 426px;
-  margin-left: 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops {
-  position: relative;
-  padding: 7px;
-  border-radius: 4px;
-  background: #f4f4f4;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops-do {
-  position: relative;
-  box-sizing: border-box;
-  width: 426px;
-  padding: 7px;
-  border-radius: 4px;
-  background: #f4f4f4;
-}
-
-.multi-wizard.instance-wizard .section.custom-size input[type='radio'] {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .section.custom-size input[type='text'] {
-  float: left;
-  width: 28px;
-  margin: 6px -1px 0 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops input[type='text'] {
-  float: left;
-  width: 28px;
-  margin: 6px -1px 0 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops-do input[type='text'] {
-  float: left;
-  width: 28px;
-  margin: 6px -1px 0 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-size label.error {
-  position: absolute;
-  top: 29px;
-  left: 242px;
-  font-size: 10px;
-}
-
-.instance-wizard .step.data-disk-offering.custom-slider-container .select-container {
-  height: 272px;
-}
-
-.instance-wizard .step.service-offering.custom-slider-container .select-container {
-  height: 272px;
-}
-
-.instance-wizard .step.data-disk-offering.custom-iops-do .select-container {
-  height: 240px;
-}
-
-.instance-wizard .step.data-disk-offering.custom-slider-container.custom-iops-do .select-container {
-  height: 176px;
-}
-
-.instance-wizard .step.service-offering.required.custom-slider-container .select-container {
-  height: 315px;
-}
-
-.instance-wizard .step.data-disk-offering.required.custom-slider-container .select-container {
-  height: 315px;
-}
-
-.instance-wizard .step.data-disk-offering.required.custom-iops-do .select-container {
-  height: 295px;
-}
-
-.instance-wizard .step.data-disk-offering.required.custom-slider-container.custom-iops-do .select-container {
-  height: 223px;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do {
-  display: none;
-}
-
-.instance-wizard .step.data-disk-offering.custom-iops-do .custom-iops-do {
-  display: block;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do .field {
-  float: left;
-  width: 30%;
-  margin-bottom: 5px;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do .field label {
-  text-indent: 20px;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do .field input {
-  width: 88%;
-  margin-left: 26px;
-}
-
-/*** Compute offering*/
-.instance-wizard .step.service-offering.custom-size .select-container {
-  height: 235px;
-}
-
-.instance-wizard .step.service-offering.custom-iops .select-container {
-  height: 235px;
-}
-
-.instance-wizard .step.service-offering .custom-size {
-  display: none;
-}
-
-.instance-wizard .step.service-offering .custom-iops {
-  display: none;
-}
-
-.instance-wizard .step.service-offering.custom-size .custom-size {
-  display: block;
-}
-
-.instance-wizard .step.service-offering.custom-iops .custom-iops {
-  display: block;
-}
-
-.instance-wizard .step.service-offering .custom-size .field {
-  float: left;
-  width: 30%;
-  margin-bottom: 13px;
-}
-
-.instance-wizard .step.service-offering .custom-iops .field {
-  float: left;
-  width: 30%;
-  margin-bottom: 13px;
-}
-
-.instance-wizard .step.service-offering .custom-size .field label {
-  text-indent: 20px;
-}
-
-.instance-wizard .step.service-offering .custom-iops .field label {
-  text-indent: 20px;
-}
-
-.instance-wizard .step.service-offering .custom-size .field input {
-  width: 88%;
-  margin-left: 26px;
-}
-
-.instance-wizard .step.service-offering .custom-size .field label.error {
-  position: relative;
-  top: 0;
-  left: 0;
-}
-
-.instance-wizard .step.service-offering .custom-iops .field input {
-  width: 88%;
-  margin-left: 26px;
-}
-
-/*** Network*/
-.multi-wizard.instance-wizard .no-network {
-  position: absolute;
-  z-index: 1;
-  top: 98px;
-  left: 11px;
-  width: 773px;
-  height: 52px;
-  /*+border-radius:5px;*/
-  padding: 162px 0 194px;
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  background: #ffffff;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-wizard.instance-wizard .no-network p {
-  font-size: 22px;
-  line-height: 25px;
-}
-
-.multi-wizard.instance-wizard .select-network .select table {
-  float: left;
-  width: 405px;
-  margin: 4px 12px 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select table thead {
-  margin: 0;
-  padding: 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select table td {
-  vertical-align: top;
-  margin: 0;
-  padding: 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select table .select-container {
-  height: 223px;
-  margin: 0;
-  border: 0;
-}
-
-.multi-wizard.instance-wizard .select-network.no-add-network .select table .select-container {
-  height: 282px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network table .select-container {
-  height: 29px;
-  overflow: visible;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network table .select-container .select {
-  position: relative;
-  margin: -12px 0 0;
-  text-align: right;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network table .select-container .select select {
-  position: relative;
-  top: 0;
-  /*+placement:shift;*/
-  left: 0;
-  width: 145px;
-  margin: 4px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network {
-  margin: -17px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network.no-add-network .select.new-network {
-  display: none !important;
-}
-
-.multi-wizard.instance-wizard .select-network .main-desc {
-  float: left;
-  top: 12px;
-  left: 12px;
-  width: 252px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .secondary-input {
-  float: right;
-  width: 80px;
-  height: 48px;
-  border-left: 1px solid #d7d7d7;
-  font-size: 11px;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-network .select.advanced .secondary-input {
-  height: 73px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .secondary-input input {
-  position: relative;
-  top: 21px;
-  /*+placement:shift 9px 21px;*/
-  left: 9px;
-  margin: 0 !important;
-  padding: 0 !important;
-}
-
-.multi-wizard.instance-wizard .select-network .select .secondary-input .name {
-  position: relative;
-  /*+placement:shift -16px 22px;*/
-  float: right;
-  top: 22px;
-  left: -16px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select {
-  position: relative;
-  float: left;
-  width: 100%;
-  padding: 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select.advanced {
-  height: 74px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .advanced-options {
-  float: right;
-  width: 20px;
-  height: 20px;
-  margin-top: 15px;
-  margin-right: 13px;
-  background: url("../images/sprites.png") -7px -795px;
-  cursor: pointer;
-}
-
-.multi-wizard.instance-wizard .select-network .select .advanced-options:hover,
-.multi-wizard.instance-wizard .select-network .select.advanced .advanced-options {
-  background: url("../images/sprites.png") -32px -795px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .specify-ip {
-  display: none;
-  position: absolute;
-  top: 45px;
-  left: 0;
-  width: 100%;
-}
-
-.multi-wizard.instance-wizard .select-network .select.advanced .specify-ip {
-  display: block;
-}
-
-.multi-wizard.instance-wizard .select-network .select.advanced .specify-ip input {
-  width: 138px;
-  margin: 0 0 0 15px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select input {
-  float: left;
-  margin: 21px 15px 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select label {
-  float: left;
-  margin: 4px 0 0 42px;
-  font-size: 11px;
-  color: #4e6b82;
-}
-
-.multi-wizard.instance-wizard .select-network .select-vpc {
-  float: left;
-  margin: 7px 0 7px 7px;
-  padding: 3px;
-}
-
-.multi-wizard.instance-wizard .select-network.no-add-network .select-vpc {
-  visibility: hidden !important;
-}
-
-.multi-wizard.instance-wizard .select-network .select-vpc select {
-  width: 124px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-vpc label {
-  font-size: 10px;
-}
-
-/**** New networ*/
-.multi-wizard.instance-wizard .select-network .select.new-network .advanced-options {
-  /*+placement:shift 379px 15px;*/
-  position: relative;
-  position: absolute;
-  top: 15px;
-  left: 379px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select.advanced {
-  position: relative;
-  height: 106px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .select.advanced {
-  height: auto;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select.advanced .specify-ip {
-  top: 74px;
-  left: 29px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .hide-if-selected {
-  display: none;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .hide-if-unselected {
-  display: none;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .hide-if-selected {
-  display: block;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network input {
-  margin-top: 24px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field {
-  /*+placement:shift 41px 21px;*/
-  position: relative;
-  position: absolute;
-  top: 21px;
-  left: 41px;
-  font-size: 11px;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field .name {
-  float: left;
-  width: 99px;
-  padding: 3px 0 0;
-  /*[empty]display:;*/
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field .value {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field .value input {
-  width: 138px;
-  margin: 0 0 0 11px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network label.error {
-  display: none !important;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .secondary-input {
-  width: 97px;
-  padding: 13px 0 17px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .secondary-input .name {
-  margin: 0 17px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select-desc {
-  width: 255px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select .select-desc .desc {
-  float: left;
-  max-width: 113px;
-  font-size: 11px;
-  color: #808080;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select .select-desc .name {
-  float: left;
-  width: 116px;
-  margin: 0 16px 0 0;
-  font-size: 11px;
-  font-weight: normal;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select-desc .name {
-  width: 99px;
-  margin: 4px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .select-desc .name {
-  color: #808080;
-}
-
-/*** Confirmation*/
-.multi-wizard .review .select-container .select {
-  height: 35px;
-  padding: 0;
-}
-
-.multi-wizard .review .select-container .select .name {
-  float: left;
-  width: 127px;
-  margin: 13px 22px 0 14px;
-  font-size: 11px;
-}
-
-.multi-wizard .review .select-container .select .value {
-  float: left;
-  width: 136px;
-  margin: 9px 21px 0;
-}
-
-.multi-wizard .review .select-container .select .value span {
-  font-size: 10px;
-}
-
-.multi-wizard .review .select-container .select .edit {
-  float: right;
-  height: 18px;
-  margin: 11px 20px 0 0;
-  padding: 0 0 0 20px;
-  background: url("../images/icons.png") -10px -452px;
-  cursor: pointer;
-}
-
-.multi-wizard .review .select-container .select.odd .edit a {
-  background: #ebeff4;
-}
-
-.multi-wizard .review .select-container .select .edit a {
-  padding: 5px 0 8px;
-  background: #ffffff;
-  font-size: 10px;
-  color: #0000ff;
-  text-decoration: none;
-}
-
-.multi-wizard .review .select-container .select input,
-.multi-wizard .review .select-container .select select {
-  float: left;
-  width: 151px;
-  margin: 0;
-}
-
-/*** Diagram*/
-.multi-wizard.instance-wizard .diagram {
-  position: absolute;
-  top: 109px;
-  left: 465px;
-  width: 1px;
-  height: 502px;
-}
-
-.multi-wizard.instance-wizard .diagram .part {
-  background: url("../images/instance-wizard-parts.png") no-repeat 0 0;
-}
-
-.multi-wizard.instance-wizard .diagram .part.zone-plane {
-  position: absolute;
-  width: 354px;
-  height: 117px;
-  /*+placement:displace -38px 259px;*/
-  margin-top: 259px;
-  background-position: -38px -55px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.computer-tower-front {
-  position: absolute;
-  width: 95px;
-  height: 254px;
-  /*+placement:displace 44px 92px;*/
-  margin-top: 92px;
-  margin-left: 44px;
-  background-position: -54px -210px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.computer-tower-back {
-  position: absolute;
-  width: 194px;
-  height: 271px;
-  /*+placement:displace 138px 74px;*/
-  margin-top: 74px;
-  margin-left: 138px;
-  background-position: -148px -192px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.os-drive {
-  position: absolute;
-  width: 194px;
-  height: 86px;
-  /*+placement:displace 138px 74px;*/
-  margin-top: 74px;
-  margin-left: 138px;
-  background-position: -348px -192px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.cpu {
-  position: absolute;
-  width: 194px;
-  height: 49px;
-  /*+placement:displace 138px 156px;*/
-  margin-top: 156px;
-  margin-left: 138px;
-  background-position: -344px -278px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.hd {
-  position: absolute;
-  width: 194px;
-  height: 44px;
-  /*+placement:displace 138px 208px;*/
-  margin-top: 208px;
-  margin-left: 138px;
-  background-position: -344px -331px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.network-card {
-  position: absolute;
-  width: 194px;
-  height: 44px;
-  /*+placement:displace 138px 260px;*/
-  margin-top: 260px;
-  margin-left: 138px;
-  background-position: -344px -380px;
-}
-
-/** Add zone wizard*/
-.multi-wizard.zone-wizard {
-  display: block;
-  height: 675px;
-}
-
-.multi-wizard.zone-wizard ul.subnav {
-  position: relative;
-  /*+placement:shift 30px 104px;*/
-  position: absolute;
-  top: 104px;
-  left: 30px;
-  text-align: left;
-  list-style: disc inside;
-}
-
-.multi-wizard.zone-wizard ul.subnav li {
-  float: left;
-  height: 20px;
-  margin-right: 34px;
-  padding: 0;
-  font-size: 12px;
-  white-space: nowrap;
-  color: #9a9a9a;
-  text-transform: uppercase;
-  list-style: none;
-}
-
-.multi-wizard.zone-wizard ul.subnav li:after {
-  content: '>';
-  position: relative;
-  /*+placement:shift 4px -1px;*/
-  top: -1px;
-  left: 4px;
-  font-size: 13px;
-}
-
-.multi-wizard.zone-wizard ul.subnav li.active {
-  color: #0000ff;
-}
-
-.multi-wizard.zone-wizard .ui-tabs-panel {
-  height: 422px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.multi-wizard.zone-wizard ul.ui-tabs-nav {
-  /*+placement:shift 0px 0px;*/
-  position: relative;
-  float: left;
-  top: 0;
-  left: 0;
-  margin: 6px 0 3px 3px;
-}
-
-.multi-wizard.zone-wizard .select-container {
-  height: 333px;
-  overflow: auto;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic .select-container {
-  background: #e9eaeb;
-  overflow: hidden;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic.basic .select-container {
-  background: #ffffff;
-}
-
-.multi-wizard.zone-wizard .main-desc {
-  position: relative;
-  float: left;
-  /*+placement:shift 0;*/
-  top: 0;
-  left: 0;
-  width: 516px;
-  margin: 23px 0 0 6px;
-  font-size: 14px;
-  font-weight: 100;
-  color: #424242;
-}
-
-.multi-wizard.zone-wizard .review .main-desc.pre-setup {
-  position: relative;
-  top: 153px;
-  left: 0;
-  left: -10px;
-  width: 90%;
-  margin-left: 50px;
-  padding: 1px 0 1px 20px;
-  background: url("../images/icons.png") no-repeat 74px -224px;
-  /*+placement:shift 0px 153px;*/
-  font-size: 18px;
-  font-weight: 100;
-  color: #2c4159;
-  text-align: center;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.multi-wizard.zone-wizard .info-desc {
-  float: left;
-  width: 698px;
-  margin: 29px 0 68px 5px;
-  padding: 11px;
-  border: 1px solid #c7c7c7;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  font-size: 11px;
-  text-align: left;
-  /*+border-radius:4px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .setup-storage-traffic .info-desc {
-  margin-bottom: 10px;
-}
-
-.multi-wizard.zone-wizard .setup-public-traffic .info-desc,
-.multi-wizard.zone-wizard .setup-guest-traffic .info-desc,
-.multi-wizard.zone-wizard .setup-physical-network .info-desc {
-  margin-bottom: 12px;
-}
-
-.multi-wizard.zone-wizard .info-desc strong {
-  font-weight: bold;
-}
-
-.multi-wizard.zone-wizard .main-desc em {
-  font-weight: bold;
-  text-decoration: underline;
-}
-
-.multi-wizard.zone-wizard .progress ul li {
-  width: 107px;
-  margin-left: 7px;
-  padding: 0 32px 0 0;
-}
-
-.multi-wizard.zone-wizard .progress ul li span {
-  width: 102px;
-}
-
-.multi-wizard.zone-wizard .progress ul li span.arrow {
-  margin: -4px 0 0 109px;
-}
-
-.multi-wizard.zone-wizard .select-network .content .section {
-  position: relative;
-  top: 14px;
-  /*+placement:shift 0px 14px;*/
-  left: 0;
-  width: 665px;
-  height: 430px;
-}
-
-.multi-wizard.zone-wizard .select-network .content {
-  float: none;
-  width: 100%;
-  height: 461px;
-  margin: 7px auto auto;
-  padding-bottom: 28px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area {
-  position: relative;
-  width: 586px;
-  height: 181px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area.basic-zone {
-  height: 105px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area.advanced-zone {
-  height: 233px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode {
-  position: absolute;
-  float: left;
-  top: 114px;
-  left: 9px;
-  height: 98px;
-  margin: 5px 0 0;
-  overflow: hidden;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area.disabled .isolation-mode {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .title {
-  position: relative;
-  top: 2px;
-  /*+placement:shift 36px 2px;*/
-  left: 36px;
-  font-size: 15px;
-  color: #5d7387;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .desc {
-  position: relative;
-  top: 12px;
-  left: -27px;
-  width: 373px;
-  height: 70px;
-  /*+placement:shift -27px 12px;*/
-  padding: 12px 18px 25px;
-  border-radius: 7px;
-  border-radius: 7px 7px 7px 7px;
-  /*+border-radius:7px;*/
-  background: #efefef;
-  line-height: 19px;
-  color: #727272;
-  -moz-border-radius: 7px;
-  -webkit-border-radius: 7px;
-  -khtml-border-radius: 7px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area.basic-zone .desc {
-  padding-bottom: 4px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .desc em {
-  font-weight: bold;
-  text-decoration: underline;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area {
-  width: 586px;
-  height: 61px;
-  margin: 0;
-  padding: 0 0 9px;
-  background: none;
-  overflow: hidden;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area label {
-  margin: 24px 0 0 2px;
-  font-size: 11px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area input {
-  margin: 26px 0 11px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area input {
-  margin: 24px 8px 0 12px !important;
-  padding: 0 !important;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area .desc {
-  position: relative;
-  float: right;
-  top: 12px;
-  left: -27px;
-  width: 388px;
-  height: 29px;
-  margin-right: 9px;
-  /*+placement:shift -27px 12px;*/
-  padding: 6px 7px 11px;
-  background: #efefef;
-  font-size: 11px;
-}
-
-.multi-wizard.zone-wizard .content.input-area {
-  width: 721px;
-  min-height: inherit;
-  margin: -50px auto auto 4px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-/*** Add physical network -- network form items*/
-.multi-wizard.zone-wizard .setup-physical-network .content.input-area {
-  position: relative;
-  width: 627px;
-  height: 396px;
-  background: transparent;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .drag-helper-icon {
-  position: relative;
-  position: absolute;
-  top: 303px;
-  /*+placement:shift 134px 303px;*/
-  left: 134px;
-  width: 80px;
-  height: 84px;
-  background: url("../images/sprites.png") no-repeat 0 -1365px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi {
-  display: inline-block;
-  float: right;
-  width: 490px;
-  height: auto;
-  margin: 6px auto auto;
-  border: 1px solid #bfbfbf;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px 2px #cbcaca;
-  background: #f8f6f6;
-  overflow: visible;
-  -moz-border-radius: 4px;
-  /*+box-shadow:inset 0px 1px 2px #CBCACA;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px 2px #cbcaca;
-  -webkit-box-shadow: inset 0 1px 2px #cbcaca;
-  -o-box-shadow: inset 0 1px 2px #cbcaca;
-  /*[empty]display:;*/
-}
-
-.multi-wizard.zone-wizard .select-container.multi.disabled {
-  opacity: 0.4;
-  /*+opacity:40%;*/
-  border: 1px dotted #a7a7a7;
-  filter: alpha(opacity=40);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
-  -moz-opacity: 0.4;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .physical-network-icon {
-  float: left;
-  width: 61px;
-  height: 53px;
-  border-right: 1px solid #cdcdcd;
-  background: url("../images/sprites.png") -109px -1393px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi input {
-  width: 195px !important;
-  margin: 2px 0 0 17px !important;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .field {
-  width: 425px;
-  height: 46px;
-  margin-top: -6px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .field .name {
-  width: 93%;
-  margin-left: 17px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container {
-  position: relative;
-  clear: both;
-  width: 484px;
-  height: 114px;
-  border: 3px dashed #bbbfc4;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #dae2ec;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container ul {
-  position: absolute;
-  /*+border-radius:5px;*/
-  top: 4px;
-  left: 2px;
-  width: 99%;
-  height: 94%;
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  background: #dae2ec;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container ul.active {
-  background: #dfeaff;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container ul li {
-  float: left;
-  margin: 2px 17px 0 29px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container span.empty-message {
-  position: relative;
-  top: 45px;
-  left: 0;
-  /*+placement:shift 0px 45px;*/
-  font-size: 13px;
-  color: #959ba0;
-  text-align: center;
-}
-
-/*** Add physical network -- traffic type drag area*/
-.multi-wizard.zone-wizard .traffic-types-drag-area {
-  position: relative;
-  float: left;
-  top: 0;
-  left: 3px;
-  /*+border-radius:4px;*/
-  width: 96px;
-  height: 370px;
-  margin: 8px 0 0;
-  padding: 0;
-  border: 1px solid #dccaca;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #f0f1f2;
-  text-align: left;
-  /*+placement:shift 3px 0px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area .header {
-  margin: 0;
-  padding: 8px 0 7px;
-  border-bottom: 1px solid #dccaca;
-  border-radius: 4px 4px 0 0;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  background: #f8f8f8;
-  font-size: 13px;
-  font-weight: bold;
-  color: #5c5c5c;
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  /*+border-radius:4px 4px 0 0;*/
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul {
-  width: 100%;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li {
-  float: left;
-  width: 100%;
-  height: 83px;
-  margin: 16px 13px 0 0;
-  background: transparent;
-  font-size: 11px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li.required {
-  display: none;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li.required.clone {
-  display: block;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li ul.container {
-  width: 60px;
-  height: 54px;
-  margin-left: 16px;
-  border-bottom: 1px solid #ffffff;
-  /*+border-radius:5px;*/
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  box-shadow: inset 0 2px 4px #999696;
-  background: #e4e4e4;
-  -moz-border-radius: 5px;
-  /*+box-shadow:inset 0px 2px 4px #999696;*/
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-  -moz-box-shadow: inset 0 2px 4px #999696;
-  -webkit-box-shadow: inset 0 2px 4px #999696;
-  -o-box-shadow: inset 0 2px 4px #999696;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li ul.container li {
-  /*+placement:shift 1px 2px;*/
-  position: relative;
-  top: 2px;
-  left: 1px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable {
-  display: block;
-  z-index: 5000;
-  width: 51px;
-  height: 51px;
-  margin: auto;
-  background: transparent url("../images/sprites.png") no-repeat 0 -1161px;
-  cursor: move;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable:hover {
-  width: 69px !important;
-  height: 66px !important;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable:hover {
-  /*+placement:shift -2px -4px;*/
-  position: relative;
-  top: -4px;
-  left: -2px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable:hover {
-  /*+placement:shift -8px -6px;*/
-  position: relative;
-  top: -6px;
-  left: -8px;
-  width: 70px !important;
-  margin-right: 0;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.disabled {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  cursor: not-allowed;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area ul > li.disabled {
-  display: none;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.disabled {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  cursor: not-allowed;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.management {
-  height: 52px;
-  background-position: 0 -1161px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.management:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.management:hover {
-  background-position: -11px -1225px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.management:hover {
-  margin-right: -1px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.public {
-  width: 53px;
-  height: 53px;
-  background-position: -54px -1160px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.public:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.public:hover {
-  background-position: -87px -1225px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.guest {
-  background-position: -113px -1161px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.guest:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.guest:hover {
-  background-position: -166px -1227px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.storage {
-  background-position: -170px -1160px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.storage:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.storage:hover {
-  background-position: -244px -1224px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li .info {
-  float: left;
-  width: 100%;
-  margin: 5px 0 0 -2px;
-  line-height: 14px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li .info .title {
-  font-weight: bold;
-  color: #787879;
-  text-align: center;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li .info .desc {
-  display: none;
-}
-
-/*** Traffic type icon -- edit button*/
-.multi-wizard.zone-wizard .traffic-type-draggable .edit-traffic-type {
-  display: none;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable > .edit-traffic-type {
-  display: block;
-  position: relative;
-  top: 70px;
-  left: -16px;
-  width: 59px;
-  height: 23px;
-  padding: 2px 9px 0 12px;
-  /*+border-radius:4px;*/
-  border: 1px solid #c4c4c4;
-  border-top: 1px solid #ffffff;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url("../images/bg-gradients.png") 0 -1342px;
-  cursor: pointer;
-  /*+placement:shift -16px 70px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable > .edit-traffic-type:hover {
-  box-shadow: inset 0 -1px 1px #727272;
-  background-position: 0 -105px;
-  /*+box-shadow:inset 0px -1px 1px #727272;*/
-  color: #ffffff;
-  -moz-box-shadow: inset 0 -1px 1px #727272;
-  -webkit-box-shadow: inset 0 -1px 1px #727272;
-  -o-box-shadow: inset 0 -1px 1px #727272;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable > .edit-traffic-type:hover span {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable:hover > .edit-traffic-type {
-  /*+placement:shift -7px 76px;*/
-  position: relative;
-  top: 76px;
-  left: -7px;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable .edit-traffic-type span {
-  font-size: 11px;
-  font-weight: bold;
-  color: #4e73a6;
-  text-align: center;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable .edit-traffic-type span.icon {
-  float: left;
-  padding: 7px 11px 0 7px;
-  background: url("../images/sprites.png") -7px -4px;
-}
-
-.multi-wizard.zone-wizard .traffic-type-draggable .edit-traffic-type span.name {
-  position: relative;
-  float: left;
-  top: -16px;
-  left: -13px;
-  width: 76px;
-  margin-bottom: -13px;
-  /*+border-radius:4px 4px 0 0;*/
-  padding: 2px;
-  border: 1px solid #c3bcbc;
-  border-bottom: 1px solid #d1cdcd;
-  border-radius: 4px 4px 0 0;
-  /*+placement:shift -13px -16px;*/
-  box-shadow: inset 0 1px 1px #f5f4f4;
-  background: #dbe1e9;
-  font-size: 10px;
-  color: #4e5f6f;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  /*+box-shadow:inset 0px 1px 1px #F5F4F4;*/
-  -khtml-border-radius: 4px 4px 0 0;
-  -moz-box-shadow: inset 0 1px 1px #f5f4f4;
-  -webkit-box-shadow: inset 0 1px 1px #f5f4f4;
-  -o-box-shadow: inset 0 1px 1px #f5f4f4;
-}
-
-.multi-wizard.zone-wizard .traffic-type-draggable .edit-traffic-type:hover span.name {
-  background: #c4c3c3;
-}
-
-/*** Configure guest network -- tabs*/
-.multi-wizard.zone-wizard .setup-guest-traffic .ui-widget-content {
-  position: relative;
-  top: -7px;
-  left: -1px;
-  width: 682px;
-  /*+placement:shift -1px -7px;*/
-  height: 281px;
-  border-right: 0;
-  border-bottom: 0;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic ul.ui-tabs-nav {
-  position: relative;
-  /*+placement:shift -4px -8px;*/
-  top: -8px;
-  left: -4px;
-  width: 456px;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic .main-desc {
-  margin-top: 27px;
-  margin-left: -3px;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic .content {
-  margin-top: 2px;
-  margin-left: -4px;
-}
-
-/*** Multi-edit*/
-.multi-wizard.zone-wizard .multi-edit {
-  float: left;
-  width: 732px;
-  margin-left: 0;
-}
-
-.multi-wizard.zone-wizard .multi-edit table {
-  float: left;
-  width: 98%;
-}
-
-.multi-wizard.zone-wizard .multi-edit table td,
-.multi-wizard.zone-wizard .multi-edit table th {
-  padding: 4px;
-}
-
-.multi-wizard.zone-wizard .multi-edit table th {
-  padding-top: 11px;
-  padding-bottom: 8px;
-}
-
-.multi-wizard.zone-wizard .multi-edit table input {
-  margin: 2px 0 2px -5px;
-  padding: 2px 0;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data {
-  float: left;
-  overflow: visible;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body {
-  margin: 0;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body .data-item {
-  float: left;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body .data-item td {
-  padding-top: 8px;
-  padding-bottom: 8px;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body .data-item td span {
-  max-width: 91px;
-  font-size: 10px;
-  text-overflow: ellipsis;
-}
-
-/*** Select container fields*/
-.multi-wizard.zone-wizard .select-container .field {
-  float: left;
-  width: 100%;
-  padding-bottom: 13px;
-}
-
-.multi-wizard.zone-wizard .select-container .field.odd {
-  background: #ebeff5;
-}
-
-.multi-wizard.zone-wizard .select-container .field .name {
-  float: left;
-  width: 95px;
-  margin: 18px 0 0 12px;
-  font-size: 11px;
-  line-height: 13px;
-  text-align: left;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value {
-  position: relative;
-  float: left;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value span {
-  display: block;
-  margin: 20px 0 0;
-  font-size: 11px;
-  color: #052060;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value label.error {
-  display: block;
-  position: absolute;
-  position: relative;
-  position: absolute;
-  float: right;
-  top: 31px;
-  left: 1px;
-  /*+placement:shift 1px 31px;*/
-  margin: 2px 0 0 16px;
-  font-size: 10px;
-  color: #ff0000;
-  text-align: left;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value input,
-.multi-wizard.zone-wizard .select-container .field .value select {
-  float: left;
-  width: 316px;
-  height: 20px;
-  margin: 13px 13px 0 18px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .range-edit .range-item {
-  float: left;
-  width: 106px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .range-edit .range-item input[type='text'] {
-  width: 93px;
-  margin: 16px 0 0 17px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value select {
-  width: 327px;
-  height: 21px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value input[type='checkbox'] {
-  display: block;
-  float: left;
-  width: 13px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value.multi-range input {
-  float: left;
-  width: 137px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value.multi-range span {
-  float: left;
-  margin: 13px 0 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array {
-  display: inline-block;
-  width: 360px;
-}
-
-/*[clearfix]*/
-.multi-wizard.zone-wizard .select-container .field .select-array-item {
-  float: left;
-  width: 175px;
-  height: 34px;
-}
-
-div.toolbar,
-.multi-wizard.zone-wizard .select-container .field .select-array-item {
-  display: block;
-}
-
-div.toolbar:after,
-.multi-wizard.zone-wizard .select-container .field .select-array-item:after {
-  visibility: hidden;
-  content: '.';
-  display: block;
-  clear: both;
-  height: 0;
-  font-size: 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array-item .name {
-  float: right;
-  width: 127px;
-  margin: 11px 0 0;
-  padding: 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array-item .value {
-  float: right;
-  width: 41px;
-  margin: 0;
-  padding: 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array-item .value input {
-  width: inherit;
-  margin: 12px 0 0 11px;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.add.new-physical-network {
-  visibility: hidden;
-  float: right;
-  margin: 14px 6px 0 0;
-  padding: 6px 20px 6px 11px;
-  border: 1px solid #ada7a7;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  background: #808080 url("../images/bg-gradients.png") 0 -264px;
-  font-size: 12px;
-  color: #475765;
-  text-shadow: 0 1px 1px #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.remove.physical-network {
-  position: relative;
-  float: right;
-  top: 27px;
-  margin: -26px 0 0;
-  padding: 10px 10px 0;
-  background: url("../images/sprites.png") -6px -93px;
-  cursor: pointer;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .select-container.disabled .button.remove.physical-network {
-  display: none;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.remove.physical-network:hover {
-  background-position: -6px -675px;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.add.new-physical-network:hover {
-  background-position: 0 -349px;
-  color: #000000;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.add.new-physical-network .icon {
-  padding: 10px;
-  background: url("../images/sprites.png") -44px -58px;
-}
-
-/*** Review / launch*/
-.multi-wizard.zone-wizard .review .launch-container {
-  float: left;
-  width: 98%;
-  max-height: 438px;
-  margin: 11px 0 0 7px;
-  border: 1px solid #cacaca;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ececec 0 -12px;
-  background: #f7f7f7;
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f7f7f7), color-stop(100%, #eaeaea));
-  background: -webkit-linear-gradient(top, #f7f7f7 0%, #eaeaea 100%);
-  background: linear-gradient(to bottom, #f7f7f7 0%, #eaeaea 100%);
-  /*+border-radius:4px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li {
-  width: 100%;
-  padding: 15px 0 15px 12px;
-  font-size: 12px;
-  font-weight: bold;
-  text-align: left;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li .icon {
-  /*[empty]display:;*/
-  padding: 10px 21px 10px 10px;
-  background: url("../images/icons.png") -2px -217px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li.loading .icon {
-  background: url("../images/ajax-loader-small.gif") no-repeat 2px 9px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li.error .icon {
-  background-position: -2px -185px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li.info .icon {
-  display: none;
-}
-
-.tree-view {
-  width: 24%;
-  height: 98%;
-  overflow: auto;
-}
-
-.tree-view.overflowScroll {
-  overflow: scroll;
-}
-
-.tree-view ul {
-  display: block;
-  width: 85px;
-}
-
-.tree-view ul li {
-  display: block;
-  position: relative;
-  clear: both;
-  left: 21px;
-  width: 100%;
-  margin: 7px 0 0;
-  font-size: 12px;
-}
-
-.tree-view > ul {
-  /*+placement:shift 3px 40px;*/
-  position: relative;
-  top: 40px;
-  left: 3px;
-}
-
-.tree-view > ul > li {
-  left: 5px;
-}
-
-.tree-view ul li .name {
-  float: left;
-  margin: 1px 0 13px 17px;
-  padding: 6px 9px 6px 4px;
-  cursor: pointer;
-}
-
-.tree-view ul li .name:hover {
-  text-decoration: underline;
-}
-
-.tree-view ul li .name.selected {
-  border-radius: 5px;
-  /*+border-radius:5px;*/
-  border-radius: 5px 5px 5px 5px;
-  background: #dddcdd;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.tree-view ul li .expand {
-  position: absolute;
-  float: left;
-  float: left;
-  width: 10px;
-  height: 10px;
-  margin: 4px 5px 0 0;
-  background: url("../images/buttons.png") -630px -245px;
-  cursor: pointer;
-}
-
-.tree-view ul li.expanded > .expand {
-  background-position: -631px -228px;
-}
-
-#browser .tree-view div.toolbar div.text-search {
-  float: left;
-}
-
-.ui-dialog .list-view {
-  height: 515px !important;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.ui-dialog .list-view .toolbar {
-  top: 50px;
-  width: 100%;
-}
-
-div.panel.ui-dialog div.list-view div.fixed-header {
-  z-index: 1;
-  top: 55px;
-  left: 35px;
-  width: 759px;
-  height: 49px;
-  margin: 0;
-  background-color: #ffffff;
-}
-
-.ui-dialog .list-view table {
-  top: 9px !important;
-}
-
-.ui-dialog.panel div.list-view div.data-table table {
-  width: 778px;
-  margin-top: 39px;
-}
-
-.ui-dialog.panel div.list-view div.data-table table tbody tr.multi-edit-selected {
-  background: #c3e0fc;
-}
-
-/*List-view: subselect dropdown*/
-.list-view .subselect {
-  display: block;
-  float: left;
-  clear: both;
-  width: 173px;
-  margin: 0 0 0 -3px;
-  padding: 0;
-  border: 1px solid #a8a7a7;
-  border-radius: 2px;
-  background: #e8e8e8;
-  /*+border-radius:2px;*/
-  cursor: default;
-  -moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  -khtml-border-radius: 2px;
-}
-
-.list-view .subselect:hover span {
-  color: initial;
-}
-
-.list-view .subselect span {
-  margin: 4px 0 0 12px;
-  cursor: default;
-}
-
-.list-view .subselect span.info {
-  background: none;
-  font-size: 10px;
-  white-space: nowrap;
-}
-
-.list-view .subselect span:hover {
-  color: initial;
-}
-
-.list-view .subselect select {
-  width: 175px;
-  margin: 0 0 0 -11px;
-  font-size: 10px;
-}
-
-div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBalancer div.multi-edit form table.multi-edit thead tr th,
-div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBalancer div.multi-edit form table.multi-edit tbody tr td {
-  min-width: 100px;
-}
-
-.multi-edit {
-  overflow: auto;
-}
-
-.multi-edit > form {
-  position: relative;
-  clear: both;
-}
-
-.multi-edit table.multi-edit {
-  border-top: 0;
-}
-
-.multi-edit table th {
-  min-width: 88px;
-  white-space: nowrap;
-  text-align: center;
-  text-indent: 0;
-}
-
-.detail-group .multi-edit table td {
-  border-left: 1px solid #cdcccc;
-}
-
-.detail-view .multi-edit input {
-  width: 70%;
-}
-
-.detail-view .multi-edit select {
-  width: 93%;
-  min-width: 80px;
-  font-size: 10px;
-}
-
-.multi-edit input {
-  width: 85%;
-}
-
-.multi-edit .range {
-  position: relative;
-}
-
-.multi-edit .range .range-item {
-  float: left;
-}
-
-.multi-edit .range input {
-  position: relative;
-  width: 35px;
-  margin-right: 2px;
-}
-
-.multi-edit .range label {
-  display: block;
-  position: relative;
-  /*+placement:shift 3px 2px;*/
-  clear: both;
-  top: 2px;
-  left: 3px;
-}
-
-.multi-edit label.error {
-  float: left;
-  margin: 3px 0 0;
-  font-size: 10px;
-}
-
-.multi-edit .data-table td span {
-  float: left;
-}
-
-.multi-edit .data-table td.add-vm {
-  cursor: pointer;
-}
-
-.multi-edit th.add-rule,
-.multi-edit td.add-rule {
-  border-right: 1px solid #cdcccc;
-}
-
-.multi-edit .data-table td.add-vm:hover {
-  color: #5faaf7;
-}
-
-.multi-edit .data-table .fixed-header {
-  display: none;
-}
-
-.multi-edit .button.add-vm {
-  position: relative;
-  top: 0;
-  left: 4px;
-  width: 74px;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  padding: 6px 0 4px;
-  border: 1px solid #858585;
-  border-top: 0;
-  border-radius: 5px;
-  /*+box-shadow:0px 1px 1px #FFFFFF;*/
-  border-radius: 5px 5px 5px 5px;
-  box-shadow: 0 1px 1px #ffffff;
-  background: url("../images/bg-gradients.png") repeat-x 0 -220px;
-  font-size: 10px;
-  font-weight: bold;
-  color: #ffffff;
-  /*+border-radius:5px;*/
-  text-align: center;
-  text-indent: 0;
-  text-shadow: 0 1px 1px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-box-shadow: 0 1px 1px #ffffff;
-  -webkit-box-shadow: 0 1px 1px #ffffff;
-  -o-box-shadow: 0 1px 1px #ffffff;
-  /*+placement:shift 4px 0px;*/
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-edit .button.add-vm:hover {
-  box-shadow: inset 0 1px 1px #000000;
-  /*+box-shadow:inset 0px 1px 1px #000000;*/
-  background-position: 0 -241px;
-  -moz-box-shadow: inset 0 1px 1px #000000;
-  -webkit-box-shadow: inset 0 1px 1px #000000;
-  -o-box-shadow: inset 0 1px 1px #000000;
-}
-
-.multi-edit .button.custom-action {
-  border: 1px solid #b7b7b7;
-  background: url("../images/bg-gradients.png") 0 -271px;
-  font-size: 10px;
-  color: #485867;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.multi-edit td.disabled .button.add-vm.custom-action {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  cursor: not-allowed;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-edit .button.custom-action:hover {
-  background: #808080 url("../images/bg-gradients.png");
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.ui-dialog.multi-edit-add-list {
-  width: initial !important;
-}
-
-.ui-dialog.multi-edit-add-list .ui-dialog-buttonpane {
-  display: block;
-}
-
-.ui-dialog.multi-edit-add-list .ui-dialog-buttonpane .ui-dialog-buttonset {
-  width: initial;
-  padding-right: 15px;
-}
-
-.ui-dialog.multi-edit-add-list .ui-dialog-buttonpane .ui-dialog-buttonset button {
-  top: 0;
-  left: 0;
-}
-
-.multi-edit-add-list .ui-button.ok,
-.multi-edit-add-list .ui-button.cancel {
-  position: relative;
-  /*+placement:shift 506px -18px;*/
-  float: right;
-  top: -18px;
-  left: 506px;
-}
-
-.multi-edit-add-list .ui-button.cancel {
-  /*+placement:shift 492px -18px;*/
-  position: relative;
-  left: 492px;
-  border: 0;
-  background: transparent;
-  font-weight: bold;
-  color: #808b95;
-}
-
-.multi-edit-add-list div.form-container {
-  width: auto !important;
-  height: auto;
-  text-align: center;
-}
-
-.multi-edit-add-list div.form-container div.name label {
-  display: inline;
-}
-
-.multi-edit .data .data-body {
-  margin: auto auto auto 11px;
-  overflow: hidden;
-}
-
-.panel.always-maximized .multi-edit .data .data-body {
-  width: 96%;
-  margin: 0 0 0 12px;
-}
-
-.multi-edit .data .data-body .data-item {
-  position: relative;
-  margin-bottom: 14px;
-  border: 1px solid #cdcccc;
-}
-
-.multi-edit .data .data-body .data-item .loading-overlay {
-  background-position: 50% 50%;
-}
-
-.multi-edit .data .data-body .data-item.loading {
-  height: 28px;
-  border: 1px solid #dddddd;
-  background: #ffffff url("../images/ajax-loader.gif") no-repeat center;
-}
-
-.multi-edit .data .data-body .data-item.loading .label {
-  margin: 12px 0 0;
-  font-size: 12px;
-  color: #808080;
-  text-align: center;
-  text-indent: 19%;
-}
-
-.multi-edit .data .data-body .data-item table {
-  width: 100%;
-  margin: 0;
-  border: 0;
-  background: #f0f1f2;
-  overflow: hidden;
-}
-
-.multi-edit .data .data-body .data-item tr {
-  border: 0;
-  background: #efefef;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td {
-  height: 15px;
-  border-right: 1px solid #cfc9c9;
-  border-left: 0;
-  background: #f0f1f2;
-  overflow: auto;
-}
-
-.multi-edit .data .data-body .data-item > table tbody tr td span {
-  display: block;
-  float: left;
-  max-width: 90%;
-  overflow: hidden;
-  word-break: break-all;
-  word-wrap: break-word;
-  text-indent: 0;
-  margin-left: 10px;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.name {
-  padding-top: 9px;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.name span {
-  width: 53px;
-  font-weight: bold;
-  color: #4c5d78;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing table tbody tr td.name span {
-  font-weight: normal;
-  color: #4c5d78;
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing table tbody tr td.name span:hover {
-  color: #0000ff;
-}
-
-div#details-tab-aclRules table.multi-edit tr th.number,
-div#details-tab-aclRules div.data-item table tr td.number {
-  width: 45px !important;
-  min-width: 45px !important;
-  max-width: 45px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.action,
-div#details-tab-aclRules div.multi-edit table tr td.action {
-  width: 40px !important;
-  min-width: 40px !important;
-  max-width: 40px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.protocol,
-div#details-tab-aclRules div.multi-edit table tr td.protocol {
-  width: 50px !important;
-  min-width: 50px !important;
-  max-width: 50px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.protocolnumber,
-div#details-tab-aclRules div.multi-edit table tr td.protocolnumber {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.traffictype,
-div#details-tab-aclRules div.multi-edit table tr td.traffictype {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.reason,
-div#details-tab-aclRules div.multi-edit table tr td.reason {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.icmptype,
-div#details-tab-aclRules div.multi-edit table tr td.icmptype,
-div#details-tab-aclRules div.multi-edit table tr th.icmpcode,
-div#details-tab-aclRules div.multi-edit table tr td.icmpcode {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.startport,
-div#details-tab-aclRules div.multi-edit table tr td.startport,
-div#details-tab-aclRules div.multi-edit table tr th.endport,
-div#details-tab-aclRules div.multi-edit table tr td.endport {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules td.cidrlist span {
-  width: 100%;
-  text-align: center;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.multi-actions .action {
-  float: left;
-  width: 28px;
-  height: 21px;
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.multi-actions .action span.icon {
-  float: left;
-  width: 28px;
-  height: 21px;
-  background-image: url("../images/sprites.png");
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item tr td .expand {
-  display: block;
-  float: left;
-  width: 14px;
-  height: 15px;
-  margin: -3px 0 0 11px;
-  border: 1px solid #d0d0d0;
-  /*+border-radius:9px;*/
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/sprites.png") -541px -499px;
-  cursor: pointer;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.multi-edit .data .data-body .data-item tr td.add-vm,
-.multi-edit tr th.add-vm {
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item tr td .custom-action {
-  margin: -2px 0 0 0;
-}
-
-.multi-edit .data .data-body .data-item tr td.add-vm:hover {
-  font-weight: bold;
-  color: #0060ff;
-}
-
-.multi-edit .data .data-body .data-item tr td.add-vm p {
-  margin-top: 3px;
-  margin-bottom: 6px;
-  padding-left: 9px;
-  text-indent: 0;
-}
-
-.multi-edit .data .data-body .data-item tr td.multi-actions .icon {
-  /*+placement:shift -3px -2px;*/
-  position: relative;
-  top: -2px;
-  left: -3px;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing {
-  width: 99.8%;
-  max-height: 161px;
-  border: 1px solid #cfc9c9;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing tr {
-  width: 100%;
-  margin: 0;
-  padding: 0;
-  border: 0;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing tr td {
-  margin: 0;
-  border: 0;
-  background: #dde0e2;
-  text-indent: 37px;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing tr.odd td {
-  background: #f2f0f0;
-}
-
-.ui-tabs-panel .add-by {
-  width: 94%;
-  margin: 13px 0 0 14px;
-  font-size: 12px;
-  color: #536474;
-}
-
-.ui-tabs-panel .add-by .selection {
-  width: 236px;
-  margin: 8px 0 0;
-}
-
-.ui-tabs-panel .add-by .selection input {
-  margin: 0 6px 0 0;
-}
-
-.ui-tabs-panel .add-by .selection label {
-  margin: 0 22px 0 0;
-}
-
-/** Fix long table overflow*/
-.detail-view .multi-edit {
-  width: 100%;
-}
-
-.detail-view .multi-edit table {
-  width: 97%;
-  max-width: inherit;
-}
-
-.detail-view .multi-edit table tr th,
-.detail-view .multi-edit table tr td {
-  width: 84px !important;
-  min-width: 84px !important;
-  max-width: 84px !important;
-  font-size: 10px;
-}
-
-/* special case for 'Source CIDR' column - make it wide enough to fit a CIDR without ellipsizing*/
-.detail-view .multi-edit table tr th.cidrlist,
-.detail-view .multi-edit table tr td.cidrlist {
-  min-width: 118px !important;
-  max-width: 118px !important;
-  padding: 0 0 0 0;
-}
-
-.detail-view .multi-edit td.cidrlist input {
-  width: 85%;
-}
-
-/** Header fields*/
-.multi-edit .header-fields {
-  position: relative;
-  /*+placement:shift 14px 11px;*/
-  position: relative;
-  top: 11px;
-  left: 14px;
-}
-
-.multi-edit .header-fields .form-container {
-  width: 96%;
-  height: 32px;
-  border: 1px solid #d4cfcf;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: #e4e4e4;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-edit .header-fields .form-item {
-  float: left;
-  margin-right: 0;
-  margin-bottom: 32px;
-  padding: 4px 15px 3px 9px;
-}
-
-.multi-edit .header-fields .form-item input,
-.multi-edit .header-fields .form-item select {
-  margin-top: 4px;
-}
-
-.multi-edit .header-fields .form-item .name,
-.multi-edit .header-fields .form-item .value {
-  float: left;
-}
-
-.multi-edit .header-fields .form-item .name {
-  padding: 5px;
-  font-size: 14px;
-  color: #55687a;
-}
-
-/*Sortable*/
-.multi-edit table tbody tr td.reorder,
-.multi-edit table thead tr th.reorder {
-  width: 16px !important;
-  min-width: 16px !important;
-  max-width: 16px !important;
-}
-
-/*Security Rules*/
-.security-rules .multi-edit input {
-  width: 69px;
-  margin: 0 0 0 9px;
-}
-
-.security-rules .multi-edit .range input {
-  width: 44px;
-  margin: 0;
-}
-
-.recurring-snapshots {
-  display: inline-block;
-}
-
-.recurring-snapshots .schedule .forms .formContainer {
-  min-height: 250px;
-}
-
-.recurring-snapshots .schedule .add-snapshot-actions {
-  float: left;
-  clear: both;
-  width: 581px;
-  margin-bottom: 13px;
-  border-top: 1px solid #ffffff;
-  font-size: 13px;
-}
-
-.recurring-snapshots .schedule .add-snapshot-action {
-  /*+placement:shift -7px -34px;*/
-  position: relative;
-  float: right;
-  top: -34px;
-  left: -7px;
-  padding: 10px;
-  cursor: pointer;
-}
-
-.recurring-snapshots .schedule .add-snapshot-action.add {
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  color: #0000ff;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.recurring-snapshots .schedule .add-snapshot-action.add:hover {
-  color: #1a85f4;
-}
-
-.recurring-snapshots .schedule p {
-  margin: 0;
-  font-size: 13px;
-}
-
-.recurring-snapshots .schedule .forms form {
-  font-size: 12px;
-  color: #4f6171;
-}
-
-.recurring-snapshots .schedule .forms form select {
-  float: left;
-  max-width: 100%;
-  margin: 3px 10px 3px 3px;
-}
-
-.recurring-snapshots .schedule .forms form input {
-  /*+placement:shift 1px 4px;*/
-  position: relative;
-  top: 4px;
-  left: 1px;
-}
-
-.recurring-snapshots .schedule .forms form label {
-  /*+placement:shift 5px 4px;*/
-  position: relative;
-  top: 4px;
-  left: 5px;
-}
-
-.recurring-snapshots .schedule .forms .tagger form div.value label {
-  width: 25px;
-  top: 10px;
-}
-
-.recurring-snapshots .schedule .forms form label.error {
-  float: left;
-  width: 100%;
-  font-size: 10px;
-}
-
-.recurring-snapshots .schedule .forms form .field {
-  float: left;
-  width: 100%;
-  margin: 8px 0 0;
-}
-
-.recurring-snapshots .schedule .forms .tagger form .field {
-  margin: 0;
-}
-
-.recurring-snapshots .schedule .forms form .name {
-  float: left;
-  width: 72px;
-  margin: 3px 14px 0 0;
-  padding: 4px 0 0;
-  text-align: right;
-}
-
-.recurring-snapshots .schedule .forms form .value {
-  float: left;
-  width: 470px;
-  text-align: left;
-}
-
-.ui-dialog .recurring-snapshots .ui-widget-content {
-  margin: 0;
-  padding: 0;
-}
-
-.recurring-snapshots .ui-button {
-  /*+placement:anchor-bottom-right 9px 9px;*/
-  position: absolute;
-  right: 9px;
-  bottom: 9px;
-}
-
-.recurring-snapshots .scheduled-snapshots {
-  position: relative;
-  clear: both;
-  top: -26px;
-}
-
-.recurring-snapshots .scheduled-snapshots p {
-  font-size: 12px;
-  font-weight: bold;
-  /*+text-shadow:0px 2px 2px #FFFFFF;*/
-  text-shadow: 0 2px 2px #ffffff;
-  -moz-text-shadow: 0 2px 2px #ffffff;
-  -webkit-text-shadow: 0 2px 2px #ffffff;
-  -o-text-shadow: 0 2px 2px #ffffff;
-}
-
-.recurring-snapshots .scheduled-snapshots table {
-  position: relative;
-  /*+placement:shift 0px -14px;*/
-  top: -14px;
-  width: 100%;
-  margin: 0;
-  border: 0;
-}
-
-.recurring-snapshots .scheduled-snapshots table td.actions div.action span.icon {
-  /*+placement:shift -3px -4px;*/
-  position: relative;
-  top: -4px;
-  left: -3px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr {
-  display: block;
-  display: none;
-  width: 100%;
-  height: 38px;
-  margin: 22px 0 0;
-  padding: 0;
-  border: 0;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td {
-  padding: 5px 0 0 14px;
-  border: 0;
-  font-size: 12px;
-  word-break: keep-all;
-  word-wrap: normal;
-  text-indent: 0;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.keep {
-  min-width: 60px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.timezone {
-  min-width: 168px;
-  font-size: 12px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.timezone span {
-  font-size: 10px;
-}
-
-.recurring-snapshots .scheduled-snapshots table tbody tr td.actions {
-  min-width: 22px !important;
-  max-width: 22px !important;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.time {
-  min-width: 144px;
-  background: url("../images/sprites.png") no-repeat -536px -533px;
-  text-indent: 0.7em;
-}
-
-.recurring-snapshots .scheduled-snapshots tr.daily td.time {
-  background-position: -537px -569px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr.weekly td.time {
-  background-position: -537px -605px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr.monthly td.time {
-  background-position: -537px -648px;
-}
-
-.recurring-snapshots p {
-  display: block;
-  max-width: 550px;
-  margin-bottom: 16px;
-  padding: 0 47px 0 0;
-  font-size: 14px;
-  line-height: 18px;
-  /*+text-shadow:0px 3px 3px #FFFFFF;*/
-  color: #475765;
-  text-align: left;
-  text-shadow: 0 3px 3px #ffffff;
-  -moz-text-shadow: 0 3px 3px #ffffff;
-  -webkit-text-shadow: 0 3px 3px #ffffff;
-  -o-text-shadow: 0 3px 3px #ffffff;
-}
-
-.recurring-snapshots .ui-tabs ul {
-  display: block;
-  position: relative;
-  width: 100%;
-  margin: 0;
-  margin: 0;
-  padding: 0;
-}
-
-.recurring-snapshots .ui-tabs .tagger ul {
-    margin: 16px auto auto;
-    padding-bottom: 10px;
-}
-
-.recurring-snapshots .ui-tabs ul li a {
-  width: 76px;
-  background: url("../images/sprites.png") no-repeat -521px -533px;
-}
-
-.recurring-snapshots .ui-tabs ul li.disabled a {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.recurring-snapshots .ui-tabs ul li.disabled:hover a {
-  border: 0;
-  border: 0;
-  box-shadow: 0 0;
-  /*+box-shadow:0px 0px;*/
-  background-color: transparent;
-  cursor: default;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 none;
-  -webkit-box-shadow: 0 0 none;
-  -o-box-shadow: 0 0 none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.recurring-snapshots .ui-tabs ul li.daily a {
-  background-position: -522px -570px;
-}
-
-.recurring-snapshots .ui-tabs ul li.weekly a {
-  background-position: -526px -605px;
-}
-
-.recurring-snapshots .ui-tabs ul li.monthly a {
-  background-position: -528px -649px;
-}
-
-.recurring-snapshots .ui-tabs div.ui-tabs-panel {
-  width: 100%;
-  height: 144px;
-  border: 0;
-  background: #e9e9e9;
-}
-
-.recurring-snapshots .ui-tabs div.ui-tabs-panel.ui-tabs-hide {
-  display: none;
-}
-
-.upload-volume .list-view {
-  margin-top: 5px !important;
-}
-
-.upload-volume .listView-container {
-  width: 823px;
-  margin: 71px 0 20px 28px;
-  border: 1px solid #dadada;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.upload-volume div.list-view .data-table div.fixed-header {
-  top: 115px !important;
-  left: 56px !important;
-  background: #ffffff !important;
-}
-
-.upload-volume .data-table table.body {
-  margin-top: 66px !important;
-  margin-left: 19px;
-}
-
-.upload-volume .list-view .toolbar {
-  top: 118px;
-  left: 43px;
-  width: 801px;
-  border: 0;
-  background: transparent;
-}
-
-.upload-volume .top-fields {
-  float: left;
-  clear: none;
-  margin-left: 24px;
-}
-
-.upload-volume .top-fields .field {
-  float: left;
-  margin-right: 50px;
-}
-
-.upload-volume .top-fields input {
-  float: right;
-  /*+border-radius:3px;*/
-  width: 186px;
-  padding: 2px;
-  border-radius: 3px;
-  border-radius: 3px 3px 3px 3px;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.upload-volume .top-fields label,
-.upload-volume .desc {
-  display: block;
-  float: left;
-  padding: 6px;
-  font-size: 12px;
-  color: #4c5d6c;
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  -o-text-shadow: 0 0 #ffffff;
-}
-
-.upload-volume .desc {
-  position: absolute;
-  top: 79px;
-  left: 32px;
-  width: 825px;
-  border-top: 1px solid #cfcfcf;
-  text-align: left;
-}
-
-.network-chart {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  background: url("../images/bg-network.png") no-repeat 38% 70px;
-}
-
-.network-chart.static-nat {
-  background: url("../images/bg-network-nat.png") no-repeat 31% 62px;
-}
-
-.network-chart ul {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 536px;
-  height: 421px;
-}
-
-.network-chart li {
-  display: block;
-  width: 147px;
-  height: 86px;
-  background: url("../images/buttons.png") no-repeat 0 -399px;
-}
-
-.network-chart li.static-nat-enabled {
-  /*+placement:shift 31px 44px;*/
-  position: relative;
-  top: 44px;
-  left: 31px;
-}
-
-.network-chart li.static-nat-enabled .vmname {
-  /*+placement:shift 16px 41px;*/
-  position: relative;
-  position: absolute;
-  top: 41px;
-  left: 16px;
-  max-width: 98px;
-  max-height: 21px;
-  padding: 7px;
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  background: url("../images/bg-gradients.png") repeat-x 2px -221px;
-  font-size: 10px;
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  color: #485563;
-  color: #ffffff;
-  text-shadow: 0 1px 1px #000000;
-  cursor: pointer;
-  overflow: hidden;
-  -moz-text-shadow: 0 1px 1px #000000;
-  /*+border-radius:9px;*/
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.network-chart li.static-nat-enabled .vmname:hover {
-  background-position: 0 -946px;
-}
-
-.network-chart li.static-nat-enabled .name {
-  background: url("../images/sprites.png") no-repeat -6px -460px;
-}
-
-.network-chart li.static-nat-enabled .name span {
-  padding: 0 0 0 25px;
-  font-size: 11px;
-}
-
-.network-chart li.disabled {
-  /*+opacity:100%;*/
-  opacity: 1;
-  filter: alpha(opacity=100);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
-  -moz-opacity: 1;
-}
-
-.network-chart li.firewall {
-  /*+placement:shift 282px 188px;*/
-  position: relative;
-  position: absolute;
-  top: 188px;
-  left: 356px;
-}
-
-.network-chart li.loadBalancing {
-  /*+placement:shift 167px 342px;*/
-  position: relative;
-  position: absolute;
-  top: 342px;
-  left: 237px;
-}
-
-.network-chart li.portForwarding {
-  /*+placement:shift 401px 342px;*/
-  position: relative;
-  position: absolute;
-  top: 342px;
-  left: 480px;
-}
-
-.network-chart li .name {
-  position: relative;
-  top: 11px;
-  /*+text-shadow:0px 1px 1px #FCFCFC;*/
-  left: 10px;
-  width: 130px;
-  color: #4e5f6f;
-  text-shadow: 0 1px 1px #fcfcfc;
-  /*+placement:shift 10px 11px;*/
-  -moz-text-shadow: 0 1px 1px #fcfcfc;
-  -webkit-text-shadow: 0 1px 1px #fcfcfc;
-  -o-text-shadow: 0 1px 1px #fcfcfc;
-}
-
-.network-chart li.disabled .name {
-  position: relative;
-  /*+placement:shift 5px 32px;*/
-  top: 32px;
-  left: 5px;
-  color: #8695a5;
-  text-align: center;
-  text-decoration: line-through;
-}
-
-.network-chart li .view-details {
-  /*+placement:anchor-bottom-right 34px 19px;*/
-  position: absolute;
-  right: 34px;
-  bottom: 19px;
-  padding: 8px 20px;
-  border: 1px solid #a2a2a2;
-  border-radius: 4px;
-  background: #f7f7f7;
-  background: #f7f7f7;
-  background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlYWVhZWEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+");
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #f7f7f7), color-stop(100%, #eaeaea));
-  background: -webkit-linear-gradient(top, #f7f7f7 1%, #eaeaea 100%);
-  background: linear-gradient(to bottom, #f7f7f7 1%, #eaeaea 100%);
-  font-size: 11px;
-  color: #000000;
-  cursor: pointer;
-  /*+border-radius:4px;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.network-chart li .view-details:hover {
-  box-shadow: inset 0 0 4px #000000;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  background: #d5d5d5;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:inset 0px 0px 4px #000000;*/
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-box-shadow: inset 0 0 4px #000000;
-  -webkit-box-shadow: inset 0 0 4px #000000;
-  -o-box-shadow: inset 0 0 4px #000000;
-}
-
-.network-chart li.disabled .view-details {
-  display: none;
-}
-
-.system-dashboard {
-  display: block;
-  position: relative;
-  width: 962px;
-  /*+border-radius:3px;*/
-  height: 258px;
-  margin: 18px 0 0 15px;
-  border-radius: 3px;
-  box-shadow: inset 0 0 1px #ffffff;
-  /*+box-shadow:inset 0px 0px 1px #FFFFFF;*/
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: inset 0 0 1px #ffffff;
-  -webkit-box-shadow: inset 0 0 1px #ffffff;
-  -o-box-shadow: inset 0 0 1px #ffffff;
-}
-
-.system-dashboard.zone {
-  height: 609px;
-  background-position: 0 -1423px;
-}
-
-.system-dashboard-view .toolbar {
-  position: relative;
-}
-
-.system-dashboard .head {
-  padding: 0 0 12px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  box-shadow: 0 0 1px #ffffff;
-  color: #000000;
-  text-indent: 11px;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:0px 0px 1px #FFFFFF;*/
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-box-shadow: 0 0 1px #ffffff;
-  -webkit-box-shadow: 0 0 1px #ffffff;
-  -o-box-shadow: 0 0 1px #ffffff;
-}
-
-.project-view .system-dashboard .head {
-  padding-top: 14px;
-  /*+text-shadow:0px -1px #000000;*/
-  box-shadow: none;
-  color: #ffffff;
-  text-shadow: 0 -1px #000000;
-  -moz-text-shadow: 0 -1px #000000;
-  /*+box-shadow:none;*/
-  -webkit-text-shadow: 0 -1px #000000;
-  -o-text-shadow: 0 -1px #000000;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.system-dashboard .view-more,
-.system-dashboard .view-all {
-  float: right;
-  margin: -4px 19px 0 0;
-  border: 1px solid #b5b5b5;
-  border-radius: 3px;
-  border-radius: 3px 3px 3px 3px;
-  background: #dadada repeat-x 0 -735px;
-  background: #eaeaea;
-  background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZWFlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNkNmQ2ZDYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+");
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaeaea), color-stop(100%, #d6d6d6));
-  background: -webkit-linear-gradient(top, #eaeaea 0%, #d6d6d6 100%);
-  background: linear-gradient(to bottom, #eaeaea 0%, #d6d6d6 100%);
-  font-size: 13px;
-  /*+border-radius:3px;*/
-  font-weight: 100;
-  cursor: pointer;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eaeaea', endColorstr='#d6d6d6', GradientType=0);
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.system-dashboard .view-more:hover,
-.system-dashboard .view-all:hover {
-  box-shadow: inset 0 1px 1px #000000;
-  /*+box-shadow:inset 0px 1px 1px #000000;*/
-  background: #c1c1c1;
-  background-position: 0 -763px;
-  -moz-box-shadow: inset 0 1px 1px #000000;
-  -webkit-box-shadow: inset 0 1px 1px #000000;
-  -o-box-shadow: inset 0 1px 1px #000000;
-}
-
-.system-dashboard .status_box .view-all {
-  /*+placement:shift 18px 110px;*/
-  position: relative;
-  position: absolute;
-  top: 110px;
-  left: 18px;
-  width: 83%;
-  padding: 8px 0;
-  text-align: center;
-}
-
-.system-dashboard .status_box {
-  margin: 10px 0 0;
-  border: 0;
-  background: transparent;
-  font-size: 14px;
-}
-
-.system-dashboard .status_box li {
-  position: relative;
-  float: left;
-  width: 228px;
-  height: 178px;
-  /*+border-radius:3px;*/
-  margin: 0 0 0 8px;
-  padding: 0;
-  border: 1px solid #c6c6c6;
-  border-radius: 3px;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.system-dashboard.zone .status_box li {
-  height: 152px;
-  margin-bottom: 8px;
-  background-color: #f4f4f4;
-}
-
-.system-dashboard.zone .status_box li .icon {
-  opacity: 0.56;
-  position: relative;
-  /*+placement:shift 31px 19px;*/
-  position: absolute;
-  top: 19px;
-  left: 51px;
-  padding: 65px 80px 5px;
-  /*+opacity:56%;*/
-  background: url("../images/infrastructure-icons.png") no-repeat 0 0;
-  filter: alpha(opacity=56);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=56);
-  -moz-opacity: 0.56;
-}
-
-.system-dashboard .status_box li span.label {
-  font-size: 12px;
-  color: #cccfd4;
-}
-
-.system-dashboard .status_box li span.total {
-  font-size: 25px;
-}
-
-.system-dashboard .status_box li span.label {
-  font-size: 12px;
-  color: #cccfd4;
-}
-
-.system-dashboard .status_box li span.unit {
-  font-size: 13px;
-  color: #c1c4c9;
-}
-
-.system-dashboard .status_box li span.header {
-  position: relative;
-  /*+placement:shift 13px 5px;*/
-  top: 13px;
-  left: 13px;
-  margin: 1px 0 0;
-  font-weight: 100;
-}
-
-.system-dashboard.zone .status_box li span.header {
-  font-size: 14px;
-  color: #4f4f4f;
-}
-
-.system-dashboard .status_box li span.status {
-  position: relative;
-  /*+placement:shift 13px 141px;*/
-  position: absolute;
-  top: 141px;
-  left: 13px;
-  font-size: 27px;
-  color: #25ff25;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.system-dashboard .status_box li span.instance.total {
-  /*+placement:shift 12px 32px;*/
-  position: relative;
-  position: absolute;
-  top: 32px;
-  left: 12px;
-}
-
-.system-dashboard .status_box li span.instance.label {
-  /*+placement:shift 15px 53px;*/
-  position: relative;
-  position: absolute;
-  top: 53px;
-  left: 15px;
-}
-
-.system-dashboard .status_box li span.vcpu-hours.total {
-  /*+placement:shift 13px 76px;*/
-  position: relative;
-  position: absolute;
-  top: 76px;
-  left: 13px;
-}
-
-.system-dashboard .status_box li span.vcpu-hours.label {
-  /*+placement:shift 14px 95px;*/
-  position: relative;
-  position: absolute;
-  top: 95px;
-  left: 14px;
-}
-
-.system-dashboard .status_box li span.gb-hours.total {
-  /*+placement:shift 106px 77px;*/
-  position: relative;
-  position: absolute;
-  top: 77px;
-  left: 106px;
-}
-
-.system-dashboard .status_box li span.gb-hours.label {
-  /*+placement:shift 106px 95px;*/
-  position: relative;
-  position: absolute;
-  top: 95px;
-  left: 106px;
-}
-
-.system-dashboard .status_box li span.overview.total {
-  position: relative;
-  /*+placement:shift 9px 29px;*/
-  position: absolute;
-  top: 29px;
-  left: 9px;
-  font-size: 56px;
-  font-weight: 100;
-  color: #2b7daf;
-  /*+text-shadow:0px -1px 2px #FFFFFF;*/
-  text-shadow: 0 -1px 2px #ffffff;
-  -moz-text-shadow: 0 -1px 2px #ffffff;
-  -webkit-text-shadow: 0 -1px 2px #ffffff;
-  -o-text-shadow: 0 -1px 2px #ffffff;
-}
-
-.system-dashboard .status_box li.capacity span.overview.total {
-  font-size: 32px;
-}
-
-.system-dashboard .status_box li span.overview.label {
-  /*+placement:shift 52px 79px;*/
-  position: relative;
-  position: absolute;
-  top: 79px;
-  left: 52px;
-}
-
-.system-dashboard .status_box li span.used.total {
-  /*+placement:shift 14px 130px;*/
-  position: relative;
-  position: absolute;
-  top: 130px;
-  left: 14px;
-  font-size: 30px;
-}
-
-.system-dashboard .status_box li span.used.label {
-  /*+placement:shift 14px 153px;*/
-  position: relative;
-  position: absolute;
-  top: 153px;
-  left: 14px;
-}
-
-.system-dashboard .status_box li span.used.unit {
-  /*+placement:shift 67px 135px;*/
-  position: relative;
-  position: absolute;
-  top: 135px;
-  left: 67px;
-}
-
-.system-dashboard .status_box li span.available.unit {
-  /*+placement:shift 159px 135px;*/
-  position: relative;
-  position: absolute;
-  top: 135px;
-  left: 159px;
-}
-
-.system-dashboard .status_box li span.available.total {
-  /*+placement:shift 97px 130px;*/
-  position: relative;
-  position: absolute;
-  top: 130px;
-  left: 97px;
-  font-size: 30px;
-}
-
-.system-dashboard .status_box li span.available.label {
-  /*+placement:shift 97px 153px;*/
-  position: relative;
-  position: absolute;
-  top: 153px;
-  left: 97px;
-}
-
-.system-dashboard-view .socket-info {
-  float: left;
-  width: 100%;
-  height: 239px;
-  padding: 0;
-  overflow: auto;
-}
-
-.system-dashboard-view .socket-info > .title {
-  padding: 8px;
-  font-size: 13px;
-}
-
-.system-dashboard-view .socket-info li {
-  float: left;
-  width: 139px;
-  /*+border-radius:3px;*/
-  margin: 7px;
-  padding: 13px;
-  border: 1px solid #cccccc;
-  border-radius: 3px;
-  background: #efefef;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.system-dashboard-view .socket-info li > div {
-  float: left;
-  text-decoration: none;
-}
-
-.system-dashboard-view .socket-info li .name {
-  width: 100%;
-  margin-bottom: 13px;
-  font-weight: 100;
-}
-
-.system-dashboard-view .socket-info li .hosts,
-.system-dashboard-view .socket-info li .sockets {
-  width: 54px;
-  /*[empty]color:;*/
-}
-
-.system-dashboard-view .socket-info li div .title {
-  padding-bottom: 3px;
-  border: 0;
-  font-size: 13px;
-  color: #424242;
-}
-
-.add-zone-resource .form-container {
-  display: inline-block;
-  height: auto !important;
-  overflow: visible;
-}
-
-.add-zone-resource .form-container form {
-  display: inline-block;
-  height: auto;
-}
-
-.add-zone-resource .head {
-  display: inline-block;
-  width: 100%;
-  margin-bottom: 7px;
-  border-bottom: 1px solid #afbdca;
-  /*+box-shadow:0px 1px #FFFFFF;*/
-  box-shadow: 0 1px #ffffff;
-  -moz-box-shadow: 0 1px #ffffff;
-  -webkit-box-shadow: 0 1px #ffffff;
-  -o-box-shadow: 0 1px #ffffff;
-}
-
-.add-zone-resource .head span {
-  float: left;
-  padding: 10px 0 18px;
-  font-size: 14px;
-  text-indent: 5px;
-}
-
-.add-zone-resource .head select {
-  float: left;
-  margin: -3px 0 6px 13px;
-  margin: 8px 0 0 9px;
-}
-
-/** Infrastructure icons*/
-.system-dashboard.zone .status_box li.zones .icon {
-  background-position: -36px -105px;
-}
-
-.system-dashboard.zone .status_box li.pods .icon {
-  background-position: -229px -105px;
-}
-
-.system-dashboard.zone .status_box li.clusters .icon {
-  background-position: -411px -96px;
-}
-
-.system-dashboard.zone .status_box li.hosts .icon {
-  background-position: -601px -102px;
-}
-
-.system-dashboard.zone .status_box li.primary-storage .icon {
-  position: relative;
-  /*+placement:shift 37px 68px;*/
-  top: 68px;
-  left: 37px;
-  background-position: -32px -404px;
-}
-
-.system-dashboard.zone .status_box li.sockets .icon {
-  background-position: -14px -581px;
-}
-
-.system-dashboard.zone .status_box li.secondary-storage .icon {
-  position: relative;
-  /*+placement:shift 37px 68px;*/
-  top: 68px;
-  left: 37px;
-  background-position: -216px -404px;
-}
-
-.system-dashboard.zone .status_box li.system-vms .icon,
-.system-dashboard.zone .status_box li.management-servers .icon {
-  background-position: -408px -399px;
-}
-
-.system-dashboard.zone .status_box li.virtual-routers .icon {
-  background-position: -601px -400px;
-}
-
-#header .view-switcher {
-  float: left;
-  margin: 11px 0 0 18px;
-  font-size: 12px;
-  color: #55687b;
-}
-
-#header div.view-switcher {
-  display: none;
-  position: relative;
-  /*+placement:shift 0px -10px;*/
-  top: -10px;
-  left: 0;
-  height: 39px;
-  margin-right: 9px;
-  background-position: 0 -5px;
-}
-
-#header div.view-switcher.alt {
-  background-position: 0 -41px;
-}
-
-#header div.view-switcher div {
-  position: relative;
-  /*[empty]display:;*/
-  float: left;
-  width: 126px;
-  margin: 0;
-  padding: 13px 0 0;
-  text-indent: 17px;
-  /*+text-shadow:0px -1px 1px #2D2D2D;*/
-  text-shadow: 0 -1px 1px #2d2d2d;
-  -moz-text-shadow: 0 -1px 1px #2d2d2d;
-  -webkit-text-shadow: 0 -1px 1px #2d2d2d;
-  -o-text-shadow: 0 -1px 1px #2d2d2d;
-}
-
-#header div.view-switcher .select.active {
-  font-weight: bold;
-  color: #ffffff;
-  /*+text-shadow:0px -1px 1px #5B5B5B;*/
-  text-shadow: 0 -1px 1px #5b5b5b;
-  -moz-text-shadow: 0 -1px 1px #5b5b5b;
-  -webkit-text-shadow: 0 -1px 1px #5b5b5b;
-  -o-text-shadow: 0 -1px 1px #5b5b5b;
-}
-
-#header div.view-switcher div span.icon {
-  position: relative;
-  top: 0;
-  top: 0;
-  left: -4px;
-  width: 10px;
-  /*+placement:shift -4px 0px;*/
-  height: 10px;
-  padding: 0 19px 0 0;
-  background: url("../images/icons.png") no-repeat;
-}
-
-#header div.view-switcher div.default-view span.icon {
-  background-position: -23px 0;
-}
-
-#header div.view-switcher div.project-view span.icon {
-  background-position: -24px 0 !important;
-}
-
-#header div.view-switcher div.select span.icon {
-  background-position: -47px 0;
-}
-
-#header .view-switcher span {
-  padding: 0 13px 0 0;
-  background-repeat: repeat-x;
-}
-
-#header .view-switcher select {
-  max-width: 120px;
-  margin: 6px 3px 0 -21px;
-  padding: 3px 0 4px;
-}
-
-/*** View switcher (drop-down)*/
-.project-switcher,
-.domain-switcher {
-  float: left;
-  width: 223px;
-  padding: 9px 17px 0 19px;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.project-switcher label,
-.domain-switcher label {
-  float: left;
-  top: 29px;
-  margin-top: 5px;
-  margin-right: 7px;
-  font-size: 13px;
-  color: #ffffff;
-}
-
-.project-switcher select,
-.domain-switcher select {
-  float: left;
-  width: 70%;
-  margin-top: 0;
-  border: 1px solid #393939;
-  /*+text-shadow:0px -1px 1px #373737;*/
-  background: #515151;
-  font-size: 13px;
-  font-weight: 100;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #373737;
-  -moz-text-shadow: 0 -1px 1px #373737;
-  -webkit-text-shadow: 0 -1px 1px #373737;
-  -o-text-shadow: 0 -1px 1px #373737;
-}
-
-.project-selector {
-  display: inline-block;
-}
-
-.project-selector-dialog .ui-widget-content {
-  padding: 0 !important;
-}
-
-.project-selector .toolbar {
-  position: relative;
-  width: 420px;
-  border: 0;
-  border-bottom: 1px solid #93a4b4;
-  box-shadow: 0 2px #ffffff;
-  /*+box-shadow:0px 2px #FFFFFF;*/
-  background: transparent;
-  -moz-box-shadow: 0 2px #ffffff;
-  -webkit-box-shadow: 0 2px #ffffff;
-  -o-box-shadow: 0 2px #ffffff;
-  -moz-box-shadow: 0 2px 0 #ffffff;
-  -webkit-box-shadow: 0 2px 0 #ffffff;
-  -o-box-shadow: 0 2px 0 #ffffff;
-}
-
-.project-selector .search input[type='text'] {
-  /*+border-radius:3px;*/
-  float: left;
-  width: 192px;
-  height: 18px;
-  margin: 6px 0 0 105px;
-  border: 1px solid #9dadbb;
-  border-radius: 3px;
-  border-radius: 3px 3px 3px 3px;
-  box-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:0px 1px 1px #FFFFFF;*/
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: 0 1px 1px #ffffff;
-  -webkit-box-shadow: 0 1px 1px #ffffff;
-  -o-box-shadow: 0 1px 1px #ffffff;
-}
-
-.project-selector .search input[type='submit'] {
-  display: block;
-  position: relative;
-  float: left;
-  top: 0;
-  left: -2px;
-  width: 25px;
-  height: 22px;
-  margin: 6px 0 0;
-  border: 0;
-  /*+placement:shift -2px 0px;*/
-  border-left: 1px solid #283979;
-  background: url("../images/sprites.png") no-repeat -601px -328px;
-  cursor: pointer;
-  cursor: pointer;
-}
-
-.project-selector .listing {
-  position: relative;
-  margin: 15px;
-  border: 1px solid #d0d0d0;
-}
-
-.project-selector .listing .data {
-  width: 100%;
-  height: 275px;
-  margin: 18px 0 0;
-  background: #f2f0f0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.project-selector .listing .data ul {
-  font-size: 11px;
-  text-align: left;
-}
-
-.project-selector .listing .data ul li {
-  padding: 10px 0 10px 7px;
-  font-size: 12px;
-  cursor: pointer;
-}
-
-.project-selector .listing .data ul li.odd {
-  background: #dfe1e3;
-}
-
-.project-selector .listing .data ul li:hover {
-  padding: 9px 0 9px 7px;
-  border-top: 1px solid #ffffff;
-  border-bottom: 1px solid #babfd9;
-  background: #cbddf3;
-}
-
-.project-selector .listing .header {
-  position: absolute;
-  left: 0;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  width: 379px;
-  padding: 3px 2px 3px 7px;
-  border-bottom: 1px solid #ffffff;
-  background: url("../images/bg-gradients.png") repeat-x 0 -164px;
-  font-size: 11px;
-  color: #4f6171;
-  text-align: left;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.project-selector .button.cancel {
-  float: none;
-  top: -8px;
-  left: 170px;
-  width: 54px;
-  margin: auto auto 17px;
-  padding: 8px 20px;
-  border: 1px solid #aaaaaa;
-  border-radius: 4px 4px 4px 4px;
-  background: #b6b6b6 url("../images/gradients.png") repeat 0 -480px;
-  font-size: 13px;
-  font-weight: bold;
-  color: #808080;
-  color: #838181;
-  cursor: pointer;
-}
-
-.project-selector .button.cancel:hover {
-  color: #3a3a3a;
-}
-
-.project-dashboard .resources form {
-  display: inline-block;
-  width: 87%;
-  /*+border-radius:11px;*/
-  margin-top: 17px;
-  margin-left: 22px;
-  padding: 26px;
-  border-radius: 11px;
-  border-radius: 11px 11px 11px 11px;
-  box-shadow: inset 0 3px 4px #979797;
-  background: #ffffff;
-  -moz-border-radius: 11px;
-  /*+box-shadow:inset 0px 3px 4px #979797;*/
-  -webkit-border-radius: 11px;
-  -khtml-border-radius: 11px;
-  -moz-box-shadow: inset 0 3px 4px #979797;
-  -webkit-box-shadow: inset 0 3px 4px #979797;
-  -o-box-shadow: inset 0 3px 4px #979797;
-}
-
-.project-dashboard .resources form .field {
-  float: left;
-  clear: both;
-  width: 100%;
-  margin: auto auto 30px;
-}
-
-.project-dashboard .resources form label {
-  float: left;
-}
-
-.project-dashboard .resources form input[type='text'] {
-  float: right;
-  width: 176px;
-  margin: 0 287px 0 0;
-  padding: 6px;
-  /*+border-radius:4px;*/
-  border: 1px solid #c6c6c6;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  font-size: 16px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.project-dashboard .resources form input[type='submit'] {
-  display: block;
-  float: left;
-  clear: both;
-  padding: 9px 20px;
-  border: 0;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  background: transparent url("../images/bg-gradients.png") 0 -220px;
-  color: #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.detail-view .project-dashboard .resources form {
-  width: 83%;
-  border-bottom: 1px solid #dbdbdb;
-}
-
-.detail-view .project-dashboard .resources form .field input {
-  margin-right: 105px;
-}
-
-/*** Dashboard*/
-.project-dashboard .toolbar {
-  position: relative;
-}
-
-.project-dashboard .ui-tabs {
-  /*+placement:shift 10px -31px;*/
-  position: relative;
-  top: -31px;
-  left: 10px;
-}
-
-.project-view .project-dashboard .ui-tabs .multi-edit table td {
-  background: #eaeaea;
-}
-
-.project-dashboard-view .overview-area {
-  float: left;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard,
-.project-dashboard-view .users .system-dashboard {
-  float: left;
-  width: 510px;
-  height: 230px;
-  background: #777e88;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard ul,
-.project-dashboard-view .users .system-dashboard ul {
-  height: 162px;
-  margin: 14px 0 0;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li,
-.project-dashboard-view .users .system-dashboard li {
-  width: 156px;
-  height: 161px;
-  background: #3d4045;
-  color: #ffffff;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .icon,
-.project-dashboard-view .users li .icon {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 27px 20px;*/
-  top: 20px;
-  left: 27px;
-  width: 100px;
-  height: 76px;
-  background: url("../images/sprites.png") no-repeat 2px -1039px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.storage .icon {
-  background-position: -89px -1036px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.bandwidth .icon {
-  background-position: -184px -1036px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview {
-  position: relative;
-  width: 100%;
-  height: 53px;
-  margin: 81px 0 0;
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.storage .overview .total {
-  position: relative;
-  /*+placement:shift 30px 21px;*/
-  position: absolute;
-  top: 21px;
-  left: 30px;
-  font-size: 28px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.storage .overview .label {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 91px 33px;*/
-  top: 33px;
-  left: 91px;
-  font-size: 13px;
-  color: #c3c1c1;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item {
-  float: left;
-  margin: 12px 0 0 20px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item .total {
-  font-size: 24px;
-  font-weight: bold;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item .label {
-  margin: 4px 0 0;
-  font-size: 11px;
-  color: #c7c7c7;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item.running .label {
-  color: #2bff2b;
-  /*[empty]background-position:;*/
-}
-
-.project-dashboard-view .users .system-dashboard {
-  clear: both;
-  width: 509px;
-  height: 100%;
-}
-
-.project-dashboard-view .users .system-dashboard ul {
-  overflow-y: auto;
-}
-
-.project-dashboard-view .users .system-dashboard li {
-  width: 86px;
-  height: 138px;
-  margin-bottom: 24px;
-  margin-left: 6px;
-}
-
-.project-dashboard-view .users .system-dashboard li .icon {
-  left: 16px;
-  background-position: -306px -1044px;
-}
-
-.project-dashboard-view .users .system-dashboard li .header {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 7px 110px;*/
-  top: 110px;
-  left: 7px;
-  width: 77px;
-  max-width: 77px;
-  white-space: nowrap;
-  text-align: center;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.info-boxes {
-  float: right;
-  width: 233px;
-  height: 551px;
-  margin: 21px 5px 0 0;
-}
-
-.info-boxes .info-box {
-  display: inline-block;
-  border: 1px solid #b3c3d0;
-  /*+box-shadow:inset 0px -1px 7px #A7A7A7;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 -1px 7px #a7a7a7;
-  background: #ffffff;
-  -moz-box-shadow: inset 0 -1px 7px #a7a7a7;
-  /*+border-radius:4px;*/
-  -webkit-box-shadow: inset 0 -1px 7px #a7a7a7;
-  -o-box-shadow: inset 0 -1px 7px #a7a7a7;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.info-boxes .info-box.events {
-  width: 228px;
-  height: 323px;
-  margin-top: 4px;
-}
-
-.info-boxes .info-box.events ul {
-  max-height: 295px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.info-boxes .info-box ul {
-  display: inline-block;
-  height: auto;
-  margin: 0 0 3px 2px;
-}
-
-.info-boxes .info-box ul li {
-  display: inline-block;
-  width: 224px;
-  margin: 0 2px 0 0;
-  border-top: 1px solid #ffffff;
-  border-bottom: 1px solid #bdd2df;
-}
-
-.info-boxes .info-box ul li.odd {
-  background: #ececec;
-}
-
-.info-boxes .info-box .button {
-  float: right;
-  margin: 0 14px 0 0;
-  padding: 2px 6px 3px 3px;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  border: 1px solid #82a3c7;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px 1px #85acc4;
-  /*+border-radius:4px;*/
-  background: url("../images/bg-gradients.png") 0 -734px;
-  font-size: 10px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 1px 1px #000000;
-  /*+box-shadow:inset 0px 1px 1px #85ACC4;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px 1px #85acc4;
-  -webkit-box-shadow: inset 0 1px 1px #85acc4;
-  -o-box-shadow: inset 0 1px 1px #85acc4;
-}
-
-.info-boxes .info-box .button span {
-  /*+placement:shift 0px 2px;*/
-  position: relative;
-  float: left;
-  top: 2px;
-  left: 0;
-}
-
-.info-boxes .info-box .title .button {
-  margin: 4px 6px 0 3px;
-}
-
-.info-boxes .info-box .title .button span {
-  position: relative;
-  top: 1px;
-  left: 1px;
-  margin: 0;
-  /*+placement:shift 1px 1px;*/
-  padding: 0;
-  font-size: 10px;
-  color: #ffffff;
-}
-
-.info-boxes .info-box .button:hover {
-  background-position: 0 -766px;
-}
-
-.info-boxes .info-box .button .arrow {
-  position: relative;
-  float: right;
-  top: 0;
-  /*+placement:shift 0px 0px;*/
-  left: 0;
-  width: 16px;
-  height: 13px;
-  background: url("../images/sprites.png") no-repeat -455px -84px;
-}
-
-.info-boxes .info-box ul li .total,
-.info-boxes .info-box ul li .date {
-  position: relative;
-  float: left;
-  top: 0;
-  left: 0;
-  width: 52px;
-  height: 36px;
-  /*+placement:shift;*/
-  border-right: 1px solid #bdd2df;
-  font-size: 24px;
-  color: #647c91;
-  text-align: right;
-}
-
-.info-boxes .info-box ul li .date {
-  margin: 1px 0 0;
-  font-size: 11px;
-  text-align: center;
-}
-
-.info-boxes .info-box ul li .date span {
-  /*+placement:shift 0px 11px;*/
-  position: relative;
-  top: 11px;
-  left: 0;
-}
-
-.info-boxes .info-box ul li .desc {
-  display: inline-block;
-  position: relative;
-  /*+placement:shift 5px 8px;*/
-  top: 8px;
-  left: 5px;
-  max-width: 153px;
-  padding-bottom: 13px;
-  font-size: 12px;
-  white-space: nowrap;
-  color: #606060;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.info-boxes .info-box ul li .total span {
-  /*+placement:shift -5px 7px;*/
-  position: relative;
-  top: 7px;
-  left: -5px;
-}
-
-.info-boxes .info-box .title {
-  height: 27px;
-  border-bottom: 1px solid #bdd2df;
-}
-
-.info-boxes .info-box .title span {
-  /*+placement:shift 8px 6px;*/
-  position: relative;
-  top: 6px;
-  left: 8px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #4e748c;
-}
-
-.new-project {
-  display: inline-block;
-  margin: 0 0 20px 30px;
-}
-
-.new-project form {
-  margin: 0;
-}
-
-.ui-dialog .new-project {
-  text-align: left;
-}
-
-.ui-dialog .new-project .add-by {
-  margin-left: 11px;
-  font-size: 12px;
-  color: #5e6d7d;
-}
-
-.ui-dialog .new-project .add-by input {
-  margin-right: 8px;
-}
-
-.ui-dialog .new-project .add-by label {
-  margin-right: 12px;
-}
-
-.new-project .title {
-  margin: 10px 0 32px;
-  font-size: 26px;
-  /*+text-shadow:0px 1px 2px #D6D6D6;*/
-  letter-spacing: 0;
-  color: #3497e6;
-  text-shadow: 0 1px 2px #d6d6d6;
-  -moz-text-shadow: 0 1px 2px #d6d6d6;
-  -webkit-text-shadow: 0 1px 2px #d6d6d6;
-  -o-text-shadow: 0 1px 2px #d6d6d6;
-}
-
-.new-project .field {
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  display: inline-block;
-  width: 686px;
-  margin: -2px 0 -4px auto;
-  background: #dfdfdf;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-#new-project-review-tabs-resouces {
-  height: 225px;
-  background: #d2d2d2;
-}
-
-.new-project .resources .ui-widget-content {
-  background: #ffffff;
-}
-
-.new-project .resources .field {
-  height: 39px;
-  padding: 0;
-}
-
-.new-project .field span.value {
-  position: relative;
-  /*+placement:shift 21px 20px;*/
-  top: 20px;
-  left: 21px;
-  color: #475765;
-}
-
-.new-project .field label {
-  display: block;
-  float: left;
-  width: 104px;
-  height: 59px;
-  padding: 20px 24px 0 0;
-  background: #d2d2d2;
-  color: #5b5b5b;
-  text-align: right;
-}
-
-.new-project .resources .field label {
-  height: auto;
-  padding: 10px 14px 14px 40px;
-  font-size: 14px;
-}
-
-.new-project .field label.error {
-  position: absolute;
-  width: auto;
-  /*+placement:displace 154px 29px;*/
-  height: auto;
-  margin-top: 29px;
-  margin-left: 154px;
-  background: transparent;
-  font-size: 9px;
-  color: #ff0000;
-}
-
-.new-project .field input[type='text'] {
-  float: right;
-  /*+border-radius:5px;*/
-  width: 506px;
-  height: 20px;
-  margin: 17px 25px 0 0;
-  border: 1px solid #e2e1df;
-  border: 1px solid #c7c7c7;
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  /*+box-shadow:inset 0px 1px #A1A1A1;*/
-  box-shadow: inset 0 1px #a1a1a1;
-  background: #ffffff 0 7px;
-  font-size: 14px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-  -moz-box-shadow: inset 0 1px #a1a1a1;
-  -webkit-box-shadow: inset 0 1px #a1a1a1;
-  -o-box-shadow: inset 0 1px #a1a1a1;
-  -moz-box-shadow: inset 0 1px 0 #a1a1a1;
-  -webkit-box-shadow: inset 0 1px 0 #a1a1a1;
-  -o-box-shadow: inset 0 1px 0 #a1a1a1;
-}
-
-.new-project .resources .field input[type='text'] {
-  margin: 6px 9px 0 0;
-}
-
-.new-project .button.cancel {
-  position: relative;
-  float: left;
-  top: 9px;
-  left: 488px;
-  left: 480px;
-  margin: 19px 0 0 40px;
-  background: transparent;
-  /*+placement:shift 488px 9px;*/
-  font-size: 12px;
-  font-weight: bold;
-  color: #808080;
-  color: #838181;
-  cursor: pointer;
-}
-
-.new-project .button.cancel:hover {
-  color: #3a3a3a;
-}
-
-.new-project input[type='submit'],
-.new-project .button.confirm {
-  display: inline-block;
-  position: relative;
-  float: right;
-  /*+placement:float-right 63px 18px;*/
-  top: 18px;
-  left: 63px;
-  height: 31px;
-  margin: 0 63px 0 0;
-  border: 0;
-  /*+text-shadow:0px -1px 1px #465259;*/
-  border: 1px solid #0069cf;
-  border-top: 1px solid #0070fc;
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  background: #0049ff url("../images/gradients.png") 0 -317px;
-  font-size: 13px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #465259;
-  /*+border-radius:9px;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 -1px 1px #465259;
-  -webkit-text-shadow: 0 -1px 1px #465259;
-  -o-text-shadow: 0 -1px 1px #465259;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.new-project input[type='submit']:hover,
-.new-project .button.confirm:hover {
-  background-position: -3px -369px;
-}
-
-.new-project .button {
-  cursor: pointer;
-}
-
-.new-project .button.confirm {
-  display: block;
-  height: 27px;
-  padding: 13px 10px 0 12px;
-}
-
-.new-project .button.confirm.next {
-  padding: 10px 34px 0 29px;
-}
-
-.new-project .review .button.confirm.next {
-  /*+placement:shift 25px 11px;*/
-  position: relative;
-  top: 11px;
-  left: 25px;
-}
-
-.new-project .review .ui-tabs {
-  /*+placement:shift -29px -31px;*/
-  position: relative;
-  top: -31px;
-  left: -29px;
-}
-
-.new-project .review .ui-tabs .ui-widget-content {
-  width: 695px;
-  height: 185px;
-}
-
-.new-project .review .ui-tabs .ui-widget-content.ui-tabs-hide {
-  display: none;
-}
-
-.new-project .review .ui-tabs ul {
-  position: relative;
-  /*+placement:shift 0px -2px;*/
-  top: -2px;
-  left: 0;
-  text-align: left;
-}
-
-.new-project .review .ui-tabs .list-view {
-  width: 688px;
-  height: 185px !important;
-}
-
-.new-project .review .ui-tabs .list-view .fixed-header {
-  position: absolute;
-  z-index: 1000;
-  top: -22px;
-  height: 58px;
-  background: #ffffff;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table {
-  width: 669px;
-  margin: 31px 0 -1px;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table .edit {
-  position: relative;
-  top: 0;
-  /*+placement:shift 14px 0px;*/
-  left: 14px;
-  width: 132px;
-  background: #ffffff;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table .edit select {
-  float: left;
-  width: 95px;
-  height: 20px;
-  border: 1px solid #b2b2b2;
-  background: #ffffff;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table .edit .action {
-  position: relative;
-  float: left;
-  top: 0;
-  /*+placement:shift 14px 0px;*/
-  left: 14px;
-  height: 20px;
-  margin: 0;
-  padding: 0;
-}
-
-.new-project .review .ui-tabs .list-view .toolbar {
-  display: none;
-}
-
-.new-project .review .project-data {
-  position: relative;
-  top: -13px;
-  left: -19px;
-  /*+placement:shift -19px -13px;*/
-  margin: 0;
-  padding: 16px;
-  background: #f4f4f4;
-}
-
-.new-project .review .project-data .field {
-  width: 677px;
-  margin: auto;
-}
-
-.new-project .button.later {
-  float: right;
-  margin: 19px -40px 0 0;
-  padding: 13px 7px 14px 8px;
-  /*+box-shadow:inset 0px 2px 2px #FFFFFF;*/
-  border: 1px solid #b1b1b1;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  box-shadow: inset 0 2px 2px #ffffff;
-  background: url("../images/bg-gradients.png") 0 -261px;
-  font-size: 13px;
-  color: #808080;
-  -moz-box-shadow: inset 0 2px 2px #ffffff;
-  /*+border-radius:10px;*/
-  -webkit-box-shadow: inset 0 2px 2px #ffffff;
-  -o-box-shadow: inset 0 2px 2px #ffffff;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.new-project .button.later:hover {
-  box-shadow: inset 0 1px 1px #a1a1a1;
-  /*+box-shadow:inset 0px 1px 1px #A1A1A1;*/
-  background-position: 0 -86px;
-  color: #000000;
-  -moz-box-shadow: inset 0 1px 1px #a1a1a1;
-  -webkit-box-shadow: inset 0 1px 1px #a1a1a1;
-  -o-box-shadow: inset 0 1px 1px #a1a1a1;
-}
-
-.new-project input[type='submit']:hover {
-  background-position: -3px -369px;
-}
-
-.new-project .resources input[type='submit'] {
-  display: none;
-}
-
-.new-project .multi-edit {
-  width: 671px;
-}
-
-.new-project .multi-edit .data {
-  width: 700px;
-}
-
-.new-project .multi-edit .data .data-item {
-  margin: 0;
-  border: 0;
-  border: 1px solid #d2d2d2;
-}
-
-.new-project .multi-edit .data .data-item.even td {
-  background: #dfe1e3;
-}
-
-.tooltip-box {
-  display: inline-block;
-  width: 15%;
-  height: auto;
-  margin-left: 23px;
-  padding: 4px;
-  padding: 10px;
-  border: 1px solid #beb8b8;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  box-shadow: 0 1px 12px #353535;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 1px 12px #353535;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 1px 12px #353535;
-  -webkit-box-shadow: 0 1px 12px #353535;
-  -o-box-shadow: 0 1px 12px #353535;
-}
-
-.tooltip-box .arrow {
-  position: relative;
-  position: absolute;
-  top: 3px;
-  /*+placement:shift -16px 3px;*/
-  left: -16px;
-  width: 19px;
-  height: 30px;
-  background: url("../images/sprites.png") -585px -947px;
-}
-
-.tagger {
-  position: relative;
-  top: 0;
-  left: -4px;
-  width: 94%;
-  margin: auto;
-  /*+placement:shift -4px 0px;*/
-  padding-bottom: 12px;
-  border: 1px solid #cfc9c9;
-  background: #f2f0f0;
-}
-
-.tagger .field {
-  position: relative;
-  float: left;
-  width: 35%;
-}
-
-.tagger .tag-info {
-  margin-top: 12px;
-  margin-left: 8px;
-  font-size: 11px;
-  color: #757575;
-}
-
-.tagger .tag-info.title {
-  margin-bottom: 5px;
-  font-size: 11px;
-  color: #6f9bf0;
-}
-
-.tagger form {
-  margin: 12px 9px 0;
-}
-
-.tagger.readonly form {
-  display: none;
-}
-
-.tagger form label {
-  display: block;
-  position: relative;
-  float: left;
-  top: 8px;
-  left: 5px;
-  width: 25px;
-  margin-right: 9px;
-  /*+placement:shift 5px 8px;*/
-  font-size: 10px;
-  color: #394552;
-  text-align: right;
-}
-
-.tagger form label.error {
-  position: absolute;
-  top: 28px !important;
-  left: 44px;
-  color: #ff0000;
-  /*[empty]background-color:;*/
-}
-
-.tagger form input {
-  padding: 4px;
-  border: 1px solid #808080;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.tagger form input {
-  width: 45%;
-  margin-left: 9px;
-}
-
-.tagger form input[type='submit'] {
-  width: auto;
-  margin-left: 16px;
-  padding: 7px 25px 7px 26px;
-  /*+text-shadow:0px -1px 2px #000000;*/
-  border: 0;
-  border-radius: 4px;
-  background: url("../images/bg-gradients.png") repeat-x 0 -220px;
-  color: #ffffff;
-  text-shadow: 0 -1px 2px #000000;
-  /*+border-radius:4px;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 -1px 2px #000000;
-  -webkit-text-shadow: 0 -1px 2px #000000;
-  -o-text-shadow: 0 -1px 2px #000000;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.tagger form input[type='submit']:hover {
-  background-position: 0 -946px;
-}
-
-.tagger ul {
-  display: block;
-  width: 96%;
-  margin: 16px auto auto;
-  /*+border-radius:2px;*/
-  padding-bottom: 10px;
-  border: 1px solid #d2d2d2;
-  border-radius: 2px;
-  box-shadow: inset 0 0 10px #dcdcdc;
-  background: #ffffff;
-  overflow: auto;
-  -moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  /*+box-shadow:inset 0px 0px 10px #DCDCDC;*/
-  -khtml-border-radius: 2px;
-  -moz-box-shadow: inset 0 0 10px #dcdcdc;
-  -webkit-box-shadow: inset 0 0 10px #dcdcdc;
-  -o-box-shadow: inset 0 0 10px #dcdcdc;
-}
-
-.tagger ul li {
-  display: inline-block;
-  position: relative;
-  float: left;
-  top: 2px;
-  left: 0;
-  height: 15px;
-  margin-top: 5px;
-  margin-right: 2px;
-  /*+border-radius:4px;*/
-  margin-left: 7px;
-  padding: 0 18px 0 7px;
-  border-radius: 4px;
-  background: #dfdfdf 0 4px;
-  /*+placement:shift 0px 2px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.tagger ul li span {
-  color: #000000;
-}
-
-.tagger ul li span.label span.value {
-  max-width: 100px;
-  overflow: hidden;
-}
-
-.tagger ul li span.label {
-  position: relative;
-  top: -2px;
-  left: 15px;
-  font-size: 10px;
-}
-
-.tagger.readonly ul li span.label {
-  left: 6px;
-}
-
-.tagger ul li span.label > span {
-  display: block;
-  float: left;
-  margin-top: 2px;
-}
-
-.tagger ul li span.label > span.key {
-  max-width: 134px;
-  margin-right: 5px;
-  margin-left: 15px;
-  font-weight: bold;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.tagger ul li span.label > span.value {
-  max-width: 160px;
-  margin-left: 6px;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.tagger ul li span.remove {
-  display: block;
-  position: absolute !important;
-  top: 0 !important;
-  left: -3px !important;
-  width: 15px !important;
-  height: 11px !important;
-  padding: 4px 0 0 8px;
-  background: #dfdfdf;
-  font-size: 8px;
-  font-weight: bold;
-  color: #5b5b5b;
-  text-indent: 4px;
-  cursor: pointer;
-  overflow: hidden !important;
-}
-
-.tagger.readonly ul li span.remove {
-  display: none;
-}
-
-.tagger ul li span.remove:hover {
-  color: #000000;
-}
-
-/** Dialog tagger*/
-.ui-dialog .tagger {
-  width: 375px;
-}
-
-.ui-dialog .tagger .tag-info {
-  display: none;
-}
-
-.ui-dialog .tagger .tag-info.inside-form {
-  display: block;
-  text-align: left;
-}
-
-.ui-dialog.editTags .ui-button {
-  float: right;
-}
-
-.ui-dialog.editTags .ui-dialog-buttonpane {
-  float: right;
-}
-
-.ui-dialog .tagger .field {
-  width: 119px !important;
-}
-
-.ui-dialog .tagger input.key,
-.ui-dialog .tagger input.value {
-  width: 66px !important;
-  height: 15px;
-  font-size: 11px !important;
-}
-
-.ui-dialog .tagger input[type='submit'] {
-  padding: 6px 15px;
-}
-
-.vpc-chart {
-  position: relative;
-  width: 100%;
-  height: 94%;
-  margin: 30px 0 0;
-  background: #ffffff 0 24px;
-  overflow: auto;
-}
-
-.vpc-chart .vpc-title {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 11px 41px;*/
-  top: 41px;
-  left: 11px;
-  width: 210px;
-  font-size: 22px;
-  color: #5f768a;
-}
-
-.vpc-chart .vpc-title > span {
-  display: block;
-  float: left;
-  max-width: 160px;
-  overflow-x: auto;
-  overflow-y: hidden;
-}
-
-.vpc-chart .vpc-title .icon {
-  position: relative;
-  float: left;
-  top: -8px;
-  left: 6px;
-  /*+placement:shift 6px -8px;*/
-  margin-left: 10px;
-  padding: 7px 15px;
-  background: url("../images/sprites.png") no-repeat -145px -195px;
-  cursor: pointer;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip {
-  display: none;
-  position: absolute;
-  z-index: 2000;
-  width: 129px;
-  padding: 35px 10px 10px;
-  font-size: 14px;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip .arrow {
-  position: relative;
-  position: absolute;
-  z-index: 1;
-  /*+placement:shift 13px 26px;*/
-  top: 26px;
-  left: 13px;
-  width: 30px;
-  height: 20px;
-  background: #ffffff url("../images/sprites.png") no-repeat -589px -997px;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip ul {
-  position: relative;
-  top: -6px;
-  /*+border-radius:4px;*/
-  left: 0;
-  margin: 10px 0;
-  padding: 9px;
-  border: 1px solid #c2c2c2;
-  /*+placement:shift 0px -6px;*/
-  border-radius: 4px;
-  box-shadow: 0 1px 8px #cbcbcb;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 1px 8px #CBCBCB;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 1px 8px #cbcbcb;
-  -webkit-box-shadow: 0 1px 8px #cbcbcb;
-  -o-box-shadow: 0 1px 8px #cbcbcb;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip li {
-  padding: 3px 0 5px;
-  font-size: 12px;
-  cursor: pointer;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip li:hover {
-  font-weight: bold;
-}
-
-.vpc-chart ul.tiers {
-  margin: 79px 0 0 232px;
-  padding: 0 0 0 26px;
-  border-left: 3px solid #cccccc;
-}
-
-.vpc-chart li.tier {
-  display: block;
-  position: relative;
-  position: relative;
-  top: 58px;
-  /*+border-radius:4px;*/
-  left: 0;
-  width: 258px;
-  height: 107px;
-  margin: -55px 0 90px;
-  border: 1px solid #50545a;
-  border-radius: 4px;
-  /*+placement:shift 0px 58px;*/
-  box-shadow: 0 5px 7px #dadada;
-  background: url("../images/bg-gradients.png") 0 -2637px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 5px 7px #DADADA;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 5px 7px #dadada;
-  -webkit-box-shadow: 0 5px 7px #dadada;
-  -o-box-shadow: 0 5px 7px #dadada;
-}
-
-.vpc-chart li.tier .loading-overlay {
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.vpc-chart li.tier .connect-line {
-  position: absolute;
-  position: relative;
-  position: absolute;
-  top: 49px;
-  /*+placement:shift -29px 49px;*/
-  left: -29px;
-  width: 28px;
-  height: 3px;
-  background: #cccccc 0 -8px;
-}
-
-.vpc-chart li.tier span.title {
-  position: relative;
-  /*+placement:shift 8px 7px;*/
-  position: absolute;
-  top: 7px;
-  left: 8px;
-  padding: 3px;
-  font-size: 24px;
-  color: #ffffff;
-  text-decoration: underline;
-  /*+text-shadow:1px 2px 2px #000000;*/
-  text-shadow: 1px 2px 2px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 1px 2px 2px #000000;
-  -webkit-text-shadow: 1px 2px 2px #000000;
-  -o-text-shadow: 1px 2px 2px #000000;
-}
-
-.vpc-chart li.tier span.cidr {
-  /*+placement:shift 12px 46px;*/
-  position: relative;
-  position: absolute;
-  top: 46px;
-  left: 12px;
-  font-size: 14px;
-  /*+text-shadow:0px -1px 1px #343E4C;*/
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #343e4c;
-  -moz-text-shadow: 0 -1px 1px #343e4c;
-  -webkit-text-shadow: 0 -1px 1px #343e4c;
-  -o-text-shadow: 0 -1px 1px #343e4c;
-}
-
-.vpc-chart li.tier .actions {
-  position: relative;
-  position: absolute;
-  position: absolute;
-  /*+border-radius:0 0 4px 4px;*/
-  top: 71px;
-  left: -1px;
-  width: 258px;
-  height: 35px;
-  /*+placement:shift -1px 71px;*/
-  border: 1px solid #808080;
-  border-top: 1px solid #4c545e;
-  border-radius: 0 0 4px 4px;
-  box-shadow: inset 0 1px #ffffff;
-  /*+box-shadow:inset 0px 1px #FFFFFF;*/
-  background: #cccccc;
-  -moz-border-radius: 0 0 4px 4px;
-  -webkit-border-radius: 0 0 4px 4px;
-  -khtml-border-radius: 0 0 4px 4px;
-  -moz-box-shadow: inset 0 1px #ffffff;
-  -webkit-box-shadow: inset 0 1px #ffffff;
-  -o-box-shadow: inset 0 1px #ffffff;
-}
-
-.vpc-chart li.tier .actions .action {
-  float: left;
-  width: 50px;
-  height: 24px;
-  margin: 4px 0 4px 4px;
-  border: 1px solid #909090;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: url("../images/bg-gradients.png") 0 -2533px;
-  font-weight: bold;
-  color: #4b637a;
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.vpc-chart li.tier .actions .action.disabled,
-.vpc-chart li.tier .actions .action.disabled:hover {
-  border-color: #b5b5b5;
-  box-shadow: none;
-  /*+text-shadow:none;*/
-  background: #cfcfcf;
-  color: #9d9d9d;
-  text-shadow: none;
-  cursor: not-allowed;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  /*+box-shadow:none;*/
-  -o-text-shadow: none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.vpc-chart li.tier .actions .action:hover {
-  border: 1px solid #7a8b9a;
-  box-shadow: inset 1px 2px 4px #808080;
-  background-position: 0 -106px;
-  /*+box-shadow:inset 1px 2px 4px #808080;*/
-  color: #5b7a96;
-  -moz-box-shadow: inset 1px 2px 4px #808080;
-  -webkit-box-shadow: inset 1px 2px 4px #808080;
-  -o-box-shadow: inset 1px 2px 4px #808080;
-}
-
-.vpc-chart li.tier .actions .action span.label {
-  /*+placement:shift 1px 3px;*/
-  position: relative;
-  top: 3px;
-  left: 1px;
-  font-size: 11px;
-}
-
-.vpc-chart li.tier .actions .action.remove,
-.vpc-chart li.tier .actions .action.remove:hover {
-  position: relative;
-  float: right;
-  top: -2px;
-  left: -3px;
-  width: 30px;
-  /*+placement:shift -3px -2px;*/
-  padding: 0;
-  border: 0;
-  box-shadow: none;
-  /*+box-shadow:none;*/
-  background: none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.vpc-chart li.tier .action span.icon {
-  position: relative;
-  float: left;
-  top: 3px;
-  left: 1px;
-  width: 37px;
-  /*+placement:shift 1px 3px;*/
-  height: 23px;
-  background-image: url("../images/sprites.png");
-  cursor: pointer;
-}
-
-.vpc-chart li.tier .vm-count {
-  display: block;
-  position: absolute;
-  top: 3px;
-  left: 134px;
-  width: 100px;
-  /*+text-shadow:1px 2px 2px #000000;*/
-  margin: 4px;
-  padding: 5px;
-  border: 1px solid transparent;
-  font-size: 23px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: underline;
-  text-shadow: 1px 2px 2px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 1px 2px 2px #000000;
-  -webkit-text-shadow: 1px 2px 2px #000000;
-  -o-text-shadow: 1px 2px 2px #000000;
-}
-
-.vpc-chart li.tier.loading .vm-count {
-  padding-right: 10px;
-}
-
-.vpc-chart li.tier .vm-count .loading-overlay {
-  opacity: 1;
-  display: none;
-  position: absolute;
-  top: 7px;
-  left: 15px;
-  width: 24px;
-  /*+border-radius:12px;*/
-  height: 24px;
-  border-radius: 12px;
-  background-image: url("../images/ajax-loader-small.gif");
-  -moz-border-radius: 12px;
-  -webkit-border-radius: 12px;
-  /*+opacity:100%;*/
-  -khtml-border-radius: 12px;
-  filter: alpha(opacity=100);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
-  -moz-opacity: 1;
-}
-
-.vpc-chart li.tier.loading .vm-count .loading-overlay {
-  display: block;
-}
-
-.vpc-chart li.tier .vm-count:hover,
-.vpc-chart li.tier .title:hover {
-  border: 1px solid #4c545e;
-  border-radius: 4px;
-  background: url("../images/bg-gradients.png") 0 -2751px;
-}
-
-.vpc-chart li.tier .vm-count .total {
-  padding-right: 4px;
-  font-size: 24px;
-}
-
-.vpc-chart li.tier.placeholder {
-  border: dotted #acacac;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  box-shadow: none;
-  background: #ececec;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+box-shadow:none;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.vpc-chart li.tier.placeholder:hover {
-  box-shadow: 0 2px 8px #a7a7a7;
-  /*+box-shadow:0px 2px 8px #A7A7A7;*/
-  background: #d3d3d3;
-  -moz-box-shadow: 0 2px 8px #a7a7a7;
-  -webkit-box-shadow: 0 2px 8px #a7a7a7;
-  -o-box-shadow: 0 2px 8px #a7a7a7;
-}
-
-.vpc-chart li.tier.placeholder span {
-  top: 40px;
-  left: 66px;
-  color: #9f9f9f;
-  /*+text-shadow:none;*/
-  text-decoration: none;
-  text-shadow: none;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-.vpc-chart li.tier.placeholder:hover span {
-  border: 0;
-  /*+text-shadow:0px 0px 7px #FFFFFF;*/
-  background: none;
-  color: #000000;
-  text-shadow: 0 0 7px #ffffff;
-  -moz-text-shadow: 0 0 7px #ffffff;
-  -webkit-text-shadow: 0 0 7px #ffffff;
-  -o-text-shadow: 0 0 7px #ffffff;
-}
-
-.vpc-chart li.tier.virtual-router {
-  position: relative;
-  top: -36px;
-  left: 17px;
-  /*+placement:shift 17px -36px;*/
-  width: 222px;
-  height: 65px;
-  margin: 0;
-  border: 1px solid #adadad;
-  background-position: 0 -2519px;
-  cursor: pointer;
-}
-
-.vpc-chart li.tier.virtual-router:hover {
-  text-decoration: underline;
-}
-
-.vpc-chart li.tier.virtual-router.disabled:hover {
-  text-decoration: none;
-}
-
-.vpc-chart li.tier.virtual-router.disabled,
-.vpc-chart li.tier.virtual-router.disabled span {
-  cursor: default;
-}
-
-.vpc-chart li.tier.virtual-router span {
-  position: relative;
-  top: 22px;
-  /*+text-shadow:0px 1px 3px #FFFFFF;*/
-  left: 53px;
-  font-size: 18px;
-  color: #586e82;
-  text-decoration: none;
-  /*+placement:shift 53px 22px;*/
-  text-shadow: 0 1px 3px #ffffff;
-  -moz-text-shadow: 0 1px 3px #ffffff;
-  -webkit-text-shadow: 0 1px 3px #ffffff;
-  -o-text-shadow: 0 1px 3px #ffffff;
-}
-
-.vpc-chart li.tier.virtual-router span:hover {
-  border: 0;
-  background: none;
-}
-
-.vpc-chart li.tier.virtual-router .connect-line {
-  /*+placement:shift -47px 14px;*/
-  position: relative;
-  top: 14px;
-  left: -47px;
-  width: 46px;
-}
-
-/*VPC: Enable Static NAT fields*/
-.list-view.instances .filters.tier-select {
-  width: 246px;
-  margin: 1px 120px 0 19px;
-  padding: 2px 20px 2px 13px;
-}
-
-.list-view.instances .filters.tier-select label {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 3px #000000;*/
-  text-shadow: 0 1px 3px #000000;
-  -moz-text-shadow: 0 1px 3px #000000;
-  -webkit-text-shadow: 0 1px 3px #000000;
-  -o-text-shadow: 0 1px 3px #000000;
-}
-
-.list-view.instances .filters.tier-select select {
-  float: left;
-  width: 166px;
-}
-
-.ui-dialog.configure-acl .multi-edit {
-  width: 866px;
-}
-
-.ui-dialog.configure-acl .multi-edit table {
-  max-width: none;
-}
-
-.ui-dialog.configure-acl .multi-edit table select,
-.detail-view .acl .multi-edit select {
-  width: 76px;
-}
-
-.ui-dialog.configure-acl .ui-dialog-buttonpane {
-  /*+placement:shift 722px -2px;*/
-  position: relative;
-  top: -2px;
-  left: 722px;
-}
-
-.ui-dialog.configure-acl div.view.list-view {
-  max-height: 474px;
-}
-
-.ui-dialog.configure-acl .multi-edit .data {
-  width: 901px;
-  height: 370px;
-  margin: 0;
-  padding: 0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.ui-dialog.configure-acl .multi-edit .data .multi-actions {
-  min-width: none !important;
-  max-width: none !important;
-}
-
-.ui-dialog.configure-acl .view.list-view table.body tr td.actions {
-  width: 184px !important;
-  max-width: 184px !important;
-}
-
-div.ui-dialog div.acl div.multi-edit table.multi-edit thead tr th,
-div.ui-dialog div.acl div.multi-edit table.multi-edit tbody tr td {
-  min-width: 75px;
-}
-
-div.ui-dialog div.acl div.multi-edit div.data div.data-body div.data-item table tbody tr td {
-  width: 100%;
-  min-width: 77px;
-}
-
-.detail-view .acl .multi-edit th,
-.detail-view .acl .multi-edit td {
-  min-width: 25px !important;
-  padding-right: 0 !important;
-}
-
-.detail-view .acl .multi-edit th {
-  font-size: 10px;
-}
-
-.detail-view .acl .multi-edit input {
-  width: 50px;
-}
-
-.detail-view .acl .multi-edit .add-vm {
-  width: 51px;
-  padding-right: 0;
-  text-indent: 0;
-}
-
-.detail-view .acl .multi-edit td.multi-actions {
-  width: 65px;
-}
-
-.ui-dialog .health-check {
-  height: 295px !important;
-  padding-bottom: 93px;
-}
-
-div.ui-dialog div.health-check div.health-check-description {
-  color: #808080;
-}
-
-div.ui-dialog div.health-check div.form-container form div.form-item {
-  width: 58%;
-  margin-top: -16px;
-  margin-bottom: 30px;
-  margin-left: 116px;
-}
-
-div.ui-dialog div.health-check div.health-check-config-title {
-  float: left;
-  margin-left: 15px;
-  font-size: 17px;
-  color: #808080;
-}
-
-div.ui-dialog div.health-check div.health-check-advanced-title {
-  float: left;
-  margin-top: -70px;
-  margin-left: 15px;
-  font-size: 17px;
-  color: #808080;
-}
-
-.ui-dialog div.autoscaler {
-  max-height: 600px;
-  overflow: auto;
-}
-
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit tbody tr td,
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit thead tr th {
-  min-width: 80px;
-  max-width: 80px;
-  font-size: 10px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons {
-  float: right;
-  margin-right: 6px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons .action {
-  float: left;
-  width: 32px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='securityGroups'] {
-  display: block;
-  float: left;
-  width: 370px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='diskOfferingId'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  width: 370px;
-  margin-top: 1px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='minInstance'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='maxInstance'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -30px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='interval'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='quietTime'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpCommunity'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpPort'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.value select {
-  float: left;
-  width: 88%;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title {
-  margin-top: 40px;
-  margin-left: -650px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title label {
-  margin-right: 10px;
-  margin-left: 200px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.field-group.bottom-fields hr.policy-divider {
-  margin-top: 15px;
-  margin-bottom: -1px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title label {
-  margin-right: 10px;
-  margin-left: 170px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title {
-  margin-top: 10px;
-  margin-left: -620px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: -17px;
-  margin-left: 729px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.name {
-  margin-left: 420px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: -16px;
-  margin-left: 698px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.name {
-  margin-left: 420px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/minus.png") no-repeat 38% 59%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/minus.png") no-repeat 31% 54%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/sprites.png") repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/sprites.png") repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-item div.name label {
-  font-size: 11px;
-}
-
-/*List state BG colors*/
-.list-view .body td.item-state-on {
-  border-bottom: 1px solid #09bc09;
-  background: #c0ffc0;
-}
-
-.list-view .body td.item-state-off {
-  border-bottom: 1px solid #ff9f9f;
-  background: #ffd8cf;
-}
-
-.list-view .body tr.selected td.item-state-on,
-.list-view .body tr.selected td.item-state-off {
-  border-color: inherit;
-  background-color: inherit;
-}
-
-/*Autoscaler*/
-.ui-dialog div.autoscaler {
-  max-height: 600px;
-  overflow: auto;
-}
-
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit tbody tr td,
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit thead tr th {
-  min-width: 72px;
-  font-size: 10px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons {
-  float: right;
-  margin-right: 6px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons .action {
-  float: left;
-  width: 32px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='securityGroups'] {
-  display: block;
-  float: left;
-  width: 370px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='diskOfferingId'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  width: 370px;
-  margin-top: 1px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='minInstance'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='maxInstance'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -30px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='interval'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='quietTime'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpCommunity'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpPort'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.value select {
-  float: left;
-  width: 88%;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title {
-  margin-top: 40px;
-  margin-left: -650px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title label {
-  margin-right: 10px;
-  margin-left: 200px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.field-group.bottom-fields hr.policy-divider {
-  margin-top: 15px;
-  margin-bottom: -1px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title label {
-  margin-right: 10px;
-  margin-left: 170px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title {
-  margin-top: 10px;
-  margin-left: -620px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: 1px;
-  margin-left: 195px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.name {
-  margin-left: 390px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: -16px;
-  margin-left: 670px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.name {
-  margin-left: 390px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/minus.png") no-repeat 38% 59%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/minus.png") no-repeat 31% 54%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/sprites.png") repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url("../images/sprites.png") repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-item div.name label {
-  font-size: 11px;
-}
-
-.ui-datepicker {
-  display: none;
-  width: 300px;
-  height: auto;
-  padding: 4px 0 0;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  box-shadow: 0 3px 8px #000000;
-  background: #ffffff 0 -2470px;
-  overflow: hidden;
-  -moz-border-radius: 4px;
-  /*+box-shadow:0px 3px 8px #000000;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 3px 8px #000000;
-  -webkit-box-shadow: 0 3px 8px #000000;
-  -o-box-shadow: 0 3px 8px #000000;
-}
-
-.ui-datepicker .ui-datepicker-title {
-  width: 100%;
-  margin: auto;
-}
-
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
-  margin: 6px 13px 6px 14px;
-  padding: 6px;
-  /*+box-shadow:0px 1px 5px #444444;*/
-  border-radius: 4px;
-  box-shadow: 0 1px 5px #444444;
-  background: url("../images/bg-gradients.png") 0 -182px;
-  font-size: 13px;
-  /*+text-shadow:0px -1px 1px #050505;*/
-  font-size: 12px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #050505;
-  cursor: pointer;
-  -moz-box-shadow: 0 1px 5px #444444;
-  -webkit-box-shadow: 0 1px 5px #444444;
-  -o-box-shadow: 0 1px 5px #444444;
-  -moz-text-shadow: 0 -1px 1px #050505;
-  -webkit-text-shadow: 0 -1px 1px #050505;
-  /*+border-radius:4px;*/
-  -o-text-shadow: 0 -1px 1px #050505;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-datepicker .ui-datepicker-prev:hover,
-.ui-datepicker .ui-datepicker-next:hover {
-  /*+box-shadow:inset 0px 0px 10px #000000;*/
-  box-shadow: inset 0 0 10px #000000;
-  -moz-box-shadow: inset 0 0 10px #000000;
-  -webkit-box-shadow: inset 0 0 10px #000000;
-  -o-box-shadow: inset 0 0 10px #000000;
-}
-
-.ui-datepicker .ui-datepicker-prev {
-  float: left;
-}
-
-.ui-datepicker .ui-datepicker-next {
-  float: right;
-}
-
-.ui-datepicker .ui-datepicker-title .ui-datepicker-month {
-  width: 85px;
-  font-size: 16px;
-  color: #2c363f;
-}
-
-.ui-datepicker .ui-datepicker-title {
-  position: relative;
-  top: 6px;
-  left: 0;
-  width: 188px;
-  /*+placement:shift 0px 6px;*/
-  height: 19px;
-  padding: 3px 0 0;
-  text-align: center;
-}
-
-.ui-datepicker table {
-  width: 277px;
-  height: 9px;
-}
-
-.ui-datepicker table th,
-.ui-datepicker table td {
-  min-width: 24px;
-  padding: 7px 0;
-  border: 1px solid #b9b6b6;
-  text-align: center;
-  text-indent: 0;
-  /*[empty]+placement:;*/
-}
-
-.ui-datepicker table td {
-  cursor: pointer;
-}
-
-.ui-datepicker table td.ui-state-disabled,
-.ui-datepicker table td.ui-state-disabled:hover {
-  box-shadow: none;
-  /*+box-shadow:none;*/
-  background-color: #dcdcdc;
-  cursor: default;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.ui-datepicker table td a {
-  font-size: 12px;
-  color: #485867;
-  text-decoration: none;
-}
-
-.ui-datepicker table td:hover {
-  box-shadow: inset 0 0 4px #6b6b6b;
-  /*+box-shadow:inset 0px 0px 4px #6B6B6B;*/
-  background-color: #6a839a;
-  -moz-box-shadow: inset 0 0 4px #6b6b6b;
-  -webkit-box-shadow: inset 0 0 4px #6b6b6b;
-  -o-box-shadow: inset 0 0 4px #6b6b6b;
-}
-
-.ui-datepicker table td:hover a {
-  color: #ffffff;
-  text-shadow: 0 -1px #000000;
-}
-
-.plugins-listing ul {
-  width: 100%;
-}
-
-.plugins-listing ul li {
-  /*+border-radius:4px;*/
-  width: 98%;
-  height: 66px;
-  margin: 9px auto 12px;
-  border: 1px solid #a8a3a3;
-  /*+box-shadow:0px 2px 6px #D3D3D3;*/
-  border-radius: 4px;
-  box-shadow: 0 2px 6px #d3d3d3;
-  background: url("../images/bg-gradients.png") 0 -29px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 2px 6px #d3d3d3;
-  -webkit-box-shadow: 0 2px 6px #d3d3d3;
-  -o-box-shadow: 0 2px 6px #d3d3d3;
-}
-
-.plugins-listing ul li:hover {
-  /*+box-shadow:inset 0px 2px 4px #B9B9B9;*/
-  box-shadow: inset 0 2px 4px #b9b9b9;
-  -moz-box-shadow: inset 0 2px 4px #b9b9b9;
-  -webkit-box-shadow: inset 0 2px 4px #b9b9b9;
-  -o-box-shadow: inset 0 2px 4px #b9b9b9;
-}
-
-.plugins-listing ul li .title {
-  display: block;
-  float: left;
-  width: 90%;
-  margin: 13px 0 7px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  font-weight: bold;
-  color: #4a5a6a;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.plugins-listing ul li .desc {
-  font-size: 13px;
-  color: #524e4e;
-}
-
-.plugins-listing ul li .icon {
-  display: block;
-  float: left;
-  width: 50px;
-  height: 50px;
-  margin: 8px 13px 13px 11px;
-}
-
-.plugins-listing ul li .icon img {
-  width: 100%;
-  height: 100%;
-}
-
-.region-switcher {
-  display: inline-block;
-  position: relative;
-  /*+border-radius:4px;*/
-  position: relative;
-  float: left;
-  top: 1px;
-  left: 27px;
-  height: 28px;
-  margin: 5px 13px 0 0;
-  border-radius: 4px;
-  cursor: pointer;
-  /*+placement:shift 27px 1px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.region-selector {
-  /*+border-radius:4px;*/
-  position: relative;
-  position: absolute;
-  z-index: 5500;
-  top: 49px;
-  left: 185px;
-  width: 318px;
-  height: 372px;
-  /*+placement:shift 185px 49px;*/
-  border-radius: 4px;
-  background: url("../images/bg-notifications.png") center;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.region-selector h2 {
-  margin: 31px 0 14px;
-  font-size: 21px;
-  letter-spacing: 1px;
-  color: #ffffff;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-align: center;
-  text-shadow: 0 1px 2px #000000;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.region-selector .buttons {
-  width: 95%;
-  height: 33px;
-  margin: 5px auto 0;
-}
-
-.region-selector .buttons .button.close {
-  float: right;
-  margin-right: 10px;
-  padding: 8px;
-  border-bottom: 1px solid #232323;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: url("../images/gradients.png") 0 -317px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.region-selector .buttons .button.close:hover {
-  /*+box-shadow:inset 0px 2px 4px #525252;*/
-  box-shadow: inset 0 2px 4px #525252;
-  -moz-box-shadow: inset 0 2px 4px #525252;
-  -webkit-box-shadow: inset 0 2px 4px #525252;
-  -o-box-shadow: inset 0 2px 4px #525252;
-}
-
-.region-selector .buttons .button.close span {
-  font-weight: bold;
-  letter-spacing: 1px;
-  color: #ffffff;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-shadow: 0 1px 2px #000000;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.region-selector ul {
-  width: 94%;
-  height: 237px;
-  /*+border-radius:4px;*/
-  margin: auto;
-  border: 1px solid #b7b7b7;
-  border-radius: 4px;
-  box-shadow: inset 0 0 8px #a3a3a3;
-  background: #ffffff;
-  overflow: auto;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:inset 0px 0px 8px #A3A3A3;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 0 8px #a3a3a3;
-  -webkit-box-shadow: inset 0 0 8px #a3a3a3;
-  -o-box-shadow: inset 0 0 8px #a3a3a3;
-}
-
-.region-selector ul li {
-  width: 100%;
-  padding: 15px 0;
-  border-bottom: 1px solid #cacaca;
-  /*+text-shadow:none;*/
-  background: none;
-  font-size: 13px;
-  color: #415c72;
-  text-indent: 14px;
-  text-shadow: none;
-  cursor: pointer;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-.region-selector ul li:hover,
-.region-selector ul li.active {
-  background: #e9e9e9 url("../images/bg-gradients.png") repeat-x 0 -31px;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.region-switcher .icon {
-  display: inline-block;
-  display: block;
-  position: absolute;
-  float: left;
-  width: 26px;
-  height: 26px;
-  background: url("../images/sprites.png") -15px -1313px;
-}
-
-.region-switcher .title {
-  display: inline-block;
-  position: relative;
-  float: right;
-  top: 0;
-  left: -1px;
-  max-width: 285px;
-  padding: 9px 9px 0 34px;
-  font-size: 13px;
-  font-weight: 100;
-  /*+placement:shift -1px 0px;*/
-  white-space: nowrap;
-  color: #ffffff;
-  overflow: hidden;
-}
-
-.region-switcher:hover,
-.region-switcher.active {
-  /*+box-shadow:inset 0px 1px 5px #000000;*/
-  box-shadow: inset 0 1px 5px #000000;
-  -moz-box-shadow: inset 0 1px 5px #000000;
-  -webkit-box-shadow: inset 0 1px 5px #000000;
-  -o-box-shadow: inset 0 1px 5px #000000;
-}
-
-.region-switcher:hover .icon,
-.region-switcher.active .icon {
-  background-position: -70px -1311px;
-}
-
-.cacert-download {
-  display: inline-block;
-  position: relative;
-  position: absolute;
-  float: right;
-  top: 20px;
-  left: 1175px;
-  height: 30px;
-  cursor: pointer;
-}
-
-.cacert-download .icon {
-  display: inline-block;
-  display: block;
-  position: absolute;
-  float: left;
-  width: 32px;
-  height: 30px;
-  background: url("../images/sprites.png") -142px -348px;
-}
-
-.cacert-download:hover .icon,
-.cacert-download.active .icon {
-  background-position: -368px -348px;
-}
-
-.action.edit .icon {
-  background-position: 1px -1px;
-}
-
-.action.edit:hover .icon {
-  background-position: 1px -583px;
-}
-
-.start .icon,
-.startByAdmin .icon {
-  background-position: -169px -1px;
-}
-
-.start:hover .icon,
-.startByAdmin:hover .icon {
-  background-position: -169px -583px;
-}
-
-.updateVmwareDc .icon {
-  background-position: -265px -148px;
-}
-
-.updateVmwareDc:hover .icon {
-  background-position: -265px -728px;
-}
-
-.stop .icon,
-.removeVmwareDc .icon,
-.removeBackupChain .icon,
-.release .icon {
-  background-position: 0 -31px;
-}
-
-.stop:hover .icon,
-.removeVmwareDc:hover .icon,
-.removeBackupChain:hover .icon,
-.release:hover .icon {
-  background-position: 0 -613px;
-}
-
-.restart .icon,
-.restoreBackup .icon,
-.releaseDedicatedZone .icon {
-  background-position: 0 -63px;
-}
-
-.restart:hover .icon,
-.restoreBackup:hover .icon,
-.releaseDedicatedZone:hover .icon {
-  background-position: 0 -645px;
-}
-
-.destroy .icon,
-.expunge .icon,
-.remove .icon,
-.removeMulti .icon,
-.delete .icon,
-.decline .icon,
-.deleteacllist .icon {
-  background-position: 1px -92px;
-}
-
-.destroy:hover .icon,
-.expunge:hover .icon,
-.remove:hover .icon,
-.delete:hover .icon,
-.deleteacllist:hover .icon {
-  background-position: 1px -674px;
-}
-
-.migrate .icon,
-.migrateToAnotherStorage .icon {
-  background-position: 0 -125px;
-}
-
-.migrate:hover .icon,
-.migrateToAnotherStorage:hover .icon {
-  background-position: 0 -707px;
-}
-
-.migrate .icon,
-.migrateVolume .icon {
-  background-position: 0 -125px;
-}
-
-.migrate:hover .icon,
-.migrateVolume:hover .icon {
-  background-position: 0 -707px;
-}
-
-.viewMetrics .icon {
-  background-position: -40px -32px;
-}
-
-.viewMetrics:hover .icon {
-  background-position: -40px -32px;
-}
-
-.refreshMetrics .icon {
-  background-position: 0 -62px;
-}
-
-.refreshMetrics:hover .icon {
-  background-position: 0 -62px;
-}
-
-.attach .icon,
-.attachISO .icon,
-.attachDisk .icon,
-.restoreBackupVolume .icon,
-.associateProfileToBlade .icon {
-  background-position: -104px -3px;
-}
-
-.attach:hover .icon,
-.attachISO:hover .icon,
-.restoreBackupVolume:hover .icon,
-.attachDisk:hover .icon {
-  background-position: -104px -585px;
-}
-
-.detach .icon,
-.detachISO .icon,
-.detachDisk .icon,
-.disassociateProfileFromBlade .icon {
-  background-position: -101px -65px;
-}
-
-.detach:hover .icon,
-.detachISO:hover .icon,
-.detachDisk:hover .icon,
-.disassociateProfileFromBlade:hover .icon {
-  background-position: -101px -647px;
-}
-
-.secureKVMHost .icon,
-.resetPassword .icon,
-.changePassword .icon {
-  background-position: -68px -30px;
-}
-
-.secureKVMHost:hover .icon,
-.resetPassword:hover .icon,
-.changePassword:hover .icon {
-  background-position: -68px -612px;
-}
-
-.resetSSHKeyForVirtualMachine .icon {
-  background-position: -196px -3px;
-}
-
-.resetSSHKeyForVirtualMachine:hover .icon {
-  background-position: -195px -586px;
-}
-
-.changeService .icon {
-  background-position: -38px -33px;
-}
-
-.changeService:hover .icon {
-  background-position: -38px -615px;
-}
-
-.snapshot .icon,
-.takeSnapshot .icon,
-.startBackup .icon,
-.storageSnapshot .icon {
-  background-position: -36px -91px;
-}
-
-.snapshot:hover .icon,
-.takeSnapshot:hover .icon,
-.startBackup:hover .icon,
-.storageSnapshot:hover .icon {
-  background-position: -36px -673px;
-}
-
-.recurringSnapshot .icon,
-.configureBackupSchedule .icon {
-  background-position: -69px -95px;
-}
-
-.recurringSnapshot:hover .icon,
-.configureBackupSchedule:hover .icon {
-  background-position: -69px -677px;
-}
-
-.retrieveDiagnostics .icon,
-.downloadVolume .icon,
-.downloadTemplate .icon,
-.downloadISO .icon {
-  background-position: -35px -125px;
-}
-
-.retrieveDiagnostics:hover .icon,
-.downloadVolume:hover .icon,
-.downloadTemplate:hover .icon,
-.downloadISO:hover .icon {
-  background-position: -35px -707px;
-}
-
-.shareTemplate .icon {
-  background-position: -165px -122px;
-}
-
-.shareTemplate:hover .icon {
-  background-position: -165px -704px;
-}
-
-.shareISO .icon {
-  background-position: -165px -122px;
-}
-
-.shareISO:hover .icon {
-  background-position: -165px -704px;
-}
-
-.createVolume .icon {
-  background-position: -70px -124px;
-}
-
-.createVolume:hover .icon {
-  background-position: -70px -706px;
-}
-
-.enable .icon,
-.enableStaticNAT .icon {
-  background-position: -102px -92px;
-}
-
-.enable:hover .icon,
-.enableStaticNAT:hover .icon {
-  background-position: -102px -676px;
-}
-
-.disable .icon,
-.disableStaticNAT .icon {
-  background-position: -136px -93px;
-}
-
-.disable:hover .icon,
-.disableStaticNAT:hover .icon {
-  background-position: -136px -677px;
-}
-
-.add .icon,
-.addNew .icon,
-.addLdapAccount .icon,
-.assignVm .icon,
-.rootAdminAddGuestNetwork .icon {
-  background-position: -37px -61px;
-}
-
-.add:hover .icon,
-.addNew:hover .icon,
-.addLdapAccount:hover .icon,
-.assignVm:hover .icon,
-.rootAdminAddGuestNetwork:hover .icon {
-  background-position: -37px -643px;
-}
-
-.assignVmToAnotherAccount .icon {
-  background-position: -232px -97px;
-}
-
-.assignVmToAnotherAccount:hover .icon {
-  background-position: -231px -678px;
-}
-
-.create .icon,
-.createTemplate .icon,
-.enableSwift .icon,
-.addVM .icon,
-.assignToBackupOffering .icon,
-.dedicateZone .icon,
-.dedicate .icon {
-  background-position: -69px -63px;
-}
-
-.create:hover .icon,
-.createTemplate:hover .icon,
-.enableSwift:hover .icon,
-.addVM:hover .icon,
-.assignToBackupOffering:hover .icon,
-.dedicateZone:hover .icon {
-  background-position: -69px -645px;
-}
-
-.copyTemplate .icon,
-.copyISO .icon {
-  background-position: -138px -2px;
-}
-
-.copyTemplate:hover .icon,
-.copyISO:hover .icon {
-  background-position: -138px -584px;
-}
-
-.createVM .icon {
-  background-position: -137px -32px;
-}
-
-.createVM:hover .icon {
-  background-position: -137px -614px;
-}
-
-.blankHAForHost .icon {
-  background-position: -266px -31px;
-}
-
-.blankHAForHost:hover .icon {
-  background-position: -266px -31px;
-}
-
-.configureHAForHost .icon {
-  background-position: -270px -148px;
-}
-
-.configureHAForHost:hover .icon {
-  background-position: -270px -728px;
-}
-
-.enableHA .icon {
-  background-position: -265px -93px;
-}
-
-.enableHA:hover .icon {
-  background-position: -265px -673px;
-}
-
-.disableHA .icon {
-  background-position: -265px -120px;
-}
-
-.disableHA:hover .icon {
-  background-position: -265px -700px;
-}
-
-.blankOutOfBandManagement .icon {
-  background-position: -266px -31px;
-}
-
-.blankOutOfBandManagement:hover .icon {
-  background-position: -266px -31px;
-}
-
-.configureOutOfBandManagement .icon {
-  background-position: -168px -31px;
-}
-
-.configureOutOfBandManagement:hover .icon {
-  background-position: -168px -613px;
-}
-
-.diagnostics .icon {
-  background-position: -165px -122px;
-}
-
-.diagnostics:hover .icon {
-  background-position: -165px -704px;
-}
-
-.enableOutOfBandManagement .icon {
-  background-position: -138px -65px;
-}
-
-.enableOutOfBandManagement:hover .icon {
-  background-position: -138px -647px;
-}
-
-.disableOutOfBandManagement .icon {
-  background-position: -138px -123px;
-}
-
-.disableOutOfBandManagement:hover .icon {
-  background-position: -138px -705px;
-}
-
-.issueOutOfBandManagementPowerAction .icon {
-  background-position: -266px -3px;
-}
-
-.issueOutOfBandManagementPowerAction:hover .icon {
-  background-position: -265px -584px;
-}
-
-.changeOutOfBandManagementPassword .icon {
-  background-position: -68px -30px;
-}
-
-.changeOutOfBandManagementPassword:hover .icon {
-  background-position: -68px -612px;
-}
-
-.enableMaintenanceMode .icon {
-  background-position: -138px -65px;
-}
-
-.enableMaintenanceMode:hover .icon {
-  background-position: -138px -647px;
-}
-
-.cancelMaintenanceMode .icon,
-.removeFromBackupOffering .icon {
-  background-position: -138px -123px;
-}
-
-.cancelMaintenanceMode:hover .icon,
-.removeFromBackupOffering .icon {
-  background-position: -138px -705px;
-}
-
-.lock .icon {
-  background-position: -104px -124px;
-}
-
-.lock:hover .icon {
-  background-position: -104px -706px;
-}
-
-.updateResourceLimits .icon {
-  background-position: -100px -32px;
-}
-
-.updateResourceLimits:hover .icon {
-  background-position: -100px -614px;
-}
-
-.startRollingMaintenance .icon {
-  background-position: -138px -65px;
-}
-
-.startRollingMaintenance:hover .icon {
-  background-position: -138px -65px;
-}
-
-.addVlanRange .icon,
-.addVmwareDc .icon {
-  background-position: -37px -62px;
-}
-
-.addVlanRange:hover .icon,
-.addVmwareDc:hover .icon {
-  background-position: -37px -62px;
-}
-
-.removeVlanRange .icon {
-  background-position: 1px -92px;
-}
-
-.removeVlanRange:hover .icon {
-  background-position: 1px -92px;
-}
-
-.resize .icon,
-.updateResourceCount .icon {
-  background-position: -167px -66px;
-}
-
-.resize:hover .icon,
-.updateResourceCount:hover .icon {
-  background-position: -167px -648px;
-}
-
-.generateKeys .icon,
-.networkACL .icon {
-  background-position: -167px -95px;
-}
-
-.generateKeys:hover .icon,
-.networkACL:hover .icon {
-  background-position: -167px -677px;
-}
-
-.revertSnapshot .icon,
-.revertToVMSnapshot .icon,
-.restoreVM .icon,
-.restore .icon,
-.recover .icon {
-  background-position: -168px -31px;
-}
-
-.reset .icon,
-.reinstall .icon {
-  background-position: -168px -31px;
-}
-
-.scaleUp .icon {
-  background-position: -167px -66px;
-}
-
-.revertSnapshot:hover .icon,
-.revertToVMSnapshot:hover .icon,
-.restoreVM:hover .icon,
-.restore:hover .icon {
-  background-position: -168px -613px;
-}
-
-.reset:hover .icon {
-  background-position: -168px -613px;
-}
-
-.enableVPN .icon {
-  background-position: -198px -3px;
-}
-
-.enableVPN:hover .icon {
-  background-position: -197px -586px;
-}
-
-.disableVPN .icon {
-  background-position: -198px -32px;
-}
-
-.disableVPN:hover .icon {
-  background-position: -197px -615px;
-}
-
-.addIpRange .icon {
-  background-position: -197px -65px;
-}
-
-.addIpRange:hover .icon {
-  background-position: -197px -647px;
-}
-
-.createBackup .icon,
-.forceReconnect .icon {
-  background-position: -196px -95px;
-}
-
-.createBackup:hover .icon,
-.forceReconnect:hover .icon {
-  background-position: -196px -677px;
-}
-
-.manage .icon {
-  background-position: -165px -122px;
-}
-
-.manage:hover .icon {
-  background-position: -165px -704px;
-}
-
-.unmanage .icon {
-  background-position: -196px -122px;
-}
-
-.unmanage:hover .icon {
-  background-position: -196px -704px;
-}
-
-.configureSamlAuthorization .icon {
-  background-position: -165px -122px;
-}
-
-.configureSamlAuthorization:hover .icon {
-  background-position: -165px -704px;
-}
-
-.viewConsole .icon {
-  background-position: -231px -2px;
-}
-
-.viewConsole:hover .icon {
-  background-position: -229px -586px;
-}
-
-.moveTop .icon {
-  background-position: -24px -161px;
-}
-
-.moveTop:hover .icon {
-  background-position: -24px -734px;
-}
-
-.moveBottom .icon {
-  background-position: -98px -161px;
-}
-
-.moveBottom:hover .icon {
-  background-position: -98px -734px;
-}
-
-.moveUp .icon {
-  background-position: -2px -161px;
-}
-
-.moveUp:hover .icon {
-  background-position: -2px -734px;
-}
-
-.moveDown .icon {
-  background-position: -55px -161px;
-}
-
-.moveDown:hover .icon {
-  background-position: -55px -734px;
-}
-
-.moveDrag .icon {
-  border-radius: 10px;
-  /*+border-radius:10px;*/
-  border-radius: 10px 10px 10px 10px;
-  background-position: -82px -162px;
-  cursor: move;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.moveDrag:hover .icon {
-  background-color: #ffffff;
-  cursor: move !important;
-}
-
-.uploadVolume .icon {
-  background-position: -232px -34px;
-}
-
-.uploadVolume:hover .icon {
-  background-position: -230px -615px;
-}
-
-.editTags .icon {
-  background-position: -228px -65px;
-}
-
-.editTags:hover .icon {
-  background-position: -228px -646px;
-}
-
-.replaceacllist .icon,
-.replaceACL .icon,
-.updateIpaddr .icon,
-.changeAffinity .icon {
-  background-position: -264px -2px;
-}
-
-.replaceacllist:hover .icon,
-.replaceACL:hover .icon,
-.updateIpaddr:hover .icon,
-.changeAffinity:hover .icon {
-  background-position: -263px -583px;
-}
-
-.releaseFromAccount .icon {
-  background-position: -230px -123px;
-}
-
-.releaseFromAccount:hover .icon {
-  background-position: -229px -704px;
-}
-
-.addAccount .icon {
-  background-position: -231px -96px;
-}
-
-.addAccount:hover .icon {
-  background-position: -230px -677px;
-}
-
-.linktoldap .icon {
-  background-position: -197px -65px;
-}
-
-.linktoldap:hover .icon {
-  background-position: -197px -647px;
-}
-
-.updateOfferingAccess .icon {
-  background-position: -165px -122px;
-}
-
-.updateOfferingAccess:hover .icon {
-  background-position: -165px -704px;
-}
-
-.accounts-wizard table {
-  width: 100%;
-  margin: 0;
-  table-layout: fixed;
-}
-
-.accounts-wizard .ui-button {
-  display: inline-block !important;
-  float: none !important;
-}
-
-.accounts-wizard td:last-child {
-  border: 0;
-}
-
-.accounts-wizard tbody tr:nth-child(even) {
-  background: #dfe1e3;
-}
-
-.accounts-wizard tbody tr:nth-child(odd) {
-  background: #f2f0f0;
-}
-
-.accounts-wizard .content {
-  display: inline-block;
-}
-
-.accounts-wizard .content td {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.accounts-wizard .content td.select,
-.accounts-wizard .content th.select {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-  border-right: 1px solid #bfbfbf;
-  background: none;
-}
-
-.accounts-wizard .content .select input {
-  width: auto;
-  height: auto;
-  margin: 18px 0 0 24px;
-  padding: 0;
-}
-
-.accounts-wizard .content:last-child {
-  margin-left: 14px;
-}
-
-.accounts-wizard table thead th:first-child {
-  width: 50px;
-  min-width: 50px;
-  max-width: 50px;
-}
-
-.accounts-wizard .input-area {
-  width: 320px;
-  font-size: 13px;
-  color: #485867;
-  text-shadow: 0 2px 1px #ffffff;
-}
-
-.ldap-account-choice {
-  border: 0;
-  border-radius: 0 0 0 0 !important;
-}
-
-.manual-account-details .name {
-  float: left;
-  width: 100px;
-  margin-top: 2px;
-  padding-bottom: 10px;
-}
-
-.manual-account-details {
-  height: auto !important;
-  overflow: visible !important;
-  overflow-x: visible !important;
-}
-
-.manual-account-details label.error {
-  display: block;
-  font-size: 10px;
-}
-
-.manual-account-details .value {
-  float: left;
-}
-
-.manual-account-details .form-item:after {
-  visibility: hidden;
-  content: '.';
-  display: block;
-  clear: both;
-  height: 0;
-  line-height: 0;
-}
-
-.manual-account-details .form-item {
-  box-sizing: border-box;
-  width: 100%;
-  padding: 5px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-}
-
-.manual-account-details select,
-.manual-account-details input {
-  width: 150px;
-}
-
-.manual-account-details input {
-  border: 1px solid #afafaf;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #f6f6f6;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.manual-account-details > *:nth-child(even) {
-  background: #dfe1e3;
-}
-
-.manual-account-details > *:nth-child(odd) {
-  background: #f2f0f0;
-}
-
-.manual-account-details .value {
-  display: inline-block;
-}
-
-div.gpugroups div.list-view div.fixed-header {
-  position: relative;
-  top: 0 !important;
-  left: 12px !important;
-}
-
-div.gpugroups div.list-view div.fixed-header table {
-  width: auto;
-}
-
-div.gpugroups div.list-view div.data-table table {
-  margin-top: 0;
-}
-
-div.gpugroups div.list-view {
-  position: relative;
-  height: auto !important;
-  margin-top: 0 !important;
-  border: 0;
-}
-
-.gpugroups {
-  float: left;
-  width: 100%;
-  height: 100%;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.gpugroups .gpugroup-container {
-  position: relative;
-  float: left;
-  width: auto;
-  height: auto !important;
-  margin: 12px;
-  padding: 0;
-  border: 1px solid #c8c2c2;
-  border-radius: 3px;
-}
-
-.gpugroups .gpugroup-container .title {
-  padding: 12px 12px 5px;
-  font-size: 13px;
-  font-weight: 100;
-}
-
-.ui-dialog .ui-button.add {
-  width: auto;
-  height: 12px;
-  margin: 0 0 12px;
-  padding: 5px 7px 5px 6px;
-  background: transparent -webkit-linear-gradient(top, #f7f7f7 1%, #eaeaea 100%) repeat 0 0;
-  background: transparent linear-gradient(to bottom, #f7f7f7 1%, #eaeaea 100%) repeat 0 0;
-  font-size: 12px;
-}
-
-.ui-dialog .ui-button.add:hover {
-  box-shadow: inset 0 0 5px #c3c3c3;
-  background: #e5e5e5 repeat 0 0;
-}
-
-.ui-dialog .ui-button.add span {
-  padding: 0 0 3px 18px;
-  background: transparent url("../images/icons.png") no-repeat -626px -209px;
-}
-
-ul.ui-autocomplete.ui-menu {
-  width: 250px;
-  max-height: 100px;
-  background: #eee;
-  padding: 5px;
-  text-align: left;
-  overflow-y: auto;
-  overflow-x: hidden;
-  z-index: 100;
-}
-
-.ui-menu .ui-menu-item {
-  cursor: pointer;
-}
-
-.ui-menu .ui-menu-item .ui-state-active {
-  background: #CBDDF3;
-}
-
-.ui-helper-hidden-accessible {
-  display: none;
-}
-
-.copy-template-destination-list div.text-search {
-  right: 5px;
-}
-
-.copy-template-destination-list div.ui-widget-content {
-  display: block !important;
-}
-
-div.panel.copy-template-destination-list div.list-view div.fixed-header {
-  width: 500px;
-}
-
-.copy-template-destination-list.panel div.list-view div.data-table table {
-  width: 595px;
-}
-
-.copy-template-destination-list .list-view .toolbar {
-  width: 654px;
-}
-
-.multi-edit-add-list .ui-button.copytemplateok {
-  left: 330px;
-}
-
-.multi-edit-add-list .ui-button.copytemplatecancel {
-  left: 310px;
-}
-
-div.button.export {
-  position: relative;
-  float: right;
-  top: 5px;
-  left: 0;
-  height: 12px;
-  margin: 0 10px 0 0;
-  padding: 5px 5px 5px 5px;
-  border: 1px solid #b7b7b7;
-  border-radius: 4px 4px 4px 4px;
-  background: -webkit-linear-gradient(top, #f7f7f7 1%, #eaeaea 100%);
-  background: linear-gradient(to bottom, #f7f7f7 1%, #eaeaea 100%);
-  font-size: 12px;
-  font-weight: 100;
-  color: #000000;
-  text-shadow: 0 1px 1px #dee5ea;
-  cursor: pointer;
-}
-
-div.button.export a {
-  position: relative;
-  top: 0;
-  left: 0;
-  padding: 0 0 3px 20px;
-  background: url("../images/exportCsvIcon.png") no-repeat;
-  background-size: 15.5px;
-  color: #000000;
-  text-decoration: none;
-}
-
-.ui-widget {
-  font-family: inherit;
-}
-
-.ui-widget-content,
-.ui-widget.ui-widget-content {
-  border: 0;
-  background: inherit;
-}
-
-.ui-dialog.ui-widget-content {
-  background: #ffffff;
-}
-
-.ui-tabs .ui-tabs-nav {
-  display: block;
-  position: relative;
-  z-index: 2;
-  float: left;
-  width: 100%;
-  height: 41px;
-  margin-top: 42px;
-  padding: 0;
-  border: 0;
-  background-color: inherit;
-  overflow: hidden;
-}
-
-.ui-tabs .ui-tabs-nav.ui-corner-all {
-  border-bottom-left-radius: 0;
-}
-
-.ui-tabs .ui-tabs-nav .ui-tab {
-  margin-right: 1px;
-}
-
-.ui-tabs .ui-tab .ui-tabs-anchor {
-  position: relative;
-  float: left;
-  min-width: 91px;
-  padding: 15px 10px;
-  font-size: 11px;
-  color: #4e6070;
-  text-align: center;
-  text-decoration: none;
-}
-
-.ui-tabs .ui-tab.ui-state-default {
-  border: 1px solid #d9d9d9;
-  background: #f0f0f0;
-}
-
-.ui-tabs .ui-tab.ui-state-active {
-  background: #ffffff;
-}
-
-.ui-tabs .ui-tab.ui-state-hover a {
-  text-decoration: underline;
-  /*color: #000000;*/
-  cursor: pointer;
-}
-
-ul.ui-autocomplete.ui-menu {
-  width: 250px;
-  max-height: 400px;
-  padding: 5px;
-  background: #dddddd;
-  font-size: 13px;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-ul.token-input-list-facebook {
-  z-index: 2147483647;
-  clear: left;
-  width: 233px;
-  height: auto !important;
-  height: 1%;
-  min-height: 1px;
-  margin: 0;
-  padding: 0;
-  border: 1px solid #afafaf;
-  background-color: #f6f6f6;
-  font-family: Verdana;
-  font-size: 12px;
-  list-style-type: none;
-  cursor: text;
-  overflow: hidden;
-}
-
-ul.token-input-list-facebook li input {
-  width: 100px;
-  margin: 2px 0;
-  padding: 3px 8px;
-  border: 0;
-  background-color: #ffffff;
-  -webkit-appearance: caret;
-}
-
-li.token-input-token-facebook {
-  float: left;
-  height: auto !important;
-  height: 15px;
-  margin: 3px;
-  padding: 1px 3px;
-  border: 1px solid #ccd5e4;
-  border-radius: 5px;
-  background-color: #eff2f7;
-  font-size: 11px;
-  white-space: nowrap;
-  color: #000000;
-  cursor: default;
-  overflow: hidden;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-}
-
-li.token-input-token-facebook p {
-  display: inline;
-  margin: 0;
-  padding: 0;
-}
-
-li.token-input-token-facebook span {
-  margin-left: 5px;
-  font-weight: bold;
-  color: #a6b3cf;
-  cursor: pointer;
-}
-
-li.token-input-selected-token-facebook {
-  border: 1px solid #3b5998;
-  background-color: #5670a6;
-  color: #ffffff;
-}
-
-li.token-input-input-token-facebook {
-  float: left;
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-}
-
-div.token-input-dropdown-facebook {
-  position: absolute;
-  z-index: 2147483647;
-  width: 233px;
-  border-right: 1px solid #cccccc;
-  border-bottom: 1px solid #cccccc;
-  border-left: 1px solid #cccccc;
-  background-color: #ffffff;
-  font-family: Verdana;
-  font-size: 11px;
-  cursor: default;
-  overflow: hidden;
-}
-
-div.token-input-dropdown-facebook p {
-  width: 233px;
-  margin: 0;
-  padding: 5px;
-  font-weight: bold;
-  color: #777777;
-}
-
-div.token-input-dropdown-facebook ul {
-  margin: 0;
-  padding: 0;
-}
-
-div.token-input-dropdown-facebook ul li {
-  margin: 0;
-  padding: 3px;
-  background-color: #ffffff;
-  list-style-type: none;
-}
-
-div.token-input-dropdown-facebook ul li.token-input-dropdown-item-facebook {
-  background-color: #ffffff;
-}
-
-div.token-input-dropdown-facebook ul li.token-input-dropdown-item2-facebook {
-  background-color: #ffffff;
-}
-
-div.token-input-dropdown-facebook ul li em {
-  font-weight: bold;
-  font-style: normal;
-}
-
-div.token-input-dropdown-facebook ul li.token-input-selected-dropdown-item-facebook {
-  background-color: #3b5998;
-  color: #ffffff;
-}
-
-/*# sourceMappingURL=src/sourcemaps/cloudstack3.css.map */
diff --git a/ui/legacy/css/cloudstack3.hu.css b/ui/legacy/css/cloudstack3.hu.css
deleted file mode 100644
index 6c0a437..0000000
--- a/ui/legacy/css/cloudstack3.hu.css
+++ /dev/null
@@ -1,24 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-#breadcrumbs div.home {
-  width: 100px;
-}
-
-/*# sourceMappingURL=src/sourcemaps/cloudstack3.hu.css.map */
diff --git a/ui/legacy/css/cloudstack3.ja_JP.css b/ui/legacy/css/cloudstack3.ja_JP.css
deleted file mode 100644
index 03d2343..0000000
--- a/ui/legacy/css/cloudstack3.ja_JP.css
+++ /dev/null
@@ -1,86 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-#header div.view-switcher {
-  font-size: 9px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .name {
-  font-size: 10px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .percentage {
-  float: left;
-  margin: 13px 0 0;
-  font-size: 15px;
-  font-weight: bold;
-  /*+text-shadow:0px -2px 1px #FFFFFF;*/
-  text-shadow: 0 -2px 1px #ffffff;
-  -moz-text-shadow: 0 -2px 1px #ffffff;
-  -webkit-text-shadow: 0 -2px 1px #ffffff;
-  -o-text-shadow: 0 -2px 1px #ffffff;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .value .content {
-  font-size: 10px;
-}
-
-div.toolbar div.filters label {
-  font-size: 9px;
-}
-
-div.toolbar div.filters select {
-  width: 82px;
-  font-size: 11px;
-}
-
-div.toolbar div.button.add,
-div.toolbar div.button.refresh,
-div.toolbar div.button.add,
-div.toolbar div.button.main-action,
-.toolbar div.button.header-action,
-.detail-group .button.add {
-  font-size: 10px;
-  white-space: nowrap;
-}
-
-table tbody td.quick-view,
-table thead th.quick-view {
-  font-size: 8px;
-}
-
-.multi-wizard.instance-wizard .progress ul li span.multiline {
-  font-size: 9px;
-}
-
-.multi-wizard .review .select-container .select .name {
-  font-size: 10px;
-  white-space: nowrap;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text .label {
-  font-size: 8px;
-}
-
-.detail-view .multi-edit table tr th,
-.detail-view .multi-edit table tr td {
-  font-size: 8px;
-}
-
-/*# sourceMappingURL=src/sourcemaps/cloudstack3.ja_JP.css.map */
diff --git a/ui/legacy/css/custom.css b/ui/legacy/css/custom.css
deleted file mode 100644
index 544d2eb..0000000
--- a/ui/legacy/css/custom.css
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*
-*
-* Use custom.css to override the default CloudStack styles
-*/
-
-/*# sourceMappingURL=src/sourcemaps/custom.css.map */
diff --git a/ui/legacy/css/src/.jsbeautifyrc b/ui/legacy/css/src/.jsbeautifyrc
deleted file mode 100644
index e328588..0000000
--- a/ui/legacy/css/src/.jsbeautifyrc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-{
-  // Documentation: https://github.com/einars/js-beautify/
-  // All Rules: https://github.com/HookyQR/VSCodeBeautify/blob/master/Settings.md
-  "css": {
-    "allowed_file_extensions": ["css", "scss", "sass", "less"],
-    "end_with_newline": true,
-    "indent_char": " ",
-    "indent_size": 2,
-    "newline_between_rules": true,
-    "selector_separator": " ",
-    "selector_separator_newline": true, // Separate selectors with newline or not (e.g. "a,\nbr" or "a, br"),
-    "space_around_combinator": true // space around > and ~
-  }
-}
diff --git a/ui/legacy/css/src/.sass-lint.yml b/ui/legacy/css/src/.sass-lint.yml
deleted file mode 100644
index 7b0d8d6..0000000
--- a/ui/legacy/css/src/.sass-lint.yml
+++ /dev/null
@@ -1,456 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# watch https://github.com/brigade/scss-lint/blob/master/lib/scss_lint/linter/README.md#bangformat
-# watch https://github.com/sasstools/sass-lint/tree/master/docs/rules
-# watch https://github.com/srowhani/sass-lint-auto-fix/tree/master/src/resolvers
-# Default application configuration that all configurations inherit from.
-
-options:
-  merge-default-rules: false
-  formatter: 'stylish'
-  optOut: true
-
-files:
-  include: '**/*.scss'
-  ignore:
-    - node_modules/**
-
-syntax:
-  include:
-    - scss
-
-rules:
-  attribute-quotes: 2
-  bem-depth:
-    - 0
-    - max-depth: 1
-  border-zero: 2
-  brace-style: 1
-  class-name-format:
-    - 0
-    - convention: hyphenatedlowercase
-  clean-import-paths:
-    - 1
-    - filename-extension: false
-      leading-underscore: false
-  empty-line-between-blocks:
-    - 2
-    - ignore-single-line-rulesets: true
-  extends-before-declarations: 2
-  extends-before-mixins: 2
-  final-newline:
-    - 2
-    - include: true
-  force-attribute-nesting: 0
-  force-element-nesting: 0
-  force-pseudo-nesting: 0
-  function-name-format:
-    - 1
-    - allow-leading-underscore: true
-      convention: hyphenatedlowercase
-  hex-length:
-    - 2
-    - style: long
-  hex-notation:
-    - 2
-    - style: lowercase
-  id-name-format:
-    - 0
-    - convention: hyphenatedlowercase
-  indentation:
-    - 1 #!todo set this to 2, when autofix with sass-lint-auto-fix is possible
-    - size: 2
-  leading-zero:
-    - 1 #!todo set this to 2, when autofix with sass-lint-auto-fix is possible
-    - include: true
-  mixin-name-format:
-    - 1
-    - allow-leading-underscore: true
-      convention: hyphenatedlowercase 
-  mixins-before-declarations:
-    - 2
-    - exclude:
-        - breakpoint
-        - mq
-  nesting-depth:
-    - 1
-    - max-depth: 3
-  no-color-keywords: 1
-  no-color-literals: 0
-  no-css-comments: 0
-  no-debug: 1
-  no-duplicate-properties: 0
-  no-empty-rulesets: 1
-  no-extends: 0
-  no-ids: 0
-  no-important: 0
-  no-invalid-hex: 1
-  no-mergeable-selectors: 0
-  no-misspelled-properties:
-    - 0
-    - extra-properties:
-        - caret-color
-  no-qualifying-elements:
-    - 0
-    - allow-element-with-attribute: false
-      allow-element-with-class: false
-      allow-element-with-id: false
-  no-trailing-zero: 1
-  no-transition-all: 0
-  no-url-protocols: 1
-  no-vendor-prefixes:
-    - 0
-    - ignore-non-standard: true
-  no-warn: 1
-  placeholder-in-extend: 1
-  placeholder-name-format:
-    - 1
-    - convention: hyphenatedlowercase
-  property-sort-order:
-    - 2
-    -
-      order:
-        # visibility
-        - 'visibility'
-        - 'opacity'
-
-        # content
-        - 'content'
-        - 'quotes'
-
-        # position
-        - 'display'
-        - 'position'
-        - 'z-index'
-        - 'float'
-        - 'clear'
-        - 'box-sizing'
-        - 'top'
-        - 'right'
-        - 'bottom'
-        - 'left'
-
-        # align-content
-        - 'align-content'
-        - 'align-items'
-        - 'align-self'
-
-        # vertical-alignment
-        - 'vertical-align'
-
-        # width
-        - 'width'
-        - 'min-width'
-        - 'max-width'
-
-        # height
-        - 'height'
-        - 'min-height'
-        - 'max-height'
-       
-        # margin
-        - 'margin'
-        - 'margin-top'
-        - 'margin-right'
-        - 'margin-bottom'
-        - 'margin-left'
-
-        # padding
-        - 'padding'
-        - 'padding-top'
-        - 'padding-right'
-        - 'padding-bottom'
-        - 'padding-left'
-             
-        # border
-        - 'border'
-        - 'border-top'
-        - 'border-right'
-        - 'border-bottom'
-        - 'border-left'
-        - 'border-width'
-        - 'border-top-width'
-        - 'border-right-width'
-        - 'border-bottom-width'
-        - 'border-left-width'
-
-        # border-style
-        - 'border-style'
-        - 'border-top-style'
-        - 'border-right-style'
-        - 'border-bottom-style'
-        - 'border-left-style'
-
-        # border-radius
-        - 'border-radius'
-        - 'border-top-left-radius'
-        - 'border-top-right-radius'
-        - 'border-bottom-left-radius'
-        - 'border-bottom-right-radius'
-
-        # border-color
-        - 'border-color'
-        - 'border-top-color'
-        - 'border-right-color'
-        - 'border-bottom-color'
-        - 'border-left-color'
-
-        # border-image
-        - 'border-image'
-        - 'border-image-source'
-        - 'border-image-width'
-        - 'border-image-outset'
-        - 'border-image-repeat'
-        - 'border-image-slice'
-
-        # outline
-        - 'outline'
-        - 'outline-offset'
-        - 'outline-width'
-        - 'outline-style'
-        - 'outline-color'
-
-        # box-shadow
-        - 'box-shadow'
-
-        # flex
-        - 'flex'
-        - 'flex-basis'
-        - 'flex-direction'
-        - 'flex-flow'
-        - 'flex-grow'
-        - 'flex-shrink'
-        - 'flex-wrap'
-        - 'justify-content'
-        
-        # grid
-        - 'grid'
-        - 'grid-area'
-        - 'grid-template'
-        - 'grid-template-areas'
-        - 'grid-template-rows'
-        - 'grid-template-columns'
-        - 'grid-column'
-        - 'grid-column-start'
-        - 'grid-column-end'
-        - 'grid-row'
-        - 'grid-row-start'
-        - 'grid-row-end'
-        - 'grid-auto-rows'
-        - 'grid-auto-columns'
-        - 'grid-auto-flow'
-        - 'grid-gap'
-        - 'grid-row-gap'
-        - 'grid-column-gap'
-        
-        # order
-        - 'order'
-        
-        # columns
-        - 'columns'
-        - 'column-gap'
-        - 'column-fill'
-        - 'column-rule'
-        - 'column-rule-width'
-        - 'column-rule-style'
-        - 'column-rule-color'
-        - 'column-span'
-        - 'column-count'
-        - 'column-width'
-        
-        # background
-        - 'background'
-        - 'background-attachment'
-        - 'background-clip'
-        - 'background-color'
-        - 'background-image'
-        - 'background-repeat'
-        - 'background-position'
-        - 'background-size'
-
-        # font
-        - 'font'
-        - 'font-family'
-        - 'font-size'
-        - 'font-size-adjust'
-        - 'font-stretch'
-        - 'font-weight'
-        - 'font-smoothing'
-        - 'osx-font-smoothing'
-        - 'font-variant'
-        - 'font-style'
-
-        # text-spacing
-        - 'line-height'
-        - 'word-spacing'
-        - 'letter-spacing'
-        - 'white-space'
-        - 'word-break'
-        - 'word-wrap'
-        - 'color'
-
-        # text-alignment and decoration
-        - 'direction'
-        - 'tab-size'
-        - 'text-align'
-        - 'text-align-last'
-        - 'text-justify'
-        - 'text-indent'
-        - 'text-transform'
-        - 'text-decoration'
-        - 'text-decoration-color'
-        - 'text-decoration-line'
-        - 'text-decoration-style'
-        - 'text-rendering'
-        - 'text-shadow'
-        - 'text-overflow'
-
-        # tables
-        - 'table-layout'
-        - 'border-collapse'
-        - 'border-spacing'
-        - 'empty-cells'
-
-        # list-style
-        - 'list-style'
-        - 'list-style-type'
-        - 'list-style-position'
-        - 'list-style-image'
-        - 'caption-side'
-
-        # cursor
-        - 'cursor'
-
-        # overflow
-        - 'overflow'
-        - 'overflow-x'
-        - 'overflow-y'
-        - 'resize'
-
-        # animation
-        - 'animation'
-        - 'animation-name'
-        - 'animation-duration'
-        - 'animation-timing-function'
-        - 'animation-delay'
-        - 'animation-iteration-count'
-        - 'animation-direction'
-        - 'animation-fill-mode'
-        - 'animation-play-state'
-
-        # transition
-        - 'transition'
-        - 'transition-delay'
-        - 'transition-duration'
-        - 'transition-property'
-        - 'transition-timing-function'
-
-        # counters
-        - 'counter-reset'
-        - 'counter-increment'
-
-        # breaks
-        - 'page-break-before'
-        - 'page-break-after'
-        - 'page-break-inside'
-      ignore-custom-properties: true
-  property-units:
-    - 1
-    - global:
-        - em
-        - rem
-        - px
-        - vh
-        - vw
-        - vmin
-        - vmax
-        - deg
-        - rad
-        - s
-        - dpi
-        - '%'
-  quotes:
-    - 1 #!todo set this to 2, when autofix with sass-lint-auto-fix is possible
-    - style: single
-  shorthand-values:
-    - 0 #!todo set this to 2, when autofix with sass-lint-auto-fix is possible
-    - allowed-shorthands:
-        - 1
-        - 2
-        - 3
-        - 4
-  single-line-per-selector: 1
-  space-after-bang:
-    - 1
-    - include: false
-  space-after-colon:
-    - 1
-    - include: true
-  space-after-comma:
-    - 1
-    - include: true
-  space-before-bang:
-    - 2
-    - include: true
-  space-before-brace:
-    - 1
-    - include: true
-  space-before-colon: 1
-  space-between-parens:
-    - 1
-    - include: false
-  trailing-semicolon: 1
-  url-quotes: 1
-  variable-for-property:
-    - 1
-    - properties: [
-      z-index,
-    ]
-  variable-name-format:
-    - 1
-    - allow-leading-underscore: true
-      convention: hyphenatedlowercase
-  zero-unit: 1
-  
-
-resolvers:
-  attribute-quotes: 1
-  base-resover: 1
-  border-zero: 1
-  empty-line-between-blocks: 1
-  final-newline: 1
-  hex-length: 1
-  hex-notation: 1
-  leading-zero: 1 #not implemented yet for sass-lint-auto-fix
-  indentation: 1 #not implemented yet for sass-lint-auto-fix
-  no-color-keywords: 1
-  no-css-comments: 0
-  no-important: 0
-  no-trailing-zero: 1
-  property-sort-order: 1
-  shorthand-values: 1 #not implemented yet for sass-lint-auto-fix
-  space-after-bang: 1
-  space-after-colon: 1
-  space-after-comma: 1 #not implemented yet for sass-lint-auto-fix
-  space-before-bang: 1
-  space-before-colon: 1
-  space-between-parens: 1
-  trailing-semicolon: 1 #not implemented yet for sass-lint-auto-fix
-  url-quotes: 1
-  quotes: 1 #not implemented yet for sass-lint-auto-fix
-  zero-unit: 1
\ No newline at end of file
diff --git a/ui/legacy/css/src/Gulpfile.js b/ui/legacy/css/src/Gulpfile.js
deleted file mode 100644
index dd37dd7..0000000
--- a/ui/legacy/css/src/Gulpfile.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-// 
-//   http://www.apache.org/licenses/LICENSE-2.0
-// 
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-'use strict';
-
-const Fiber = require('fibers');
-const gulp = require('gulp');
-const sass = require('gulp-sass');
-const sassLint = require('gulp-sass-lint');
-const sourcemaps = require('gulp-sourcemaps');
-const autoprefixer = require('gulp-autoprefixer');
-const shell = require('gulp-shell');
-
-const pathRoot = process.cwd();
-const pathCss = pathRoot + '/../';
-const pathSass = pathRoot + '/scss/';
-const filesSass = pathRoot + '/scss/*.scss';
-const browserVersions = [
-  "last 1 versions",
-  "last 20 firefox versions",
-  "last 20 chrome versions",
-  "last 5 opera versions",
-  "ie >= 9",
-  "last 5 edge versions",
-  "safari >= 9",
-  "last 3 ios versions",
-  "last 5 android versions",
-  "last 5 ie_mob versions",
-  "last 5 and_chr versions"
-];
-
-
-gulp.task('lintSassFix',
-  shell.task('npm run fix')
-);
-
-const buildSass = (style) => {
-  const buildSass = () => { // function and name is required here for gulp-task naming-process
-    return gulp.src(filesSass)
-      .pipe(sourcemaps.init())
-      .pipe(
-        sass({
-          fiber: Fiber,
-          outputStyle: style
-        })
-        .on('error', sass.logError))
-      .pipe(autoprefixer({
-        browsers: browserVersions, //todo remove all current prefix rules from css
-        cascade: false // prefix indentation in one line?
-      }))
-      .pipe(sourcemaps.write('./src/sourcemaps'))
-      .pipe(gulp.dest(pathCss));
-  }
-
-  return buildSass;
-};
-
-const lintSass = () => {
-  return gulp.src(pathSass + '**/*.scss')
-    .pipe(sassLint())
-    .pipe(sassLint.format());
-};
-
-const watchSass = () => {
-  gulp.watch(pathSass + '**/*.scss',
-    gulp.series(
-      'lintSassFix',
-      lintSass,
-      buildSass('expanded')
-    )
-  );
-};
-
-
-gulp.task('default',
-  gulp.series(
-    'lintSassFix',
-    lintSass,
-    buildSass('expanded'),
-    gulp.parallel(
-      watchSass
-    )
-  )
-);
\ No newline at end of file
diff --git a/ui/legacy/css/src/package-lock.json b/ui/legacy/css/src/package-lock.json
deleted file mode 100644
index 1f2de5b..0000000
--- a/ui/legacy/css/src/package-lock.json
+++ /dev/null
@@ -1,6019 +0,0 @@
-{
-  "name": "scss-compiler-cloudstack",
-  "version": "1.0.0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@gulp-sourcemaps/identity-map": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz",
-      "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==",
-      "dev": true,
-      "requires": {
-        "acorn": "^5.0.3",
-        "css": "^2.2.1",
-        "normalize-path": "^2.1.1",
-        "source-map": "^0.6.0",
-        "through2": "^2.0.3"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "@gulp-sourcemaps/map-sources": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
-      "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^2.0.1",
-        "through2": "^2.0.3"
-      }
-    },
-    "@sentry/core": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.1.0.tgz",
-      "integrity": "sha512-i7kDqpJuSv4FBs3UvexPvt8Tr1jrbJqHxMeWKoURbMd4btd/sgv7lCXLKOuiRVy2V2IZ3NAPiCikVqK2rEdKKA==",
-      "dev": true,
-      "requires": {
-        "@sentry/hub": "5.1.0",
-        "@sentry/minimal": "5.1.0",
-        "@sentry/types": "5.1.0",
-        "@sentry/utils": "5.1.0",
-        "tslib": "^1.9.3"
-      }
-    },
-    "@sentry/hub": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.1.0.tgz",
-      "integrity": "sha512-gz46z4u65Uywn9ZrSuWNDJRjBgllA1pqov27fhdSPu5yvSr7dwdUCKO/5pvuXNQrBl79OxKzsXwUySX/9p5M1g==",
-      "dev": true,
-      "requires": {
-        "@sentry/types": "5.1.0",
-        "@sentry/utils": "5.1.0",
-        "tslib": "^1.9.3"
-      }
-    },
-    "@sentry/minimal": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.1.0.tgz",
-      "integrity": "sha512-+TySfvc6DiZ/06m5HePBNkIoDiWsRQClYWrVMysHRz1GzJhvWLmPdCikMXrfSZinlyrGIZGZAuNkd3LhmmtUrQ==",
-      "dev": true,
-      "requires": {
-        "@sentry/hub": "5.1.0",
-        "@sentry/types": "5.1.0",
-        "tslib": "^1.9.3"
-      }
-    },
-    "@sentry/node": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.1.0.tgz",
-      "integrity": "sha512-Bg48c/Zc5CUNHqPdzQfV7NySMHkJTvWxZZzR/kKVv9m7B9FIQ4bLyriLDpPOw8AMnZ0GO69WVEXiqdoZ3An2sg==",
-      "dev": true,
-      "requires": {
-        "@sentry/core": "5.1.0",
-        "@sentry/hub": "5.1.0",
-        "@sentry/types": "5.1.0",
-        "@sentry/utils": "5.1.0",
-        "cookie": "0.3.1",
-        "https-proxy-agent": "2.2.1",
-        "lru_map": "0.3.3",
-        "tslib": "^1.9.3"
-      }
-    },
-    "@sentry/types": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.1.0.tgz",
-      "integrity": "sha512-Uo5Fla1RjCfmliQWsV4ehZ1Q4z4taMC66ZGrqrUWx7FyQsaps+TJfQE5QiTIs+jWD6CbgVRf/N+pNMmpIK8JVA==",
-      "dev": true
-    },
-    "@sentry/utils": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.1.0.tgz",
-      "integrity": "sha512-p2W9Zg6IAtVFd2ejk850ixcv/01++eXA4y1t9YT+feocV3GyhHirz6aGFviPFGcOjSeAai+uuV2rvzFeLJtmkg==",
-      "dev": true,
-      "requires": {
-        "@sentry/types": "5.1.0",
-        "tslib": "^1.9.3"
-      }
-    },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "acorn": {
-      "version": "5.7.3",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
-      "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
-      "dev": true
-    },
-    "acorn-jsx": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
-      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
-      "dev": true,
-      "requires": {
-        "acorn": "^3.0.4"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
-          "dev": true
-        }
-      }
-    },
-    "agent-base": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
-      "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
-      "dev": true,
-      "requires": {
-        "es6-promisify": "^5.0.0"
-      }
-    },
-    "ajv": {
-      "version": "6.10.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
-      "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
-      "dev": true,
-      "requires": {
-        "fast-deep-equal": "^2.0.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "ajv-keywords": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
-      "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
-      "dev": true
-    },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
-      "dev": true
-    },
-    "ansi-colors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "^0.1.0"
-      }
-    },
-    "ansi-cyan": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
-      "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-escapes": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
-      "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
-      "dev": true
-    },
-    "ansi-gray": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
-      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-red": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
-      "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^1.9.0"
-      }
-    },
-    "ansi-wrap": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
-      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
-      "dev": true
-    },
-    "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
-      "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "append-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
-      "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
-      "dev": true,
-      "requires": {
-        "buffer-equal": "^1.0.0"
-      }
-    },
-    "aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
-      "dev": true
-    },
-    "archy": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
-      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
-      "dev": true
-    },
-    "are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
-      "dev": true,
-      "requires": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-filter": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
-      "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-map": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
-      "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
-    },
-    "array-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
-      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
-      "dev": true
-    },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true
-    },
-    "array-initial": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
-      "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
-      "dev": true,
-      "requires": {
-        "array-slice": "^1.0.0",
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "array-last": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
-      "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "array-slice": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
-      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
-      "dev": true
-    },
-    "array-sort": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
-      "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
-      "dev": true,
-      "requires": {
-        "default-compare": "^1.0.0",
-        "get-value": "^2.0.6",
-        "kind-of": "^5.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
-    },
-    "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
-      "requires": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
-    },
-    "async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
-      "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.11"
-      }
-    },
-    "async-done": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz",
-      "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.2",
-        "process-nextick-args": "^1.0.7",
-        "stream-exhaust": "^1.0.1"
-      }
-    },
-    "async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
-      "dev": true
-    },
-    "async-foreach": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
-      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
-      "dev": true
-    },
-    "async-settle": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
-      "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
-      "dev": true,
-      "requires": {
-        "async-done": "^1.2.2"
-      }
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
-    },
-    "autoprefixer": {
-      "version": "9.5.1",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz",
-      "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.5.4",
-        "caniuse-lite": "^1.0.30000957",
-        "normalize-range": "^0.1.2",
-        "num2fraction": "^1.2.2",
-        "postcss": "^7.0.14",
-        "postcss-value-parser": "^3.3.1"
-      }
-    },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true
-    },
-    "aws4": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
-      "dev": true
-    },
-    "bach": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
-      "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
-      "dev": true,
-      "requires": {
-        "arr-filter": "^1.1.1",
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "array-each": "^1.0.0",
-        "array-initial": "^1.0.0",
-        "array-last": "^1.1.1",
-        "async-done": "^1.2.2",
-        "async-settle": "^1.0.0",
-        "now-and-later": "^2.0.0"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "binary-extensions": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-      "dev": true
-    },
-    "block-stream": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
-      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
-      "dev": true,
-      "requires": {
-        "inherits": "~2.0.0"
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "browserslist": {
-      "version": "4.5.5",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.5.tgz",
-      "integrity": "sha512-0QFO1r/2c792Ohkit5XI8Cm8pDtZxgNl2H6HU4mHrpYz7314pEYcsAVVatM0l/YmxPnEzh9VygXouj4gkFUTKA==",
-      "dev": true,
-      "requires": {
-        "caniuse-lite": "^1.0.30000960",
-        "electron-to-chromium": "^1.3.124",
-        "node-releases": "^1.1.14"
-      }
-    },
-    "buffer-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
-      "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
-      "dev": true
-    },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-      "dev": true
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "caller-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
-      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
-      "dev": true,
-      "requires": {
-        "callsites": "^0.2.0"
-      }
-    },
-    "callsites": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
-      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
-      "dev": true
-    },
-    "camelcase": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-      "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
-      "dev": true
-    },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-          "dev": true
-        }
-      }
-    },
-    "caniuse-lite": {
-      "version": "1.0.30000963",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000963.tgz",
-      "integrity": "sha512-n4HUiullc7Lw0LyzpeLa2ffP8KxFBGdxqD/8G3bSL6oB758hZ2UE2CVK+tQN958tJIi0/tfpjAc67aAtoHgnrQ==",
-      "dev": true
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true
-    },
-    "chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "chokidar": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz",
-      "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.1",
-        "braces": "^2.3.2",
-        "fsevents": "^1.2.7",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.3",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "normalize-path": "^3.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.2.1",
-        "upath": "^1.1.1"
-      },
-      "dependencies": {
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
-        }
-      }
-    },
-    "chownr": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
-      "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
-      "dev": true
-    },
-    "circular-json": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
-      "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
-      "dev": true
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "cli-cursor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
-      "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
-      "dev": true,
-      "requires": {
-        "restore-cursor": "^1.0.1"
-      }
-    },
-    "cli-width": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
-      "dev": true
-    },
-    "cliui": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      }
-    },
-    "clone": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
-      "dev": true
-    },
-    "clone-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
-      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
-      "dev": true
-    },
-    "clone-stats": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
-      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
-      "dev": true
-    },
-    "cloneable-readable": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
-      "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "process-nextick-args": "^2.0.0",
-        "readable-stream": "^2.3.5"
-      },
-      "dependencies": {
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-          "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
-          "dev": true
-        }
-      }
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "dev": true
-    },
-    "collection-map": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
-      "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
-      "dev": true,
-      "requires": {
-        "arr-map": "^2.0.2",
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "color-support": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-      "dev": true
-    },
-    "combined-stream": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
-      "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "commander": {
-      "version": "2.20.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
-      "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
-      "dev": true
-    },
-    "component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "console-control-strings": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-      "dev": true
-    },
-    "convert-source-map": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
-      "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "cookie": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
-      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
-      "dev": true
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "copy-props": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
-      "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
-      "dev": true,
-      "requires": {
-        "each-props": "^1.3.0",
-        "is-plain-object": "^2.0.1"
-      }
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
-    },
-    "cross-spawn": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
-      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
-      "dev": true,
-      "requires": {
-        "lru-cache": "^4.0.1",
-        "which": "^1.2.9"
-      }
-    },
-    "css": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
-      "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "source-map": "^0.6.1",
-        "source-map-resolve": "^0.5.2",
-        "urix": "^0.1.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
-    "d": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
-      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
-      "dev": true,
-      "requires": {
-        "es5-ext": "^0.10.9"
-      }
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "debug-fabulous": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz",
-      "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==",
-      "dev": true,
-      "requires": {
-        "debug": "3.X",
-        "memoizee": "0.4.X",
-        "object-assign": "4.X"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true
-        }
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "default-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
-      "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^5.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "default-resolution": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
-      "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
-      "dev": true
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "delegates": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-      "dev": true
-    },
-    "detect-file": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
-      "dev": true
-    },
-    "detect-libc": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
-      "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
-      "dev": true
-    },
-    "detect-newline": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
-      "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
-      "dev": true
-    },
-    "doctrine": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
-      "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2",
-        "isarray": "^1.0.0"
-      }
-    },
-    "duplexify": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
-      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "each-props": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
-      "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
-      "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.1",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
-      "requires": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "electron-to-chromium": {
-      "version": "1.3.127",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.127.tgz",
-      "integrity": "sha512-1o25iFRf/dbgauTWalEzmD1EmRN3a2CzP/K7UVpYLEBduk96LF0FyUdCcf4Ry2mAWJ1VxyblFjC93q6qlLwA2A==",
-      "dev": true
-    },
-    "end-of-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
-      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es5-ext": {
-      "version": "0.10.49",
-      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
-      "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "~2.0.3",
-        "es6-symbol": "~3.1.1",
-        "next-tick": "^1.0.0"
-      }
-    },
-    "es6-iterator": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.35",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "es6-map": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
-      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14",
-        "es6-iterator": "~2.0.1",
-        "es6-set": "~0.1.5",
-        "es6-symbol": "~3.1.1",
-        "event-emitter": "~0.3.5"
-      }
-    },
-    "es6-promise": {
-      "version": "4.2.6",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
-      "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==",
-      "dev": true
-    },
-    "es6-promisify": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
-      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
-      "dev": true,
-      "requires": {
-        "es6-promise": "^4.0.3"
-      }
-    },
-    "es6-set": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
-      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14",
-        "es6-iterator": "~2.0.1",
-        "es6-symbol": "3.1.1",
-        "event-emitter": "~0.3.5"
-      }
-    },
-    "es6-symbol": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
-      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
-      }
-    },
-    "es6-weak-map": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
-      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.14",
-        "es6-iterator": "^2.0.1",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "escope": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
-      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
-      "dev": true,
-      "requires": {
-        "es6-map": "^0.1.3",
-        "es6-weak-map": "^2.0.1",
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "eslint": {
-      "version": "2.13.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz",
-      "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.3",
-        "concat-stream": "^1.4.6",
-        "debug": "^2.1.1",
-        "doctrine": "^1.2.2",
-        "es6-map": "^0.1.3",
-        "escope": "^3.6.0",
-        "espree": "^3.1.6",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^1.1.1",
-        "glob": "^7.0.3",
-        "globals": "^9.2.0",
-        "ignore": "^3.1.2",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^0.12.0",
-        "is-my-json-valid": "^2.10.0",
-        "is-resolvable": "^1.0.0",
-        "js-yaml": "^3.5.1",
-        "json-stable-stringify": "^1.0.0",
-        "levn": "^0.3.0",
-        "lodash": "^4.0.0",
-        "mkdirp": "^0.5.0",
-        "optionator": "^0.8.1",
-        "path-is-absolute": "^1.0.0",
-        "path-is-inside": "^1.0.1",
-        "pluralize": "^1.2.1",
-        "progress": "^1.1.8",
-        "require-uncached": "^1.0.2",
-        "shelljs": "^0.6.0",
-        "strip-json-comments": "~1.0.1",
-        "table": "^3.7.8",
-        "text-table": "~0.2.0",
-        "user-home": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "espree": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
-      "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
-      "dev": true,
-      "requires": {
-        "acorn": "^5.5.0",
-        "acorn-jsx": "^3.0.0"
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^4.1.0"
-      }
-    },
-    "estraverse": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
-    },
-    "event-emitter": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
-      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
-      }
-    },
-    "exit-hook": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
-      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
-      "dev": true
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
-    },
-    "fancy-log": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
-      "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
-      "dev": true,
-      "requires": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "parse-node-version": "^1.0.0",
-        "time-stamp": "^1.0.0"
-      }
-    },
-    "fast-deep-equal": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-      "dev": true
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "fibers": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/fibers/-/fibers-3.1.1.tgz",
-      "integrity": "sha512-dl3Ukt08rHVQfY8xGD0ODwyjwrRALtaghuqGH2jByYX1wpY+nAnRQjJ6Dbqq0DnVgNVQ9yibObzbF4IlPyiwPw==",
-      "dev": true,
-      "requires": {
-        "detect-libc": "^1.0.3"
-      }
-    },
-    "figures": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
-      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.5",
-        "object-assign": "^4.1.0"
-      }
-    },
-    "file-entry-cache": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz",
-      "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^1.2.1",
-        "object-assign": "^4.0.1"
-      }
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "find-up": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-      "dev": true,
-      "requires": {
-        "path-exists": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "findup-sync": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
-      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
-      "dev": true,
-      "requires": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      }
-    },
-    "fined": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
-      "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "is-plain-object": "^2.0.3",
-        "object.defaults": "^1.1.0",
-        "object.pick": "^1.2.0",
-        "parse-filepath": "^1.0.1"
-      }
-    },
-    "flagged-respawn": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
-      "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
-      "dev": true
-    },
-    "flat-cache": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
-      "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
-      "dev": true,
-      "requires": {
-        "circular-json": "^0.3.1",
-        "graceful-fs": "^4.1.2",
-        "rimraf": "~2.6.2",
-        "write": "^0.2.1"
-      }
-    },
-    "flush-write-stream": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
-      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.3.6"
-      }
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "for-own": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
-      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.1"
-      }
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
-    },
-    "form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "front-matter": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.2.tgz",
-      "integrity": "sha1-91mDufL0E75ljJPf172M5AePXNs=",
-      "dev": true,
-      "requires": {
-        "js-yaml": "^3.4.6"
-      }
-    },
-    "fs-extra": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
-      "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^3.0.0",
-        "universalify": "^0.1.0"
-      }
-    },
-    "fs-minipass": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
-      "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
-      "dev": true,
-      "requires": {
-        "minipass": "^2.2.1"
-      }
-    },
-    "fs-mkdirp-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
-      "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "through2": "^2.0.3"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.8.tgz",
-      "integrity": "sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "nan": "^2.12.1",
-        "node-pre-gyp": "^0.12.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "deep-extend": {
-          "version": "0.6.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minipass": {
-          "version": "2.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.2.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.3.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "debug": "^4.1.0",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.12.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.1",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.2.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.4.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.6.0",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.7.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.1.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.3.4",
-            "minizlib": "^1.1.1",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2 || 2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "yallist": {
-          "version": "3.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "fstream": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
-      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "inherits": "~2.0.0",
-        "mkdirp": ">=0.5 0",
-        "rimraf": "2"
-      }
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.0.3",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
-        "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
-      }
-    },
-    "gaze": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
-      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
-      "dev": true,
-      "requires": {
-        "globule": "^1.0.0"
-      }
-    },
-    "generate-function": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
-      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
-      "dev": true,
-      "requires": {
-        "is-property": "^1.0.2"
-      }
-    },
-    "generate-object-property": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
-      "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
-      "dev": true,
-      "requires": {
-        "is-property": "^1.0.0"
-      }
-    },
-    "get-caller-file": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
-      "dev": true
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "glob-stream": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
-      "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "glob": "^7.1.1",
-        "glob-parent": "^3.1.0",
-        "is-negated-glob": "^1.0.0",
-        "ordered-read-streams": "^1.0.0",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.1.5",
-        "remove-trailing-separator": "^1.0.1",
-        "to-absolute-glob": "^2.0.0",
-        "unique-stream": "^2.0.2"
-      }
-    },
-    "glob-watcher": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz",
-      "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-done": "^1.2.0",
-        "chokidar": "^2.0.0",
-        "is-negated-glob": "^1.0.0",
-        "just-debounce": "^1.0.0",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "global-modules": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      }
-    },
-    "globals": {
-      "version": "9.18.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
-      "dev": true
-    },
-    "globule": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
-      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
-      "dev": true,
-      "requires": {
-        "glob": "~7.1.1",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2"
-      }
-    },
-    "glogg": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
-      "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
-      "dev": true,
-      "requires": {
-        "sparkles": "^1.0.0"
-      }
-    },
-    "gonzales-pe-sl": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz",
-      "integrity": "sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=",
-      "dev": true,
-      "requires": {
-        "minimist": "1.1.x"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz",
-          "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=",
-          "dev": true
-        }
-      }
-    },
-    "graceful-fs": {
-      "version": "4.1.15",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
-      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
-      "dev": true
-    },
-    "gulp": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.1.tgz",
-      "integrity": "sha512-yDVtVunxrAdsk7rIV/b7lVSBifPN1Eqe6wTjsESGrFcL+MEVzaaeNTkpUuGTUptloSOU+8oJm/lBJbgPV+tMAw==",
-      "dev": true,
-      "requires": {
-        "glob-watcher": "^5.0.3",
-        "gulp-cli": "^2.2.0",
-        "undertaker": "^1.2.1",
-        "vinyl-fs": "^3.0.0"
-      },
-      "dependencies": {
-        "gulp-cli": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz",
-          "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^1.0.1",
-            "archy": "^1.0.0",
-            "array-sort": "^1.0.0",
-            "color-support": "^1.1.3",
-            "concat-stream": "^1.6.0",
-            "copy-props": "^2.0.1",
-            "fancy-log": "^1.3.2",
-            "gulplog": "^1.0.0",
-            "interpret": "^1.1.0",
-            "isobject": "^3.0.1",
-            "liftoff": "^3.1.0",
-            "matchdep": "^2.0.0",
-            "mute-stdout": "^1.0.0",
-            "pretty-hrtime": "^1.0.0",
-            "replace-homedir": "^1.0.0",
-            "semver-greatest-satisfied-range": "^1.1.0",
-            "v8flags": "^3.0.1",
-            "yargs": "^7.1.0"
-          }
-        }
-      }
-    },
-    "gulp-autoprefixer": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-6.1.0.tgz",
-      "integrity": "sha512-Ti/BUFe+ekhbDJfspZIMiOsOvw51KhI9EncsDfK7NaxjqRm+v4xS9v99kPxEoiDavpWqQWvG8Y6xT1mMlB3aXA==",
-      "dev": true,
-      "requires": {
-        "autoprefixer": "^9.5.1",
-        "fancy-log": "^1.3.2",
-        "plugin-error": "^1.0.1",
-        "postcss": "^7.0.2",
-        "through2": "^3.0.1",
-        "vinyl-sourcemaps-apply": "^0.2.1"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
-          "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "2 || 3"
-          }
-        }
-      }
-    },
-    "gulp-sass": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.0.2.tgz",
-      "integrity": "sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.3.0",
-        "lodash.clonedeep": "^4.3.2",
-        "node-sass": "^4.8.3",
-        "plugin-error": "^1.0.1",
-        "replace-ext": "^1.0.0",
-        "strip-ansi": "^4.0.0",
-        "through2": "^2.0.0",
-        "vinyl-sourcemaps-apply": "^0.2.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^3.0.0"
-          }
-        }
-      }
-    },
-    "gulp-sass-lint": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/gulp-sass-lint/-/gulp-sass-lint-1.4.0.tgz",
-      "integrity": "sha512-XerYvHx7rznInkedMw5Ayif+p8EhysOVHUBvlgUa0FSl88H2cjNjaRZ3NGn5Efmp+2HxpXp4NHqMIbOSdwef3A==",
-      "dev": true,
-      "requires": {
-        "plugin-error": "^0.1.2",
-        "sass-lint": "^1.12.0",
-        "through2": "^2.0.2"
-      },
-      "dependencies": {
-        "arr-diff": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
-          "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1",
-            "array-slice": "^0.2.3"
-          }
-        },
-        "arr-union": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
-          "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
-          "dev": true
-        },
-        "array-slice": {
-          "version": "0.2.3",
-          "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
-          "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
-          "dev": true
-        },
-        "extend-shallow": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
-          "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^1.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
-          "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
-          "dev": true
-        },
-        "plugin-error": {
-          "version": "0.1.2",
-          "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
-          "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
-          "dev": true,
-          "requires": {
-            "ansi-cyan": "^0.1.1",
-            "ansi-red": "^0.1.1",
-            "arr-diff": "^1.0.1",
-            "arr-union": "^2.0.1",
-            "extend-shallow": "^1.1.2"
-          }
-        }
-      }
-    },
-    "gulp-shell": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.7.0.tgz",
-      "integrity": "sha512-rpMbI6+b9LZNLB+KkOeqWynLdqVtypy8v68spDVjvMg1cVaVhNQILYVXPvmeH/KtcrPv4JLmoEJeElEB6/IvcA==",
-      "dev": true,
-      "requires": {
-        "async": "^2.6.2",
-        "chalk": "^2.4.2",
-        "fancy-log": "^1.3.3",
-        "lodash.template": "^4.4.0",
-        "plugin-error": "^1.0.1",
-        "through2": "^3.0.1"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
-          "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "2 || 3"
-          }
-        }
-      }
-    },
-    "gulp-sourcemaps": {
-      "version": "2.6.5",
-      "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz",
-      "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==",
-      "dev": true,
-      "requires": {
-        "@gulp-sourcemaps/identity-map": "1.X",
-        "@gulp-sourcemaps/map-sources": "1.X",
-        "acorn": "5.X",
-        "convert-source-map": "1.X",
-        "css": "2.X",
-        "debug-fabulous": "1.X",
-        "detect-newline": "2.X",
-        "graceful-fs": "4.X",
-        "source-map": "~0.6.0",
-        "strip-bom-string": "1.X",
-        "through2": "2.X"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "gulplog": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
-      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
-      "dev": true,
-      "requires": {
-        "glogg": "^1.0.0"
-      }
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true
-    },
-    "har-validator": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
-      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.5.5",
-        "har-schema": "^2.0.0"
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
-      "dev": true
-    },
-    "has-unicode": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
-      "dev": true
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "homedir-polyfill": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-      "dev": true,
-      "requires": {
-        "parse-passwd": "^1.0.0"
-      }
-    },
-    "hosted-git-info": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
-      "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
-      "dev": true
-    },
-    "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      }
-    },
-    "https-proxy-agent": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
-      "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
-      "dev": true,
-      "requires": {
-        "agent-base": "^4.1.0",
-        "debug": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true
-        }
-      }
-    },
-    "ignore": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
-      "dev": true
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "in-publish": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
-      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
-      "dev": true
-    },
-    "indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
-    },
-    "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
-      "dev": true
-    },
-    "inquirer": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
-      "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^1.1.0",
-        "ansi-regex": "^2.0.0",
-        "chalk": "^1.0.0",
-        "cli-cursor": "^1.0.1",
-        "cli-width": "^2.0.0",
-        "figures": "^1.3.5",
-        "lodash": "^4.3.0",
-        "readline2": "^1.0.1",
-        "run-async": "^0.1.0",
-        "rx-lite": "^3.1.2",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.0",
-        "through": "^2.3.6"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "interpret": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
-      "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
-      "dev": true
-    },
-    "invert-kv": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
-      "dev": true
-    },
-    "is-absolute": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
-      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
-      "dev": true,
-      "requires": {
-        "is-relative": "^1.0.0",
-        "is-windows": "^1.0.1"
-      }
-    },
-    "is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "dev": true,
-      "requires": {
-        "binary-extensions": "^1.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
-    "is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
-    "is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-my-ip-valid": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
-      "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
-      "dev": true
-    },
-    "is-my-json-valid": {
-      "version": "2.19.0",
-      "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz",
-      "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==",
-      "dev": true,
-      "requires": {
-        "generate-function": "^2.0.0",
-        "generate-object-property": "^1.1.0",
-        "is-my-ip-valid": "^1.0.0",
-        "jsonpointer": "^4.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "is-negated-glob": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
-      "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
-      "dev": true
-    },
-    "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
-      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
-      "dev": true
-    },
-    "is-property": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-      "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
-      "dev": true
-    },
-    "is-relative": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
-      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
-      "dev": true,
-      "requires": {
-        "is-unc-path": "^1.0.0"
-      }
-    },
-    "is-resolvable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
-      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
-      "dev": true
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-unc-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
-      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
-      "dev": true,
-      "requires": {
-        "unc-path-regex": "^0.1.2"
-      }
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true
-    },
-    "is-valid-glob": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
-      "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
-      "dev": true
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
-    },
-    "js-base64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
-      "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==",
-      "dev": true
-    },
-    "js-yaml": {
-      "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true
-    },
-    "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
-    },
-    "json-stable-stringify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
-      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
-      "dev": true,
-      "requires": {
-        "jsonify": "~0.0.0"
-      }
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
-    },
-    "jsonfile": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
-      "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "jsonify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
-      "dev": true
-    },
-    "jsonpointer": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
-      "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
-      "dev": true
-    },
-    "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      }
-    },
-    "just-debounce": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
-      "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
-      "dev": true
-    },
-    "kind-of": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-      "dev": true
-    },
-    "known-css-properties": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.3.0.tgz",
-      "integrity": "sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==",
-      "dev": true
-    },
-    "last-run": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
-      "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
-      "dev": true,
-      "requires": {
-        "default-resolution": "^2.0.0",
-        "es6-weak-map": "^2.0.1"
-      }
-    },
-    "lazystream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
-      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.5"
-      }
-    },
-    "lcid": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^1.0.0"
-      }
-    },
-    "lead": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
-      "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
-      "dev": true,
-      "requires": {
-        "flush-write-stream": "^1.0.2"
-      }
-    },
-    "levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      }
-    },
-    "liftoff": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
-      "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "findup-sync": "^3.0.0",
-        "fined": "^1.0.1",
-        "flagged-respawn": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.0",
-        "rechoir": "^0.6.2",
-        "resolve": "^1.1.7"
-      }
-    },
-    "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.11",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-      "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
-      "dev": true
-    },
-    "lodash._reinterpolate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
-      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
-      "dev": true
-    },
-    "lodash.assign": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
-      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
-      "dev": true
-    },
-    "lodash.capitalize": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
-      "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=",
-      "dev": true
-    },
-    "lodash.clonedeep": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
-      "dev": true
-    },
-    "lodash.kebabcase": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
-      "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
-      "dev": true
-    },
-    "lodash.mergewith": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
-      "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
-      "dev": true
-    },
-    "lodash.template": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
-      "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
-      "dev": true,
-      "requires": {
-        "lodash._reinterpolate": "~3.0.0",
-        "lodash.templatesettings": "^4.0.0"
-      }
-    },
-    "lodash.templatesettings": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
-      "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
-      "dev": true,
-      "requires": {
-        "lodash._reinterpolate": "~3.0.0"
-      }
-    },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "dev": true,
-      "requires": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      }
-    },
-    "lru-cache": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-      "dev": true,
-      "requires": {
-        "pseudomap": "^1.0.2",
-        "yallist": "^2.1.2"
-      }
-    },
-    "lru-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
-      "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
-      "dev": true,
-      "requires": {
-        "es5-ext": "~0.10.2"
-      }
-    },
-    "lru_map": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
-      "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=",
-      "dev": true
-    },
-    "make-iterator": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
-      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
-    "map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-      "dev": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "matchdep": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
-      "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
-      "dev": true,
-      "requires": {
-        "findup-sync": "^2.0.0",
-        "micromatch": "^3.0.4",
-        "resolve": "^1.4.0",
-        "stack-trace": "0.0.10"
-      },
-      "dependencies": {
-        "findup-sync": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
-          "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
-          "dev": true,
-          "requires": {
-            "detect-file": "^1.0.0",
-            "is-glob": "^3.1.0",
-            "micromatch": "^3.0.4",
-            "resolve-dir": "^1.0.1"
-          }
-        },
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "memoizee": {
-      "version": "0.4.14",
-      "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
-      "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.45",
-        "es6-weak-map": "^2.0.2",
-        "event-emitter": "^0.3.5",
-        "is-promise": "^2.1",
-        "lru-queue": "0.1",
-        "next-tick": "1",
-        "timers-ext": "^0.1.5"
-      }
-    },
-    "meow": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-      "dev": true,
-      "requires": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
-      }
-    },
-    "merge": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
-      "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      }
-    },
-    "mime-db": {
-      "version": "1.40.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
-      "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.24",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
-      "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
-      "dev": true,
-      "requires": {
-        "mime-db": "1.40.0"
-      }
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-      "dev": true
-    },
-    "minipass": {
-      "version": "2.3.5",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
-      "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.0"
-      },
-      "dependencies": {
-        "yallist": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
-          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
-          "dev": true
-        }
-      }
-    },
-    "minizlib": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
-      "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^2.2.1"
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
-      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "dev": true,
-      "requires": {
-        "minimist": "0.0.8"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-          "dev": true
-        }
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "mute-stdout": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
-      "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
-      "dev": true
-    },
-    "mute-stream": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
-      "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
-      "dev": true
-    },
-    "nan": {
-      "version": "2.13.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
-      "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==",
-      "dev": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "next-tick": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
-      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
-      "dev": true
-    },
-    "node-gyp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz",
-      "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.3",
-        "graceful-fs": "^4.1.2",
-        "mkdirp": "^0.5.0",
-        "nopt": "2 || 3",
-        "npmlog": "0 || 1 || 2 || 3 || 4",
-        "osenv": "0",
-        "request": "^2.87.0",
-        "rimraf": "2",
-        "semver": "~5.3.0",
-        "tar": "^4.4.8",
-        "which": "1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
-          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
-          "dev": true
-        }
-      }
-    },
-    "node-releases": {
-      "version": "1.1.17",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.17.tgz",
-      "integrity": "sha512-/SCjetyta1m7YXLgtACZGDYJdCSIBAWorDWkGCGZlydP2Ll7J48l7j/JxNYZ+xsgSPbWfdulVS/aY+GdjUsQ7Q==",
-      "dev": true,
-      "requires": {
-        "semver": "^5.3.0"
-      }
-    },
-    "node-sass": {
-      "version": "4.11.0",
-      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz",
-      "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==",
-      "dev": true,
-      "requires": {
-        "async-foreach": "^0.1.3",
-        "chalk": "^1.1.1",
-        "cross-spawn": "^3.0.0",
-        "gaze": "^1.0.0",
-        "get-stdin": "^4.0.1",
-        "glob": "^7.0.3",
-        "in-publish": "^2.0.0",
-        "lodash.assign": "^4.2.0",
-        "lodash.clonedeep": "^4.3.2",
-        "lodash.mergewith": "^4.6.0",
-        "meow": "^3.7.0",
-        "mkdirp": "^0.5.1",
-        "nan": "^2.10.0",
-        "node-gyp": "^3.8.0",
-        "npmlog": "^4.0.0",
-        "request": "^2.88.0",
-        "sass-graph": "^2.2.4",
-        "stdout-stream": "^1.4.0",
-        "true-case-path": "^1.0.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "node-gyp": {
-          "version": "3.8.0",
-          "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
-          "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
-          "dev": true,
-          "requires": {
-            "fstream": "^1.0.0",
-            "glob": "^7.0.3",
-            "graceful-fs": "^4.1.2",
-            "mkdirp": "^0.5.0",
-            "nopt": "2 || 3",
-            "npmlog": "0 || 1 || 2 || 3 || 4",
-            "osenv": "0",
-            "request": "^2.87.0",
-            "rimraf": "2",
-            "semver": "~5.3.0",
-            "tar": "^2.0.0",
-            "which": "1"
-          }
-        },
-        "semver": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
-          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        },
-        "tar": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
-          "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
-          "dev": true,
-          "requires": {
-            "block-stream": "*",
-            "fstream": "^1.0.2",
-            "inherits": "2"
-          }
-        }
-      }
-    },
-    "nopt": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
-      "requires": {
-        "remove-trailing-separator": "^1.0.1"
-      }
-    },
-    "normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
-      "dev": true
-    },
-    "now-and-later": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
-      "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.2"
-      }
-    },
-    "npmlog": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
-      "dev": true,
-      "requires": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
-      }
-    },
-    "num2fraction": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
-      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
-      "dev": true
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true
-    },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
-      }
-    },
-    "object.defaults": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
-      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
-      "dev": true,
-      "requires": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
-      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "object.reduce": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
-      "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "onetime": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
-      "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
-      "dev": true
-    },
-    "optionator": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
-      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
-      "dev": true,
-      "requires": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.4",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "wordwrap": "~1.0.0"
-      }
-    },
-    "ordered-read-streams": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
-      "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true
-    },
-    "os-locale": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
-      "dev": true,
-      "requires": {
-        "lcid": "^1.0.0"
-      }
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
-    "parse-filepath": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
-      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
-      "dev": true,
-      "requires": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parse-node-version": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
-      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
-      "dev": true
-    },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
-    "path-exists": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
-      "dev": true,
-      "requires": {
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
-    },
-    "path-root": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
-      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
-      "dev": true,
-      "requires": {
-        "path-root-regex": "^0.1.0"
-      }
-    },
-    "path-root-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
-      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
-      "dev": true
-    },
-    "path-type": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "plugin-error": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^1.0.1",
-        "arr-diff": "^4.0.0",
-        "arr-union": "^3.1.0",
-        "extend-shallow": "^3.0.2"
-      }
-    },
-    "pluralize": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
-      "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
-      "dev": true
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true
-    },
-    "postcss": {
-      "version": "7.0.14",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz",
-      "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-value-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-      "dev": true
-    },
-    "prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true
-    },
-    "pretty-hrtime": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
-      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
-      "dev": true
-    },
-    "progress": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
-      "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
-      "dev": true
-    },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true
-    },
-    "psl": {
-      "version": "1.1.31",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
-      "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
-      "dev": true
-    },
-    "pump": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
-      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "pumpify": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
-      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
-      "dev": true,
-      "requires": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
-    },
-    "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true
-    },
-    "read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      }
-    },
-    "read-pkg-up": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
-      "dev": true,
-      "requires": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-      "dev": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      },
-      "dependencies": {
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-          "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
-          "dev": true
-        }
-      }
-    },
-    "readdirp": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "readline2": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
-      "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
-      "dev": true,
-      "requires": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "mute-stream": "0.0.5"
-      }
-    },
-    "rechoir": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
-      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
-      "dev": true,
-      "requires": {
-        "resolve": "^1.1.6"
-      }
-    },
-    "redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-      "dev": true,
-      "requires": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      }
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "remove-bom-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
-      "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
-      "dev": true,
-      "requires": {
-        "is-buffer": "^1.1.5",
-        "is-utf8": "^0.2.1"
-      }
-    },
-    "remove-bom-stream": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
-      "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
-      "dev": true,
-      "requires": {
-        "remove-bom-buffer": "^3.0.0",
-        "safe-buffer": "^5.1.0",
-        "through2": "^2.0.3"
-      }
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
-    },
-    "repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
-    "replace-ext": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
-      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
-      "dev": true
-    },
-    "replace-homedir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
-      "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1",
-        "is-absolute": "^1.0.0",
-        "remove-trailing-separator": "^1.1.0"
-      }
-    },
-    "request": {
-      "version": "2.88.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
-      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
-      "dev": true,
-      "requires": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.0",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.4.3",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
-    },
-    "require-main-filename": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
-      "dev": true
-    },
-    "require-uncached": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
-      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
-      "dev": true,
-      "requires": {
-        "caller-path": "^0.1.0",
-        "resolve-from": "^1.0.0"
-      }
-    },
-    "resolve": {
-      "version": "1.10.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
-      "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
-      "dev": true,
-      "requires": {
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      }
-    },
-    "resolve-from": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
-      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
-      "dev": true
-    },
-    "resolve-options": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
-      "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
-      "dev": true,
-      "requires": {
-        "value-or-function": "^3.0.0"
-      }
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
-    },
-    "restore-cursor": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
-      "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
-      "dev": true,
-      "requires": {
-        "exit-hook": "^1.0.0",
-        "onetime": "^1.0.0"
-      }
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
-    "rimraf": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "run-async": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
-      "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0"
-      }
-    },
-    "rx-lite": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
-      "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=",
-      "dev": true
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "sass": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.19.0.tgz",
-      "integrity": "sha512-8kzKCgxCzh8/zEn3AuRwzLWVSSFj8omkiGwqdJdeOufjM+I88dXxu9LYJ/Gw4rRTHXesN0r1AixBuqM6yLQUJw==",
-      "dev": true,
-      "requires": {
-        "chokidar": "^2.0.0"
-      }
-    },
-    "sass-graph": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
-      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.0",
-        "lodash": "^4.0.0",
-        "scss-tokenizer": "^0.2.3",
-        "yargs": "^7.0.0"
-      }
-    },
-    "sass-lint": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/sass-lint/-/sass-lint-1.12.1.tgz",
-      "integrity": "sha1-Yw9pwhaqIGuCMvsqqQe98zNrbYM=",
-      "dev": true,
-      "requires": {
-        "commander": "^2.8.1",
-        "eslint": "^2.7.0",
-        "front-matter": "2.1.2",
-        "fs-extra": "^3.0.1",
-        "glob": "^7.0.0",
-        "globule": "^1.0.0",
-        "gonzales-pe-sl": "^4.2.3",
-        "js-yaml": "^3.5.4",
-        "known-css-properties": "^0.3.0",
-        "lodash.capitalize": "^4.1.0",
-        "lodash.kebabcase": "^4.0.0",
-        "merge": "^1.2.0",
-        "path-is-absolute": "^1.0.0",
-        "util": "^0.10.3"
-      }
-    },
-    "sass-lint-auto-fix": {
-      "version": "0.17.0",
-      "resolved": "https://registry.npmjs.org/sass-lint-auto-fix/-/sass-lint-auto-fix-0.17.0.tgz",
-      "integrity": "sha512-3JtGnAFFJ0aD0dTWzMhEc6m9VmCDpGvD+ag1q/XY9ItKbhWyi9zJqk4GNdbIAica3ulNX7rywAWFilw6nZaZ3g==",
-      "dev": true,
-      "requires": {
-        "@sentry/node": "^5.0.0",
-        "chalk": "^2.3.2",
-        "commander": "^2.15.1",
-        "glob": "^7.1.2",
-        "gonzales-pe-sl": "github:srowhani/gonzales-pe#dev",
-        "js-yaml": "^3.11.0",
-        "sass-lint": "^1.12.1"
-      },
-      "dependencies": {
-        "gonzales-pe-sl": {
-          "version": "github:srowhani/gonzales-pe#3b052416074edc280f7d04bbe40b2e410693c4a3",
-          "from": "github:srowhani/gonzales-pe#dev",
-          "dev": true,
-          "requires": {
-            "minimist": "1.1.x"
-          }
-        },
-        "minimist": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz",
-          "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=",
-          "dev": true
-        }
-      }
-    },
-    "scss-tokenizer": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
-      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
-      "dev": true,
-      "requires": {
-        "js-base64": "^2.1.8",
-        "source-map": "^0.4.2"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
-      }
-    },
-    "semver": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-      "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
-      "dev": true
-    },
-    "semver-greatest-satisfied-range": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
-      "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
-      "dev": true,
-      "requires": {
-        "sver-compat": "^1.5.0"
-      }
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "set-value": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
-      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "shelljs": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz",
-      "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=",
-      "dev": true
-    },
-    "signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
-      "dev": true
-    },
-    "slice-ansi": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
-      "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
-      "dev": true
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true
-    },
-    "source-map-resolve": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
-      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
-      "dev": true,
-      "requires": {
-        "atob": "^2.1.1",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
-    },
-    "sparkles": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
-      "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
-      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
-      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
-      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
-      "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
-      "dev": true
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "sshpk": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
-      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
-      "dev": true,
-      "requires": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      }
-    },
-    "stack-trace": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
-      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
-      "dev": true
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "stdout-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
-      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "stream-exhaust": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
-      "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
-      "dev": true
-    },
-    "stream-shift": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
-      "dev": true
-    },
-    "string-width": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-      "dev": true,
-      "requires": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      }
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-      "dev": true,
-      "requires": {
-        "is-utf8": "^0.2.0"
-      }
-    },
-    "strip-bom-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
-      "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
-      "dev": true
-    },
-    "strip-indent": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
-      "dev": true,
-      "requires": {
-        "get-stdin": "^4.0.1"
-      }
-    },
-    "strip-json-comments": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-      "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
-      "dev": true
-    },
-    "supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^3.0.0"
-      }
-    },
-    "sver-compat": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
-      "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "^2.0.1",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "table": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
-      "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
-      "dev": true,
-      "requires": {
-        "ajv": "^4.7.0",
-        "ajv-keywords": "^1.0.0",
-        "chalk": "^1.1.1",
-        "lodash": "^4.0.0",
-        "slice-ansi": "0.0.4",
-        "string-width": "^2.0.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "4.11.8",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
-          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
-          "dev": true,
-          "requires": {
-            "co": "^4.6.0",
-            "json-stable-stringify": "^1.0.1"
-          }
-        },
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-          "dev": true,
-          "requires": {
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^4.0.0"
-          },
-          "dependencies": {
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^3.0.0"
-              }
-            }
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "tar": {
-      "version": "4.4.8",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
-      "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
-      "dev": true,
-      "requires": {
-        "chownr": "^1.1.1",
-        "fs-minipass": "^1.2.5",
-        "minipass": "^2.3.4",
-        "minizlib": "^1.1.1",
-        "mkdirp": "^0.5.0",
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.2"
-      },
-      "dependencies": {
-        "yallist": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
-          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
-          "dev": true
-        }
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
-    },
-    "through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-      "dev": true,
-      "requires": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "through2-filter": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
-      "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
-      "dev": true,
-      "requires": {
-        "through2": "~2.0.0",
-        "xtend": "~4.0.0"
-      }
-    },
-    "time-stamp": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
-      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
-      "dev": true
-    },
-    "timers-ext": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
-      "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
-      "dev": true,
-      "requires": {
-        "es5-ext": "~0.10.46",
-        "next-tick": "1"
-      }
-    },
-    "to-absolute-glob": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
-      "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
-      "dev": true,
-      "requires": {
-        "is-absolute": "^1.0.0",
-        "is-negated-glob": "^1.0.0"
-      }
-    },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      }
-    },
-    "to-through": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
-      "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
-      "dev": true,
-      "requires": {
-        "through2": "^2.0.3"
-      }
-    },
-    "tough-cookie": {
-      "version": "2.4.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
-      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
-      "dev": true,
-      "requires": {
-        "psl": "^1.1.24",
-        "punycode": "^1.4.1"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
-      }
-    },
-    "trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true
-    },
-    "true-case-path": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
-      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.2"
-      }
-    },
-    "tslib": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
-      "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
-      "dev": true
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true
-    },
-    "type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2"
-      }
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
-      "dev": true
-    },
-    "unc-path-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
-      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
-      "dev": true
-    },
-    "undertaker": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz",
-      "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "bach": "^1.0.0",
-        "collection-map": "^1.0.0",
-        "es6-weak-map": "^2.0.1",
-        "last-run": "^1.1.0",
-        "object.defaults": "^1.0.0",
-        "object.reduce": "^1.0.0",
-        "undertaker-registry": "^1.0.0"
-      }
-    },
-    "undertaker-registry": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
-      "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
-      "dev": true
-    },
-    "union-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
-      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^0.4.3"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "set-value": {
-          "version": "0.4.3",
-          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
-          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.1",
-            "to-object-path": "^0.3.0"
-          }
-        }
-      }
-    },
-    "unique-stream": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
-      "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
-      "dev": true,
-      "requires": {
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "through2-filter": "^3.0.0"
-      }
-    },
-    "universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true
-    },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
-        }
-      }
-    },
-    "upath": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
-      "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==",
-      "dev": true
-    },
-    "uri-js": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
-    },
-    "user-home": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
-      "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0"
-      }
-    },
-    "util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "dev": true,
-      "requires": {
-        "inherits": "2.0.3"
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "uuid": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
-      "dev": true
-    },
-    "v8flags": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz",
-      "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "value-or-function": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
-      "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
-      "dev": true
-    },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "vinyl": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
-      "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
-      "dev": true,
-      "requires": {
-        "clone": "^2.1.1",
-        "clone-buffer": "^1.0.0",
-        "clone-stats": "^1.0.0",
-        "cloneable-readable": "^1.0.0",
-        "remove-trailing-separator": "^1.0.1",
-        "replace-ext": "^1.0.0"
-      }
-    },
-    "vinyl-fs": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
-      "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
-      "dev": true,
-      "requires": {
-        "fs-mkdirp-stream": "^1.0.0",
-        "glob-stream": "^6.1.0",
-        "graceful-fs": "^4.0.0",
-        "is-valid-glob": "^1.0.0",
-        "lazystream": "^1.0.0",
-        "lead": "^1.0.0",
-        "object.assign": "^4.0.4",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.3.3",
-        "remove-bom-buffer": "^3.0.0",
-        "remove-bom-stream": "^1.2.0",
-        "resolve-options": "^1.1.0",
-        "through2": "^2.0.0",
-        "to-through": "^2.0.0",
-        "value-or-function": "^3.0.0",
-        "vinyl": "^2.0.0",
-        "vinyl-sourcemap": "^1.1.0"
-      }
-    },
-    "vinyl-sourcemap": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
-      "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
-      "dev": true,
-      "requires": {
-        "append-buffer": "^1.0.2",
-        "convert-source-map": "^1.5.0",
-        "graceful-fs": "^4.1.6",
-        "normalize-path": "^2.1.1",
-        "now-and-later": "^2.0.0",
-        "remove-bom-buffer": "^3.0.0",
-        "vinyl": "^2.0.0"
-      }
-    },
-    "vinyl-sourcemaps-apply": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
-      "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.5.1"
-      }
-    },
-    "which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
-      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
-      "dev": true
-    },
-    "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.2 || 2"
-      }
-    },
-    "wordwrap": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-      "dev": true
-    },
-    "wrap-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "write": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
-      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^0.5.1"
-      }
-    },
-    "xtend": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
-      "dev": true
-    },
-    "y18n": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-      "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
-      "dev": true
-    },
-    "yallist": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-      "dev": true
-    },
-    "yargs": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
-      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^3.0.0",
-        "cliui": "^3.2.0",
-        "decamelize": "^1.1.1",
-        "get-caller-file": "^1.0.1",
-        "os-locale": "^1.4.0",
-        "read-pkg-up": "^1.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^1.0.1",
-        "set-blocking": "^2.0.0",
-        "string-width": "^1.0.2",
-        "which-module": "^1.0.0",
-        "y18n": "^3.2.1",
-        "yargs-parser": "^5.0.0"
-      }
-    },
-    "yargs-parser": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
-      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^3.0.0"
-      }
-    }
-  }
-}
diff --git a/ui/legacy/css/src/package.json b/ui/legacy/css/src/package.json
deleted file mode 100644
index efd6c7f..0000000
--- a/ui/legacy/css/src/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "name": "scss-compiler-cloudstack",
-  "version": "1.0.0",
-  "description": "Compiles scss files into css to manage comprehensive css complexity",
-  "main": "app.js",
-  "scripts": {
-    "start": "gulp",
-    "gulp": "gulp",
-    "fix": "sass-lint-auto-fix"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/apache/cloudstack.git"
-  },
-  "keywords": [
-    "cloudstack",
-    "compiler",
-    "scss",
-    "sass",
-    "css"
-  ],
-  "bugs": {
-    "url": "https://github.com/apache/cloudstack/issues"
-  },
-  "homepage": "https://github.com/apache/cloudstack#readme",
-  "devDependencies": {
-    "fibers": "^3.1.1",
-    "gulp": "^4.0.1",
-    "gulp-autoprefixer": "^6.0.0",
-    "gulp-sass": "^4.0.2",
-    "gulp-sass-lint": "^1.4.0",
-    "gulp-shell": "^0.7.0",
-    "gulp-sourcemaps": "^2.6.5",
-    "node-gyp": "^4.0.0",
-    "node-sass": "^4.11.0",
-    "sass": "^1.18.0",
-    "sass-lint": "^1.12.1",
-    "sass-lint-auto-fix": "^0.17.0",
-    "tar": "^4.4.8"
-  }
-}
diff --git a/ui/legacy/css/src/readme.md b/ui/legacy/css/src/readme.md
deleted file mode 100644
index 9e3e073..0000000
--- a/ui/legacy/css/src/readme.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# How to compile SASS with NPM and GULP?
-
-  1. install Node (v11.10.0 will work) on your machine or "N" or "nvm"
-  2. run $(npm install) inside package.json folder
-  3. run $(npm start) inside package.json folder
-  4. gulp automaticaly watches for .scss changes and compiles children scss-files of scss-folder to css now
-  5. Find a plugin for your code-editor to get use of .jsbeautifyrc as second instance for more rules that sass-lint-auto-fix doesn't support. (for vscode: "Beautify")
-
-## Keep package versions up to date if possible. check with $(npm outdated) inside package.json folder
diff --git a/ui/legacy/css/src/scss/cloudstack3.hu.scss b/ui/legacy/css/src/scss/cloudstack3.hu.scss
deleted file mode 100644
index 64ee788..0000000
--- a/ui/legacy/css/src/scss/cloudstack3.hu.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-@import 'licences/AL-css';
-@import 'languages/hungarian';
diff --git a/ui/legacy/css/src/scss/cloudstack3.ja_JP.scss b/ui/legacy/css/src/scss/cloudstack3.ja_JP.scss
deleted file mode 100644
index 976679c..0000000
--- a/ui/legacy/css/src/scss/cloudstack3.ja_JP.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-@import 'licences/AL-css';
-@import 'languages/japanese';
diff --git a/ui/legacy/css/src/scss/cloudstack3.scss b/ui/legacy/css/src/scss/cloudstack3.scss
deleted file mode 100644
index fc6c367..0000000
--- a/ui/legacy/css/src/scss/cloudstack3.scss
+++ /dev/null
@@ -1,90 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-
-@import 'licences/AL-css';
-
-@import 'variables/z-index';
-@import 'common/common';
-
-@import 'objects/table';
-@import 'objects/links';
-@import 'objects/form-elements';
-
-@import 'frame/wrapper-elements';
-
-@import 'components/login';
-@import 'components/dialog-about';
-@import 'components/blocking-overlay';
-@import 'components/loading-overlay';
-@import 'components/install-wizzard';
-@import 'components/notifications';
-@import 'components/tooltip-info';
-@import 'components/list-view2';
-@import 'components/quick-view-tooltip';
-@import 'components/details-page';
-@import 'components/actions';
-@import 'components/header';
-@import 'components/header-notifications';
-@import 'components/user';
-@import 'components/zone-filter';
-@import 'components/navigation';
-@import 'components/browser';
-@import 'components/toolbar';
-@import 'components/advanced-search';
-@import 'components/panel-controls';
-@import 'components/section-switcher';
-@import 'components/breadcrumbs';
-@import 'components/view';
-@import 'components/actions-table';
-@import 'components/actions-dialog';
-@import 'components/create-form';
-@import 'components/dynamic-input';
-@import 'components/dashboard';
-@import 'components/system-chart';
-@import 'components/first-network-resource';
-@import 'components/multi-wizzard';
-@import 'components/treeview';
-@import 'components/list-view';
-@import 'components/multi-edit';
-@import 'components/recurring-snapshots';
-@import 'components/upload-volume';
-@import 'components/network-chart';
-@import 'components/dashboard-system';
-@import 'components/view-switcher';
-@import 'components/project-selector';
-@import 'components/dashboard-project';
-@import 'components/info-boxes';
-@import 'components/new-project';
-@import 'components/tooltip-box';
-@import 'components/tagger';
-@import 'components/vpc-chart';
-@import 'components/acl-dialog';
-@import 'components/health-check';
-@import 'components/autoscaler';
-@import 'components/datepicker';
-@import 'components/plugins-listing';
-@import 'components/region-switcher';
-@import 'components/ca-cert-download';
-@import 'components/action-icons';
-@import 'components/accounts-wizzard';
-@import 'components/gpu-groups';
-@import 'components/button-add';
-@import 'components/copy-template';
-@import 'components/button-export';
-@import 'components/jquery-ui';
-@import 'components/token-input-facebook';
diff --git a/ui/legacy/css/src/scss/common/common.scss b/ui/legacy/css/src/scss/common/common.scss
deleted file mode 100644
index e5ba5d9..0000000
--- a/ui/legacy/css/src/scss/common/common.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-body {
-  min-width: 1224px;
-  background: #ede8e8;
-  font-family: sans-serif;
-  overflow: auto;
-}
diff --git a/ui/legacy/css/src/scss/components/accounts-wizzard.scss b/ui/legacy/css/src/scss/components/accounts-wizzard.scss
deleted file mode 100644
index da7a05c..0000000
--- a/ui/legacy/css/src/scss/components/accounts-wizzard.scss
+++ /dev/null
@@ -1,152 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.accounts-wizard table {
-  width: 100%;
-  margin: 0;
-  table-layout: fixed;
-}
-
-.accounts-wizard .ui-button {
-  display: inline-block !important;
-  float: none !important;
-}
-
-.accounts-wizard td:last-child {
-  border: 0;
-}
-
-.accounts-wizard tbody tr:nth-child(even) {
-  background: #dfe1e3;
-}
-
-.accounts-wizard tbody tr:nth-child(odd) {
-  background: #f2f0f0;
-}
-
-.accounts-wizard .content {
-  display: inline-block;
-}
-
-.accounts-wizard .content td {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.accounts-wizard .content td.select,
-.accounts-wizard .content th.select {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-  border-right: 1px solid #bfbfbf;
-  background: none;
-}
-
-.accounts-wizard .content .select input {
-  width: auto;
-  height: auto;
-  margin: 18px 0 0 24px;
-  padding: 0;
-}
-
-.accounts-wizard .content:last-child {
-  margin-left: 14px;
-}
-
-.accounts-wizard table thead th:first-child {
-  width: 50px;
-  min-width: 50px;
-  max-width: 50px;
-}
-
-.accounts-wizard .input-area {
-  width: 320px;
-  font-size: 13px;
-  color: #485867;
-  text-shadow: 0 2px 1px #ffffff;
-}
-
-.ldap-account-choice {
-  border: 0;
-  border-radius: 0 0 0 0 !important;
-}
-
-.manual-account-details .name {
-  float: left;
-  width: 100px;
-  margin-top: 2px;
-  padding-bottom: 10px;
-}
-
-.manual-account-details {
-  height: auto !important;
-  overflow: visible !important;
-  overflow-x: visible !important;
-}
-
-.manual-account-details label.error {
-  display: block;
-  font-size: 10px;
-}
-
-.manual-account-details .value {
-  float: left;
-}
-
-.manual-account-details .form-item:after {
-  visibility: hidden;
-  content: '.';
-  display: block;
-  clear: both;
-  height: 0;
-  line-height: 0;
-}
-
-.manual-account-details .form-item {
-  box-sizing: border-box;
-  width: 100%;
-  padding: 5px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-}
-
-.manual-account-details select,
-.manual-account-details input {
-  width: 150px;
-}
-
-.manual-account-details input {
-  border: 1px solid #afafaf;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #f6f6f6;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.manual-account-details > *:nth-child(even) {
-  background: #dfe1e3;
-}
-
-.manual-account-details > *:nth-child(odd) {
-  background: #f2f0f0;
-}
-
-.manual-account-details .value {
-  display: inline-block;
-}
diff --git a/ui/legacy/css/src/scss/components/acl-dialog.scss b/ui/legacy/css/src/scss/components/acl-dialog.scss
deleted file mode 100644
index 63de914..0000000
--- a/ui/legacy/css/src/scss/components/acl-dialog.scss
+++ /dev/null
@@ -1,93 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-dialog.configure-acl .multi-edit {
-  width: 866px;
-}
-
-.ui-dialog.configure-acl .multi-edit table {
-  max-width: none;
-}
-
-.ui-dialog.configure-acl .multi-edit table select,
-.detail-view .acl .multi-edit select {
-  width: 76px;
-}
-
-.ui-dialog.configure-acl .ui-dialog-buttonpane {
-  /*+placement:shift 722px -2px;*/
-  position: relative;
-  top: -2px;
-  left: 722px;
-}
-
-.ui-dialog.configure-acl div.view.list-view {
-  max-height: 474px;
-}
-
-.ui-dialog.configure-acl .multi-edit .data {
-  width: 901px;
-  height: 370px;
-  margin: 0;
-  padding: 0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.ui-dialog.configure-acl .multi-edit .data .multi-actions {
-  min-width: none !important;
-  max-width: none !important;
-}
-
-.ui-dialog.configure-acl .view.list-view table.body tr td.actions {
-  width: 184px !important;
-  max-width: 184px !important;
-}
-
-div.ui-dialog div.acl div.multi-edit table.multi-edit thead tr th,
-div.ui-dialog div.acl div.multi-edit table.multi-edit tbody tr td {
-  min-width: 75px;
-}
-
-div.ui-dialog div.acl div.multi-edit div.data div.data-body div.data-item table tbody tr td {
-  width: 100%;
-  min-width: 77px;
-}
-
-.detail-view .acl .multi-edit th,
-.detail-view .acl .multi-edit td {
-  min-width: 25px !important;
-  padding-right: 0 !important;
-}
-
-.detail-view .acl .multi-edit th {
-  font-size: 10px;
-}
-
-.detail-view .acl .multi-edit input {
-  width: 50px;
-}
-
-.detail-view .acl .multi-edit .add-vm {
-  width: 51px;
-  padding-right: 0;
-  text-indent: 0;
-}
-
-.detail-view .acl .multi-edit td.multi-actions {
-  width: 65px;
-}
diff --git a/ui/legacy/css/src/scss/components/action-icons.scss b/ui/legacy/css/src/scss/components/action-icons.scss
deleted file mode 100644
index 6ed07a3..0000000
--- a/ui/legacy/css/src/scss/components/action-icons.scss
+++ /dev/null
@@ -1,652 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.action.edit .icon {
-  background-position: 1px -1px;
-}
-
-.action.edit:hover .icon {
-  background-position: 1px -583px;
-}
-
-.start .icon,
-.startByAdmin .icon {
-  background-position: -169px -1px;
-}
-
-.start:hover .icon,
-.startByAdmin:hover .icon {
-  background-position: -169px -583px;
-}
-
-.updateVmwareDc .icon {
-  background-position: -265px -148px;
-}
-
-.updateVmwareDc:hover .icon {
-  background-position: -265px -728px;
-}
-
-.stop .icon,
-.removeVmwareDc .icon,
-.release .icon {
-  background-position: 0 -31px;
-}
-
-.stop:hover .icon,
-.removeVmwareDc:hover .icon,
-.release:hover .icon {
-  background-position: 0 -613px;
-}
-
-.restart .icon,
-.releaseDedicatedZone .icon {
-  background-position: 0 -63px;
-}
-
-.restart:hover .icon,
-.releaseDedicatedZone:hover .icon {
-  background-position: 0 -645px;
-}
-
-.destroy .icon,
-.expunge .icon,
-.remove .icon,
-.removeMulti .icon,
-.delete .icon,
-.decline .icon,
-.deleteacllist .icon {
-  background-position: 1px -92px;
-}
-
-.destroy:hover .icon,
-.expunge:hover .icon,
-.remove:hover .icon,
-.delete:hover .icon,
-.deleteacllist:hover .icon {
-  background-position: 1px -674px;
-}
-
-.migrate .icon,
-.migrateToAnotherStorage .icon {
-  background-position: 0 -125px;
-}
-
-.migrate:hover .icon,
-.migrateToAnotherStorage:hover .icon {
-  background-position: 0 -707px;
-}
-
-.migrate .icon,
-.migrateVolume .icon {
-  background-position: 0 -125px;
-}
-
-.migrate:hover .icon,
-.migrateVolume:hover .icon {
-  background-position: 0 -707px;
-}
-
-.viewMetrics .icon {
-  background-position: -40px -32px;
-}
-
-.viewMetrics:hover .icon {
-  background-position: -40px -32px;
-}
-
-.refreshMetrics .icon {
-  background-position: 0 -62px;
-}
-
-.refreshMetrics:hover .icon {
-  background-position: 0 -62px;
-}
-
-.attach .icon,
-.attachISO .icon,
-.attachDisk .icon,
-.associateProfileToBlade .icon {
-  background-position: -104px -3px;
-}
-
-.attach:hover .icon,
-.attachISO:hover .icon,
-.attachDisk:hover .icon {
-  background-position: -101px -585px;
-}
-
-.detach .icon,
-.detachISO .icon,
-.detachDisk .icon,
-.disassociateProfileFromBlade .icon {
-  background-position: -101px -65px;
-}
-
-.detach:hover .icon,
-.detachISO:hover .icon,
-.detachDisk:hover .icon,
-.disassociateProfileFromBlade:hover .icon {
-  background-position: -101px -647px;
-}
-
-.secureKVMHost .icon,
-.resetPassword .icon,
-.changePassword .icon {
-  background-position: -68px -30px;
-}
-
-.secureKVMHost:hover .icon,
-.resetPassword:hover .icon,
-.changePassword:hover .icon {
-  background-position: -68px -612px;
-}
-
-.resetSSHKeyForVirtualMachine .icon {
-  background-position: -196px -3px;
-}
-
-.resetSSHKeyForVirtualMachine:hover .icon {
-  background-position: -195px -586px;
-}
-
-.changeService .icon {
-  background-position: -38px -33px;
-}
-
-.changeService:hover .icon {
-  background-position: -38px -615px;
-}
-
-.snapshot .icon,
-.takeSnapshot .icon,
-.storageSnapshot .icon {
-  background-position: -36px -91px;
-}
-
-.snapshot:hover .icon,
-.takeSnapshot:hover .icon,
-.storageSnapshot:hover .icon {
-  background-position: -36px -673px;
-}
-
-.recurringSnapshot .icon {
-  background-position: -69px -95px;
-}
-
-.recurringSnapshot:hover .icon {
-  background-position: -69px -677px;
-}
-
-.downloadVolume .icon,
-.downloadTemplate .icon,
-.downloadISO .icon {
-  background-position: -35px -125px;
-}
-
-.downloadVolume:hover .icon,
-.downloadTemplate:hover .icon,
-.downloadISO:hover .icon {
-  background-position: -35px -707px;
-}
-
-.createVolume .icon {
-  background-position: -70px -124px;
-}
-
-.createVolume:hover .icon {
-  background-position: -70px -706px;
-}
-
-.enable .icon,
-.enableStaticNAT .icon {
-  background-position: -102px -92px;
-}
-
-.enable:hover .icon,
-.enableStaticNAT:hover .icon {
-  background-position: -102px -676px;
-}
-
-.disable .icon,
-.disableStaticNAT .icon {
-  background-position: -136px -93px;
-}
-
-.disable:hover .icon,
-.disableStaticNAT:hover .icon {
-  background-position: -136px -677px;
-}
-
-.add .icon,
-.addNew .icon,
-.addLdapAccount .icon,
-.assignVm .icon,
-.rootAdminAddGuestNetwork .icon {
-  background-position: -37px -61px;
-}
-
-.add:hover .icon,
-.addNew:hover .icon,
-.addLdapAccount:hover .icon,
-.assignVm:hover .icon,
-.rootAdminAddGuestNetwork:hover .icon {
-  background-position: -37px -643px;
-}
-
-.assignVmToAnotherAccount .icon {
-  background-position: -232px -97px;
-}
-
-.assignVmToAnotherAccount:hover .icon {
-  background-position: -231px -678px;
-}
-
-.create .icon,
-.createTemplate .icon,
-.enableSwift .icon,
-.addVM .icon,
-.dedicateZone .icon,
-.dedicate .icon {
-  background-position: -69px -63px;
-}
-
-.create:hover .icon,
-.createTemplate:hover .icon,
-.enableSwift:hover .icon,
-.addVM:hover .icon,
-.dedicateZone:hover .icon {
-  background-position: -69px -645px;
-}
-
-.copyTemplate .icon,
-.copyISO .icon {
-  background-position: -138px -2px;
-}
-
-.copyTemplate:hover .icon,
-.copyISO:hover .icon {
-  background-position: -138px -584px;
-}
-
-.createVM .icon {
-  background-position: -137px -32px;
-}
-
-.createVM:hover .icon {
-  background-position: -137px -614px;
-}
-
-.blankHAForHost .icon {
-  background-position: -266px -31px;
-}
-
-.blankHAForHost:hover .icon {
-  background-position: -266px -31px;
-}
-
-.configureHAForHost .icon {
-  background-position: -270px -148px;
-}
-
-.configureHAForHost:hover .icon {
-  background-position: -270px -728px;
-}
-
-.enableHA .icon {
-  background-position: -265px -93px;
-}
-
-.enableHA:hover .icon {
-  background-position: -265px -673px;
-}
-
-.disableHA .icon {
-  background-position: -265px -120px;
-}
-
-.disableHA:hover .icon {
-  background-position: -265px -700px;
-}
-
-.blankOutOfBandManagement .icon {
-  background-position: -266px -31px;
-}
-
-.blankOutOfBandManagement:hover .icon {
-  background-position: -266px -31px;
-}
-
-.configureOutOfBandManagement .icon {
-  background-position: -168px -31px;
-}
-
-.configureOutOfBandManagement:hover .icon {
-  background-position: -168px -613px;
-}
-
-.diagnostics .icon {
-  background-position: -165px -122px;
-}
-
-.diagnostics:hover .icon {
-  background-position: -165px -704px;
-}
-
-.retrieveDiagnostics .icon {
-  background-position: -35px -125px;
-}
-
-.retrieveDiagnostics:hover .icon {
-  background-position: -35px -707px;
-}
-
-.enableOutOfBandManagement .icon {
-  background-position: -138px -65px;
-}
-
-.enableOutOfBandManagement:hover .icon {
-  background-position: -138px -647px;
-}
-
-.disableOutOfBandManagement .icon {
-  background-position: -138px -123px;
-}
-
-.disableOutOfBandManagement:hover .icon {
-  background-position: -138px -705px;
-}
-
-.issueOutOfBandManagementPowerAction .icon {
-  background-position: -266px -3px;
-}
-
-.issueOutOfBandManagementPowerAction:hover .icon {
-  background-position: -265px -584px;
-}
-
-.changeOutOfBandManagementPassword .icon {
-  background-position: -68px -30px;
-}
-
-.changeOutOfBandManagementPassword:hover .icon {
-  background-position: -68px -612px;
-}
-
-.enableMaintenanceMode .icon {
-  background-position: -138px -65px;
-}
-
-.enableMaintenanceMode:hover .icon {
-  background-position: -138px -647px;
-}
-
-.cancelMaintenanceMode .icon {
-  background-position: -138px -123px;
-}
-
-.cancelMaintenanceMode:hover .icon {
-  background-position: -138px -705px;
-}
-
-.lock .icon {
-  background-position: -104px -124px;
-}
-
-.lock:hover .icon {
-  background-position: -104px -706px;
-}
-
-.updateResourceLimits .icon {
-  background-position: -100px -32px;
-}
-
-.updateResourceLimits:hover .icon {
-  background-position: -100px -614px;
-}
-
-.addVlanRange .icon,
-.addVmwareDc .icon {
-  background-position: -37px -62px;
-}
-
-.addVlanRange:hover .icon,
-.addVmwareDc:hover .icon {
-  background-position: -37px -62px;
-}
-
-.removeVlanRange .icon {
-  background-position: 1px -92px;
-}
-
-.removeVlanRange:hover .icon {
-  background-position: 1px -92px;
-}
-
-.resize .icon,
-.updateResourceCount .icon {
-  background-position: -167px -66px;
-}
-
-.resize:hover .icon,
-.updateResourceCount:hover .icon {
-  background-position: -167px -648px;
-}
-
-.generateKeys .icon,
-.networkACL .icon {
-  background-position: -167px -95px;
-}
-
-.generateKeys:hover .icon,
-.networkACL:hover .icon {
-  background-position: -167px -677px;
-}
-
-.revertSnapshot .icon,
-.revertToVMSnapshot .icon,
-.restoreVM .icon,
-.restore .icon,
-.recover .icon {
-  background-position: -168px -31px;
-}
-
-.reset .icon,
-.reinstall .icon {
-  background-position: -168px -31px;
-}
-
-.scaleUp .icon {
-  background-position: -167px -66px;
-}
-
-.revertSnapshot:hover .icon,
-.revertToVMSnapshot:hover .icon,
-.restoreVM:hover .icon,
-.restore:hover .icon {
-  background-position: -168px -613px;
-}
-
-.reset:hover .icon {
-  background-position: -168px -613px;
-}
-
-.enableVPN .icon {
-  background-position: -198px -3px;
-}
-
-.enableVPN:hover .icon {
-  background-position: -197px -586px;
-}
-
-.disableVPN .icon {
-  background-position: -198px -32px;
-}
-
-.disableVPN:hover .icon {
-  background-position: -197px -615px;
-}
-
-.addIpRange .icon {
-  background-position: -197px -65px;
-}
-
-.addIpRange:hover .icon {
-  background-position: -197px -647px;
-}
-
-.forceReconnect .icon {
-  background-position: -196px -95px;
-}
-
-.forceReconnect:hover .icon {
-  background-position: -196px -677px;
-}
-
-.manage .icon {
-  background-position: -165px -122px;
-}
-
-.manage:hover .icon {
-  background-position: -165px -704px;
-}
-
-.unmanage .icon {
-  background-position: -196px -122px;
-}
-
-.unmanage:hover .icon {
-  background-position: -196px -704px;
-}
-
-.configureSamlAuthorization .icon {
-  background-position: -165px -122px;
-}
-
-.configureSamlAuthorization:hover .icon {
-  background-position: -165px -704px;
-}
-
-.viewConsole .icon {
-  background-position: -231px -2px;
-}
-
-.viewConsole:hover .icon {
-  background-position: -229px -586px;
-}
-
-.moveTop .icon {
-  background-position: -24px -161px;
-}
-
-.moveTop:hover .icon {
-  background-position: -24px -734px;
-}
-
-.moveBottom .icon {
-  background-position: -98px -161px;
-}
-
-.moveBottom:hover .icon {
-  background-position: -98px -734px;
-}
-
-.moveUp .icon {
-  background-position: -2px -161px;
-}
-
-.moveUp:hover .icon {
-  background-position: -2px -734px;
-}
-
-.moveDown .icon {
-  background-position: -55px -161px;
-}
-
-.moveDown:hover .icon {
-  background-position: -55px -734px;
-}
-
-.moveDrag .icon {
-  border-radius: 10px;
-  /*+border-radius:10px;*/
-  border-radius: 10px 10px 10px 10px;
-  background-position: -82px -162px;
-  cursor: move;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.moveDrag:hover .icon {
-  background-color: #ffffff;
-  cursor: move !important;
-}
-
-.uploadVolume .icon {
-  background-position: -232px -34px;
-}
-
-.uploadVolume:hover .icon {
-  background-position: -230px -615px;
-}
-
-.editTags .icon {
-  background-position: -228px -65px;
-}
-
-.editTags:hover .icon {
-  background-position: -228px -646px;
-}
-
-.replaceacllist .icon,
-.replaceACL .icon,
-.updateIpaddr .icon,
-.changeAffinity .icon {
-  background-position: -264px -2px;
-}
-
-.replaceacllist:hover .icon,
-.replaceACL:hover .icon,
-.updateIpaddr:hover .icon,
-.changeAffinity:hover .icon {
-  background-position: -263px -583px;
-}
-
-.releaseFromAccount .icon {
-  background-position: -230px -123px;
-}
-
-.releaseFromAccount:hover .icon {
-  background-position: -229px -704px;
-}
-
-.addAccount .icon {
-  background-position: -231px -96px;
-}
-
-.addAccount:hover .icon {
-  background-position: -230px -677px;
-}
-
-.linktoldap .icon {
-  background-position: -197px -65px;
-}
-
-.linktoldap:hover .icon {
-  background-position: -197px -647px;
-}
diff --git a/ui/legacy/css/src/scss/components/actions-dialog.scss b/ui/legacy/css/src/scss/components/actions-dialog.scss
deleted file mode 100644
index 3408e4c..0000000
--- a/ui/legacy/css/src/scss/components/actions-dialog.scss
+++ /dev/null
@@ -1,224 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-dialog {
-  position: absolute;
-  padding: 15px;
-  /*+box-shadow:0px -4px 15px #4C4A4A;*/
-  box-shadow: 0 -4px 15px #4c4a4a;
-  background: #ffffff;
-  text-align: left;
-  -moz-box-shadow: 0 -4px 15px #4c4a4a;
-  -webkit-box-shadow: 0 -4px 15px #4c4a4a;
-  -o-box-shadow: 0 -4px 15px #4c4a4a;
-}
-
-.ui-dialog.ui-corner-all {
-  border-radius: 0;
-}
-
-.ui-dialog .ui-widget-content {
-  display: inline-block;
-  padding: 8px 0 8px 8px;
-  text-align: center;
-}
-
-.ui-dialog .ui-widget-content .nothing-to-select {
-  width: 386px;
-  margin: 57px 0 0;
-  padding: 4px 25px 180px 28px;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: #ffffff;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  font-size: 16px;
-  line-height: 21px;
-  color: #3d3d3d;
-  text-align: left;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  /*+border-radius:10px;*/
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.ui-dialog .ui-widget-content .nothing-to-select p {
-  margin: 18px 0 0;
-}
-
-.ui-dialog .ui-widget-content .nothing-to-select .specify-ip {
-  margin-top: 28px;
-  padding-top: 21px;
-  border-top: 1px solid #dfdfdf;
-  font-size: 12px;
-}
-
-.ui-dialog-buttonset {
-  width: 285px;
-  margin: 0;
-}
-
-.ui-dialog .ui-button {
-  display: block;
-  float: left;
-  width: 110px;
-  height: 31px;
-  border: 0;
-  border: 1px solid #bfbcbc;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  background: url('../images/gradients.png') -2px -481px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog .ui-button:hover {
-  background-position: -4px -426px;
-}
-
-.ui-dialog.notice .close.ui-button {
-  display: inline;
-  float: right;
-  padding: 0;
-  background: transparent;
-  color: #516374;
-  /*+text-shadow:0px -1px 1px #FFFFFF;*/
-  text-shadow: 0 -1px 1px #ffffff;
-  -moz-text-shadow: 0 -1px 1px #ffffff;
-  -webkit-text-shadow: 0 -1px 1px #ffffff;
-  -o-text-shadow: 0 -1px 1px #ffffff;
-}
-
-.ui-dialog .ui-button.ok {
-  border: 1px solid #0065c5;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+text-shadow:0px -1px 1px #011238;*/
-  background-position: 0 -317px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #011238;
-  -moz-text-shadow: 0 -1px 1px #011238;
-  /*+border-radius:4px;*/
-  -webkit-text-shadow: 0 -1px 1px #011238;
-  -o-text-shadow: 0 -1px 1px #011238;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog .ui-button.ok:hover {
-  border: 1px solid #004ff7;
-  background-position: -3px -368px;
-}
-
-.ui-dialog.confirm .ui-button {
-  margin-top: 0;
-  margin-left: 11px;
-}
-
-.ui-dialog.confirm .ui-button.cancel {
-  margin-left: 50px;
-}
-
-.ui-dialog span.message {
-  display: block;
-  padding-bottom: 40px;
-  font-size: 14px;
-  color: #445361;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.ui-dialog span.message ul {
-  margin-top: 14px;
-  margin-left: 30px;
-  text-align: left;
-  list-style: disc;
-}
-
-.ui-dialog span.message ul li {
-  margin-top: 3px;
-}
-
-.ui-dialog span.message p {
-  margin-top: 20px;
-  text-align: left;
-}
-
-.ui-dialog-titlebar {
-  height: 33px;
-  margin: auto;
-  border-radius: 7px 7px 0 0;
-  /*+border-radius:7px 7px 0 0;*/
-  background: #ffffff;
-  color: #000000;
-  -moz-border-radius: 7px 7px 0 0;
-  -webkit-border-radius: 7px 7px 0 0;
-  -khtml-border-radius: 7px 7px 0 0;
-}
-
-.ui-dialog-titlebar.ui-widget-header {
-  border: 0;
-  font-weight: inherit;
-}
-
-.ui-dialog-titlebar .ui-icon-closethick {
-  display: none;
-}
-
-.ui-dialog-title {
-  /*+placement:shift 8px 9px;*/
-  position: relative;
-  top: 9px;
-  left: 8px;
-  padding: 2px 0 5px 30px;
-  background: url('../images/icons.png') no-repeat 0 -255px;
-  font-size: 14px;
-}
-
-.notice .ui-dialog-title {
-  background-position: 0 -288px;
-}
-
-.ui-dialog.confirm .ui-dialog-title {
-  background: url('../images/icons.png') no-repeat 0 -224px;
-}
-
-.ui-dialog.create-form .ui-dialog-title {
-  background: url('../images/icons.png') no-repeat 0 -255px;
-}
-
-.ui-dialog.warning .ui-dialog-title {
-  background: url('../images/icons.png') no-repeat 0 -286px;
-}
-
-.ui-dialog.confirm .ui-button {
-  /*+placement:shift 0px -8px;*/
-  position: relative;
-  top: -8px;
-  left: 0;
-}
diff --git a/ui/legacy/css/src/scss/components/actions-table.scss b/ui/legacy/css/src/scss/components/actions-table.scss
deleted file mode 100644
index f650eb2..0000000
--- a/ui/legacy/css/src/scss/components/actions-table.scss
+++ /dev/null
@@ -1,85 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-table td.actions {
-  width: 200px;
-  /*Make fixed*/
-  min-width: 200px;
-  max-width: 200px;
-  cursor: default;
-}
-
-table td.actions span {
-  margin: 0 0 0 2px !important;
-}
-
-table td.actions .action span.icon {
-  float: left;
-  width: 23px;
-  height: 21px;
-  background-image: url('../images/sprites.png');
-  cursor: pointer;
-}
-
-table td.actions .action.disabled .icon {
-  opacity: 0.2;
-  /*+opacity:20%;*/
-  cursor: not-allowed;
-  filter: alpha(opacity=20);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);
-  -moz-opacity: 0.2;
-}
-
-table tr.odd td.actions .action.disabled .icon {
-  background-color: #f2f0f0;
-}
-
-table tr.even td.actions .action.disabled .icon {
-  background-color: #dfe1e3;
-}
-
-table tr td.actions .action.text {
-  display: inline-block;
-  border: 1px solid #c2c2c2;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  background: url('../images/bg-gradients.png') repeat-x 0 -83px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-table tr td.actions .action.text:hover {
-  /*+box-shadow:inset 0px 1px 3px #171717;*/
-  box-shadow: inset 0 1px 3px #171717;
-  -moz-box-shadow: inset 0 1px 3px #171717;
-  -webkit-box-shadow: inset 0 1px 3px #171717;
-  -o-box-shadow: inset 0 1px 3px #171717;
-}
-
-table tr td.actions .action.text .label {
-  padding: 4px 0 0 4px;
-}
-
-table tr td.actions .action.text .icon {
-  padding-bottom: 4px;
-}
-
-table tr.selected td.actions .action.disabled .icon {
-  background-color: #cbddf3;
-}
diff --git a/ui/legacy/css/src/scss/components/actions.scss b/ui/legacy/css/src/scss/components/actions.scss
deleted file mode 100644
index 990eced..0000000
--- a/ui/legacy/css/src/scss/components/actions.scss
+++ /dev/null
@@ -1,161 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.detail-group.actions {
-  margin: 0;
-  padding: 0;
-}
-
-div.detail-group.actions table {
-  padding: 0;
-}
-
-div.detail-group.actions tr {
-  margin: 0;
-}
-
-div.detail-group.actions td {
-  vertical-align: middle;
-  height: 50px;
-}
-
-.details.group-multiple div.detail-group.actions {
-  position: relative;
-  float: right;
-  max-width: 75%;
-  height: 23px;
-  margin: -15px 0 -5px;
-}
-
-.details.group-multiple div.detail-group.actions table {
-  background: none;
-}
-
-.details.group-multiple div.detail-group.actions td.detail-actions {
-  display: block;
-  float: right;
-  min-width: 120px;
-  height: 35px;
-  padding: 0;
-  background: none;
-}
-
-.details.group-multiple div.detail-group.actions .detail-actions .action {
-  position: relative;
-  float: left;
-  /*+placement:shift 11px 7px;*/
-  top: 7px;
-  left: 11px;
-  width: 32px;
-}
-
-.details.group-multiple div.detail-group.actions .detail-actions .action a {
-  width: 31px;
-  background: none;
-}
-
-.detail-group table td.detail-actions {
-  height: 26px;
-}
-
-.detail-group table td.detail-actions.full-length {
-  display: block;
-  float: left;
-  width: 99%;
-}
-
-.detail-group table td.detail-actions .action.text {
-  display: inline-block;
-  float: right;
-  margin-right: 8px;
-  padding: 0 6px 0 0;
-  border: 1px solid #c2c2c2;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  background: url('../images/bg-gradients.png') repeat-x 0 -83px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.detail-group table td.detail-actions .action.text .label {
-  position: relative;
-  /*+placement:shift -1px 8px;*/
-  top: 8px;
-  left: -1px;
-  font-size: 12px;
-}
-
-.detail-group table td.detail-actions .action.text:hover {
-  /*+box-shadow:inset 0px 1px 3px #171717;*/
-  box-shadow: inset 0 1px 3px #171717;
-  -moz-box-shadow: inset 0 1px 3px #171717;
-  -webkit-box-shadow: inset 0 1px 3px #171717;
-  -o-box-shadow: inset 0 1px 3px #171717;
-}
-
-.detail-group table td.detail-actions a {
-  display: block;
-  float: left;
-  width: 30px;
-  height: 25px;
-  margin: 0;
-  text-indent: -9999px;
-}
-
-.detail-group table td.detail-actions a:hover {
-  background-position: -417px -43px;
-}
-
-.detail-group table td.detail-actions div.action.first a {
-  width: 32px;
-  background-position: -385px -11px;
-}
-
-.detail-group table td.detail-actions div.action.first a:hover {
-  background-position: -385px -43px;
-}
-
-.detail-group table td.detail-actions div.action.last a {
-  width: 30px;
-  background-position: -596px -11px;
-}
-
-.detail-group table td.detail-actions div.action.last a:hover {
-  background-position: -596px -43px;
-}
-
-.detail-group table td.detail-actions div.action.single a {
-  width: 31px;
-  height: 26px;
-  background-position: -414px -625px;
-}
-
-.detail-group table td.detail-actions div.action.text a {
-  background: none;
-}
-
-.detail-group table td.detail-actions div.action.single a:hover {
-  background-position: -414px -587px;
-}
-
-.detail-group table td.detail-actions a span.icon {
-  display: block;
-  padding: 10px;
-  background-image: url('../images/sprites.png');
-}
diff --git a/ui/legacy/css/src/scss/components/advanced-search.scss b/ui/legacy/css/src/scss/components/advanced-search.scss
deleted file mode 100644
index 14ceccf..0000000
--- a/ui/legacy/css/src/scss/components/advanced-search.scss
+++ /dev/null
@@ -1,146 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#advanced_search {
-  position: absolute;
-  z-index: $z-index-search;
-  top: 4px;
-  left: 139px;
-  width: 15px;
-  background: none;
-}
-
-#advanced_search .icon {
-  /*+opacity:56%;*/
-  opacity: 0.56;
-  position: absolute;
-  z-index: $z-index-install-wizard2;
-  top: 1px;
-  left: -1px;
-  padding: 10px;
-  background: url('../images/sprites.png') no-repeat -62px -162px;
-  filter: alpha(opacity=56);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=56);
-  -moz-opacity: 0.56;
-}
-
-#advanced_search:hover .icon {
-  /*+opacity:100%;*/
-  opacity: 1;
-  filter: alpha(opacity=100);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
-  -moz-opacity: 1;
-}
-
-#advanced_search .form-container {
-  /*+opacity:91%;*/
-  opacity: 0.91;
-  display: inline-block;
-  position: absolute;
-  top: 2px;
-  /*+box-shadow:0px 5px 9px #B6B0B0;*/
-  left: -290px;
-  padding: 18px;
-  border: 1px solid #808080;
-  border-radius: 0 0 4px 4px;
-  box-shadow: 0 5px 9px #b6b0b0;
-  /*+border-radius:0 0 4px 4px;*/
-  background: #ffffff;
-  cursor: default;
-  filter: alpha(opacity=91);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=91);
-  -moz-opacity: 0.91;
-  -moz-box-shadow: 0 5px 9px #b6b0b0;
-  -webkit-box-shadow: 0 5px 9px #b6b0b0;
-  -o-box-shadow: 0 5px 9px #b6b0b0;
-  -moz-border-radius: 0 0 4px 4px;
-  -webkit-border-radius: 0 0 4px 4px;
-  -khtml-border-radius: 0 0 4px 4px;
-}
-
-#advanced_search .form-container .name {
-  float: left;
-  width: 66px;
-}
-
-#advanced_search .form-container .value {
-  float: left;
-  width: 186px;
-}
-
-#advanced_search .form-container .form-item {
-  width: 268px;
-  height: 40px;
-  margin-bottom: 15px;
-}
-
-#advanced_search .form-container .form-item input,
-#advanced_search .form-container .form-item select {
-  width: 97%;
-  padding: 3px;
-}
-
-#advanced_search input[type='submit'] {
-  float: right;
-  padding: 8px 20px;
-  /*+box-shadow:0px 2px 5px #858585;*/
-  border: 1px solid #606060;
-  border-top: 0;
-  border-radius: 4px;
-  box-shadow: 0 2px 5px #858585;
-  background: url('../images/bg-gradients.png') 0 -220px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 1px 1px #000000;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  cursor: pointer;
-  -moz-box-shadow: 0 2px 5px #858585;
-  -webkit-box-shadow: 0 2px 5px #858585;
-  -o-box-shadow: 0 2px 5px #858585;
-  /*+border-radius:4px;*/
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-#advanced_search input[type='submit']:hover {
-  /*+box-shadow:inset 0px 2px 3px #000000;*/
-  box-shadow: inset 0 2px 3px #000000;
-  -moz-box-shadow: inset 0 2px 3px #000000;
-  -webkit-box-shadow: inset 0 2px 3px #000000;
-  -o-box-shadow: inset 0 2px 3px #000000;
-}
-
-#advanced_search .button.cancel {
-  position: relative;
-  float: right;
-  top: 13px;
-  left: -32px;
-  /*+placement:shift -32px 13px;*/
-  background: url('noen');
-  font-size: 12px;
-  font-weight: bold;
-  color: #9a9a9a;
-}
-
-#advanced_search .button.cancel:hover {
-  color: #494949;
-}
diff --git a/ui/legacy/css/src/scss/components/autoscaler.scss b/ui/legacy/css/src/scss/components/autoscaler.scss
deleted file mode 100644
index aea1050..0000000
--- a/ui/legacy/css/src/scss/components/autoscaler.scss
+++ /dev/null
@@ -1,511 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-dialog div.autoscaler {
-  max-height: 600px;
-  overflow: auto;
-}
-
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit tbody tr td,
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit thead tr th {
-  min-width: 80px;
-  max-width: 80px;
-  font-size: 10px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons {
-  float: right;
-  margin-right: 6px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons .action {
-  float: left;
-  width: 32px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='securityGroups'] {
-  display: block;
-  float: left;
-  width: 370px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='diskOfferingId'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  width: 370px;
-  margin-top: 1px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='minInstance'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='maxInstance'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -30px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='interval'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='quietTime'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpCommunity'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpPort'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.value select {
-  float: left;
-  width: 88%;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title {
-  margin-top: 40px;
-  margin-left: -650px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title label {
-  margin-right: 10px;
-  margin-left: 200px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.field-group.bottom-fields hr.policy-divider {
-  margin-top: 15px;
-  margin-bottom: -1px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title label {
-  margin-right: 10px;
-  margin-left: 170px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title {
-  margin-top: 10px;
-  margin-left: -620px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: -17px;
-  margin-left: 729px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.name {
-  margin-left: 420px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: -16px;
-  margin-left: 698px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.name {
-  margin-left: 420px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/minus.png') no-repeat 38% 59%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/minus.png') no-repeat 31% 54%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/sprites.png') repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/sprites.png') repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-item div.name label {
-  font-size: 11px;
-}
-
-/*List state BG colors*/
-.list-view .body td.item-state-on {
-  border-bottom: 1px solid #09bc09;
-  background: #c0ffc0;
-}
-
-.list-view .body td.item-state-off {
-  border-bottom: 1px solid #ff9f9f;
-  background: #ffd8cf;
-}
-
-.list-view .body tr.selected td.item-state-on,
-.list-view .body tr.selected td.item-state-off {
-  border-color: inherit;
-  background-color: inherit;
-}
-
-/*Autoscaler*/
-.ui-dialog div.autoscaler {
-  max-height: 600px;
-  overflow: auto;
-}
-
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit tbody tr td,
-div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit thead tr th {
-  min-width: 72px;
-  font-size: 10px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons {
-  float: right;
-  margin-right: 6px;
-}
-
-.ui-dialog div.autoscaler .detail-actions .buttons .action {
-  float: left;
-  width: 32px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='securityGroups'] {
-  display: block;
-  float: left;
-  width: 370px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='diskOfferingId'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  width: 370px;
-  margin-top: 1px;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='minInstance'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='maxInstance'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -30px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='interval'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='quietTime'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpCommunity'] {
-  display: block;
-  float: left;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.form-item[rel='snmpPort'] {
-  display: inline-block;
-  position: relative;
-  float: left;
-  left: -15px;
-  width: 50%;
-}
-
-.ui-dialog div.autoscaler div.form-container div.value select {
-  float: left;
-  width: 88%;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container {
-  height: 55px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit {
-  margin-top: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title {
-  margin-top: 40px;
-  margin-left: -650px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title label {
-  margin-right: 10px;
-  margin-left: 200px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title hr.policy-divider {
-  margin-bottom: 12px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.field-group.bottom-fields hr.policy-divider {
-  margin-top: 15px;
-  margin-bottom: -1px;
-  border-top: 1px none #38546d;
-  border-right: 1px none #16222c;
-  border-left: 1px none #38546d;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title label {
-  margin-right: 10px;
-  margin-left: 170px;
-  font-size: 13px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title {
-  margin-top: 10px;
-  margin-left: -620px;
-  color: #0055bb;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: 1px;
-  margin-left: 195px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.name {
-  margin-left: 390px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.value input[type='text'] {
-  width: 30%;
-  margin-top: -16px;
-  margin-left: 670px;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.name {
-  margin-left: 390px;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit div.data div.data-body div.data-item {
-  margin-right: 22px;
-  margin-bottom: 0;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.slide-label {
-  width: 12px;
-  margin-bottom: 3px;
-  margin-left: 755px;
-  font-size: 14px;
-  color: #a5a3a7;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/minus.png') no-repeat 38% 59%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.hide {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/minus.png') no-repeat 31% 54%;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-up-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/sprites.png') repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.scale-down-policy div.expand {
-  float: right;
-  width: 14px;
-  height: 15px;
-  margin: -20px 45px 0 11px;
-  border: 1px solid #d0d0d0;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/sprites.png') repeat -541px -499px;
-  cursor: pointer;
-}
-
-div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-item div.name label {
-  font-size: 11px;
-}
diff --git a/ui/legacy/css/src/scss/components/blocking-overlay.scss b/ui/legacy/css/src/scss/components/blocking-overlay.scss
deleted file mode 100644
index d4167e5..0000000
--- a/ui/legacy/css/src/scss/components/blocking-overlay.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.blocking-overlay {
-  opacity: 0.7;
-  position: absolute;
-  z-index: $z-index-loading-overlay;
-  top: 0;
-  left: 0;
-  width: 100%;
-  /*+opacity:70%;*/
-  height: 100%;
-  background: #f2f2f2;
-  filter: alpha(opacity=70);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
-  -moz-opacity: 0.7;
-}
diff --git a/ui/legacy/css/src/scss/components/breadcrumbs.scss b/ui/legacy/css/src/scss/components/breadcrumbs.scss
deleted file mode 100644
index e0ded93..0000000
--- a/ui/legacy/css/src/scss/components/breadcrumbs.scss
+++ /dev/null
@@ -1,144 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.toolbar div.filters {
-  float: left;
-  width: 200px;
-  margin: 5px 0 0 12px;
-}
-
-div.toolbar div.filters select {
-  width: 104px;
-  height: 21px;
-  margin: 1px 0 0;
-  padding: 0 0 0;
-  /*+border-radius:4px;*/
-  border: 1px solid #808080;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-#breadcrumbs {
-  width: 100%;
-  height: 29px;
-  max-height: 29px;
-  background: #ffffff;
-  overflow: hidden;
-}
-
-.project-view #breadcrumbs {
-  background-color: #828282;
-  background-image: url('../images/bg-breadcrumbs-project-view.png');
-  background-position: 0 1px;
-}
-
-#breadcrumbs div.home {
-  position: relative;
-  z-index: $z-index-breadcrumbs2;
-  float: left;
-  /*+placement:shift -1px 0px;*/
-  top: 0;
-  left: -1px;
-  width: auto;
-  height: 23px;
-  cursor: pointer;
-}
-
-.project-view #breadcrumbs div.home {
-  background-position: -63px -98px;
-}
-
-.project-view #breadcrumbs div.end {
-  background-position: -89px -98px;
-}
-
-#breadcrumbs ul li,
-#breadcrumbs div.active-project,
-#breadcrumbs .home {
-  position: relative;
-  position: relative;
-  float: left;
-  top: 0;
-  left: -13px;
-  height: 21px;
-  /*+placement:shift -13px 0px;*/
-  margin: 0 0 0 2px;
-  padding: 9px 5px 0 0;
-  font-size: 13px;
-  color: #ffffff;
-  cursor: pointer;
-}
-
-#breadcrumbs ul li:after,
-#breadcrumbs .home:after {
-  content: '>';
-  position: relative;
-  /*+placement:shift 7px -1px;*/
-  top: -1px;
-  left: 7px;
-  font-size: 11px;
-  color: #c4c4c4;
-}
-
-.project-view #breadcrumbs ul li {
-  color: #ffffff !important;
-}
-
-#breadcrumbs ul li,
-#breadcrumbs div.active-project,
-#breadcrumbs .home {
-  /*+placement:shift 0px 0px;*/
-  position: relative;
-  top: 0;
-  left: 0;
-  padding: 9px 5px 0 8px;
-  color: #63a9f1;
-}
-
-#breadcrumbs ul li:hover,
-#breadcrumbs ul li.active,
-#breadcrumbs ul li.maximized {
-  color: #000000;
-}
-
-/*NOTE: End divs are not displayed per UI changes*/
-#breadcrumbs ul div.end {
-  /*+placement:shift -37px -1px;*/
-  display: none;
-  position: relative;
-  top: -1px;
-  left: -37px;
-  /*Disabled*/
-  margin-right: 0;
-}
-
-#breadcrumbs ul li {
-  position: relative;
-  /*+placement:shift -36px 0px;*/
-  top: 0;
-  font-size: 13px;
-}
-
-#breadcrumbs div.active-project {
-  display: none;
-  z-index: $z-index-breadcrumbs1;
-  text-indent: 9px;
-}
diff --git a/ui/legacy/css/src/scss/components/browser.scss b/ui/legacy/css/src/scss/components/browser.scss
deleted file mode 100644
index 31dce19..0000000
--- a/ui/legacy/css/src/scss/components/browser.scss
+++ /dev/null
@@ -1,118 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#browser {
-  position: relative;
-  float: left;
-  width: 994px;
-  max-width: 994px;
-  height: 100%;
-  overflow: hidden;
-}
-
-#browser.panel-highlight {
-  overflow: visible;
-}
-
-#browser div.panel {
-  height: 100%;
-  border-right: 1px solid #a5a5a5;
-  background-color: #f7f7f7;
-  overflow: visible;
-}
-
-#browser div.panel.panel-highlight-wrapper {
-  display: inline-block;
-  position: absolute;
-  /*+border-radius:9px;*/
-  z-index: $z-index-panel-highlight;
-  height: 542px;
-  margin-top: 7px;
-  padding: 78px 0 67px 51px;
-  border: 3px solid #ffffff;
-  /*+box-shadow:0px 0px 12px #000000;*/
-  border-radius: 9px;
-  box-shadow: 0 0 12px #000000;
-  background: none;
-  overflow: hidden;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-  -moz-box-shadow: 0 0 12px #000000;
-  -webkit-box-shadow: 0 0 12px #000000;
-  -o-box-shadow: 0 0 12px #000000;
-}
-
-#browser div.panel.panel-highlight-wrapper .panel {
-  top: 3px;
-  left: 20px !important;
-  height: 631px;
-  overflow: hidden;
-}
-
-.project-view #browser div.panel {
-  background: #6d747d;
-}
-
-.ui-tabs div.ui-tabs-panel {
-  position: relative;
-}
-
-.project-view .ui-tabs div.ui-tabs-panel {
-  background: #dbdddf;
-}
-
-#browser div.panel .shadow {
-  position: absolute;
-  top: 0;
-  left: -10px;
-  width: 10px;
-  height: 100%;
-  background: url('../images/bg-panel-shadow.png') repeat-y 0 0;
-}
-
-#browser.panel-highlight {
-  overflow: visible;
-}
-
-#browser.panel-highlight .panel.highlighted {
-  /*+box-shadow:0px 10px 11px #5C5C5C;*/
-  margin-top: 21px;
-  border: 5px solid #ffffff;
-  border-radius: 6px;
-  box-shadow: 0 10px 11px #5c5c5c;
-  -moz-box-shadow: 0 10px 11px #5c5c5c;
-  /*+border-radius:6px;*/
-  -webkit-box-shadow: 0 10px 11px #5c5c5c;
-  -o-box-shadow: 0 10px 11px #5c5c5c;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-#browser.panel-highlight .panel > .shadow {
-  display: none;
-}
-
-#browser .highlight-arrow {
-  position: absolute;
-  top: -22px;
-  left: 80px;
-  width: 24px;
-  height: 19px;
-  background: url('../images/sprites.png') -590px -1295px;
-}
diff --git a/ui/legacy/css/src/scss/components/button-add.scss b/ui/legacy/css/src/scss/components/button-add.scss
deleted file mode 100644
index f176e21..0000000
--- a/ui/legacy/css/src/scss/components/button-add.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-dialog .ui-button.add {
-  width: auto;
-  height: 12px;
-  margin: 0 0 12px;
-  padding: 5px 7px 5px 6px;
-  background: transparent linear-gradient(to bottom, #f7f7f7 1%, #eaeaea 100%) repeat 0 0;
-  font-size: 12px;
-}
-
-.ui-dialog .ui-button.add:hover {
-  box-shadow: inset 0 0 5px #c3c3c3;
-  background: #e5e5e5 repeat 0 0;
-}
-
-.ui-dialog .ui-button.add span {
-  padding: 0 0 3px 18px;
-  background: transparent url('../images/icons.png') no-repeat -626px -209px;
-}
diff --git a/ui/legacy/css/src/scss/components/button-export.scss b/ui/legacy/css/src/scss/components/button-export.scss
deleted file mode 100644
index 84f9c14..0000000
--- a/ui/legacy/css/src/scss/components/button-export.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.button.export {
-  position: relative;
-  float: right;
-  top: 5px;
-  left: 0;
-  height: 12px;
-  margin: 0 10px 0 0;
-  padding: 5px 5px 5px 5px;
-  border: 1px solid #b7b7b7;
-  border-radius: 4px 4px 4px 4px;
-  background: linear-gradient(to bottom, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  font-size: 12px;
-  font-weight: 100;
-  color: #000000;
-  text-shadow: 0 1px 1px #dee5ea;
-  cursor: pointer;
-}
-
-div.button.export a {
-  position: relative;
-  top: 0;
-  left: 0;
-  padding: 0 0 3px 20px;
-  background: url('../images/exportCsvIcon.png') no-repeat;
-  background-size: 15.5px;
-  color: #000000;
-  text-decoration: none;
-}
diff --git a/ui/legacy/css/src/scss/components/ca-cert-download.scss b/ui/legacy/css/src/scss/components/ca-cert-download.scss
deleted file mode 100644
index 33005ee..0000000
--- a/ui/legacy/css/src/scss/components/ca-cert-download.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.cacert-download {
-  display: inline-block;
-  position: relative;
-  position: absolute;
-  float: right;
-  top: 20px;
-  left: 1175px;
-  height: 30px;
-  cursor: pointer;
-}
-
-.cacert-download .icon {
-  display: inline-block;
-  display: block;
-  position: absolute;
-  float: left;
-  width: 32px;
-  height: 30px;
-  background: url('../images/sprites.png') -142px -348px;
-}
-
-.cacert-download:hover .icon,
-.cacert-download.active .icon {
-  background-position: -368px -348px;
-}
diff --git a/ui/legacy/css/src/scss/components/copy-template.scss b/ui/legacy/css/src/scss/components/copy-template.scss
deleted file mode 100644
index ff06375..0000000
--- a/ui/legacy/css/src/scss/components/copy-template.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.copy-template-destination-list div.text-search {
-  right: 5px;
-}
-
-.copy-template-destination-list div.ui-widget-content {
-  display: block !important;
-}
-
-div.panel.copy-template-destination-list div.list-view div.fixed-header {
-  width: 500px;
-}
-
-.copy-template-destination-list.panel div.list-view div.data-table table {
-  width: 595px;
-}
-
-.copy-template-destination-list .list-view .toolbar {
-  width: 654px;
-}
-
-.multi-edit-add-list .ui-button.copytemplateok {
-  left: 330px;
-}
-
-.multi-edit-add-list .ui-button.copytemplatecancel {
-  left: 310px;
-}
diff --git a/ui/legacy/css/src/scss/components/create-form.scss b/ui/legacy/css/src/scss/components/create-form.scss
deleted file mode 100644
index 09ab932..0000000
--- a/ui/legacy/css/src/scss/components/create-form.scss
+++ /dev/null
@@ -1,218 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-dialog div.form-container {
-  display: inline-block;
-  width: 94% !important;
-  height: 106px;
-  text-align: left;
-}
-
-.ui-dialog div.form-container span.message {
-  padding: 0 0 23px 5px;
-  font-size: 15px;
-  text-align: left;
-}
-
-.ui-dialog div.form-container span.message br {
-  margin-bottom: 13px;
-}
-
-.ui-dialog div.form-container div.form-item {
-  display: inline-block;
-  width: 100%;
-  margin: 0 0 12px;
-}
-
-.ui-dialog div.form-container div.name {
-  float: left;
-  clear: both;
-  width: 115px;
-  margin: 3px 0 0;
-  font-size: 15px;
-  /*+text-shadow:0px 2px 1px #FFFFFF;*/
-  color: #485867;
-  text-shadow: 0 2px 1px #ffffff;
-  -moz-text-shadow: 0 2px 1px #ffffff;
-  -webkit-text-shadow: 0 2px 1px #ffffff;
-  -o-text-shadow: 0 2px 1px #ffffff;
-}
-
-.ui-dialog div.form-container div.name label {
-  display: block;
-  width: 119px;
-  margin-top: 2px;
-  font-size: 13px;
-  text-align: right;
-}
-
-.field-required {
-  padding: 0 3px 0 0;
-  font-size: 14px;
-  font-weight: bold;
-  color: #ee7b7b;
-}
-
-.ui-dialog div.form-container div.value {
-  display: inline-block;
-  float: left;
-  width: 61%;
-  margin: 0 0 0 15px;
-}
-
-.ui-dialog div.form-container div.value input,
-textarea {
-  float: left;
-  width: 98%;
-  padding: 4px;
-  border: 1px solid #afafaf;
-  background: #f6f6f6;
-  font-size: 14px;
-}
-
-.ui-dialog div.form-container div.value label {
-  display: block;
-  width: 119px;
-  margin-top: 2px;
-  margin-left: -10px;
-  font-size: 13px;
-  text-align: left;
-}
-
-.ui-dialog div.form-container div.value input.hasDatepicker {
-  font-size: 13px;
-  color: #2f5d86;
-  text-indent: 3px;
-  cursor: pointer;
-}
-
-.ui-dialog div.form-container div.value input.hasDatepicker:hover {
-  /*+box-shadow:inset 0px 0px 3px;*/
-  box-shadow: inset 0 0 3px;
-  -moz-box-shadow: inset 0 0 3px;
-  -webkit-box-shadow: inset 0 0 3px;
-  -o-box-shadow: inset 0 0 3px;
-}
-
-.ui-dialog div.form-container div.value .range-edit {
-  width: 249px;
-  height: 33px;
-  margin: 2px 0 0;
-}
-
-.ui-dialog div.form-container div.value .range-edit .range-item {
-  position: relative;
-  float: left;
-  width: 124px;
-  height: 32px;
-}
-
-.ui-dialog div.form-container div.value .range-edit input {
-  width: 105px;
-  margin: 0 9px 0 0;
-}
-
-.ui-dialog div.form-container div.value .range-edit label.error {
-  position: absolute;
-  top: 25px;
-  left: 3px;
-}
-
-.ui-dialog div.form-container div.value select {
-  float: right;
-  width: 100%;
-}
-
-.ui-dialog div.form-container div.value input[type='checkbox'] {
-  width: 14px;
-}
-
-.ui-dialog div.form-container div.value label.error {
-  display: block;
-  display: none;
-  clear: both;
-  font-size: 10px;
-  color: #fa0000;
-}
-
-.ui-dialog div.form-container div.multi-array {
-  display: inline-block;
-  padding: 4px;
-  border: 1px solid #808080;
-  /*+border-radius:10px;*/
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  box-shadow: inset 0 1px 1px #929292;
-  background: #ffffff;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  /*+box-shadow:inset 0px 1px 1px #929292;*/
-  -khtml-border-radius: 10px;
-  -moz-box-shadow: inset 0 1px 1px #929292;
-  -webkit-box-shadow: inset 0 1px 1px #929292;
-  -o-box-shadow: inset 0 1px 1px #929292;
-}
-
-.ui-dialog div.form-container div.multi-array .item {
-  float: left;
-  width: 111px;
-  margin: 0 0 13px;
-}
-
-.ui-dialog div.form-container div.multi-array .item .name {
-  float: left;
-  width: 61px;
-  font-size: 11px;
-}
-
-.ui-dialog div.form-container div.multi-array .item .value {
-  float: left;
-  width: 13px;
-}
-
-.ui-dialog div.form-container div.multi-array .item .value input {
-  float: left;
-  margin: 0;
-  padding: 0;
-}
-
-.ui-dialog.create-form .ui-dialog-buttonpane {
-  margin-left: 25px;
-}
-
-.ui-dialog.create-form .ui-button.ok {
-  float: right;
-  margin-left: 0;
-}
-
-.ui-dialog.create-form .ui-button.cancel {
-  float: right;
-  margin-right: 13px;
-  border: 1px solid #aaaaaa;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  background: #b6b6b6 url('../images/gradients.png') 0 -480px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog.create-form .ui-button.cancel:hover {
-  border-color: #878787;
-  background-position: -4px -426px;
-}
diff --git a/ui/legacy/css/src/scss/components/dashboard-project.scss b/ui/legacy/css/src/scss/components/dashboard-project.scss
deleted file mode 100644
index 5a6db9e..0000000
--- a/ui/legacy/css/src/scss/components/dashboard-project.scss
+++ /dev/null
@@ -1,239 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.project-dashboard .resources form {
-  display: inline-block;
-  width: 87%;
-  /*+border-radius:11px;*/
-  margin-top: 17px;
-  margin-left: 22px;
-  padding: 26px;
-  border-radius: 11px;
-  border-radius: 11px 11px 11px 11px;
-  box-shadow: inset 0 3px 4px #979797;
-  background: #ffffff;
-  -moz-border-radius: 11px;
-  /*+box-shadow:inset 0px 3px 4px #979797;*/
-  -webkit-border-radius: 11px;
-  -khtml-border-radius: 11px;
-  -moz-box-shadow: inset 0 3px 4px #979797;
-  -webkit-box-shadow: inset 0 3px 4px #979797;
-  -o-box-shadow: inset 0 3px 4px #979797;
-}
-
-.project-dashboard .resources form .field {
-  float: left;
-  clear: both;
-  width: 100%;
-  margin: auto auto 30px;
-}
-
-.project-dashboard .resources form label {
-  float: left;
-}
-
-.project-dashboard .resources form input[type='text'] {
-  float: right;
-  width: 176px;
-  margin: 0 287px 0 0;
-  padding: 6px;
-  /*+border-radius:4px;*/
-  border: 1px solid #c6c6c6;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  font-size: 16px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.project-dashboard .resources form input[type='submit'] {
-  display: block;
-  float: left;
-  clear: both;
-  padding: 9px 20px;
-  border: 0;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  background: transparent url('../images/bg-gradients.png') 0 -220px;
-  color: #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.detail-view .project-dashboard .resources form {
-  width: 83%;
-  border-bottom: 1px solid #dbdbdb;
-}
-
-.detail-view .project-dashboard .resources form .field input {
-  margin-right: 105px;
-}
-
-/*** Dashboard*/
-.project-dashboard .toolbar {
-  position: relative;
-}
-
-.project-dashboard .ui-tabs {
-  /*+placement:shift 10px -31px;*/
-  position: relative;
-  top: -31px;
-  left: 10px;
-}
-
-.project-view .project-dashboard .ui-tabs .multi-edit table td {
-  background: #eaeaea;
-}
-
-.project-dashboard-view .overview-area {
-  float: left;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard,
-.project-dashboard-view .users .system-dashboard {
-  float: left;
-  width: 510px;
-  height: 230px;
-  background: #777e88;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard ul,
-.project-dashboard-view .users .system-dashboard ul {
-  height: 162px;
-  margin: 14px 0 0;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li,
-.project-dashboard-view .users .system-dashboard li {
-  width: 156px;
-  height: 161px;
-  background: #3d4045;
-  color: #ffffff;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .icon,
-.project-dashboard-view .users li .icon {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 27px 20px;*/
-  top: 20px;
-  left: 27px;
-  width: 100px;
-  height: 76px;
-  background: url('../images/sprites.png') no-repeat 2px -1039px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.storage .icon {
-  background-position: -89px -1036px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.bandwidth .icon {
-  background-position: -184px -1036px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview {
-  position: relative;
-  width: 100%;
-  height: 53px;
-  margin: 81px 0 0;
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.storage .overview .total {
-  position: relative;
-  /*+placement:shift 30px 21px;*/
-  position: absolute;
-  top: 21px;
-  left: 30px;
-  font-size: 28px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li.storage .overview .label {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 91px 33px;*/
-  top: 33px;
-  left: 91px;
-  font-size: 13px;
-  color: #c3c1c1;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item {
-  float: left;
-  margin: 12px 0 0 20px;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item .total {
-  font-size: 24px;
-  font-weight: bold;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item .label {
-  margin: 4px 0 0;
-  font-size: 11px;
-  color: #c7c7c7;
-}
-
-.project-dashboard-view .compute-and-storage .system-dashboard li .overview .overview-item.running .label {
-  color: #2bff2b;
-  /*[empty]background-position:;*/
-}
-
-.project-dashboard-view .users .system-dashboard {
-  clear: both;
-  width: 509px;
-  height: 100%;
-}
-
-.project-dashboard-view .users .system-dashboard ul {
-  overflow-y: auto;
-}
-
-.project-dashboard-view .users .system-dashboard li {
-  width: 86px;
-  height: 138px;
-  margin-bottom: 24px;
-  margin-left: 6px;
-}
-
-.project-dashboard-view .users .system-dashboard li .icon {
-  left: 16px;
-  background-position: -306px -1044px;
-}
-
-.project-dashboard-view .users .system-dashboard li .header {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 7px 110px;*/
-  top: 110px;
-  left: 7px;
-  width: 77px;
-  max-width: 77px;
-  white-space: nowrap;
-  text-align: center;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
diff --git a/ui/legacy/css/src/scss/components/dashboard-system.scss b/ui/legacy/css/src/scss/components/dashboard-system.scss
deleted file mode 100644
index acec78e..0000000
--- a/ui/legacy/css/src/scss/components/dashboard-system.scss
+++ /dev/null
@@ -1,472 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.system-dashboard {
-  display: block;
-  position: relative;
-  width: 962px;
-  /*+border-radius:3px;*/
-  height: 258px;
-  margin: 18px 0 0 15px;
-  border-radius: 3px;
-  box-shadow: inset 0 0 1px #ffffff;
-  /*+box-shadow:inset 0px 0px 1px #FFFFFF;*/
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: inset 0 0 1px #ffffff;
-  -webkit-box-shadow: inset 0 0 1px #ffffff;
-  -o-box-shadow: inset 0 0 1px #ffffff;
-}
-
-.system-dashboard.zone {
-  height: 609px;
-  background-position: 0 -1423px;
-}
-
-.system-dashboard-view .toolbar {
-  position: relative;
-}
-
-.system-dashboard .head {
-  padding: 0 0 12px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  box-shadow: 0 0 1px #ffffff;
-  color: #000000;
-  text-indent: 11px;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:0px 0px 1px #FFFFFF;*/
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-box-shadow: 0 0 1px #ffffff;
-  -webkit-box-shadow: 0 0 1px #ffffff;
-  -o-box-shadow: 0 0 1px #ffffff;
-}
-
-.project-view .system-dashboard .head {
-  padding-top: 14px;
-  /*+text-shadow:0px -1px #000000;*/
-  box-shadow: none;
-  color: #ffffff;
-  text-shadow: 0 -1px #000000;
-  -moz-text-shadow: 0 -1px #000000;
-  /*+box-shadow:none;*/
-  -webkit-text-shadow: 0 -1px #000000;
-  -o-text-shadow: 0 -1px #000000;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.system-dashboard .view-more,
-.system-dashboard .view-all {
-  float: right;
-  margin: -4px 19px 0 0;
-  border: 1px solid #b5b5b5;
-  border-radius: 3px;
-  border-radius: 3px 3px 3px 3px;
-  background: #dadada repeat-x 0 -735px;
-  background: rgb(234, 234, 234);
-  background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZWFlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNkNmQ2ZDYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+');
-  background: -moz-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(234, 234, 234, 1)), color-stop(100%, rgba(214, 214, 214, 1)));
-  background: -webkit-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: -o-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: -ms-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: linear-gradient(to bottom, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  font-size: 13px;
-  /*+border-radius:3px;*/
-  font-weight: 100;
-  cursor: pointer;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eaeaea', endColorstr='#d6d6d6', GradientType=0);
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.system-dashboard .view-more:hover,
-.system-dashboard .view-all:hover {
-  box-shadow: inset 0 1px 1px #000000;
-  /*+box-shadow:inset 0px 1px 1px #000000;*/
-  background: #c1c1c1;
-  background-position: 0 -763px;
-  -moz-box-shadow: inset 0 1px 1px #000000;
-  -webkit-box-shadow: inset 0 1px 1px #000000;
-  -o-box-shadow: inset 0 1px 1px #000000;
-}
-
-.system-dashboard .status_box .view-all {
-  /*+placement:shift 18px 110px;*/
-  position: relative;
-  position: absolute;
-  top: 110px;
-  left: 18px;
-  width: 83%;
-  padding: 8px 0;
-  text-align: center;
-}
-
-.system-dashboard .status_box {
-  margin: 10px 0 0;
-  border: 0;
-  background: transparent;
-  font-size: 14px;
-}
-
-.system-dashboard .status_box li {
-  position: relative;
-  float: left;
-  width: 228px;
-  height: 178px;
-  /*+border-radius:3px;*/
-  margin: 0 0 0 8px;
-  padding: 0;
-  border: 1px solid #c6c6c6;
-  border-radius: 3px;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.system-dashboard.zone .status_box li {
-  height: 152px;
-  margin-bottom: 8px;
-  background-color: #f4f4f4;
-}
-
-.system-dashboard.zone .status_box li .icon {
-  opacity: 0.56;
-  position: relative;
-  /*+placement:shift 31px 19px;*/
-  position: absolute;
-  top: 19px;
-  left: 51px;
-  padding: 65px 80px 5px;
-  /*+opacity:56%;*/
-  background: url('../images/infrastructure-icons.png') no-repeat 0 0;
-  filter: alpha(opacity=56);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=56);
-  -moz-opacity: 0.56;
-}
-
-.system-dashboard .status_box li span.label {
-  font-size: 12px;
-  color: #cccfd4;
-}
-
-.system-dashboard .status_box li span.total {
-  font-size: 25px;
-}
-
-.system-dashboard .status_box li span.label {
-  font-size: 12px;
-  color: #cccfd4;
-}
-
-.system-dashboard .status_box li span.unit {
-  font-size: 13px;
-  color: #c1c4c9;
-}
-
-.system-dashboard .status_box li span.header {
-  position: relative;
-  /*+placement:shift 13px 5px;*/
-  top: 13px;
-  left: 13px;
-  margin: 1px 0 0;
-  font-weight: 100;
-}
-
-.system-dashboard.zone .status_box li span.header {
-  font-size: 14px;
-  color: #4f4f4f;
-}
-
-.system-dashboard .status_box li span.status {
-  position: relative;
-  /*+placement:shift 13px 141px;*/
-  position: absolute;
-  top: 141px;
-  left: 13px;
-  font-size: 27px;
-  color: #25ff25;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.system-dashboard .status_box li span.instance.total {
-  /*+placement:shift 12px 32px;*/
-  position: relative;
-  position: absolute;
-  top: 32px;
-  left: 12px;
-}
-
-.system-dashboard .status_box li span.instance.label {
-  /*+placement:shift 15px 53px;*/
-  position: relative;
-  position: absolute;
-  top: 53px;
-  left: 15px;
-}
-
-.system-dashboard .status_box li span.vcpu-hours.total {
-  /*+placement:shift 13px 76px;*/
-  position: relative;
-  position: absolute;
-  top: 76px;
-  left: 13px;
-}
-
-.system-dashboard .status_box li span.vcpu-hours.label {
-  /*+placement:shift 14px 95px;*/
-  position: relative;
-  position: absolute;
-  top: 95px;
-  left: 14px;
-}
-
-.system-dashboard .status_box li span.gb-hours.total {
-  /*+placement:shift 106px 77px;*/
-  position: relative;
-  position: absolute;
-  top: 77px;
-  left: 106px;
-}
-
-.system-dashboard .status_box li span.gb-hours.label {
-  /*+placement:shift 106px 95px;*/
-  position: relative;
-  position: absolute;
-  top: 95px;
-  left: 106px;
-}
-
-.system-dashboard .status_box li span.overview.total {
-  position: relative;
-  /*+placement:shift 9px 29px;*/
-  position: absolute;
-  top: 29px;
-  left: 9px;
-  font-size: 56px;
-  font-weight: 100;
-  color: #2b7daf;
-  /*+text-shadow:0px -1px 2px #FFFFFF;*/
-  text-shadow: 0 -1px 2px #ffffff;
-  -moz-text-shadow: 0 -1px 2px #ffffff;
-  -webkit-text-shadow: 0 -1px 2px #ffffff;
-  -o-text-shadow: 0 -1px 2px #ffffff;
-}
-
-.system-dashboard .status_box li.capacity span.overview.total {
-  font-size: 32px;
-}
-
-.system-dashboard .status_box li span.overview.label {
-  /*+placement:shift 52px 79px;*/
-  position: relative;
-  position: absolute;
-  top: 79px;
-  left: 52px;
-}
-
-.system-dashboard .status_box li span.used.total {
-  /*+placement:shift 14px 130px;*/
-  position: relative;
-  position: absolute;
-  top: 130px;
-  left: 14px;
-  font-size: 30px;
-}
-
-.system-dashboard .status_box li span.used.label {
-  /*+placement:shift 14px 153px;*/
-  position: relative;
-  position: absolute;
-  top: 153px;
-  left: 14px;
-}
-
-.system-dashboard .status_box li span.used.unit {
-  /*+placement:shift 67px 135px;*/
-  position: relative;
-  position: absolute;
-  top: 135px;
-  left: 67px;
-}
-
-.system-dashboard .status_box li span.available.unit {
-  /*+placement:shift 159px 135px;*/
-  position: relative;
-  position: absolute;
-  top: 135px;
-  left: 159px;
-}
-
-.system-dashboard .status_box li span.available.total {
-  /*+placement:shift 97px 130px;*/
-  position: relative;
-  position: absolute;
-  top: 130px;
-  left: 97px;
-  font-size: 30px;
-}
-
-.system-dashboard .status_box li span.available.label {
-  /*+placement:shift 97px 153px;*/
-  position: relative;
-  position: absolute;
-  top: 153px;
-  left: 97px;
-}
-
-.system-dashboard-view .socket-info {
-  float: left;
-  width: 100%;
-  height: 239px;
-  padding: 0;
-  overflow: auto;
-}
-
-.system-dashboard-view .socket-info > .title {
-  padding: 8px;
-  font-size: 13px;
-}
-
-.system-dashboard-view .socket-info li {
-  float: left;
-  width: 139px;
-  /*+border-radius:3px;*/
-  margin: 7px;
-  padding: 13px;
-  border: 1px solid #cccccc;
-  border-radius: 3px;
-  background: #efefef;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.system-dashboard-view .socket-info li > div {
-  float: left;
-  text-decoration: none;
-}
-
-.system-dashboard-view .socket-info li .name {
-  width: 100%;
-  margin-bottom: 13px;
-  font-weight: 100;
-}
-
-.system-dashboard-view .socket-info li .hosts,
-.system-dashboard-view .socket-info li .sockets {
-  width: 54px;
-  /*[empty]color:;*/
-}
-
-.system-dashboard-view .socket-info li div .title {
-  padding-bottom: 3px;
-  border: 0;
-  font-size: 13px;
-  color: #424242;
-}
-
-.add-zone-resource .form-container {
-  display: inline-block;
-  height: auto !important;
-  overflow: visible;
-}
-
-.add-zone-resource .form-container form {
-  display: inline-block;
-  height: auto;
-}
-
-.add-zone-resource .head {
-  display: inline-block;
-  width: 100%;
-  margin-bottom: 7px;
-  border-bottom: 1px solid #afbdca;
-  /*+box-shadow:0px 1px #FFFFFF;*/
-  box-shadow: 0 1px #ffffff;
-  -moz-box-shadow: 0 1px #ffffff;
-  -webkit-box-shadow: 0 1px #ffffff;
-  -o-box-shadow: 0 1px #ffffff;
-}
-
-.add-zone-resource .head span {
-  float: left;
-  padding: 10px 0 18px;
-  font-size: 14px;
-  text-indent: 5px;
-}
-
-.add-zone-resource .head select {
-  float: left;
-  margin: -3px 0 6px 13px;
-  margin: 8px 0 0 9px;
-}
-
-/** Infrastructure icons*/
-.system-dashboard.zone .status_box li.zones .icon {
-  background-position: -36px -105px;
-}
-
-.system-dashboard.zone .status_box li.pods .icon {
-  background-position: -229px -105px;
-}
-
-.system-dashboard.zone .status_box li.clusters .icon {
-  background-position: -411px -96px;
-}
-
-.system-dashboard.zone .status_box li.hosts .icon {
-  background-position: -601px -102px;
-}
-
-.system-dashboard.zone .status_box li.primary-storage .icon {
-  position: relative;
-  /*+placement:shift 37px 68px;*/
-  top: 68px;
-  left: 37px;
-  background-position: -32px -404px;
-}
-
-.system-dashboard.zone .status_box li.sockets .icon {
-  background-position: -14px -581px;
-}
-
-.system-dashboard.zone .status_box li.secondary-storage .icon {
-  position: relative;
-  /*+placement:shift 37px 68px;*/
-  top: 68px;
-  left: 37px;
-  background-position: -216px -404px;
-}
-
-.system-dashboard.zone .status_box li.system-vms .icon,
-.system-dashboard.zone .status_box li.management-servers .icon {
-  background-position: -408px -399px;
-}
-
-.system-dashboard.zone .status_box li.virtual-routers .icon {
-  background-position: -601px -400px;
-}
diff --git a/ui/legacy/css/src/scss/components/dashboard.scss b/ui/legacy/css/src/scss/components/dashboard.scss
deleted file mode 100644
index 1051dba..0000000
--- a/ui/legacy/css/src/scss/components/dashboard.scss
+++ /dev/null
@@ -1,724 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.dashboard.admin {
-  height: 100%;
-  padding: 10px;
-  background: #f2f0f0;
-  font-size: 13px;
-  color: #3d5873;
-}
-
-.dashboard.admin .dashboard-container {
-  /*+border-radius:3px;*/
-  border: 1px solid #c8c2c2;
-  border-radius: 3px;
-  background: #ffffff;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.dashboard.admin .dashboard-container.sub {
-  width: 49.5%;
-}
-
-.dashboard.admin .dashboard-container.sub .button.view-all,
-.dashboard.admin .dashboard-container .button.fetch-latest {
-  float: right;
-  clear: none;
-  padding: 3px 8px 3px 10px;
-  /*+text-shadow:none;*/
-  border: 1px solid #9d9d9d;
-  border-radius: 3px;
-  box-shadow: 0 1px #cacaca;
-  background: rgb(234, 234, 234);
-  background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZWFlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNkNmQ2ZDYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+');
-  background: -moz-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(234, 234, 234, 1)), color-stop(100%, rgba(214, 214, 214, 1)));
-  background: -webkit-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: -o-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: -ms-linear-gradient(top, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  background: linear-gradient(to bottom, rgba(234, 234, 234, 1) 0%, rgba(214, 214, 214, 1) 100%);
-  font-size: 13px;
-  font-weight: 100;
-  color: #000000;
-  text-shadow: none;
-  cursor: pointer;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  /*+border-radius:3px;*/
-  -o-text-shadow: none;
-  -moz-text-shadow: 0 1px 0 #333e49;
-  -webkit-text-shadow: 0 1px 0 #333e49;
-  -o-text-shadow: 0 1px 0 #333e49;
-  /*+box-shadow:0px 1px #CACACA;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eaeaea', endColorstr='#d6d6d6', GradientType=0);
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: 0 1px #cacaca;
-  -webkit-box-shadow: 0 1px #cacaca;
-  -o-box-shadow: 0 1px #cacaca;
-}
-
-.dashboard.admin .dashboard-container.sub .button.view-all:hover,
-.dashboard.admin .dashboard-container .button.fetch-latest:hover {
-  box-shadow: inset 0 0 6px #636363;
-  /*+box-shadow:inset 0px 0px 6px #636363;*/
-  background: #e8e8e8;
-  -moz-box-shadow: inset 0 0 6px #636363;
-  -webkit-box-shadow: inset 0 0 6px #636363;
-  -o-box-shadow: inset 0 0 6px #636363;
-}
-
-.dashboard.admin .dashboard-container.sub .title {
-  float: left;
-}
-
-/**** Head*/
-.dashboard.admin .dashboard-container.head {
-  float: left;
-  box-sizing: border-box;
-  width: 100%;
-  margin: 9px 0 0;
-  padding: 0 0;
-}
-
-.dashboard.admin .dashboard-container .top {
-  float: left;
-  box-sizing: border-box;
-  width: 100%;
-  margin: 0;
-  padding: 4px 4px 8px;
-  background: #efefef 0 -4px;
-  color: #ffffff;
-}
-
-.dashboard.admin .dashboard-container .title {
-  float: left;
-  padding: 5px 0 0 4px;
-  font-size: 13px;
-  /*+text-shadow:0px 1px 1px #9A9A9A;*/
-  font-weight: 100;
-  text-shadow: 0 1px 1px #9a9a9a;
-  -moz-text-shadow: 0 1px 1px #9a9a9a;
-  -webkit-text-shadow: 0 1px 1px #9a9a9a;
-  -o-text-shadow: 0 1px 1px #9a9a9a;
-}
-
-.dashboard.admin .dashboard-container .title span {
-  color: #000000;
-  /*+text-shadow:none;*/
-  text-shadow: none;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-.dashboard.admin .dashboard-container.head .selects {
-  float: right;
-}
-
-.dashboard.admin .dashboard-container.head .selects .select {
-  float: left;
-  margin: 0 0 0 21px;
-  padding: 0;
-}
-
-.dashboard.admin .dashboard-container.head .selects .select label {
-  display: block;
-  float: left;
-  padding: 5px 0 0;
-}
-
-.dashboard.admin .dashboard-container.head .selects .select select {
-  width: 124px;
-  margin: 3px 0 0 10px;
-  padding: 0;
-}
-
-/**** Charts / stats*/
-.dashboard.admin .zone-stats {
-  position: relative;
-  width: 100%;
-  padding: 11px 0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.dashboard.admin .zone-stats ul {
-  position: relative;
-  width: 100%;
-}
-
-.dashboard.admin .zone-stats ul li {
-  position: relative;
-  z-index: $z-index-standard;
-  float: left;
-  width: 50%;
-  height: 79px;
-  font-size: 14px;
-  cursor: pointer;
-}
-
-.dashboard.admin .zone-stats ul li canvas {
-  position: relative;
-  z-index: $z-index-behind;
-}
-
-.dashboard.admin .zone-stats ul li:hover {
-  background: #fff2da;
-}
-
-.dashboard.admin .zone-stats ul li .label {
-  float: left;
-  width: 161px;
-  margin: 5px 0 0 22px;
-  padding: 22px 0 7px;
-  border-bottom: 1px solid #e2e2e2;
-  font-weight: 100;
-}
-
-.dashboard.admin .zone-stats ul li .info {
-  float: left;
-  width: 151px;
-  margin: 12px 0 0;
-  white-space: nowrap;
-  color: #636363;
-}
-
-.dashboard.admin .zone-stats ul li .info .name {
-  margin-top: 8px;
-  margin-bottom: 9px;
-  font-size: 12px;
-  font-weight: bold;
-  font-weight: 100;
-  /*[empty]color:;*/
-}
-
-.dashboard.admin .zone-stats ul li .pie-chart-container {
-  position: relative;
-  position: relative;
-  float: left;
-  top: 7px;
-  left: -8px;
-  /*+placement:shift -8px 7px;*/
-  width: 91px;
-  height: 69px;
-  overflow: hidden;
-}
-
-.dashboard.admin .zone-stats ul li .pie-chart-container .percent-label {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 28px 31px;*/
-  top: 31px;
-  left: 28px;
-  width: 52px;
-  font-weight: bold;
-  color: #c98200;
-  text-align: center;
-}
-
-.dashboard.admin .zone-stats ul li .pie-chart {
-  position: relative;
-  z-index: $z-index-behind;
-  float: left;
-  width: 70px;
-  height: 66px;
-  margin: 3px 27px 0 16px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li {
-  display: block;
-  clear: both;
-  width: 97%;
-  height: 40px;
-  margin: 0 0 10px;
-  padding: 0 12px 0;
-  /*+border-radius:10px;*/
-  border: 1px solid #c8c2c2;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: url('../images/bg-gradients.png') 0 -29px;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .name {
-  float: left;
-  width: 178px;
-  margin: 15px 15px 0 0;
-  font-size: 11px;
-  font-weight: bold;
-}
-
-.dashboard.admin .dashboard-container .stats ul li div.value {
-  float: left;
-  width: 295px;
-  height: 100%;
-  margin: 0 9px 0 0;
-  border-right: 1px solid #c8c2c2;
-  border-left: 1px solid #c8c2c2;
-  background: url('../images/bg-gradients.png') 0 -51px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .value .content {
-  margin: 6px 9px 9px;
-  padding: 9px;
-  border-right: 1px solid #6a6a6a;
-  border-bottom: 1px solid #ffffff;
-  /*Adjusting the font size for proper display*/
-  border-left: 1px solid #6a6a6a;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url('../images/bg-gradients.png') repeat-x 0 0;
-  /*+border-radius:4px;*/
-  font-size: 10px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #6f6f6f;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+text-shadow:0px -1px 1px #6F6F6F;*/
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 1px #6f6f6f;
-  -webkit-text-shadow: 0 -1px 1px #6f6f6f;
-  -o-text-shadow: 0 -1px 1px #6f6f6f;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .chart {
-  float: left;
-  width: 290px;
-  height: 17px;
-  margin: 12px 23px 0 0;
-  padding: 0 1px;
-  border-top: 1px solid #727272;
-  /*+border-radius:7px;*/
-  border-bottom: 1px solid #ffffff;
-  border-radius: 7px;
-  border-radius: 7px 7px 7px 7px;
-  background: url('../images/bg-gradients.png') 0 -130px;
-  -moz-border-radius: 7px;
-  -webkit-border-radius: 7px;
-  -khtml-border-radius: 7px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .chart .chart-line {
-  height: 15px;
-  margin: 1px 0 0;
-  /*+border-radius:10px;*/
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: url('../images/bg-gradients.png') 0 -149px;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .percentage {
-  float: left;
-  margin: 13px 0 0;
-  font-size: 20px;
-  font-weight: bold;
-  /*+text-shadow:0px -2px 1px #FFFFFF;*/
-  text-shadow: 0 -2px 1px #ffffff;
-  -moz-text-shadow: 0 -2px 1px #ffffff;
-  -webkit-text-shadow: 0 -2px 1px #ffffff;
-  -o-text-shadow: 0 -2px 1px #ffffff;
-}
-
-/**** Alerts*/
-.dashboard.admin .dashboard-container.sub.alerts {
-  position: relative;
-  float: left;
-  box-sizing: border-box;
-  height: 190px;
-  overflow: hidden;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts.first {
-  margin-right: 1%;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts .top {
-  height: 18%;
-};
-
-.dashboard.admin .dashboard-container.sub.alerts ul {
-  position: relative;
-  width: 100%;
-  height: 82%;
-  overflow-y: scroll;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li {
-  float: left;
-  margin: 9px;
-  padding: 8px;
-  /*+border-radius:3px;*/
-  border: 1px solid #d4d0d0;
-  border-radius: 3px;
-  background: #f0f0f0;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li {
-  border: 1px solid #ff7070;
-  background: #ffefef;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li span.title {
-  width: 100%;
-  margin: 3px 0 5px;
-  padding: 0;
-  font-size: 14px;
-  font-weight: bold;
-  font-weight: 100;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  color: #266e9a;
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li p {
-  float: left;
-  margin: 4px 0 0;
-  color: #252525;
-}
-
-.dashboard.admin .dashboard-container.sub.alerts ul li p br {
-  display: none;
-}
-
-/*** User*/
-#browser div.panel .dashboard.user .toolbar {
-  position: relative;
-  height: 60px;
-}
-
-.dashboard.user .button.view-all {
-  float: right;
-  margin: -4px 4px -4px 0;
-  /*+border-radius:4px;*/
-  padding: 2px 3px 3px;
-  border: 1px solid #4b5b6b;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url('../images/bg-gradients.png') 0 -147px;
-  color: #ffffff;
-  /*+text-shadow:0px -1px 2px #13293E;*/
-  text-indent: 0;
-  text-shadow: 0 -1px 2px #13293e;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 2px #13293e;
-  -webkit-text-shadow: 0 -1px 2px #13293e;
-  -o-text-shadow: 0 -1px 2px #13293e;
-}
-
-.dashboard.user .button.view-all:hover {
-  background-position: 0 0;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-/**** Actions*/
-.dashboard.user .dashboard-actions ul {
-  padding: 11px;
-}
-
-.dashboard.user .dashboard-actions ul li {
-  float: left;
-  width: 123px;
-  height: 40px;
-  margin: 0 9px 0 0;
-  border: 1px solid #395268;
-  /*+border-radius:4px;*/
-  border-right: 1px solid #556778;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 0 1px #dde3ec;
-  background: url('../images/bg-gradients.png') repeat-x 0 -181px;
-  /*+box-shadow:inset 0px 0px 1px #DDE3EC;*/
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 0 1px #dde3ec;
-  -webkit-box-shadow: inset 0 0 1px #dde3ec;
-  -o-box-shadow: inset 0 0 1px #dde3ec;
-}
-
-.dashboard.user .dashboard-actions ul li span {
-  position: relative;
-  top: 10px;
-  /*+text-shadow:0px 1px 2px #444444;*/
-  left: 4px;
-  padding: 8px 12px 11px 34px;
-  background: url('../images/icons.png') no-repeat -613px -309px;
-  font-size: 11px;
-  color: #ffffff;
-  text-shadow: 0 1px 2px #444444;
-  /*+placement:shift 4px 10px;*/
-  -moz-text-shadow: 0 1px 2px #444444;
-  -webkit-text-shadow: 0 1px 2px #444444;
-  -o-text-shadow: 0 1px 2px #444444;
-}
-
-.dashboard.user .dashboard-actions ul li.add-iso span {
-  background-position: -613px -352px;
-}
-
-.dashboard.user .dashboard-actions ul li.add-volume span {
-  background-position: -613px -264px;
-}
-
-.dashboard.user .dashboard-actions ul li.acquire-ip span {
-  background-position: -613px -389px;
-}
-
-/**** VM Status*/
-.dashboard.user .vm-status {
-  width: 98%;
-  margin: 19px auto auto;
-  border: 1px solid #d2cdcd;
-  /*+border-radius:9px;*/
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.dashboard.user .vm-status .title {
-  width: 100%;
-  padding: 13px 0 12px;
-  /*+border-radius:10px 10px 0 0;*/
-  border-bottom: 1px solid #c8c2c2;
-  border-radius: 10px 10px 0 0;
-  background: url('../images/bg-gradients.png') 0 -53px;
-  font-size: 13px;
-  color: #4a5967;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 10px 10px 0 0;
-  -webkit-border-radius: 10px 10px 0 0;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -khtml-border-radius: 10px 10px 0 0;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.dashboard.user .vm-status .title span {
-  padding: 0 0 0 8px;
-}
-
-.dashboard.user .vm-status .content {
-  padding: 9px 0;
-}
-
-.dashboard.user .vm-status .content ul {
-  display: inline-block;
-  margin: auto;
-}
-
-.dashboard.user .vm-status .content ul li {
-  float: left;
-  width: 243px;
-  height: 237px;
-  margin: 0 0 0 11px;
-  border: 1px solid #e6ebee;
-  /*+border-radius:10px;*/
-  border-top: 2px solid #d3d9de;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: #ebedf1;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.dashboard.user .vm-status .content ul li .name {
-  margin: 14px 0 0;
-  padding: 0 0 0 35px;
-  background: url('../images/icons.png') -617px -488px;
-  font-size: 28px;
-  /*+text-shadow:0px 2px 2px #FFFFFF;*/
-  color: #5c7082;
-  text-shadow: 0 2px 2px #ffffff;
-  -moz-text-shadow: 0 2px 2px #ffffff;
-  -webkit-text-shadow: 0 2px 2px #ffffff;
-  -o-text-shadow: 0 2px 2px #ffffff;
-}
-
-.dashboard.user .vm-status .content ul li .value {
-  width: 229px;
-  margin: 12px auto auto;
-  padding: 59px 0;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  background: #dfe9cc;
-  font-size: 58px;
-  color: #5d7c98;
-  text-align: center;
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-.dashboard.user .vm-status .content ul li.stopped .name {
-  background-position: -617px -524px;
-}
-
-.dashboard.user .vm-status .content ul li.stopped .value {
-  background: #edcbce;
-}
-
-.dashboard.user .vm-status .content ul li.total .name {
-  background-position: -617px -559px;
-}
-
-.dashboard.user .vm-status .content ul li.total .value {
-  background: #dfe4e9;
-}
-
-/***** Tables / status list*/
-.dashboard.user .status-lists {
-  margin: 15px 0 0 8px;
-}
-
-.dashboard.user .status-lists ul li.events {
-  width: 512px;
-}
-
-.dashboard.user .status-lists ul li.events .content li {
-  width: 97%;
-  margin: 6px 11px 0 0;
-  padding: 13px 0 12px 16px;
-  border: 1px solid #dbdbdb;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  box-shadow: 0 2px 4px #c0c0c0;
-  background: #efefef url('../images/bg-gradients.png') repeat-x 0 -29px;
-  font-size: 11px;
-  color: #495a76;
-  text-shadow: 0 1px #ffffff;
-  /*+box-shadow:0px 2px 4px #C0C0C0;*/
-  cursor: default;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-  -moz-box-shadow: 0 2px 4px #c0c0c0;
-  /*+border-radius:4px;*/
-  -webkit-box-shadow: 0 2px 4px #c0c0c0;
-  -o-box-shadow: 0 2px 4px #c0c0c0;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.dashboard.user .status-lists ul li.events .content li .title {
-  margin-bottom: 9px;
-  font-weight: bold;
-  color: #4a5a6a;
-}
-
-.dashboard.user .status-lists ul li {
-  float: left;
-  margin: 0 10px 0 0;
-}
-
-.dashboard.user .status-lists table {
-  width: 252px;
-  margin: 0;
-  cursor: default;
-}
-
-.dashboard.user .status-lists table th {
-  padding: 8px 0 6px;
-}
-
-.dashboard.user .status-lists .events table {
-  width: 515px;
-}
-
-.dashboard.user .status-lists table tbody {
-  display: block;
-  height: 256px;
-  padding: 0 0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.dashboard.user .status-lists table td.value {
-  cursor: default;
-}
-
-.dashboard.user .status-lists table td.desc {
-  width: 151px;
-  cursor: default;
-  overflow: hidden;
-}
-
-.dashboard.user .status-lists .my-account table tbody tr td {
-  padding-top: 19px;
-  padding-bottom: 19px;
-}
-
-.dashboard.user .status-lists table thead {
-  border-top: 1px solid #c4c5c5;
-  background: url('../images/bg-gradients.png') 0 -351px;
-}
-
-.dashboard.user .status-lists table tr.odd {
-  background: #dfe1e3;
-}
-
-.dashboard.user .status-lists table td {
-  vertical-align: middle;
-}
-
-/****** IP addresses*/
-.dashboard.user .status-lists li.ip-addresses td {
-  width: 250px;
-  padding: 28px 0 51px;
-}
-
-.dashboard.user .status-lists li.ip-addresses .desc {
-  color: #3f5468;
-}
-
-.dashboard.user .status-lists li.ip-addresses .value {
-  margin: 7px 0 0;
-  font-size: 29px;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
diff --git a/ui/legacy/css/src/scss/components/datepicker.scss b/ui/legacy/css/src/scss/components/datepicker.scss
deleted file mode 100644
index 7ec092a..0000000
--- a/ui/legacy/css/src/scss/components/datepicker.scss
+++ /dev/null
@@ -1,150 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-datepicker {
-  display: none;
-  width: 300px;
-  height: auto;
-  padding: 4px 0 0;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  box-shadow: 0 3px 8px #000000;
-  background: #ffffff 0 -2470px;
-  overflow: hidden;
-  -moz-border-radius: 4px;
-  /*+box-shadow:0px 3px 8px #000000;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 3px 8px #000000;
-  -webkit-box-shadow: 0 3px 8px #000000;
-  -o-box-shadow: 0 3px 8px #000000;
-}
-
-.ui-datepicker .ui-datepicker-title {
-  width: 100%;
-  margin: auto;
-}
-
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
-  margin: 6px 13px 6px 14px;
-  padding: 6px;
-  /*+box-shadow:0px 1px 5px #444444;*/
-  border-radius: 4px;
-  box-shadow: 0 1px 5px #444444;
-  background: url('../images/bg-gradients.png') 0 -182px;
-  font-size: 13px;
-  /*+text-shadow:0px -1px 1px #050505;*/
-  font-size: 12px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #050505;
-  cursor: pointer;
-  -moz-box-shadow: 0 1px 5px #444444;
-  -webkit-box-shadow: 0 1px 5px #444444;
-  -o-box-shadow: 0 1px 5px #444444;
-  -moz-text-shadow: 0 -1px 1px #050505;
-  -webkit-text-shadow: 0 -1px 1px #050505;
-  /*+border-radius:4px;*/
-  -o-text-shadow: 0 -1px 1px #050505;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-datepicker .ui-datepicker-prev:hover,
-.ui-datepicker .ui-datepicker-next:hover {
-  /*+box-shadow:inset 0px 0px 10px #000000;*/
-  box-shadow: inset 0 0 10px #000000;
-  -moz-box-shadow: inset 0 0 10px #000000;
-  -webkit-box-shadow: inset 0 0 10px #000000;
-  -o-box-shadow: inset 0 0 10px #000000;
-}
-
-.ui-datepicker .ui-datepicker-prev {
-  float: left;
-}
-
-.ui-datepicker .ui-datepicker-next {
-  float: right;
-}
-
-.ui-datepicker .ui-datepicker-title .ui-datepicker-month {
-  width: 85px;
-  font-size: 16px;
-  color: #2c363f;
-}
-
-.ui-datepicker .ui-datepicker-title {
-  position: relative;
-  top: 6px;
-  left: 0;
-  width: 188px;
-  /*+placement:shift 0px 6px;*/
-  height: 19px;
-  padding: 3px 0 0;
-  text-align: center;
-}
-
-.ui-datepicker table {
-  width: 277px;
-  height: 9px;
-}
-
-.ui-datepicker table th,
-.ui-datepicker table td {
-  min-width: 24px;
-  padding: 7px 0;
-  border: 1px solid #b9b6b6;
-  text-align: center;
-  text-indent: 0;
-  /*[empty]+placement:;*/
-}
-
-.ui-datepicker table td {
-  cursor: pointer;
-}
-
-.ui-datepicker table td.ui-state-disabled,
-.ui-datepicker table td.ui-state-disabled:hover {
-  box-shadow: none;
-  /*+box-shadow:none;*/
-  background-color: #dcdcdc;
-  cursor: default;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.ui-datepicker table td a {
-  font-size: 12px;
-  color: #485867;
-  text-decoration: none;
-}
-
-.ui-datepicker table td:hover {
-  box-shadow: inset 0 0 4px #6b6b6b;
-  /*+box-shadow:inset 0px 0px 4px #6B6B6B;*/
-  background-color: #6a839a;
-  -moz-box-shadow: inset 0 0 4px #6b6b6b;
-  -webkit-box-shadow: inset 0 0 4px #6b6b6b;
-  -o-box-shadow: inset 0 0 4px #6b6b6b;
-}
-
-.ui-datepicker table td:hover a {
-  color: #ffffff;
-  text-shadow: 0 -1px #000000;
-}
diff --git a/ui/legacy/css/src/scss/components/details-page.scss b/ui/legacy/css/src/scss/components/details-page.scss
deleted file mode 100644
index 3298e84..0000000
--- a/ui/legacy/css/src/scss/components/details-page.scss
+++ /dev/null
@@ -1,476 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-//TODO find new stategy to organize this styles
-.detail-view {
-  padding: 0 0 0 14px;
-}
-
-.ui-tabs .info {
-  display: inline-block;
-  width: 91%;
-  height: auto;
-  margin: 10px;
-  padding: 14px 14px 0;
-  border: 1px dashed #d7d7d7;
-  /*+box-shadow:inset 0px 1px 2px #FFFFFF;*/
-  box-shadow: inset 0 1px 2px #ffffff;
-  background: #efefef;
-  overflow: visible;
-  -moz-box-shadow: inset 0 1px 2px #ffffff;
-  -webkit-box-shadow: inset 0 1px 2px #ffffff;
-  -o-box-shadow: inset 0 1px 2px #ffffff;
-}
-
-.ui-tabs .info li {
-  margin: 0 0 18px;
-  font-size: 12px;
-  color: #3e4c59;
-}
-
-.ui-tabs .info li strong {
-  font-weight: bold;
-  color: #506273;
-}
-
-.project-view .ui-tabs ul li.ui-state-default a {
-  box-shadow: inset -1px -2px 12px #596066;
-  /*+box-shadow:inset -1px -2px 12px #596066;*/
-  background: #6d747d;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #3a3e42;
-  -moz-box-shadow: inset -1px -2px 12px #596066;
-  -webkit-box-shadow: inset -1px -2px 12px #596066;
-  /*+text-shadow:0px -1px 1px #3A3E42;*/
-  -o-box-shadow: inset -1px -2px 12px #596066;
-  -moz-text-shadow: 0 -1px 1px #3a3e42;
-  -webkit-text-shadow: 0 -1px 1px #3a3e42;
-  -o-text-shadow: 0 -1px 1px #3a3e42;
-}
-
-.project-view .ui-tabs ul li.ui-state-hover a {
-  background: #878e97 0 8px;
-}
-
-.project-view .ui-tabs ul li.ui-state-active a {
-  box-shadow: 0 0;
-  background: #dbdddf;
-  font-weight: bold;
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  color: #4f6270;
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  /*+box-shadow:0px 0px;*/
-  -o-text-shadow: 0 0 #ffffff;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 none;
-  -webkit-box-shadow: 0 0 none;
-  -o-box-shadow: 0 0 none;
-}
-
-.ui-tabs li.ui-state-active.first.last a,
-.ui-tabs li.ui-state-default.first.last a {
-  /*+border-radius:4px 4px 0 0;*/
-  border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-.ui-tabs .ui-tabs-hide {
-  display: none !important;
-}
-
-.ui-tabs .ui-tabs-panel {
-  clear: both;
-  width: 97%;
-  height: 591px;
-  padding: 7px 0 0 0;
-  border: 1px solid #d9d9d9;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.detail-view .main-groups {
-  width: 100%;
-  max-height: 407px;
-  margin-right: 12px;
-  overflow: auto;
-  /*[empty]padding:;*/
-  overflow-x: hidden;
-}
-
-.detail-view.edit-mode .main-groups {
-  max-height: 360px;
-}
-
-.detail-group table {
-  width: 98%;
-  margin-top: 10px;
-  border-bottom: 1px solid #dfdfdf;
-  font-size: 12px;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-}
-
-.detail-group table tbody {
-  border: 0;
-}
-
-.detail-group table tr,
-.detail-group table td {
-  vertical-align: middle;
-  border: 0;
-  cursor: default;
-}
-
-.detail-group table tr.odd {
-  background: none;
-}
-
-.details.group-multiple table {
-  border: 0;
-  border-top: 0;
-}
-
-.details.group-multiple table.header {
-  width: 94%;
-  margin-bottom: 1px;
-}
-
-.details.group-multiple table tbody {
-  border-top: 1px solid #f2f0f0;
-}
-
-.detail-group .main-groups table td.name {
-  width: 113px;
-  padding: 14px 12px 13px 13px;
-  border: 0;
-  font-weight: bold;
-  color: #6d6d6d;
-  text-indent: 0;
-}
-
-.detail-group .main-groups table td.value {
-  text-indent: 0;
-}
-
-.detail-group .main-groups table td.value > span {
-  display: block;
-  position: relative;
-  float: left;
-  top: 9px;
-  width: 245px;
-  height: 30px;
-  overflow: auto;
-}
-
-.detail-group .main-groups table td.value > span.copypasteenabledvalue {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  -o-text-overflow: ellipsis;
-}
-
-.detail-group .main-groups table td.value > .copypasteactive {
-  display: auto;
-  white-space: nowrap;
-  overflow: none;
-}
-
-div.copypasteicon {
-  float: left;
-  width: 18px;
-  height: 21px;
-  margin-top: 0;
-  margin-left: 6px;
-  background: url('../images/sprites.png') no-repeat -271px -65px;
-}
-
-div.copypasteicon:hover {
-  background: url('../images/sprites.png') no-repeat -271px -646px;
-}
-
-.detail-group .main-groups table td.value > span.copypasteenabledvalue {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  -o-text-overflow: ellipsis;
-}
-
-.detail-group .main-groups table td.value > .copypasteactive {
-  display: auto;
-  white-space: nowrap;
-  overflow: none;
-}
-
-div.copypasteicon {
-  float: left;
-  width: 18px;
-  height: 21px;
-  margin-top: 0;
-  margin-left: 6px;
-  background: url('../images/sprites.png') no-repeat -271px -65px;
-}
-
-div.copypasteicon:hover {
-  background: url('../images/sprites.png') no-repeat -271px -646px;
-}
-
-.detail-group .main-groups table td.value > span select {
-  width: 100% !important;
-}
-
-.detail-group .main-groups table td.value .view-all {
-  float: right;
-  /*[empty]height:;*/
-  /*+border-radius:4px 0 0 4px;*/
-  margin: 7px 0 0;
-  padding: 0;
-  border-radius: 4px 0 0 4px;
-  cursor: pointer;
-  -moz-border-radius: 4px 0 0 4px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -khtml-border-radius: 4px 0 0 4px;
-}
-
-.detail-group .main-groups table td.value .view-all span {
-  display: block;
-  float: left;
-  margin-top: -5px;
-  padding: 5px 2px 8px 4px;
-  border-left: 1px solid #9fa2a6;
-  /*+border-radius:4px 0 0 4px;*/
-  border-radius: 4px 0 0 4px;
-  background: url('../images/gradients.png') repeat-x 0 -529px;
-  -moz-border-radius: 4px 0 0 4px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -khtml-border-radius: 4px 0 0 4px;
-}
-
-.detail-group .main-groups table td.value .view-all .end {
-  float: right;
-  width: 22px;
-  height: 25px;
-  margin: -6px 0 0;
-  padding: 0;
-  background: url('../images/sprites.png') no-repeat 100% -397px;
-}
-
-.detail-group .main-groups table td.value .view-all:hover {
-  background-position: 100% -431px;
-}
-
-.detail-group .main-groups table td.value .view-all:hover span {
-  background-position: 0 -566px;
-}
-
-.detail-group .main-groups table td.value .view-all:hover div.end {
-  background-position: -618px -430px;
-}
-
-.detail-view .detail-group .button.add {
-  clear: both;
-  margin: 0 21px 13px 0 !important;
-}
-
-.detail-view .details.group-multiple {
-  float: left;
-  width: 100%;
-  height: 600px;
-  margin-bottom: 30px;
-}
-
-.detail-view .details.group-multiple .main-groups {
-  width: 98%;
-  margin-bottom: 35px;
-  overflow: visible;
-}
-
-
-.detail-group .main-groups table td.value .view-all:hover {
-  background-position: 100% -431px;
-}
-
-.panel.always-maximized .detail-group .main-groups table td.value span {
-  width: 565px;
-}
-
-.detail-group.head table td.name {
-  padding: 20px 0 17px;
-}
-
-.detail-view .button.done,
-.detail-view .button.cancel {
-  display: inline-block;
-  position: relative;
-  position: absolute;
-  top: 550px;
-  /*+border-radius:4px;*/
-  left: -1px;
-  margin: 0 0 0 12px;
-  padding: 9px 20px;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+text-shadow:0px -1px 2px #000000;*/
-  box-shadow: 0 1px 4px #adadad;
-  background: url('../images/bg-gradients.png') 0 -221px;
-  font-size: 12px;
-  font-weight: bold;
-  /*+box-shadow:0px 1px 4px #ADADAD;*/
-  color: #ffffff;
-  text-shadow: 0 -1px 2px #000000;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 2px #000000;
-  -webkit-text-shadow: 0 -1px 2px #000000;
-  /*+placement:shift -1px 550px;*/
-  -o-text-shadow: 0 -1px 2px #000000;
-  -moz-box-shadow: 0 1px 4px #adadad;
-  -webkit-box-shadow: 0 1px 4px #adadad;
-  -o-box-shadow: 0 1px 4px #adadad;
-}
-
-.detail-view .button.cancel {
-  left: 85px;
-  background-position: 0 -795px;
-  color: #808080;
-  /*+text-shadow:0px -1px 2px #000000;*/
-  text-shadow: 0 -1px 2px #000000;
-  text-shadow: 0 -1px 2px #cccccc;
-  -moz-text-shadow: 0 -1px 2px #000000;
-  -webkit-text-shadow: 0 -1px 2px #000000;
-  -o-text-shadow: 0 -1px 2px #000000;
-  -moz-text-shadow: 0 -1px 2px #cccccc;
-  -webkit-text-shadow: 0 -1px 2px #cccccc;
-  -o-text-shadow: 0 -1px 2px #cccccc;
-}
-
-.detail-view .button.done:hover {
-  box-shadow: inset 0 1px 3px #000000;
-  /*+box-shadow:inset 0px 1px 3px #000000;*/
-  background-position: 0 -950px;
-  -moz-box-shadow: inset 0 1px 3px #000000;
-  -webkit-box-shadow: inset 0 1px 3px #000000;
-  -o-box-shadow: inset 0 1px 3px #000000;
-}
-
-.detail-view .button.cancel:hover {
-  background-position: 0 -834px;
-}
-
-div.group-multiple div.detail-group table {
-  margin-top: -1px;
-}
-
-div.group-multiple div.detail-group table.header {
-  margin-top: 11px;
-  border: 0;
-}
-
-div.group-multiple div.detail-group table.header thead th {
-  border: 0;
-  background: transparent;
-}
-
-div.ui-tabs-panel table span.none {
-  color: #9d9d9d;
-}
-
-div.detail-group td.view-all div.view-all {
-  float: right;
-  width: auto;
-}
-
-div.detail-group td.view-all a {
-  display: block;
-  float: left;
-  font-size: 13px;
-  font-weight: 100;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  color: #0373b7;
-  text-decoration: none;
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-div.detail-group td.view-all:hover a {
-  background-position: 0 -566px;
-}
-
-div.detail-group td.view-all a span {
-  /*+placement:shift -4px -1px;*/
-  position: relative;
-  top: -1px;
-  left: -4px;
-}
-
-div.detail-group td.view-all:hover a span {
-  color: #000000;
-  text-decoration: underline;
-}
-
-div.detail-group td.view-all div.view-all div.end {
-  display: none;
-  float: left;
-  width: 15px;
-  height: 25px;
-  background: url('../images/sprites.png') -617px -398px;
-}
-
-div.detail-group td.view-all:hover div.view-all div.end {
-  background-position: -617px -431px;
-}
-
-div.details div.detail-group td.value input,
-div.details div.detail-group td.value select {
-  width: 282px;
-}
-
-div.details div.detail-group td.value input,
-div.details div.detail-group td.value input[type='checkbox'] {
-  float: left;
-  width: 15px;
-  margin-left: 10px;
-}
-
-div.details div.detail-group td.value input,
-div.details div.detail-group td.value input[type='text'] {
-  width: 93%;
-}
-
-div.details .main-groups label.error {
-  position: absolute;
-  top: 6px;
-  right: 10%;
-}
-
-.detail-view td.view-all.multiple {
-  display: block;
-  float: left;
-  max-width: 145px;
-  height: 28px;
-  margin-left: 0;
-  text-align: left;
-}
diff --git a/ui/legacy/css/src/scss/components/dialog-about.scss b/ui/legacy/css/src/scss/components/dialog-about.scss
deleted file mode 100644
index e9f00fb..0000000
--- a/ui/legacy/css/src/scss/components/dialog-about.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.dialog-about .ui-widget-content {
-  width: 100% !important;
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.dialog-about .logo {
-  padding-top: 20px;
-  font-size: 26px;
-  color: #636363;
-}
-
-.dialog-about .version {
-  padding-top: 10px;
-  font-size: 12px;
-}
-
-.dialog-about .ui-button {
-  float: none;
-  margin: 0 auto;
-}
diff --git a/ui/legacy/css/src/scss/components/dynamic-input.scss b/ui/legacy/css/src/scss/components/dynamic-input.scss
deleted file mode 100644
index 98c5265..0000000
--- a/ui/legacy/css/src/scss/components/dynamic-input.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-dialog div.form-container div.value .dynamic-input {
-  clear: both;
-  width: calc(100% + 4px);
-  min-height: 50px;
-  max-height: 211px;
-  border: 1px solid #cdcdcd;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  /*+border-radius:4px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .form-item {
-  width: 97%;
-  margin: 4px 0 0 5px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .name {
-  width: 99px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .name label {
-  width: inherit;
-  margin-left: 0;
-  font-size: 12px;
-}
-
-.ui-dialog div.form-container div.value .dynamic-input .value {
-  width: 40%;
-}
diff --git a/ui/legacy/css/src/scss/components/first-network-resource.scss b/ui/legacy/css/src/scss/components/first-network-resource.scss
deleted file mode 100644
index 1072d11..0000000
--- a/ui/legacy/css/src/scss/components/first-network-resource.scss
+++ /dev/null
@@ -1,158 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.panel .add-first-network-resource {
-  margin: 37px;
-  padding: 19px 19px 79px;
-  border: 1px solid #ececec;
-  border-radius: 12px;
-  /*+border-radius:12px;*/
-  border-radius: 12px 12px 12px 12px;
-  background: #ffffff;
-  font-size: 14px;
-  -moz-border-radius: 12px;
-  -webkit-border-radius: 12px;
-  -khtml-border-radius: 12px;
-}
-
-.panel .add-first-network-resource form {
-  display: inline-block;
-  height: 442px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.panel .add-first-network-resource .title {
-  margin: 0 0 17px;
-  font-size: 26px;
-  /*+text-shadow:0px 1px 2px #BCBCBC;*/
-  color: #3984d1;
-  text-shadow: 0 1px 2px #bcbcbc;
-  -moz-text-shadow: 0 1px 2px #bcbcbc;
-  -webkit-text-shadow: 0 1px 2px #bcbcbc;
-  -o-text-shadow: 0 1px 2px #bcbcbc;
-}
-
-.panel .add-first-network-resource .message {
-  display: block;
-  margin: 0 0 30px;
-  color: #545151;
-}
-
-.panel .add-first-network-resource .form-item {
-  display: inline-block;
-  position: relative;
-  width: 409px;
-  margin: 0 0 2px;
-  padding: 5px;
-}
-
-.panel .add-first-network-resource .form-item label {
-  float: left;
-  width: 109px;
-  text-align: right;
-}
-
-.panel .add-first-network-resource .form-item label.error {
-  display: none;
-  position: absolute;
-  top: 30px;
-  left: 137px;
-  font-size: 10px;
-}
-
-.panel .add-first-network-resource .form-item input {
-  float: right;
-  /*+border-radius:6px;*/
-  border: 1px solid #b7b7b7;
-  border-radius: 6px;
-  border-radius: 6px 6px 6px 6px;
-  font-size: 16px;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-.panel .add-first-network-resource .form-item input[type='checkbox'] {
-  float: right;
-  margin: 0 266px 0 0;
-}
-
-.panel .add-first-network-resource .form-item input[type='text'],
-.panel .add-first-network-resource .form-item input[type='password'],
-.panel .add-first-network-resource .form-item input[type='text'],
-.panel .add-first-network-resource .form-item select {
-  width: 276px;
-}
-
-.panel .add-first-network-resource .form-item select {
-  width: 280px;
-  margin: 0 0 0 20px;
-}
-
-.panel .add-first-network-resource .button {
-  clear: both;
-  margin: 29px 0 0;
-  padding: 11px 23px 11px 21px;
-  border: 1px solid #858585;
-  /*+border-radius:10px;*/
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  background: url('../images/bg-gradients.png') repeat-x 0 -221px;
-  color: #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-  /*[empty]position:;*/
-}
-
-.panel .add-first-network-resource .multi-array {
-  display: inline-block;
-  float: left;
-  clear: both;
-  width: 383px;
-  margin: 3px 0 10px;
-  padding: 12px;
-  border: 1px solid #dcdcdc;
-  border-radius: 7px;
-  /*+border-radius:7px;*/
-  border-radius: 7px 7px 7px 7px;
-  background: #ffffff;
-  -moz-border-radius: 7px;
-  -webkit-border-radius: 7px;
-  -khtml-border-radius: 7px;
-}
-
-.panel .add-first-network-resource .multi-array .item {
-  float: left;
-  max-width: 155px;
-  margin: 6px 0 0 24px;
-}
-
-.panel .add-first-network-resource .multi-array .item .name {
-  float: left;
-}
-
-.panel .add-first-network-resource .multi-array .item .value {
-  float: right;
-  margin: 0 0 0 13px;
-}
-
-.panel .add-first-network-resource .multi-array .item .value input {
-  margin: 0;
-}
diff --git a/ui/legacy/css/src/scss/components/gpu-groups.scss b/ui/legacy/css/src/scss/components/gpu-groups.scss
deleted file mode 100644
index 7b1e747..0000000
--- a/ui/legacy/css/src/scss/components/gpu-groups.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.gpugroups div.list-view div.fixed-header {
-  position: relative;
-  top: 0 !important;
-  left: 12px !important;
-}
-
-div.gpugroups div.list-view div.fixed-header table {
-  width: auto;
-}
-
-div.gpugroups div.list-view div.data-table table {
-  margin-top: 0;
-}
-
-div.gpugroups div.list-view {
-  position: relative;
-  height: auto !important;
-  margin-top: 0 !important;
-  border: 0;
-}
-
-.gpugroups {
-  float: left;
-  width: 100%;
-  height: 100%;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.gpugroups .gpugroup-container {
-  position: relative;
-  float: left;
-  width: auto;
-  height: auto !important;
-  margin: 12px;
-  padding: 0;
-  border: 1px solid #c8c2c2;
-  border-radius: 3px;
-}
-
-.gpugroups .gpugroup-container .title {
-  padding: 12px 12px 5px;
-  font-size: 13px;
-  font-weight: 100;
-}
diff --git a/ui/legacy/css/src/scss/components/header-notifications.scss b/ui/legacy/css/src/scss/components/header-notifications.scss
deleted file mode 100644
index bcc6a06..0000000
--- a/ui/legacy/css/src/scss/components/header-notifications.scss
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#header div.notifications {
-  position: relative;
-  float: right;
-  top: -57px;
-  left: -239px;
-  /*+placement:shift -174px -57px;*/
-  height: 18px;
-  padding: 1px 0 0;
-  background: transparent;
-}
-
-#header div.notifications:after {
-  content: '|';
-  /*+placement:shift 28px 7px;*/
-  position: relative;
-  top: 7px;
-  left: 28px;
-}
-
-#header div.notifications span {
-  position: relative;
-  top: 5px;
-  left: 7px;
-  /*+text-shadow:0px -1px 1px #464646;*/
-  text-shadow: 0 -1px 1px #464646;
-  -moz-text-shadow: 0 -1px 1px #464646;
-  -webkit-text-shadow: 0 -1px 1px #464646;
-  -o-text-shadow: 0 -1px 1px #464646;
-}
-
-#header div.notifications:hover {
-  color: #5faaf7;
-}
-
-#header div.notifications div.total {
-  float: left;
-  width: 22px;
-  height: 19px;
-  margin: 3px;
-  background: url('../images/sprites.png') no-repeat -593px -870px;
-  font-size: 11px;
-  color: #ffffff;
-  /*+text-shadow:0px -1px #6C7283;*/
-  text-shadow: 0 -1px #6c7283;
-  -moz-text-shadow: 0 -1px #6c7283;
-  -webkit-text-shadow: 0 -1px #6c7283;
-  -o-text-shadow: 0 -1px #6c7283;
-  -moz-text-shadow: 0 -1px 0 #6c7283;
-  -webkit-text-shadow: 0 -1px 0 #6c7283;
-  -o-text-shadow: 0 -1px 0 #6c7283;
-}
-
-#header div.notifications div.total.pending {
-  background-position: -593px -846px;
-  font-weight: bold;
-}
-
-#header div.notifications div.total span {
-  /*+placement:shift 0px 3px;*/
-  display: block;
-  position: relative;
-  top: 3px;
-  left: 0;
-  width: 21px;
-  font-size: 12px;
-  text-align: center;
-}
diff --git a/ui/legacy/css/src/scss/components/header.scss b/ui/legacy/css/src/scss/components/header.scss
deleted file mode 100644
index 37134c7..0000000
--- a/ui/legacy/css/src/scss/components/header.scss
+++ /dev/null
@@ -1,71 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#header {
-  position: relative;
-  width: 100%;
-  height: 135px;
-  background: url('../images/overlay-pattern.png') repeat 0, #1b5070 url('../images/header-gradient.png') no-repeat center;
-  background-size: auto, cover;
-}
-
-#header div.button {
-  font-size: 12px;
-  color: #ffffff;
-  cursor: pointer;
-}
-
-#header.nologo div.logo {
-  position: relative;
-  top: 15px;
-  left: 0;
-  width: 1224px;
-  /*+placement:shift 0px 15px;*/
-  height: 47px;
-  margin: auto;
-  background: url('../images/logo.png') no-repeat 0 center;
-}
-
-#header div.controls {
-  position: relative;
-  width: 1226px;
-  height: 48px;
-  margin: 27px auto 0;
-  padding-top: 13px;
-  /*+border-radius:4px 4px 0 0;*/
-  border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-#header div.controls.nologo {
-  box-shadow: 0 -1px 6px #0e3955;
-  background: #666666;
-  background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMzZDNkM2QiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+');
-  background: -moz-linear-gradient(top, #666666 0%, #3d3d3d 100%);
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #666666), color-stop(100%, #3d3d3d));
-  background: -webkit-linear-gradient(top, #666666 0%, #3d3d3d 100%);
-  background: -o-linear-gradient(top, #666666 0%, #3d3d3d 100%);
-  background: -ms-linear-gradient(top, #666666 0%, #3d3d3d 100%);
-  background: linear-gradient(to bottom, #666666 0%, #3d3d3d 100%);
-  /*+box-shadow:0px -1px 6px #0E3955;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#666666', endColorstr='#3d3d3d', GradientType=0);
-  -moz-box-shadow: 0 -1px 6px #0e3955;
-  -webkit-box-shadow: 0 -1px 6px #0e3955;
-  -o-box-shadow: 0 -1px 6px #0e3955;
-}
diff --git a/ui/legacy/css/src/scss/components/health-check.scss b/ui/legacy/css/src/scss/components/health-check.scss
deleted file mode 100644
index 9fd14dd..0000000
--- a/ui/legacy/css/src/scss/components/health-check.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-dialog .health-check {
-  height: 295px !important;
-  padding-bottom: 93px;
-}
-
-div.ui-dialog div.health-check div.health-check-description {
-  color: #808080;
-}
-
-div.ui-dialog div.health-check div.form-container form div.form-item {
-  width: 58%;
-  margin-top: -16px;
-  margin-bottom: 30px;
-  margin-left: 116px;
-}
-
-div.ui-dialog div.health-check div.health-check-config-title {
-  float: left;
-  margin-left: 15px;
-  font-size: 17px;
-  color: #808080;
-}
-
-div.ui-dialog div.health-check div.health-check-advanced-title {
-  float: left;
-  margin-top: -70px;
-  margin-left: 15px;
-  font-size: 17px;
-  color: #808080;
-}
diff --git a/ui/legacy/css/src/scss/components/info-boxes.scss b/ui/legacy/css/src/scss/components/info-boxes.scss
deleted file mode 100644
index c8c369d..0000000
--- a/ui/legacy/css/src/scss/components/info-boxes.scss
+++ /dev/null
@@ -1,201 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.info-boxes {
-  float: right;
-  width: 233px;
-  height: 551px;
-  margin: 21px 5px 0 0;
-}
-
-.info-boxes .info-box {
-  display: inline-block;
-  border: 1px solid #b3c3d0;
-  /*+box-shadow:inset 0px -1px 7px #A7A7A7;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 -1px 7px #a7a7a7;
-  background: #ffffff;
-  -moz-box-shadow: inset 0 -1px 7px #a7a7a7;
-  /*+border-radius:4px;*/
-  -webkit-box-shadow: inset 0 -1px 7px #a7a7a7;
-  -o-box-shadow: inset 0 -1px 7px #a7a7a7;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.info-boxes .info-box.events {
-  width: 228px;
-  height: 323px;
-  margin-top: 4px;
-}
-
-.info-boxes .info-box.events ul {
-  max-height: 295px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.info-boxes .info-box ul {
-  display: inline-block;
-  height: auto;
-  margin: 0 0 3px 2px;
-}
-
-.info-boxes .info-box ul li {
-  display: inline-block;
-  width: 224px;
-  margin: 0 2px 0 0;
-  border-top: 1px solid #ffffff;
-  border-bottom: 1px solid #bdd2df;
-}
-
-.info-boxes .info-box ul li.odd {
-  background: #ececec;
-}
-
-.info-boxes .info-box .button {
-  float: right;
-  margin: 0 14px 0 0;
-  padding: 2px 6px 3px 3px;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  border: 1px solid #82a3c7;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px 1px #85acc4;
-  /*+border-radius:4px;*/
-  background: url('../images/bg-gradients.png') 0 -734px;
-  font-size: 10px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 1px 1px #000000;
-  /*+box-shadow:inset 0px 1px 1px #85ACC4;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px 1px #85acc4;
-  -webkit-box-shadow: inset 0 1px 1px #85acc4;
-  -o-box-shadow: inset 0 1px 1px #85acc4;
-}
-
-.info-boxes .info-box .button span {
-  /*+placement:shift 0px 2px;*/
-  position: relative;
-  float: left;
-  top: 2px;
-  left: 0;
-}
-
-.info-boxes .info-box .title .button {
-  margin: 4px 6px 0 3px;
-}
-
-.info-boxes .info-box .title .button span {
-  position: relative;
-  top: 1px;
-  left: 1px;
-  margin: 0;
-  /*+placement:shift 1px 1px;*/
-  padding: 0;
-  font-size: 10px;
-  color: #ffffff;
-}
-
-.info-boxes .info-box .button:hover {
-  background-position: 0 -766px;
-}
-
-.info-boxes .info-box .button .arrow {
-  position: relative;
-  float: right;
-  top: 0;
-  /*+placement:shift 0px 0px;*/
-  left: 0;
-  width: 16px;
-  height: 13px;
-  background: url('../images/sprites.png') no-repeat -455px -84px;
-}
-
-.info-boxes .info-box ul li .total,
-.info-boxes .info-box ul li .date {
-  position: relative;
-  float: left;
-  top: 0;
-  left: 0;
-  width: 52px;
-  height: 36px;
-  /*+placement:shift;*/
-  border-right: 1px solid #bdd2df;
-  font-size: 24px;
-  color: #647c91;
-  text-align: right;
-}
-
-.info-boxes .info-box ul li .date {
-  margin: 1px 0 0;
-  font-size: 11px;
-  text-align: center;
-}
-
-.info-boxes .info-box ul li .date span {
-  /*+placement:shift 0px 11px;*/
-  position: relative;
-  top: 11px;
-  left: 0;
-}
-
-.info-boxes .info-box ul li .desc {
-  display: inline-block;
-  position: relative;
-  /*+placement:shift 5px 8px;*/
-  top: 8px;
-  left: 5px;
-  max-width: 153px;
-  padding-bottom: 13px;
-  font-size: 12px;
-  white-space: nowrap;
-  color: #606060;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.info-boxes .info-box ul li .total span {
-  /*+placement:shift -5px 7px;*/
-  position: relative;
-  top: 7px;
-  left: -5px;
-}
-
-.info-boxes .info-box .title {
-  height: 27px;
-  border-bottom: 1px solid #bdd2df;
-}
-
-.info-boxes .info-box .title span {
-  /*+placement:shift 8px 6px;*/
-  position: relative;
-  top: 6px;
-  left: 8px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #4e748c;
-}
diff --git a/ui/legacy/css/src/scss/components/install-wizzard.scss b/ui/legacy/css/src/scss/components/install-wizzard.scss
deleted file mode 100644
index 8f21133..0000000
--- a/ui/legacy/css/src/scss/components/install-wizzard.scss
+++ /dev/null
@@ -1,434 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.install-wizard {
-  position: relative;
-  width: 1024px;
-  height: 768px;
-  margin: auto;
-  border-top: 0;
-}
-
-body.install-wizard {
-  height: 769px !important; //TODO important may be removed
-  background: #ffffff url('../images/bg-login.png');
-  font-family: sans-serif;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.install-wizard .header {
-  z-index: $z-index-install-wizard1;
-  height: 365px;
-  padding: 32px 0 89px;
-  background: url('../images/bg-login.png');
-  color: #626e82;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  text-align: center;
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-.install-wizard .header h3 {
-  font-size: 20px;
-}
-
-.install-wizard .step {
-  max-width: 691px;
-  margin: auto;
-  padding: 56px 0 0;
-}
-
-.install-wizard .step .title {
-  clear: both;
-  width: 303px;
-  margin: auto auto 30px;
-  font-size: 22px;
-  color: #626e82;
-}
-
-.install-wizard .step .subtitle {
-  font-size: 12px;
-  font-weight: bold;
-  color: #4b5e69;
-}
-
-.install-wizard .step p {
-  background: url('../images/bg-gradient-white-transparent.png') repeat-x -114px -270px;
-  font-size: 15px;
-  line-height: 23px;
-  color: #4a4a4a;
-}
-
-.install-wizard .step ul li {
-  width: 465px;
-  margin: 14px 0 0 18px;
-  font-size: 13px;
-  list-style: disc;
-}
-
-.install-wizard .step .field {
-  margin: 0 0 12px;
-  text-align: left;
-}
-
-.install-wizard .step .field label {
-  display: block;
-  clear: both;
-  font-size: 11px;
-  color: #4d4d4d;
-}
-
-.install-wizard .step .field label.error {
-  font-size: 11px;
-  color: #ff2424;
-}
-
-.install-wizard .body {
-  z-index: $z-index-install-wizard2;
-  width: 1012px;
-  height: 762px;
-  margin: -352px auto auto;
-  box-shadow: 0 -3px 4px #cfcfcf;
-  /*+box-shadow:0px -3px 4px #CFCFCF;*/
-  background: url('../images/bg-gradient-white-transparent.png') repeat-x -114px -141px;
-  -moz-box-shadow: 0 -3px 4px #cfcfcf;
-  -webkit-box-shadow: 0 -3px 4px #cfcfcf;
-  -o-box-shadow: 0 -3px 4px #cfcfcf;
-}
-
-.install-wizard h2 {
-  margin: 0 0 19px;
-  font-size: 28px;
-}
-
-.install-wizard input[type='text'],
-.install-wizard input[type='password'],
-.install-wizard input[type='text'],
-.install-wizard select {
-  width: 288px;
-  /*+border-radius:4px;*/
-  padding: 6px;
-  border: 1px solid #cdcdcd;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px #aeaeae;
-  background: #f7f7f7;
-  /*+box-shadow:inset 0px 1px #AEAEAE;*/
-  font-size: 14px;
-  color: #232323;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px #aeaeae;
-  -webkit-box-shadow: inset 0 1px #aeaeae;
-  -o-box-shadow: inset 0 1px #aeaeae;
-  -moz-box-shadow: inset 0 1px 0 #aeaeae;
-  -webkit-box-shadow: inset 0 1px 0 #aeaeae;
-  -o-box-shadow: inset 0 1px 0 #aeaeae;
-}
-
-.install-wizard .button {
-  float: right;
-  margin-top: 15px;
-  /*+border-radius:4px;*/
-  padding: 7px 16px 7px 18px;
-  border: 1px solid #505050;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url('../images/bg-gradients.png') 0 -221px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 3px #3f4351;
-  /*+text-shadow:0px -1px 3px #3F4351;*/
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 -1px 3px #3f4351;
-  -webkit-text-shadow: 0 -1px 3px #3f4351;
-  -o-text-shadow: 0 -1px 3px #3f4351;
-}
-
-.install-wizard .button.advanced-installation,
-.install-wizard .button.go-back {
-  float: left;
-  border: 1px solid #c7c2c2;
-  background: #e0dede;
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  color: #3b3b3b;
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  -o-text-shadow: 0 0 #ffffff;
-}
-
-.install-wizard .button.go-back {
-  padding: 9px 16px 10px 18px;
-  font-size: 12px;
-}
-
-.install-wizard .setup-form .button.go-back {
-  /*+placement:shift 15px -14px;*/
-  position: relative;
-  top: -14px;
-  left: 15px;
-}
-
-.install-wizard .step {
-  position: relative;
-  z-index: $z-index-install-wizard3;
-}
-
-.install-wizard .step .tooltip-info {
-  /*+placement:shift 547px 50px;*/
-  position: relative;
-  position: absolute;
-  top: 50px;
-  left: 547px;
-}
-
-/*** Intro*/
-.install-wizard .step.intro.what-is-cloudstack p {
-  height: 540px;
-  background: url('../images/bg-what-is-cloudstack.png') no-repeat 50% 237px;
-}
-
-/*** Diagram*/
-.install-wizard .diagram {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 65px 496px;*/
-  z-index: $z-index-install-wizard2;
-  top: 496px;
-  left: 65px;
-  width: 910px;
-  height: 385px;
-}
-
-.install-wizard .diagram .part {
-  display: none;
-  background: url('../images/install-wizard-parts.png') no-repeat;
-}
-
-.install-wizard .diagram .part.zone {
-  position: relative;
-  position: absolute;
-  top: 222px;
-  /*+placement:shift 77px 222px;*/
-  left: 77px;
-  width: 742px;
-  height: 135px;
-  background-position: -267px -580px;
-}
-
-.install-wizard .diagram .part.loading {
-  position: relative;
-  position: absolute;
-  top: -67px;
-  /*+placement:shift 105px -67px;*/
-  left: 105px;
-  width: 742px;
-  height: 432px;
-  background-position: -1264px -487px;
-}
-
-.install-wizard .diagram .part.loading .icon {
-  position: relative;
-  top: 130px;
-  left: 322px;
-  /*+placement:shift 322px 130px;*/
-  width: 61px;
-  height: 76px;
-  background: url('../images/ajax-loader.gif') no-repeat;
-}
-
-.install-wizard .diagram .part.pod {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 313px -76px;*/
-  left: 313px;
-  width: 266px;
-  height: 396px;
-  background-position: -47px -3px;
-}
-
-.install-wizard .diagram .part.cluster {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 313px -76px;*/
-  left: 313px;
-  width: 266px;
-  height: 396px;
-  background-position: -364px 1px;
-}
-
-.install-wizard .diagram .part.host {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 313px -76px;*/
-  left: 313px;
-  width: 266px;
-  height: 396px;
-  background-position: -688px 1px;
-}
-
-.install-wizard .diagram .part.primaryStorage {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 306px -76px;*/
-  left: 306px;
-  width: 275px;
-  height: 396px;
-  background-position: -1046px 1px;
-}
-
-.install-wizard .diagram .part.secondaryStorage {
-  position: relative;
-  position: absolute;
-  top: -76px;
-  /*+placement:shift 306px -76px;*/
-  left: 306px;
-  width: 385px;
-  height: 396px;
-  background-position: -1469px 1px;
-}
-
-/*** Setup form*/
-.install-wizard .step .setup-form {
-  display: inline-block;
-  width: 469px;
-  border: 1px solid #dfdfdf;
-  box-shadow: 0 5px 9px #9f9f9f;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  background: url('../images/bg-transparent-white.png');
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px 0 #ffffff;
-  -webkit-text-shadow: 0 1px 0 #ffffff;
-  /*+box-shadow:0px 5px 9px #9F9F9F;*/
-  -o-text-shadow: 0 1px 0 #ffffff;
-  -moz-box-shadow: 0 5px 9px #9f9f9f;
-  -webkit-box-shadow: 0 5px 9px #9f9f9f;
-  -o-box-shadow: 0 5px 9px #9f9f9f;
-}
-
-.install-wizard .step .setup-form .title {
-  float: left;
-  margin: 17px 0 0 29px;
-  color: #626f7c;
-}
-
-.install-wizard .step .setup-form .field {
-  display: inline-block;
-  width: 389px;
-  margin: 6px 0 1px 31px;
-  padding: 9px;
-  color: #57646d;
-}
-
-.install-wizard .step .setup-form .field .name {
-  float: left;
-  width: 98px;
-  padding: 10px 0 0 0;
-  font-size: 13px;
-  text-align: right;
-}
-
-.install-wizard .step .setup-form .field .value {
-  float: right;
-}
-
-.install-wizard .step .setup-form input[type='text'],
-.install-wizard .step .setup-form input[type='password'] {
-  width: 278px;
-  margin: 6px 4px 0 0;
-  padding: 2px 2px 1px;
-  border: 1px solid #8d8d8d;
-}
-
-.install-wizard .step .setup-form .range-item {
-  float: left;
-  width: 142px;
-}
-
-.install-wizard .step .setup-form .range-item input {
-  width: 131px;
-}
-
-.install-wizard .step .setup-form .multi-range input[type='text'] {
-  width: 128px;
-}
-
-.install-wizard .step .setup-form input.button {
-  margin: 0 30px 14px 15px;
-}
-
-/*** Step: Change user*/
-.install-wizard .step.change-user {
-  width: 316px;
-  margin: auto;
-  padding-top: 95px;
-  text-align: center;
-}
-
-.install-wizard .step.intro iframe {
-  width: 99%;
-  height: 99%;
-  margin: 4px;
-}
-
-.install-wizard .step.intro .title {
-  margin-bottom: 21px;
-  margin-left: 0;
-  font-size: 25px;
-  color: #565454;
-}
-
-.install-wizard .step.intro .subtitle {
-  margin-bottom: 9px;
-}
-
-.install-wizard .step.intro .subtitle li {
-  position: relative;
-  width: 45%;
-  height: 24px;
-  padding: 1px 0 1px 30px;
-  background: url('../images/ajax-loader-small.gif') no-repeat 3px 0;
-  list-style: none;
-}
-
-.install-wizard .step.intro .subtitle li.complete {
-  background: url('../images/icons.png') -1px -224px;
-}
-
-.install-wizard .step.intro .subtitle li.error {
-  background: url('../images/icons.png') -1px -190px;
-}
-
-.install-wizard .step.intro .subtitle li img {
-  float: right;
-}
diff --git a/ui/legacy/css/src/scss/components/jquery-ui.scss b/ui/legacy/css/src/scss/components/jquery-ui.scss
deleted file mode 100644
index 6816518..0000000
--- a/ui/legacy/css/src/scss/components/jquery-ui.scss
+++ /dev/null
@@ -1,88 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.ui-widget {
-  font-family: inherit;
-}
-
-.ui-widget-content,
-.ui-widget.ui-widget-content {
-  border: 0;
-  background: inherit;
-}
-
-.ui-dialog.ui-widget-content {
-  background: #ffffff;
-}
-
-.ui-tabs .ui-tabs-nav {
-  display: block;
-  position: relative;
-  z-index: $z-index-ui-tabs;
-  float: left;
-  width: 100%;
-  height: 41px;
-  margin-top: 42px;
-  padding: 0;
-  border: 0;
-  background-color: inherit;
-  overflow: hidden;
-}
-
-.ui-tabs .ui-tabs-nav.ui-corner-all {
-  border-bottom-left-radius: 0;
-}
-
-.ui-tabs .ui-tabs-nav .ui-tab {
-  margin-right: 1px;
-}
-
-.ui-tabs .ui-tab .ui-tabs-anchor {
-  position: relative;
-  float: left;
-  min-width: 91px;
-  padding: 15px 10px;
-  font-size: 11px;
-  color: #4e6070;
-  text-align: center;
-  text-decoration: none;
-}
-
-.ui-tabs .ui-tab.ui-state-default {
-  border: 1px solid #d9d9d9;
-  background: #f0f0f0;
-}
-
-.ui-tabs .ui-tab.ui-state-active {
-  background: #ffffff;
-}
-
-.ui-tabs .ui-tab.ui-state-hover a {
-  text-decoration: underline;
-  /*color: #000000;*/
-  cursor: pointer;
-}
-
-ul.ui-autocomplete.ui-menu {
-  width: 250px;
-  max-height: 400px;
-  padding: 5px;
-  background: #dddddd;
-  font-size: 13px;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
diff --git a/ui/legacy/css/src/scss/components/list-view.scss b/ui/legacy/css/src/scss/components/list-view.scss
deleted file mode 100644
index 17d506b..0000000
--- a/ui/legacy/css/src/scss/components/list-view.scss
+++ /dev/null
@@ -1,94 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-//TODO refactoring for all "list-view" files
-.ui-dialog .list-view {
-  height: 515px !important;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.ui-dialog .list-view .toolbar {
-  top: 50px;
-  width: 100%;
-}
-
-div.panel.ui-dialog div.list-view div.fixed-header {
-  z-index: $z-index-standard;
-  top: 55px;
-  left: 35px;
-  width: 759px;
-  height: 49px;
-  margin: 0;
-  background-color: #ffffff;
-}
-
-.ui-dialog .list-view table {
-  top: 9px !important;
-}
-
-.ui-dialog.panel div.list-view div.data-table table {
-  width: 778px;
-  margin-top: 39px;
-}
-
-.ui-dialog.panel div.list-view div.data-table table tbody tr.multi-edit-selected {
-  background: #c3e0fc;
-}
-
-/*List-view: subselect dropdown*/
-.list-view .subselect {
-  display: block;
-  float: left;
-  clear: both;
-  width: 173px;
-  margin: 0 0 0 -3px;
-  padding: 0;
-  border: 1px solid #a8a7a7;
-  border-radius: 2px;
-  background: #e8e8e8;
-  /*+border-radius:2px;*/
-  cursor: default;
-  -moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  -khtml-border-radius: 2px;
-}
-
-.list-view .subselect:hover span {
-  color: initial;
-}
-
-.list-view .subselect span {
-  margin: 4px 0 0 12px;
-  cursor: default;
-}
-
-.list-view .subselect span.info {
-  background: none;
-  font-size: 10px;
-  white-space: nowrap;
-}
-
-.list-view .subselect span:hover {
-  color: initial;
-}
-
-.list-view .subselect select {
-  width: 175px;
-  margin: 0 0 0 -11px;
-  font-size: 10px;
-}
diff --git a/ui/legacy/css/src/scss/components/list-view2.scss b/ui/legacy/css/src/scss/components/list-view2.scss
deleted file mode 100644
index 4a426b1..0000000
--- a/ui/legacy/css/src/scss/components/list-view2.scss
+++ /dev/null
@@ -1,172 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-//TODO refactoring for all "list-view" files
-div.panel div.list-view {
-  height: 632px;
-  margin-top: 30px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.detail-view div.list-view {
-  width: 930px;
-  height: 536px !important;
-  margin: 41px auto auto !important;
-  border: 1px solid #dad4d4;
-  background: #f7f7f7;
-}
-
-div.panel div.list-view div.data-table table {
-  width: 955px;
-}
-
-.detail-view div.list-view div.data-table table {
-  width: 903px !important;
-}
-
-.detail-view div.list-view div.data-table table td {
-  border-left: 1px solid #cacaca;
-}
-
-div.panel div.list-view div.fixed-header {
-  display: table;
-  position: absolute;
-  z-index: $z-index-standard;
-  top: 29px;
-  left: 12px;
-  width: 960px;
-  height: 47px;
-  margin: 0;
-  background-color: #f7f7f7;
-}
-
-.detail-view div.list-view div.fixed-header {
-  top: 49px !important;
-  left: 29px !important;
-  width: 903px !important;
-  background: #ffffff;
-}
-
-.detail-view div#details-tab-zones div.fixed-header {
-  left: 25px !important;
-}
-
-.detail-view div.list-view div.fixed-header table {
-  width: 100% !important;
-}
-
-.project-view div.panel div.list-view div.fixed-header {
-  background: #6d747d;
-}
-
-div.panel div.list-view div.fixed-header table {
-  position: relative;
-  /*+placement:shift 0px 18px;*/
-  top: 18px;
-  left: 0;
-  width: 955px;
-  margin: 0;
-  /*+box-shadow:0px 4px 10px #DFE1E3;*/
-  box-shadow: 0 4px 10px #dfe1e3;
-  -moz-box-shadow: 0 4px 10px #dfe1e3;
-  -webkit-box-shadow: 0 4px 10px #dfe1e3;
-  -o-box-shadow: 0 4px 10px #dfe1e3;
-}
-
-.project-view div.panel div.list-view div.fixed-header table {
-  /*+box-shadow:0px 2px 2px #CACDD1;*/
-  box-shadow: 0 2px 2px #cacdd1;
-  -moz-box-shadow: 0 2px 2px #cacdd1;
-  -webkit-box-shadow: 0 2px 2px #cacdd1;
-  -o-box-shadow: 0 2px 2px #cacdd1;
-}
-
-div.list-view td.state {
-  width: 120px;
-  min-width: 120px;
-  max-width: 120px;
-}
-
-div.list-view td.first {
-  cursor: pointer;
-}
-
-div.list-view tr:not(.multi-edit-selected) td.first:hover {
-  color: #3a82cd;
-}
-
-div.list-view td.state span {
-  width: 80px;
-  padding: 1px 0 0 18px;
-  background: url('../images/sprites.png') 1px -526px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-div.list-view td.state.on span {
-  background-image: url('../images/sprites.png');
-  background-repeat: no-repeat;
-  background-position: 1px -460px;
-  color: #008000;
-}
-
-div.list-view td.state.off span {
-  background-image: url('../images/sprites.png');
-  background-repeat: no-repeat;
-  background-position: 1px -492px;
-  color: #b90606;
-}
-
-div.list-view td.state.warning span {
-  background-image: url('../images/sprites.png');
-  background-repeat: no-repeat;
-  background-position: 1px -558px;
-  color: #b90606;
-}
-
-div.list-view td.state.transition span {
-  background-image: url('../images/sprites.png');
-  background-repeat: no-repeat;
-  background-position: 1px -432px;
-  color: #b90606;
-}
-
-div.list-view td.state.suitable span {
-  height: 18px;
-  background: url('../images/icons.png') no-repeat scroll 1px -224px;
-  color: #008000;
-}
-
-div.list-view td.state.suitable-storage-migration-required span {
-  width: 200px;
-}
-
-div.list-view td.state.notsuitable span {
-  width: 100px;
-  height: 19px;
-  background: url('../images/icons.png') no-repeat scroll 1px -190px;
-  color: #b90606;
-}
-
-div.list-view td.state.notsuitable-storage-migration-required span {
-  width: 220px !important;
-}
diff --git a/ui/legacy/css/src/scss/components/loading-overlay.scss b/ui/legacy/css/src/scss/components/loading-overlay.scss
deleted file mode 100644
index 22909e3..0000000
--- a/ui/legacy/css/src/scss/components/loading-overlay.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.loading-overlay {
-  opacity: 0.7;
-  position: absolute;
-  z-index: $z-index-loading-overlay;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  /*+opacity:70%;*/
-  background: #f2f2f2 url('../images/ajax-loader.gif') no-repeat center;
-  filter: alpha(opacity=70);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
-  -moz-opacity: 0.7;
-}
-
-.loading-overlay span {
-  display: block;
-  margin: 155px 0 0 5px;
-  color: #4b4b4b;
-  text-align: center;
-}
-
-.detail-view .ui-tabs-panel .loading-overlay {
-  background-position: 50% 250px;
-}
diff --git a/ui/legacy/css/src/scss/components/login.scss b/ui/legacy/css/src/scss/components/login.scss
deleted file mode 100644
index f6f3a24..0000000
--- a/ui/legacy/css/src/scss/components/login.scss
+++ /dev/null
@@ -1,171 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-body.login {
-  background: url('../images/overlay-pattern.png') repeat center, #106ca9 url('../images/bg-login.jpg') no-repeat center;
-  background-size: auto, cover;
-  overflow: hidden;
-}
-
-.login {
-  display: block;
-  position: relative;
-  top: 80px;
-  /*+placement:shift 0 80px;*/
-  left: 0;
-  width: 100%;
-  height: 350px;
-  background: #053663;
-}
-
-.login .select-language {
-  float: left;
-  margin-top: 10px;
-}
-
-.login .select-language select {
-  width: 260px;
-  margin-top: 20px;
-  border: 1px solid #808080;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px 1px #838383;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:inset 0px 1px 1px #838383;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px 1px #838383;
-  -webkit-box-shadow: inset 0 1px 1px #838383;
-  -o-box-shadow: inset 0 1px 1px #838383;
-}
-
-.login .fields {
-  float: left;
-  width: 409px;
-  margin: 72px 0 0 88px;
-}
-
-.login .fields .field {
-  position: relative;
-}
-
-.login .fields .field label {
-  position: absolute;
-  margin-top: 14px;
-  /*+placement:displace 9px 14px;*/
-  margin-left: 9px;
-  font-size: 12px;
-  color: #4e4f53;
-}
-
-.login .fields .field label.error {
-  float: right;
-  top: 0;
-  left: 264px;
-  color: #ff0000;
-}
-
-.login .fields input {
-  width: 248px;
-  height: 20px;
-  margin: 5px 0 0;
-  padding: 5px;
-  border: 0;
-  border-radius: 3px;
-  box-shadow: inset 0 1px 1px #4e4e4e;
-  /*+border-radius:3px;*/
-  background: #ececec;
-  font-size: 13px;
-  text-indent: 1px;
-  -moz-border-radius: 3px;
-  /*+box-shadow:inset 0px 1px 1px #4E4E4E;*/
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: inset 0 1px 1px #4e4e4e;
-  -webkit-box-shadow: inset 0 1px 1px #4e4e4e;
-  -o-box-shadow: inset 0 1px 1px #4e4e4e;
-}
-
-.login .fields input.error {
-  border-color: #ff8080;
-  background: #ffeaea;
-}
-
-.login .fields input[type='submit'] {
-  display: block;
-  float: left;
-  width: 69px;
-  height: 25px;
-  margin: 7px 120px 0 -1px;
-  border: 0;
-  background: transparent url('../images/sprites.png') -563px -747px;
-  font-weight: bold;
-  color: #ffffff;
-  text-align: center;
-  text-indent: -1px;
-  text-shadow: 0 1px 2px #000000;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.login .fields input[type='samlsubmit'] {
-  display: block;
-  width: 60px;
-  height: 15px;
-  border: 0;
-  background: transparent url('../images/sprites.png') -563px -747px;
-  font-size: 10px;
-  font-weight: bold;
-  color: #ffffff;
-  text-align: center;
-  text-indent: -1px;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-shadow: 0 1px 2px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.login .fields input[type='submit']:hover {
-  background-position: -563px -772px;
-}
-
-.login .logo {
-  float: left;
-  width: 290px;
-  height: 40px;
-  margin: 72px 0 0 209px;
-  background: url('../images/logo-login.png') no-repeat 0 0;
-}
-
-.login.nologo .logo {
-  background-image: url('../images/logo-login-oss.png');
-}
-
-.login form {
-  display: block;
-  width: 1000px;
-  height: 100%;
-  margin: auto;
-  background: #053663;
-}
diff --git a/ui/legacy/css/src/scss/components/migrate-vm.scss b/ui/legacy/css/src/scss/components/migrate-vm.scss
deleted file mode 100644
index 00740f7..0000000
--- a/ui/legacy/css/src/scss/components/migrate-vm.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.migrate-vm-available-host-list div.text-search {
-  right: 30px;
-}
-
-.migrate-vm-available-host-list div.ui-widget-content {
-  display: block !important;
-}
-
-.multi-edit-add-list .ui-button.migrateok,
-.multi-edit-add-list .ui-button.migratecancel {
-  top: -5px !important;
-}
diff --git a/ui/legacy/css/src/scss/components/multi-edit.scss b/ui/legacy/css/src/scss/components/multi-edit.scss
deleted file mode 100644
index ca86971..0000000
--- a/ui/legacy/css/src/scss/components/multi-edit.scss
+++ /dev/null
@@ -1,579 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBalancer div.multi-edit form table.multi-edit thead tr th,
-div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBalancer div.multi-edit form table.multi-edit tbody tr td {
-  min-width: 100px;
-}
-
-.multi-edit {
-  overflow: auto;
-}
-
-.multi-edit > form {
-  position: relative;
-  clear: both;
-}
-
-.multi-edit table.multi-edit {
-  border-top: 0;
-}
-
-.multi-edit table th {
-  min-width: 88px;
-  white-space: nowrap;
-  text-align: center;
-  text-indent: 0;
-}
-
-.detail-group .multi-edit table td {
-  border-left: 1px solid #cdcccc;
-}
-
-.detail-view .multi-edit input {
-  width: 70%;
-}
-
-.detail-view .multi-edit select {
-  width: 93%;
-  min-width: 80px;
-  font-size: 10px;
-}
-
-.multi-edit input {
-  width: 85%;
-}
-
-.multi-edit .range {
-  position: relative;
-}
-
-.multi-edit .range .range-item {
-  float: left;
-}
-
-.multi-edit .range input {
-  position: relative;
-  width: 35px;
-  margin-right: 2px;
-}
-
-.multi-edit .range label {
-  display: block;
-  position: relative;
-  /*+placement:shift 3px 2px;*/
-  clear: both;
-  top: 2px;
-  left: 3px;
-}
-
-.multi-edit label.error {
-  float: left;
-  margin: 3px 0 0;
-  font-size: 10px;
-}
-
-.multi-edit .data-table td span {
-  float: left;
-}
-
-.multi-edit .data-table td.add-vm {
-  cursor: pointer;
-}
-
-.multi-edit th.add-rule,
-.multi-edit td.add-rule {
-  border-right: 1px solid #cdcccc;
-}
-
-.multi-edit .data-table td.add-vm:hover {
-  color: #5faaf7;
-}
-
-.multi-edit .data-table .fixed-header {
-  display: none;
-}
-
-.multi-edit .button.add-vm {
-  position: relative;
-  top: 0;
-  left: 4px;
-  width: 74px;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  padding: 6px 0 4px;
-  border: 1px solid #858585;
-  border-top: 0;
-  border-radius: 5px;
-  /*+box-shadow:0px 1px 1px #FFFFFF;*/
-  border-radius: 5px 5px 5px 5px;
-  box-shadow: 0 1px 1px #ffffff;
-  background: url('../images/bg-gradients.png') repeat-x 0 -220px;
-  font-size: 10px;
-  font-weight: bold;
-  color: #ffffff;
-  /*+border-radius:5px;*/
-  text-align: center;
-  text-indent: 0;
-  text-shadow: 0 1px 1px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-box-shadow: 0 1px 1px #ffffff;
-  -webkit-box-shadow: 0 1px 1px #ffffff;
-  -o-box-shadow: 0 1px 1px #ffffff;
-  /*+placement:shift 4px 0px;*/
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-edit .button.add-vm:hover {
-  box-shadow: inset 0 1px 1px #000000;
-  /*+box-shadow:inset 0px 1px 1px #000000;*/
-  background-position: 0 -241px;
-  -moz-box-shadow: inset 0 1px 1px #000000;
-  -webkit-box-shadow: inset 0 1px 1px #000000;
-  -o-box-shadow: inset 0 1px 1px #000000;
-}
-
-.multi-edit .button.custom-action {
-  border: 1px solid #b7b7b7;
-  background: url('../images/bg-gradients.png') 0 -271px;
-  font-size: 10px;
-  color: #485867;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.multi-edit td.disabled .button.add-vm.custom-action {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  cursor: not-allowed;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-edit .button.custom-action:hover {
-  background: #808080 url('../images/bg-gradients.png');
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.ui-dialog.multi-edit-add-list {
-  width: initial !important;
-}
-
-.ui-dialog.multi-edit-add-list .ui-dialog-buttonpane {
-  display: block;
-}
-
-.ui-dialog.multi-edit-add-list .ui-dialog-buttonpane .ui-dialog-buttonset {
-  width: initial;
-  padding-right: 15px;
-}
-
-.ui-dialog.multi-edit-add-list .ui-dialog-buttonpane .ui-dialog-buttonset button {
-  top: 0;
-  left: 0;
-}
-
-.multi-edit-add-list .ui-button.ok,
-.multi-edit-add-list .ui-button.cancel {
-  position: relative;
-  /*+placement:shift 506px -18px;*/
-  float: right;
-  top: -18px;
-  left: 506px;
-}
-
-.multi-edit-add-list .ui-button.cancel {
-  /*+placement:shift 492px -18px;*/
-  position: relative;
-  left: 492px;
-  border: 0;
-  background: transparent;
-  font-weight: bold;
-  color: #808b95;
-}
-
-.multi-edit-add-list div.form-container {
-  width: auto !important;
-  height: auto;
-  text-align: center;
-}
-
-.multi-edit-add-list div.form-container div.name label {
-  display: inline;
-}
-
-.multi-edit .data .data-body {
-  margin: auto auto auto 11px;
-  overflow: hidden;
-}
-
-.panel.always-maximized .multi-edit .data .data-body {
-  width: 96%;
-  margin: 0 0 0 12px;
-}
-
-.multi-edit .data .data-body .data-item {
-  position: relative;
-  margin-bottom: 14px;
-  border: 1px solid #cdcccc;
-}
-
-.multi-edit .data .data-body .data-item .loading-overlay {
-  background-position: 50% 50%;
-}
-
-.multi-edit .data .data-body .data-item.loading {
-  height: 28px;
-  border: 1px solid #dddddd;
-  background: #ffffff url('../images/ajax-loader.gif') no-repeat center;
-}
-
-.multi-edit .data .data-body .data-item.loading .label {
-  margin: 12px 0 0;
-  font-size: 12px;
-  color: #808080;
-  text-align: center;
-  text-indent: 19%;
-}
-
-.multi-edit .data .data-body .data-item table {
-  width: 100%;
-  margin: 0;
-  border: 0;
-  background: #f0f1f2;
-  overflow: hidden;
-}
-
-.multi-edit .data .data-body .data-item tr {
-  border: 0;
-  background: #efefef;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td {
-  height: 15px;
-  border-right: 1px solid #cfc9c9;
-  border-left: 0;
-  background: #f0f1f2;
-  overflow: auto;
-}
-
-.multi-edit .data .data-body .data-item > table tbody tr td span {
-  display: block;
-  float: left;
-  max-width: 90%;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.name {
-  padding-top: 9px;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.name span {
-  width: 53px;
-  font-weight: bold;
-  color: #4c5d78;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing table tbody tr td.name span {
-  font-weight: normal;
-  color: #4c5d78;
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing table tbody tr td.name span:hover {
-  color: #0000ff;
-}
-
-div#details-tab-aclRules table.multi-edit tr th.number,
-div#details-tab-aclRules div.data-item table tr td.number {
-  width: 45px !important;
-  min-width: 45px !important;
-  max-width: 45px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.action,
-div#details-tab-aclRules div.multi-edit table tr td.action {
-  width: 40px !important;
-  min-width: 40px !important;
-  max-width: 40px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.protocol,
-div#details-tab-aclRules div.multi-edit table tr td.protocol {
-  width: 50px !important;
-  min-width: 50px !important;
-  max-width: 50px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.protocolnumber,
-div#details-tab-aclRules div.multi-edit table tr td.protocolnumber {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.traffictype,
-div#details-tab-aclRules div.multi-edit table tr td.traffictype {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.reason,
-div#details-tab-aclRules div.multi-edit table tr td.reason {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.icmptype,
-div#details-tab-aclRules div.multi-edit table tr td.icmptype,
-div#details-tab-aclRules div.multi-edit table tr th.icmpcode,
-div#details-tab-aclRules div.multi-edit table tr td.icmpcode {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules div.multi-edit table tr th.startport,
-div#details-tab-aclRules div.multi-edit table tr td.startport,
-div#details-tab-aclRules div.multi-edit table tr th.endport,
-div#details-tab-aclRules div.multi-edit table tr td.endport {
-  width: 60px !important;
-  min-width: 60px !important;
-  max-width: 60px !important;
-}
-
-div#details-tab-aclRules td.cidrlist span {
-  width: 100%;
-  text-align: center;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.multi-actions .action {
-  float: left;
-  width: 28px;
-  height: 21px;
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item table tbody tr td.multi-actions .action span.icon {
-  float: left;
-  width: 28px;
-  height: 21px;
-  background-image: url('../images/sprites.png');
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item tr td .expand {
-  display: block;
-  float: left;
-  width: 14px;
-  height: 15px;
-  margin: -3px 0 0 11px;
-  border: 1px solid #d0d0d0;
-  /*+border-radius:9px;*/
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  background: #ffffff url('../images/sprites.png') -541px -499px;
-  cursor: pointer;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.multi-edit .data .data-body .data-item tr td.add-vm,
-.multi-edit tr th.add-vm {
-  cursor: pointer;
-}
-
-.multi-edit .data .data-body .data-item tr td .custom-action {
-  margin: -2px 0 0 0;
-}
-
-.multi-edit .data .data-body .data-item tr td.add-vm:hover {
-  font-weight: bold;
-  color: #0060ff;
-}
-
-.multi-edit .data .data-body .data-item tr td.add-vm p {
-  margin-top: 3px;
-  margin-bottom: 6px;
-  padding-left: 9px;
-  text-indent: 0;
-}
-
-.multi-edit .data .data-body .data-item tr td.multi-actions .icon {
-  /*+placement:shift -3px -2px;*/
-  position: relative;
-  top: -2px;
-  left: -3px;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing {
-  width: 99.8%;
-  max-height: 161px;
-  border: 1px solid #cfc9c9;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing tr {
-  width: 100%;
-  margin: 0;
-  padding: 0;
-  border: 0;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing tr td {
-  margin: 0;
-  border: 0;
-  background: #dde0e2;
-  text-indent: 37px;
-}
-
-.multi-edit .data .data-body .data-item .expandable-listing tr.odd td {
-  background: #f2f0f0;
-}
-
-.ui-tabs-panel .add-by {
-  width: 94%;
-  margin: 13px 0 0 14px;
-  font-size: 12px;
-  color: #536474;
-}
-
-.ui-tabs-panel .add-by .selection {
-  width: 236px;
-  margin: 8px 0 0;
-}
-
-.ui-tabs-panel .add-by .selection input {
-  margin: 0 6px 0 0;
-}
-
-.ui-tabs-panel .add-by .selection label {
-  margin: 0 22px 0 0;
-}
-
-/** Fix long table overflow*/
-.detail-view .multi-edit {
-  width: 100%;
-}
-
-.detail-view .multi-edit table {
-  width: 97%;
-  max-width: inherit;
-}
-
-.detail-view .multi-edit table tr th,
-.detail-view .multi-edit table tr td {
-  width: 84px !important;
-  min-width: 84px !important;
-  max-width: 84px !important;
-  font-size: 10px;
-}
-
-/* special case for 'Source CIDR' column - make it wide enough to fit a CIDR without ellipsizing*/
-.detail-view .multi-edit table tr th.cidrlist,
-.detail-view .multi-edit table tr td.cidrlist {
-  min-width: 118px !important;
-  max-width: 118px !important;
-  padding: 0 0 0 0;
-}
-
-.detail-view .multi-edit td.cidrlist input {
-  width: 85%;
-}
-
-
-/** Header fields*/
-.multi-edit .header-fields {
-  position: relative;
-  /*+placement:shift 14px 11px;*/
-  position: relative;
-  top: 11px;
-  left: 14px;
-}
-
-.multi-edit .header-fields .form-container {
-  width: 96%;
-  height: 32px;
-  border: 1px solid #d4cfcf;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: #e4e4e4;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-edit .header-fields .form-item {
-  float: left;
-  margin-right: 0;
-  margin-bottom: 32px;
-  padding: 4px 15px 3px 9px;
-}
-
-.multi-edit .header-fields .form-item input,
-.multi-edit .header-fields .form-item select {
-  margin-top: 4px;
-}
-
-.multi-edit .header-fields .form-item .name,
-.multi-edit .header-fields .form-item .value {
-  float: left;
-}
-
-.multi-edit .header-fields .form-item .name {
-  padding: 5px;
-  font-size: 14px;
-  color: #55687a;
-}
-
-/*Sortable*/
-.multi-edit table tbody tr td.reorder,
-.multi-edit table thead tr th.reorder {
-  width: 16px !important;
-  min-width: 16px !important;
-  max-width: 16px !important;
-}
-
-/*Security Rules*/
-.security-rules .multi-edit input {
-  width: 69px;
-  margin: 0 0 0 9px;
-}
-
-.security-rules .multi-edit .range input {
-  width: 44px;
-  margin: 0;
-}
diff --git a/ui/legacy/css/src/scss/components/multi-wizzard.scss b/ui/legacy/css/src/scss/components/multi-wizzard.scss
deleted file mode 100644
index 7c4908a..0000000
--- a/ui/legacy/css/src/scss/components/multi-wizzard.scss
+++ /dev/null
@@ -1,2357 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.multi-wizard {
-  display: inline-block;
-  width: 500px;
-  height: 550px;
-}
-
-/*** Progress bar*/
-.multi-wizard .progress {
-  font-size: 11px;
-  color: #ffffff;
-}
-
-.multi-wizard .progress ul {
-  float: left;
-  clear: both;
-  height: 40px;
-}
-
-/*[clearfix]*/
-.multi-wizard .progress ul li {
-  display: flex;
-  position: relative;
-  float: left;
-  align-items: center;
-  width: 128px;
-  height: 40px;
-  justify-content: center;
-}
-
-.multi-wizard.instance-wizard .progress ul li {
-  width: 102px;
-  margin-left: 8px;
-}
-
-.multi-wizard .progress ul li.active {
-  border-radius: 5px;
-  background: url('../images/bg-gradients.png') 0 -221px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-wizard .progress ul li span {
-  position: relative;
-  width: 62px;
-  color: #000000;
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard .progress ul li span.arrow {
-  display: none;
-  position: absolute;
-  /*+placement:displace 74px -3px;*/
-  z-index: $z-index-toolbox-info;
-  width: 17px;
-  height: 15px;
-  margin-top: -3px;
-  margin-left: 74px;
-  background: url('../images/icons.png') no-repeat 0 -422px;
-}
-
-.multi-wizard.instance-wizard .progress ul li span.arrow {
-  left: 19px;
-}
-
-.multi-wizard .progress ul li.active span.arrow {
-  background-position: -1px -396px;
-}
-
-.multi-wizard .progress ul li span.number {
-  width: auto;
-  background: transparent;
-  font-size: 27px;
-  font-weight: bold;
-  color: #bbbbbb;
-}
-
-.multi-wizard .progress ul li.active span {
-  /*+text-shadow:0px -1px 1px #004AFF;*/
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #004aff;
-  -moz-text-shadow: 0 -1px 1px #004aff;
-  -webkit-text-shadow: 0 -1px 1px #004aff;
-  -o-text-shadow: 0 -1px 1px #004aff;
-}
-
-/*** Content*/
-.multi-wizard .main-desc {
-  position: relative;
-  top: 25px;
-  left: 3px;
-  /*+placement:shift 3px 25px;*/
-  width: 437px;
-  font-size: 11px;
-  line-height: 17px;
-  text-align: left;
-}
-
-.multi-wizard .review .main-desc,
-.multi-wizard .select-template .main-desc {
-  left: 0;
-  margin-left: 10px;
-}
-
-.multi-wizard .content {
-  display: inline-block;
-  float: left;
-  width: 440px;
-  min-height: 366px;
-  margin: 24px 0 0;
-  /*+border-radius:4px;*/
-  padding-bottom: 8px;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .select-security-group .content {
-  height: 366px;
-}
-
-.multi-wizard .content .section {
-  width: 416px;
-  margin: 16px auto auto;
-  border: 1px solid #e0dfdf;
-  background: #e9e9e9;
-  font-size: 12px;
-  color: #505a62;
-  text-align: left;
-  overflow: hidden;
-}
-
-.multi-wizard.instance-wizard .service-offering .content {
-  width: 463px;
-  max-height: 365px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.multi-wizard .content .section .select-area {
-  width: 334px;
-  height: 45px;
-  margin: 9px auto auto;
-  background: #d6d6d6;
-}
-
-.multi-wizard .content .section .select-area .desc {
-  float: right;
-  width: 155px;
-  padding: 9px 0 0;
-  font-size: 12px;
-  color: #989898;
-  text-align: left;
-}
-
-.multi-wizard .content .section .select-area input {
-  float: left;
-  margin: 0;
-  padding: 9px;
-}
-
-.multi-wizard .content .section .select-area select {
-  float: left;
-  width: 158px;
-  /*+border-radius:4px;*/
-  margin: 11px 0 0 14px;
-  padding: 0;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .content .section .select-area input[type='radio'],
-.multi-wizard.instance-wizard .content .section.select-template input[type='radio'] {
-  margin: 14px 16px 0;
-}
-
-.multi-wizard .content .section .select-area label {
-  float: left;
-  margin: 12px 12px 12px 2px;
-  font-size: 18px;
-  color: #62798e;
-  /*+text-shadow:0px 2px 2px #EFEFEF;*/
-  text-align: left;
-  text-shadow: 0 2px 2px #efefef;
-  -moz-text-shadow: 0 2px 2px #efefef;
-  -webkit-text-shadow: 0 2px 2px #efefef;
-  -o-text-shadow: 0 2px 2px #efefef;
-}
-
-.multi-wizard .content .section .select-area label.error {
-  margin: 2px 0 0 14px;
-  font-size: 10px;
-  color: #ff0000;
-}
-
-.multi-wizard .content .section p {
-  padding: 0 0 0 40px;
-  font-size: 11px;
-  color: #808080;
-  text-align: left;
-}
-
-.multi-wizard .content .section h3 {
-  margin: 0;
-  padding: 14px 14px 3px 39px;
-  font-weight: bold;
-  color: #62798e;
-  /*+text-shadow:0px 1px 1px #EFEFEF;*/
-  text-align: left;
-  text-shadow: 0 1px 1px #efefef;
-  -moz-text-shadow: 0 1px 1px #efefef;
-  -webkit-text-shadow: 0 1px 1px #efefef;
-  -o-text-shadow: 0 1px 1px #efefef;
-}
-
-.multi-wizard .content .section.select-zone {
-  height: 117px;
-}
-
-.multi-wizard .content .section.select-template {
-  height: 206px;
-}
-
-.multi-wizard .content.tab-view {
-  margin: 31px 0 0;
-  padding: 0 8px;
-  background: transparent;
-}
-
-.multi-wizard .content.tab-view div.ui-tabs-panel {
-  clear: both;
-  width: 98%;
-  height: 72% !important;
-  height: 591px;
-  border: 1px solid #e2dddd;
-  border-radius: 0 3px 10px 10px;
-  background: #ffffff;
-  /*+border-radius:0 3px 10px 10px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 0 3px 10px 10px;
-  -webkit-border-radius: 0 3px 10px 10px;
-  -khtml-border-radius: 0 3px 10px 10px;
-}
-
-.multi-wizard .content.tab-view div.ui-tabs-panel.ui-tabs-hide {
-  display: none;
-}
-
-.multi-wizard.instance-wizard .select-iso .content .select .hypervisor {
-  display: block;
-  position: relative;
-  float: left;
-  clear: both;
-  /*+placement:shift 0px -6px;*/
-  top: -6px;
-  left: 0;
-  margin: 12px 0 0 58px;
-}
-
-.multi-wizard.instance-wizard .select-iso .content .select .hypervisor select {
-  width: 160px;
-}
-
-.multi-wizard.instance-wizard .select-iso .content .select .hypervisor label {
-  position: relative;
-  top: 0;
-  left: 0;
-  margin-right: 9px;
-  /*+placement:shift;*/
-  margin-left: 2px;
-  font-size: 11px;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-iso .wizard-step-conditional.select-iso .content .select.selected {
-  height: 90px;
-}
-
-/*** UI widgets*/
-.multi-wizard .ui-tabs ul.ui-tabs-nav {
-  display: block;
-  display: inline-block;
-  position: relative;
-  z-index: $z-index-install-wizard2;
-  top: 5px;
-  /*+placement:shift -6px 5px;*/
-  left: -6px;
-  height: 41px;
-  margin-top: 7px;
-  border: 0;
-  background: transparent;
-  overflow: hidden;
-}
-
-.multi-wizard .select-iso .ui-tabs ul {
-  float: left;
-  top: 1px;
-  left: 0;
-}
-
-.multi-wizard .ui-tabs li.ui-state-active {
-  background: #ffffff;
-}
-
-.multi-wizard .ui-tabs li.ui-state-default a {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.multi-wizard .ui-slider {
-  float: left;
-  width: 136px;
-  margin: 8px -2px 3px;
-  padding: 0;
-  background: url('../images/bg-gradients.png') 0 -307px !important;
-}
-
-.multi-wizard.instance-wizard .ui-slider {
-  margin: 8px 0 0 2px;
-  padding: 7px 0 0 8px;
-}
-
-.multi-wizard .ui-slider .ui-slider-handle {
-  display: block;
-  position: relative;
-  top: -0.5rem;
-  width: 18px;
-  height: 18px;
-  margin-left: -0.9rem;
-  border: 0;
-  outline: none;
-  background: url('../images/buttons.png') -622px -274px;
-}
-
-/*** Select container*/
-.multi-wizard .select-container {
-  height: 352px;
-  margin: 10px 10px 0;
-  border: 1px solid #d9dfe1;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .select-container p {
-  padding: 11px;
-  background: #dfdfdf;
-  color: #424242;
-}
-
-.multi-wizard .select-container .select {
-  display: inline-block;
-  float: left;
-  width: 100%;
-  min-height: 35px;
-  margin: -1px 0 0;
-  padding: 0 0 14px;
-  border: 0;
-  background: #ffffff;
-  font-size: 13px;
-  text-align: left;
-}
-
-.multi-wizard .select-container .select.odd {
-  background: #ebeff4;
-}
-
-.multi-wizard .select-container .select input {
-  float: left;
-  margin: 21px 24px 0;
-}
-
-.multi-wizard .select-container .select .select-desc {
-  display: inline-block;
-  float: left;
-  clear: none;
-  max-width: 335px;
-  min-height: 28px;
-  margin: 21px 0 0;
-  overflow: hidden;
-}
-
-.multi-wizard .select-container .select .select-desc .name {
-  margin: 0 0 5px;
-  font-weight: bold;
-}
-
-.multi-wizard .select-container .select .select-desc .desc {
-  display: inline-block;
-  font-size: 11px;
-  color: #808080;
-  /*[empty]height:;*/
-}
-
-/*** Buttons*/
-.multi-wizard .buttons {
-  position: absolute;
-  bottom: 10px;
-  left: 0;
-  width: 100%;
-}
-
-.multi-wizard .buttons .button {
-  width: 88px;
-  height: 16px;
-  padding: 11px 0 8px;
-  /*+box-shadow:0px 1px 1px #FFFFFF;*/
-  border: 1px solid #78818f;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: 0 1px 1px #ffffff;
-  font-size: 12px;
-  font-weight: bold;
-  cursor: pointer;
-  -moz-box-shadow: 0 1px 1px #ffffff;
-  /*+border-radius:4px;*/
-  -webkit-box-shadow: 0 1px 1px #ffffff;
-  -o-box-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard .buttons .button.next {
-  /*+placement:float-right 77px 0px;*/
-  position: relative;
-  float: right;
-  top: 0;
-  left: 77px;
-  border: 1px solid #0069cf;
-  /*+text-shadow:0px -1px 1px #465259;*/
-  border-top: 1px solid #0070fc;
-  background: #0049ff url('../images/gradients.png') 0 -317px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #465259;
-  -moz-text-shadow: 0 -1px 1px #465259;
-  -webkit-text-shadow: 0 -1px 1px #465259;
-  -o-text-shadow: 0 -1px 1px #465259;
-}
-
-.multi-wizard .buttons .button.next:hover {
-  border: 1px solid #0035b8;
-  border-bottom: 1px solid #0062fa;
-  background-position: -3px -368px;
-}
-
-.multi-wizard .buttons .button.next.final {
-  width: 115px;
-  margin: 3px 0 0;
-  padding: 4px 0 9px;
-}
-
-.multi-wizard .buttons .button.next.final span {
-  position: relative;
-  /*+placement:shift 0px 5px;*/
-  top: 5px;
-  left: 0;
-  padding: 5px 0 5px 30px;
-  background: url('../images/icons.png') 0 -349px;
-}
-
-.multi-wizard .buttons .button.cancel {
-  position: relative;
-  /*+placement:float-right -127px 0px;*/
-  float: right;
-  top: 0;
-  left: -127px;
-  padding: 14px 0 0 0;
-  border: 0;
-  /*+border-radius:0;*/
-  border-radius: 0;
-  border-radius: 0 0 0 0;
-  box-shadow: 0 0;
-  background: transparent;
-  color: #808080;
-  text-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:0px 0px;*/
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-  -khtml-border-radius: 0;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 inherit;
-  -webkit-box-shadow: 0 0 inherit;
-  -o-box-shadow: 0 0 inherit;
-  -moz-box-shadow: inherit;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -webkit-box-shadow: inherit;
-  -o-box-shadow: inherit;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard .buttons .button.cancel:hover {
-  color: #5e5e5e;
-}
-
-.multi-wizard .buttons .button.previous {
-  margin-left: 27px;
-  background: #d6d6d6;
-  color: #62798e;
-}
-
-.multi-wizard .buttons .button.previous:hover {
-  background: #c6c6c6;
-}
-
-/** Instance wizard
-** Select ISO*/
-.multi-wizard.instance-wizard .select-iso .select-container {
-  height: 260px;
-  margin: 0;
-  /*+border-radius:0 0 5px 5px;*/
-  border-radius: 0 0 5px 5px;
-  -moz-border-radius: 0 0 5px 5px;
-  -webkit-border-radius: 0 0 5px 5px;
-  -khtml-border-radius: 0 0 5px 5px;
-}
-
-/*** Data disk offering*/
-.multi-wizard.instance-wizard .content .section {
-  margin: 12px 0 15px 8px;
-  padding: 9px 0 16px;
-}
-
-.multi-wizard.instance-wizard .content .section.no-thanks {
-  box-sizing: border-box;
-  width: 426px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .select-container,
-.multi-wizard.instance-wizard .sshkeyPairs .select-container {
-  height: 300px;
-  margin: -7px 6px 0 8px;
-  /*+border-radius:6px;*/
-  border-radius: 6px;
-  border-radius: 6px 6px 6px 6px;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group {
-  float: left;
-  width: 100%;
-  margin-top: 12px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-header {
-  height: 17px;
-  /*+border-radius:4px;*/
-  padding: 6px;
-  border-bottom: 1px solid #d4d4d4;
-  border-radius: 4px;
-  background: #c2c2c2 0 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.instance-wizard .disk-select-group.selected .disk-select-header {
-  border-radius: 4px 4px 0 0;
-  /*+border-radius:4px 4px 0 0;*/
-  background: #505050;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-header input {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-header .title {
-  float: left;
-  padding: 2px;
-  font-size: 14px;
-}
-
-.multi-wizard.instance-wizard .disk-select-group.selected .disk-select-header .title {
-  color: #ffffff;
-  /*+text-shadow:0px -1px #000000;*/
-  text-shadow: 0 -1px #000000;
-  -moz-text-shadow: 0 -1px #000000;
-  -webkit-text-shadow: 0 -1px #000000;
-  -o-text-shadow: 0 -1px #000000;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .multi-disk-select-container {
-  max-height: 257px;
-  padding: 13px;
-  border: 1px solid #dddbdb;
-  background: #e4e4e4;
-  overflow: auto;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select-container {
-  display: none;
-  float: left;
-  max-height: 114px;
-  margin: 0;
-  /*+border-radius:0;*/
-  border: 0;
-  border-radius: 0;
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-  -khtml-border-radius: 0;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group.selected .select-container {
-  display: block;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select {
-  height: 0;
-  padding: 0 0 17px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group.custom-size .section.custom-size {
-  display: block !important;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select input {
-  margin: 13px 12px 12px;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering .disk-select-group .select-desc {
-  margin: 13px 0 0;
-}
-
-.multi-wizard.instance-wizard .data-disk-offering.required .select-container {
-  position: relative;
-  height: 344px;
-  margin-top: 9px !important;
-}
-
-.multi-wizard.instance-wizard .custom-slider-container .select-container {
-  height: 279px;
-}
-
-.multi-wizard.instance-wizard .custom-slider-container .select-container {
-  height: 213px;
-  margin: -7px 6px 0 8px;
-  /*+border-radius:6px;*/
-  border-radius: 6px;
-  border-radius: 6px 6px 6px 6px;
-  -moz-border-radius: 6px;
-  -webkit-border-radius: 6px;
-  -khtml-border-radius: 6px;
-}
-
-.multi-wizard.instance-wizard .content .section input {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .content .section input[type='radio'] {
-  margin: 8px 2px 0 17px;
-}
-
-.multi-wizard.instance-wizard .content .section label {
-  display: block;
-  float: left;
-  margin: 10px 7px 7px;
-}
-
-.multi-wizard.instance-wizard .content .section .select-area label {
-  margin: 12px 0 0;
-}
-
-.multi-wizard.instance-wizard .content .section label.size {
-  font-weight: bold;
-  color: #647a8e;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard.instance-wizard .section.custom-size {
-  position: relative;
-  box-sizing: border-box;
-  width: 100%;
-  margin: 12px 0;
-  padding: 7px;
-  border-radius: 4px;
-  background: #f4f4f4;
-}
-
-.multi-wizard.instance-wizard .section.custom-size.custom-disk-size {
-  width: 426px;
-  margin-left: 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops {
-  position: relative;
-  padding: 7px;
-  border-radius: 4px;
-  background: #f4f4f4;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops-do {
-  position: relative;
-  box-sizing: border-box;
-  width: 426px;
-  padding: 7px;
-  border-radius: 4px;
-  background: #f4f4f4;
-}
-
-.multi-wizard.instance-wizard .section.custom-size input[type='radio'] {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .section.custom-size input[type='text'] {
-  float: left;
-  width: 28px;
-  margin: 6px -1px 0 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops input[type='text'] {
-  float: left;
-  width: 28px;
-  margin: 6px -1px 0 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-iops-do input[type='text'] {
-  float: left;
-  width: 28px;
-  margin: 6px -1px 0 8px;
-}
-
-.multi-wizard.instance-wizard .section.custom-size label.error {
-  position: absolute;
-  top: 29px;
-  left: 242px;
-  font-size: 10px;
-}
-
-.instance-wizard .step.data-disk-offering.custom-slider-container .select-container {
-  height: 272px;
-}
-
-.instance-wizard .step.service-offering.custom-slider-container .select-container {
-  height: 272px;
-}
-
-.instance-wizard .step.data-disk-offering.custom-iops-do .select-container {
-  height: 240px;
-}
-
-.instance-wizard .step.data-disk-offering.custom-slider-container.custom-iops-do .select-container {
-  height: 176px;
-}
-
-.instance-wizard .step.service-offering.required.custom-slider-container .select-container {
-  height: 315px;
-}
-
-.instance-wizard .step.data-disk-offering.required.custom-slider-container .select-container {
-  height: 315px;
-}
-
-.instance-wizard .step.data-disk-offering.required.custom-iops-do .select-container {
-  height: 295px;
-}
-
-.instance-wizard .step.data-disk-offering.required.custom-slider-container.custom-iops-do .select-container {
-  height: 223px;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do {
-  display: none;
-}
-
-.instance-wizard .step.data-disk-offering.custom-iops-do .custom-iops-do {
-  display: block;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do .field {
-  float: left;
-  width: 30%;
-  margin-bottom: 5px;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do .field label {
-  text-indent: 20px;
-}
-
-.instance-wizard .step.data-disk-offering .custom-iops-do .field input {
-  width: 88%;
-  margin-left: 26px;
-}
-
-/*** Compute offering*/
-.instance-wizard .step.service-offering.custom-size .select-container {
-  height: 235px;
-}
-
-.instance-wizard .step.service-offering.custom-iops .select-container {
-  height: 235px;
-}
-
-.instance-wizard .step.service-offering .custom-size {
-  display: none;
-}
-
-.instance-wizard .step.service-offering .custom-iops {
-  display: none;
-}
-
-.instance-wizard .step.service-offering.custom-size .custom-size {
-  display: block;
-}
-
-.instance-wizard .step.service-offering.custom-iops .custom-iops {
-  display: block;
-}
-
-.instance-wizard .step.service-offering .custom-size .field {
-  float: left;
-  width: 30%;
-  margin-bottom: 13px;
-}
-
-.instance-wizard .step.service-offering .custom-iops .field {
-  float: left;
-  width: 30%;
-  margin-bottom: 13px;
-}
-
-.instance-wizard .step.service-offering .custom-size .field label {
-  text-indent: 20px;
-}
-
-.instance-wizard .step.service-offering .custom-iops .field label {
-  text-indent: 20px;
-}
-
-.instance-wizard .step.service-offering .custom-size .field input {
-  width: 88%;
-  margin-left: 26px;
-}
-
-.instance-wizard .step.service-offering .custom-size .field label.error {
-  position: relative;
-  top: 0;
-  left: 0;
-}
-
-.instance-wizard .step.service-offering .custom-iops .field input {
-  width: 88%;
-  margin-left: 26px;
-}
-
-/*** Network*/
-.multi-wizard.instance-wizard .no-network {
-  position: absolute;
-  z-index: $z-index-standard;
-  top: 98px;
-  left: 11px;
-  width: 773px;
-  height: 52px;
-  /*+border-radius:5px;*/
-  padding: 162px 0 194px;
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  background: #ffffff;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-wizard.instance-wizard .no-network p {
-  font-size: 22px;
-  line-height: 25px;
-}
-
-.multi-wizard.instance-wizard .select-network .select table {
-  float: left;
-  width: 405px;
-  margin: 4px 12px 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select table thead {
-  margin: 0;
-  padding: 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select table td {
-  vertical-align: top;
-  margin: 0;
-  padding: 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select table .select-container {
-  height: 223px;
-  margin: 0;
-  border: 0;
-}
-
-.multi-wizard.instance-wizard .select-network.no-add-network .select table .select-container {
-  height: 282px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network table .select-container {
-  height: 29px;
-  overflow: visible;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network table .select-container .select {
-  position: relative;
-  margin: -12px 0 0;
-  text-align: right;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network table .select-container .select select {
-  position: relative;
-  top: 0;
-  /*+placement:shift;*/
-  left: 0;
-  width: 145px;
-  margin: 4px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network {
-  margin: -17px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network.no-add-network .select.new-network {
-  display: none !important;
-}
-
-.multi-wizard.instance-wizard .select-network .main-desc {
-  float: left;
-  top: 12px;
-  left: 12px;
-  width: 252px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .secondary-input {
-  float: right;
-  width: 80px;
-  height: 48px;
-  border-left: 1px solid #d7d7d7;
-  font-size: 11px;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-network .select.advanced .secondary-input {
-  height: 73px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .secondary-input input {
-  position: relative;
-  top: 21px;
-  /*+placement:shift 9px 21px;*/
-  left: 9px;
-  margin: 0 !important;
-  padding: 0 !important;
-}
-
-.multi-wizard.instance-wizard .select-network .select .secondary-input .name {
-  position: relative;
-  /*+placement:shift -16px 22px;*/
-  float: right;
-  top: 22px;
-  left: -16px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select {
-  position: relative;
-  float: left;
-  width: 100%;
-  padding: 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select.advanced {
-  height: 74px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .advanced-options {
-  float: right;
-  width: 20px;
-  height: 20px;
-  margin-top: 15px;
-  margin-right: 13px;
-  background: url('../images/sprites.png') -7px -795px;
-  cursor: pointer;
-}
-
-.multi-wizard.instance-wizard .select-network .select .advanced-options:hover,
-.multi-wizard.instance-wizard .select-network .select.advanced .advanced-options {
-  background: url('../images/sprites.png') -32px -795px;
-}
-
-.multi-wizard.instance-wizard .select-network .select .specify-ip {
-  display: none;
-  position: absolute;
-  top: 45px;
-  left: 0;
-  width: 100%;
-}
-
-.multi-wizard.instance-wizard .select-network .select.advanced .specify-ip {
-  display: block;
-}
-
-.multi-wizard.instance-wizard .select-network .select.advanced .specify-ip input {
-  width: 138px;
-  margin: 0 0 0 15px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select input {
-  float: left;
-  margin: 21px 15px 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select label {
-  float: left;
-  margin: 4px 0 0 42px;
-  font-size: 11px;
-  color: #4e6b82;
-}
-
-.multi-wizard.instance-wizard .select-network .select-vpc {
-  float: left;
-  margin: 7px 0 7px 7px;
-  padding: 3px;
-}
-
-.multi-wizard.instance-wizard .select-network.no-add-network .select-vpc {
-  visibility: hidden !important;
-}
-
-.multi-wizard.instance-wizard .select-network .select-vpc select {
-  width: 124px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-vpc label {
-  font-size: 10px;
-}
-
-/**** New networ*/
-.multi-wizard.instance-wizard .select-network .select.new-network .advanced-options {
-  /*+placement:shift 379px 15px;*/
-  position: relative;
-  position: absolute;
-  top: 15px;
-  left: 379px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select.advanced {
-  position: relative;
-  height: 106px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .select.advanced {
-  height: auto;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select.advanced .specify-ip {
-  top: 74px;
-  left: 29px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .hide-if-selected {
-  display: none;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .hide-if-unselected {
-  display: none;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .hide-if-selected {
-  display: block;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network input {
-  margin-top: 24px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field {
-  /*+placement:shift 41px 21px;*/
-  position: relative;
-  position: absolute;
-  top: 21px;
-  left: 41px;
-  font-size: 11px;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field .name {
-  float: left;
-  width: 99px;
-  padding: 3px 0 0;
-  /*[empty]display:;*/
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field .value {
-  float: left;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .field .value input {
-  width: 138px;
-  margin: 0 0 0 11px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network label.error {
-  display: none !important;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .secondary-input {
-  width: 97px;
-  padding: 13px 0 17px;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .secondary-input .name {
-  margin: 0 17px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select-desc {
-  width: 255px;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select .select-desc .desc {
-  float: left;
-  max-width: 113px;
-  font-size: 11px;
-  color: #808080;
-}
-
-.multi-wizard.instance-wizard .select-network .select-container .select .select-desc .name {
-  float: left;
-  width: 116px;
-  margin: 0 16px 0 0;
-  font-size: 11px;
-  font-weight: normal;
-  color: #000000;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network .select-desc .name {
-  width: 99px;
-  margin: 4px 0 0;
-}
-
-.multi-wizard.instance-wizard .select-network .select.new-network.unselected .select-desc .name {
-  color: #808080;
-}
-
-/*** Confirmation*/
-.multi-wizard .review .select-container .select {
-  height: 35px;
-  padding: 0;
-}
-
-.multi-wizard .review .select-container .select .name {
-  float: left;
-  width: 127px;
-  margin: 13px 22px 0 14px;
-  font-size: 11px;
-}
-
-.multi-wizard .review .select-container .select .value {
-  float: left;
-  width: 136px;
-  margin: 9px 21px 0;
-}
-
-.multi-wizard .review .select-container .select .value span {
-  font-size: 10px;
-}
-
-.multi-wizard .review .select-container .select .edit {
-  float: right;
-  height: 18px;
-  margin: 11px 20px 0 0;
-  padding: 0 0 0 20px;
-  background: url('../images/icons.png') -10px -452px;
-  cursor: pointer;
-}
-
-.multi-wizard .review .select-container .select.odd .edit a {
-  background: #ebeff4;
-}
-
-.multi-wizard .review .select-container .select .edit a {
-  padding: 5px 0 8px;
-  background: #ffffff;
-  font-size: 10px;
-  color: #0000ff;
-  text-decoration: none;
-}
-
-.multi-wizard .review .select-container .select input,
-.multi-wizard .review .select-container .select select {
-  float: left;
-  width: 151px;
-  margin: 0;
-}
-
-/*** Diagram*/
-.multi-wizard.instance-wizard .diagram {
-  position: absolute;
-  top: 109px;
-  left: 465px;
-  width: 1px;
-  height: 502px;
-}
-
-.multi-wizard.instance-wizard .diagram .part {
-  background: url('../images/instance-wizard-parts.png') no-repeat 0 0;
-}
-
-.multi-wizard.instance-wizard .diagram .part.zone-plane {
-  position: absolute;
-  width: 354px;
-  height: 117px;
-  /*+placement:displace -38px 259px;*/
-  margin-top: 259px;
-  background-position: -38px -55px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.computer-tower-front {
-  position: absolute;
-  width: 95px;
-  height: 254px;
-  /*+placement:displace 44px 92px;*/
-  margin-top: 92px;
-  margin-left: 44px;
-  background-position: -54px -210px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.computer-tower-back {
-  position: absolute;
-  width: 194px;
-  height: 271px;
-  /*+placement:displace 138px 74px;*/
-  margin-top: 74px;
-  margin-left: 138px;
-  background-position: -148px -192px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.os-drive {
-  position: absolute;
-  width: 194px;
-  height: 86px;
-  /*+placement:displace 138px 74px;*/
-  margin-top: 74px;
-  margin-left: 138px;
-  background-position: -348px -192px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.cpu {
-  position: absolute;
-  width: 194px;
-  height: 49px;
-  /*+placement:displace 138px 156px;*/
-  margin-top: 156px;
-  margin-left: 138px;
-  background-position: -344px -278px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.hd {
-  position: absolute;
-  width: 194px;
-  height: 44px;
-  /*+placement:displace 138px 208px;*/
-  margin-top: 208px;
-  margin-left: 138px;
-  background-position: -344px -331px;
-}
-
-.multi-wizard.instance-wizard .diagram .part.network-card {
-  position: absolute;
-  width: 194px;
-  height: 44px;
-  /*+placement:displace 138px 260px;*/
-  margin-top: 260px;
-  margin-left: 138px;
-  background-position: -344px -380px;
-}
-
-/** Add zone wizard*/
-.multi-wizard.zone-wizard {
-  display: block;
-  height: 675px;
-}
-
-.multi-wizard.zone-wizard ul.subnav {
-  position: relative;
-  /*+placement:shift 30px 104px;*/
-  position: absolute;
-  top: 104px;
-  left: 30px;
-  text-align: left;
-  list-style: disc inside;
-}
-
-.multi-wizard.zone-wizard ul.subnav li {
-  float: left;
-  height: 20px;
-  margin-right: 34px;
-  padding: 0;
-  font-size: 12px;
-  white-space: nowrap;
-  color: #9a9a9a;
-  text-transform: uppercase;
-  list-style: none;
-}
-
-.multi-wizard.zone-wizard ul.subnav li:after {
-  content: '>';
-  position: relative;
-  /*+placement:shift 4px -1px;*/
-  top: -1px;
-  left: 4px;
-  font-size: 13px;
-}
-
-.multi-wizard.zone-wizard ul.subnav li.active {
-  color: #0000ff;
-}
-
-.multi-wizard.zone-wizard .ui-tabs-panel {
-  height: 422px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.multi-wizard.zone-wizard ul.ui-tabs-nav {
-  /*+placement:shift 0px 0px;*/
-  position: relative;
-  float: left;
-  top: 0;
-  left: 0;
-  margin: 6px 0 3px 3px;
-}
-
-.multi-wizard.zone-wizard .select-container {
-  height: 333px;
-  overflow: auto;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic .select-container {
-  background: #e9eaeb;
-  overflow: hidden;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic.basic .select-container {
-  background: #ffffff;
-}
-
-.multi-wizard.zone-wizard .main-desc {
-  position: relative;
-  float: left;
-  /*+placement:shift 0;*/
-  top: 0;
-  left: 0;
-  width: 516px;
-  margin: 23px 0 0 6px;
-  font-size: 14px;
-  font-weight: 100;
-  color: #424242;
-}
-
-.multi-wizard.zone-wizard .review .main-desc.pre-setup {
-  position: relative;
-  top: 153px;
-  left: 0;
-  left: -10px;
-  width: 90%;
-  margin-left: 50px;
-  padding: 1px 0 1px 20px;
-  background: url('../images/icons.png') no-repeat 74px -224px;
-  /*+placement:shift 0px 153px;*/
-  font-size: 18px;
-  font-weight: 100;
-  color: #2c4159;
-  text-align: center;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.multi-wizard.zone-wizard .info-desc {
-  float: left;
-  width: 698px;
-  margin: 29px 0 68px 5px;
-  padding: 11px;
-  border: 1px solid #c7c7c7;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  font-size: 11px;
-  text-align: left;
-  /*+border-radius:4px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .setup-storage-traffic .info-desc {
-  margin-bottom: 10px;
-}
-
-.multi-wizard.zone-wizard .setup-public-traffic .info-desc,
-.multi-wizard.zone-wizard .setup-guest-traffic .info-desc,
-.multi-wizard.zone-wizard .setup-physical-network .info-desc {
-  margin-bottom: 12px;
-}
-
-.multi-wizard.zone-wizard .info-desc strong {
-  font-weight: bold;
-}
-
-.multi-wizard.zone-wizard .main-desc em {
-  font-weight: bold;
-  text-decoration: underline;
-}
-
-.multi-wizard.zone-wizard .progress ul li {
-  width: 107px;
-  margin-left: 7px;
-  padding: 0 32px 0 0;
-}
-
-.multi-wizard.zone-wizard .progress ul li span {
-  width: 102px;
-}
-
-.multi-wizard.zone-wizard .progress ul li span.arrow {
-  margin: -4px 0 0 109px;
-}
-
-.multi-wizard.zone-wizard .select-network .content .section {
-  position: relative;
-  top: 14px;
-  /*+placement:shift 0px 14px;*/
-  left: 0;
-  width: 665px;
-  height: 430px;
-}
-
-.multi-wizard.zone-wizard .select-network .content {
-  float: none;
-  width: 100%;
-  height: 461px;
-  margin: 7px auto auto;
-  padding-bottom: 28px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area {
-  position: relative;
-  width: 586px;
-  height: 181px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area.basic-zone {
-  height: 105px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area.advanced-zone {
-  height: 233px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode {
-  position: absolute;
-  float: left;
-  top: 114px;
-  left: 9px;
-  height: 98px;
-  margin: 5px 0 0;
-  overflow: hidden;
-}
-
-
-
-.multi-wizard.zone-wizard .select-network-model .select-area.disabled .isolation-mode {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .title {
-  position: relative;
-  top: 2px;
-  /*+placement:shift 36px 2px;*/
-  left: 36px;
-  font-size: 15px;
-  color: #5d7387;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .desc {
-  position: relative;
-  top: 12px;
-  left: -27px;
-  width: 373px;
-  height: 70px;
-  /*+placement:shift -27px 12px;*/
-  padding: 12px 18px 25px;
-  border-radius: 7px;
-  border-radius: 7px 7px 7px 7px;
-  /*+border-radius:7px;*/
-  background: #efefef;
-  line-height: 19px;
-  color: #727272;
-  -moz-border-radius: 7px;
-  -webkit-border-radius: 7px;
-  -khtml-border-radius: 7px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area.basic-zone .desc {
-  padding-bottom: 4px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .desc em {
-  font-weight: bold;
-  text-decoration: underline;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area {
-  width: 586px;
-  height: 61px;
-  margin: 0;
-  padding: 0 0 9px;
-  background: none;
-  overflow: hidden;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area label {
-  margin: 24px 0 0 2px;
-  font-size: 11px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area input {
-  margin: 26px 0 11px;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area input {
-  margin: 24px 8px 0 12px !important;
-  padding: 0 !important;
-}
-
-.multi-wizard.zone-wizard .select-network-model .select-area .isolation-mode .select-area .desc {
-  position: relative;
-  float: right;
-  top: 12px;
-  left: -27px;
-  width: 388px;
-  height: 29px;
-  margin-right: 9px;
-  /*+placement:shift -27px 12px;*/
-  padding: 6px 7px 11px;
-  background: #efefef;
-  font-size: 11px;
-}
-
-.multi-wizard.zone-wizard .content.input-area {
-  width: 721px;
-  min-height: inherit;
-  margin: -50px auto auto 4px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-/*** Add physical network -- network form items*/
-.multi-wizard.zone-wizard .setup-physical-network .content.input-area {
-  position: relative;
-  width: 627px;
-  height: 396px;
-  background: transparent;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .drag-helper-icon {
-  position: relative;
-  position: absolute;
-  top: 303px;
-  /*+placement:shift 134px 303px;*/
-  left: 134px;
-  width: 80px;
-  height: 84px;
-  background: url('../images/sprites.png') no-repeat 0 -1365px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi {
-  display: inline-block;
-  float: right;
-  width: 490px;
-  height: auto;
-  margin: 6px auto auto;
-  border: 1px solid #bfbfbf;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 1px 2px #cbcaca;
-  background: #f8f6f6;
-  overflow: visible;
-  -moz-border-radius: 4px;
-  /*+box-shadow:inset 0px 1px 2px #CBCACA;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 1px 2px #cbcaca;
-  -webkit-box-shadow: inset 0 1px 2px #cbcaca;
-  -o-box-shadow: inset 0 1px 2px #cbcaca;
-  /*[empty]display:;*/
-}
-
-.multi-wizard.zone-wizard .select-container.multi.disabled {
-  opacity: 0.4;
-  /*+opacity:40%;*/
-  border: 1px dotted #a7a7a7;
-  filter: alpha(opacity=40);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
-  -moz-opacity: 0.4;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .physical-network-icon {
-  float: left;
-  width: 61px;
-  height: 53px;
-  border-right: 1px solid #cdcdcd;
-  background: url('../images/sprites.png') -109px -1393px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi input {
-  width: 195px !important;
-  margin: 2px 0 0 17px !important;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .field {
-  width: 425px;
-  height: 46px;
-  margin-top: -6px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .field .name {
-  width: 93%;
-  margin-left: 17px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container {
-  position: relative;
-  clear: both;
-  width: 484px;
-  height: 114px;
-  border: 3px dashed #bbbfc4;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #dae2ec;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container ul {
-  position: absolute;
-  /*+border-radius:5px;*/
-  top: 4px;
-  left: 2px;
-  width: 99%;
-  height: 94%;
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  background: #dae2ec;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container ul.active {
-  background: #dfeaff;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container ul li {
-  float: left;
-  margin: 2px 17px 0 29px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi .drop-container span.empty-message {
-  position: relative;
-  top: 45px;
-  left: 0;
-  /*+placement:shift 0px 45px;*/
-  font-size: 13px;
-  color: #959ba0;
-  text-align: center;
-}
-
-/*** Add physical network -- traffic type drag area*/
-.multi-wizard.zone-wizard .traffic-types-drag-area {
-  position: relative;
-  float: left;
-  top: 0;
-  left: 3px;
-  /*+border-radius:4px;*/
-  width: 96px;
-  height: 370px;
-  margin: 8px 0 0;
-  padding: 0;
-  border: 1px solid #dccaca;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #f0f1f2;
-  text-align: left;
-  /*+placement:shift 3px 0px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area .header {
-  margin: 0;
-  padding: 8px 0 7px;
-  border-bottom: 1px solid #dccaca;
-  border-radius: 4px 4px 0 0;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  background: #f8f8f8;
-  font-size: 13px;
-  font-weight: bold;
-  color: #5c5c5c;
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  /*+border-radius:4px 4px 0 0;*/
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  -khtml-border-radius: 4px 4px 0 0;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul {
-  width: 100%;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li {
-  float: left;
-  width: 100%;
-  height: 83px;
-  margin: 16px 13px 0 0;
-  background: transparent;
-  font-size: 11px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li.required {
-  display: none;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li.required.clone {
-  display: block;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li ul.container {
-  width: 60px;
-  height: 54px;
-  margin-left: 16px;
-  border-bottom: 1px solid #ffffff;
-  /*+border-radius:5px;*/
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  box-shadow: inset 0 2px 4px #999696;
-  background: #e4e4e4;
-  -moz-border-radius: 5px;
-  /*+box-shadow:inset 0px 2px 4px #999696;*/
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-  -moz-box-shadow: inset 0 2px 4px #999696;
-  -webkit-box-shadow: inset 0 2px 4px #999696;
-  -o-box-shadow: inset 0 2px 4px #999696;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li ul.container li {
-  /*+placement:shift 1px 2px;*/
-  position: relative;
-  top: 2px;
-  left: 1px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable {
-  display: block;
-  z-index: $z-index-multi-wizard2;
-  width: 51px;
-  height: 51px;
-  margin: auto;
-  background: transparent url('../images/sprites.png') no-repeat 0 -1161px;
-  cursor: move;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable:hover {
-  width: 69px !important;
-  height: 66px !important;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable:hover {
-  /*+placement:shift -2px -4px;*/
-  position: relative;
-  top: -4px;
-  left: -2px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable:hover {
-  /*+placement:shift -8px -6px;*/
-  position: relative;
-  top: -6px;
-  left: -8px;
-  width: 70px !important;
-  margin-right: 0;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.disabled {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  cursor: not-allowed;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area ul > li.disabled {
-  display: none;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.disabled {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  cursor: not-allowed;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.management {
-  height: 52px;
-  background-position: 0 -1161px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.management:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.management:hover {
-  background-position: -11px -1225px;
-}
-
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.management:hover {
-  margin-right: -1px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.public {
-  width: 53px;
-  height: 53px;
-  background-position: -54px -1160px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.public:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.public:hover {
-  background-position: -87px -1225px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.guest {
-  background-position: -113px -1161px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.guest:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.guest:hover {
-  background-position: -166px -1227px;
-}
-
-.multi-wizard.zone-wizard li.traffic-type-draggable.storage {
-  background-position: -170px -1160px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area li.traffic-type-draggable.storage:hover,
-.multi-wizard.zone-wizard .select-container.multi li.traffic-type-draggable.storage:hover {
-  background-position: -244px -1224px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li .info {
-  float: left;
-  width: 100%;
-  margin: 5px 0 0 -2px;
-  line-height: 14px;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li .info .title {
-  font-weight: bold;
-  color: #787879;
-  text-align: center;
-}
-
-.multi-wizard.zone-wizard .traffic-types-drag-area > ul > li .info .desc {
-  display: none;
-}
-
-/*** Traffic type icon -- edit button*/
-.multi-wizard.zone-wizard .traffic-type-draggable .edit-traffic-type {
-  display: none;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable > .edit-traffic-type {
-  display: block;
-  position: relative;
-  top: 70px;
-  left: -16px;
-  width: 59px;
-  height: 23px;
-  padding: 2px 9px 0 12px;
-  /*+border-radius:4px;*/
-  border: 1px solid #c4c4c4;
-  border-top: 1px solid #ffffff;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: url('../images/bg-gradients.png') 0 -1342px;
-  cursor: pointer;
-  /*+placement:shift -16px 70px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable > .edit-traffic-type:hover {
-  box-shadow: inset 0 -1px 1px #727272;
-  background-position: 0 -105px;
-  /*+box-shadow:inset 0px -1px 1px #727272;*/
-  color: #ffffff;
-  -moz-box-shadow: inset 0 -1px 1px #727272;
-  -webkit-box-shadow: inset 0 -1px 1px #727272;
-  -o-box-shadow: inset 0 -1px 1px #727272;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable > .edit-traffic-type:hover span {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable:hover > .edit-traffic-type {
-  /*+placement:shift -7px 76px;*/
-  position: relative;
-  top: 76px;
-  left: -7px;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable .edit-traffic-type span {
-  font-size: 11px;
-  font-weight: bold;
-  color: #4e73a6;
-  text-align: center;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.multi-wizard.zone-wizard .drop-container .traffic-type-draggable .edit-traffic-type span.icon {
-  float: left;
-  padding: 7px 11px 0 7px;
-  background: url('../images/sprites.png') -7px -4px;
-}
-
-.multi-wizard.zone-wizard .traffic-type-draggable .edit-traffic-type span.name {
-  position: relative;
-  float: left;
-  top: -16px;
-  left: -13px;
-  width: 76px;
-  margin-bottom: -13px;
-  /*+border-radius:4px 4px 0 0;*/
-  padding: 2px;
-  border: 1px solid #c3bcbc;
-  border-bottom: 1px solid #d1cdcd;
-  border-radius: 4px 4px 0 0;
-  /*+placement:shift -13px -16px;*/
-  box-shadow: inset 0 1px 1px #f5f4f4;
-  background: #dbe1e9;
-  font-size: 10px;
-  color: #4e5f6f;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-  /*+box-shadow:inset 0px 1px 1px #F5F4F4;*/
-  -khtml-border-radius: 4px 4px 0 0;
-  -moz-box-shadow: inset 0 1px 1px #f5f4f4;
-  -webkit-box-shadow: inset 0 1px 1px #f5f4f4;
-  -o-box-shadow: inset 0 1px 1px #f5f4f4;
-}
-
-.multi-wizard.zone-wizard .traffic-type-draggable .edit-traffic-type:hover span.name {
-  background: #c4c3c3;
-}
-
-/*** Configure guest network -- tabs*/
-.multi-wizard.zone-wizard .setup-guest-traffic .ui-widget-content {
-  position: relative;
-  top: -7px;
-  left: -1px;
-  width: 682px;
-  /*+placement:shift -1px -7px;*/
-  height: 281px;
-  border-right: 0;
-  border-bottom: 0;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic ul.ui-tabs-nav {
-  position: relative;
-  /*+placement:shift -4px -8px;*/
-  top: -8px;
-  left: -4px;
-  width: 456px;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic .main-desc {
-  margin-top: 27px;
-  margin-left: -3px;
-}
-
-.multi-wizard.zone-wizard .setup-guest-traffic .content {
-  margin-top: 2px;
-  margin-left: -4px;
-}
-
-/*** Multi-edit*/
-.multi-wizard.zone-wizard .multi-edit {
-  float: left;
-  width: 732px;
-  margin-left: 0;
-}
-
-.multi-wizard.zone-wizard .multi-edit table {
-  float: left;
-  width: 98%;
-}
-
-.multi-wizard.zone-wizard .multi-edit table td,
-.multi-wizard.zone-wizard .multi-edit table th {
-  padding: 4px;
-}
-
-.multi-wizard.zone-wizard .multi-edit table th {
-  padding-top: 11px;
-  padding-bottom: 8px;
-}
-
-.multi-wizard.zone-wizard .multi-edit table input {
-  margin: 2px 0 2px -5px;
-  padding: 2px 0;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data {
-  float: left;
-  overflow: visible;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body {
-  margin: 0;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body .data-item {
-  float: left;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body .data-item td {
-  padding-top: 8px;
-  padding-bottom: 8px;
-}
-
-.multi-wizard.zone-wizard .multi-edit .data-body .data-item td span {
-  max-width: 91px;
-  font-size: 10px;
-  text-overflow: ellipsis;
-}
-
-/*** Select container fields*/
-.multi-wizard.zone-wizard .select-container .field {
-  float: left;
-  width: 100%;
-  padding-bottom: 13px;
-}
-
-.multi-wizard.zone-wizard .select-container .field.odd {
-  background: #ebeff5;
-}
-
-.multi-wizard.zone-wizard .select-container .field .name {
-  float: left;
-  width: 95px;
-  margin: 18px 0 0 12px;
-  font-size: 11px;
-  line-height: 13px;
-  text-align: left;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value {
-  position: relative;
-  float: left;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value span {
-  display: block;
-  margin: 20px 0 0;
-  font-size: 11px;
-  color: #052060;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value label.error {
-  display: block;
-  position: absolute;
-  position: relative;
-  position: absolute;
-  float: right;
-  top: 31px;
-  left: 1px;
-  /*+placement:shift 1px 31px;*/
-  margin: 2px 0 0 16px;
-  font-size: 10px;
-  color: #ff0000;
-  text-align: left;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value input,
-.multi-wizard.zone-wizard .select-container .field .value select {
-  float: left;
-  width: 316px;
-  height: 20px;
-  margin: 13px 13px 0 18px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .range-edit .range-item {
-  float: left;
-  width: 106px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .range-edit .range-item input[type='text'] {
-  width: 93px;
-  margin: 16px 0 0 17px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value select {
-  width: 327px;
-  height: 21px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value input[type='checkbox'] {
-  display: block;
-  float: left;
-  width: 13px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value.multi-range input {
-  float: left;
-  width: 137px;
-}
-
-.multi-wizard.zone-wizard .select-container .field .value.multi-range span {
-  float: left;
-  margin: 13px 0 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array {
-  display: inline-block;
-  width: 360px;
-}
-
-/*[clearfix]*/
-.multi-wizard.zone-wizard .select-container .field .select-array-item {
-  float: left;
-  width: 175px;
-  height: 34px;
-}
-
-div.toolbar,
-.multi-wizard.zone-wizard .select-container .field .select-array-item {
-  display: block;
-}
-
-div.toolbar:after,
-.multi-wizard.zone-wizard .select-container .field .select-array-item:after {
-  visibility: hidden;
-  content: '.';
-  display: block;
-  clear: both;
-  height: 0;
-  font-size: 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array-item .name {
-  float: right;
-  width: 127px;
-  margin: 11px 0 0;
-  padding: 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array-item .value {
-  float: right;
-  width: 41px;
-  margin: 0;
-  padding: 0;
-}
-
-.multi-wizard.zone-wizard .select-container .field .select-array-item .value input {
-  width: inherit;
-  margin: 12px 0 0 11px;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.add.new-physical-network {
-  visibility: hidden;
-  float: right;
-  margin: 14px 6px 0 0;
-  padding: 6px 20px 6px 11px;
-  border: 1px solid #ada7a7;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  background: #808080 url('../images/bg-gradients.png') 0 -264px;
-  font-size: 12px;
-  color: #475765;
-  text-shadow: 0 1px 1px #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.remove.physical-network {
-  position: relative;
-  float: right;
-  top: 27px;
-  margin: -26px 0 0;
-  padding: 10px 10px 0;
-  background: url('../images/sprites.png') -6px -93px;
-  cursor: pointer;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .select-container.disabled .button.remove.physical-network {
-  display: none;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.remove.physical-network:hover {
-  background-position: -6px -675px;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.add.new-physical-network:hover {
-  background-position: 0 -349px;
-  color: #000000;
-  /*+text-shadow:0px 1px 2px #FFFFFF;*/
-  text-shadow: 0 1px 2px #ffffff;
-  -moz-text-shadow: 0 1px 2px #ffffff;
-  -webkit-text-shadow: 0 1px 2px #ffffff;
-  -o-text-shadow: 0 1px 2px #ffffff;
-}
-
-.multi-wizard.zone-wizard .setup-physical-network .button.add.new-physical-network .icon {
-  padding: 10px;
-  background: url('../images/sprites.png') -44px -58px;
-}
-
-/*** Review / launch*/
-.multi-wizard.zone-wizard .review .launch-container {
-  float: left;
-  width: 98%;
-  max-height: 438px;
-  margin: 11px 0 0 7px;
-  border: 1px solid #cacaca;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  background: #ececec 0 -12px;
-  background: #f7f7f7;
-  background: -moz-linear-gradient(top, #f7f7f7 0%, #eaeaea 100%);
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f7f7f7), color-stop(100%, #eaeaea));
-  background: -webkit-linear-gradient(top, #f7f7f7 0%, #eaeaea 100%);
-  background: -o-linear-gradient(top, #f7f7f7 0%, #eaeaea 100%);
-  background: -ms-linear-gradient(top, #f7f7f7 0%, #eaeaea 100%);
-  background: linear-gradient(to bottom, #f7f7f7 0%, #eaeaea 100%);
-  /*+border-radius:4px;*/
-  overflow: auto;
-  overflow-x: hidden;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li {
-  width: 100%;
-  padding: 15px 0 15px 12px;
-  font-size: 12px;
-  font-weight: bold;
-  text-align: left;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li .icon {
-  /*[empty]display:;*/
-  padding: 10px 21px 10px 10px;
-  background: url('../images/icons.png') -2px -217px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li.loading .icon {
-  background: url('../images/ajax-loader-small.gif') no-repeat 2px 9px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li.error .icon {
-  background-position: -2px -185px;
-}
-
-.multi-wizard.zone-wizard .review .launch-container li.info .icon {
-  display: none;
-}
diff --git a/ui/legacy/css/src/scss/components/navigation.scss b/ui/legacy/css/src/scss/components/navigation.scss
deleted file mode 100644
index c17a610..0000000
--- a/ui/legacy/css/src/scss/components/navigation.scss
+++ /dev/null
@@ -1,333 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#navigation {
-  position: relative;
-  float: left;
-  width: 230px;
-  /*+box-shadow:inset -1px 4px 7px #DDDDDD;*/
-  box-shadow: inset -1px 4px 7px #dddddd;
-  background: #ede8e8;
-  background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjYlIiBzdG9wLWNvbG9yPSIjZWRlOGU4IiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZ3JhZC11Y2dnLWdlbmVyYXRlZCkiIC8+Cjwvc3ZnPg==');
-  background: -moz-linear-gradient(top, #ffffff 0%, #ede8e8 6%);
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(6%, #ede8e8));
-  background: -webkit-linear-gradient(top, #ffffff 0%, #ede8e8 6%);
-  background: -o-linear-gradient(top, #ffffff 0%, #ede8e8 6%);
-  background: -ms-linear-gradient(top, #ffffff 0%, #ede8e8 6%);
-  background: linear-gradient(to bottom, #ffffff 0%, #ede8e8 6%);
-  -moz-box-shadow: inset -1px 4px 7px #dddddd;
-  -webkit-box-shadow: inset -1px 4px 7px #dddddd;
-  -o-box-shadow: inset -1px 4px 7px #dddddd;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ede8e8', GradientType=0);
-}
-
-.project-view #navigation {
-  background: #6d747d;
-}
-
-#navigation ul {
-  height: 700px;
-  padding-top: 29px;
-}
-
-.project-view #navigation ul {
-  border-right: 1px solid #464c53;
-  background: #6d747d;
-}
-
-#navigation ul li {
-  height: 42px;
-  border-bottom: 1px solid #d2d2d2;
-  cursor: pointer;
-}
-
-.project-view #navigation ul li {
-  border: 0;
-  background-image: url('../images/bg-nav-item-project-view.png');
-  background-position: 0 0;
-}
-
-.project-view #navigation ul li span {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-#navigation ul li:hover,
-#navigation ul li.active {
-  width: 230px;
-  box-shadow: inset 0 0 7px #000000;
-  /*+box-shadow:inset 0px 0px 7px #000000;*/
-  background: #2c5d7b;
-  -moz-box-shadow: inset 0 0 7px #000000;
-  -webkit-box-shadow: inset 0 0 7px #000000;
-  -o-box-shadow: inset 0 0 7px #000000;
-}
-
-#navigation ul li.disabled {
-  /*+opacity:60%;*/
-  opacity: 0.6;
-  filter: alpha(opacity=60);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
-  -moz-opacity: 0.6;
-}
-
-.project-view #navigation ul li:hover,
-.project-view #navigation ul li.active {
-  width: 230px;
-  background: url('../images/bg-nav-item-active-project-view.png');
-  background-position: 0 0;
-}
-
-.project-view #navigation ul li.disabled:hover {
-  background: #d5d5d5;
-  color: #596d7f;
-  cursor: default;
-}
-
-#navigation ul li:hover span,
-#navigation ul li.active span {
-  color: #ffffff;
-  /*+text-shadow:0px 1px #000000;*/
-  text-shadow: 0 1px #000000;
-  -moz-text-shadow: 0 1px #000000;
-  -webkit-text-shadow: 0 1px #000000;
-  -o-text-shadow: 0 1px #000000;
-}
-
-#navigation ul li.disabled:hover {
-  cursor: not-allowed !important;
-}
-
-#navigation ul li.disabled:hover span {
-  color: #596d7f;
-  /*+text-shadow:0px 0px;*/
-  text-shadow: 0 0;
-  -moz-text-shadow: 0 0;
-  -webkit-text-shadow: 0 0;
-  -o-text-shadow: 0 0;
-  -moz-text-shadow: 0 0 none;
-  -webkit-text-shadow: 0 0 none;
-  -o-text-shadow: 0 0 none;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-#navigation ul li.last {
-  background-repeat: repeat;
-  background-position: 0 0;
-  /*[empty]color:;*/
-}
-
-#navigation ul li span {
-  /*+placement:shift 14px 13px;*/
-  position: relative;
-  top: 13px;
-  left: 14px;
-  padding-left: 19px;
-  font-size: 12px;
-  color: #515151;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-#navigation ul li span.icon {
-  position: relative;
-  top: 10px;
-  /*+placement:shift 17px 10px;*/
-  left: 17px;
-  padding: 16px 16px 13px;
-  background: url('../images/icons.png') no-repeat 0 0;
-}
-
-#navigation ul li.custom-icon span.icon {
-  display: block;
-  position: relative;
-  float: left;
-  width: 50px;
-  height: 50px;
-  margin-right: -47px;
-  background: none;
-}
-
-#navigation ul li.custom-icon span.icon img {
-  position: relative;
-  position: absolute;
-  float: left;
-  /*+placement:shift -6px -17px;*/
-  top: -17px;
-  left: -6px;
-  width: 50px;
-  height: 50px;
-  margin-right: -14px;
-}
-
-/*Navigation icons*/
-#navigation ul li.dashboard span.icon,
-#navigation ul li.dashboard-user span.icon {
-  background-position: -14px -18px;
-}
-
-#navigation ul li.dashboard:hover span.icon,
-#navigation ul li.dashboard-user:hover span.icon span.icon,
-#navigation ul li.dashboard.active span.icon,
-#navigation ul li.dashboard-user.active span.icon span.icon {
-  background-position: -23px -687px;
-}
-
-#navigation ul li.instances span.icon {
-  background-position: -73px -18px;
-}
-
-#navigation ul li.instances.active span.icon,
-#navigation ul li.instances:hover span.icon {
-  background-position: -82px -686px;
-}
-
-#navigation ul li.vmsnapshots span.icon {
-  background: url('../images/sprites.png') no-repeat -34px -666px;
-}
-
-#navigation ul li.affinityGroups span.icon {
-  background-position: -73px -87px;
-}
-
-#navigation ul li.affinityGroups.active span.icon,
-#navigation ul li.affinityGroups:hover span.icon {
-  background-position: -82px -755px;
-}
-
-#navigation ul li.storage span.icon {
-  background-position: -127px -19px;
-}
-
-#navigation ul li.storage.active span.icon,
-#navigation ul li.storage:hover span.icon {
-  background-position: -137px -687px;
-}
-
-#navigation ul li.network span.icon {
-  background-position: -180px -20px;
-}
-
-#navigation ul li.network.active span.icon,
-#navigation ul li.network:hover span.icon {
-  background-position: -189px -690px;
-}
-
-#navigation ul li.templates span.icon {
-  background-position: -233px -21px;
-}
-
-#navigation ul li.templates.active span.icon,
-#navigation ul li.templates:hover span.icon {
-  background-position: -242px -690px;
-}
-
-#navigation ul li.projects span.icon {
-  background-position: -294px -21px;
-}
-
-#navigation ul li.projects.active span.icon,
-#navigation ul li.projects:hover span.icon {
-  background-position: -303px -690px;
-}
-
-#navigation ul li.events span.icon {
-  background-position: -351px -23px;
-}
-
-#navigation ul li.events.active span.icon,
-#navigation ul li.events:hover span.icon {
-  background-position: -359px -692px;
-}
-
-#navigation ul li.configuration span.icon {
-  background-position: -401px -21px;
-}
-
-#navigation ul li.configuration.active span.icon,
-#navigation ul li.configuration:hover span.icon {
-  background-position: -410px -690px;
-}
-
-#navigation ul li.global-settings span.icon {
-  background-image: url('../images/sprites.png');
-  background-position: -143px -240px;
-}
-
-#navigation ul li.global-settings.active span.icon,
-#navigation ul li.global-settings:hover span.icon {
-  background-image: url('../images/sprites.png');
-  background-position: -366px -239px;
-}
-
-#navigation ul li.roles span.icon {
-  background-position: -460px -80px;
-}
-
-#navigation ul li.roles.active span.icon,
-#navigation ul li.roles:hover span.icon {
-  background-position: -469px -750px;
-}
-
-#navigation ul li.accounts span.icon {
-  background-position: -458px -19px;
-}
-
-#navigation ul li.accounts.active span.icon,
-#navigation ul li.accounts:hover span.icon {
-  background-position: -467px -688px;
-}
-
-#navigation ul li.system span.icon {
-  background-position: -569px -24px;
-}
-
-#navigation ul li.system.active span.icon,
-#navigation ul li.system:hover span.icon {
-  background-position: -578px -692px;
-}
-
-#navigation ul li.domains span.icon {
-  background-position: -520px -21px;
-}
-
-#navigation ul li.domains.active span.icon,
-#navigation ul li.domains:hover span.icon {
-  background-position: -529px -690px;
-}
-
-#navigation ul li.plugins span.icon {
-  background: url('../images/sprites.png') no-repeat -140px -291px;
-}
-
-#navigation ul li.regions span.icon {
-  background: url('../images/sprites.png') no-repeat -141px -379px;
-}
-
-#navigation ul li.regions.active span.icon,
-#navigation ul li.regions:hover span.icon {
-  background: url('../images/sprites.png') no-repeat -365px -377px;
-}
diff --git a/ui/legacy/css/src/scss/components/network-chart.scss b/ui/legacy/css/src/scss/components/network-chart.scss
deleted file mode 100644
index 8ef7ee6..0000000
--- a/ui/legacy/css/src/scss/components/network-chart.scss
+++ /dev/null
@@ -1,192 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.network-chart {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  background: url('../images/bg-network.png') no-repeat 38% 70px;
-}
-
-.network-chart.static-nat {
-  background: url('../images/bg-network-nat.png') no-repeat 31% 62px;
-}
-
-.network-chart ul {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 536px;
-  height: 421px;
-}
-
-.network-chart li {
-  display: block;
-  width: 147px;
-  height: 86px;
-  background: url('../images/buttons.png') no-repeat 0 -399px;
-}
-
-.network-chart li.static-nat-enabled {
-  /*+placement:shift 31px 44px;*/
-  position: relative;
-  top: 44px;
-  left: 31px;
-}
-
-.network-chart li.static-nat-enabled .vmname {
-  /*+placement:shift 16px 41px;*/
-  position: relative;
-  position: absolute;
-  top: 41px;
-  left: 16px;
-  max-width: 98px;
-  max-height: 21px;
-  padding: 7px;
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  background: url('../images/bg-gradients.png') repeat-x 2px -221px;
-  font-size: 10px;
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  color: #485563;
-  color: #ffffff;
-  text-shadow: 0 1px 1px #000000;
-  cursor: pointer;
-  overflow: hidden;
-  -moz-text-shadow: 0 1px 1px #000000;
-  /*+border-radius:9px;*/
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.network-chart li.static-nat-enabled .vmname:hover {
-  background-position: 0 -946px;
-}
-
-.network-chart li.static-nat-enabled .name {
-  background: url('../images/sprites.png') no-repeat -6px -460px;
-}
-
-.network-chart li.static-nat-enabled .name span {
-  padding: 0 0 0 25px;
-  font-size: 11px;
-}
-
-.network-chart li.disabled {
-  /*+opacity:100%;*/
-  opacity: 1;
-  filter: alpha(opacity=100);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
-  -moz-opacity: 1;
-}
-
-.network-chart li.firewall {
-  /*+placement:shift 282px 188px;*/
-  position: relative;
-  position: absolute;
-  top: 188px;
-  left: 356px;
-}
-
-.network-chart li.loadBalancing {
-  /*+placement:shift 167px 342px;*/
-  position: relative;
-  position: absolute;
-  top: 342px;
-  left: 237px;
-}
-
-.network-chart li.portForwarding {
-  /*+placement:shift 401px 342px;*/
-  position: relative;
-  position: absolute;
-  top: 342px;
-  left: 480px;
-}
-
-.network-chart li .name {
-  position: relative;
-  top: 11px;
-  /*+text-shadow:0px 1px 1px #FCFCFC;*/
-  left: 10px;
-  width: 130px;
-  color: #4e5f6f;
-  text-shadow: 0 1px 1px #fcfcfc;
-  /*+placement:shift 10px 11px;*/
-  -moz-text-shadow: 0 1px 1px #fcfcfc;
-  -webkit-text-shadow: 0 1px 1px #fcfcfc;
-  -o-text-shadow: 0 1px 1px #fcfcfc;
-}
-
-.network-chart li.disabled .name {
-  position: relative;
-  /*+placement:shift 5px 32px;*/
-  top: 32px;
-  left: 5px;
-  color: #8695a5;
-  text-align: center;
-  text-decoration: line-through;
-}
-
-.network-chart li .view-details {
-  /*+placement:anchor-bottom-right 34px 19px;*/
-  position: absolute;
-  right: 34px;
-  bottom: 19px;
-  padding: 8px 20px;
-  border: 1px solid #a2a2a2;
-  border-radius: 4px;
-  background: #f7f7f7;
-  background: rgb(247, 247, 247);
-  background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlYWVhZWEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+');
-  background: -moz-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(247, 247, 247, 1)), color-stop(100%, rgba(234, 234, 234, 1)));
-  background: -webkit-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: -o-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: -ms-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: linear-gradient(to bottom, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  font-size: 11px;
-  color: #000000;
-  cursor: pointer;
-  /*+border-radius:4px;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.network-chart li .view-details:hover {
-  box-shadow: inset 0 0 4px #000000;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  background: #d5d5d5;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:inset 0px 0px 4px #000000;*/
-  -o-text-shadow: 0 1px 1px #ffffff;
-  -moz-box-shadow: inset 0 0 4px #000000;
-  -webkit-box-shadow: inset 0 0 4px #000000;
-  -o-box-shadow: inset 0 0 4px #000000;
-}
-
-.network-chart li.disabled .view-details {
-  display: none;
-}
diff --git a/ui/legacy/css/src/scss/components/new-project.scss b/ui/legacy/css/src/scss/components/new-project.scss
deleted file mode 100644
index 095811c..0000000
--- a/ui/legacy/css/src/scss/components/new-project.scss
+++ /dev/null
@@ -1,370 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.new-project {
-  display: inline-block;
-  margin: 0 0 20px 30px;
-}
-
-.new-project form {
-  margin: 0;
-}
-
-.ui-dialog .new-project {
-  text-align: left;
-}
-
-.ui-dialog .new-project .add-by {
-  margin-left: 11px;
-  font-size: 12px;
-  color: #5e6d7d;
-}
-
-.ui-dialog .new-project .add-by input {
-  margin-right: 8px;
-}
-
-.ui-dialog .new-project .add-by label {
-  margin-right: 12px;
-}
-
-.new-project .title {
-  margin: 10px 0 32px;
-  font-size: 26px;
-  /*+text-shadow:0px 1px 2px #D6D6D6;*/
-  letter-spacing: 0;
-  color: #3497e6;
-  text-shadow: 0 1px 2px #d6d6d6;
-  -moz-text-shadow: 0 1px 2px #d6d6d6;
-  -webkit-text-shadow: 0 1px 2px #d6d6d6;
-  -o-text-shadow: 0 1px 2px #d6d6d6;
-}
-
-.new-project .field {
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  display: inline-block;
-  width: 686px;
-  margin: -2px 0 -4px auto;
-  background: #dfdfdf;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-#new-project-review-tabs-resouces {
-  height: 225px;
-  background: #d2d2d2;
-}
-
-.new-project .resources .ui-widget-content {
-  background: #ffffff;
-}
-
-.new-project .resources .field {
-  height: 39px;
-  padding: 0;
-}
-
-.new-project .field span.value {
-  position: relative;
-  /*+placement:shift 21px 20px;*/
-  top: 20px;
-  left: 21px;
-  color: #475765;
-}
-
-.new-project .field label {
-  display: block;
-  float: left;
-  width: 104px;
-  height: 59px;
-  padding: 20px 24px 0 0;
-  background: #d2d2d2;
-  color: #5b5b5b;
-  text-align: right;
-}
-
-.new-project .resources .field label {
-  height: auto;
-  padding: 10px 14px 14px 40px;
-  font-size: 14px;
-}
-
-.new-project .field label.error {
-  position: absolute;
-  width: auto;
-  /*+placement:displace 154px 29px;*/
-  height: auto;
-  margin-top: 29px;
-  margin-left: 154px;
-  background: transparent;
-  font-size: 9px;
-  color: #ff0000;
-}
-
-.new-project .field input[type='text'] {
-  float: right;
-  /*+border-radius:5px;*/
-  width: 506px;
-  height: 20px;
-  margin: 17px 25px 0 0;
-  border: 1px solid #e2e1df;
-  border: 1px solid #c7c7c7;
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  /*+box-shadow:inset 0px 1px #A1A1A1;*/
-  box-shadow: inset 0 1px #a1a1a1;
-  background: #ffffff 0 7px;
-  font-size: 14px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-  -moz-box-shadow: inset 0 1px #a1a1a1;
-  -webkit-box-shadow: inset 0 1px #a1a1a1;
-  -o-box-shadow: inset 0 1px #a1a1a1;
-  -moz-box-shadow: inset 0 1px 0 #a1a1a1;
-  -webkit-box-shadow: inset 0 1px 0 #a1a1a1;
-  -o-box-shadow: inset 0 1px 0 #a1a1a1;
-}
-
-.new-project .resources .field input[type='text'] {
-  margin: 6px 9px 0 0;
-}
-
-.new-project .button.cancel {
-  position: relative;
-  float: left;
-  top: 9px;
-  left: 488px;
-  left: 480px;
-  margin: 19px 0 0 40px;
-  background: transparent;
-  /*+placement:shift 488px 9px;*/
-  font-size: 12px;
-  font-weight: bold;
-  color: #808080;
-  color: #838181;
-  cursor: pointer;
-}
-
-.new-project .button.cancel:hover {
-  color: #3a3a3a;
-}
-
-.new-project input[type='submit'],
-.new-project .button.confirm {
-  display: inline-block;
-  position: relative;
-  float: right;
-  /*+placement:float-right 63px 18px;*/
-  top: 18px;
-  left: 63px;
-  height: 31px;
-  margin: 0 63px 0 0;
-  border: 0;
-  /*+text-shadow:0px -1px 1px #465259;*/
-  border: 1px solid #0069cf;
-  border-top: 1px solid #0070fc;
-  border-radius: 9px;
-  border-radius: 9px 9px 9px 9px;
-  background: #0049ff url('../images/gradients.png') 0 -317px;
-  font-size: 13px;
-  font-weight: bold;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #465259;
-  /*+border-radius:9px;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 -1px 1px #465259;
-  -webkit-text-shadow: 0 -1px 1px #465259;
-  -o-text-shadow: 0 -1px 1px #465259;
-  -moz-border-radius: 9px;
-  -webkit-border-radius: 9px;
-  -khtml-border-radius: 9px;
-}
-
-.new-project input[type='submit']:hover,
-.new-project .button.confirm:hover {
-  background-position: -3px -369px;
-}
-
-.new-project .button {
-  cursor: pointer;
-}
-
-.new-project .button.confirm {
-  display: block;
-  height: 27px;
-  padding: 13px 10px 0 12px;
-}
-
-.new-project .button.confirm.next {
-  padding: 10px 34px 0 29px;
-}
-
-.new-project .review .button.confirm.next {
-  /*+placement:shift 25px 11px;*/
-  position: relative;
-  top: 11px;
-  left: 25px;
-}
-
-.new-project .review .ui-tabs {
-  /*+placement:shift -29px -31px;*/
-  position: relative;
-  top: -31px;
-  left: -29px;
-}
-
-.new-project .review .ui-tabs .ui-widget-content {
-  width: 695px;
-  height: 185px;
-}
-
-.new-project .review .ui-tabs .ui-widget-content.ui-tabs-hide {
-  display: none;
-}
-
-.new-project .review .ui-tabs ul {
-  position: relative;
-  /*+placement:shift 0px -2px;*/
-  top: -2px;
-  left: 0;
-  text-align: left;
-}
-
-.new-project .review .ui-tabs .list-view {
-  width: 688px;
-  height: 185px !important;
-}
-
-.new-project .review .ui-tabs .list-view .fixed-header {
-  position: absolute;
-  z-index: $z-index-toolbox-info;
-  top: -22px;
-  height: 58px;
-  background: #ffffff;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table {
-  width: 669px;
-  margin: 31px 0 -1px;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table .edit {
-  position: relative;
-  top: 0;
-  /*+placement:shift 14px 0px;*/
-  left: 14px;
-  width: 132px;
-  background: #ffffff;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table .edit select {
-  float: left;
-  width: 95px;
-  height: 20px;
-  border: 1px solid #b2b2b2;
-  background: #ffffff;
-}
-
-.new-project .review .ui-tabs .list-view .data-table table .edit .action {
-  position: relative;
-  float: left;
-  top: 0;
-  /*+placement:shift 14px 0px;*/
-  left: 14px;
-  height: 20px;
-  margin: 0;
-  padding: 0;
-}
-
-.new-project .review .ui-tabs .list-view .toolbar {
-  display: none;
-}
-
-.new-project .review .project-data {
-  position: relative;
-  top: -13px;
-  left: -19px;
-  /*+placement:shift -19px -13px;*/
-  margin: 0;
-  padding: 16px;
-  background: #f4f4f4;
-}
-
-.new-project .review .project-data .field {
-  width: 677px;
-  margin: auto;
-}
-
-.new-project .button.later {
-  float: right;
-  margin: 19px -40px 0 0;
-  padding: 13px 7px 14px 8px;
-  /*+box-shadow:inset 0px 2px 2px #FFFFFF;*/
-  border: 1px solid #b1b1b1;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  box-shadow: inset 0 2px 2px #ffffff;
-  background: url('../images/bg-gradients.png') 0 -261px;
-  font-size: 13px;
-  color: #808080;
-  -moz-box-shadow: inset 0 2px 2px #ffffff;
-  /*+border-radius:10px;*/
-  -webkit-box-shadow: inset 0 2px 2px #ffffff;
-  -o-box-shadow: inset 0 2px 2px #ffffff;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-}
-
-.new-project .button.later:hover {
-  box-shadow: inset 0 1px 1px #a1a1a1;
-  /*+box-shadow:inset 0px 1px 1px #A1A1A1;*/
-  background-position: 0 -86px;
-  color: #000000;
-  -moz-box-shadow: inset 0 1px 1px #a1a1a1;
-  -webkit-box-shadow: inset 0 1px 1px #a1a1a1;
-  -o-box-shadow: inset 0 1px 1px #a1a1a1;
-}
-
-.new-project input[type='submit']:hover {
-  background-position: -3px -369px;
-}
-
-.new-project .resources input[type='submit'] {
-  display: none;
-}
-
-.new-project .multi-edit {
-  width: 671px;
-}
-
-.new-project .multi-edit .data {
-  width: 700px;
-}
-
-.new-project .multi-edit .data .data-item {
-  margin: 0;
-  border: 0;
-  border: 1px solid #d2d2d2;
-}
-
-.new-project .multi-edit .data .data-item.even td {
-  background: #dfe1e3;
-}
diff --git a/ui/legacy/css/src/scss/components/notifications.scss b/ui/legacy/css/src/scss/components/notifications.scss
deleted file mode 100644
index c47995e..0000000
--- a/ui/legacy/css/src/scss/components/notifications.scss
+++ /dev/null
@@ -1,275 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.notification-box {
-  width: 323px;
-  height: 354px;
-  background: url('../images/bg-notifications.png') no-repeat 0 0;
-}
-
-div.notification-box h3 {
-  position: relative;
-  /*+placement:shift 0px 35px;*/
-  top: 35px;
-  left: 0;
-  font-size: 21px;
-  letter-spacing: 1px;
-  color: #ffffff;
-  text-align: center;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-shadow: 0 1px 2px #000000;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-div.notification-box .container {
-  position: relative;
-  top: 46px;
-  left: 3px;
-  width: 296px;
-  /*+placement:shift 3px 46px;*/
-  height: 241px;
-  margin: auto;
-  border: 1px solid #8198ae;
-  /*+box-shadow:inset 0px 3px 7px #656565;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: inset 0 3px 7px #656565;
-  background: #ffffff;
-  /*+border-radius:4px;*/
-  -moz-box-shadow: inset 0 3px 7px #656565;
-  -webkit-box-shadow: inset 0 3px 7px #656565;
-  -o-box-shadow: inset 0 3px 7px #656565;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-div.notification-box .container ul {
-  width: 294px;
-  height: 229px;
-  margin-top: 8px;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-div.notification-box .container ul li {
-  width: 100%;
-  height: 41px;
-  border-bottom: 1px solid #cecece;
-  background: url('../images/icons.png') no-repeat 10px -213px;
-  font-size: 12px;
-  color: #4d5e6e;
-  text-indent: 0;
-  cursor: pointer;
-  overflow-x: hidden;
-}
-
-div.notification-box .container ul li.error {
-  height: 53px;
-  background: url('../images/icons.png') no-repeat 10px -171px;
-}
-
-div.notification-box .container ul li.error .subtitle {
-  display: block;
-  position: relative;
-  float: left;
-  top: 17px;
-  left: 48px;
-  width: 213px;
-  height: 10px;
-  margin: 0;
-  padding: 0;
-  white-space: nowrap;
-  color: #808080;
-  /*+placement:shift 48px 17px;*/
-  text-indent: 0;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-div.notification-box .container ul li span {
-  position: relative;
-  /*+placement:shift 48px 15px;*/
-  float: left;
-  top: 15px;
-  left: 48px;
-  max-width: 202px;
-  font-size: 14px;
-  font-weight: 100;
-  overflow: hidden;
-}
-
-div.notification-box .container ul li span:hover {
-  color: #5faaf7;
-  text-decoration: underline;
-}
-
-div.notification-box .container ul div.remove {
-  position: relative;
-  float: right;
-  top: 16px;
-  left: 0;
-  width: 17px;
-  height: 21px;
-  /*+placement:shift 0px 16px;*/
-  margin: -4px 8px 0 0;
-  background: url('../images/buttons.png') no-repeat -623px -8px;
-  cursor: pointer;
-}
-
-div.notification-box .container ul div.remove:hover {
-  background-position: -606px -8px;
-}
-
-div.notification-box .container ul li.pending {
-  background: url('../images/ajax-loader.gif') no-repeat 8px 6px;
-  color: #7e96ac;
-}
-
-div.notification-box .container ul li.first {
-  border-top: 0;
-}
-
-div.notification-box .button {
-  position: relative;
-  float: left;
-  top: 51px;
-  /*+placement:shift 0px 51px;*/
-  left: 0;
-  padding: 5px 10px 6px;
-  border-bottom: 1px solid #2b2b2b;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  box-shadow: 0 0 2px #272727;
-  background: url('../images/buttons.png') no-repeat;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+box-shadow:0px 0px 2px #272727;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 0 2px #272727;
-  -webkit-box-shadow: 0 0 2px #272727;
-  -o-box-shadow: 0 0 2px #272727;
-}
-
-div.notification-box .button span {
-  font-size: 11px;
-  font-weight: bold;
-  letter-spacing: 1px;
-  color: #ffffff;
-  /*+text-shadow:0px -1px 2px #171717;*/
-  text-shadow: 0 -1px 2px #171717;
-  -moz-text-shadow: 0 -1px 2px #171717;
-  -webkit-text-shadow: 0 -1px 2px #171717;
-  -o-text-shadow: 0 -1px 2px #171717;
-}
-
-div.notification-box .button.clear-list {
-  margin-left: 16px;
-  background: url('../images/gradients.png') 0 -10px;
-}
-
-div.notification-box .button.clear-list:hover {
-  background-position: 0 -51px;
-}
-
-div.notification-box .button.close {
-  float: right;
-  margin-right: 10px;
-  border-bottom: 1px solid #232323;
-  background: url('../images/gradients.png') 0 -317px;
-}
-
-div.notification-box .button.close:hover {
-  background-position: -4px -368px;
-}
-
-/*** Corner alert*/
-div.notification.corner-alert {
-  opacity: 0.7;
-  position: absolute;
-  /*+box-shadow:0px 2px 10px #000000;*/
-  z-index: $z-index-notification;
-  width: 300px;
-  height: 75px;
-  margin: 38px 0 0 -56px;
-  padding: 7px 7px 0;
-  border-radius: 3px;
-  /*+border-radius:3px;*/
-  box-shadow: 0 2px 10px #000000;
-  background: #ffffff;
-  background: rgba(255, 255, 255, 0.95);
-  font-size: 12px;
-  text-indent: 10px;
-  -moz-box-shadow: 0 2px 10px #000000;
-  -webkit-box-shadow: 0 2px 10px #000000;
-  -o-box-shadow: 0 2px 10px #000000;
-  /*+opacity:70%;*/
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  filter: alpha(opacity=70);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
-  -moz-opacity: 0.7;
-}
-
-div.notification.corner-alert .top-arrow {
-  position: absolute;
-  top: -15px;
-  left: 50px;
-  width: 36px;
-  height: 15px;
-  background: url('../images/sprites.png') no-repeat -580px -1353px;
-}
-
-div.notification.corner-alert div.title {
-  width: 100%;
-  height: 33px;
-  color: #ffffff;
-}
-
-div.notification.corner-alert div.title span {
-  /*+placement:shift 0px 10px;*/
-  position: relative;
-  top: 10px;
-  left: 0;
-  padding: 3px 0 12px 24px;
-  padding-left: 33px;
-  background: url('../images/icons.png') no-repeat 3px -223px;
-  font-size: 14px;
-  font-weight: 100;
-  color: #6d6d6d;
-}
-
-div.notification.corner-alert.error div.title span {
-  background: url('../images/icons.png') no-repeat -2px -190px;
-}
-
-div.notification.corner-alert div.message span {
-  display: block;
-  position: relative;
-  position: relative;
-  top: -2px;
-  left: 17px;
-  /*+placement:shift 17px -2px;*/
-  padding-top: 6px;
-  font-size: 14px;
-  color: #000000;
-}
diff --git a/ui/legacy/css/src/scss/components/panel-controls.scss b/ui/legacy/css/src/scss/components/panel-controls.scss
deleted file mode 100644
index bdf9b1f..0000000
--- a/ui/legacy/css/src/scss/components/panel-controls.scss
+++ /dev/null
@@ -1,58 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#browser div.panel div.toolbar div.panel-controls {
-  display: none;
-  float: right;
-  width: 42px;
-  height: 23px;
-}
-
-#browser div.panel.reduced div.toolbar div.panel-controls {
-  display: block;
-  float: left;
-  width: 194px;
-}
-
-#browser div.panel.maximized div.toolbar div.panel-controls {
-  display: block;
-}
-
-#browser div.panel div.toolbar div.panel-controls div.control {
-  float: right;
-  width: 25px;
-  height: 26px;
-  margin-right: 6px;
-  background: url('../images/buttons.png') no-repeat -599px -335px;
-  cursor: pointer;
-}
-
-#browser div.panel.maximized.single div.toolbar div.panel-controls div.control {
-  display: none;
-}
-
-#browser div.panel div.toolbar div.panel-controls div.control:hover {
-  background-position: -593px -309px;
-}
-
-#browser div.panel.maximized div.toolbar div.panel-controls div.control {
-  background-position: -621px -334px;
-}
-
-#browser div.panel.maximized div.toolbar div.panel-controls div.control:hover {
-  background-position: -617px -308px;
-}
diff --git a/ui/legacy/css/src/scss/components/plugins-listing.scss b/ui/legacy/css/src/scss/components/plugins-listing.scss
deleted file mode 100644
index 4eb1b67..0000000
--- a/ui/legacy/css/src/scss/components/plugins-listing.scss
+++ /dev/null
@@ -1,79 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.plugins-listing ul {
-  width: 100%;
-}
-
-.plugins-listing ul li {
-  /*+border-radius:4px;*/
-  width: 98%;
-  height: 66px;
-  margin: 9px auto 12px;
-  border: 1px solid #a8a3a3;
-  /*+box-shadow:0px 2px 6px #D3D3D3;*/
-  border-radius: 4px;
-  box-shadow: 0 2px 6px #d3d3d3;
-  background: url('../images/bg-gradients.png') 0 -29px;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 2px 6px #d3d3d3;
-  -webkit-box-shadow: 0 2px 6px #d3d3d3;
-  -o-box-shadow: 0 2px 6px #d3d3d3;
-}
-
-.plugins-listing ul li:hover {
-  /*+box-shadow:inset 0px 2px 4px #B9B9B9;*/
-  box-shadow: inset 0 2px 4px #b9b9b9;
-  -moz-box-shadow: inset 0 2px 4px #b9b9b9;
-  -webkit-box-shadow: inset 0 2px 4px #b9b9b9;
-  -o-box-shadow: inset 0 2px 4px #b9b9b9;
-}
-
-.plugins-listing ul li .title {
-  display: block;
-  float: left;
-  width: 90%;
-  margin: 13px 0 7px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  font-weight: bold;
-  color: #4a5a6a;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.plugins-listing ul li .desc {
-  font-size: 13px;
-  color: #524e4e;
-}
-
-.plugins-listing ul li .icon {
-  display: block;
-  float: left;
-  width: 50px;
-  height: 50px;
-  margin: 8px 13px 13px 11px;
-}
-
-.plugins-listing ul li .icon img {
-  width: 100%;
-  height: 100%;
-}
diff --git a/ui/legacy/css/src/scss/components/project-selector.scss b/ui/legacy/css/src/scss/components/project-selector.scss
deleted file mode 100644
index 1e1901f..0000000
--- a/ui/legacy/css/src/scss/components/project-selector.scss
+++ /dev/null
@@ -1,151 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.project-selector {
-  display: inline-block;
-}
-
-.project-selector-dialog .ui-widget-content {
-  padding: 0 !important;
-}
-
-.project-selector .toolbar {
-  position: relative;
-  width: 420px;
-  border: 0;
-  border-bottom: 1px solid #93a4b4;
-  box-shadow: 0 2px #ffffff;
-  /*+box-shadow:0px 2px #FFFFFF;*/
-  background: transparent;
-  -moz-box-shadow: 0 2px #ffffff;
-  -webkit-box-shadow: 0 2px #ffffff;
-  -o-box-shadow: 0 2px #ffffff;
-  -moz-box-shadow: 0 2px 0 #ffffff;
-  -webkit-box-shadow: 0 2px 0 #ffffff;
-  -o-box-shadow: 0 2px 0 #ffffff;
-}
-
-.project-selector .search input[type='text'] {
-  /*+border-radius:3px;*/
-  float: left;
-  width: 192px;
-  height: 18px;
-  margin: 6px 0 0 105px;
-  border: 1px solid #9dadbb;
-  border-radius: 3px;
-  border-radius: 3px 3px 3px 3px;
-  box-shadow: 0 1px 1px #ffffff;
-  /*+box-shadow:0px 1px 1px #FFFFFF;*/
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-  -moz-box-shadow: 0 1px 1px #ffffff;
-  -webkit-box-shadow: 0 1px 1px #ffffff;
-  -o-box-shadow: 0 1px 1px #ffffff;
-}
-
-.project-selector .search input[type='submit'] {
-  display: block;
-  position: relative;
-  float: left;
-  top: 0;
-  left: -2px;
-  width: 25px;
-  height: 22px;
-  margin: 6px 0 0;
-  border: 0;
-  /*+placement:shift -2px 0px;*/
-  border-left: 1px solid #283979;
-  background: url('../images/sprites.png') no-repeat -601px -328px;
-  cursor: pointer;
-  cursor: pointer;
-}
-
-.project-selector .listing {
-  position: relative;
-  margin: 15px;
-  border: 1px solid #d0d0d0;
-}
-
-.project-selector .listing .data {
-  width: 100%;
-  height: 275px;
-  margin: 18px 0 0;
-  background: #f2f0f0;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.project-selector .listing .data ul {
-  font-size: 11px;
-  text-align: left;
-}
-
-.project-selector .listing .data ul li {
-  padding: 10px 0 10px 7px;
-  font-size: 12px;
-  cursor: pointer;
-}
-
-.project-selector .listing .data ul li.odd {
-  background: #dfe1e3;
-}
-
-.project-selector .listing .data ul li:hover {
-  padding: 9px 0 9px 7px;
-  border-top: 1px solid #ffffff;
-  border-bottom: 1px solid #babfd9;
-  background: #cbddf3;
-}
-
-.project-selector .listing .header {
-  position: absolute;
-  left: 0;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  width: 379px;
-  padding: 3px 2px 3px 7px;
-  border-bottom: 1px solid #ffffff;
-  background: url('../images/bg-gradients.png') repeat-x 0 -164px;
-  font-size: 11px;
-  color: #4f6171;
-  text-align: left;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.project-selector .button.cancel {
-  float: none;
-  top: -8px;
-  left: 170px;
-  width: 54px;
-  margin: auto auto 17px;
-  padding: 8px 20px;
-  border: 1px solid #aaaaaa;
-  border-radius: 4px 4px 4px 4px;
-  background: #b6b6b6 url('../images/gradients.png') repeat 0 -480px;
-  font-size: 13px;
-  font-weight: bold;
-  color: #808080;
-  color: #838181;
-  cursor: pointer;
-}
-
-.project-selector .button.cancel:hover {
-  color: #3a3a3a;
-}
diff --git a/ui/legacy/css/src/scss/components/quick-view-tooltip.scss b/ui/legacy/css/src/scss/components/quick-view-tooltip.scss
deleted file mode 100644
index b633b37..0000000
--- a/ui/legacy/css/src/scss/components/quick-view-tooltip.scss
+++ /dev/null
@@ -1,234 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.quick-view-tooltip {
-  display: inline-block;
-  width: 470px;
-  margin-left: 0;
-  padding-top: 0;
-}
-
-.quick-view-tooltip > div.title {
-  position: absolute;
-  top: 20px;
-  left: 10px;
-  width: 444px;
-  font-weight: 100;
-  color: #808080;
-}
-
-.quick-view-tooltip > div.title .icon {
-  position: relative;
-  float: right;
-  top: -2px;
-  left: -7px;
-  padding: 0 13px 0 0;
-  background: url('../images/sprites.png') no-repeat -42px -67px;
-}
-
-.quick-view-tooltip .loading-overlay {
-  opacity: 0.35;
-  /*+opacity:35%;*/
-  filter: alpha(opacity=35);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=35);
-  -moz-opacity: 0.35;
-}
-
-.quick-view-tooltip .container {
-  display: inline-block;
-  position: relative;
-  width: 471px;
-  height: auto;
-  min-height: 100px;
-  border: 1px solid #9ea2a5;
-  box-shadow: 0 7px 9px #676f76;
-  background: #ffffff;
-  /*+box-shadow:0px 7px 9px #676F76;*/
-  overflow: hidden;
-  -moz-box-shadow: 0 7px 9px #676f76;
-  -webkit-box-shadow: 0 7px 9px #676f76;
-  -o-box-shadow: 0 7px 9px #676f76;
-}
-
-/*** Quick view detail view*/
-.quick-view-tooltip .detail-view .main-groups {
-  position: absolute;
-  top: 55px;
-  width: 456px;
-  height: 170px;
-  padding-top: 7px;
-  border: 1px solid #808080;
-  border-right: 0;
-  border-left: 0;
-  box-shadow: 0 1px #e6e6e6;
-  /*+box-shadow:0px 1px #E6E6E6;*/
-  overflow: hidden;
-  -moz-box-shadow: 0 1px #e6e6e6;
-  -webkit-box-shadow: 0 1px #e6e6e6;
-  -o-box-shadow: 0 1px #e6e6e6;
-}
-
-.quick-view-tooltip .detail-view .tagger {
-  display: none;
-}
-
-.quick-view-tooltip .detail-view ul {
-  display: none !important;
-}
-
-.quick-view-tooltip .detail-view.ui-tabs div.ui-tabs-panel {
-  display: inline-block;
-  float: left;
-  width: 100% !important;
-  height: auto;
-  background-color: inherit;
-  overflow: hidden;
-}
-
-.quick-view-tooltip .detail-view .details {
-  display: inline-block;
-  height: auto;
-  padding-bottom: 224px;
-}
-
-.quick-view-tooltip .detail-view .detail-group {
-  left: -9px;
-  width: 365px;
-  margin: 0;
-  padding: 0;
-  border: 0;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group table {
-  margin: 0;
-  border: 0;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group table tr {
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group table td.name {
-  padding: 0 29px 0 5px !important;
-  font-size: 13px;
-  color: #000000 !important;
-}
-
-.quick-view-tooltip .detail-view .detail-group table td.value {
-  font-size: 12px;
-  /*+text-shadow:0px 1px #EAEAEA;*/
-  text-shadow: 0 1px #eaeaea;
-  overflow: hidden;
-  -moz-text-shadow: 0 1px #eaeaea;
-  -webkit-text-shadow: 0 1px #eaeaea;
-  -o-text-shadow: 0 1px #eaeaea;
-}
-
-.quick-view-tooltip .detail-view .detail-group table td.value input[type='text'] {
-  width: 258px;
-  height: 10px;
-  margin-left: 0;
-}
-
-.quick-view-tooltip .detail-view .detail-group .main-groups table td.value span {
-  top: 7px;
-  height: 25px;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions {
-  position: relative;
-  float: left;
-  top: 202px;
-  width: 100%;
-  height: auto;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .button {
-  top: 160px;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text {
-  display: inline-block;
-  float: left;
-  width: 112px;
-  height: 41px;
-  margin-left: 5px;
-  border: 0;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text:hover {
-  /*+box-shadow:none;*/
-  box-shadow: none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text .icon {
-  display: block;
-  float: left;
-  width: 4px;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text .label {
-  display: block;
-  float: right;
-  width: 81px;
-  font-size: 11px;
-  color: #454c53;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-indent: 0;
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text:hover .label {
-  color: #000000;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .detail-actions {
-  position: relative;
-  float: left;
-  top: 27px;
-  vertical-align: top;
-  width: 460px;
-  height: auto;
-  background: none;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions td.view-all {
-  position: relative;
-  float: left;
-  top: 26px;
-  left: 0;
-  height: 26px;
-  /*+box-shadow:inset 0px 1px #FFFFFF;*/
-  box-shadow: inset 0 1px #ffffff;
-  -moz-box-shadow: inset 0 1px #ffffff;
-  -webkit-box-shadow: inset 0 1px #ffffff;
-  -o-box-shadow: inset 0 1px #ffffff;
-}
-
-.quick-view-tooltip .detail-view .detail-actions a {
-  width: 30px;
-  background: none;
-}
diff --git a/ui/legacy/css/src/scss/components/recurring-snapshots.scss b/ui/legacy/css/src/scss/components/recurring-snapshots.scss
deleted file mode 100644
index e857fc0..0000000
--- a/ui/legacy/css/src/scss/components/recurring-snapshots.scss
+++ /dev/null
@@ -1,287 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.recurring-snapshots {
-  display: inline-block;
-}
-
-.recurring-snapshots .schedule .add-snapshot-actions {
-  float: left;
-  clear: both;
-  width: 581px;
-  margin-bottom: 13px;
-  border-top: 1px solid #ffffff;
-  font-size: 13px;
-}
-
-.recurring-snapshots .schedule .add-snapshot-action {
-  /*+placement:shift -7px -34px;*/
-  position: relative;
-  float: right;
-  top: -34px;
-  left: -7px;
-  padding: 10px;
-  cursor: pointer;
-}
-
-.recurring-snapshots .schedule .add-snapshot-action.add {
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  color: #0000ff;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.recurring-snapshots .schedule .add-snapshot-action.add:hover {
-  color: #1a85f4;
-}
-
-.recurring-snapshots .schedule p {
-  margin: 0;
-  font-size: 13px;
-}
-
-.recurring-snapshots .schedule .forms form {
-  font-size: 12px;
-  color: #4f6171;
-}
-
-.recurring-snapshots .schedule .forms form select {
-  float: left;
-  max-width: 100%;
-  margin: 3px 10px 3px 3px;
-}
-
-.recurring-snapshots .schedule .forms form input {
-  /*+placement:shift 1px 4px;*/
-  position: relative;
-  top: 4px;
-  left: 1px;
-}
-
-.recurring-snapshots .schedule .forms form label {
-  /*+placement:shift 5px 4px;*/
-  position: relative;
-  top: 4px;
-  left: 5px;
-}
-
-.recurring-snapshots .schedule .forms form label.error {
-  float: left;
-  width: 100%;
-  font-size: 10px;
-}
-
-.recurring-snapshots .schedule .forms form .field {
-  float: left;
-  width: 100%;
-  margin: 8px 0 0;
-}
-
-.recurring-snapshots .schedule .forms form .name {
-  float: left;
-  width: 72px;
-  margin: 3px 14px 0 0;
-  padding: 4px 0 0;
-  text-align: right;
-}
-
-.recurring-snapshots .schedule .forms form .value {
-  float: left;
-  width: 470px;
-  text-align: left;
-}
-
-.ui-dialog .recurring-snapshots .ui-widget-content {
-  margin: 0;
-  padding: 0;
-}
-
-.recurring-snapshots .ui-button {
-  /*+placement:anchor-bottom-right 9px 9px;*/
-  position: absolute;
-  right: 9px;
-  bottom: 9px;
-}
-
-.recurring-snapshots .scheduled-snapshots {
-  position: relative;
-  clear: both;
-  top: -26px;
-}
-
-.recurring-snapshots .scheduled-snapshots p {
-  font-size: 12px;
-  font-weight: bold;
-  /*+text-shadow:0px 2px 2px #FFFFFF;*/
-  text-shadow: 0 2px 2px #ffffff;
-  -moz-text-shadow: 0 2px 2px #ffffff;
-  -webkit-text-shadow: 0 2px 2px #ffffff;
-  -o-text-shadow: 0 2px 2px #ffffff;
-}
-
-.recurring-snapshots .scheduled-snapshots table {
-  position: relative;
-  /*+placement:shift 0px -14px;*/
-  top: -14px;
-  width: 100%;
-  margin: 0;
-  border: 0;
-}
-
-.recurring-snapshots .scheduled-snapshots table td.actions div.action span.icon {
-  /*+placement:shift -3px -4px;*/
-  position: relative;
-  top: -4px;
-  left: -3px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr {
-  display: block;
-  display: none;
-  width: 100%;
-  height: 38px;
-  margin: 22px 0 0;
-  padding: 0;
-  border: 0;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td {
-  padding: 5px 0 0 14px;
-  border: 0;
-  font-size: 12px;
-  word-break: keep-all;
-  word-wrap: normal;
-  text-indent: 0;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.keep {
-  min-width: 60px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.timezone {
-  min-width: 168px;
-  font-size: 12px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.timezone span {
-  font-size: 10px;
-}
-
-.recurring-snapshots .scheduled-snapshots table tbody tr td.actions {
-  min-width: 22px !important;
-  max-width: 22px !important;
-}
-
-.recurring-snapshots .scheduled-snapshots tr td.time {
-  min-width: 144px;
-  background: url('../images/sprites.png') no-repeat -536px -533px;
-  text-indent: 0.7em;
-}
-
-.recurring-snapshots .scheduled-snapshots tr.daily td.time {
-  background-position: -537px -569px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr.weekly td.time {
-  background-position: -537px -605px;
-}
-
-.recurring-snapshots .scheduled-snapshots tr.monthly td.time {
-  background-position: -537px -648px;
-}
-
-.recurring-snapshots p {
-  display: block;
-  max-width: 550px;
-  margin-bottom: 16px;
-  padding: 0 47px 0 0;
-  font-size: 14px;
-  line-height: 18px;
-  /*+text-shadow:0px 3px 3px #FFFFFF;*/
-  color: #475765;
-  text-align: left;
-  text-shadow: 0 3px 3px #ffffff;
-  -moz-text-shadow: 0 3px 3px #ffffff;
-  -webkit-text-shadow: 0 3px 3px #ffffff;
-  -o-text-shadow: 0 3px 3px #ffffff;
-}
-
-.recurring-snapshots .ui-tabs ul {
-  display: block;
-  position: relative;
-  width: 100%;
-  margin: 0;
-  margin: 0;
-  padding: 0;
-}
-
-.recurring-snapshots .ui-tabs ul li a {
-  width: 76px;
-  background: url('../images/sprites.png') no-repeat -521px -533px;
-}
-
-.recurring-snapshots .ui-tabs ul li.disabled a {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-.recurring-snapshots .ui-tabs ul li.disabled:hover a {
-  border: 0;
-  border: 0;
-  box-shadow: 0 0;
-  /*+box-shadow:0px 0px;*/
-  background-color: transparent;
-  cursor: default;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 none;
-  -webkit-box-shadow: 0 0 none;
-  -o-box-shadow: 0 0 none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.recurring-snapshots .ui-tabs ul li.daily a {
-  background-position: -522px -570px;
-}
-
-.recurring-snapshots .ui-tabs ul li.weekly a {
-  background-position: -526px -605px;
-}
-
-.recurring-snapshots .ui-tabs ul li.monthly a {
-  background-position: -528px -649px;
-}
-
-.recurring-snapshots .ui-tabs div.ui-tabs-panel {
-  width: 100%;
-  height: 144px;
-  border: 0;
-  background: #e9e9e9;
-}
-
-.recurring-snapshots .ui-tabs div.ui-tabs-panel.ui-tabs-hide {
-  display: none;
-}
diff --git a/ui/legacy/css/src/scss/components/region-switcher.scss b/ui/legacy/css/src/scss/components/region-switcher.scss
deleted file mode 100644
index 1b309ec..0000000
--- a/ui/legacy/css/src/scss/components/region-switcher.scss
+++ /dev/null
@@ -1,187 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.region-switcher {
-  display: inline-block;
-  position: relative;
-  /*+border-radius:4px;*/
-  position: relative;
-  float: left;
-  top: 1px;
-  left: 27px;
-  height: 28px;
-  margin: 5px 13px 0 0;
-  border-radius: 4px;
-  cursor: pointer;
-  /*+placement:shift 27px 1px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.region-selector {
-  /*+border-radius:4px;*/
-  position: relative;
-  position: absolute;
-  z-index: $z-index-region-selector;
-  top: 49px;
-  left: 185px;
-  width: 318px;
-  height: 372px;
-  /*+placement:shift 185px 49px;*/
-  border-radius: 4px;
-  background: url('../images/bg-notifications.png') center;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.region-selector h2 {
-  margin: 31px 0 14px;
-  font-size: 21px;
-  letter-spacing: 1px;
-  color: #ffffff;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-align: center;
-  text-shadow: 0 1px 2px #000000;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.region-selector .buttons {
-  width: 95%;
-  height: 33px;
-  margin: 5px auto 0;
-}
-
-.region-selector .buttons .button.close {
-  float: right;
-  margin-right: 10px;
-  padding: 8px;
-  border-bottom: 1px solid #232323;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: url('../images/gradients.png') 0 -317px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.region-selector .buttons .button.close:hover {
-  /*+box-shadow:inset 0px 2px 4px #525252;*/
-  box-shadow: inset 0 2px 4px #525252;
-  -moz-box-shadow: inset 0 2px 4px #525252;
-  -webkit-box-shadow: inset 0 2px 4px #525252;
-  -o-box-shadow: inset 0 2px 4px #525252;
-}
-
-.region-selector .buttons .button.close span {
-  font-weight: bold;
-  letter-spacing: 1px;
-  color: #ffffff;
-  /*+text-shadow:0px 1px 2px #000000;*/
-  text-shadow: 0 1px 2px #000000;
-  -moz-text-shadow: 0 1px 2px #000000;
-  -webkit-text-shadow: 0 1px 2px #000000;
-  -o-text-shadow: 0 1px 2px #000000;
-}
-
-.region-selector ul {
-  width: 94%;
-  height: 237px;
-  /*+border-radius:4px;*/
-  margin: auto;
-  border: 1px solid #b7b7b7;
-  border-radius: 4px;
-  box-shadow: inset 0 0 8px #a3a3a3;
-  background: #ffffff;
-  overflow: auto;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:inset 0px 0px 8px #A3A3A3;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: inset 0 0 8px #a3a3a3;
-  -webkit-box-shadow: inset 0 0 8px #a3a3a3;
-  -o-box-shadow: inset 0 0 8px #a3a3a3;
-}
-
-.region-selector ul li {
-  width: 100%;
-  padding: 15px 0;
-  border-bottom: 1px solid #cacaca;
-  /*+text-shadow:none;*/
-  background: none;
-  font-size: 13px;
-  color: #415c72;
-  text-indent: 14px;
-  text-shadow: none;
-  cursor: pointer;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-.region-selector ul li:hover,
-.region-selector ul li.active {
-  background: #e9e9e9 url('../images/bg-gradients.png') repeat-x 0 -31px;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-.region-switcher .icon {
-  display: inline-block;
-  display: block;
-  position: absolute;
-  float: left;
-  width: 26px;
-  height: 26px;
-  background: url('../images/sprites.png') -15px -1313px;
-}
-
-.region-switcher .title {
-  display: inline-block;
-  position: relative;
-  float: right;
-  top: 0;
-  left: -1px;
-  max-width: 285px;
-  padding: 9px 9px 0 34px;
-  font-size: 13px;
-  font-weight: 100;
-  /*+placement:shift -1px 0px;*/
-  white-space: nowrap;
-  color: #ffffff;
-  overflow: hidden;
-}
-
-.region-switcher:hover,
-.region-switcher.active {
-  /*+box-shadow:inset 0px 1px 5px #000000;*/
-  box-shadow: inset 0 1px 5px #000000;
-  -moz-box-shadow: inset 0 1px 5px #000000;
-  -webkit-box-shadow: inset 0 1px 5px #000000;
-  -o-box-shadow: inset 0 1px 5px #000000;
-}
-
-.region-switcher:hover .icon,
-.region-switcher.active .icon {
-  background-position: -70px -1311px;
-}
diff --git a/ui/legacy/css/src/scss/components/section-switcher.scss b/ui/legacy/css/src/scss/components/section-switcher.scss
deleted file mode 100644
index acd5cdc..0000000
--- a/ui/legacy/css/src/scss/components/section-switcher.scss
+++ /dev/null
@@ -1,137 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-
-div.panel div.toolbar div.section-switcher {
-  float: left;
-  margin-top: 6px;
-  margin-left: 10px;
-}
-
-#browser div.panel.maximize-if-selected.selected div.toolbar div.panel-controls div.control {
-  display: none;
-}
-
-div.toolbar div.section-switcher div.section-select {
-  float: right;
-  font-size: 12px;
-  font-weight: 100;
-}
-
-div.list-view div.toolbar div.section-switcher div.section-select label {
-  margin: 0 9px 0 0;
-}
-
-div.toolbar div.section-switcher div.section {
-  float: left;
-  border-radius: 10px;
-  border-radius: 10px 10px 10px 10px;
-  /*+border-radius:10px;*/
-  font-size: 11px;
-  font-weight: bold;
-  text-shadow: 0 1px 1px #ededed;
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  /*+text-shadow:0px 1px 1px #EDEDED;*/
-  -khtml-border-radius: 10px;
-  -moz-text-shadow: 0 1px 1px #ededed;
-  -webkit-text-shadow: 0 1px 1px #ededed;
-  -o-text-shadow: 0 1px 1px #ededed;
-}
-
-div.toolbar div.section-switcher div.section a {
-  display: block;
-  padding: 5px 10px 3px;
-  border: 1px solid #979fa4;
-  background: url('../images/bg-section-switcher.png') repeat-x 0 -22px;
-  color: #516374;
-  text-decoration: none;
-}
-
-div.toolbar div.section-switcher div.section a.active {
-  padding-top: 6px;
-  padding-bottom: 2px;
-  border: 0;
-  border-bottom: 1px solid #ccd1d4;
-  box-shadow: inset 0 1px 5px #546874;
-  background: url('../images/bg-section-switcher.png') repeat-x 0 -21px;
-  /*+box-shadow:inset 0px 1px 5px #546874;*/
-  background-position: 0 0;
-  -moz-box-shadow: inset 0 1px 5px #546874;
-  -webkit-box-shadow: inset 0 1px 5px #546874;
-  -o-box-shadow: inset 0 1px 5px #546874;
-}
-
-div.toolbar div.section-switcher div.section.first a {
-  /*+border-radius:4px 0 0 5px;*/
-  border-radius: 4px 0 0 5px;
-  -moz-border-radius: 4px 0 0 5px;
-  -webkit-border-radius: 4px 0 0 5px;
-  -khtml-border-radius: 4px 0 0 5px;
-}
-
-div.toolbar div.section-switcher div.section.last a {
-  /*+border-radius:0 4px 4px 0px;*/
-  border-radius: 0 4px 4px 0;
-  -moz-border-radius: 0 4px 4px 0;
-  -webkit-border-radius: 0 4px 4px 0;
-  -khtml-border-radius: 0 4px 4px 0;
-}
-
-div.toolbar div.section-switcher div.section.first.last a {
-  /*+border-radius:5px;*/
-  border-radius: 5px;
-  border-radius: 5px 5px 5px 5px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-div.toolbar div.section-switcher div.section-select {
-  float: left;
-  height: 26px;
-}
-
-.project-view div.toolbar div.section-switcher div.section-select {
-  background: transparent;
-}
-
-div.toolbar div.section-switcher div.section-select select {
-  height: 21px;
-  margin-right: 13px;
-  border: 1px solid #808080;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-div.toolbar div.section-switcher div.section-select label {
-  margin: 0 9px 0 0;
-}
-
-.project-view div.list-view div.toolbar div.section-switcher div.section-select label {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
diff --git a/ui/legacy/css/src/scss/components/system-chart.scss b/ui/legacy/css/src/scss/components/system-chart.scss
deleted file mode 100644
index 1de6e2c..0000000
--- a/ui/legacy/css/src/scss/components/system-chart.scss
+++ /dev/null
@@ -1,359 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.system-chart {
-  width: 100%;
-  height: 100%;
-  overflow: auto;
-  overflow-x: hidden;
-}
-
-.system-chart ul.resources li {
-  position: absolute;
-  width: 100px;
-  height: 60px;
-  border: 1px solid #99a0a5;
-  border-radius: 4px;
-  border-radius: 4px 4px 4px 4px;
-  /*+border-radius:4px;*/
-  box-shadow: 0 0 2px #a6a6a6;
-  background: transparent url('../images/bg-gradients.png') repeat-x 0 -1340px;
-  text-align: left;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 0px 2px #A6A6A6;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 0 2px #a6a6a6;
-  -webkit-box-shadow: 0 0 2px #a6a6a6;
-  -o-box-shadow: 0 0 2px #a6a6a6;
-}
-
-.system-chart ul.resources li .button.view-all {
-  position: relative;
-  position: absolute;
-  top: 34px;
-  /*+placement:shift 32px 34px;*/
-  left: 32px;
-  width: 65px;
-  height: 25px;
-  background: url('../images/buttons.png') no-repeat -458px -504px;
-}
-
-.system-chart ul.resources li .button.view-all:hover {
-  background-position: -537px -504px;
-}
-
-.system-chart ul.resources li .button.view-all .view-all-label {
-  position: relative;
-  top: 0;
-  /*+text-shadow:0px -1px 1px #000000;*/
-  left: 9px;
-  font-size: 11px;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #000000;
-  /*+placement:shift 9px 0px;*/
-  -moz-text-shadow: 0 -1px 1px #000000;
-  -webkit-text-shadow: 0 -1px 1px #000000;
-  -o-text-shadow: 0 -1px 1px #000000;
-}
-
-.system-chart ul.resources li .label {
-  position: relative;
-  position: absolute;
-  top: 3px;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  left: 3px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #5c7485;
-  /*+placement:shift 3px 3px;*/
-  text-shadow: 0 1px #ffffff;
-  -moz-text-shadow: 0 1px #ffffff;
-  -webkit-text-shadow: 0 1px #ffffff;
-  -o-text-shadow: 0 1px #ffffff;
-}
-
-/** Resources*/
-.system-chart.dashboard.admin {
-  width: 97%;
-  height: 96%;
-  background: transparent;
-}
-
-.system-chart.dashboard.admin .dashboard-container {
-  width: 930px;
-  border: 0;
-}
-
-.system-chart.dashboard.admin .dashboard-container .top {
-  background: transparent;
-}
-
-.system-chart.dashboard.admin .dashboard-container .top .title {
-  color: #55687a;
-}
-
-.system-chart.dashboard.admin .dashboard-container .top .title span {
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  -o-text-shadow: 0 0 #ffffff;
-}
-
-.system-chart.dashboard.admin .dashboard-container .stats .chart {
-  width: 300px;
-}
-
-/** Compute*/
-.system-chart.compute {
-  background: url('../images/bg-system-chart-compute.png') no-repeat center;
-}
-
-/*** Compute resources*/
-.system-chart.compute ul.resources {
-  position: relative;
-  width: 98%;
-  height: 97%;
-  margin: 0;
-}
-
-.system-chart.compute ul.resources li.zone {
-  left: 196px;
-}
-
-.system-chart.compute ul.resources li.zone .label {
-  top: 20px;
-  left: 0;
-  width: 100%;
-  font-size: 14px;
-  text-align: center;
-}
-
-.system-chart.compute ul.resources li.pods {
-  top: 112px;
-  left: 299px;
-}
-
-.system-chart.compute ul.resources li.clusters {
-  top: 189px;
-  left: 396px;
-}
-
-.system-chart.compute ul.resources li.hosts {
-  top: 265px;
-  left: 507px;
-}
-
-.system-chart.compute ul.resources li.primaryStorage {
-  top: 375px;
-  left: 507px;
-}
-
-.system-chart.compute ul.resources li.secondaryStorage {
-  top: 497px;
-  left: 299px;
-}
-
-.system-chart.compute ul.resources li.ucs {
-  top: 406px;
-  left: 299px;
-}
-
-/** Network*/
-.system-chart.network .network-switch-icon {
-  position: relative;
-  position: absolute;
-  z-index: $z-index-system-chart2;
-  top: 76px;
-  left: 187px;
-  /*+box-shadow:0px 0px 2px #A4A4A4;*/
-  padding: 8px 7px;
-  border: 1px solid #cdcdcd;
-  border-top: 2px solid #ffffff;
-  border-radius: 2px;
-  /*+border-radius:2px;*/
-  border-radius: 2px 2px 2px 2px;
-  box-shadow: 0 0 2px #a4a4a4;
-  background: url('../images/bg-gradients.png') repeat-x 0 -38px;
-  font-weight: bold;
-  color: #506980;
-  -moz-box-shadow: 0 0 2px #a4a4a4;
-  /*+placement:shift 187px 76px;*/
-  -webkit-box-shadow: 0 0 2px #a4a4a4;
-  -o-box-shadow: 0 0 2px #a4a4a4;
-  -moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  -khtml-border-radius: 2px;
-}
-
-.system-chart.network .base-circle-icon {
-  position: relative;
-  position: absolute;
-  z-index: $z-index-circle-icon;
-  /*+placement:shift 227px 557px;*/
-  top: 557px;
-  left: 227px;
-  width: 35px;
-  height: 34px;
-  background: url('../images/bg-system-network-traffic.png') 0 -853px;
-}
-
-.system-chart.network ul.resources {
-  position: absolute;
-  z-index: $z-index-system-chart1;
-  width: 100%;
-  height: 98%;
-}
-
-.system-chart.network ul.resources li {
-  border: 0;
-  /*+box-shadow:0px 0px;*/
-  border-radius: 0;
-  border-radius: 0 0 0 0;
-  box-shadow: 0 0;
-  background: transparent;
-  -moz-box-shadow: 0 0;
-  -webkit-box-shadow: 0 0;
-  -o-box-shadow: 0 0;
-  -moz-box-shadow: 0 0 none;
-  -webkit-box-shadow: 0 0 none;
-  -o-box-shadow: 0 0 none;
-  -moz-box-shadow: none;
-  /*+border-radius:0px;*/
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-  -khtml-border-radius: 0;
-}
-
-.system-chart.network ul.resources li .view-all {
-  /*+placement:shift 19px 21px;*/
-  position: relative;
-  top: 21px;
-  left: 19px;
-}
-
-.system-chart.network ul.resources li.public {
-  /*+placement:shift 356px 23px;*/
-  position: relative;
-  position: absolute;
-  top: 23px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.guest {
-  /*+placement:shift 356px 155px;*/
-  position: relative;
-  position: absolute;
-  top: 155px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.management {
-  /*+placement:shift 356px 242px;*/
-  position: relative;
-  position: absolute;
-  top: 242px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.storage {
-  /*+placement:shift 356px 333px;*/
-  position: relative;
-  position: absolute;
-  top: 333px;
-  left: 356px;
-}
-
-.system-chart.network ul.resources li.providers {
-  /*+placement:shift 248px 427px;*/
-  position: relative;
-  position: absolute;
-  top: 427px;
-  left: 248px;
-  width: 258px;
-  height: 77px;
-  background: url('../images/bg-system-network-traffic.png') no-repeat -50px -848px;
-}
-
-.system-chart.network ul.resources li.providers span {
-  /*+placement:shift 99px 5px;*/
-  position: relative;
-  position: absolute;
-  top: 5px;
-  left: 99px;
-  font-size: 12px;
-}
-
-.system-chart.network ul.resources li.providers .view-all {
-  /*+placement:shift 186px 48px;*/
-  position: relative;
-  position: absolute;
-  top: 48px;
-  left: 186px;
-}
-
-.system-chart.network .system-network-chart {
-  position: relative;
-  z-index: $z-index-standard;
-  width: 100%;
-  height: 100%;
-}
-
-.system-chart.network .system-network-chart .network-chart-item {
-  width: 213px;
-  height: 539px;
-  background: url('../images/bg-system-network-traffic.png') no-repeat;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.public {
-  position: relative;
-  /*+placement:shift 245px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 245px;
-  background-position: -793px -1px;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.management {
-  position: relative;
-  /*+placement:shift 239px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 239px;
-  background-position: -273px 12px;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.storage {
-  position: relative;
-  /*+placement:shift 231px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 231px;
-  background-position: -523px 12px;
-}
-
-.system-chart.network .system-network-chart .network-chart-item.guest {
-  position: relative;
-  /*+placement:shift 251px 20px;*/
-  position: absolute;
-  top: 20px;
-  left: 251px;
-  background-position: -43px 12px;
-}
diff --git a/ui/legacy/css/src/scss/components/tagger.scss b/ui/legacy/css/src/scss/components/tagger.scss
deleted file mode 100644
index f9fa169..0000000
--- a/ui/legacy/css/src/scss/components/tagger.scss
+++ /dev/null
@@ -1,258 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.tagger {
-  position: relative;
-  top: 0;
-  left: -4px;
-  width: 94%;
-  margin: auto;
-  /*+placement:shift -4px 0px;*/
-  padding-bottom: 12px;
-  border: 1px solid #cfc9c9;
-  background: #f2f0f0;
-}
-
-.tagger .field {
-  position: relative;
-  float: left;
-  width: 35%;
-}
-
-.tagger .tag-info {
-  margin-top: 12px;
-  margin-left: 8px;
-  font-size: 11px;
-  color: #757575;
-}
-
-.tagger .tag-info.title {
-  margin-bottom: 5px;
-  font-size: 11px;
-  color: #6f9bf0;
-}
-
-.tagger form {
-  margin: 12px 9px 0;
-}
-
-.tagger.readonly form {
-  display: none;
-}
-
-.tagger form label {
-  display: block;
-  position: relative;
-  float: left;
-  top: 8px;
-  left: 5px;
-  width: 25px;
-  margin-right: 9px;
-  /*+placement:shift 5px 8px;*/
-  font-size: 10px;
-  color: #394552;
-  text-align: right;
-}
-
-.tagger form label.error {
-  position: absolute;
-  top: 28px !important;
-  left: 44px;
-  color: #ff0000;
-  /*[empty]background-color:;*/
-}
-
-.tagger form input {
-  padding: 4px;
-  border: 1px solid #808080;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.tagger form input {
-  width: 45%;
-  margin-left: 9px;
-}
-
-.tagger form input[type='submit'] {
-  width: auto;
-  margin-left: 16px;
-  padding: 7px 25px 7px 26px;
-  /*+text-shadow:0px -1px 2px #000000;*/
-  border: 0;
-  border-radius: 4px;
-  background: url('../images/bg-gradients.png') repeat-x 0 -220px;
-  color: #ffffff;
-  text-shadow: 0 -1px 2px #000000;
-  /*+border-radius:4px;*/
-  cursor: pointer;
-  -moz-text-shadow: 0 -1px 2px #000000;
-  -webkit-text-shadow: 0 -1px 2px #000000;
-  -o-text-shadow: 0 -1px 2px #000000;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.tagger form input[type='submit']:hover {
-  background-position: 0 -946px;
-}
-
-.tagger ul {
-  display: block;
-  width: 96%;
-  margin: 16px auto auto;
-  /*+border-radius:2px;*/
-  padding-bottom: 10px;
-  border: 1px solid #d2d2d2;
-  border-radius: 2px;
-  box-shadow: inset 0 0 10px #dcdcdc;
-  background: #ffffff;
-  overflow: auto;
-  -moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  /*+box-shadow:inset 0px 0px 10px #DCDCDC;*/
-  -khtml-border-radius: 2px;
-  -moz-box-shadow: inset 0 0 10px #dcdcdc;
-  -webkit-box-shadow: inset 0 0 10px #dcdcdc;
-  -o-box-shadow: inset 0 0 10px #dcdcdc;
-}
-
-.tagger ul li {
-  display: inline-block;
-  position: relative;
-  float: left;
-  top: 2px;
-  left: 0;
-  height: 15px;
-  margin-top: 5px;
-  margin-right: 2px;
-  /*+border-radius:4px;*/
-  margin-left: 7px;
-  padding: 0 18px 0 7px;
-  border-radius: 4px;
-  background: #dfdfdf 0 4px;
-  /*+placement:shift 0px 2px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.tagger ul li span {
-  color: #000000;
-}
-
-.tagger ul li span.label span.value {
-  max-width: 100px;
-  overflow: hidden;
-}
-
-.tagger ul li span.label {
-  position: relative;
-  top: -2px;
-  left: 15px;
-  font-size: 10px;
-}
-
-.tagger.readonly ul li span.label {
-  left: 6px;
-}
-
-.tagger ul li span.label > span {
-  display: block;
-  float: left;
-  margin-top: 2px;
-}
-
-.tagger ul li span.label > span.key {
-  max-width: 134px;
-  margin-right: 5px;
-  margin-left: 15px;
-  font-weight: bold;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.tagger ul li span.label > span.value {
-  max-width: 160px;
-  margin-left: 6px;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.tagger ul li span.remove {
-  display: block;
-  position: absolute !important;
-  top: 0 !important;
-  left: -3px !important;
-  width: 15px !important;
-  height: 11px !important;
-  padding: 4px 0 0 8px;
-  background: #dfdfdf;
-  font-size: 8px;
-  font-weight: bold;
-  color: #5b5b5b;
-  text-indent: 4px;
-  cursor: pointer;
-  overflow: hidden !important;
-}
-
-.tagger.readonly ul li span.remove {
-  display: none;
-}
-
-.tagger ul li span.remove:hover {
-  color: #000000;
-}
-
-/** Dialog tagger*/
-.ui-dialog .tagger {
-  width: 375px;
-}
-
-.ui-dialog .tagger .tag-info {
-  display: none;
-}
-
-.ui-dialog.editTags .ui-button {
-  float: right;
-}
-
-.ui-dialog.editTags .ui-dialog-buttonpane {
-  float: right;
-}
-
-.ui-dialog .tagger .field {
-  width: 119px !important;
-}
-
-.ui-dialog .tagger input.key,
-.ui-dialog .tagger input.value {
-  width: 66px !important;
-  height: 15px;
-  font-size: 11px !important;
-}
-
-.ui-dialog .tagger input[type='submit'] {
-  padding: 6px 15px;
-}
diff --git a/ui/legacy/css/src/scss/components/token-input-facebook.scss b/ui/legacy/css/src/scss/components/token-input-facebook.scss
deleted file mode 100644
index 563ca7b..0000000
--- a/ui/legacy/css/src/scss/components/token-input-facebook.scss
+++ /dev/null
@@ -1,131 +0,0 @@
-// jQuery Plugin: Tokenizing Autocomplete Text Entry
-// Version 1.6.0
-// 
-// Copyright (c) 2009 James Smith (http://loopj.com)
-// Licensed jointly under the GPL and MIT licenses,
-// choose which one suits your project best!
-
-// Example tokeninput style #2: Facebook style
-
-ul.token-input-list-facebook {
-  z-index: $z-index-facebook;
-  clear: left;
-  width: 233px;
-  height: auto !important;
-  height: 1%;
-  min-height: 1px;
-  margin: 0;
-  padding: 0;
-  border: 1px solid #afafaf;
-  background-color: #f6f6f6;
-  font-family: Verdana;
-  font-size: 12px;
-  list-style-type: none;
-  cursor: text;
-  overflow: hidden;
-}
-
-ul.token-input-list-facebook li input {
-  width: 100px;
-  margin: 2px 0;
-  padding: 3px 8px;
-  border: 0;
-  background-color: #ffffff;
-  -webkit-appearance: caret;
-}
-
-li.token-input-token-facebook {
-  float: left;
-  height: auto !important;
-  height: 15px;
-  margin: 3px;
-  padding: 1px 3px;
-  border: 1px solid #ccd5e4;
-  border-radius: 5px;
-  background-color: #eff2f7;
-  font-size: 11px;
-  white-space: nowrap;
-  color: #000000;
-  cursor: default;
-  overflow: hidden;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-}
-
-li.token-input-token-facebook p {
-  display: inline;
-  margin: 0;
-  padding: 0;
-}
-
-li.token-input-token-facebook span {
-  margin-left: 5px;
-  font-weight: bold;
-  color: #a6b3cf;
-  cursor: pointer;
-}
-
-li.token-input-selected-token-facebook {
-  border: 1px solid #3b5998;
-  background-color: #5670a6;
-  color: #ffffff;
-}
-
-li.token-input-input-token-facebook {
-  float: left;
-  margin: 0;
-  padding: 0;
-  list-style-type: none;
-}
-
-div.token-input-dropdown-facebook {
-  position: absolute;
-  z-index: $z-index-facebook;
-  width: 233px;
-  border-right: 1px solid #cccccc;
-  border-bottom: 1px solid #cccccc;
-  border-left: 1px solid #cccccc;
-  background-color: #ffffff;
-  font-family: Verdana;
-  font-size: 11px;
-  cursor: default;
-  overflow: hidden;
-}
-
-div.token-input-dropdown-facebook p {
-  width: 233px;
-  margin: 0;
-  padding: 5px;
-  font-weight: bold;
-  color: #777777;
-}
-
-div.token-input-dropdown-facebook ul {
-  margin: 0;
-  padding: 0;
-}
-
-div.token-input-dropdown-facebook ul li {
-  margin: 0;
-  padding: 3px;
-  background-color: #ffffff;
-  list-style-type: none;
-}
-
-div.token-input-dropdown-facebook ul li.token-input-dropdown-item-facebook {
-  background-color: #ffffff;
-}
-
-div.token-input-dropdown-facebook ul li.token-input-dropdown-item2-facebook {
-  background-color: #ffffff;
-}
-
-div.token-input-dropdown-facebook ul li em {
-  font-weight: bold;
-  font-style: normal;
-}
-
-div.token-input-dropdown-facebook ul li.token-input-selected-dropdown-item-facebook {
-  background-color: #3b5998;
-  color: #ffffff;
-}
diff --git a/ui/legacy/css/src/scss/components/toolbar.scss b/ui/legacy/css/src/scss/components/toolbar.scss
deleted file mode 100644
index 19ab052..0000000
--- a/ui/legacy/css/src/scss/components/toolbar.scss
+++ /dev/null
@@ -1,230 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.toolbar {
-  position: relative;
-  position: absolute;
-  /*+box-shadow:0px 1px 4px #CFCFCF;*/
-  z-index: $z-index-toolbar;
-  top: -1px;
-  top: 0;
-  left: 0;
-  /*+placement:shift 0px -1px;*/
-  width: 100%;
-  height: 32px;
-  box-shadow: 0 1px 4px #cfcfcf;
-  background: #ececec 0 -6px;
-  -moz-box-shadow: 0 1px 4px #cfcfcf;
-  -webkit-box-shadow: 0 1px 4px #cfcfcf;
-  -o-box-shadow: 0 1px 4px #cfcfcf;
-}
-
-.detail-view .ui-tabs-panel div.toolbar {
-  width: 968px;
-  margin-top: 8px;
-  border: 0;
-  background: transparent;
-}
-
-.project-view div.toolbar {
-  background: #808080 url('../images/bg-nav-item-active-project-view.png') 0 -210px;
-}
-
-div.toolbar div.filters {
-  margin: 5px 0 0 12px;
-}
-
-div.toolbar div.filters label {
-  display: block;
-  float: left;
-  padding: 5px 11px 0 0;
-  font-size: 12px;
-  font-weight: 100;
-  color: #3f3b3b;
-}
-
-.project-view div.toolbar div.filters label {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  text-shadow: 0 1px 1px #000000;
-  -moz-text-shadow: 0 1px 1px #000000;
-  -webkit-text-shadow: 0 1px 1px #000000;
-  -o-text-shadow: 0 1px 1px #000000;
-}
-
-div.toolbar div.filters select {
-  width: 142px;
-  border: 1px solid #808080;
-}
-
-div.toolbar div.text-search {
-  position: relative;
-  float: right;
-}
-
-div.toolbar div.text-search div.search-bar {
-  position: relative;
-  z-index: $z-index-search;
-  float: left;
-  width: 141px;
-  height: 20px;
-  margin: 5px 0 0 12px;
-  border: 1px solid #8b7e7e;
-  border-right: 1px solid #8b8989;
-  border-radius: 4px 0 0 4px;
-  /*+border-radius:4px 0 0 4px;*/
-  background: #ffffff;
-  -moz-border-radius: 4px 0 0 4px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -khtml-border-radius: 4px 0 0 4px;
-}
-
-div.toolbar div.text-search div.search-bar input {
-  float: left;
-  width: 90%;
-  height: 68%;
-  margin: 1px 0 0;
-  border: 0;
-}
-
-div.toolbar div.text-search div.search-bar div.filter {
-  float: left;
-  width: 74px;
-  height: 15px;
-  margin: 2px 0 0;
-  padding: 1px;
-  border-left: 1px solid #6d6d6d;
-  background: #ffffff;
-  font-size: 12px;
-  text-align: center;
-}
-
-div.toolbar div.button.search {
-  position: relative;
-  z-index: $z-index-system-chart2;
-  top: 5px;
-  /*+placement:shift -10px 5px;*/
-  left: -10px;
-  width: 33px;
-  height: 22px;
-  background: url('../images/sprites.png') no-repeat -592px -328px;
-  cursor: pointer;
-}
-
-div.toolbar div.button.search:hover {
-  background-position: -592px -359px;
-}
-
-div.toolbar div.button.add,
-div.toolbar div.button.refresh,
-div.toolbar div.button.add,
-div.toolbar div.button.main-action,
-.toolbar div.button.header-action,
-.detail-group .button.add {
-  /*+placement:shift 0px 5px;*/
-  position: relative;
-  float: right;
-  top: 5px;
-  left: 0;
-  height: 12px;
-  margin: 0 10px 0 0;
-  padding: 5px 5px 5px 5px;
-  border: 1px solid #b7b7b7;
-  border-radius: 4px;
-  /*+text-shadow:0px 1px 1px #DEE5EA;*/
-  border-radius: 4px 4px 4px 4px;
-  background: #eaeaea;
-  background: #f7f7f7;
-  background: rgb(247, 247, 247);
-  background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlYWVhZWEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+');
-  background: -moz-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(247, 247, 247, 1)), color-stop(100%, rgba(234, 234, 234, 1)));
-  background: -webkit-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: -o-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: -ms-linear-gradient(top, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  background: linear-gradient(to bottom, rgba(247, 247, 247, 1) 1%, rgba(234, 234, 234, 1) 100%);
-  font-size: 12px;
-  font-weight: 100;
-  color: #000000;
-  text-shadow: 0 1px 1px #dee5ea;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #dee5ea;
-  /*+border-radius:4px;*/
-  -webkit-text-shadow: 0 1px 1px #dee5ea;
-  -o-text-shadow: 0 1px 1px #dee5ea;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#eaeaea', GradientType=0);
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-div.toolbar div.button.export:hover,
-div.toolbar div.button.add:hover,
-div.toolbar div.button.refresh:hover,
-div.toolbar div.button.main-action:hover,
-.toolbar div.button.header-action:hover,
-.detail-group .button.add:hover {
-  box-shadow: inset 0 0 5px #c3c3c3;
-  /*+box-shadow:inset 0px 0px 5px #C3C3C3;*/
-  background: #e5e5e5;
-  -moz-box-shadow: inset 0 0 5px #c3c3c3;
-  -webkit-box-shadow: inset 0 0 5px #c3c3c3;
-  -o-box-shadow: inset 0 0 5px #c3c3c3;
-}
-
-div.toolbar div.button.main-action span.icon {
-  display: block;
-  position: relative;
-  float: left;
-  top: -7px;
-  left: 0;
-  width: 34px;
-  /*+placement:shift 0px -7px;*/
-  height: 20px;
-  background-image: url('../images/sprites.png');
-  cursor: pointer;
-}
-
-div.toolbar div.button.refresh {
-  float: right;
-  margin: 0 20px 0 0;
-}
-
-div.toolbar div.button.refresh span {
-  padding: 1px 1px 1px 16px;
-  background-image: url('../images/icons.png');
-  background-repeat: no-repeat;
-  background-position: -629px -232px;
-}
-
-div.toolbar div.button.add span,
-.detail-group .button.add span.icon {
-  position: relative;
-  top: 0;
-  /*+placement:shift 0px 0px;*/
-  left: 0;
-  padding: 0 0 3px 18px;
-  background: url('../images/icons.png') no-repeat -626px -209px;
-}
-
-#browser div.panel.selected div.toolbar {
-  border-right: 1px solid #43586b;
-}
-
-#browser div.panel div.detail-view .toolbar {
-  width: 100%;
-}
diff --git a/ui/legacy/css/src/scss/components/tooltip-box.scss b/ui/legacy/css/src/scss/components/tooltip-box.scss
deleted file mode 100644
index 1385d9a..0000000
--- a/ui/legacy/css/src/scss/components/tooltip-box.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.tooltip-box {
-  display: inline-block;
-  width: 15%;
-  height: auto;
-  margin-left: 23px;
-  padding: 4px;
-  padding: 10px;
-  border: 1px solid #beb8b8;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  box-shadow: 0 1px 12px #353535;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 1px 12px #353535;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 1px 12px #353535;
-  -webkit-box-shadow: 0 1px 12px #353535;
-  -o-box-shadow: 0 1px 12px #353535;
-}
-
-.tooltip-box .arrow {
-  position: relative;
-  position: absolute;
-  top: 3px;
-  /*+placement:shift -16px 3px;*/
-  left: -16px;
-  width: 19px;
-  height: 30px;
-  background: url('../images/sprites.png') -585px -947px;
-}
diff --git a/ui/legacy/css/src/scss/components/tooltip-info.scss b/ui/legacy/css/src/scss/components/tooltip-info.scss
deleted file mode 100644
index fad62c7..0000000
--- a/ui/legacy/css/src/scss/components/tooltip-info.scss
+++ /dev/null
@@ -1,57 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.tooltip-info {
-  display: inline-block;
-  position: absolute;
-  z-index: $z-index-toolbox-info;
-  width: 239px;
-  min-height: 83px;
-  border: 1px solid #beb8b8;
-  border-radius: 22px;
-  /*+border-radius:22px;*/
-  border-radius: 22px 22px 22px 22px;
-  background: #ffffff;
-  -moz-border-radius: 22px;
-  -webkit-border-radius: 22px;
-  -khtml-border-radius: 22px;
-}
-
-.tooltip-info .arrow {
-  position: absolute;
-  top: 17px;
-  left: -18px;
-  width: 27px;
-  height: 47px;
-  background: url('../images/sprites.png') -583px -939px;
-}
-
-.tooltip-info .title {
-  margin: 12px;
-  font-size: 19px;
-  color: #485766;
-}
-
-.tooltip-info .content {
-  width: 182px;
-  margin: auto;
-  padding-bottom: 13px;
-  font-size: 11px;
-  line-height: 19px;
-  overflow: auto;
-  overflow-x: hidden;
-}
diff --git a/ui/legacy/css/src/scss/components/treeview.scss b/ui/legacy/css/src/scss/components/treeview.scss
deleted file mode 100644
index 9514393..0000000
--- a/ui/legacy/css/src/scss/components/treeview.scss
+++ /dev/null
@@ -1,92 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.tree-view {
-  width: 24%;
-  height: 98%;
-  overflow: auto;
-}
-
-.tree-view.overflowScroll {
-  overflow: scroll;
-}
-
-.tree-view ul {
-  display: block;
-  width: 85px;
-}
-
-.tree-view ul li {
-  display: block;
-  position: relative;
-  clear: both;
-  left: 21px;
-  width: 100%;
-  margin: 7px 0 0;
-  font-size: 12px;
-}
-
-.tree-view > ul {
-  /*+placement:shift 3px 40px;*/
-  position: relative;
-  top: 40px;
-  left: 3px;
-}
-
-.tree-view > ul > li {
-  left: 5px;
-}
-
-.tree-view ul li .name {
-  float: left;
-  margin: 1px 0 13px 17px;
-  padding: 6px 9px 6px 4px;
-  cursor: pointer;
-}
-
-.tree-view ul li .name:hover {
-  text-decoration: underline;
-}
-
-.tree-view ul li .name.selected {
-  border-radius: 5px;
-  /*+border-radius:5px;*/
-  border-radius: 5px 5px 5px 5px;
-  background: #dddcdd;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  -khtml-border-radius: 5px;
-}
-
-.tree-view ul li .expand {
-  position: absolute;
-  float: left;
-  float: left;
-  width: 10px;
-  height: 10px;
-  margin: 4px 5px 0 0;
-  background: url('../images/buttons.png') -630px -245px;
-  cursor: pointer;
-}
-
-.tree-view ul li.expanded > .expand {
-  background-position: -631px -228px;
-}
-
-#browser .tree-view div.toolbar div.text-search {
-  float: left;
-}
diff --git a/ui/legacy/css/src/scss/components/upload-volume.scss b/ui/legacy/css/src/scss/components/upload-volume.scss
deleted file mode 100644
index 5f88ad8..0000000
--- a/ui/legacy/css/src/scss/components/upload-volume.scss
+++ /dev/null
@@ -1,98 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.upload-volume .list-view {
-  margin-top: 5px !important;
-}
-
-.upload-volume .listView-container {
-  width: 823px;
-  margin: 71px 0 20px 28px;
-  border: 1px solid #dadada;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  border-radius: 4px 4px 4px 4px;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.upload-volume div.list-view .data-table div.fixed-header {
-  top: 115px !important;
-  left: 56px !important;
-  background: #ffffff !important;
-}
-
-.upload-volume .data-table table.body {
-  margin-top: 66px !important;
-  margin-left: 19px;
-}
-
-.upload-volume .list-view .toolbar {
-  top: 118px;
-  left: 43px;
-  width: 801px;
-  border: 0;
-  background: transparent;
-}
-
-.upload-volume .top-fields {
-  float: left;
-  clear: none;
-  margin-left: 24px;
-}
-
-.upload-volume .top-fields .field {
-  float: left;
-  margin-right: 50px;
-}
-
-.upload-volume .top-fields input {
-  float: right;
-  /*+border-radius:3px;*/
-  width: 186px;
-  padding: 2px;
-  border-radius: 3px;
-  border-radius: 3px 3px 3px 3px;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  -khtml-border-radius: 3px;
-}
-
-.upload-volume .top-fields label,
-.upload-volume .desc {
-  display: block;
-  float: left;
-  padding: 6px;
-  font-size: 12px;
-  color: #4c5d6c;
-  /*+text-shadow:0px 0px #FFFFFF;*/
-  text-shadow: 0 0 #ffffff;
-  -moz-text-shadow: 0 0 #ffffff;
-  -webkit-text-shadow: 0 0 #ffffff;
-  -o-text-shadow: 0 0 #ffffff;
-}
-
-.upload-volume .desc {
-  position: absolute;
-  top: 79px;
-  left: 32px;
-  width: 825px;
-  border-top: 1px solid #cfcfcf;
-  text-align: left;
-}
diff --git a/ui/legacy/css/src/scss/components/user.scss b/ui/legacy/css/src/scss/components/user.scss
deleted file mode 100644
index 529ec81..0000000
--- a/ui/legacy/css/src/scss/components/user.scss
+++ /dev/null
@@ -1,94 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#user {
-  display: inline-block;
-  position: absolute;
-  float: left;
-  top: -47px;
-  left: 1025px;
-  height: 30px;
-  margin: 0;
-  background: transparent;
-  cursor: default !important;
-}
-
-#user div.name {
-  display: inline-block;
-  float: left;
-  min-width: 110px;
-  max-width: 220px;
-  /*[empty]border-top:;*/
-  height: 12px;
-  margin: 0;
-  padding: 9px 18px 7px 12px;
-  border-right: 0;
-  text-align: center;
-  /*+text-shadow:0px -1px 1px #464646;*/
-  text-shadow: 0 -1px 1px #464646;
-  overflow: hidden;
-  -moz-text-shadow: 0 -1px 1px #464646;
-  -webkit-text-shadow: 0 -1px 1px #464646;
-  -o-text-shadow: 0 -1px 1px #464646;
-}
-
-#user div.options {
-  position: relative;
-  float: left;
-  top: 0;
-  /*+placement:shift 0px 0px;*/
-  left: 0;
-  width: 31px;
-  height: 28px;
-  background-position: 0 -867px;
-  cursor: pointer;
-}
-
-#user div.options .arrow {
-  position: relative;
-  top: 11px;
-  left: 8px;
-  /*+placement:shift 8px 11px;*/
-  width: 11px;
-  height: 8px;
-  background: url('../images/buttons.png') -402px -23px;
-}
-
-#user-options {
-  position: absolute;
-  z-index: $z-index-panel-highlight;
-  top: 30px;
-  width: 150px;
-  padding: 15px;
-  border-radius: 0 0 3px 3px;
-  /*+border-radius:0 0 3px 3px;*/
-  box-shadow: 0 1px 7px #000000;
-  background: #ffffff;
-  -moz-border-radius: 0 0 3px 3px;
-  -webkit-border-radius: 0 0 3px 3px;
-  /*+box-shadow:0px 1px 7px #000000;*/
-  -khtml-border-radius: 0 0 3px 3px;
-  -moz-box-shadow: 0 1px 7px #000000;
-  -webkit-box-shadow: 0 1px 7px #000000;
-  -o-box-shadow: 0 1px 7px #000000;
-}
-
-#user-options a {
-  float: left;
-  width: 100%;
-  padding: 10px 0;
-}
diff --git a/ui/legacy/css/src/scss/components/view-switcher.scss b/ui/legacy/css/src/scss/components/view-switcher.scss
deleted file mode 100644
index deaee37..0000000
--- a/ui/legacy/css/src/scss/components/view-switcher.scss
+++ /dev/null
@@ -1,138 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#header .view-switcher {
-  float: left;
-  margin: 11px 0 0 18px;
-  font-size: 12px;
-  color: #55687b;
-}
-
-#header div.view-switcher {
-  display: none;
-  position: relative;
-  /*+placement:shift 0px -10px;*/
-  top: -10px;
-  left: 0;
-  height: 39px;
-  margin-right: 9px;
-  background-position: 0 -5px;
-}
-
-#header div.view-switcher.alt {
-  background-position: 0 -41px;
-}
-
-#header div.view-switcher div {
-  position: relative;
-  /*[empty]display:;*/
-  float: left;
-  width: 126px;
-  margin: 0;
-  padding: 13px 0 0;
-  text-indent: 17px;
-  /*+text-shadow:0px -1px 1px #2D2D2D;*/
-  text-shadow: 0 -1px 1px #2d2d2d;
-  -moz-text-shadow: 0 -1px 1px #2d2d2d;
-  -webkit-text-shadow: 0 -1px 1px #2d2d2d;
-  -o-text-shadow: 0 -1px 1px #2d2d2d;
-}
-
-#header div.view-switcher .select.active {
-  font-weight: bold;
-  color: #ffffff;
-  /*+text-shadow:0px -1px 1px #5B5B5B;*/
-  text-shadow: 0 -1px 1px #5b5b5b;
-  -moz-text-shadow: 0 -1px 1px #5b5b5b;
-  -webkit-text-shadow: 0 -1px 1px #5b5b5b;
-  -o-text-shadow: 0 -1px 1px #5b5b5b;
-}
-
-#header div.view-switcher div span.icon {
-  position: relative;
-  top: 0;
-  top: 0;
-  left: -4px;
-  width: 10px;
-  /*+placement:shift -4px 0px;*/
-  height: 10px;
-  padding: 0 19px 0 0;
-  background: url('../images/icons.png') no-repeat;
-}
-
-#header div.view-switcher div.default-view span.icon {
-  background-position: -23px 0;
-}
-
-#header div.view-switcher div.project-view span.icon {
-  background-position: -24px 0 !important;
-}
-
-#header div.view-switcher div.select span.icon {
-  background-position: -47px 0;
-}
-
-#header .view-switcher span {
-  padding: 0 13px 0 0;
-  background-repeat: repeat-x;
-}
-
-#header .view-switcher select {
-  max-width: 120px;
-  margin: 6px 3px 0 -21px;
-  padding: 3px 0 4px;
-}
-
-/*** View switcher (drop-down)*/
-.project-switcher,
-.domain-switcher {
-  float: left;
-  width: 223px;
-  padding: 9px 17px 0 19px;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.project-switcher label,
-.domain-switcher label {
-  float: left;
-  top: 29px;
-  margin-top: 5px;
-  margin-right: 7px;
-  font-size: 13px;
-  color: #ffffff;
-}
-
-.project-switcher select,
-.domain-switcher select {
-  float: left;
-  width: 70%;
-  margin-top: 0;
-  border: 1px solid #393939;
-  /*+text-shadow:0px -1px 1px #373737;*/
-  background: #515151;
-  font-size: 13px;
-  font-weight: 100;
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #373737;
-  -moz-text-shadow: 0 -1px 1px #373737;
-  -webkit-text-shadow: 0 -1px 1px #373737;
-  -o-text-shadow: 0 -1px 1px #373737;
-}
diff --git a/ui/legacy/css/src/scss/components/view.scss b/ui/legacy/css/src/scss/components/view.scss
deleted file mode 100644
index 187a1c1..0000000
--- a/ui/legacy/css/src/scss/components/view.scss
+++ /dev/null
@@ -1,126 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-div.panel div.view.group-thumbnail ul.groups li {
-  position: relative;
-  float: left;
-  width: 142px;
-  height: 80px;
-  margin: 16px -1px -5px 16px;
-  background: url('../images/buttons.png') no-repeat -1px -399px;
-  cursor: pointer;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.active {
-  background-position: -1px -489px;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.drop-hover {
-  background-position: -1px -310px !important;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.new {
-  background-position: -147px -401px;
-}
-
-div.panel div.view.group-thumbnail ul.groups li.new.drop-hover {
-  background-position: -148px -312px !important;
-}
-
-div.panel div.view.group-thumbnail ul.groups li span.name {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 9px 7px;*/
-  top: 7px;
-  left: 9px;
-  font-size: 12px;
-  font-weight: bold;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  color: #49596b;
-  text-shadow: 0 1px 1px #ffffff;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-div.panel div.view.group-thumbnail ul.groups li span.vm-count {
-  position: absolute;
-  /*+placement:displace 54px 27px;*/
-  position: absolute;
-  margin-top: 27px;
-  margin-left: 54px;
-  font-size: 21px;
-  color: #3a4857;
-}
-
-#browser div.panel.reduced .reduced-hide {
-  color: #bbb8b8;
-}
-
-#browser div.panel.reduced div.toolbar .reduced-hide {
-  display: none;
-}
-
-/*List view -- edit field*/
-div.view table td.editable div.edit {
-  position: relative;
-  top: 0;
-  /*+placement:shift 6px 0px;*/
-  left: 6px;
-  width: 106%;
-  height: 20px;
-}
-
-div.view table td.truncated.editable div.edit {
-  top: 1px;
-  left: 1px;
-  width: 285px;
-}
-
-div.view table td.editable div.edit input {
-  position: relative;
-  z-index: $z-index-standard;
-  float: left;
-  width: 66%;
-  height: 17px;
-  border: 0;
-}
-
-.detail-view div.view table td.editable div.edit {
-  width: 116px;
-}
-
-div.view table td.editable div.action {
-  position: relative;
-  float: left;
-  top: 0;
-  left: -2px;
-  width: 16px;
-  /*+placement:shift -2px 0px;*/
-  height: 19px;
-  padding-left: 2px;
-  background: #ffffff url('../images/buttons.png') -614px -684px;
-  cursor: pointer;
-}
-
-div.view table td.editable div.action.save {
-  margin-left: 2px;
-}
-
-div.view table td.editable div.action.cancel {
-  background-position: -628px -684px;
-}
diff --git a/ui/legacy/css/src/scss/components/vpc-chart.scss b/ui/legacy/css/src/scss/components/vpc-chart.scss
deleted file mode 100644
index 4e949e5..0000000
--- a/ui/legacy/css/src/scss/components/vpc-chart.scss
+++ /dev/null
@@ -1,489 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-.vpc-chart {
-  position: relative;
-  width: 100%;
-  height: 94%;
-  margin: 30px 0 0;
-  background: #ffffff 0 24px;
-  overflow: auto;
-}
-
-.vpc-chart .vpc-title {
-  position: relative;
-  position: absolute;
-  /*+placement:shift 11px 41px;*/
-  top: 41px;
-  left: 11px;
-  width: 210px;
-  font-size: 22px;
-  color: #5f768a;
-}
-
-.vpc-chart .vpc-title > span {
-  display: block;
-  float: left;
-  max-width: 160px;
-  overflow-x: auto;
-  overflow-y: hidden;
-}
-
-.vpc-chart .vpc-title .icon {
-  position: relative;
-  float: left;
-  top: -8px;
-  left: 6px;
-  /*+placement:shift 6px -8px;*/
-  margin-left: 10px;
-  padding: 7px 15px;
-  background: url('../images/sprites.png') no-repeat -145px -195px;
-  cursor: pointer;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip {
-  display: none;
-  position: absolute;
-  z-index: $z-index-vpc-tooltip;
-  width: 129px;
-  padding: 35px 10px 10px;
-  font-size: 14px;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip .arrow {
-  position: relative;
-  position: absolute;
-  z-index: $z-index-standard;
-  /*+placement:shift 13px 26px;*/
-  top: 26px;
-  left: 13px;
-  width: 30px;
-  height: 20px;
-  background: #ffffff url('../images/sprites.png') no-repeat -589px -997px;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip ul {
-  position: relative;
-  top: -6px;
-  /*+border-radius:4px;*/
-  left: 0;
-  margin: 10px 0;
-  padding: 9px;
-  border: 1px solid #c2c2c2;
-  /*+placement:shift 0px -6px;*/
-  border-radius: 4px;
-  box-shadow: 0 1px 8px #cbcbcb;
-  background: #ffffff;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 1px 8px #CBCBCB;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 1px 8px #cbcbcb;
-  -webkit-box-shadow: 0 1px 8px #cbcbcb;
-  -o-box-shadow: 0 1px 8px #cbcbcb;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip li {
-  padding: 3px 0 5px;
-  font-size: 12px;
-  cursor: pointer;
-}
-
-.vpc-chart .vpc-title .vpc-configure-tooltip li:hover {
-  font-weight: bold;
-}
-
-.vpc-chart ul.tiers {
-  margin: 79px 0 0 232px;
-  padding: 0 0 0 26px;
-  border-left: 3px solid #cccccc;
-}
-
-.vpc-chart li.tier {
-  display: block;
-  position: relative;
-  position: relative;
-  top: 58px;
-  /*+border-radius:4px;*/
-  left: 0;
-  width: 258px;
-  height: 107px;
-  margin: -55px 0 90px;
-  border: 1px solid #50545a;
-  border-radius: 4px;
-  /*+placement:shift 0px 58px;*/
-  box-shadow: 0 5px 7px #dadada;
-  background: url('../images/bg-gradients.png') 0 -2637px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  /*+box-shadow:0px 5px 7px #DADADA;*/
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: 0 5px 7px #dadada;
-  -webkit-box-shadow: 0 5px 7px #dadada;
-  -o-box-shadow: 0 5px 7px #dadada;
-}
-
-.vpc-chart li.tier .loading-overlay {
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
-
-.vpc-chart li.tier .connect-line {
-  position: absolute;
-  position: relative;
-  position: absolute;
-  top: 49px;
-  /*+placement:shift -29px 49px;*/
-  left: -29px;
-  width: 28px;
-  height: 3px;
-  background: #cccccc 0 -8px;
-}
-
-.vpc-chart li.tier span.title {
-  position: relative;
-  /*+placement:shift 8px 7px;*/
-  position: absolute;
-  top: 7px;
-  left: 8px;
-  padding: 3px;
-  font-size: 24px;
-  color: #ffffff;
-  text-decoration: underline;
-  /*+text-shadow:1px 2px 2px #000000;*/
-  text-shadow: 1px 2px 2px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 1px 2px 2px #000000;
-  -webkit-text-shadow: 1px 2px 2px #000000;
-  -o-text-shadow: 1px 2px 2px #000000;
-}
-
-.vpc-chart li.tier span.cidr {
-  /*+placement:shift 12px 46px;*/
-  position: relative;
-  position: absolute;
-  top: 46px;
-  left: 12px;
-  font-size: 14px;
-  /*+text-shadow:0px -1px 1px #343E4C;*/
-  color: #ffffff;
-  text-shadow: 0 -1px 1px #343e4c;
-  -moz-text-shadow: 0 -1px 1px #343e4c;
-  -webkit-text-shadow: 0 -1px 1px #343e4c;
-  -o-text-shadow: 0 -1px 1px #343e4c;
-}
-
-.vpc-chart li.tier .actions {
-  position: relative;
-  position: absolute;
-  position: absolute;
-  /*+border-radius:0 0 4px 4px;*/
-  top: 71px;
-  left: -1px;
-  width: 258px;
-  height: 35px;
-  /*+placement:shift -1px 71px;*/
-  border: 1px solid #808080;
-  border-top: 1px solid #4c545e;
-  border-radius: 0 0 4px 4px;
-  box-shadow: inset 0 1px #ffffff;
-  /*+box-shadow:inset 0px 1px #FFFFFF;*/
-  background: #cccccc;
-  -moz-border-radius: 0 0 4px 4px;
-  -webkit-border-radius: 0 0 4px 4px;
-  -khtml-border-radius: 0 0 4px 4px;
-  -moz-box-shadow: inset 0 1px #ffffff;
-  -webkit-box-shadow: inset 0 1px #ffffff;
-  -o-box-shadow: inset 0 1px #ffffff;
-}
-
-.vpc-chart li.tier .actions .action {
-  float: left;
-  width: 50px;
-  height: 24px;
-  margin: 4px 0 4px 4px;
-  border: 1px solid #909090;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: url('../images/bg-gradients.png') 0 -2533px;
-  font-weight: bold;
-  color: #4b637a;
-  text-align: center;
-  text-shadow: 0 1px 1px #ffffff;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-.vpc-chart li.tier .actions .action.disabled,
-.vpc-chart li.tier .actions .action.disabled:hover {
-  border-color: #b5b5b5;
-  box-shadow: none;
-  /*+text-shadow:none;*/
-  background: #cfcfcf;
-  color: #9d9d9d;
-  text-shadow: none;
-  cursor: not-allowed;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  /*+box-shadow:none;*/
-  -o-text-shadow: none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.vpc-chart li.tier .actions .action:hover {
-  border: 1px solid #7a8b9a;
-  box-shadow: inset 1px 2px 4px #808080;
-  background-position: 0 -106px;
-  /*+box-shadow:inset 1px 2px 4px #808080;*/
-  color: #5b7a96;
-  -moz-box-shadow: inset 1px 2px 4px #808080;
-  -webkit-box-shadow: inset 1px 2px 4px #808080;
-  -o-box-shadow: inset 1px 2px 4px #808080;
-}
-
-.vpc-chart li.tier .actions .action span.label {
-  /*+placement:shift 1px 3px;*/
-  position: relative;
-  top: 3px;
-  left: 1px;
-  font-size: 11px;
-}
-
-.vpc-chart li.tier .actions .action.remove,
-.vpc-chart li.tier .actions .action.remove:hover {
-  position: relative;
-  float: right;
-  top: -2px;
-  left: -3px;
-  width: 30px;
-  /*+placement:shift -3px -2px;*/
-  padding: 0;
-  border: 0;
-  box-shadow: none;
-  /*+box-shadow:none;*/
-  background: none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.vpc-chart li.tier .action span.icon {
-  position: relative;
-  float: left;
-  top: 3px;
-  left: 1px;
-  width: 37px;
-  /*+placement:shift 1px 3px;*/
-  height: 23px;
-  background-image: url('../images/sprites.png');
-  cursor: pointer;
-}
-
-.vpc-chart li.tier .vm-count {
-  display: block;
-  position: absolute;
-  top: 3px;
-  left: 134px;
-  width: 100px;
-  /*+text-shadow:1px 2px 2px #000000;*/
-  margin: 4px;
-  padding: 5px;
-  border: 1px solid transparent;
-  font-size: 23px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: underline;
-  text-shadow: 1px 2px 2px #000000;
-  cursor: pointer;
-  -moz-text-shadow: 1px 2px 2px #000000;
-  -webkit-text-shadow: 1px 2px 2px #000000;
-  -o-text-shadow: 1px 2px 2px #000000;
-}
-
-.vpc-chart li.tier.loading .vm-count {
-  padding-right: 10px;
-}
-
-.vpc-chart li.tier .vm-count .loading-overlay {
-  opacity: 1;
-  display: none;
-  position: absolute;
-  top: 7px;
-  left: 15px;
-  width: 24px;
-  /*+border-radius:12px;*/
-  height: 24px;
-  border-radius: 12px;
-  background-image: url('../images/ajax-loader-small.gif');
-  -moz-border-radius: 12px;
-  -webkit-border-radius: 12px;
-  /*+opacity:100%;*/
-  -khtml-border-radius: 12px;
-  filter: alpha(opacity=100);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
-  -moz-opacity: 1;
-}
-
-.vpc-chart li.tier.loading .vm-count .loading-overlay {
-  display: block;
-}
-
-.vpc-chart li.tier .vm-count:hover,
-.vpc-chart li.tier .title:hover {
-  border: 1px solid #4c545e;
-  border-radius: 4px;
-  background: url('../images/bg-gradients.png') 0 -2751px;
-}
-
-.vpc-chart li.tier .vm-count .total {
-  padding-right: 4px;
-  font-size: 24px;
-}
-
-.vpc-chart li.tier.placeholder {
-  border: dotted #acacac;
-  border-radius: 4px;
-  /*+border-radius:4px;*/
-  box-shadow: none;
-  background: #ececec;
-  cursor: pointer;
-  -moz-border-radius: 4px;
-  /*+box-shadow:none;*/
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-  -o-box-shadow: none;
-}
-
-.vpc-chart li.tier.placeholder:hover {
-  box-shadow: 0 2px 8px #a7a7a7;
-  /*+box-shadow:0px 2px 8px #A7A7A7;*/
-  background: #d3d3d3;
-  -moz-box-shadow: 0 2px 8px #a7a7a7;
-  -webkit-box-shadow: 0 2px 8px #a7a7a7;
-  -o-box-shadow: 0 2px 8px #a7a7a7;
-}
-
-.vpc-chart li.tier.placeholder span {
-  top: 40px;
-  left: 66px;
-  color: #9f9f9f;
-  /*+text-shadow:none;*/
-  text-decoration: none;
-  text-shadow: none;
-  -moz-text-shadow: none;
-  -webkit-text-shadow: none;
-  -o-text-shadow: none;
-}
-
-.vpc-chart li.tier.placeholder:hover span {
-  border: 0;
-  /*+text-shadow:0px 0px 7px #FFFFFF;*/
-  background: none;
-  color: #000000;
-  text-shadow: 0 0 7px #ffffff;
-  -moz-text-shadow: 0 0 7px #ffffff;
-  -webkit-text-shadow: 0 0 7px #ffffff;
-  -o-text-shadow: 0 0 7px #ffffff;
-}
-
-.vpc-chart li.tier.virtual-router {
-  position: relative;
-  top: -36px;
-  left: 17px;
-  /*+placement:shift 17px -36px;*/
-  width: 222px;
-  height: 65px;
-  margin: 0;
-  border: 1px solid #adadad;
-  background-position: 0 -2519px;
-  cursor: pointer;
-}
-
-.vpc-chart li.tier.virtual-router:hover {
-  text-decoration: underline;
-}
-
-.vpc-chart li.tier.virtual-router.disabled:hover {
-  text-decoration: none;
-}
-
-.vpc-chart li.tier.virtual-router.disabled,
-.vpc-chart li.tier.virtual-router.disabled span {
-  cursor: default;
-}
-
-.vpc-chart li.tier.virtual-router span {
-  position: relative;
-  top: 22px;
-  /*+text-shadow:0px 1px 3px #FFFFFF;*/
-  left: 53px;
-  font-size: 18px;
-  color: #586e82;
-  text-decoration: none;
-  /*+placement:shift 53px 22px;*/
-  text-shadow: 0 1px 3px #ffffff;
-  -moz-text-shadow: 0 1px 3px #ffffff;
-  -webkit-text-shadow: 0 1px 3px #ffffff;
-  -o-text-shadow: 0 1px 3px #ffffff;
-}
-
-.vpc-chart li.tier.virtual-router span:hover {
-  border: 0;
-  background: none;
-}
-
-.vpc-chart li.tier.virtual-router .connect-line {
-  /*+placement:shift -47px 14px;*/
-  position: relative;
-  top: 14px;
-  left: -47px;
-  width: 46px;
-}
-
-/*VPC: Enable Static NAT fields*/
-.list-view.instances .filters.tier-select {
-  width: 246px;
-  margin: 1px 120px 0 19px;
-  padding: 2px 20px 2px 13px;
-}
-
-.list-view.instances .filters.tier-select label {
-  color: #ffffff;
-  /*+text-shadow:0px 1px 3px #000000;*/
-  text-shadow: 0 1px 3px #000000;
-  -moz-text-shadow: 0 1px 3px #000000;
-  -webkit-text-shadow: 0 1px 3px #000000;
-  -o-text-shadow: 0 1px 3px #000000;
-}
-
-.list-view.instances .filters.tier-select select {
-  float: left;
-  width: 166px;
-}
diff --git a/ui/legacy/css/src/scss/components/zone-filter.scss b/ui/legacy/css/src/scss/components/zone-filter.scss
deleted file mode 100644
index 1bc939e..0000000
--- a/ui/legacy/css/src/scss/components/zone-filter.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#header .zone-filter {
-  float: left;
-  width: 111px;
-  margin: 9px 20px 0 2px;
-}
-
-#header .zone-filter label {
-  position: absolute;
-  top: -3px;
-  font-size: 11px;
-  color: #ffffff;
-}
-
-#header .zone-filter select {
-  width: 100%;
-  margin-top: 2px;
-  border: 1px solid #000000;
-  border-bottom: #ffffff;
-  /*+border-radius:4px;*/
-  border-radius: 4px;
-  background: #ececec;
-  font-size: 12px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-}
diff --git a/ui/legacy/css/src/scss/custom.scss b/ui/legacy/css/src/scss/custom.scss
deleted file mode 100644
index 0213623..0000000
--- a/ui/legacy/css/src/scss/custom.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*
-*
-* Use custom.css to override the default CloudStack styles
-*/
diff --git a/ui/legacy/css/src/scss/frame/wrapper-elements.scss b/ui/legacy/css/src/scss/frame/wrapper-elements.scss
deleted file mode 100644
index 10a9f96..0000000
--- a/ui/legacy/css/src/scss/frame/wrapper-elements.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#main-area {
-  width: 1224px;
-  height: 729px;
-  margin: auto;
-  border: 1px solid #d4d4d4;
-  /*+box-shadow:0px -5px 11px #B7B7B7;*/
-  border: 1px solid #e8e8e8;
-  box-shadow: 0 -5px 11px #b7b7b7;
-  -moz-box-shadow: 0 -5px 11px #b7b7b7;
-  -webkit-box-shadow: 0 -5px 11px #b7b7b7;
-  -o-box-shadow: 0 -5px 11px #b7b7b7;
-}
-
-#container {
-  /*[empty]width:;*/
-  position: relative;
-  height: 100%;
-  margin: auto;
-}
-
-#sections {
-  display: none;
-}
-
-#template {
-  display: none;
-}
diff --git a/ui/legacy/css/src/scss/languages/hungarian.scss b/ui/legacy/css/src/scss/languages/hungarian.scss
deleted file mode 100644
index da9d7c7..0000000
--- a/ui/legacy/css/src/scss/languages/hungarian.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#breadcrumbs div.home {
-  width: 100px; // hungarian translation is longer than the english default.
-}
diff --git a/ui/legacy/css/src/scss/languages/japanese.scss b/ui/legacy/css/src/scss/languages/japanese.scss
deleted file mode 100644
index f2a603f..0000000
--- a/ui/legacy/css/src/scss/languages/japanese.scss
+++ /dev/null
@@ -1,82 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#header div.view-switcher {
-  font-size: 9px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .name {
-  font-size: 10px;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .percentage {
-  float: left;
-  margin: 13px 0 0;
-  font-size: 15px;
-  font-weight: bold;
-  /*+text-shadow:0px -2px 1px #FFFFFF;*/
-  text-shadow: 0 -2px 1px #ffffff;
-  -moz-text-shadow: 0 -2px 1px #ffffff;
-  -webkit-text-shadow: 0 -2px 1px #ffffff;
-  -o-text-shadow: 0 -2px 1px #ffffff;
-}
-
-.dashboard.admin .dashboard-container .stats ul li .value .content {
-  font-size: 10px;
-}
-
-div.toolbar div.filters label {
-  font-size: 9px;
-}
-
-div.toolbar div.filters select {
-  width: 82px;
-  font-size: 11px;
-}
-
-div.toolbar div.button.add,
-div.toolbar div.button.refresh,
-div.toolbar div.button.add,
-div.toolbar div.button.main-action,
-.toolbar div.button.header-action,
-.detail-group .button.add {
-  font-size: 10px;
-  white-space: nowrap;
-}
-
-table tbody td.quick-view,
-table thead th.quick-view {
-  font-size: 8px;
-}
-
-.multi-wizard.instance-wizard .progress ul li span.multiline {
-  font-size: 9px;
-}
-
-.multi-wizard .review .select-container .select .name {
-  font-size: 10px;
-  white-space: nowrap;
-}
-
-.quick-view-tooltip .detail-view .detail-group.actions .action.text .label {
-  font-size: 8px;
-}
-
-.detail-view .multi-edit table tr th,
-.detail-view .multi-edit table tr td {
-  font-size: 8px;
-}
diff --git a/ui/legacy/css/src/scss/licences/AL-css.scss b/ui/legacy/css/src/scss/licences/AL-css.scss
deleted file mode 100644
index 1e58f62..0000000
--- a/ui/legacy/css/src/scss/licences/AL-css.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// licence for compiled css file
-
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
diff --git a/ui/legacy/css/src/scss/objects/form-elements.scss b/ui/legacy/css/src/scss/objects/form-elements.scss
deleted file mode 100644
index b0e7448..0000000
--- a/ui/legacy/css/src/scss/objects/form-elements.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-input.error {
-  background: #fee5e5;
-}
-
-label.error {
-  color: #ff0000;
-}
-
-.label-hovered {
-  color: #0000ff !important;
-  cursor: pointer;
-}
-
-.button {
-  float: left;
-  background: url('../images/buttons.png') no-repeat;
-  cursor: pointer;
-}
diff --git a/ui/legacy/css/src/scss/objects/links.scss b/ui/legacy/css/src/scss/objects/links.scss
deleted file mode 100644
index cef3701..0000000
--- a/ui/legacy/css/src/scss/objects/links.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-a {
-  color: #0b84dc;
-  text-decoration: none;
-}
-
-a:hover {
-  color: #000000;
-  text-decoration: underline;
-}
diff --git a/ui/legacy/css/src/scss/objects/table.scss b/ui/legacy/css/src/scss/objects/table.scss
deleted file mode 100644
index f15569d..0000000
--- a/ui/legacy/css/src/scss/objects/table.scss
+++ /dev/null
@@ -1,323 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-//TODO find new stategy to organize this styles
-table {
-  position: relative;
-  width: 955px;
-  max-width: 977px;
-  margin: 15px 15px 12px 12px;
-  border-bottom: 1px solid #c4c5c5;
-  font-size: 13px;
-  text-align: left;
-  text-indent: 10px;
-  border-collapse: collapse;
-}
-
-table thead {
-  background: url('../images/bg-table-head.png') repeat-x;
-  cursor: default;
-}
-
-table thead th {
-  border: 1px solid #c6c3c3;
-  border-top: 0;
-  border-bottom: 1px solid #cfc9c9;
-  font-weight: bold;
-  white-space: nowrap;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  color: #525252;
-  text-align: left;
-  text-shadow: 0 1px 1px #ffffff;
-  cursor: pointer;
-  -moz-text-shadow: 0 1px 1px #ffffff;
-  -webkit-text-shadow: 0 1px 1px #ffffff;
-  -o-text-shadow: 0 1px 1px #ffffff;
-}
-
-table thead th.sorted {
-  color: #312f2f;
-  /*+text-shadow:0px 1px 1px #BFBFBF;*/
-  text-shadow: 0 1px 1px #bfbfbf;
-  -moz-text-shadow: 0 1px 1px #bfbfbf;
-  -webkit-text-shadow: 0 1px 1px #bfbfbf;
-  -o-text-shadow: 0 1px 1px #bfbfbf;
-}
-
-table thead th.sorted.desc {
-  background-position: 102% -111px;
-}
-
-table thead th.sorted.asc {
-  background-position: 102% -157px;
-}
-
-table tbody td,
-table th {
-  clear: none;
-  vertical-align: middle;
-  min-width: 88px;
-  padding: 10px 5px 6px;
-  border-right: 1px solid #bfbfbf;
-  font-size: 11px;
-  color: #282828;
-  overflow: hidden;
-}
-
-table tbody td.loading {
-  border-top: 1px solid #fbfbfb;
-  background: #dbe2e9;
-  text-align: center;
-}
-
-table tbody td.truncated {
-  max-width: 120px;
-  overflow: visible;
-}
-
-table tbody td.truncated > span {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-
-.list-view-select table th.name,
-.list-view-select table td.name {
-  width: 170px;
-  min-width: 170px;
-  max-width: 170px;
-}
-
-.list-view-select table th.availableHostSuitability,
-.list-view-select table td.availableHostSuitability {
-  max-width: 250px;
-}
-
-/** Multiselect*/
-table thead th.multiselect,
-table tbody td.multiselect {
-  width: 20px;
-  min-width: 20px;
-  max-width: 20px;
-}
-
-table thead th.multiselect input,
-table tbody td.multiselect input {
-  position: relative;
-  /*+placement:shift -8px 0px;*/
-  top: 0;
-  left: -8px;
-  margin: 0;
-}
-
-table thead th.multiselect input {
-  margin-left: 2px;
-}
-
-/** Actions table cell*/
-table tbody td.actions {
-  vertical-align: middle;
-  width: 130px;
-  min-width: 130px !important;
-  max-width: 130px !important;
-}
-
-table tbody td.actions input {
-  /*+placement:shift 10px -6px;*/
-  position: relative;
-  top: -6px;
-  left: 10px;
-  margin: 11px 0 0;
-}
-
-.list-view-select table tbody td.actions {
-  width: 40px !important;
-  min-width: 40px !important;
-  max-width: 40px !important;
-}
-
-.list-view-select table tbody td.actions input {
-  margin: 0 0 0 -7px;
-}
-
-.list-view-select table thead th.actions {
-  width: 40px !important;
-  min-width: 40px !important;
-  max-width: 40px !important;
-  text-indent: 5px;
-}
-
-/** Quick view table cell*/
-table tbody td.quick-view,
-table thead th.quick-view {
-  width: 58px !important;
-  min-width: 58px;
-  max-width: 58px !important;
-  height: 14px !important;
-  white-space: nowrap;
-  text-indent: 2px;
-  cursor: default;
-}
-
-table tbody td.quick-view .icon {
-  margin-top: 3px;
-  margin-left: 22px;
-  padding: 0 0 6px 12px;
-  background: url('../images/sprites.png') no-repeat -44px -62px;
-}
-
-table tbody td.quick-view:hover .icon {
-  background-position: -44px -644px;
-}
-
-table tbody tr.loading td.quick-view .icon {
-  display: none;
-}
-
-table tbody tr.loading td.quick-view {
-  cursor: default;
-}
-
-table tbody tr.loading td.quick-view .loading {
-  background-position: center center;
-}
-
-/** Row styling*/
-table tbody tr {
-  border-top: 1px solid transparent;
-  border-right: 1px solid #c4c5c5;
-  border-left: 1px solid #c4c5c5;
-}
-
-table tbody tr.even {
-  background: #ffffff;
-}
-
-table tbody tr.odd {
-  background: #f2f0f0;
-}
-
-table tbody tr.selected {
-  border-top: 1px solid #edf0f7 !important;
-  border-bottom: 1px solid #babfd9;
-  background: #cbddf3;
-  text-shadow: 0 1px 1px #fcfbf7;
-}
-
-table tbody tr.to-remove {
-  border-top: 1px solid #edf0f7 !important;
-  border-bottom: 1px solid #babfd9;
-  background: #e05959;
-  text-shadow: 0 1px 1px #fcfbf7;
-}
-
-table tbody tr.loading {
-  background: #e2e9f0;
-}
-
-table tbody tr.loading td {
-  /*+opacity:50%;*/
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-}
-
-table tbody tr.loading td.loading.icon {
-  height: 35px;
-  padding: 0;
-  background: url('../images/ajax-loader.gif') no-repeat center;
-}
-
-table tbody tr div.loading {
-  display: block;
-  width: 50px;
-  height: 14px;
-  margin: auto;
-  background: transparent url('../images/ajax-loader-small.gif') no-repeat center;
-}
-
-table th.resizable {
-  position: relative;
-  cursor: col-resize;
-}
-
-table th div.ui-resizable-handle {
-  position: relative;
-  float: right;
-  top: -30px;
-}
-
-div.list-view table tbody td span {
-  display: block;
-  float: left;
-  max-width: 89%;
-  margin-left: 12px;
-  line-height: 15px;
-  word-break: break-all;
-  word-wrap: break-word;
-  text-indent: 0;
-}
-
-td.alert-notification-threshold {
-  background-color: rgba(255, 231, 175, 0.75);
-  color: #e87900;
-}
-
-td.alert-disable-threshold {
-  background-color: rgba(255, 190, 190, 0.75);
-  color: #f50000;
-}
-
-span.compact {
-  height: 16px;
-}
-
-.horizontal-overflow tbody td,
-.horizontal-overflow thead th {
-  min-width: 40px;
-  padding: 10px 10px 5px 0;
-}
-
-.horizontal-overflow th.quick-view {
-  padding-left: 5px;
-}
-
-.groupable-header {
-  border-right: 1px solid #c6c3c3;
-  border-left: 1px solid #c6c3c3;
-  background: url('../images/bg-table-head.png');
-}
-
-.groupable-header-columns th {
-  border: 0;
-}
-
-table.horizontal-overflow td.state {
-  width: 55px;
-  min-width: 55px;
-  max-width: 55px;
-}
-
-table.no-split td.first {
-  min-width: 150px;
-}
-
-.groupable-header-border {
-  border-right: 1px solid #c6c3c3;
-  border-left: 1px solid #c6c3c3;
-}
diff --git a/ui/legacy/css/src/scss/variables/z-index.scss b/ui/legacy/css/src/scss/variables/z-index.scss
deleted file mode 100644
index 46aff37..0000000
--- a/ui/legacy/css/src/scss/variables/z-index.scss
+++ /dev/null
@@ -1,39 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-//TODO rework variable-names, z-index values and set up z-index value-dependencies
-$z-index-behind: -1;
-$z-index-standard: 1;
-$z-index-breadcrumbs1: 2;
-$z-index-system-chart1: 2;
-$z-index-ui-tabs: 2;
-$z-index-system-chart2: 3;
-$z-index-search: 4;
-$z-index-breadcrumbs2: 5;
-$z-index-circle-icon: 5;
-$z-index-toolbar: 6;
-$z-index-install-wizard1: 9;
-$z-index-install-wizard2: 10;
-$z-index-install-wizard3: 11;
-$z-index-notification: 100;
-$z-index-loading-overlay: 500;
-$z-index-toolbox-info: 1000;
-$z-index-vpc-tooltip: 2000;
-$z-index-multi-wizard2: 5000;
-$z-index-region-selector: 5500;
-$z-index-panel-highlight: 10000;
-$z-index-facebook: 2147483647;
diff --git a/ui/legacy/images/ajax-loader-small.gif b/ui/legacy/images/ajax-loader-small.gif
deleted file mode 100644
index 6a79f60..0000000
--- a/ui/legacy/images/ajax-loader-small.gif
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/ajax-loader.gif b/ui/legacy/images/ajax-loader.gif
deleted file mode 100644
index a314f12..0000000
--- a/ui/legacy/images/ajax-loader.gif
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-breadcrumb-project-view.png b/ui/legacy/images/bg-breadcrumb-project-view.png
deleted file mode 100644
index 9325d88..0000000
--- a/ui/legacy/images/bg-breadcrumb-project-view.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-breadcrumb.png b/ui/legacy/images/bg-breadcrumb.png
deleted file mode 100644
index 82d6327..0000000
--- a/ui/legacy/images/bg-breadcrumb.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-breadcrumbs-project-view.png b/ui/legacy/images/bg-breadcrumbs-project-view.png
deleted file mode 100644
index 734acd8..0000000
--- a/ui/legacy/images/bg-breadcrumbs-project-view.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-breadcrumbs.png b/ui/legacy/images/bg-breadcrumbs.png
deleted file mode 100644
index c1d1416..0000000
--- a/ui/legacy/images/bg-breadcrumbs.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-button-view-more.png b/ui/legacy/images/bg-button-view-more.png
deleted file mode 100644
index 7fd9ef8..0000000
--- a/ui/legacy/images/bg-button-view-more.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-details-tab-gradient.png b/ui/legacy/images/bg-details-tab-gradient.png
deleted file mode 100644
index e506e54..0000000
--- a/ui/legacy/images/bg-details-tab-gradient.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-dialog-body.png b/ui/legacy/images/bg-dialog-body.png
deleted file mode 100644
index a807f99..0000000
--- a/ui/legacy/images/bg-dialog-body.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-dialog-header.png b/ui/legacy/images/bg-dialog-header.png
deleted file mode 100644
index cf54744..0000000
--- a/ui/legacy/images/bg-dialog-header.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-gradient-white-transparent.png b/ui/legacy/images/bg-gradient-white-transparent.png
deleted file mode 100644
index 9666012..0000000
--- a/ui/legacy/images/bg-gradient-white-transparent.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-gradients.png b/ui/legacy/images/bg-gradients.png
deleted file mode 100644
index 52016f0..0000000
--- a/ui/legacy/images/bg-gradients.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-header.png b/ui/legacy/images/bg-header.png
deleted file mode 100644
index bcef36e..0000000
--- a/ui/legacy/images/bg-header.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-install-wizard-header.jpg b/ui/legacy/images/bg-install-wizard-header.jpg
deleted file mode 100644
index 79275de..0000000
--- a/ui/legacy/images/bg-install-wizard-header.jpg
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-install-wizard-header.png b/ui/legacy/images/bg-install-wizard-header.png
deleted file mode 100644
index 1de7709..0000000
--- a/ui/legacy/images/bg-install-wizard-header.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-login.jpg b/ui/legacy/images/bg-login.jpg
deleted file mode 100644
index 7a21002..0000000
--- a/ui/legacy/images/bg-login.jpg
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-login.png b/ui/legacy/images/bg-login.png
deleted file mode 100644
index f65b22a..0000000
--- a/ui/legacy/images/bg-login.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-naas.png b/ui/legacy/images/bg-naas.png
deleted file mode 100644
index 8517099..0000000
--- a/ui/legacy/images/bg-naas.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-nav-item-active-project-view.png b/ui/legacy/images/bg-nav-item-active-project-view.png
deleted file mode 100644
index 4381000..0000000
--- a/ui/legacy/images/bg-nav-item-active-project-view.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-nav-item-active.png b/ui/legacy/images/bg-nav-item-active.png
deleted file mode 100644
index 8b7ff59..0000000
--- a/ui/legacy/images/bg-nav-item-active.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-nav-item-project-view.png b/ui/legacy/images/bg-nav-item-project-view.png
deleted file mode 100644
index 8ed2b5f..0000000
--- a/ui/legacy/images/bg-nav-item-project-view.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-nav-item.png b/ui/legacy/images/bg-nav-item.png
deleted file mode 100644
index 3d49df7..0000000
--- a/ui/legacy/images/bg-nav-item.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-network-nat.png b/ui/legacy/images/bg-network-nat.png
deleted file mode 100644
index 532a4e7..0000000
--- a/ui/legacy/images/bg-network-nat.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-network.png b/ui/legacy/images/bg-network.png
deleted file mode 100644
index 1a3e378..0000000
--- a/ui/legacy/images/bg-network.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-notifications.png b/ui/legacy/images/bg-notifications.png
deleted file mode 100644
index 0fa02ed..0000000
--- a/ui/legacy/images/bg-notifications.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-panel-shadow.png b/ui/legacy/images/bg-panel-shadow.png
deleted file mode 100644
index afcbe37..0000000
--- a/ui/legacy/images/bg-panel-shadow.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-section-switcher.png b/ui/legacy/images/bg-section-switcher.png
deleted file mode 100644
index 5864c14..0000000
--- a/ui/legacy/images/bg-section-switcher.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-status_box.png b/ui/legacy/images/bg-status_box.png
deleted file mode 100644
index 7d54776..0000000
--- a/ui/legacy/images/bg-status_box.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-system-chart-compute.png b/ui/legacy/images/bg-system-chart-compute.png
deleted file mode 100644
index 36c7cd4..0000000
--- a/ui/legacy/images/bg-system-chart-compute.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-system-chart-lines.png b/ui/legacy/images/bg-system-chart-lines.png
deleted file mode 100644
index e551e48..0000000
--- a/ui/legacy/images/bg-system-chart-lines.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-system-network-traffic.png b/ui/legacy/images/bg-system-network-traffic.png
deleted file mode 100644
index 9aa99ae..0000000
--- a/ui/legacy/images/bg-system-network-traffic.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-table-head.png b/ui/legacy/images/bg-table-head.png
deleted file mode 100644
index bafe245..0000000
--- a/ui/legacy/images/bg-table-head.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-transparent-white.png b/ui/legacy/images/bg-transparent-white.png
deleted file mode 100644
index 2d37cba..0000000
--- a/ui/legacy/images/bg-transparent-white.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/bg-what-is-cloudstack.png b/ui/legacy/images/bg-what-is-cloudstack.png
deleted file mode 100644
index db657dc..0000000
--- a/ui/legacy/images/bg-what-is-cloudstack.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/buttons.png b/ui/legacy/images/buttons.png
deleted file mode 100644
index fc92f0f..0000000
--- a/ui/legacy/images/buttons.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/cloud.ico b/ui/legacy/images/cloud.ico
deleted file mode 100644
index d9c53d6..0000000
--- a/ui/legacy/images/cloud.ico
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/destroy-anim.gif b/ui/legacy/images/destroy-anim.gif
deleted file mode 100644
index 437876a..0000000
--- a/ui/legacy/images/destroy-anim.gif
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/exportCsvIcon.png b/ui/legacy/images/exportCsvIcon.png
deleted file mode 100644
index cc486ec..0000000
--- a/ui/legacy/images/exportCsvIcon.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/gradients.png b/ui/legacy/images/gradients.png
deleted file mode 100644
index d6b9488..0000000
--- a/ui/legacy/images/gradients.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/header-gradient.png b/ui/legacy/images/header-gradient.png
deleted file mode 100644
index 4f5e88f..0000000
--- a/ui/legacy/images/header-gradient.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/icons.png b/ui/legacy/images/icons.png
deleted file mode 100644
index f676969..0000000
--- a/ui/legacy/images/icons.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/infrastructure-icons.png b/ui/legacy/images/infrastructure-icons.png
deleted file mode 100644
index 188afb1..0000000
--- a/ui/legacy/images/infrastructure-icons.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/install-wizard-parts.png b/ui/legacy/images/install-wizard-parts.png
deleted file mode 100644
index 68b07ee..0000000
--- a/ui/legacy/images/install-wizard-parts.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/instance-wizard-parts.png b/ui/legacy/images/instance-wizard-parts.png
deleted file mode 100644
index 70c1098..0000000
--- a/ui/legacy/images/instance-wizard-parts.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/logo-login-oss.png b/ui/legacy/images/logo-login-oss.png
deleted file mode 100644
index 92fc81c..0000000
--- a/ui/legacy/images/logo-login-oss.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/logo.png b/ui/legacy/images/logo.png
deleted file mode 100644
index 2e3aae9..0000000
--- a/ui/legacy/images/logo.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/minus.png b/ui/legacy/images/minus.png
deleted file mode 100644
index 077db99..0000000
--- a/ui/legacy/images/minus.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/overlay-pattern.png b/ui/legacy/images/overlay-pattern.png
deleted file mode 100644
index 72342b4..0000000
--- a/ui/legacy/images/overlay-pattern.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/sample-project-view.png b/ui/legacy/images/sample-project-view.png
deleted file mode 100644
index 866273e..0000000
--- a/ui/legacy/images/sample-project-view.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/sprites.png b/ui/legacy/images/sprites.png
deleted file mode 100755
index 745c55c..0000000
--- a/ui/legacy/images/sprites.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/images/vm-instance-screen-sample.png b/ui/legacy/images/vm-instance-screen-sample.png
deleted file mode 100644
index 76b63b7..0000000
--- a/ui/legacy/images/vm-instance-screen-sample.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/index.html b/ui/legacy/index.html
deleted file mode 100644
index a0f6559..0000000
--- a/ui/legacy/index.html
+++ /dev/null
@@ -1,1998 +0,0 @@
-<!--
-     Licensed to the Apache Software Foundation (ASF) under one
-     or more contributor license agreements.  See the NOTICE file
-     distributed with this work for additional information
-     regarding copyright ownership.  The ASF licenses this file
-     to you under the Apache License, Version 2.0 (the
-     "License"); you may not use this file except in compliance
-     with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing,
-     software distributed under the License is distributed on an
-     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-     KIND, either express or implied.  See the License for the
-     specific language governing permissions and limitations
-     under the License.
--->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-        <title></title>
-        <link rel="shortcut icon" href="images/cloud.ico" />
-        <link type="text/css" rel="stylesheet" href="lib/jquery-ui/css/jquery-ui.css" />
-        <link type="text/css" rel="stylesheet" href="lib/reset.css"/>
-        <link type="text/css" rel="stylesheet" href="css/cloudstack3.css" />
-        <link type="text/css" rel="stylesheet" href="css/custom.css" />
-    </head>
-    <body>
-        <div style="width:100%; background-color: #ffd0d0; position:top; top:0, left: 0">
-          <div style="width: 75%; margin: 0 auto; padding: 5px;">
-            <p>The legacy UI has been deprecated in this version as notified in the <a href="http://docs.cloudstack.apache.org/en/4.14.0.0/releasenotes/about.html#new-user-interface-depreciation-notice-of-existing-ui">previous release</a> and will be <a href="http://docs.cloudstack.apache.org/en/4.15.0.0/releasenotes/about.html#primate-ga-and-legacy-ui-deprecation-and-removal-notice">removed in the next release</a>.</p>
-          </div>
-        </div>
-        <!-- CloudStack widget content -->
-        <div id="cloudStack3-container"></div>
-        <!-- Templates -->
-        <div id="template">
-            <!-- Login form -->
-            <div class="login">
-                <form>
-                    <div class="logo"></div>
-                    <div class="fields">
-                        <div id="login-dropdown">
-                            <select id="login-options" style="width: 260px">
-                            </select>
-                        </div>
-
-                        <div id="cloudstack-login">
-                            <!-- User name -->
-                            <div class="field username">
-                                <label for="username"><translate key="label.username"/></label>
-                                <input type="text" name="username" class="required" />
-                            </div>
-                            <!-- Password -->
-                            <div class="field password">
-                                <label for="password"><translate key="label.password"/></label>
-                                <input type="password" name="password" class="required" autocomplete="off" />
-                            </div>
-                            <!-- Domain -->
-                            <div class="field domain">
-                                <label for="domain"><translate key="label.domain"/></label>
-                                <input type="text" name="domain" />
-                            </div>
-                        </div>
-
-                        <div id="login-submit">
-                            <!-- Submit (login) -->
-                            <input id="login-submit" type="submit" tr="label.login" trf='value' value="label.login" />
-                        </div>
-                        <!-- Select language -->
-                        <div class="select-language">
-                            <select name="language" id="l10n-options">
-                                <option value=""></option> <!-- when this blank option is selected, default language of the browser will be used -->
-                            </select>
-                        </div>
-                    </div>
-                </form>
-            </div>
-            <!-- Instance wizard -->
-            <div class="multi-wizard instance-wizard">
-                <div class="progress">
-                    <ul>
-                        <li class="first"><span class="number">1</span><span><translate key="label.setup"/></span><span class="arrow"></span></li>
-                        <li><span class="number">2</span><span class="multiline"><translate key="label.select.a.template"/></span><span class="arrow"></span></li>
-                        <li><span class="number">3</span><span class="multiline"><translate key="label.compute.offering"/></span><span class="arrow"></span></li>
-                        <li><span class="number">4</span><span class="multiline"><translate key="label.disk.offering"/></span><span class="arrow"></span></li>
-                        <li><span class="number">5</span><span><translate key="label.affinity"/></span><span class="arrow"></span></li>
-                        <li><span class="number">6</span><span><translate key="label.menu.network"/></span><span class="arrow"></span></li>
-                        <li><span class="number">7</span><span><translate key="label.menu.sshkeypair"/></span><span class="arrow"></span></li>
-                        <li class="last"><span class="number">8</span><span><translate key="label.review"/></span></li>
-                    </ul>
-                </div>
-                <form>
-                    <div class="steps">
-                        <!-- Step 1: Setup -->
-                        <div class="step setup" wizard-step-id="setup">
-                            <div class="content">
-                                <!-- Select a zone -->
-                                <div class="section select-deployment">
-                                    <h3><translate key="label.select.deployment.infrastructure"/></h3>
-                                    <p><translate key="message.select.a.zone"/></p>
-                                    <div class="select-area lower-area">
-                                        <select name="zoneid" class="zoneid required" required></select>
-                                        <label for="zoneid" class="desc"><translate key="label.zone"/></label>
-                                    </div>
-                                    <div class="select-area lower-area">
-                                        <select name="podid" class="podid"></select>
-                                        <label for="podid" class="desc"><translate key="label.pod"/></label>
-                                    </div>
-                                    <div class="select-area lower-area">
-                                        <select name="clusterid" class="clusterid"></select>
-                                        <label for="clusterid" class="desc"><translate key="label.cluster"/></label>
-                                    </div>
-                                    <div class="select-area lower-area">
-                                        <select name="hostid" class="hostid"></select>
-                                        <label for="hostid" class="desc"><translate key="label.host"/></label>
-                                    </div>
-                                </div>
-                                <!-- Select template -->
-                                <div class="section select-template smaller-height">
-                                    <h3><translate key="label.select.iso.or.template" /></h3>
-                                    <p></p>
-                                    <div class="select-area">
-                                        <div class="desc"><translate key="message.template.desc"/></div>
-                                        <input type="radio" name="select-template" value="select-template" />
-                                        <label><translate key="label.template"/></label>
-                                    </div>
-                                    <div class="select-area">
-                                        <div class="desc"><translate key="message.iso.desc"/></div>
-                                        <input type="radio" name="select-template" value="select-iso" />
-                                        <label>ISO</label>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <!-- Step 2: Select ISO -->
-                        <div class="step select-iso" wizard-step-id="select-iso">
-                            <!-- Select template -->
-                            <div class="wizard-step-conditional select-template">
-                                <div class="main-desc">
-                                    <p><translate key="message.select.template"/></p>
-                                </div>
-                                <div class="template-select content tab-view">
-                                    <ul>
-                                        <li class="first"><a href="#instance-wizard-featured-templates"><translate key="label.featured"/></a></li>
-                                        <li><a href="#instance-wizard-community-templates"><translate key="label.community"/></a></li>
-                                        <li><a href="#instance-wizard-my-templates"><translate key="label.my.templates"/></a></li>
-                                        <li class="last"><a href="#instance-wizard-shared-templates"><translate key="label.shared"/></a></li>
-                                    </ul>
-
-                                    <!-- Used for Select Template only -->
-                                    <input type="hidden" wizard-field="hypervisor" name="hypervisor" value="" disabled="disabled"/>
-
-                                    <div id="instance-wizard-featured-templates">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-                                    <div id="instance-wizard-community-templates">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-                                    <div id="instance-wizard-my-templates">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-                                    <div id="instance-wizard-shared-templates">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-
-                                    <!-- Root disk size -->
-                                    <div class="section custom-size">
-                                        <label><translate key="label.root.disk.size"/></label>
-                                        <input type="text" name="rootDiskSize" />
-                                    </div>
-                                </div>
-                            </div>
-
-                            <!-- Select ISO -->
-                            <div class="wizard-step-conditional select-iso">
-                                <div class="main-desc">
-                                    <p><translate key="message.select.iso"/></p>
-                                </div>
-                                <div class="iso-select content tab-view">
-                                    <ul>
-                                        <li class="first"><a href="#instance-wizard-featured-isos"><translate key="label.featured"/></a></li>
-                                        <li><a href="#instance-wizard-community-isos"><translate key="label.community"/></a></li>
-                                        <li><a href="#instance-wizard-my-isos"><translate key="label.menu.my.isos"/></a></li>
-                                        <li class="last"><a href="#instance-wizard-shared-isos"><translate key="label.shared"/></a></li>
-                                    </ul>
-                                    <div id="instance-wizard-featured-isos">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-                                    <div id="instance-wizard-community-isos">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-                                    <div id="instance-wizard-my-isos">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-                                    <div id="instance-wizard-shared-isos">
-                                        <div class="select-container">
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-
-                        <!-- Step 3: Service Offering -->
-                        <div class="step service-offering" wizard-step-id="service-offering">
-                            <div class="content">
-                                <div class="select-container">
-                                </div>
-
-                                <!-- Custom size slider -->
-                                <div class="section custom-size custom-no-limits">
-                                    <div class="field">
-                                        <label><translate key="label.num.cpu.cores"/></label>
-                                        <input type="text" class="required disallowSpecialCharacters" name="compute-cpu-cores" />
-                                    </div>
-                                    <div class="field">
-                                        <label><translate key="label.cpu.mhz"/></label>
-                                        <input type="text" class="required disallowSpecialCharacters" name="compute-cpu" />
-                                    </div>
-                                    <div class="field">
-                                        <label><translate key="label.memory.mb"/></label>
-                                        <input type="text" class="required disallowSpecialCharacters" name="compute-memory" />
-                                    </div>
-                                </div>
-
-                                <!-- Custom size slider -->
-                                <div class="section custom-size custom-slider-container">
-                                    <div class="slider-cpu-cores">
-                                        <label><translate key="label.num.cpu.cores"/></label>
-                                        <!-- Slider -->
-                                        <label class="size min"><span></span></label>
-                                        <div class="slider custom-size"></div>
-                                        <label class="size max"><span></span></label>
-                                        <input type="text" class="required digits" name="slider-compute-cpu-cores" value="0" />
-                                        <label class="size">Cores</label>
-                                    </div>
-                                    <div class="slider-memory-mb">
-                                        <label><translate key="label.memory.mb"/></label>
-                                        <!-- Slider -->
-                                        <label class="size min"><span></span></label>
-                                        <div class="slider custom-size"></div>
-                                        <label class="size max"><span></span></label>
-                                        <input type="text" class="required disallowSpecialCharacters" name="slider-compute-memory" value="0"/>
-                                        <label class="size">MB</label>
-                                    </div>
-                                    <div class="slider-cpu-speed">
-                                        <input type="text" style="display:none;" name="slider-compute-cpu-speed" value="0" />
-                                    </div>
-                                </div>
-
-                                <!-- Custom iops -->
-                                <div class="section custom-iops">
-                                    <div class="field">
-                                        <label><translate key="label.disk.iops.min"/></label>
-                                        <input type="text" class="disallowSpecialCharacters" name="disk-min-iops" />
-                                    </div>
-                                    <div class="field">
-                                        <label><translate key="label.disk.iops.max"/></label>
-                                        <input type="text" class="disallowSpecialCharacters" name="disk-max-iops" />
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-
-                        <!-- Step 4: Data Disk Offering -->
-                        <div class="step data-disk-offering" wizard-step-id="data-disk-offering">
-                            <div class="content">
-                                <div class="section no-thanks">
-                                    <input type="radio" name="diskofferingid" value="0" />
-                                    <label><translate key="label.no.thanks"/></label>
-                                </div>
-
-                                <!-- Existing offerings -->
-                                <div class="select-container">
-                                </div>
-
-                                <!-- Custom size slider -->
-                                <div class="section custom-size custom-slider-container">
-                                    <label><translate key="label.disk.size"/></label>
-
-                                    <!-- Slider -->
-                                    <label class="size min"><span></span> GB</label>
-                                    <div class="slider custom-size"></div>
-                                    <label class="size max"><span></span> GB</label>
-
-                                    <input type="text" class="required digits" name="size" value="1" />
-                                    <label class="size">GB</label>
-                                </div>
-
-                                <!-- Custom iops -->
-                                <div class="section custom-iops-do">
-                                    <div class="field">
-                                        <label><translate key="label.disk.iops.min"/></label>
-                                        <input type="text" class="disallowSpecialCharacters" name="disk-min-iops-do" />
-                                    </div>
-                                    <div class="field">
-                                        <label><translate key="label.disk.iops.max"/></label>
-                                        <input type="text" class="disallowSpecialCharacters" name="disk-max-iops-do" />
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-
-                        <!-- Step 5: Affinity groups -->
-                        <div class="step affinity" wizard-step-id="affinity">
-                            <div class="content">
-                                <!-- Existing offerings -->
-                                <div class="select-container"></div>
-                            </div>
-                        </div>
-
-                        <!-- Step 6: Network -->
-                        <div class="step network always-load" wizard-step-id="network">
-                            <!-- 5a: Network description -->
-                            <div class="wizard-step-conditional nothing-to-select">
-                                <p id="from_instance_page_1"><translate key="message.zone.no.network.selection"/></p>
-                                <p id="from_instance_page_2"><translate key="message.please.proceed"/></p>
-                                <p id="from_vpc_tier">
-                                    <div class="specify-ip">
-                                        <label>
-                                            <translate key="label.ip.address" />
-                                        </label>
-                                        (<label><translate key="label.optional"></translate></label>):
-                                        <input type="text" name="vpc-specify-ip" />
-                                    </div>
-                                </p>
-                            </div>
-
-                            <!-- 5b: Select network -->
-                            <div class="wizard-step-conditional select-network">
-                                <div class="content">
-                                    <div class="main-desc">
-                                        <translate key="message.please.select.networks"/>
-                                    </div>
-                                    <div class="select-vpc">
-                                        <label>VPC:</label>
-                                        <select name="vpc-filter">
-                                            <option value="-1">No VPC</option>
-                                        </select>
-                                    </div>
-                                    <div class="select my-networks">
-                                        <table>
-                                            <thead>
-                                                <tr>
-                                                    <th><translate key="label.networks"/></th>
-                                                </tr>
-                                            </thead>
-                                            <tbody>
-                                                <tr>
-                                                    <td>
-                                                        <div class="select-container">
-                                                        </div>
-                                                    </td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                    <div class="select new-network">
-                                        <table>
-                                            <thead>
-                                                <tr>
-                                                    <th><translate key="label.add.network"/></th>
-                                                </tr>
-                                            </thead>
-                                            <tbody>
-                                                <tr>
-                                                    <td>
-                                                        <div class="select-container fixed">
-                                                            <div class="select even">
-                                                                <input type="checkbox" name="new-network"
-                                                                       wizard-field="my-networks"
-                                                                       value="create-new-network"
-                                                                       checked="checked" />
-                                                                <!-- Default (NEW) -->
-                                                                <div class="select-desc hide-if-selected">
-                                                                    <div class="name"><translate key="label.new"/></div>
-                                                                </div>
-
-                                                                <!-- Name -->
-                                                                <div class="field name hide-if-unselected">
-                                                                    <div class="name"> <span class="field-required">*</span> <translate key="label.name"/></div>
-                                                                    <div class="value">
-                                                                        <input type="text" class="required disallowSpecialCharacters" name="new-network-name" />
-                                                                    </div>
-                                                                </div>
-
-                                                                <!-- Service offering -->
-                                                                <div class="select-desc field service-offering hide-if-unselected">
-                                                                    <div class="name"><translate key="label.network.offering"/></div>
-                                                                    <div class="desc">
-                                                                        <select name="new-network-networkofferingid">
-                                                                        </select>
-                                                                    </div>
-                                                                </div>
-
-                                                                <div class="secondary-input hide-if-unselected">
-                                                                    <input type="radio" name="defaultNetwork" value="new-network" wizard-field="default-network" />
-                                                                    <div class="name"><translate key="label.default"/></div>
-                                                                </div>
-                                                            </div>
-                                                        </div>
-                                                    </td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-                            </div>
-                            <!-- Step 5c: Select security group -->
-                            <div class="wizard-step-conditional select-security-group">
-                                <div class="main-desc">
-                                    <translate key="message.select.security.groups"/>
-                                </div>
-                                <div class="content security-groups">
-                                    <div class="select-container">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <!-- Step 7: SSH Key pairs -->
-                        <div class="step sshkeyPairs" wizard-step-id="sshkeyPairs">
-                          <div class="content">
-                            <div class="section no-thanks">
-                              <input type="radio" name="sshkeypair" value="" />
-                              <label><translate key="label.no.thanks"/></label>
-                            </div>
-                            <!-- Existing key pairs -->
-                            <div class="select-container"></div>
-                          </div>
-                        </div>
-
-                        <!-- Pre-step 8: Configure OVF properties if available -->
-                        <div class="step ovf-properties" wizard-step-id="ovfProperties">
-                            <div class="content">
-                                <!-- Existing key pairs -->
-                                <div class="select-container"></div>
-                            </div>
-                        </div>
-
-                        <!-- Step 8: Review -->
-                        <div class="step review" wizard-step-id="review">
-                            <div class="main-desc">
-                                <translate key="message.vm.review.launch"/>
-                            </div>
-                            <div class="content">
-                                <div class="select-container">
-                                    <!-- Name -->
-                                    <div class="select odd vm-instance-name">
-                                        <div class="name">
-                                            <span><label><translate key="label.name" /></label> (<label><translate key="label.optional"/></label>)</span>
-                                        </div>
-                                        <div class="value">
-                                            <input type="text" name="displayname" class="disallowSpecialCharacters" />
-                                        </div>
-                                    </div>
-                                    <!-- Add to group -->
-                                    <div class="select">
-                                        <div class="name">
-                                            <span><label><translate key="label.add.to.group"/></label> (<label><translate key="label.optional"/></label>)</span>
-                                        </div>
-                                        <div class="value">
-                                            <input type="text" name="groupname" class="disallowSpecialCharacters" />
-                                        </div>
-                                    </div>
-
-                                    <!-- Keyboard Language -->
-                                    <div class="select odd">
-                                        <div class="name">
-                                            <span><translate key="label.keyboard.language" /></span>
-                                        </div>
-                                        <div class="value">
-                                            <select name="keyboardLanguage" id="keyboard-options">
-                                                <option value=""></option>
-                                            </select>
-                                        </div>
-                                    </div>
-
-                                    <!--  UEFI Boot -->
-                                    <div class="select" odd>
-                                        <div class="name">
-                                            <span><translate key="label.vm.boottype" /></span>
-                                        </div>
-                                        <div class="value">
-                                            <select name="customboot" id="customboot">
-                                                <option value="BIOS">BIOS</option>
-                                                <option value="UEFI">UEFI</option>
-                                            </select>
-                                        </div>
-                                    </div>
-
-                                    <div class="select field hide-if-unselected">
-                                        <div class="name">
-                                            <span><translate key="label.vm.bootmode" /></span>
-                                        </div>
-                                        <div class="value">
-                                            <select name="bootmode" id="bootmode">
-                                                <option value="LEGACY">LEGACY</option>
-                                            </select>
-                                        </div>
-                                    </div>
-
-                                    <div class="select-area">
-                                        <div class="value">
-                                            <input type="checkbox" name="bootintosetup" id="bootintosetup" />
-                                            <label><translate key="label.vm.enterhardwaresetup" /></label>
-                                        </div>
-                                    </div>
-
-                                    <!-- Zone -->
-                                    <div class="select">
-                                        <div class="name">
-                                            <span><translate key="label.zone"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="zone"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="1"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-                                    <!-- Hypervisor -->
-                                    <div class="select odd">
-                                        <div class="name">
-                                            <span><translate key="label.hypervisor"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="hypervisor"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="2"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-                                    <!-- Template -->
-                                    <div class="select">
-                                        <div class="name">
-                                            <span><translate key="label.template"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="template"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="2"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-                                    <!-- Service offering -->
-                                    <div class="select odd">
-                                        <div class="name">
-                                            <span><translate key="label.compute.offering"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="service-offering"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="3"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-                                    <!-- Disk offering -->
-                                    <div class="select">
-                                        <div class="name">
-                                            <span><translate key="label.disk.offering"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="disk-offering"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="4"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-
-                                    <!-- Affinity -->
-                                    <div class="select">
-                                        <div class="name">
-                                            <span><translate key="label.affinity.groups"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="affinity-groups"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="5"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-
-                                    <!-- Primary network -->
-                                    <div class="select odd">
-                                        <div class="name">
-                                            <span><translate key="label.network"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="default-network" conditional-field="select-network"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="6"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-
-                                    <!-- Security groups -->
-                                    <div class="select odd">
-                                        <div class="name">
-                                            <span><translate key="label.security.groups"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="security-groups" conditional-field="select-security-group"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="6"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-
-                                    <!-- SSH Key Pairs -->
-                                    <div class="select">
-                                        <div class="name">
-                                            <span><translate key="label.ssh.key.pairs"/></span>
-                                        </div>
-                                        <div class="value">
-                                            <span wizard-field="sshkey-pairs"></span>
-                                        </div>
-                                        <div class="edit">
-                                            <a href="7"><translate key="label.edit"/></a>
-                                        </div>
-                                    </div>
-
-                                    <!-- userdata -->
-                                    <div class="select">
-                                        <div class="name">
-                                            <span><label><translate key="label.add.userdata"/></label> (<label><translate key="label.optional"/></label>)</span>
-                                        </div>
-                                        <div class="value">
-                                            <textarea name="userdata"></textarea>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </form>
-                <!-- Computer diagram -->
-                <div class="diagram">
-                    <div>
-                        <div class="part zone-plane"></div>
-                        <div class="part computer-tower-front"></div>
-                        <div class="part computer-tower-back"></div>
-                    </div>
-                    <div class="part os-drive"></div>
-                    <div class="part cpu"></div>
-                    <div class="part hd"></div>
-                    <div class="part network-card"></div>
-                </div>
-                <!-- Buttons -->
-                <div class="buttons">
-                    <div class="button previous"><span><translate key="label.previous"/></span></div>
-                    <div class="button cancel"><span><translate key="label.cancel"/></span></div>
-                    <div class="button next"><span><translate key="label.next"/></span></div>
-                </div>
-            </div>
-            <!-- Accounts wizard -->
-            <div class="multi-wizard accounts-wizard">
-                <form>
-                    <div class="steps">
-                        <div class="content ldap-account-choice">
-                            <div class="select-container">
-                                <table>
-                                    <thead>
-                                        <tr>
-                                            <th><translate key="label.select"/></th>
-                                            <th><translate key="label.name"/></th>
-                                            <th><translate key="label.username"/></th>
-                                            <th><translate key="label.email"/></th>
-                                            <th><translate key="label.user.conflict"/></th>
-                                        </tr>
-                                    </thead>
-                                    <tbody>
-                                    </tbody>
-                                </table>
-                            </div>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container manual-account-details">
-                            </div>
-                        </div>
-                    </div>
-                </form>
-                <div class="buttons">
-                    <button class="cancel ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span><translate key="label.cancel"/></span></button>
-                    <button class="next ok ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span><translate key="label.add"/></span></button>
-                </div>
-            </div>
-            <!-- Zone wizard -->
-            <div class="multi-wizard zone-wizard">
-                <div class="progress">
-                    <ul>
-                        <li class="first"><span class="number">1</span><span><translate key="label.zone.type"/></span><span class="arrow"></span></li>
-                        <li><span class="number">2</span><span><translate key="label.setup.zone"/></span><span class="arrow"></span></li>
-                        <li><span class="number">3</span><span><translate key="label.setup.network"/></span><span class="arrow"></span></li>
-                        <li style="display:none;"></li>
-                        <li style="display:none;"></li>
-                        <li style="display:none;"></li>
-                        <li style="display:none;"></li>
-                        <li><span class="number">4</span><span><translate key="label.add.resources"/></span><span class="arrow"></span></li>
-                        <li style="display:none;"></li>
-                        <li style="display:none;"></li>
-                        <li style="display:none;"></li>
-                        <li class="last"><span class="number">5</span><span><translate key="label.launch"/></span></li>
-                    </ul>
-                </div>
-                <div class="steps">
-                    <!-- Step 1: Select network -->
-                    <div class="select-network" zone-wizard-step-id="selectZoneType">
-                        <form>
-                            <div class="content">
-                                <!-- Select template -->
-                                <div class="section select-network-model">
-                                    <h3><translate key="label.set.up.zone.type"/></h3>
-                                    <p><translate key="message.please.select.a.configuration.for.your.zone"/></p>
-                                    <div class="select-area basic-zone">
-                                        <div class="desc">
-                                            <translate key="message.desc.basic.zone"/>
-                                        </div>
-                                        <input type="radio" name="network-model" value="Basic" checked="checked" />
-                                        <label><translate key="label.basic"/></label>
-                                    </div>
-                                    <div class="select-area advanced-zone disabled">
-                                        <div class="desc">
-                                            <translate key="message.desc.advanced.zone"/>
-                                        </div>
-                                        <input type="radio" name="network-model" value="Advanced" />
-                                        <label><translate key="label.advanced"/></label>
-                                        <!-- Isolation mode -->
-                                        <div class="isolation-mode">
-                                            <div class="title">
-                                                <translate key="label.isolation.mode"/>
-                                            </div>
-
-                                            <!-- Security groups -->
-                                            <div class="select-area">
-                                                <div class="desc">
-                                                    <translate key="message.advanced.security.group"/>
-                                                </div>
-                                                <input type="checkbox" name="zone-advanced-sg-enabled" disabled="disabled" />
-                                                <label><translate key="label.menu.security.groups"/></label>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </form>
-                    </div>
-                    <!-- Step 2: Add zone -->
-                    <div class="setup-zone" zone-wizard-form="zone"
-                         zone-wizard-step-id="addZone">
-                        <div class="info-desc">
-                            <translate key="message.desc.zone"/>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 3.1: Setup Physical Network -->
-                    <div class="setup-physical-network"
-                         zone-wizard-step-id="setupPhysicalNetwork"
-                         zone-wizard-prefilter="setupPhysicalNetwork">
-                        <ul class="subnav">
-                            <li class="physical-network active"><translate key="label.physical.network"/></li>
-                            <li class="public-network"><translate key="label.public.traffic"/></li>
-                            <li class="pod"><translate key="label.pod"/></li>
-                            <li class="guest-traffic"><translate key="label.guest.traffic"/></li>
-                            <li class="conditional storage-traffic"><translate key="label.storage.traffic"/></li>
-                        </ul>
-                        <div class="info-desc conditional advanced">
-                            <translate key="message.setup.physical.network.during.zone.creation"/>
-                        </div>
-                        <div class="info-desc conditional basic">
-                            <translate key="message.setup.physical.network.during.zone.creation.basic"/>
-                        </div>
-                        <div class="button add new-physical-network"><span class="icon">&nbsp;</span><span><translate key="label.add.physical.network"/></span></div>
-                        <!-- Traffic types drag area -->
-                        <div class="traffic-types-drag-area">
-                            <div class="header"><translate key="label.traffic.types"/></div>
-                            <ul>
-                                <li class="management">
-                                    <ul class="container">
-                                        <li traffic-type-id="management"
-                                            tr="label.zoneWizard.trafficType.management" trf="title"
-                                            title="label.zoneWizard.trafficType.management"
-                                            class="traffic-type-draggable management">
-                                            <!-- Edit buttton -->
-                                            <div class="edit-traffic-type">
-                                                <span class="name"><translate key="label.management"/></span>
-                                                <span class="icon">&nbsp;</span>
-                                                <span>Edit</span>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                    <div class="info">
-                                        <div class="title"><translate key="label.management"/></div>
-                                        <div class="desc"></div>
-                                    </div>
-                                </li>
-                                <li class="public">
-                                    <ul class="container">
-                                        <li traffic-type-id="public"
-                                            tr="label.zoneWizard.trafficType.public" trf="title"
-                                            title="label.zoneWizard.trafficType.public"
-                                            class="traffic-type-draggable public">
-                                            <!-- Edit buttton -->
-                                            <div class="edit-traffic-type">
-                                                <span class="name"><translate key="label.public"/></span>
-                                                <span class="icon">&nbsp;</span>
-                                                <span>Edit</span>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                    <div class="info">
-                                        <div class="title"><translate key="label.public"/></div>
-                                        <div class="desc"></div>
-                                    </div>
-                                </li>
-                                <li class="guest">
-                                    <ul class="container">
-                                        <li traffic-type-id="guest"
-                                            tr="label.zoneWizard.trafficType.guest" trf="title"
-                                            title="label.zoneWizard.trafficType.guest"
-                                            class="traffic-type-draggable guest">
-                                            <!-- Edit buttton -->
-                                            <div class="edit-traffic-type">
-                                                <span class="name"><translate key="label.guest"/></span>
-                                                <span class="icon">&nbsp;</span>
-                                                <span>Edit</span>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                    <div class="info">
-                                        <div class="title"><translate key="label.guest"/></div>
-                                        <div class="desc"></div>
-                                    </div>
-                                </li>
-                                <li class="storage">
-                                    <ul class="container">
-                                        <li traffic-type-id="storage"
-                                            tr="label.zoneWizard.trafficType.storage" trf="title"
-                                            title="label.zoneWizard.trafficType.storage"
-                                            class="traffic-type-draggable storage">
-                                            <!-- Edit buttton -->
-                                            <div class="edit-traffic-type">
-                                                <span class="name"><translate key="label.storage"/></span>
-                                                <span class="icon">&nbsp;</span>
-                                                <span>Edit</span>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                    <div class="info">
-                                        <div class="title"><translate key="label.storage"/></div>
-                                        <div class="desc"></div>
-                                    </div>
-                                </li>
-                            </ul>
-                        </div>
-                        <div class="drag-helper-icon"></div>
-                        <div class="content input-area">
-                            <form></form>
-                        </div>
-                    </div>
-                    <!-- Step 3.1b: Add Netscaler device -->
-                    <div class="setup-physical-network-basic"
-                         zone-wizard-step-id="addNetscalerDevice"
-                         zone-wizard-form="basicPhysicalNetwork"
-                         zone-wizard-prefilter="addNetscalerDevice">
-                        <ul class="subnav">
-                            <li class="conditional netscaler physical-network active"><translate key="label.netScaler"/></li>
-                            <li class="public-network"><translate key="label.public.traffic"/></li>
-                            <li class="pod"><translate key="label.pod"/></li>
-                            <li class="guest-traffic"><translate key="label.guest.traffic"/></li>
-                            <li class="conditional storage-traffic"><translate key="label.storage.traffic"/></li>
-                        </ul>
-                        <div class="info-desc"><translate key="label.please.specify.netscaler.info"/></div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 3.2: Configure public traffic -->
-                    <div class="setup-public-traffic" zone-wizard-prefilter="addPublicNetwork"
-                         zone-wizard-step-id="configurePublicTraffic">
-                        <ul class="subnav">
-                            <li class="conditional netscaler physical-network"><translate key="label.netScaler"/></li>
-                            <li class="public-network active"><translate key="label.public.traffic"/></li>
-                            <li class="pod"><translate key="label.pod"/></li>
-                            <li class="guest-traffic"><translate key="label.guest.traffic"/></li>
-                            <li class="conditional storage-traffic"><translate key="label.storage.traffic"/></li>
-                        </ul>
-                        <div class="info-desc" id="add_zone_public_traffic_desc">
-                            <span id="for_basic_zone" style="display:none"><translate key="message.public.traffic.in.basic.zone"/></span>
-                            <span id="for_advanced_zone" style="display:none"><translate key="message.public.traffic.in.advanced.zone"/></span>
-                        </div>
-                        <div ui-custom="publicTrafficIPRange"></div>
-                    </div>
-                    <!-- Step 3.3: Add pod -->
-                    <div class="add-pod" zone-wizard-form="pod"
-                         zone-wizard-step-id="addPod">
-                        <ul class="subnav">
-                            <li class="conditional netscaler physical-network"><translate key="label.netScaler"/></li>
-                            <li class="public-network"><translate key="label.public.traffic"/></li>
-                            <li class="pod active"><translate key="label.pod"/></li>
-                            <li class="guest-traffic"><translate key="label.guest.traffic"/></li>
-                            <li class="conditional storage-traffic"><translate key="label.storage.traffic"/></li>
-                        </ul>
-                        <div class="info-desc">
-                            <translate key="message.add.pod.during.zone.creation"/>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 3.4: Configure guest traffic -->
-                    <div class="setup-guest-traffic"
-                         zone-wizard-form="guestTraffic"
-                         zone-wizard-step-id="configureGuestTraffic"
-                         zone-wizard-prefilter="configureGuestTraffic">
-                        <ul class="subnav">
-                            <li class="conditional netscaler physical-network"><translate key="label.netScaler"/></li>
-                            <li class="public-network"><translate key="label.public.traffic"/></li>
-                            <li class="pod"><translate key="label.pod"/></li>
-                            <li class="guest-traffic active"><translate key="label.guest.traffic"/></li>
-                            <li class="conditional storage-traffic"><translate key="label.storage.traffic"/></li>
-                        </ul>
-                        <div class="info-desc" id="add_zone_guest_traffic_desc">
-                            <span id="for_basic_zone" style="display:none"><translate key="message.guest.traffic.in.basic.zone"/></span>
-                            <span id="for_advanced_zone" style="display:none"><translate key="message.guest.traffic.in.advanced.zone"/></span>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 3.5: Configure storage traffic -->
-                    <div class="setup-storage-traffic" zone-wizard-prefilter="configureStorageTraffic"
-                         zone-wizard-step-id="configureStorageTraffic">
-                        <ul class="subnav">
-                            <li class="conditional netscaler physical-network"><translate key="label.netScaler"/></li>
-                            <li class="public-network"><translate key="label.public.traffic"/></li>
-                            <li class="pod"><translate key="label.pod"/><</li>
-                                                                               <li class="guest-traffic"><translate key="label.guest.traffic"/></li>
-                            <li class="storage-traffic active"><translate key="label.storage.traffic"/></li>
-                        </ul>
-                        <div class="info-desc">
-                            <translate key="message.storage.traffic"/>
-                        </div>
-                        <div ui-custom="storageTrafficIPRange"></div>
-                    </div>
-                    <!-- Step 4.1: Add cluster -->
-                    <div class="add-cluster" zone-wizard-form="cluster"
-                         zone-wizard-step-id="addCluster">
-                        <ul class="subnav">
-                            <li class="cluster active"><translate key="label.cluster"/></li>
-                            <li class="host"><translate key="label.host"/></li>
-                            <li class="primary-storage"><translate key="label.primary.storage"/></li>
-                            <li class="secondary-storage"><translate key="label.secondary.storage"/></li>
-                        </ul>
-
-                        <div class="info-desc">
-                            <translate key="message.desc.cluster"/>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 4.2: Add host -->
-                    <div class="add-cluster" zone-wizard-form="host"
-                         zone-wizard-step-id="addHost" zone-wizard-prefilter="addHost">
-                        <ul class="subnav">
-                            <li class="cluster"><translate key="label.cluster"/></li>
-                            <li class="host active"><translate key="label.host"/></li>
-                            <li class="primary-storage"><translate key="label.primary.storage"/></li>
-                            <li class="secondary-storage"><translate key="label.secondary.storage"/></li>
-                        </ul>
-                        <div class="info-desc">
-                            <translate key="message.desc.host"/>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 4.3: Add primary storage -->
-                    <div class="add-cluster" zone-wizard-form="primaryStorage" zone-wizard-prefilter="addPrimaryStorage"
-                         zone-wizard-step-id="addPrimaryStorage">
-                        <ul class="subnav">
-                            <li class="cluster"><translate key="label.cluster"/></li>
-                            <li class="host"><translate key="label.host"/></li>
-                            <li class="primary-storage active"><translate key="label.primary.storage"/></li>
-                            <li class="secondary-storage"><translate key="label.secondary.storage"/></li>
-                        </ul>
-                        <div class="info-desc">
-                            <translate key="message.desc.primary.storage"/>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 4.4: Add secondary storage -->
-                    <div class="add-cluster" zone-wizard-form="secondaryStorage"
-                         zone-wizard-step-id="addSecondaryStorage">
-                        <ul class="subnav">
-                            <li class="cluster"><translate key="label.cluster"/></li>
-                            <li class="host"><translate key="label.host"/></li>
-                            <li class="primary-storage"><translate key="label.primary.storage"/></li>
-                            <li class="secondary-storage active"><translate key="label.secondary.storage"/></li>
-                        </ul>
-                        <div class="info-desc">
-                            <translate key="message.desc.secondary.storage"/>
-                        </div>
-                        <div class="content input-area">
-                            <div class="select-container"></div>
-                        </div>
-                    </div>
-                    <!-- Step 5: Launch -->
-                    <div class="review" zone-wizard-step-id="launch">
-                        <div class="main-desc pre-setup"><translate key="message.launch.zone"/></div>
-                        <div class="main-desc launch" style="display:none;">
-                            <translate key="message.please.wait.while.zone.is.being.created"/>
-                        </div>
-                        <form>
-                        </form>
-                        <div class="launch-container" style="display: none">
-                            <ul></ul>
-                        </div>
-                    </div>
-                </div>
-                <!-- Buttons -->
-                <div class="buttons">
-                    <div class="button previous"><span><translate key="label.previous"/></span></div>
-                    <div class="button cancel"><span><translate key="label.cancel"/></span></div>
-                    <div class="button next"><span><translate key="label.next"/></span></div>
-                </div>
-            </div>
-            <!-- Network chart -->
-            <div class="network-chart normal">
-                <ul>
-                    <li class="firewall">
-                        <div class="name"><span><translate key="label.firewall"/></span></div>
-                        <div class="view-details" net-target="firewall"><translate key="label.view.all"/></div>
-                    </li>
-                    <li class="loadBalancing">
-                        <div class="name"><span><translate key="label.load.balancing"/></span></div>
-                        <div class="view-details" net-target="loadBalancing"><translate key="label.view.all"/></div>
-                    </li>
-                    <li class="portForwarding">
-                        <div class="name"><span><translate key="label.port.forwarding"/></span></div>
-                        <div class="view-details" net-target="portForwarding"><translate key="label.view.all"/></div>
-                    </li>
-                </ul>
-            </div>
-            <!-- Static NAT network chart -->
-            <div class="network-chart static-nat">
-                <ul>
-                    <li class="static-nat-enabled">
-                        <div class="name"><span><translate key="label.static.nat.enabled"/></span></div>
-                        <div class="vmname"></div>
-                    </li>
-                    <li class="firewall">
-                        <div class="name"><span><translate key="label.firewall"/></span></div>
-                        <!--<div class="view-details" net-target="staticNAT"><translate key="label.view.all"/></div>-->
-                        <div class="view-details" net-target="firewall"><translate key="label.view.all" /></div>
-                    </li>
-                </ul>
-            </div>
-            <!-- Project dashboard -->
-            <div class="project-dashboard-view">
-                <div class="overview-area">
-                    <!-- Compute and storage -->
-                    <div class="compute-and-storage">
-                        <div class="system-dashboard">
-                            <div class="head">
-                                <span><translate key="label.compute.and.storage"/></span>
-                            </div>
-                            <ul class="status_box good">
-                                <!-- Virtual Machines -->
-                                <li class="block virtual-machines">
-                                    <span class="header"><translate key="label.virtual.machines"/></span>
-                                    <div class="icon"></div>
-                                    <div class="overview">
-                                        <!-- Running -->
-                                        <div class="overview-item running">
-                                            <div class="total" data-item="runningInstances">5</div>
-                                            <div class="label"><translate key="state.Running"/></div>
-                                        </div>
-
-                                        <!-- Stopped -->
-                                        <div class="overview-item stopped">
-                                            <div class="total" data-item="stoppedInstances">10</div>
-                                            <div class="label"><translate key="state.Stopped"/></div>
-                                        </div>
-                                    </div>
-                                </li>
-
-                                <!-- Storage -->
-                                <li class="block storage">
-                                    <span class="header"><translate key="label.storage"/></span>
-                                    <div class="icon"></div>
-                                    <div class="overview">
-                                        <div class="total" data-item="totalVolumes">10</div>
-                                        <div class="label"><translate key="label.volumes"/></div>
-                                    </div>
-                                </li>
-
-                                <!-- Bandwidth -->
-                                <li class="block storage bandwidth">
-                                    <span class="header"><translate key="label.bandwidth"/></span>
-                                    <div class="icon"></div>
-                                    <div class="overview">
-                                        <div class="total" data-item="totalBandwidth">200</div>
-                                        <div class="label">mb/s</div>
-                                    </div>
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-
-                    <!-- Users -->
-                    <div class="users">
-                        <div class="system-dashboard">
-                            <div class="head">
-                                <span><translate key="label.users"/></span>
-                            </div>
-                            <ul class="status_box good" data-item="users">
-                                <li class="block user">
-                                    <span class="header" data-list-item="account"></span>
-                                    <div class="icon"></div>
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-                </div>
-                <div class="info-boxes">
-                    <!-- Networking and security -->
-                    <div class="info-box networking-and-security">
-                        <div class="title">
-                            <span><translate key="label.networking.and.security"/></span>
-                        </div>
-                        <ul>
-                            <!-- IP addresses -->
-                            <li class="odd">
-                                <div class="total"><span data-item="totalIPAddresses"></span></div>
-                                <div class="desc"><translate key="label.menu.ipaddresses"/></div>
-                            </li>
-
-                            <!-- Load balancing policies -->
-                            <li>
-                                <div class="total"><span data-item="totalLoadBalancers"></span></div>
-                                <div class="desc"><translate key="label.load.balancing.policies"/></div>
-                            </li>
-
-                            <!-- Port forwarding policies -->
-                            <li class="odd">
-                                <div class="total"><span data-item="totalPortForwards"></span></div>
-                                <div class="desc"><translate key="label.port.forwarding.policies"/></div>
-                            </li>
-
-                            <!-- Blank -->
-                            <li>
-                                <div class="total"></div>
-                                <div class="desc"></div>
-                            </li>
-
-                            <!-- Manage resources -->
-                            <li class="odd">
-                                <div class="total"></div>
-                                <div class="desc">
-                                    <div class="button manage-resources">
-                                        <span><translate key="label.manage.resources"/></span>
-                                        <span class="arrow"></span>
-                                    </div>
-                                </div>
-                            </li>
-                        </ul>
-                    </div>
-                    <!-- Events -->
-                    <div class="info-box events">
-                        <div class="title">
-                            <span><translate key="label.menu.events"/></span>
-                            <div class="button view-all">
-                                <span><translate key="label.view.all"/></span>
-                                <span class="arrow"></span>
-                            </div>
-                        </div>
-                        <ul data-item="events">
-                            <li class="odd">
-                                <div class="date"><span data-list-item="date"></span></div>
-                                <div class="desc" data-list-item="desc"></div>
-                            </li>
-                        </ul>
-                    </div>
-                </div>
-            </div>
-            <!-- System dashboard -->
-            <div class="system-dashboard-view">
-                <div class="toolbar">
-                    <div class="button refresh" id="refresh_button">
-                        <span><translate key="label.refresh"/></span>
-                    </div>
-                    <div id="update_ssl_button" class="button action main-action reduced-hide lock" title="Updates your SSL Certificate">
-                        <span class="icon">&nbsp;</span>
-                        <span><translate key="label.update.ssl.cert"/></span>
-                    </div>
-                </div>
-
-                <!-- Zone dashboard -->
-                <div class="system-dashboard zone">
-                    <div class="head">
-                        <span><translate key="label.menu.infrastructure"/></span>
-                    </div>
-                    <ul class="status_box good">
-                        <li class="block zones">
-                            <span class="header"><translate key="label.zones"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="zoneCount"></span>
-                            <span class="button view-all zones"
-                                  tr="label.zones" trf="view-all-title"
-                                  view-all-title="label.zones"
-                                  view-all-target="zones"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block pods">
-                            <span class="header"><translate key="label.pods"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="podCount"></span>
-                            <span class="button view-all pods"
-                                  tr="label.pods" trf="view-all-title"
-                                  view-all-title="label.pods"
-                                  view-all-target="pods"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block clusters">
-                            <span class="header"><translate key="label.clusters"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="clusterCount"></span>
-                            <span class="button view-all clusters"
-                                  tr="label.clusters" trf="view-all-title"
-                                  view-all-title="label.clusters"
-                                  view-all-target="clusters"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block last hosts">
-                            <span class="header"><translate key="label.hosts"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="hostCount"></span>
-                            <span class="button view-all hosts"
-                                  tr="label.hosts" trf="view-all-title"
-                                  view-all-title="label.hosts"
-                                  view-all-target="hosts"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block primary-storage">
-                            <span class="header"><translate key="label.primary.storage"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="primaryStorageCount"></span>
-                            <span class="button view-all zones"
-                                  tr="label.primary.storage" trf="view-all-title"
-                                  view-all-title="label.primary.storage"
-                                  view-all-target="primaryStorage"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block secondary-storage">
-                            <span class="header"><translate key="label.secondary.storage"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="secondaryStorageCount"></span>
-                            <span class="button view-all pods"
-                                  tr="label.secondary.storage" trf="view-all-title"
-                                  view-all-title="label.secondary.storage"
-                                  view-all-target="secondaryStorage"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block system-vms">
-                            <span class="header"><translate key="label.system.vms"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="systemVmCount"></span>
-                            <span class="button view-all clusters"
-                                  tr="label.system.vms" trf="view-all-title"
-                                  view-all-title="label.system.vms"
-                                  view-all-target="systemVms"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block virtual-routers">
-                            <span class="header"><translate key="label.virtual.routers"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="virtualRouterCount"></span>
-                            <span class="button view-all hosts"
-                                  tr="label.virtual.routers" trf="view-all-title"
-                                  view-all-title="label.virtual.routers"
-                                  view-all-target="virtualRouters"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block sockets">
-                            <span class="header"><translate key="label.sockets"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="socketCount"></span>
-                            <span class="button view-all sockets"
-                                  tr="label.sockets" trf="view-all-title"
-                                  view-all-title="label.sockets"
-                                  view-all-target="sockets"><translate key="label.view.all"/></span>
-                        </li>
-                        <li class="block management-servers">
-                            <span class="header"><translate key="label.management.servers"/></span>
-                            <span class="icon">&nbsp;</span>
-                            <span class="overview total" data-item="managementServerCount"></span>
-                            <span class="button view-all clusters"
-                                  tr="label.management.servers" trf="view-all-title"
-                                  view-all-title="label.management.servers"
-                                  view-all-target="managementServers"><translate key="label.view.all"/></span>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-
-            <!-- Zone chart -->
-            <div class="zone-chart">
-                <!-- Side info -- Basic zone -->
-                <div class="side-info basic">
-                    <ul>
-                        <li>
-                            <div class="icon"><span>1</span></div>
-                            <div class="title"><translate key="label.guest" /></div>
-                            <p>Set up the network for traffic between end-user VMs.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>2</span></div>
-                            <div class="title">Clusters</div>
-                            <p>Define one or more clusters to group the compute hosts.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>3</span></div>
-                            <div class="title">Hosts</div>
-                            <p>Add hosts to clusters. Hosts run hypervisors and VMs.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>4</span></div>
-                            <div class="title">Primary Storage</div>
-                            <p>Add servers to store VM disk volumes in each cluster.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>5</span></div>
-                            <div class="title">Secondary Storage</div>
-                            <p>Add servers to store templates, ISOs, and snapshots for the whole zone.</p>
-                        </li>
-                    </ul>
-                </div>
-
-                <!-- Side info -- Advanced zone -->
-                <div class="side-info advanced">
-                    <ul>
-                        <li>
-                            <div class="icon"><span>1</span></div>
-                            <div class="title">Public</div>
-                            <p>Set up the network for Internet traffic.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>2</span></div>
-                            <div class="title">Guest</div>
-                            <p>Set up the network for traffic between end-user VMs.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>3</span></div>
-                            <div class="title">Clusters</div>
-                            <p>Define one or more clusters to group the compute hosts.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>4</span></div>
-                            <div class="title">Hosts</div>
-                            <p>Add hosts to clusters. Hosts run hypervisors and VMs.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>5</span></div>
-                            <div class="title">Primary Storage</div>
-                            <p>Add servers to store VM disk volumes in each cluster.</p>
-                        </li>
-                        <li>
-                            <div class="icon"><span>6</span></div>
-                            <div class="title">Secondary Storage</div>
-                            <p>Add servers to store templates, ISOs, and snapshots for the whole zone.</p>
-                        </li>
-                    </ul>
-                </div>
-
-                <!-- NAAS configuration -->
-                <div class="resources naas">
-                    <div class="head">
-                        <span>Zone Configuration</span>
-                    </div>
-                    <ul class="system-main">
-                        <li class="main public" rel="public">
-                            <div class="tooltip-icon advanced"><span>1</span></div>
-                            <div class="name">Public</div>
-                            <div class="view-all configure">Configure</div>
-                        </li>
-                        <li class="main management" rel="management">
-                            <div class="name">Management</div>
-                            <div class="view-all configure">Configure</div>
-                        </li>
-                        <li class="main guest" rel="guest">
-                            <div class="tooltip-icon advanced"><span>2</span></div>
-                            <div class="tooltip-icon basic"><span>1</span></div>
-                            <div class="name">Guest</div>
-                            <div class="view-all configure">Configure</div>
-                        </li>
-                    </ul>
-                </div>
-
-                <!-- Zone resources -->
-                <div class="resources zone">
-                    <div class="head">
-                        <div class="add" id="add_resource_button">Add Resource</div>
-                    </div>
-                    <ul>
-                        <li class="pod">
-                            <div class="name"><span>Pods</span></div>
-                            <div class="view-all" zone-target="pods">View All</div>
-                        </li>
-                        <li class="cluster">
-                            <div class="tooltip-icon advanced"><span>3</span></div>
-                            <div class="tooltip-icon basic"><span>2</span></div>
-                            <div class="name"><span>Clusters</span></div>
-                            <div class="view-all" zone-target="clusters">View All</div>
-                        </li>
-                        <li class="host">
-                            <div class="tooltip-icon advanced"><span>4</span></div>
-                            <div class="tooltip-icon basic"><span>3</span></div>
-                            <div class="name"><span>Hosts</span></div>
-                            <div class="view-all" zone-target="hosts">View All</div>
-                        </li>
-                        <li class="primary-storage">
-                            <div class="tooltip-icon advanced"><span>5</span></div>
-                            <div class="tooltip-icon basic"><span>4</span></div>
-                            <div class="name"><span>Primary Storage</span></div>
-                            <div class="view-all" zone-target="primary-storage">View All</div>
-                        </li>
-                        <li class="secondary-storage">
-                            <div class="tooltip-icon advanced"><span>6</span></div>
-                            <div class="tooltip-icon basic"><span>5</span></div>
-                            <div class="name"><span>Secondary Storage</span></div>
-                            <div class="view-all" zone-target="secondary-storage">View All</div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-
-            <!-- Admin dashboard -->
-            <div class="dashboard admin">
-                <!-- General alerts-->
-                <div class="dashboard-container sub alerts first">
-                    <div class="top">
-                        <div class="title"><span></span></div>
-                        <div class="button view-all"></div>
-                    </div>
-                    <ul data-item="alerts">
-                        <li class="error" concat-value="50">
-                            <div class="content">
-                                <span class="title" data-list-item="name">Alert 1</span>
-                                <p data-list-item="description">Alert 1</p>
-                                <p data-list-item="sent">Alert 1</p>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-
-                <!-- Host alerts-->
-                <div class="dashboard-container sub alerts last">
-                    <div class="top">
-                        <div class="title"><span></span></div>
-                    </div>
-                    <ul data-item="hostAlerts">
-                        <li class="error" concat-value="50">
-                            <div class="content">
-                                <span class="title" data-list-item="name">Alert 1</span>
-                                <p data-list-item="description">Alert 1</p>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-                <!-- Capacity / stats -->
-                <div class="dashboard-container head">
-                    <div class="top">
-                        <div class="title">
-                            <span></span>
-                        </div>
-
-                        <div class="button fetch-latest">
-                            <span><translate key="label.fetch.latest"/></span>
-                        </div>
-
-                        <div class="selects" style="display:none;">
-                            <div class="select">
-                                <label><translate key="label.zone"/></label>:
-                                <select>
-                                </select>
-                            </div>
-                            <div class="select">
-                                <label><translate key="label.pods"/></label>:
-                                <select>
-                                </select>
-                            </div>
-                        </div>
-                    </div>
-
-                    <!-- Zone stat charts -->
-                    <div class="zone-stats">
-                        <ul data-item="zoneCapacities">
-                            <li concat-value="25">
-                                <div class="label">
-                                    <label><translate key="label.zone"/></label>: <span data-list-item="zoneName"></span>
-                                </div>
-                                <div class="pie-chart-container">
-                                    <div class="percent-label"><span data-list-item="percent"></span>%</div>
-                                    <div class="pie-chart" data-list-item="percent"></div>
-                                </div>
-                                <div class="info">
-                                    <div class="name" data-list-item="type"></div>
-                                    <div class="value">
-                                        <span class="used" data-list-item="used"></span>
-                                        <span class="divider">/</span>
-                                        <span class="total" data-list-item="total"></span>
-                                    </div>
-                                </div>
-                            </li>
-                        </ul>
-                    </div>
-                </div>
-            </div>
-
-            <!-- User dashboard-->
-            <div class="dashboard user">
-                <div class="vm-status">
-                    <div class="title"><span><translate key="label.virtual.machines"/></span></div>
-
-                    <div class="content">
-                        <ul>
-                            <li class="running">
-                                <div class="name"><translate key="label.running.vms"/></div>
-                                <div class="value" data-item="runningInstances"></div>
-                            </li>
-                            <li class="stopped">
-                                <div class="name"><translate key="label.stopped.vms"/></div>
-                                <div class="value" data-item="stoppedInstances"></div>
-                            </li>
-                            <li class="total">
-                                <div class="name"><translate key="label.total.vms"/></div>
-                                <div class="value" data-item="totalInstances"></div>
-                            </li>
-                        </ul>
-                    </div>
-                </div>
-
-                <div class="status-lists">
-                    <ul>
-                        <li class="events">
-                            <table>
-                                <thead>
-                                    <tr>
-                                        <th><label><translate key="label.latest.events"/></label> <div class="button view-all events"><translate key="label.view.all"/></div></th>
-                                    </tr>
-                                </thead>
-                            </table>
-                            <div class="content">
-                                <ul data-item="events">
-                                    <li data-list-item="description">
-                                        <div class="title" data-list-item="type"></div>
-                                        <span data-list-item="description"></span>
-                                    </li>
-                                </ul>
-                            </div>
-                        </li>
-                        <li class="ip-addresses">
-                            <table>
-                                <thead>
-                                    <tr>
-                                        <th><label><translate key="label.network"/></label> <div class="button view-all network"><translate key="label.view.all"/></div></th>
-                                    </tr>
-                                </thead>
-                            </table>
-                            <table>
-                                <tbody>
-                                    <tr>
-                                        <td>
-                                            <div class="desc"><span><label><translate key="label.isolated.networks"/></label>:</span></div>
-                                            <div class="value"><span data-item="netTotal"></span></div>
-                                        </td>
-                                    </tr>
-                                    <tr class="odd">
-                                        <td>
-                                            <div class="desc"><span><label><translate key="label.public.ips"/></label>:</span></div>
-                                            <div class="value"><span data-item="ipTotal"></span></div>
-                                        </td>
-                                    </tr>
-                                </tbody>
-                            </table>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-
-            <!-- Recurring Snapshots -->
-            <div class="recurring-snapshots">
-                <p class="desc"><translate key="label.description" /></p>
-
-                <div class="schedule">
-                    <p>Schedule:</p>
-
-                    <div class="forms">
-                        <ul>
-                            <li class="hourly"><a href="#recurring-snapshots-hourly"></a></li>
-                            <li class="daily"><a href="#recurring-snapshots-daily"></a></li>
-                            <li class="weekly"><a href="#recurring-snapshots-weekly"></a></li>
-                            <li class="monthly"><a href="#recurring-snapshots-monthly"></a></li>
-                        </ul>
-
-                        <!-- Hourly -->
-                        <div id="recurring-snapshots-hourly" class="formContainer">
-                            <form>
-                                <input type="hidden" name="snapshot-type" value="hourly" />
-
-                                <!-- Time -->
-                                <div class="field time">
-                                    <div class="name"></div>
-                                    <div class="value">
-                                        <select name="schedule"></select>
-                                        <label for="schedule"><translate key="label.minutes.past.hour" /></label>
-                                    </div>
-                                </div>
-
-                                <!-- Timezone -->
-                                <div class="field timezone">
-                                    <div class="name"></div>
-                                    <div class="value">
-                                        <select name="timezone">
-                                        </select>
-                                    </div>
-                                </div>
-
-                                <!-- Max snapshots -->
-                                <div class="field maxsnaps">
-                                    <div class="name"><translate key="label.keep" /></div>
-                                    <div class="value">
-                                        <input type="text" name="maxsnaps" class="required" />
-                                        <label for="maxsnaps"><translate key="label.snapshots" /></label>
-                                    </div>
-                                </div>
-
-                                <!-- Tags -->
-                                <div class="field taggerContainer"></div>
-                            </form>
-                        </div>
-
-                        <!-- Daily -->
-                        <div id="recurring-snapshots-daily" class="formContainer">
-                            <form>
-                                <input type="hidden" name="snapshot-type" value="daily" />
-
-                                <!-- Time -->
-                                <div class="field time">
-                                    <div class="name"><translate key="label.time" /></div>
-                                    <div class="value">
-                                        <select name="time-hour"></select>
-                                        <select name="time-minute"></select>
-                                        <select name="time-meridiem"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Timezone -->
-                                <div class="field timezone">
-                                    <div class="name"><translate key="label.time.zone" /></div>
-                                    <div class="value">
-                                        <select name="timezone"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Max snapshots -->
-                                <div class="field maxsnaps">
-                                    <div class="name"><translate key="label.keep" /></div>
-                                    <div class="value">
-                                        <input type="text" name="maxsnaps" class="required" maxlength="9"/>
-                                        <label for="maxsnaps"><translate key="label.snapshots" /></label>
-                                    </div>
-                                </div>
-
-                                <!-- Tags -->
-                                <div class="field taggerContainer"></div>
-                            </form>
-                        </div>
-
-                        <!-- Weekly -->
-                        <div id="recurring-snapshots-weekly" class="formContainer">
-                            <form>
-                                <input type="hidden" name="snapshot-type" value="weekly" />
-
-                                <!-- Time -->
-                                <div class="field time">
-                                    <div class="name"><translate key="label.time" /></div>
-                                    <div class="value">
-                                        <select name="time-hour"></select>
-                                        <select name="time-minute"></select>
-                                        <select name="time-meridiem"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Day of week -->
-                                <div class="field day-of-week">
-                                    <div class="name"><translate key="label.day.of.week" /></div>
-                                    <div class="value">
-                                        <select name="day-of-week"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Timezone -->
-                                <div class="field timezone">
-                                    <div class="name"><translate key="label.time.zone" /></div>
-                                    <div class="value">
-                                        <select name="timezone"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Max snapshots -->
-                                <div class="field maxsnaps">
-                                    <div class="name"><translate key="label.keep" /></div>
-                                    <div class="value">
-                                        <input type="text" name="maxsnaps" class="required" />
-                                        <label for="maxsnaps"><translate key="label.snapshots" /></label>
-                                    </div>
-                                </div>
-
-                                <!-- Tags -->
-                                <div class="field taggerContainer"></div>
-                            </form>
-                        </div>
-
-                        <!-- Monthly -->
-                        <div id="recurring-snapshots-monthly" class="formContainer">
-                            <form>
-                                <input type="hidden" name="snapshot-type" value="monthly" />
-
-                                <!-- Time -->
-                                <div class="field time">
-                                    <div class="name"><translate key="label.time" /></div>
-                                    <div class="value">
-                                        <select name="time-hour"></select>
-                                        <select name="time-minute"></select>
-                                        <select name="time-meridiem"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Day of week -->
-                                <div class="field day-of-month">
-                                    <div class="name"><translate key="label.day.of.month" /></div>
-                                    <div class="value">
-                                        <select name="day-of-month"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Timezone -->
-                                <div class="field timezone">
-                                    <div class="name"><translate key="label.time.zone" /></div>
-                                    <div class="value">
-                                        <select name="timezone"></select>
-                                    </div>
-                                </div>
-
-                                <!-- Max snapshots -->
-                                <div class="field maxsnaps">
-                                    <div class="name"><translate key="label.keep" /></div>
-                                    <div class="value">
-                                        <input type="text" name="maxsnaps" class="required" />
-                                        <label for="maxsnaps"><translate key="label.snapshots" /></label>
-                                    </div>
-                                </div>
-
-                                <!-- Tags -->
-                                <div class="field taggerContainer"></div>
-                            </form>
-                        </div>
-                    </div>
-
-                    <div class="add-snapshot-actions">
-                        <div class="add-snapshot-action add"></div>
-                    </div>
-                </div>
-                <!-- Scheduled snapshots -->
-                <div class="scheduled-snapshots">
-                    <p>Scheduled Snapshots</p>
-                    <table>
-                        <tbody>
-                            <!-- Hourly -->
-                            <tr class="hourly">
-                                <td class="time"><translate key="label.time.colon"></translate> <span></span> <translate key="label.min.past.the.hr"></translate></td>
-                                <td class="day-of-week"><span></span></td>
-                                <td class="timezone"><translate key="label.timezone.colon"></translate><br/><span></span></td>
-                                <td class="keep"><translate key="label.keep.colon"></translate> <span></span></td>
-                                <td class="actions"><div class="action destroy"><span class="icon">&nbsp;</span></div></td>
-                            </tr>
-                            <!-- Daily -->
-                            <tr class="daily">
-                                <td class="time"><translate key="label.time.colon"></translate> <span></span></td>
-                                <td class="day-of-week"><span></span></td>
-                                <td class="timezone"><translate key="label.timezone.colon"></translate><br/><span></span></td>
-                                <td class="keep"><translate key="label.keep.colon"></translate> <span></span></td>
-                                <td class="actions"><div class="action destroy"><span class="icon">&nbsp;</span></div></td>
-                            </tr>
-                            <!-- Weekly -->
-                            <tr class="weekly">
-                                <td class="time"><translate key="label.time.colon"></translate> <span></span></td>
-                                <td class="day-of-week"><translate key="label.every"></translate> <span></span></td>
-                                <td class="timezone"><translate key="label.timezone.colon"></translate><br/><span></span></td>
-                                <td class="keep"><translate key="label.keep.colon"></translate> <span></span></td>
-                                <td class="actions"><div class="action destroy"><span class="icon">&nbsp;</span></div></td>
-                            </tr>
-                            <!-- Monthly -->
-                            <tr class="monthly">
-                                <td class="time"><translate key="label.time.colon"></translate> <span></span></td>
-                                <td class="day-of-week"><translate key="label.day"></translate> <span></span> <translate key="label.of.month"></translate></td>
-                                <td class="timezone"><translate key="label.timezone.colon"></translate><br/><span></span></td>
-                                <td class="keep"><translate key="label.keep.colon"></translate> <span></span></td>
-                                <td class="actions"><div class="action destroy"><span class="icon">&nbsp;</span></div></td>
-                            </tr>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-        </div>
-
-        <!-- jQuery -->
-        <script src="lib/jquery.js" type="text/javascript"></script>
-        <script src="lib/jquery.easing.js" type="text/javascript"></script>
-        <script src="lib/jquery.validate.js" type="text/javascript"></script>
-        <script src="lib/jquery.validate.additional-methods.js" type="text/javascript"></script>
-        <script src="lib/jquery-ui/js/jquery-ui.js" type="text/javascript"></script>
-        <script src="lib/date.js" type="text/javascript"></script>
-        <script src="lib/jquery.cookies.js" type="text/javascript"></script>
-        <script src="lib/jquery.md5.js" type="text/javascript" ></script>
-        <script src="lib/require.js" type="text/javascript"></script>
-        <script type="text/javascript" src="config.js"></script>
-
-        <!-- localized messages -->
-        <script type="text/javascript">
-            var $head = $('head');
-            $head.append('<script src="l10n/en.js">');
-            var defaultDict = dictionary;
-            if ($.cookie('lang') && $.cookie('lang') != 'en') {
-                $head.append('<link type="text/css" rel="stylesheet" href="css/cloudstack3.' + $.cookie('lang') + '.css" />');
-                $head.append('<script src="l10n/' + $.cookie('lang')  + '.js">');
-            }
-
-            $.each(defaultDict, function(key, value) {
-                if (!(key in dictionary)) {
-                    dictionary[key] = value;
-                }
-            });
-
-            var translate = function(key) {
-                if (key in dictionary) {
-                    return dictionary[key];
-                }
-                return key;
-            }
-
-            // Translate labels on the fly
-            $.each($.find('translate[key]'), function(idx, elem) {
-                var key = $(elem).attr('key');
-                $(elem).html(translate(key));
-            });
-
-            // Translate element attributes
-            $.each($.find('[tr]'), function(idx, elem) {
-                var key = $(elem).attr('tr');
-                var field = $(elem).attr('trf');
-                $(elem).attr(field, translate(key));
-            });
-
-            // Inject translated login options
-            var loginDropdown = $($.find('#login-options'));
-            loginDropdown.append($('<option>', {value: 'cloudstack-login', text: 'Local ' + translate('label.login')}));
-
-            // Inject translated l10n language options
-            var l10nDropdown = $($.find('#l10n-options'));
-            l10nDropdown.append($('<option>', {value: 'en', text: 'English'}));
-            l10nDropdown.append($('<option>', {value: 'ja_JP', text: '日本語'}));
-            l10nDropdown.append($('<option>', {value: 'zh_CN', text: '简体中文'}));
-            l10nDropdown.append($('<option>', {value: 'ru_RU', text: 'Русский'}));
-            l10nDropdown.append($('<option>', {value: 'fr_FR', text: 'Français'}));
-            l10nDropdown.append($('<option>', {value: 'pt_BR', text: 'Português brasileiro'}));
-            l10nDropdown.append($('<option>', {value: 'ca', text: 'Catalan'}));
-            l10nDropdown.append($('<option>', {value: 'ko_KR', text: '한국어'}));
-            l10nDropdown.append($('<option>', {value: 'es', text: 'Españo'}));
-            l10nDropdown.append($('<option>', {value: 'de_DE', text: 'Deutsch'}));
-            l10nDropdown.append($('<option>', {value: 'it_IT', text: 'Italiano'}));
-            l10nDropdown.append($('<option>', {value: 'nb_NO', text: 'Norsk'}));
-            l10nDropdown.append($('<option>', {value: 'ar', text: 'Arabic'}));
-            l10nDropdown.append($('<option>', {value: 'nl_NL', text: 'Nederlands (Nederlands)'}));
-            l10nDropdown.append($('<option>', {value: 'pl', text: 'Polish'}));
-            l10nDropdown.append($('<option>', {value: 'hu', text: 'Magyar'}));
-
-            // Inject translated keyboard options
-            var keyboardDropdown = $($.find('#keyboard-options'));
-            for (var key in cloudStackOptions.keyboardOptions) {
-                keyboardDropdown.append($('<option>', {value: key, text: translate(cloudStackOptions.keyboardOptions[key])}));
-            }
-        </script>
-
-        <script src="lib/excanvas.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.colorhelpers.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.crosshair.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.fillbetween.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.image.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.navigate.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.pie.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.resize.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.selection.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.stack.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.symbol.js" type="text/javascript"></script>
-        <script src="lib/flot/jquery.flot.threshold.js" type="text/javascript"></script>
-        <!-- jquery.tokeninput.js -->
-        <script src="lib/jquery.tokeninput.js" type="text/javascript"></script>
-        <!-- CloudStack -->
-        <script type="text/javascript" src="scripts/ui/core.js"></script>
-        <script type="text/javascript" src="scripts/ui/utils.js"></script>
-        <script type="text/javascript" src="scripts/ui/events.js"></script>
-        <script type="text/javascript" src="scripts/ui/dialog.js"></script>
-
-        <script type="text/javascript" src="scripts/ui/widgets/multiEdit.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/overlay.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/dataTable.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/cloudBrowser.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/listView.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/detailView.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/treeView.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/notifications.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/tagger.js"></script>
-        <script type="text/javascript" src="scripts/ui/widgets/toolTip.js"></script>
-        <script type="text/javascript" src="scripts/cloud.core.callbacks.js"></script>
-        <script type="text/javascript" src="scripts/sharedFunctions.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/login.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/projects.js"></script>
-        <script type="text/javascript" src="scripts/cloudStack.js"></script>
-        <script type="text/javascript" src="scripts/lbStickyPolicy.js"></script>
-        <script type="text/javascript" src="scripts/lbCertificatePolicy.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/autoscaler.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/healthCheck.js"></script>
-        <script type="text/javascript" src="scripts/autoscaler.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/granularSettings.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/zoneChart.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/dashboard.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/metricsView.js"></script>
-        <script type="text/javascript" src="scripts/installWizard.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/installWizard.js"></script>
-        <script type="text/javascript" src="scripts/projects.js"></script>
-        <script type="text/javascript" src="scripts/dashboard.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/instanceWizard.js"></script>
-        <script type="text/javascript" src="scripts/instanceWizard.js"></script>
-        <script type="text/javascript" src="scripts/affinity.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/affinity.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/migrate.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/copyTemplate.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/backupSchedule.js"></script>
-        <script type="text/javascript" src="scripts/instances.js"></script>
-        <script type="text/javascript" src="scripts/events.js"></script>
-        <script type="text/javascript" src="scripts/regions.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/regions.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/ipRules.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/enableStaticNAT.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/securityRules.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/vpc.js"></script>
-        <script type="text/javascript" src="scripts/vpc.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/recurringSnapshots.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/uploadVolume.js"></script>
-        <script type="text/javascript" src="scripts/storage.js"></script>
-        <script type="text/javascript" src="scripts/templates.js"></script>
-        <script type="text/javascript" src="scripts/roles.js"></script>
-        <script type="text/javascript" src="scripts/accountsWizard.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/accountsWizard.js"></script>
-        <script type="text/javascript" src="scripts/accounts.js"></script>
-        <script type="text/javascript" src="scripts/configuration.js"></script>
-        <script type="text/javascript" src="scripts/globalSettings.js"></script>
-        <script type="text/javascript" src="scripts/zoneWizard.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/physicalResources.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/zoneWizard.js"></script>
-        <script type="text/javascript" src="scripts/system.js"></script>
-        <script type="text/javascript" src="scripts/network.js"></script>
-        <script type="text/javascript" src="scripts/domains.js"></script>
-        <script type="text/javascript" src="scripts/docs.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/projectSelect.js"></script>
-        <script type="text/javascript" src="scripts/ui-custom/saml.js"></script>
-        <script type="text/javascript" src="scripts/metrics.js"></script>
-
-        <!-- Plugin/module API -->
-        <script type="text/javascript" src="scripts/ui-custom/pluginListing.js"></script>
-        <script type="text/javascript" src="plugins/plugins.js"></script>
-        <script type="text/javascript" src="modules/modules.js"></script>
-        <script type="text/javascript" src="scripts/plugins.js"></script>
-
-        <!-- Load this script after all scripts have executed to populate data -->
-        <script type="text/javascript" src="scripts/postLoad.js"></script>
-    </body>
-</html>
diff --git a/ui/legacy/l10n/ar.js b/ui/legacy/l10n/ar.js
deleted file mode 100644
index d45f6dc..0000000
--- a/ui/legacy/l10n/ar.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP Code",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP Type",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "تغير خصائص العنصر",
-    "confirm.enable.s3": "فضلا قم بتعبئة البيانات القادمة لتمكين التخزين S3 للذاكرة الثانوية.",
-    "confirm.enable.swift": "Please fill in the following information to enable support for Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Error could not change your password because LDAP is enabled.",
-    "error.could.not.enable.zone": "Could not enable zone",
-    "error.installWizard.message": "Something went wrong; you may go back and correct any errors",
-    "error.invalid.username.password": "Invalid username or password",
-    "error.login": "Your username/password does not match our records.",
-    "error.menu.select": "Unable to perform action due to no items being selected.",
-    "error.mgmt.server.inaccessible": "The Management Server is unaccessible.  Please try again later.",
-    "error.password.not.match": "The password fields do not match",
-    "error.please.specify.physical.network.tags": "Network offerings is not available until you specify tags for this physical network.",
-    "error.session.expired": "Your session has expired.",
-    "error.something.went.wrong.please.correct.the.following": "Something went wrong; please correct the following",
-    "error.unable.to.reach.management.server": "Unable to reach Management Server",
-    "error.unresolved.internet.name": "Your internet name cannot be resolved.",
-    "force.delete": "Force Delete",
-    "force.delete.domain.warning": "Warning: Choosing this option will cause the deletion of all child domains and all associated accounts and their resources.",
-    "force.remove": "Force Remove",
-    "force.remove.host.warning": "Warning: Choosing this option will cause CloudStack to forcefully stop all running virtual machines before removing this host from the cluster.",
-    "force.stop": "Force Stop",
-    "force.stop.instance.warning": "Warning: Forcing a stop on this instance should be your last option. It can lead to data loss as well as inconsistent behavior of the virtual machine state.",
-    "hint.no.host.tags": "No host tags found",
-    "hint.no.storage.tags": "No storage tags found",
-    "hint.type.part.host.tag": "Type in part of a host tag",
-    "hint.type.part.storage.tag": "Type in part of a storage tag",
-    "image.directory": "Image Directory",
-    "inline": "Inline",
-    "instances.actions.reboot.label": "إعادة تشغيل النموذج",
-    "label.CIDR.list": "قائمة CIDR",
-    "label.CIDR.of.destination.network": "CIDR الخاص بالشبكة الموجهة.",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "DHCP Server Type",
-    "label.DNS.domain.for.guest.networks": "مجال DNS لشبكات الزائر",
-    "label.ESP.encryption": "ESP Encryption",
-    "label.ESP.hash": "ESP Hash",
-    "label.ESP.lifetime": "عمر ESP (ثانية)",
-    "label.ESP.policy": "سياسة ESP",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE Encryption",
-    "label.IKE.hash": "IKE Hash",
-    "label.IKE.lifetime": "عمر IKE (ثانية)",
-    "label.IKE.policy": "سياسة IKE",
-    "label.IPsec.preshared.key": "مفتاح أمن بروتوكول الإنترنت تمت مشاركته مسبقا",
-    "label.LB.isolation": "LB isolation",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto Log Profile",
-    "label.PA.threat.profile": "Palo Alto Threat Profile",
-    "label.PING.CIFS.password": "PING CIFS password",
-    "label.PING.CIFS.username": "PING CIFS username",
-    "label.PING.dir": "PING Directory",
-    "label.PING.storage.IP": "PING storage IP",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Pxe Server Type",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Port",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP Directory",
-    "label.VMFS.datastore": "VMFS datastore",
-    "label.VMs.in.tier": "الأجهزة الإفتراضية في طبقة",
-    "label.VPC.limits": "VPC limits",
-    "label.VPC.router.details": "تفاصيل جهاز التوجيه VPC",
-    "label.VPN.connection": "إتصال الشبكة الافتراضية الشخصية",
-    "label.VPN.customer.gateway": "بوابة الشبكة الافتراضية الشخصية للعميل",
-    "label.VPN.gateway": "بوابة الشبكة الافتراضية الشخصية",
-    "label.Xenserver.Tools.Version61plus": "Original XS Version is 6.1+",
-    "label.about": "About",
-    "label.about.app": "About CloudStack",
-    "label.accept.project.invitation": "قبول دعوة المشروع",
-    "label.account": "Account",
-    "label.account.and.security.group": "Account, Security group",
-    "label.account.details": "Account details",
-    "label.account.id": "Account ID",
-    "label.account.lower": "account",
-    "label.account.name": "Account Name",
-    "label.account.specific": "Account-Specific",
-    "label.account.type": "Account Type",
-    "label.accounts": "Accounts",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL List Rules",
-    "label.acl.name": "ACL Name",
-    "label.acl.replaced": "ACL replaced",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Acquire New IP",
-    "label.acquire.new.secondary.ip": "Acquire new secondary IP",
-    "label.action": "Action",
-    "label.action.attach.disk": "Attach Disk",
-    "label.action.attach.disk.processing": "Attaching Disk....",
-    "label.action.attach.iso": "Attach ISO",
-    "label.action.attach.iso.processing": "Attaching ISO....",
-    "label.action.cancel.maintenance.mode": "Cancel Maintenance Mode",
-    "label.action.cancel.maintenance.mode.processing": "Cancelling Maintenance Mode....",
-    "label.action.change.password": "Change Password",
-    "label.action.change.service": "Change Service",
-    "label.action.change.service.processing": "Changing Service....",
-    "label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
-    "label.action.copy.ISO": "Copy ISO",
-    "label.action.copy.ISO.processing": "Copying ISO....",
-    "label.action.copy.template": "Copy Template",
-    "label.action.copy.template.processing": "Copying Template....",
-    "label.action.create.template": "Create Template",
-    "label.action.create.template.from.vm": "Create Template from VM",
-    "label.action.create.template.from.volume": "Create Template from Volume",
-    "label.action.create.template.processing": "Creating Template....",
-    "label.action.create.vm": "Create VM",
-    "label.action.create.vm.processing": "Creating VM....",
-    "label.action.create.volume": "Create Volume",
-    "label.action.create.volume.processing": "Creating Volume....",
-    "label.action.delete.IP.range": "Delete IP Range",
-    "label.action.delete.IP.range.processing": "Deleting IP Range....",
-    "label.action.delete.ISO": "Delete ISO",
-    "label.action.delete.ISO.processing": "Deleting ISO....",
-    "label.action.delete.account": "Delete account",
-    "label.action.delete.account.processing": "Deleting account....",
-    "label.action.delete.cluster": "Delete Cluster",
-    "label.action.delete.cluster.processing": "Deleting Cluster....",
-    "label.action.delete.disk.offering": "Delete Disk Offering",
-    "label.action.delete.disk.offering.processing": "Deleting Disk Offering....",
-    "label.action.delete.domain": "Delete Domain",
-    "label.action.delete.domain.processing": "Deleting Domain....",
-    "label.action.delete.firewall": "Delete firewall rule",
-    "label.action.delete.firewall.processing": "Deleting Firewall....",
-    "label.action.delete.ingress.rule": "Delete Ingress Rule",
-    "label.action.delete.ingress.rule.processing": "Deleting Ingress Rule....",
-    "label.action.delete.load.balancer": "Delete load balancer rule",
-    "label.action.delete.load.balancer.processing": "Deleting Load Balancer....",
-    "label.action.delete.network": "Delete Network",
-    "label.action.delete.network.processing": "Deleting Network....",
-    "label.action.delete.nexusVswitch": "Delete Nexus 1000v",
-    "label.action.delete.nic": "Remove NIC",
-    "label.action.delete.physical.network": "Delete physical network",
-    "label.action.delete.pod": "Delete Pod",
-    "label.action.delete.pod.processing": "Deleting Pod....",
-    "label.action.delete.primary.storage": "Delete Primary Storage",
-    "label.action.delete.primary.storage.processing": "Deleting Primary Storage....",
-    "label.action.delete.secondary.storage": "Delete Secondary Storage",
-    "label.action.delete.secondary.storage.processing": "Deleting Secondary Storage....",
-    "label.action.delete.security.group": "Delete Security Group",
-    "label.action.delete.security.group.processing": "Deleting Security Group....",
-    "label.action.delete.service.offering": "Delete Service Offering",
-    "label.action.delete.service.offering.processing": "Deleting Service Offering....",
-    "label.action.delete.snapshot": "Delete Snapshot",
-    "label.action.delete.snapshot.processing": "Deleting Snapshot....",
-    "label.action.delete.system.service.offering": "حذف نظام تقديم الخدمة",
-    "label.action.delete.template": "Delete Template",
-    "label.action.delete.template.processing": "Deleting Template....",
-    "label.action.delete.user": "Delete User",
-    "label.action.delete.user.processing": "Deleting User....",
-    "label.action.delete.volume": "Delete Volume",
-    "label.action.delete.volume.processing": "Deleting Volume....",
-    "label.action.delete.zone": "Delete Zone",
-    "label.action.delete.zone.processing": "Deleting Zone....",
-    "label.action.destroy.instance": "Destroy Instance",
-    "label.action.destroy.instance.processing": "Destroying Instance....",
-    "label.action.destroy.systemvm": "Destroy System VM",
-    "label.action.destroy.systemvm.processing": "Destroying System VM....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Detach Disk",
-    "label.action.detach.disk.processing": "Detaching Disk....",
-    "label.action.detach.iso": "Detach ISO",
-    "label.action.detach.iso.processing": "Detaching ISO....",
-    "label.action.disable.account": "Disable account",
-    "label.action.disable.account.processing": "Disabling account....",
-    "label.action.disable.cluster": "Disable Cluster",
-    "label.action.disable.cluster.processing": "Disabling Cluster....",
-    "label.action.disable.nexusVswitch": "Disable Nexus 1000v",
-    "label.action.disable.physical.network": "تعطيل شبكة فيزيائية",
-    "label.action.disable.pod": "Disable Pod",
-    "label.action.disable.pod.processing": "Disabling Pod....",
-    "label.action.disable.static.NAT": "Disable Static NAT",
-    "label.action.disable.static.NAT.processing": "Disabling Static NAT....",
-    "label.action.disable.user": "Disable User",
-    "label.action.disable.user.processing": "Disabling User....",
-    "label.action.disable.zone": "Disable Zone",
-    "label.action.disable.zone.processing": "Disabling Zone....",
-    "label.action.download.ISO": "Download ISO",
-    "label.action.download.template": "Download Template",
-    "label.action.download.volume": "Download Volume",
-    "label.action.download.volume.processing": "Downloading Volume....",
-    "label.action.edit.ISO": "Edit ISO",
-    "label.action.edit.account": "Edit account",
-    "label.action.edit.disk.offering": "Edit Disk Offering",
-    "label.action.edit.domain": "Edit Domain",
-    "label.action.edit.global.setting": "Edit Global Setting",
-    "label.action.edit.host": "Edit Host",
-    "label.action.edit.instance": "Edit Instance",
-    "label.action.edit.network": "Edit Network",
-    "label.action.edit.network.offering": "Edit Network Offering",
-    "label.action.edit.network.processing": "Editing Network....",
-    "label.action.edit.pod": "Edit Pod",
-    "label.action.edit.primary.storage": "Edit Primary Storage",
-    "label.action.edit.resource.limits": "Edit Resource Limits",
-    "label.action.edit.service.offering": "Edit Service Offering",
-    "label.action.edit.template": "Edit Template",
-    "label.action.edit.user": "Edit User",
-    "label.action.edit.zone": "Edit Zone",
-    "label.action.enable.account": "Enable account",
-    "label.action.enable.account.processing": "Enabling account....",
-    "label.action.enable.cluster": "Enable Cluster",
-    "label.action.enable.cluster.processing": "Enabling Cluster....",
-    "label.action.enable.maintenance.mode": "Enable Maintenance Mode",
-    "label.action.enable.maintenance.mode.processing": "Enabling Maintenance Mode....",
-    "label.action.enable.nexusVswitch": "Enable Nexus 1000v",
-    "label.action.enable.physical.network": "تمكين شبكة فيزيائية",
-    "label.action.enable.pod": "Enable Pod",
-    "label.action.enable.pod.processing": "Enabling Pod....",
-    "label.action.enable.static.NAT": "Enable Static NAT",
-    "label.action.enable.static.NAT.processing": "Enabling Static NAT....",
-    "label.action.enable.user": "Enable User",
-    "label.action.enable.user.processing": "Enabling User....",
-    "label.action.enable.zone": "Enable Zone",
-    "label.action.enable.zone.processing": "Enabling Zone....",
-    "label.action.expunge.instance": "Expunge Instance",
-    "label.action.expunge.instance.processing": "Expunging Instance....",
-    "label.action.force.reconnect": "Force Reconnect",
-    "label.action.force.reconnect.processing": "Reconnecting....",
-    "label.action.generate.keys": "Generate Keys",
-    "label.action.generate.keys.processing": "Generate Keys....",
-    "label.action.list.nexusVswitch": "List Nexus 1000v",
-    "label.action.lock.account": "Lock account",
-    "label.action.lock.account.processing": "Locking account....",
-    "label.action.manage.cluster": "Manage Cluster",
-    "label.action.manage.cluster.processing": "Managing Cluster....",
-    "label.action.migrate.instance": "Migrate Instance",
-    "label.action.migrate.instance.processing": "Migrating Instance....",
-    "label.action.migrate.router": "Migrate Router",
-    "label.action.migrate.router.processing": "Migrating Router....",
-    "label.action.migrate.systemvm": "Migrate System VM",
-    "label.action.migrate.systemvm.processing": "Migrating System VM....",
-    "label.action.reboot.instance": "Reboot Instance",
-    "label.action.reboot.instance.processing": "Rebooting Instance....",
-    "label.action.reboot.router": "Reboot Router",
-    "label.action.reboot.router.processing": "Rebooting Router....",
-    "label.action.reboot.systemvm": "Reboot System VM",
-    "label.action.reboot.systemvm.processing": "Rebooting System VM....",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Recurring Snapshots",
-    "label.action.register.iso": "Register ISO",
-    "label.action.register.template": "Register Template from URL",
-    "label.action.release.ip": "Release IP",
-    "label.action.release.ip.processing": "Releasing IP....",
-    "label.action.remove.host": "Remove Host",
-    "label.action.remove.host.processing": "Removing Host....",
-    "label.action.reset.password": "Reset Password",
-    "label.action.reset.password.processing": "Resetting Password....",
-    "label.action.resize.volume": "Resize Volume",
-    "label.action.resize.volume.processing": "Resizing Volume....",
-    "label.action.resource.limits": "Resource limits",
-    "label.action.restore.instance": "Restore Instance",
-    "label.action.restore.instance.processing": "Restoring Instance....",
-    "label.action.revert.snapshot": "Revert to Snapshot",
-    "label.action.revert.snapshot.processing": "Reverting to Snapshot...",
-    "label.action.start.instance": "Start Instance",
-    "label.action.start.instance.processing": "Starting Instance....",
-    "label.action.start.router": "Start Router",
-    "label.action.start.router.processing": "Starting Router....",
-    "label.action.start.systemvm": "Start System VM",
-    "label.action.start.systemvm.processing": "Starting System VM....",
-    "label.action.stop.instance": "Stop Instance",
-    "label.action.stop.instance.processing": "Stopping Instance....",
-    "label.action.stop.router": "Stop Router",
-    "label.action.stop.router.processing": "Stopping Router....",
-    "label.action.stop.systemvm": "Stop System VM",
-    "label.action.stop.systemvm.processing": "Stopping System VM....",
-    "label.action.take.snapshot": "Take Snapshot",
-    "label.action.take.snapshot.processing": "Taking Snapshot....",
-    "label.action.unmanage.cluster": "Unmanage Cluster",
-    "label.action.unmanage.cluster.processing": "Unmanaging Cluster....",
-    "label.action.update.OS.preference": "Update OS Preference",
-    "label.action.update.OS.preference.processing": "Updating OS Preference....",
-    "label.action.update.resource.count": "Update Resource Count",
-    "label.action.update.resource.count.processing": "Updating Resource Count....",
-    "label.action.vmsnapshot.create": "Take VM Snapshot",
-    "label.action.vmsnapshot.delete": "Delete VM snapshot",
-    "label.action.vmsnapshot.revert": "Revert to VM snapshot",
-    "label.actions": "Actions",
-    "label.activate.project": "تفعيل المشروع",
-    "label.active.sessions": "Active Sessions",
-    "label.add": "Add",
-    "label.add.ACL": "إضافة ACL",
-    "label.add.BigSwitchBcf.device": "Add BigSwitch BCF Controller",
-    "label.add.BrocadeVcs.device": "Add Brocade Vcs Switch",
-    "label.add.F5.device": "Add F5 device",
-    "label.add.LDAP.account": "Add LDAP Account",
-    "label.add.NiciraNvp.device": "Add Nvp Controller",
-    "label.add.OpenDaylight.device": "Add OpenDaylight Controller",
-    "label.add.PA.device": "Add Palo Alto device",
-    "label.add.SRX.device": "Add SRX device",
-    "label.add.VM.to.tier": "إضافة جهاز إفتراضي في طبقة",
-    "label.add.VPN.gateway": "أضف بوابة الشبكة الافتراضية الشخصية",
-    "label.add.account": "Add Account",
-    "label.add.account.to.project": "إضافة حساب للمشروع",
-    "label.add.accounts": "إضافة حسابات",
-    "label.add.accounts.to": "إضافة حسابات إلى",
-    "label.add.acl.list": "Add ACL List",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Add new affinity group",
-    "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
-    "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
-    "label.add.by": "Add by",
-    "label.add.by.cidr": "Add By CIDR",
-    "label.add.by.group": "Add By Group",
-    "label.add.ciscoASA1000v": "Add CiscoASA1000v Resource",
-    "label.add.cluster": "Add Cluster",
-    "label.add.compute.offering": "Add compute offering",
-    "label.add.direct.iprange": "Add Direct Ip Range",
-    "label.add.disk.offering": "Add Disk Offering",
-    "label.add.domain": "Add Domain",
-    "label.add.egress.rule": "Add egress rule",
-    "label.add.firewall": "Add firewall rule",
-    "label.add.globo.dns": "Add GloboDNS",
-    "label.add.gslb": "Add GSLB",
-    "label.add.guest.network": "Add guest network",
-    "label.add.host": "Add Host",
-    "label.add.ingress.rule": "Add Ingress Rule",
-    "label.add.intermediate.certificate": "Add intermediate certificate",
-    "label.add.internal.lb": "Add Internal LB",
-    "label.add.ip.range": "Add IP Range",
-    "label.add.isolated.guest.network": "Add Isolated Guest Network",
-    "label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
-    "label.add.isolated.network": "Add Isolated Network",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Add LDAP account",
-    "label.add.list.name": "ACL List Name",
-    "label.add.load.balancer": "Add Load Balancer",
-    "label.add.more": "Add More",
-    "label.add.netScaler.device": "Add Netscaler device",
-    "label.add.network": "Add Network",
-    "label.add.network.ACL": "إضافة شبكة ACL",
-    "label.add.network.acl.list": "Add Network ACL List",
-    "label.add.network.device": "Add Network Device",
-    "label.add.network.offering": "Add network offering",
-    "label.add.new.F5": "Add new F5",
-    "label.add.new.NetScaler": "Add new NetScaler",
-    "label.add.new.PA": "Add new Palo Alto",
-    "label.add.new.SRX": "Add new SRX",
-    "label.add.new.gateway": "أضف بوابة جديدة",
-    "label.add.new.tier": "إضافة طبقة جديدة",
-    "label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
-    "label.add.physical.network": "Add physical network",
-    "label.add.pod": "Add Pod",
-    "label.add.port.forwarding.rule": "إضافة قاعدة منفذ إعادة التوجيه",
-    "label.add.portable.ip.range": "Add Portable IP Range",
-    "label.add.primary.storage": "Add Primary Storage",
-    "label.add.private.gateway": "Add Private Gateway",
-    "label.add.region": "Add Region",
-    "label.add.resources": "Add Resources",
-    "label.add.role": "Add Role",
-    "label.add.route": "إضافة مسار",
-    "label.add.rule": "إضافة قاعدة",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Add Secondary Storage",
-    "label.add.security.group": "Add Security Group",
-    "label.add.service.offering": "Add Service Offering",
-    "label.add.static.nat.rule": "Add static NAT rule",
-    "label.add.static.route": "إضافة توجيه ثابت",
-    "label.add.system.service.offering": "Add System Service Offering",
-    "label.add.template": "Add Template",
-    "label.add.to.group": "إضافة إلى المجموعة",
-    "label.add.ucs.manager": "Add UCS Manager",
-    "label.add.user": "Add User",
-    "label.add.userdata": "Userdata",
-    "label.add.vlan": "Add VLAN",
-    "label.add.vm": "Add VM",
-    "label.add.vms": "Add VMs",
-    "label.add.vms.to.lb": "Add VM(s) to load balancer rule",
-    "label.add.vmware.datacenter": "Add VMware datacenter",
-    "label.add.vnmc.device": "Add VNMC device",
-    "label.add.vnmc.provider": "Add VNMC provider",
-    "label.add.volume": "Add Volume",
-    "label.add.vpc": "إضافة سحابة إفتراضية خاصة",
-    "label.add.vpc.offering": "Add VPC Offering",
-    "label.add.vpn.customer.gateway": "Add VPN Customer Gateway",
-    "label.add.vpn.user": "Add VPN user",
-    "label.add.vxlan": "Add VXLAN",
-    "label.add.zone": "Add Zone",
-    "label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
-    "label.added.network.offering": "Added network offering",
-    "label.added.new.bigswitch.bcf.controller": "Added new BigSwitch BCF Controller",
-    "label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
-    "label.addes.new.f5": "Added new F5",
-    "label.adding": "Adding",
-    "label.adding.cluster": "Adding Cluster",
-    "label.adding.failed": "Adding Failed",
-    "label.adding.pod": "Adding Pod",
-    "label.adding.processing": "Adding....",
-    "label.adding.succeeded": "Adding Succeeded",
-    "label.adding.user": "Adding User",
-    "label.adding.zone": "Adding Zone",
-    "label.additional.networks": "Additional Networks",
-    "label.admin": "Admin",
-    "label.admin.accounts": "Admin Accounts",
-    "label.advanced": "Advanced",
-    "label.advanced.mode": "Advanced Mode",
-    "label.advanced.search": "Advanced Search",
-    "label.affinity": "Affinity",
-    "label.affinity.group": "Affinity Group",
-    "label.affinity.groups": "Affinity Groups",
-    "label.agent.password": "Agent Password",
-    "label.agent.port": "Agent Port",
-    "label.agent.state": "Agent State",
-    "label.agent.username": "Agent Username",
-    "label.agree": "Agree",
-    "label.alert": "Alert",
-    "label.alert.archived": "Alert Archived",
-    "label.alert.deleted": "Alert Deleted",
-    "label.alert.details": "Alert details",
-    "label.algorithm": "Algorithm",
-    "label.allocated": "تخصيص",
-    "label.allocation.state": "Allocation State",
-    "label.allow": "Allow",
-    "label.anti.affinity": "Anti-affinity",
-    "label.anti.affinity.group": "Anti-affinity Group",
-    "label.anti.affinity.groups": "Anti-affinity Groups",
-    "label.api.key": "API Key",
-    "label.api.version": "API Version",
-    "label.app.name": "CloudStack",
-    "label.apply": "تطبيق",
-    "label.archive": "Archive",
-    "label.archive.alerts": "Archive alerts",
-    "label.archive.events": "Archive events",
-    "label.assign": "Assign",
-    "label.assign.instance.another": "Assign Instance to Another Account",
-    "label.assign.to.load.balancer": "Assigning instance to load balancer",
-    "label.assign.vms": "Assign VMs",
-    "label.assigned.vms": "Assigned VMs",
-    "label.associate.public.ip": "Associate Public IP",
-    "label.associated.network": "شبكة مرتبطة",
-    "label.associated.network.id": "Associated Network ID",
-    "label.associated.profile": "Associated Profile",
-    "label.attached.iso": "Attached ISO",
-    "label.author.email": "Author e-mail",
-    "label.author.name": "Author name",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
-    "label.availability": "Availability",
-    "label.availability.zone": "Availability Zone",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "Available",
-    "label.available.public.ips": "Available Public IP Addresses",
-    "label.back": "Back",
-    "label.bandwidth": "Bandwidth",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP Devices",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP Provider",
-    "label.baremetal.pxe.device": "Add Baremetal PXE Device",
-    "label.baremetal.pxe.devices": "Baremetal PXE Devices",
-    "label.baremetal.pxe.provider": "Baremetal PXE Provider",
-    "label.baremetal.rack.configuration": "Baremetal Rack Configuration",
-    "label.basic": "Basic",
-    "label.basic.mode": "Basic Mode",
-    "label.bigswitch.bcf.details": "BigSwitch BCF details",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT Enabled",
-    "label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "Bootable",
-    "label.broadcast.domain.range": "Broadcast domain range",
-    "label.broadcast.domain.type": "Broadcast Domain Type",
-    "label.broadcast.uri": "بث الرابط",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "بث الرابط",
-    "label.brocade.vcs.address": "Vcs Switch Address",
-    "label.brocade.vcs.details": "Brocade Vcs Switch details",
-    "label.by.account": "By Account",
-    "label.by.alert.type": "By alert type",
-    "label.by.availability": "By Availability",
-    "label.by.date.end": "By date (end)",
-    "label.by.date.start": "By date (start)",
-    "label.by.domain": "By Domain",
-    "label.by.end.date": "By End Date",
-    "label.by.event.type": "By event type",
-    "label.by.level": "By Level",
-    "label.by.pod": "By Pod",
-    "label.by.role": "By Role",
-    "label.by.start.date": "By Start Date",
-    "label.by.state": "By State",
-    "label.by.traffic.type": "By Traffic Type",
-    "label.by.type": "By Type",
-    "label.by.type.id": "By Type ID",
-    "label.by.zone": "By Zone",
-    "label.bytes.received": "Bytes Received",
-    "label.bytes.sent": "Bytes Sent",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "Cancel",
-    "label.capacity": "Capacity",
-    "label.capacity.bytes": "Capacity Bytes",
-    "label.capacity.iops": "Capacity IOPS",
-    "label.certificate": "Server certificate",
-    "label.change.affinity": "Change Affinity",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "Change service offering",
-    "label.change.value": "تغير القيمة",
-    "label.character": "Character",
-    "label.chassis": "Chassis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR or Account/Security Group",
-    "label.cidr.list": "Source CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Address",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Password",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Username",
-    "label.ciscovnmc.resource.details": "CiscoVNMC resource details",
-    "label.clean.up": "تنظيف",
-    "label.clear.list": "مسح القائمة",
-    "label.close": "Close",
-    "label.cloud.console": "Cloud Management Console",
-    "label.cloud.managed": "Cloud.com Managed",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Cluster Name",
-    "label.cluster.type": "Cluster Type",
-    "label.clusters": "Clusters",
-    "label.clvm": "CLVM",
-    "label.code": "Code",
-    "label.community": "Community",
-    "label.compute": "Compute",
-    "label.compute.and.storage": "Compute and Storage",
-    "label.compute.offering": "Compute offering",
-    "label.compute.offerings": "Compute Offerings",
-    "label.configuration": "ترتيب",
-    "label.configure": "قم بتكوين",
-    "label.configure.ldap": "Configure LDAP",
-    "label.configure.network.ACLs": "ضبط شبكة ACLs",
-    "label.configure.sticky.policy": "Configure Sticky Policy",
-    "label.configure.vpc": "تكوين VPC",
-    "label.confirm.password": "Confirm password",
-    "label.confirmation": "Confirmation",
-    "label.congratulations": "Congratulations!",
-    "label.conserve.mode": "Conserve mode",
-    "label.console.proxy": "Console proxy",
-    "label.console.proxy.vm": "Console Proxy VM",
-    "label.continue": "Continue",
-    "label.continue.basic.install": "Continue with basic installation",
-    "label.copying.iso": "Copying ISO",
-    "label.corrections.saved": "تم حفظ التصحيحات",
-    "label.counter": "Counter",
-    "label.cpu": "و م م",
-    "label.cpu.allocated": "CPU Allocated",
-    "label.cpu.allocated.for.VMs": "CPU Allocated for VMs",
-    "label.cpu.limits": "CPU limits",
-    "label.cpu.mhz": "وحدة المعالجة المركزية (بالميغاهيرتز)",
-    "label.cpu.utilized": "CPU Utilized",
-    "label.create.VPN.connection": "إنشاء اتصال بوابة الشبكة الافتراضية الشخصية",
-    "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
-    "label.create.nfs.secondary.staging.store": "Create NFS secondary staging store",
-    "label.create.project": "أنشئ مشروع",
-    "label.create.ssh.key.pair": "Create a SSH Key Pair",
-    "label.create.template": "Create template",
-    "label.created": "Created",
-    "label.created.by.system": "Created by system",
-    "label.cross.zones": "Cross Zones",
-    "label.custom": "Custom",
-    "label.custom.disk.iops": "Custom IOPS",
-    "label.custom.disk.offering": "Custom Disk Offering",
-    "label.custom.disk.size": "Custom Disk Size",
-    "label.daily": "Daily",
-    "label.data.disk.offering": "Data Disk Offering",
-    "label.date": "Date",
-    "label.day": "Day",
-    "label.day.of.month": "Day of Month",
-    "label.day.of.week": "Day of Week",
-    "label.dc.name": "DC Name",
-    "label.dead.peer.detection": "كشف القرين المفقود",
-    "label.decline.invitation": "رفض الدعوة",
-    "label.dedicate": "Dedicate",
-    "label.dedicate.cluster": "Dedicate Cluster",
-    "label.dedicate.host": "Dedicate Host",
-    "label.dedicate.pod": "Dedicate Pod",
-    "label.dedicate.vlan.vni.range": "Dedicate VLAN/VNI Range",
-    "label.dedicate.zone": "Dedicate Zone",
-    "label.dedicated": "Dedicated",
-    "label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
-    "label.default": "الإفتراضي",
-    "label.default.egress.policy": "Default egress policy",
-    "label.default.use": "Default Use",
-    "label.default.view": "طريقة العرض الافتراضية",
-    "label.delete": "Delete",
-    "label.delete.BigSwitchBcf": "Remove BigSwitch BCF Controller",
-    "label.delete.BrocadeVcs": "Remove Brocade Vcs Switch",
-    "label.delete.F5": "Delete F5",
-    "label.delete.NetScaler": "Delete NetScaler",
-    "label.delete.NiciraNvp": "Remove Nvp Controller",
-    "label.delete.OpenDaylight.device": "Delete OpenDaylight Controller",
-    "label.delete.PA": "Delete Palo Alto",
-    "label.delete.SRX": "Delete SRX",
-    "label.delete.VPN.connection": "احذف بوابة الشبكة الافتراضية الشخصية",
-    "label.delete.VPN.customer.gateway": "حذف بوابة VPN المخصصة",
-    "label.delete.VPN.gateway": "احذف بوابة الشبكة الافتراضية الشخصية",
-    "label.delete.acl.list": "Delete ACL List",
-    "label.delete.affinity.group": "Delete Affinity Group",
-    "label.delete.alerts": "Delete alerts",
-    "label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
-    "label.delete.ciscoASA1000v": "Delete CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
-    "label.delete.events": "Delete events",
-    "label.delete.gateway": "احذف البوابة",
-    "label.delete.internal.lb": "Delete Internal LB",
-    "label.delete.portable.ip.range": "Delete Portable IP Range",
-    "label.delete.profile": "Delete Profile",
-    "label.delete.project": "حذف المشروع",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Delete Secondary Staging Store",
-    "label.delete.ucs.manager": "Delete UCS Manager",
-    "label.delete.vpn.user": "Delete VPN user",
-    "label.deleting.failed": "Deleting Failed",
-    "label.deleting.processing": "Deleting....",
-    "label.deny": "Deny",
-    "label.deployment.planner": "Deployment planner",
-    "label.description": "Description",
-    "label.destination.physical.network.id": "Destination physical network ID",
-    "label.destination.zone": "Destination Zone",
-    "label.destroy": "هدم",
-    "label.destroy.router": "Destroy router",
-    "label.destroy.vm.graceperiod": "Destroy VM Grace Period",
-    "label.detaching.disk": "Detaching Disk",
-    "label.details": "Details",
-    "label.device.id": "Device ID",
-    "label.devices": "الأجهزة",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direct Attached Public IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "الشبكة المشتركة IPs",
-    "label.disable.autoscale": "Disable Autoscale",
-    "label.disable.host": "Disable Host",
-    "label.disable.network.offering": "Disable network offering",
-    "label.disable.provider": "Disable provider",
-    "label.disable.vnmc.provider": "Disable VNMC provider",
-    "label.disable.vpc.offering": "Disable VPC offering",
-    "label.disable.vpn": "Disable Remote Access VPN",
-    "label.disabled": "Disabled",
-    "label.disabling.vpn.access": "Disabling VPN Access",
-    "label.disassociate.profile.blade": "Disassociate Profile from Blade",
-    "label.disbale.vnmc.device": "Disable VNMC device",
-    "label.disk.allocated": "Disk Allocated",
-    "label.disk.bytes.read.rate": "Disk Read Rate (BPS)",
-    "label.disk.bytes.write.rate": "Disk Write Rate (BPS)",
-    "label.disk.iops.max": "Max IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Disk Read Rate (IOPS)",
-    "label.disk.iops.total": "IOPS Total",
-    "label.disk.iops.write.rate": "Disk Write Rate (IOPS)",
-    "label.disk.offering": "Disk Offering",
-    "label.disk.offering.details": "Disk offering details",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisioning Type",
-    "label.disk.read.bytes": "Disk Read (Bytes)",
-    "label.disk.read.io": "Disk Read (IO)",
-    "label.disk.size": "Disk Size",
-    "label.disk.size.gb": "Disk Size (in GB)",
-    "label.disk.total": "Disk Total",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Disk Volume",
-    "label.disk.write.bytes": "Disk Write (Bytes)",
-    "label.disk.write.io": "Disk Write (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Display Name",
-    "label.display.text": "Display Text",
-    "label.distributedrouter": "Distributed Router",
-    "label.dns": "نظام تسمية المجال DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domain",
-    "label.domain.admin": "Domain Admin",
-    "label.domain.details": "Domain details",
-    "label.domain.id": "Domain ID",
-    "label.domain.lower": "domain",
-    "label.domain.name": "Domain Name",
-    "label.domain.router": "Domain router",
-    "label.domain.suffix": "DNS Domain Suffix (i.e., xyz.com)",
-    "label.done": "Done",
-    "label.double.quotes.are.not.allowed": "Double quotes are not allowed",
-    "label.download.progress": "Download Progress",
-    "label.drag.new.position": "اسحب لموقف جديد",
-    "label.duration.in.sec": "Duration (in sec)",
-    "label.dynamically.scalable": "Dynamically Scalable",
-    "label.edit": "Edit",
-    "label.edit.acl.rule": "Edit ACL rule",
-    "label.edit.affinity.group": "Edit Affinity Group",
-    "label.edit.lb.rule": "Edit LB rule",
-    "label.edit.network.details": "تحرير تفاصيل الشبكة",
-    "label.edit.project.details": "اضافة تفاصيل المشروع",
-    "label.edit.region": "Edit Region",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Edit rule",
-    "label.edit.secondary.ips": "Edit secondary IPs",
-    "label.edit.tags": "تعديل العلامات",
-    "label.edit.traffic.type": "Edit traffic type",
-    "label.edit.vpc": "تعديل VPC",
-    "label.egress.default.policy": "Egress Default Policy",
-    "label.egress.rule": "Egress rule",
-    "label.egress.rules": "قواعد الخروج",
-    "label.elastic": "مرن",
-    "label.elastic.IP": "Elastic IP",
-    "label.elastic.LB": "Elastic LB",
-    "label.email": "Email",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Enable Autoscale",
-    "label.enable.host": "Enable Host",
-    "label.enable.network.offering": "Enable network offering",
-    "label.enable.provider": "Enable provider",
-    "label.enable.s3": "تمكين التخزين الثانوي S3",
-    "label.enable.swift": "Enable Swift",
-    "label.enable.vnmc.device": "Enable VNMC device",
-    "label.enable.vnmc.provider": "Enable VNMC provider",
-    "label.enable.vpc.offering": "Enable VPC offering",
-    "label.enable.vpn": "Enable Remote Access VPN",
-    "label.enabling.vpn": "Enabling VPN",
-    "label.enabling.vpn.access": "Enabling VPN Access",
-    "label.end.IP": "End IP",
-    "label.end.port": "End Port",
-    "label.end.reserved.system.IP": "End Reserved system IP",
-    "label.end.vlan": "End VLAN",
-    "label.end.vxlan": "End VXLAN",
-    "label.endpoint": "نقطة النهاية",
-    "label.endpoint.or.operation": "Endpoint or Operation",
-    "label.enter.token": "Enter token",
-    "label.error": "خطأ",
-    "label.error.code": "Error Code",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX/ESXi Host",
-    "label.event": "Event",
-    "label.event.archived": "Event Archived",
-    "label.event.deleted": "Event Deleted",
-    "label.every": "Every",
-    "label.example": "Example",
-    "label.expunge": "Expunge",
-    "label.external.link": "External link",
-    "label.extractable": "Extractable",
-    "label.extractable.lower": "extractable",
-    "label.f5": "F5",
-    "label.f5.details": "F5 details",
-    "label.failed": "خطأ",
-    "label.featured": "Featured",
-    "label.fetch.latest": "Fetch latest",
-    "label.filterBy": "تصفية حسب",
-    "label.fingerprint": "FingerPrint",
-    "label.firewall": "Firewall",
-    "label.first.name": "First Name",
-    "label.firstname.lower": "firstname",
-    "label.format": "Format",
-    "label.format.lower": "format",
-    "label.friday": "Friday",
-    "label.full": "Full",
-    "label.full.path": "مسار كامل",
-    "label.gateway": "Gateway",
-    "label.general.alerts": "General Alerts",
-    "label.generating.url": "Generating URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS Configuration",
-    "label.gluster.volume": "Volume",
-    "label.go.step.2": "Go to Step 2",
-    "label.go.step.3": "Go to Step 3",
-    "label.go.step.4": "Go to Step 4",
-    "label.go.step.5": "Go to Step 5",
-    "label.gpu": "وعر",
-    "label.group": "Group",
-    "label.group.by.account": "Group by account",
-    "label.group.by.cluster": "Group by cluster",
-    "label.group.by.pod": "Group by pod",
-    "label.group.by.zone": "Group by zone",
-    "label.group.optional": "Group (Optional)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Assigned load balancing",
-    "label.gslb.assigned.lb.more": "Assign more load balancing",
-    "label.gslb.delete": "Delete GSLB",
-    "label.gslb.details": "GSLB details",
-    "label.gslb.domain.name": "GSLB Domain Name",
-    "label.gslb.lb.details": "Load balancing details",
-    "label.gslb.lb.remove": "Remove load balancing from this GSLB",
-    "label.gslb.lb.rule": "Load balancing rule",
-    "label.gslb.service": "GSLB service",
-    "label.gslb.service.private.ip": "GSLB service Private IP",
-    "label.gslb.service.public.ip": "GSLB service Public IP",
-    "label.gslb.servicetype": "Service Type",
-    "label.guest": "Guest",
-    "label.guest.cidr": "Guest CIDR",
-    "label.guest.end.ip": "Guest end IP",
-    "label.guest.gateway": "Guest Gateway",
-    "label.guest.ip": "Guest IP Address",
-    "label.guest.ip.range": "Guest IP Range",
-    "label.guest.netmask": "Guest Netmask",
-    "label.guest.network.details": "Guest network details",
-    "label.guest.networks": "Guest networks",
-    "label.guest.start.ip": "Guest start IP",
-    "label.guest.traffic": "Guest Traffic",
-    "label.guest.traffic.vswitch.name": "Guest Traffic vSwitch Name",
-    "label.guest.traffic.vswitch.type": "Guest Traffic vSwitch Type",
-    "label.guest.type": "نوع الضيف",
-    "label.ha.enabled": "HA Enabled",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "Advanced Options:",
-    "label.health.check.configurations.options": "Configuration Options:",
-    "label.health.check.interval.in.sec": "Health Check Interval (in sec)",
-    "label.health.check.message.desc": "Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check",
-    "label.health.check.wizard": "Health Check Wizard",
-    "label.healthy.threshold": "Healthy Threshold",
-    "label.help": "Help",
-    "label.hide.ingress.rule": "Hide Ingress Rule",
-    "label.hints": "Hints",
-    "label.home": "Home",
-    "label.host": "Host",
-    "label.host.MAC": "Host MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Host Name",
-    "label.host.tag": "Host Tag",
-    "label.host.tags": "Host Tags",
-    "label.hosts": "Hosts",
-    "label.hourly": "Hourly",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Traffic Label",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Hypervisor capabilities",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Snapshot Reserve",
-    "label.hypervisor.type": "Hypervisor Type",
-    "label.hypervisor.version": "Hypervisor version",
-    "label.hypervisors": "Hypervisors",
-    "label.id": "ID",
-    "label.info": "Info",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Ingress Rule",
-    "label.initiated.by": "Initiated By",
-    "label.inside.port.profile": "Inside Port Profile",
-    "label.installWizard.addClusterIntro.subtitle": "What is a cluster?",
-    "label.installWizard.addClusterIntro.title": "Let&rsquo;s add a cluster",
-    "label.installWizard.addHostIntro.subtitle": "What is a host?",
-    "label.installWizard.addHostIntro.title": "Let&rsquo;s add a host",
-    "label.installWizard.addPodIntro.subtitle": "What is a pod?",
-    "label.installWizard.addPodIntro.title": "Let&rsquo;s add a pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "What is primary storage?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Let&rsquo;s add primary storage",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "What is secondary storage?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Let&rsquo;s add secondary storage",
-    "label.installWizard.addZone.title": "Add zone",
-    "label.installWizard.addZoneIntro.subtitle": "What is a zone?",
-    "label.installWizard.addZoneIntro.title": "Let&rsquo;s add a zone",
-    "label.installWizard.click.launch": "Click the launch button.",
-    "label.installWizard.subtitle": "This tour will aid you in setting up your CloudStack&#8482 installation",
-    "label.installWizard.title": "Hello and Welcome to CloudStack&#8482",
-    "label.instance": "Instance",
-    "label.instance.limits": "Instance Limits",
-    "label.instance.name": "Instance Name",
-    "label.instance.port": "Instance Port",
-    "label.instance.scaled.up": "Instance scaled to the requested offering",
-    "label.instances": "الحالات",
-    "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-    "label.intermediate.certificate": "Intermediate certificate {0}",
-    "label.internal.dns.1": "Internal DNS 1",
-    "label.internal.dns.2": "Internal DNS 2",
-    "label.internal.lb": "Internal LB",
-    "label.internal.lb.details": "Internal LB details",
-    "label.internal.name": "Internal name",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Interval Type",
-    "label.introduction.to.cloudstack": "Introduction to CloudStack&#8482",
-    "label.invalid.integer": "Invalid Integer",
-    "label.invalid.number": "Invalid Number",
-    "label.invitations": "دعوات",
-    "label.invite": "Invite",
-    "label.invite.to": "دعوة لـ",
-    "label.invited.accounts": "دعوة حسابات",
-    "label.ip": "IP",
-    "label.ip.address": "IP Address",
-    "label.ip.allocations": "IP Allocations",
-    "label.ip.limits": "Public IP Limits",
-    "label.ip.or.fqdn": "IP or FQDN",
-    "label.ip.range": "IP Range",
-    "label.ip.ranges": "IP Ranges",
-    "label.ipaddress": "IP Address",
-    "label.ips": "IPs",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 End IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 Netmask",
-    "label.ipv4.start.ip": "IPv4 Start IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Address",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 End IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Start IP",
-    "label.is.default": "Is Default",
-    "label.is.redundant.router": "Redundant",
-    "label.is.shared": "Is Shared",
-    "label.is.system": "Is System",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO Boot",
-    "label.isolated.networks": "Isolated networks",
-    "label.isolation.method": "Isolation method",
-    "label.isolation.mode": "Isolation Mode",
-    "label.isolation.uri": "عزل الرابط",
-    "label.item.listing": "Item listing",
-    "label.japanese.keyboard": "Japanese keyboard",
-    "label.keep": "Keep",
-    "label.keep.colon": "Keep:",
-    "label.key": "Key",
-    "label.keyboard.language": "Keyboard language",
-    "label.keyboard.type": "نوع لوحة المفاتيح",
-    "label.kvm.traffic.label": "KVM traffic label",
-    "label.label": "Label",
-    "label.lang.arabic": "Arabic",
-    "label.lang.brportugese": "Brazilian Portugese",
-    "label.lang.catalan": "Catalan",
-    "label.lang.chinese": "Chinese (Simplified)",
-    "label.lang.dutch": "Dutch (Netherlands)",
-    "label.lang.english": "English",
-    "label.lang.french": "French",
-    "label.lang.german": "German",
-    "label.lang.hungarian": "Hungarian",
-    "label.lang.italian": "Italian",
-    "label.lang.japanese": "Japanese",
-    "label.lang.korean": "Korean",
-    "label.lang.norwegian": "Norwegian",
-    "label.lang.polish": "Polish",
-    "label.lang.russian": "Russian",
-    "label.lang.spanish": "Spanish",
-    "label.last.disconnected": "Last Disconnected",
-    "label.last.name": "Last Name",
-    "label.lastname.lower": "lastname",
-    "label.latest.events": "Latest events",
-    "label.launch": "Launch",
-    "label.launch.vm": "Launch VM",
-    "label.launch.zone": "Launch zone",
-    "label.lb.algorithm.leastconn": "أقل الإتصالات",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "مصدر",
-    "label.ldap.configuration": "LDAP Configuration",
-    "label.ldap.group.name": "LDAP Group",
-    "label.ldap.link.type": "Type",
-    "label.ldap.port": "LDAP port",
-    "label.level": "Level",
-    "label.link.domain.to.ldap": "Link Domain to LDAP",
-    "label.linklocal.ip": "Link Local IP Address",
-    "label.load.balancer": "Load Balancer",
-    "label.load.balancer.type": "Load Balancer Type",
-    "label.load.balancing": "Load Balancing",
-    "label.load.balancing.policies": "Load balancing policies",
-    "label.loading": "Loading",
-    "label.local": "Local",
-    "label.local.file": "Local file",
-    "label.local.storage": "Local Storage",
-    "label.local.storage.enabled": "Enable local storage for User VMs",
-    "label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
-    "label.login": "Login",
-    "label.logout": "Logout",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Traffic Label",
-    "label.make.project.owner": "جعل الحساب مالك للمشروع",
-    "label.make.redundant": "Make redundant",
-    "label.manage": "Manage",
-    "label.manage.resources": "Manage Resources",
-    "label.managed": "Managed",
-    "label.management": "Management",
-    "label.management.ips": "Management IP Addresses",
-    "label.management.server": "Management Server",
-    "label.max.cpus": "Max. CPU cores",
-    "label.max.guest.limit": "الحد الأقصاء لضيف",
-    "label.max.instances": "Max Instances",
-    "label.max.memory": "Max. memory (MiB)",
-    "label.max.networks": "Max. networks",
-    "label.max.primary.storage": "Max. primary (GiB)",
-    "label.max.public.ips": "Max. public IPs",
-    "label.max.secondary.storage": "Max. secondary (GiB)",
-    "label.max.snapshots": "Max. snapshots",
-    "label.max.templates": "Max. templates",
-    "label.max.vms": "Max. user VMs",
-    "label.max.volumes": "Max. volumes",
-    "label.max.vpcs": "Max. VPCs",
-    "label.maximum": "Maximum",
-    "label.may.continue": "You may now continue.",
-    "label.md5.checksum": "MD5 checksum",
-    "label.memory": "الذاكرة",
-    "label.memory.allocated": "Memory Allocated",
-    "label.memory.limits": "Memory limits (MiB)",
-    "label.memory.mb": "الذاكرة ( بالميجابايبت)",
-    "label.memory.total": "Memory Total",
-    "label.memory.used": "Memory Used",
-    "label.menu.accounts": "Accounts",
-    "label.menu.alerts": "التنبيهات",
-    "label.menu.all.accounts": "جميع الحسابات",
-    "label.menu.all.instances": "جميع الحالات",
-    "label.menu.community.isos": "التضامن الدولي المجتمعي",
-    "label.menu.community.templates": "قوالب المجتمع",
-    "label.menu.configuration": "ترتيب",
-    "label.menu.dashboard": "لوحة القيادة",
-    "label.menu.destroyed.instances": "حالات التدمير",
-    "label.menu.disk.offerings": "عروض القرص",
-    "label.menu.domains": "المجالات",
-    "label.menu.events": "أحداث",
-    "label.menu.featured.isos": "مميزات التضامن الدولي",
-    "label.menu.featured.templates": "قوالب مميزة",
-    "label.menu.global.settings": "الإعدادات العمومية",
-    "label.menu.infrastructure": "Infrastructure",
-    "label.menu.instances": "الحالات",
-    "label.menu.ipaddresses": "IP Addresses",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "My Accounts",
-    "label.menu.my.instances": "My Instances",
-    "label.menu.my.isos": "My ISOs",
-    "label.menu.my.templates": "My Templates",
-    "label.menu.network": "Network",
-    "label.menu.network.offerings": "Network Offerings",
-    "label.menu.physical.resources": "Physical Resources",
-    "label.menu.regions": "Regions",
-    "label.menu.running.instances": "Running Instances",
-    "label.menu.security.groups": "Security Groups",
-    "label.menu.service.offerings": "Service Offerings",
-    "label.menu.snapshots": "Snapshots",
-    "label.menu.sshkeypair": "SSH KeyPair",
-    "label.menu.stopped.instances": "Stopped Instances",
-    "label.menu.storage": "Storage",
-    "label.menu.system": "System",
-    "label.menu.system.service.offerings": "System Offerings",
-    "label.menu.system.vms": "System VMs",
-    "label.menu.templates": "Templates",
-    "label.menu.virtual.appliances": "Virtual Appliances",
-    "label.menu.virtual.resources": "Virtual Resources",
-    "label.menu.volumes": "Volumes",
-    "label.menu.vpc.offerings": "VPC Offerings",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "تخصيص",
-    "label.metrics.clusters": "Clusters",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "Used",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "تخصيص",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "Size",
-    "label.metrics.disk.storagetype": "Type",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "Used",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "Hosts",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "Used",
-    "label.metrics.name": "Name",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "المجال",
-    "label.metrics.state": "State",
-    "label.metrics.storagepool": "Storage Pool",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "Migrate instance to",
-    "label.migrate.instance.to.host": "نقل القالب إلى مضيف آخر",
-    "label.migrate.instance.to.ps": "نقل القالب إلى الذاكرة الأساسية",
-    "label.migrate.lb.vm": "Migrate LB VM",
-    "label.migrate.router.to": "Migrate Router to",
-    "label.migrate.systemvm.to": "Migrate System VM to",
-    "label.migrate.to.host": "التحول إلى المضيف",
-    "label.migrate.to.storage": "التحول إلى التخزين",
-    "label.migrate.volume": "Migrate Volume",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.migrate.volume.to.primary.storage": "Migrate volume to another primary storage",
-    "label.min.instances": "Min Instances",
-    "label.min.past.the.hr": "min past the hr",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "minute(s) past the hour",
-    "label.minutes.past.hour": "minutes(s) past the hour",
-    "label.mode": "Mode",
-    "label.monday": "Monday",
-    "label.monthly": "Monthly",
-    "label.more.templates": "More Templates",
-    "label.move.down.row": "الانتقال إلى الأسفل بصف واحد",
-    "label.move.to.bottom": "الانتقال إلى الأسفل",
-    "label.move.to.top": "انتقال إلى أعلى",
-    "label.move.up.row": "الانتقال إلى الأعلى بصف واحد",
-    "label.my.account": "My Account",
-    "label.my.network": "شبكتي",
-    "label.my.templates": "قوالبي",
-    "label.na": "N/A",
-    "label.name": "Name",
-    "label.name.lower": "name",
-    "label.name.optional": "Name (Optional)",
-    "label.nat.port.range": "NAT Port Range",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Netmask",
-    "label.netscaler.details": "NetScaler details",
-    "label.network": "Network",
-    "label.network.ACL": "شبكة ACL",
-    "label.network.ACL.total": "إجمال شبكة ACL",
-    "label.network.ACLs": "شبكة ACLs",
-    "label.network.addVM": "Add network to VM",
-    "label.network.cidr": "Network CIDR",
-    "label.network.desc": "Network Desc",
-    "label.network.details": "Network Details",
-    "label.network.device": "Network Device",
-    "label.network.device.type": "Network Device Type",
-    "label.network.domain": "Network Domain",
-    "label.network.domain.text": "Network domain",
-    "label.network.id": "Network ID",
-    "label.network.label.display.for.blank.value": "Use default gateway",
-    "label.network.limits": "Network limits",
-    "label.network.name": "Network Name",
-    "label.network.offering": "Network Offering",
-    "label.network.offering.details": "Network offering details",
-    "label.network.offering.display.text": "Network Offering Display Text",
-    "label.network.offering.id": "Network Offering ID",
-    "label.network.offering.name": "Network Offering Name",
-    "label.network.rate": "Network Rate (Mb/s)",
-    "label.network.rate.megabytes": "Network Rate (MB/s)",
-    "label.network.read": "Network Read",
-    "label.network.service.providers": "Network Service Providers",
-    "label.network.type": "Network Type",
-    "label.network.write": "Network Write",
-    "label.networking.and.security": "Networking and security",
-    "label.networks": "الشبكات",
-    "label.new": "جديد",
-    "label.new.password": "New Password",
-    "label.current.password": "Current Password",
-    "label.new.project": "مشروع جديد",
-    "label.new.ssh.key.pair": "New SSH Key Pair",
-    "label.new.vm": "New VM",
-    "label.next": "Next",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS Server",
-    "label.nfs.storage": "NFS Storage",
-    "label.nic.adapter.type": "NIC adapter type",
-    "label.nicira.controller.address": "Controller Address",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP details",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "NICs",
-    "label.no": "No",
-    "label.no.actions": "No Available Actions",
-    "label.no.alerts": "No Recent Alerts",
-    "label.no.data": "لا يوجد بيانات للعرض",
-    "label.no.errors": "No Recent Errors",
-    "label.no.grouping": "(no grouping)",
-    "label.no.isos": "No available ISOs",
-    "label.no.items": "No Available Items",
-    "label.no.security.groups": "No Available Security Groups",
-    "label.no.thanks": "لا؛ شكراً",
-    "label.none": "None",
-    "label.not.found": "Not Found",
-    "label.notifications": "التنبيهات",
-    "label.num.cpu.cores": "# of CPU Cores",
-    "label.number.of.clusters": "Number of Clusters",
-    "label.number.of.cpu.sockets": "The Number of CPU Sockets",
-    "label.number.of.hosts": "Number of Hosts",
-    "label.number.of.pods": "Number of Pods",
-    "label.number.of.system.vms": "Number of System VMs",
-    "label.number.of.virtual.routers": "Number of Virtual Routers",
-    "label.number.of.zones": "Number of Zones",
-    "label.numretries": "Number of Retries",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "of month",
-    "label.offer.ha": "Offer HA",
-    "label.ok": "موافق",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controllers",
-    "label.operator": "Operator",
-    "label.optional": "Optional",
-    "label.order": "ترتيب",
-    "label.os.preference": "OS Preference",
-    "label.os.type": "OS Type",
-    "label.other": "Other",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Action",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Password",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Username",
-    "label.override.guest.traffic": "Override Guest-Traffic",
-    "label.override.public.traffic": "Override Public-Traffic",
-    "label.ovm.traffic.label": "OVM traffic label",
-    "label.ovm3.cluster": "Native Clustering",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Owned Public IP Addresses",
-    "label.owner.account": "Owner Account",
-    "label.owner.domain": "Owner Domain",
-    "label.palo.alto.details": "Palo Alto details",
-    "label.parent.domain": "Parent Domain",
-    "label.passive": "Passive",
-    "label.password": "Password",
-    "label.password.enabled": "Password Enabled",
-    "label.password.lower": "password",
-    "label.password.reset.confirm": "Password has been reset to ",
-    "label.path": "Path",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Persistent ",
-    "label.physical.network": "Physical Network",
-    "label.physical.network.ID": "Physical network ID",
-    "label.physical.network.name": "Physical network name",
-    "label.ping.path": "Ping Path",
-    "label.planner.mode": "Planner mode",
-    "label.please.complete.the.following.fields": "Please complete the following fields",
-    "label.please.specify.netscaler.info": "Please specify Netscaler info",
-    "label.please.wait": "Please Wait",
-    "label.plugin.details": "Plugin details",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dedicated",
-    "label.pod.name": "Pod name",
-    "label.pods": "Pods",
-    "label.polling.interval.sec": "Polling Interval (in sec)",
-    "label.port": "Port",
-    "label.port.forwarding": "Port Forwarding",
-    "label.port.forwarding.policies": "Port forwarding policies",
-    "label.port.range": "Port Range",
-    "label.portable.ip": "Portable IP",
-    "label.portable.ip.range.details": "Portable IP Range details",
-    "label.portable.ip.ranges": "Portable IP Ranges",
-    "label.portable.ips": "Portable IPs",
-    "label.powerstate": "Power State",
-    "label.prev": "Prev",
-    "label.previous": "السابق",
-    "label.primary.allocated": "Primary Storage Allocated",
-    "label.primary.network": "Primary Network",
-    "label.primary.storage": "Primary Storage",
-    "label.primary.storage.count": "Primary Storage Pools",
-    "label.primary.storage.limits": "Primary Storage limits (GiB)",
-    "label.primary.used": "Primary Storage Used",
-    "label.private.Gateway": "منفذGateway خاص",
-    "label.private.interface": "Private Interface",
-    "label.private.ip": "Private IP Address",
-    "label.private.ip.range": "Private IP Range",
-    "label.private.ips": "Private IP Addresses",
-    "label.private.key": "Private Key",
-    "label.private.network": "Private network",
-    "label.private.port": "Private Port",
-    "label.private.zone": "Private Zone",
-    "label.privatekey": "PKCS#8 Private Key",
-    "label.profile": "Profile",
-    "label.project": "مشروع",
-    "label.project.dashboard": "Project dashboard",
-    "label.project.id": "Project ID",
-    "label.project.invite": "دعوة إلى المشروع",
-    "label.project.name": "اسم المشروع",
-    "label.project.view": "عرض المشروع",
-    "label.projects": "المشاريع",
-    "label.protocol": "Protocol",
-    "label.protocol.number": "Protocol Number",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Provider",
-    "label.providers": "Providers",
-    "label.public": "Public",
-    "label.public.interface": "Public Interface",
-    "label.public.ip": "Public IP Address",
-    "label.public.ips": "Public IP Addresses",
-    "label.public.key": "Public Key",
-    "label.public.lb": "Public LB",
-    "label.public.load.balancer.provider": "Public Load Balancer Provider",
-    "label.public.network": "Public network",
-    "label.public.port": "Public Port",
-    "label.public.traffic": "Public traffic",
-    "label.public.traffic.vswitch.name": "Public Traffic vSwitch Name",
-    "label.public.traffic.vswitch.type": "Public Traffic vSwitch Type",
-    "label.public.zone": "Public Zone",
-    "label.purpose": "Purpose",
-    "label.qos.type": "QoS Type",
-    "label.quickview": "نظرة سريعة",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Time (in sec)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "Date",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "جميع الحسابات",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "State",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx user",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "إعادة تشغيل",
-    "label.recent.errors": "Recent Errors",
-    "label.recover.vm": "Recover VM",
-    "label.redundant.router": "Redundant Router",
-    "label.redundant.router.capability": "Redundant router capability",
-    "label.redundant.state": "Redundant state",
-    "label.redundant.vpc": "Redundant VPC",
-    "label.refresh": "Refresh",
-    "label.refresh.blades": "Refresh Blades",
-    "label.region": "Region",
-    "label.region.details": "Region details",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "Reinstall VM",
-    "label.related": "Related",
-    "label.release.account": "Release from Account",
-    "label.release.account.lowercase": "Release from account",
-    "label.release.dedicated.cluster": "Release Dedicated Cluster",
-    "label.release.dedicated.host": "Release Dedicated Host",
-    "label.release.dedicated.pod": "Release Dedicated Pod",
-    "label.release.dedicated.vlan.range": "Release dedicated VLAN range",
-    "label.release.dedicated.zone": "Release Dedicated Zone",
-    "label.remind.later": "ذكرني لاحقاً",
-    "label.remove.ACL": "إزالة ACL",
-    "label.remove.egress.rule": "Remove egress rule",
-    "label.remove.from.load.balancer": "Removing instance from load balancer",
-    "label.remove.ingress.rule": "Remove ingress rule",
-    "label.remove.ip.range": "Remove IP range",
-    "label.remove.ldap": "Remove LDAP",
-    "label.remove.network.offering": "Remove network offering",
-    "label.remove.pf": "Remove port forwarding rule",
-    "label.remove.project.account": "Remove account from project",
-    "label.remove.region": "Remove Region",
-    "label.remove.rule": "Remove rule",
-    "label.remove.ssh.key.pair": "Remove SSH Key Pair",
-    "label.remove.static.nat.rule": "Remove static NAT rule",
-    "label.remove.static.route": "إزالة التوجيه ثابت",
-    "label.remove.this.physical.network": "Remove this physical network",
-    "label.remove.tier": "إضافة طبقة",
-    "label.remove.vm.from.lb": "Remove VM from load balancer rule",
-    "label.remove.vm.load.balancer": "Remove VM from load balancer",
-    "label.remove.vmware.datacenter": "Remove VMware datacenter",
-    "label.remove.vpc": "إزالة VPC",
-    "label.remove.vpc.offering": "Remove VPC offering",
-    "label.removing": "Removing",
-    "label.removing.user": "Removing User",
-    "label.reource.id": "Resource ID",
-    "label.replace.acl": "Replace ACL",
-    "label.replace.acl.list": "Replace ACL List",
-    "label.required": "Required",
-    "label.requires.upgrade": "Requires Upgrade",
-    "label.reserved.ip.range": "Reserved IP Range",
-    "label.reserved.system.gateway": "Reserved system gateway",
-    "label.reserved.system.ip": "Reserved System IP",
-    "label.reserved.system.netmask": "Reserved system netmask",
-    "label.reset.VPN.connection": "إعادة تعيين اتصال الشبكة الافتراضية الشخصية",
-    "label.reset.ssh.key.pair": "Reset SSH Key Pair",
-    "label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
-    "label.resetVM": "Reset VM",
-    "label.resize.new.offering.id": "New Offering",
-    "label.resize.new.size": "New Size (GB)",
-    "label.resize.shrink.ok": "Shrink OK",
-    "label.resource": "Resource",
-    "label.resource.limit.exceeded": "Resource Limit Exceeded",
-    "label.resource.limits": "Resource Limits",
-    "label.resource.name": "Resource Name",
-    "label.resource.state": "Resource state",
-    "label.resources": "Resources",
-    "label.response.timeout.in.sec": "Response Timeout (in sec)",
-    "label.restart.network": "إعادة تشغيل الشبكة",
-    "label.restart.required": "مطلوب إعادة التشغيل",
-    "label.restart.vpc": "إعداة تشغيل VPC",
-    "label.restore": "إستعادة",
-    "label.retry.interval": "Retry Interval",
-    "label.review": "مراجعة",
-    "label.revoke.project.invite": "إلغاء الدعوة",
-    "label.role": "Role",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Root certificate",
-    "label.root.disk.controller": "Root disk controller",
-    "label.root.disk.offering": "Root Disk Offering",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Scaled Up",
-    "label.routing": "Routing",
-    "label.routing.host": "Routing Host",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Rule Number",
-    "label.rules": "Rules",
-    "label.running.vms": "Running VMs",
-    "label.s3.access_key": "مفتاح الوصول",
-    "label.s3.bucket": "دلو",
-    "label.s3.connection_timeout": "مهلة الاتصال",
-    "label.s3.endpoint": "نقطة النهاية",
-    "label.s3.max_error_retry": "أقصى خطأ في إعادة المحاولة",
-    "label.s3.nfs.path": "S3 NFS Path",
-    "label.s3.nfs.server": "S3 NFS Server",
-    "label.s3.secret_key": "المفتاح السري",
-    "label.s3.socket_timeout": "مهلة المقبس",
-    "label.s3.use_https": "استخدم HTTPS",
-    "label.saml.enable": "Authorize SAML SSO",
-    "label.saml.entity": "Identity Provider",
-    "label.saturday": "Saturday",
-    "label.save": "Save",
-    "label.save.and.continue": "Save and continue",
-    "label.save.changes": "Save changes",
-    "label.saving.processing": "Saving....",
-    "label.scale.up.policy": "SCALE UP POLICY",
-    "label.scaledown.policy": "ScaleDown Policy",
-    "label.scaleup.policy": "ScaleUp Policy",
-    "label.scope": "المجال",
-    "label.search": "بحث",
-    "label.secondary.ips": "Secondary IPs",
-    "label.secondary.isolated.vlan.id": "Secondary Isolated VLAN ID",
-    "label.secondary.staging.store": "Secondary Staging Store",
-    "label.secondary.staging.store.details": "Secondary Staging Store details",
-    "label.secondary.storage": "Secondary Storage",
-    "label.secondary.storage.count": "Secondary Storage Pools",
-    "label.secondary.storage.details": "Secondary storage details",
-    "label.secondary.storage.limits": "Secondary Storage limits (GiB)",
-    "label.secondary.storage.vm": "Secondary storage VM",
-    "label.secondary.used": "Secondary Storage Used",
-    "label.secret.key": "المفتاح السري",
-    "label.security.group": "Security Group",
-    "label.security.group.name": "Security Group Name",
-    "label.security.groups": "Security Groups",
-    "label.security.groups.enabled": "Security Groups Enabled",
-    "label.select": "Select",
-    "label.select-view": "حدد طريقة العرض",
-    "label.select.a.template": "اختر قالب",
-    "label.select.a.zone": "Select a zone",
-    "label.select.instance": "Select instance",
-    "label.select.instance.to.attach.volume.to": "Select instance to attach volume to",
-    "label.select.iso.or.template": "Select ISO or template",
-    "label.select.offering": "Select offering",
-    "label.select.project": "حدد المشروع",
-    "label.select.region": "Select region",
-    "label.select.template": "Select Template",
-    "label.select.tier": "حدد طبقة",
-    "label.select.vm.for.static.nat": "Select VM for static NAT",
-    "label.sent": "Sent",
-    "label.server": "Server",
-    "label.service.capabilities": "قدرات الخدمة",
-    "label.service.offering": "Service Offering",
-    "label.service.offering.details": "Service offering details",
-    "label.service.state": "Service State",
-    "label.services": "Services",
-    "label.session.expired": "Session Expired",
-    "label.set.default.NIC": "Set default NIC",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Set up zone type",
-    "label.settings": "Settings",
-    "label.setup": "التثبيت",
-    "label.setup.network": "Set up Network",
-    "label.setup.zone": "Set up Zone",
-    "label.shared": "Shared",
-    "label.show.advanced.settings": "Show advanced settings",
-    "label.show.ingress.rule": "Show Ingress Rule",
-    "label.shutdown.provider": "Shutdown provider",
-    "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
-    "label.site.to.site.VPN": "موقع إلى موقع-الشبكة الشخصية الظاهرية  VPN",
-    "label.size": "Size",
-    "label.skip.guide": "I have used CloudStack before, skip this guide",
-    "label.smb.domain": "SMB Domain",
-    "label.smb.password": "SMB Password",
-    "label.smb.username": "SMB Username",
-    "label.snapshot": "Snapshot",
-    "label.snapshot.limits": "Snapshot Limits",
-    "label.snapshot.name": "Snapshot Name",
-    "label.snapshot.s": "Snapshots",
-    "label.snapshot.schedule": "Set up Recurring Snapshot",
-    "label.snapshots": "Snapshots",
-    "label.sockets": "CPU Sockets",
-    "label.source.ip.address": "Source IP Address",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT Supported",
-    "label.source.port": "Source Port",
-    "label.specify.IP.ranges": "تحديد نطاقات IP",
-    "label.specify.vlan": "Specify VLAN",
-    "label.specify.vxlan": "Specify VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX details",
-    "label.ssh.key.pair": "SSH Key Pair",
-    "label.ssh.key.pair.details": "SSH Key Pair Details",
-    "label.ssh.key.pairs": "SSH Key Pairs",
-    "label.standard.us.keyboard": "Standard (US) keyboard",
-    "label.start.IP": "Start IP",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "Start Port",
-    "label.start.reserved.system.IP": "Start Reserved system IP",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "Start VXLAN",
-    "label.state": "State",
-    "label.static.nat": "Static NAT",
-    "label.static.nat.enabled": "Static NAT Enabled",
-    "label.static.nat.to": "Static NAT to",
-    "label.static.nat.vm.details": "Static NAT VM Details",
-    "label.static.routes": "Static Routes",
-    "label.statistics": "Statistics",
-    "label.status": "Status",
-    "label.step.1": "Step 1",
-    "label.step.1.title": "Step 1: <strong>Select a Template</strong>",
-    "label.step.2": "Step 2",
-    "label.step.2.title": "Step 2: <strong>Service Offering</strong>",
-    "label.step.3": "Step 3",
-    "label.step.3.title": "Step 3: <strong id=\"step3_label\">Select a Disk Offering</strong>",
-    "label.step.4": "Step 4",
-    "label.step.4.title": "Step 4: <strong>Network</strong>",
-    "label.step.5": "Step 5",
-    "label.step.5.title": "Step 5: <strong>Review</strong>",
-    "label.stickiness": "Stickiness",
-    "label.stickiness.method": "Stickiness method",
-    "label.sticky.cookie-name": "Cookie name",
-    "label.sticky.domain": "Domain",
-    "label.sticky.expire": "Expires",
-    "label.sticky.holdtime": "Hold time",
-    "label.sticky.indirect": "Indirect",
-    "label.sticky.length": "Length",
-    "label.sticky.mode": "Mode",
-    "label.sticky.name": "Sticky Name",
-    "label.sticky.nocache": "No cache",
-    "label.sticky.postonly": "Post only",
-    "label.sticky.prefix": "Prefix",
-    "label.sticky.request-learn": "Request learn",
-    "label.sticky.tablesize": "حجم الجدول",
-    "label.stop": "توقف",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "Stopped VMs",
-    "label.storage": "Storage",
-    "label.storage.pool": "Storage Pool",
-    "label.storage.tags": "Storage Tags",
-    "label.storage.traffic": "Storage Traffic",
-    "label.storage.type": "Storage Type",
-    "label.subdomain.access": "Subdomain Access",
-    "label.submit": "Submit",
-    "label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Succeeded",
-    "label.sunday": "Sunday",
-    "label.super.cidr.for.guest.networks": "CIDR ممتاز لشبكات الضيف.",
-    "label.supported.services": "tالخدمات المدعومة",
-    "label.supported.source.NAT.type": "Supported Source NAT type",
-    "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "إيقاف المشروع",
-    "label.switch.type": "Switch Type",
-    "label.system.capacity": "System Capacity",
-    "label.system.offering": "System Offering",
-    "label.system.offering.for.router": "System Offering for Router",
-    "label.system.service.offering": "System Service Offering",
-    "label.system.service.offering.details": "System service offering details",
-    "label.system.vm": "System VM",
-    "label.system.vm.details": "System VM details",
-    "label.system.vm.scaled.up": "System VM Scaled Up",
-    "label.system.vm.type": "System VM Type",
-    "label.system.vms": "System VMs",
-    "label.system.wide.capacity": "System-wide capacity",
-    "label.tag.key": "Tag Key",
-    "label.tag.value": "Tag Value",
-    "label.tagged": "Tagged",
-    "label.tags": "Tags",
-    "label.target.iqn": "Target IQN",
-    "label.task.completed": "Task completed",
-    "label.template": "Template",
-    "label.template.limits": "Template Limits",
-    "label.tftp.root.directory": "Tftp root directory",
-    "label.theme.default": "Default Theme",
-    "label.theme.grey": "Custom - Grey",
-    "label.theme.lightblue": "Custom - Light Blue",
-    "label.threshold": "Threshold",
-    "label.thursday": "Thursday",
-    "label.tier": "طبقة",
-    "label.tier.details": "تفاصيل الطبقة",
-    "label.time": "Time",
-    "label.time.colon": "Time:",
-    "label.time.zone": "Timezone",
-    "label.timeout": "Timeout",
-    "label.timeout.in.second ": " Timeout (seconds)",
-    "label.timezone": "Timezone",
-    "label.timezone.colon": "Timezone:",
-    "label.token": "Token",
-    "label.total.CPU": "Total CPU",
-    "label.total.cpu": "Total CPU",
-    "label.total.hosts": "Total Hosts",
-    "label.total.memory": "Total Memory",
-    "label.total.of.ip": "Total of IP Addresses",
-    "label.total.of.vm": "Total of VMs",
-    "label.total.storage": "Total Storage",
-    "label.total.virtual.routers": "Total of Virtual Routers",
-    "label.total.virtual.routers.upgrade": "Total of Virtual Routers that require upgrade",
-    "label.total.vms": "Total VMs",
-    "label.traffic.label": "Traffic label",
-    "label.traffic.type": "Traffic Type",
-    "label.traffic.types": "Traffic Types",
-    "label.tuesday": "Tuesday",
-    "label.type": "Type",
-    "label.type.id": "Type ID",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK keyboard",
-    "label.unavailable": "Unavailable",
-    "label.unhealthy.threshold": "Unhealthy Threshold",
-    "label.unlimited": "Unlimited",
-    "label.untagged": "Untagged",
-    "label.update.project.resources": "Update project resources",
-    "label.update.ssl": " SSL Certificate",
-    "label.update.ssl.cert": " SSL Certificate",
-    "label.updating": "Updating",
-    "label.upgrade.required": "Upgrade is required",
-    "label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
-    "label.upload": "رفع",
-    "label.upload.from.local": "Upload from Local",
-    "label.upload.template.from.local": "Upload Template from Local",
-    "label.upload.volume": "Upload volume",
-    "label.upload.volume.from.local": "Upload Volume from Local",
-    "label.upload.volume.from.url": "Upload volume from URL",
-    "label.url": "URL",
-    "label.usage.interface": "Usage Interface",
-    "label.usage.sanity.result": "Usage Sanity Result",
-    "label.usage.server": "Usage Server",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "Use VM IP:",
-    "label.use.vm.ips": "Use VM IPs",
-    "label.used": "Used",
-    "label.user": "User",
-    "label.user.data": "User Data",
-    "label.user.details": "User details",
-    "label.user.vm": "User VM",
-    "label.username": "Username",
-    "label.username.lower": "username",
-    "label.users": "Users",
-    "label.vSwitch.type": "vSwitch Type",
-    "label.value": "Value",
-    "label.vcdcname": "vCenter DC name",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter Cluster",
-    "label.vcenter.datacenter": "vCenter Datacenter",
-    "label.vcenter.datastore": "vCenter Datastore",
-    "label.vcenter.host": "vCenter Host",
-    "label.vcenter.password": "vCenter Password",
-    "label.vcenter.username": "vCenter Username",
-    "label.vcipaddress": "vCenter IP Address",
-    "label.version": "Version",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Max resolution",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Remaining capacity",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "عرض",
-    "label.view.all": "عرض الكل",
-    "label.view.console": "View console",
-    "label.view.more": "View more",
-    "label.view.secondary.ips": "View secondary IPs",
-    "label.viewing": "عرض",
-    "label.virtual.appliance": "Virtual Appliance",
-    "label.virtual.appliance.details": "Virtual applicance details",
-    "label.virtual.appliances": "Virtual Appliances",
-    "label.virtual.machine": "Virtual Machine",
-    "label.virtual.machines": "Virtual Machines",
-    "label.virtual.network": "Virtual Network",
-    "label.virtual.networking": "Virtual Networking",
-    "label.virtual.router": "Virtual Router",
-    "label.virtual.routers": "Virtual Routers",
-    "label.virtual.routers.group.account": "Virtual Routers group by account",
-    "label.virtual.routers.group.cluster": "Virtual Routers group by cluster",
-    "label.virtual.routers.group.pod": "Virtual Routers group by pod",
-    "label.virtual.routers.group.zone": "Virtual Routers group by zone",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI Range",
-    "label.vlan.range.details": "VLAN Range details",
-    "label.vlan.ranges": "VLAN Range(s)",
-    "label.vlan.vni.range": "VLAN/VNI Range",
-    "label.vlan.vni.ranges": "VLAN/VNI Range(s)",
-    "label.vm.add": "Add Instance",
-    "label.vm.destroy": "هدم",
-    "label.vm.display.name": "VM display name",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP Address",
-    "label.vm.name": "VM name",
-    "label.vm.password": "Password of the VM is",
-    "label.vm.reboot": "إعادة تشغيل",
-    "label.vm.start": "Start",
-    "label.vm.state": "VM state",
-    "label.vm.stop": "توقف",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "VM Snapshots",
-    "label.vmsnapshot.current": "isCurrent",
-    "label.vmsnapshot.memory": "Snapshot memory",
-    "label.vmsnapshot.parentname": "Parent",
-    "label.vmsnapshot.type": "Type",
-    "label.vmware.datacenter.id": "VMware datacenter ID",
-    "label.vmware.datacenter.name": "VMware datacenter Name",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "VMware traffic label",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC Devices",
-    "label.volatile": "Volatile",
-    "label.volgroup": "Volume Group",
-    "label.volume": "Volume",
-    "label.volume.details": "Volume details",
-    "label.volume.limits": "حدود المنطقة",
-    "label.volume.migrated": "Volume migrated",
-    "label.volume.name": "Volume Name",
-    "label.volumes": "Volumes",
-    "label.vpc": "سحابة إفتراضية خاصة VPC",
-    "label.vpc.distributedvpcrouter": "Distributed VPC Router",
-    "label.vpc.id": "هوية خاصة بسحابة إفتراضية خاصة",
-    "label.vpc.offering": "VPC Offering",
-    "label.vpc.offering.details": "VPC offering details",
-    "label.vpc.router.details": "VPC Router Details",
-    "label.vpc.supportsregionlevelvpc": "Supports Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtual Router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "بوابة الشبكة الافتراضية الشخصية للعميل",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "Control VLAN ID",
-    "label.vsmpktvlanid": "Packet VLAN ID",
-    "label.vsmstoragevlanid": "Storage VLAN ID",
-    "label.vsphere.managed": "vSphere Managed",
-    "label.vswitch.name": "vSwitch Name",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN Range",
-    "label.waiting": "قيد الإنتظار",
-    "label.warn": "تحذير",
-    "label.warn.upper": "WARN",
-    "label.warning": "Warning",
-    "label.wednesday": "الأربعاء",
-    "label.weekly": "إسبوعي",
-    "label.welcome": "مرحبا",
-    "label.welcome.cloud.console": "مرحبا بكم في وحدة التحكم الإرادية",
-    "label.what.is.cloudstack": "What is CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Original XS Version is 6.1+",
-    "label.xenserver.traffic.label": "XenServer traffic label",
-    "label.yes": "نعم",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone Dedicated",
-    "label.zone.details": "تفاصيل المنطقة",
-    "label.zone.id": "Zone ID",
-    "label.zone.lower": "zone",
-    "label.zone.name": "Zone Name",
-    "label.zone.step.1.title": "الخطوة 1 : على .<قوي> اختر شبكة </ قوي>",
-    "label.zone.step.2.title": "الخطوة 2 : <قوي> إضافة منطقة </ قوي>",
-    "label.zone.step.3.title": "الخطوة 3 : على <قوي> إضافة بود </ قوي>",
-    "label.zone.step.4.title": "الخطوة 4 : <قوي> إضافة مجموعة IP <قوي>",
-    "label.zone.type": "Zone Type",
-    "label.zone.wide": "منطقة واسعة",
-    "label.zoneWizard.trafficType.guest": "الضيف : الحركة بين الأجهزة الإفتراضية للمستخدم النهائي.",
-    "label.zoneWizard.trafficType.management": "إدارة: الحركة بين الموارد الداخلية ل كلاود ستاك ، متضمنة أي جزء يتصل بخادمسيرفر الإدارة ، مثل المضيفات و أنظمة كلاود ستاك الإفتراضية.",
-    "label.zoneWizard.trafficType.public": "العامة : المرور بين الإنترنت والأجهزة الظاهرية في السحابة.",
-    "label.zoneWizard.trafficType.storage": "التخزين : المرور بين ملقمات التخزين الابتدائية والثانوية، مثل قوالب VM واللقطات",
-    "label.zones": "Zones",
-    "managed.state": "Managed State",
-    "message.XSTools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
-    "message.Zone.creation.complete": "Zone creation complete",
-    "message.acquire.ip.nic": "Please confirm that you would like to acquire a new secondary IP for this NIC.<br/>NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine.",
-    "message.acquire.new.ip": "Please confirm that you would like to acquire a new IP for this network.",
-    "message.acquire.new.ip.vpc": "يرجى التأكيد بأنك ترغب في الحصول على بورتوكول إنترنت جديد لهذا الحاسوب الإفتراضي.",
-    "message.acquire.public.ip": "Please select a zone from which you want to acquire your new IP from.",
-    "message.action.cancel.maintenance": "Your host has been successfully canceled for maintenance. This process can take up to several minutes.",
-    "message.action.cancel.maintenance.mode": "Please confirm that you want to cancel this maintenance.",
-    "message.action.change.service.warning.for.instance": "Your instance must be stopped before attempting to change its current service offering.",
-    "message.action.change.service.warning.for.router": "Your router must be stopped before attempting to change its current service offering.",
-    "message.action.delete.ISO": "Please confirm that you want to delete this ISO.",
-    "message.action.delete.ISO.for.all.zones": "The ISO is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.cluster": "Please confirm that you want to delete this cluster.",
-    "message.action.delete.disk.offering": "Please confirm that you want to delete this disk offering.",
-    "message.action.delete.domain": "Please confirm that you want to delete this domain.",
-    "message.action.delete.external.firewall": "Please confirm that you would like to remove this external firewall. Warning: If you are planning to add back the same external firewall, you must reset usage data on the device.",
-    "message.action.delete.external.load.balancer": "Please confirm that you would like to remove this external load balancer. Warning: If you are planning to add back the same external load balancer, you must reset usage data on the device.",
-    "message.action.delete.ingress.rule": "Please confirm that you want to delete this ingress rule.",
-    "message.action.delete.network": "Please confirm that you want to delete this network.",
-    "message.action.delete.nexusVswitch": "Please confirm that you want to delete this nexus 1000v",
-    "message.action.delete.nic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
-    "message.action.delete.physical.network": "Please confirm that you want to delete this physical network",
-    "message.action.delete.pod": "Please confirm that you want to delete this pod.",
-    "message.action.delete.primary.storage": "Please confirm that you want to delete this primary storage.",
-    "message.action.delete.secondary.storage": "Please confirm that you want to delete this secondary storage.",
-    "message.action.delete.security.group": "Please confirm that you want to delete this security group.",
-    "message.action.delete.service.offering": "Please confirm that you want to delete this service offering.",
-    "message.action.delete.snapshot": "Please confirm that you want to delete this snapshot.",
-    "message.action.delete.system.service.offering": "الرجاء تأكيد رغبتك في حذف خدمة النظام المقدمة.",
-    "message.action.delete.template": "Please confirm that you want to delete this template.",
-    "message.action.delete.template.for.all.zones": "The template is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.volume": "Please confirm that you want to delete this volume.",
-    "message.action.delete.zone": "Please confirm that you want to delete this zone.",
-    "message.action.destroy.instance": "Please confirm that you want to destroy this instance.",
-    "message.action.destroy.systemvm": "Please confirm that you want to destroy this System VM.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Please confirm that you want to disable this cluster.",
-    "message.action.disable.nexusVswitch": "Please confirm that you want to disable this nexus 1000v",
-    "message.action.disable.physical.network": "فضلا ، أكّد أنك تريد تعطيل هذه الشبكة الفيزيائية",
-    "message.action.disable.pod": "Please confirm that you want to disable this pod.",
-    "message.action.disable.static.NAT": "Please confirm that you want to disable static NAT.",
-    "message.action.disable.zone": "Please confirm that you want to disable this zone.",
-    "message.action.download.iso": "Please confirm that you want to download this ISO.",
-    "message.action.download.template": "Please confirm that you want to download this template.",
-    "message.action.downloading.template": "Downloading template.",
-    "message.action.enable.cluster": "Please confirm that you want to enable this cluster.",
-    "message.action.enable.maintenance": "Your host has been successfully prepared for maintenance.  This process can take up to several minutes or longer depending on how many VMs are currently on this host.",
-    "message.action.enable.nexusVswitch": "Please confirm that you want to enable this nexus 1000v",
-    "message.action.enable.physical.network": "فضلا ، أكّد أنك تريد تمكين هذه الشبكة الفيزيائية",
-    "message.action.enable.pod": "Please confirm that you want to enable this pod.",
-    "message.action.enable.zone": "Please confirm that you want to enable this zone.",
-    "message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
-    "message.action.force.reconnect": "Your host has been successfully forced to reconnect.  This process can take up to several minutes.",
-    "message.action.host.enable.maintenance.mode": "Enabling maintenance mode will cause a live migration of all running instances on this host to any available host.",
-    "message.action.instance.reset.password": "Please confirm that you want to change the ROOT password for this virtual machine.",
-    "message.action.manage.cluster": "Please confirm that you want to manage the cluster.",
-    "message.action.primarystorage.enable.maintenance.mode": "Warning: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped.  Do you want to continue?",
-    "message.action.reboot.instance": "Please confirm that you want to reboot this instance.",
-    "message.action.reboot.router": "All services provided by this virtual router will be interrupted. Please confirm that you want to reboot this router.",
-    "message.action.reboot.systemvm": "Please confirm that you want to reboot this system VM.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Please confirm that you want to release this IP.",
-    "message.action.remove.host": "Please confirm that you want to remove this host.",
-    "message.action.reset.password.off": "Your instance currently does not support this feature.",
-    "message.action.reset.password.warning": "Your instance must be stopped before attempting to change its current password.",
-    "message.action.restore.instance": "Please confirm that you want to restore this instance.",
-    "message.action.revert.snapshot": "Please confirm that you want to revert the owning volume to this snapshot.",
-    "message.action.start.instance": "Please confirm that you want to start this instance.",
-    "message.action.start.router": "Please confirm that you want to start this router.",
-    "message.action.start.systemvm": "Please confirm that you want to start this system VM.",
-    "message.action.stop.instance": "Please confirm that you want to stop this instance.",
-    "message.action.stop.router": "All services provided by this virtual router will be interrupted. Please confirm that you want to stop this router.",
-    "message.action.stop.systemvm": "Please confirm that you want to stop this system VM.",
-    "message.action.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
-    "message.action.snapshot.fromsnapshot":"Please confirm that you want to take a snapshot of this VM snapshot.",
-    "message.action.unmanage.cluster": "Please confirm that you want to unmanage the cluster.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Please confirm that you want to delete this VM snapshot.",
-    "message.action.vmsnapshot.revert": "Revert VM snapshot",
-    "message.activate.project": "هل أنت متأكد من أنك تريد تفعيل هذا المشروع ؟",
-    "message.add.VPN.gateway": "يرجى تأكيد رغبتك في إضافة بوابة الشبكة الافتراضية الشخصية VPN",
-    "message.add.cluster": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Please specify the following parameters to add a new disk offering",
-    "message.add.domain": "يرجى تحديد المجال الفرعي الذي تريد إنشاء تحت هذا النطاق",
-    "message.add.firewall": "Add a firewall to zone",
-    "message.add.guest.network": "Please confirm that you would like to add a guest network",
-    "message.add.host": "Please specify the following parameters to add a new host",
-    "message.add.ip.range": "Add an IP range to public network in zone",
-    "message.add.ip.range.direct.network": "Add an IP range to direct network <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Add an IP range to pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Add a load balancer to zone",
-    "message.add.load.balancer.under.ip": "The load balancer rule has been added under IP:",
-    "message.add.network": "Add a new network for zone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "فضلا حدد المعلومات لإضافة بوابة gateway لهذه السحابة الإفتراضية الخاصة VPC",
-    "message.add.pod": "Add a new pod for zone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack's internal management traffic. The reserved IP range must be unique for each zone in the cloud.",
-    "message.add.primary": "Please specify the following parameters to add a new primary storage",
-    "message.add.primary.storage": "Add a new Primary Storage for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Please specify the required information to add a new region.",
-    "message.add.secondary.storage": "Add a new storage for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Please fill in the following data to add a new compute offering.",
-    "message.add.system.service.offering": "الرجاء تعبئة البيانات التالية لإضافة نظام جديد لطرح",
-    "message.add.template": "Please enter the following data to create your new template",
-    "message.add.volume": "Please fill in the following data to add a new volume.",
-    "message.added.vpc.offering": "Added VPC offering",
-    "message.adding.Netscaler.device": "Adding Netscaler device",
-    "message.adding.Netscaler.provider": "Adding Netscaler provider",
-    "message.adding.host": "Adding host",
-    "message.additional.networks.desc": "Please select additional network(s) that your virtual instance will be connected to.",
-    "message.admin.guide.read": "For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?,",
-    "message.advanced.mode.desc": "Choose this network model if you wish to enable VLAN support.  This network model provides the most flexibility in allowing administrators to provide custom network offerings such as providing firewall, vpn, or load balancer support as well as enabling direct vs virtual networking.",
-    "message.advanced.security.group": "Choose this if you wish to use security groups to provide guest VM isolation.",
-    "message.advanced.virtual": "Choose this if you wish to use zone-wide VLANs to provide guest VM isolation.",
-    "message.after.enable.s3": "تم إعداد التخزين S3 للذاكرة الثانوية. تنويه : عند مغادرتك لهذه الصفحة لن يكون بإمكانك إعادة ضبط S3 مرة أخرى.",
-    "message.after.enable.swift": "Swift configured. Note: When you leave this page, you will not be able to re-configure Swift again.",
-    "message.alert.state.detected": "Alert state detected",
-    "message.allow.vpn.access": "Please enter a username and password of the user that you want to allow VPN access.",
-    "message.apply.snapshot.policy": "You have successfully updated your current snapshot policy.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Please confirm that you want to attach the ISO to this virtual instance.",
-    "message.attach.volume": "Please fill in the following data to attach a new volume. If you are attaching a disk volume to a Windows based virtual machine, you will need to reboot the instance to see the attached disk.",
-    "message.basic.mode.desc": "Choose this network model if you do <b>*<u>not</u>*</b> want to enable any VLAN support.  All virtual instances created under this network model will be assigned an IP directly from the network and security groups are used to provide security and segregation.",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "Please confirm that you wish to change the service offering of this virtual instance.",
-    "message.change.password": "Please change your password.",
-    "message.cluster.dedicated": "Cluster Dedicated",
-    "message.cluster.dedication.released": "Cluster dedication released",
-    "message.configure.all.traffic.types": "You have multiple physical networks; please configure labels for each traffic type by clicking on the Edit button.",
-    "message.configure.firewall.rules.allow.traffic": "Configure the rules to allow Traffic",
-    "message.configure.firewall.rules.block.traffic": "Configure the rules to block Traffic",
-    "message.configure.ldap": "Please confirm you would like to configure LDAP.",
-    "message.configuring.guest.traffic": "Configuring guest traffic",
-    "message.configuring.physical.networks": "Configuring physical networks",
-    "message.configuring.public.traffic": "Configuring public traffic",
-    "message.configuring.storage.traffic": "Configuring storage traffic",
-    "message.confirm.action.force.reconnect": "Please confirm that you want to force reconnect this host.",
-    "message.confirm.add.vnmc.provider": "Please confirm you would like to add the VNMC provider.",
-    "message.confirm.archive.alert": "Please confirm that you want to archive this alert.",
-    "message.confirm.archive.event": "Please confirm that you want to archive this event.",
-    "message.confirm.archive.selected.alerts": "Please confirm you would like to archive the selected alerts",
-    "message.confirm.archive.selected.events": "Please confirm you would like to archive the selected events",
-    "message.confirm.attach.disk": "Are you sure you want to attach disk?",
-    "message.confirm.create.volume": "Are you sure you want to create volume?",
-    "message.confirm.current.guest.CIDR.unchanged": "Do you want to keep the current guest network CIDR unchanged?",
-    "message.confirm.dedicate.cluster.domain.account": "Do you really want to dedicate this cluster to a domain/account? ",
-    "message.confirm.dedicate.host.domain.account": "Do you really want to dedicate this host to a domain/account? ",
-    "message.confirm.dedicate.pod.domain.account": "Do you really want to dedicate this pod to a domain/account? ",
-    "message.confirm.dedicate.zone": "Do you really want to dedicate this zone to a domain/account?",
-    "message.confirm.delete.BigSwitchBcf": "Please confirm that you would like to delete this BigSwitch BCF Controller",
-    "message.confirm.delete.BrocadeVcs": "Please confirm that you would like to delete Brocade Vcs Switch",
-    "message.confirm.delete.F5": "Please confirm that you would like to delete F5",
-    "message.confirm.delete.NetScaler": "Please confirm that you would like to delete NetScaler",
-    "message.confirm.delete.PA": "Please confirm that you would like to delete Palo Alto",
-    "message.confirm.delete.SRX": "Please confirm that you would like to delete SRX",
-    "message.confirm.delete.acl.list": "Are you sure you want to delete this ACL list?",
-    "message.confirm.delete.alert": "Are you sure you want to delete this alert ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Please confirm that you want to delete Baremetal Rack Configuration.",
-    "message.confirm.delete.ciscoASA1000v": "Please confirm you want to delete CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
-    "message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
-    "message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
-    "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
-    "message.confirm.destroy.router": "Please confirm that you would like to destroy this router",
-    "message.confirm.disable.host": "Please confirm that you want to disable the host",
-    "message.confirm.disable.network.offering": "Are you sure you want to disable this network offering?",
-    "message.confirm.disable.provider": "Please confirm that you would like to disable this provider",
-    "message.confirm.disable.vnmc.provider": "Please confirm you would like to disable the VNMC provider.",
-    "message.confirm.disable.vpc.offering": "Are you sure you want to disable this VPC offering?",
-    "message.confirm.enable.host": "Please confirm that you want to enable the host",
-    "message.confirm.enable.network.offering": "Are you sure you want to enable this network offering?",
-    "message.confirm.enable.provider": "Please confirm that you would like to enable this provider",
-    "message.confirm.enable.vnmc.provider": "Please confirm you would like to enable the VNMC provider.",
-    "message.confirm.enable.vpc.offering": "Are you sure you want to enable this VPC offering?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "نرجو تأكيد رغبتك في المشاركة في المشروع",
-    "message.confirm.migrate.volume": "Do you want to migrate this volume?",
-    "message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
-    "message.confirm.release.dedicate.vlan.range": "Please confirm you want to release dedicated VLAN range",
-    "message.confirm.release.dedicated.cluster": "Do you want to release this dedicated cluster ?",
-    "message.confirm.release.dedicated.host": "Do you want to release this dedicated host ?",
-    "message.confirm.release.dedicated.pod": "Do you want to release this dedicated pod ?",
-    "message.confirm.release.dedicated.zone": "Do you want to release this dedicated zone ? ",
-    "message.confirm.remove.IP.range": "Please confirm that you would like to remove this IP range.",
-    "message.confirm.remove.event": "Are you sure you want to remove this event?",
-    "message.confirm.remove.load.balancer": "Please confirm you want to remove VM from load balancer",
-    "message.confirm.remove.network.offering": "Are you sure you want to remove this network offering?",
-    "message.confirm.remove.selected.alerts": "Please confirm you would like to remove the selected alerts",
-    "message.confirm.remove.selected.events": "Please confirm you would like to remove the selected events",
-    "message.confirm.remove.vmware.datacenter": "Please confirm you want to remove VMware datacenter",
-    "message.confirm.remove.vpc.offering": "Are you sure you want to remove this VPC offering?",
-    "message.confirm.replace.acl.new.one": "Do you want to replace the ACL with a new one?",
-    "message.confirm.scale.up.router.vm": "Do you really want to scale up the Router VM ?",
-    "message.confirm.scale.up.system.vm": "Do you really want to scale up the system VM ?",
-    "message.confirm.shutdown.provider": "Please confirm that you would like to shutdown this provider",
-    "message.confirm.start.lb.vm": "Please confirm you want to start LB VM",
-    "message.confirm.stop.lb.vm": "Please confirm you want to stop LB VM",
-    "message.confirm.upgrade.router.newer.template": "Please confirm that you want to upgrade router to use newer template",
-    "message.confirm.upgrade.routers.account.newtemplate": "Please confirm that you want to upgrade all routers in this account to use newer template",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Please confirm that you want to upgrade all routers in this cluster to use newer template",
-    "message.confirm.upgrade.routers.newtemplate": "Please confirm that you want to upgrade all routers in this zone to use newer template",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Please confirm that you want to upgrade all routers in this pod to use newer template",
-    "message.copy.iso.confirm": "Please confirm that you wish to copy your ISO to",
-    "message.copy.template": "Copy template <b id=\"copy_template_name_text\">XXX</b> from zone <b id=\"copy_template_source_zone_text\"></b> to",
-    "message.copy.template.confirm": "Are you sure you want to copy template?",
-    "message.create.template": "Are you sure you want to create template?",
-    "message.create.template.vm": "Create VM from template <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Please specify the following information before creating a template of your disk volume: <b><span id=\"volume_name\"></span></b>. Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.creating.cluster": "Creating cluster",
-    "message.creating.guest.network": "Creating guest network",
-    "message.creating.physical.networks": "Creating physical networks",
-    "message.creating.pod": "Creating pod",
-    "message.creating.primary.storage": "Creating primary storage",
-    "message.creating.secondary.storage": "Creating secondary storage",
-    "message.creating.systemVM": "Creating system VMs (this may take a while)",
-    "message.creating.zone": "Creating zone",
-    "message.decline.invitation": "هل أنت متأكد من أنك تريد رفض هذه الدعوة المشروع؟",
-    "message.dedicate.zone": "Dedicating zone",
-    "message.dedicated.zone.released": "Zone dedication released",
-    "message.delete.VPN.connection": "يرجى تأكيد رغبتك في حذف بوابة الشبكة الافتراضية الشخصية VPN",
-    "message.delete.VPN.customer.gateway": "Please confirm that you want to delete this VPN Customer Gateway",
-    "message.delete.VPN.gateway": "يرجى تأكيد رغبتك في حذف بوابة الشبكة الافتراضية الشخصية",
-    "message.delete.account": "Please confirm that you want to delete this account.",
-    "message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
-    "message.delete.gateway": "يرجى تأكيد رغبتك في حذف البوابة",
-    "message.delete.project": "هل أنت متأكد من أنك تريد حذف المشروع ؟",
-    "message.delete.user": "الرجاء التأكيد بأنك ترغب بحذف هذا المستخدم",
-    "message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
-    "message.desc.advanced.zone": "For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support.",
-    "message.desc.basic.zone": "Provide a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering).",
-    "message.desc.cluster": "Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.",
-    "message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.<br><br>(1) If public key is set, CloudStack will register the public key. You can use it through your private key.<br><br>(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.<br>",
-    "message.desc.created.ssh.key.pair": "Created a SSH Key Pair.",
-    "message.desc.host": "Each cluster must contain at least one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.<br/><br/>Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.",
-    "message.desc.primary.storage": "Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor.",
-    "message.desc.reset.ssh.key.pair": "Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled.",
-    "message.desc.secondary.storage": "Each zone must have at least one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.<br/><br/>Provide the IP address and exported path.",
-    "message.desc.zone": "A zone is the largest organizational unit in CloudStack, and it typically corresponds to a single datacenter. Zones provide physical isolation and redundancy. A zone consists of one or more pods (each of which contains hosts and primary storage servers) and a secondary storage server which is shared by all pods in the zone.",
-    "message.detach.disk": "هل أنت متأكد من أنك تريد فصل هذا القرص؟",
-    "message.detach.iso.confirm": "Please confirm that you want to detach the ISO from this virtual instance.",
-    "message.disable.account": "Please confirm that you want to disable this account.  By disabling the account, all users for this account will no longer have access to their cloud resources.  All running virtual machines will be immediately shut down.",
-    "message.disable.snapshot.policy": "You have successfully disabled your current snapshot policy.",
-    "message.disable.user": "الرجاء التأكيد بأنك ترغب بتعطيل هذا المستخدم",
-    "message.disable.vpn": "Are you sure you want to disable VPN?",
-    "message.disable.vpn.access": "Please confirm that you want to disable Remote Access VPN.",
-    "message.disabling.network.offering": "Disabling network offering",
-    "message.disabling.vpc.offering": "Disabling VPC offering",
-    "message.disallowed.characters": "Disallowed characters: <,>",
-    "message.download.ISO": "Please click <a href=\"#\">00000</a> to download ISO",
-    "message.download.template": "Please click <a href=\"#\">00000</a> to download template",
-    "message.download.volume": "Please click <a href=\"#\">00000</a> to download volume",
-    "message.download.volume.confirm": "Please confirm that you want to download this volume.",
-    "message.edit.account": "Edit (\"-1\" indicates no limit to the amount of resources create)",
-    "message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
-    "message.edit.limits": "Please specify limits to the following resources.  A \"-1\" indicates no limit to the amount of resources create.",
-    "message.edit.traffic.type": "Please specify the traffic label you want associated with this traffic type.",
-    "message.enable.account": "الرجاء تأكيد أنك تريد تمكين هذا الحساب.",
-    "message.enable.user": "الرجاء التأكيد بأنك ترغب بتفعيل هذا المستخدم",
-    "message.enable.vpn": "Please confirm that you want Remote Access VPN enabled for this IP address.",
-    "message.enable.vpn.access": "VPN is currently disabled for this IP Address.  Would you like to enable VPN access?",
-    "message.enabled.vpn": "Your Remote Access VPN is currently enabled and can be accessed via the IP",
-    "message.enabled.vpn.ip.sec": "Your IPSec pre-shared key is",
-    "message.enabling.network.offering": "Enabling network offering",
-    "message.enabling.security.group.provider": "Enabling Security Group provider",
-    "message.enabling.vpc.offering": "Enabling VPC offering",
-    "message.enabling.zone": "Enabling zone",
-    "message.enabling.zone.dots": "Enabling zone...",
-    "message.enter.seperated.list.multiple.cidrs": "Please enter a comma separated list of CIDRs if more than one",
-    "message.enter.token": "Please enter the token that you were given in your invite e-mail.",
-    "message.generate.keys": "الرجاء التأكيد بأنك ترغب بإنشاء مفاتيح جديدة لهذا المستخدم",
-    "message.gslb.delete.confirm": "Please confirm you want to delete this GSLB",
-    "message.gslb.lb.remove.confirm": "Please confirm you want to remove load balancing from GSLB",
-    "message.guest.traffic.in.advanced.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network.",
-    "message.guest.traffic.in.basic.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range.",
-    "message.host.dedicated": "Host Dedicated",
-    "message.host.dedication.released": "Host dedication released",
-    "message.installWizard.click.retry": "Click the button to retry launch.",
-    "message.installWizard.copy.whatIsACluster": "A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Virtual machine instances (VMs) can be live-migrated from one host to another within the same cluster, without interrupting service to the user. A cluster is the third-largest organizational unit within a CloudStack&#8482; deployment. Clusters are contained within pods, and pods are contained within zones.<br/><br/>CloudStack&#8482; allows multiple clusters in a cloud deployment, but for a Basic Installation, we only need one cluster.",
-    "message.installWizard.copy.whatIsAHost": "A host is a single computer. Hosts provide the computing resources that run the guest virtual machines. Each host has hypervisor software installed on it to manage the guest VMs (except for bare metal hosts, which are a special case discussed in the Advanced Installation Guide). For example, a Linux KVM-enabled server, a Citrix XenServer server, and an ESXi server are hosts. In a Basic Installation, we use a single host running XenServer or KVM.<br/><br/>The host is the smallest organizational unit within a CloudStack&#8482; deployment. Hosts are contained within clusters, clusters are contained within pods, and pods are contained within zones.",
-    "message.installWizard.copy.whatIsAPod": "A pod often represents a single rack. Hosts in the same pod are in the same subnet.<br/><br/>A pod is the second-largest organizational unit within a CloudStack&#8482; deployment. Pods are contained within zones. Each zone can contain one or more pods; in the Basic Installation, you will have just one pod in your zone.",
-    "message.installWizard.copy.whatIsAZone": "A zone is the largest organizational unit within a CloudStack&#8482; deployment. A zone typically corresponds to a single datacenter, although it is permissible to have multiple zones in a datacenter. The benefit of organizing infrastructure into zones is to provide physical isolation and redundancy. For example, each zone can have its own power supply and network uplink, and the zones can be widely separated geographically (though this is not required).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack&#8482 manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack&#8482 to deploy, manage, and configure cloud computing environments.<br/><br/>Extending beyond individual virtual machine images running on commodity hardware, CloudStack&#8482 provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications. Both open-source and Premium versions are available, with the open-source version offering nearly identical features.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "A CloudStack&#8482; cloud infrastructure makes use of two types of storage: primary storage and secondary storage. Both of these can be iSCSI or NFS servers, or localdisk.<br/><br/><strong>Primary storage</strong> is associated with a cluster, and it stores the disk volumes of each guest VM for all the VMs running on hosts in that cluster. The primary storage server is typically located close to the hosts.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Secondary storage is associated with a zone, and it stores the following:<ul><li>Templates - OS images that can be used to boot VMs and can include additional configuration information, such as installed applications</li><li>ISO images - OS images that can be bootable or non-bootable</li><li>Disk volume snapshots - saved copies of VM data which can be used for data recovery or to create new templates</ul>",
-    "message.installWizard.now.building": "Now building your cloud...",
-    "message.installWizard.tooltip.addCluster.name": "A name for the cluster.  This can be text of your choosing and is not used by CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "The DNS name or IP address of the host.",
-    "message.installWizard.tooltip.addHost.password": "This is the password for the user named above (from your XenServer install).",
-    "message.installWizard.tooltip.addHost.username": "Usually root.",
-    "message.installWizard.tooltip.addPod.name": "A name for the pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "The gateway for the hosts in that pod.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "The netmask in use on the subnet the guests will use.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "The name for the storage device.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(for NFS) In NFS this is the exported path from the server. Path (for SharedMountPoint).  With KVM this is the path on each host that is where this primary storage is mounted.  For example, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(for NFS, iSCSI, or PreSetup) The IP address or DNS name of the storage device.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "The IP address of the NFS server hosting the secondary storage",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "The exported path, located on the server you specified above",
-    "message.installWizard.tooltip.addZone.dns1": "These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.dns2": "These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.internaldns1": "These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.internaldns2": "These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.name": "A name for the zone",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "A description for your network",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "The gateway that the guests should use",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "The netmask in use on the subnet that the guests should use",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "A name for your network",
-    "message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
-    "message.instanceWizard.noTemplates": "ليس لديك أي قوالب متاحة؛ يرجى إضافة قالب متوافق، وإعادة إطلاق المعالج .",
-    "message.ip.address.changed": "Your IP addresses may have changed; would you like to refresh the listing? Note that in this case the details pane will close.",
-    "message.iso.desc": "Disc image containing data or bootable media for OS",
-    "message.join.project": "لقد انضممت إلى المشروع. يرجى التبديل إلى طريقة عرض المشروع لرؤية المشروع",
-    "message.launch.vm.on.private.network": "Do you wish to launch your instance on your own private dedicated network?",
-    "message.launch.zone": "Zone is ready to launch; please proceed to the next step.",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Please confirm that you want to lock this account.  By locking the account, all users for this account will no longer be able to manage their cloud resources.  Existing resources can still be accessed.",
-    "message.migrate.instance.confirm": "Please confirm the host you wish to migrate the virtual instance to.",
-    "message.migrate.instance.to.host": "يرجى تأكيد أنك تريد نقل القالب إلى مضيف آخر.",
-    "message.migrate.instance.to.ps": "يرجى تأكيد أنك تريد نقل القالب إلى الذاكرة الأساسية.",
-    "message.migrate.router.confirm": "Please confirm the host you wish to migrate the router to:",
-    "message.migrate.systemvm.confirm": "Please confirm the host you wish to migrate the system VM to:",
-    "message.migrate.volume": "Please confirm that you want to migrate volume to another primary storage.",
-    "message.network.addVM.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-    "message.network.addVMNIC": "Please confirm that you would like to add a new VM NIC for this network.",
-    "message.network.remote.access.vpn.configuration": "Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-    "message.new.user": "Specify the following to add a new user to the account",
-    "message.no.affinity.groups": "You do not have any affinity groups. Please continue to the next step.",
-    "message.no.host.available": "No Hosts are available for Migration",
-    "message.no.network.support": "Your selected hypervisor, vSphere, does not have any additional network features.  Please continue to step 5.",
-    "message.no.network.support.configuration.not.true": "You do not have any zone that has security group enabled. Thus, no additional network features.  Please continue to step 5.",
-    "message.no.projects": "ليس لديك أي مشاريع. <br/> يرجى إنشاء مشروع جديد من قسم المشاريع.",
-    "message.no.projects.adminOnly": "ليس لديك أي مشاريع. <br/> الرجاء طلب من المسؤول إنشاء مشروع جديد.",
-    "message.number.clusters": "<h2><span> # of </span> Clusters</h2>",
-    "message.number.hosts": "<h2><span> # of </span> Hosts</h2>",
-    "message.number.pods": "<h2><span> # of </span> Pods</h2>",
-    "message.number.storage": "<h2><span> # of </span> Primary Storage Volumes</h2>",
-    "message.number.zones": "<h2><span> # of </span> Zones</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Password has been reset to",
-    "message.password.of.the.vm.has.been.reset.to": "Password of the VM has been reset to",
-    "message.pending.projects.1": "لديك دعوات مشروع معلقة/:",
-    "message.pending.projects.2": "لعرض، الرجاء الذهاب إلى قسم المشاريع، ثم حدد دعوات من القائمة المنسدلة.",
-    "message.please.add.at.lease.one.traffic.range": "Please add at least one traffic range.",
-    "message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
-    "message.please.proceed": "Please proceed to the next step.",
-    "message.please.select.a.configuration.for.your.zone": "Please select a configuration for your zone.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Please select a different public and management network before removing",
-    "message.please.select.networks": "الرجاء اختيار الشبكات لجهازك الإفتراضي",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Please select a ssh key pair you want this VM to use:",
-    "message.please.wait.while.zone.is.being.created": "Please wait while your zone is being created; this may take a while...",
-    "message.pod.dedication.released": "Pod dedication released",
-    "message.portable.ip.delete.confirm": "Please confirm you want to delete Portable IP Range",
-    "message.project.invite.sent": "تم إرسال الدعوة ; سيتم إضافتهم إلى المشروع بمجرد قبول الدعوة",
-    "message.public.traffic.in.advanced.zone": "Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.<br/><br/>Provide at least one range of IP addresses for internet traffic.",
-    "message.public.traffic.in.basic.zone": "Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP.",
-    "message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
-    "message.read.admin.guide.scaling.up": "Please read the dynamic scaling section in the admin guide before scaling up.",
-    "message.recover.vm": "Please confirm that you would like to recover this VM.",
-    "message.redirecting.region": "Redirecting to region...",
-    "message.reinstall.vm": "NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched.",
-    "message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
-    "message.remove.region": "Are you sure you want to remove this region from this management server?",
-    "message.remove.vpc": "يرجى تأكيد رغبتك في حذف الـVPC",
-    "message.remove.vpn.access": "Please confirm that you want to remove VPN access from the following user.",
-    "message.removed.ssh.key.pair": "Removed a SSH Key Pair",
-    "message.reset.VPN.connection": "يرجى تأكيد أنك تريد إعادة-ضبط إتصال الشبكة الافتراضية الشخصية VPN",
-    "message.reset.password.warning.notPasswordEnabled": "القالب لهذا النموذج تم انشائه من دون كلمة مرور ممكنة",
-    "message.reset.password.warning.notStopped": "يجب إيقاف النموذج الخاص بك قبل محاولة تغيير كلمة المرور الحالية",
-    "message.restart.mgmt.server": "Please restart your management server(s) for your new settings to take effect.",
-    "message.restart.mgmt.usage.server": "Please restart your management server(s) and usage server(s) for your new settings to take effect.",
-    "message.restart.network": "All services provided by this network will be interrupted. Please confirm that you want to restart this network.",
-    "message.restart.vpc": "يرجى تأكيد رغبتك في إعادة تشغيل الـVPN",
-    "message.restart.vpc.remark": "Please confirm that you want to restart the VPC <p><small><i>Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes</i>.</small></p>",
-    "message.restoreVM": "Do you want to restore the VM ?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Use <strong>Ctrl-click</strong> to select all applicable security groups)",
-    "message.select.a.zone": "A zone typically corresponds to a single datacenter. Multiple zones help make the cloud more reliable by providing physical isolation and redundancy.",
-    "message.select.affinity.groups": "Please select any affinity groups you want this VM to belong to:",
-    "message.select.instance": "Please select an instance.",
-    "message.select.iso": "Please select an ISO for your new virtual instance.",
-    "message.select.item": "Please select an item.",
-    "message.select.security.groups": "Please select security group(s) for your new VM",
-    "message.select.template": "الرجاء اختيار قالب لمثالك الإفتراضي الجديد",
-    "message.select.tier": "Please select a tier",
-    "message.set.default.NIC": "Please confirm that you would like to make this NIC the default for this VM.",
-    "message.set.default.NIC.manual": "Please manually update the default NIC on the VM now.",
-    "message.setup.physical.network.during.zone.creation": "When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.<br/><br/><strong>Drag and drop one or more traffic types</strong> onto each physical network.",
-    "message.setup.physical.network.during.zone.creation.basic": "When adding a basic zone, you can set up one physical network, which corresponds to a NIC on the hypervisor. The network carries several types of traffic.<br/><br/>You may also <strong>drag and drop</strong> other traffic types onto the physical network.",
-    "message.setup.successful": "Cloud setup successful!",
-    "message.snapshot.schedule": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-    "message.specifiy.tag.key.value": "Please specify a tag key and value",
-    "message.specify.url": "Please specify URL",
-    "message.step.1.continue": "Please select a template or ISO to continue",
-    "message.step.1.desc": "Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto.",
-    "message.step.2.continue": "Please select a service offering to continue",
-    "message.step.3.continue": "Please select a disk offering to continue",
-    "message.step.4.continue": "Please select at least one network to continue",
-    "message.step.4.desc": "Please select the primary network that your virtual instance will be connected to.",
-    "message.storage.traffic": "Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here.",
-    "message.suspend.project": "هل أنت متأكد من أنك تريد إيقاف هذا المشروع ؟",
-    "message.systems.vms.ready": "System VMs ready.",
-    "message.template.copying": "Template is being copied.",
-    "message.template.desc": "OS image that can be used to boot VMs",
-    "message.tier.required": "Tier is required",
-    "message.tooltip.dns.1": "Name of a DNS server for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.dns.2": "A second DNS server name for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.internal.dns.1": "Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-    "message.tooltip.internal.dns.2": "Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-    "message.tooltip.network.domain": "A DNS suffix that will create a custom domain name for the network that is accessed by guest VMs.",
-    "message.tooltip.pod.name": "A name for this pod.",
-    "message.tooltip.reserved.system.gateway": "The gateway for the hosts in the pod.",
-    "message.tooltip.reserved.system.netmask": "The network prefix that defines the pod subnet. Uses CIDR notation.",
-    "message.tooltip.zone.name": "A name for the zone.",
-    "message.update.os.preference": "Please choose a OS preference for this host.  All virtual instances with similar preferences will be first allocated to this host before choosing another.",
-    "message.update.resource.count": "الرجاء التأكيد بأنك ترغب بتحديث مصادر الحسابات لهذا الحساب",
-    "message.update.ssl": "Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance:",
-    "message.update.ssl.failed": "Failed to update SSL Certificate.",
-    "message.update.ssl.succeeded": "Update SSL Certificates succeeded",
-    "message.validate.URL": "Please enter a valid URL.",
-    "message.validate.accept": "Please enter a value with a valid extension.",
-    "message.validate.creditcard": "Please enter a valid credit card number.",
-    "message.validate.date": "Please enter a valid date.",
-    "message.validate.date.ISO": "Please enter a valid date (ISO).",
-    "message.validate.digits": "Please enter only digits.",
-    "message.validate.email.address": "Please enter a valid email address.",
-    "message.validate.equalto": "Please enter the same value again.",
-    "message.validate.fieldrequired": "This field is required.",
-    "message.validate.fixfield": "Please fix this field.",
-    "message.validate.instance.name": "Instance name can not be longer than 63 characters. Only ASCII letters a~z, A~Z, digits 0~9, hyphen are allowed. Must start with a letter and end with a letter or a digit.",
-    "message.validate.invalid.characters": "Invalid characters found; please correct.",
-    "message.validate.max": "Please enter a value less than or equal to {0}.",
-    "message.validate.maxlength": "Please enter no more than {0} characters.",
-    "message.validate.minlength": "Please enter at least {0} characters.",
-    "message.validate.number": "Please enter a valid number.",
-    "message.validate.range": "Please enter a value between {0} and {1}.",
-    "message.validate.range.length": "Please enter a value between {0} and {1} characters long.",
-    "message.virtual.network.desc": "A dedicated virtualized network for your account.  The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router.",
-    "message.vm.create.template.confirm": "Create Template will reboot the VM automatically.",
-    "message.vm.review.launch": "يرجى مراجعة المعلومات التالية وتأكد أن مثالك الإفتراضي صحيح قبل الإنطلاق",
-    "message.vnmc.available.list": "VNMC is not available from provider list.",
-    "message.vnmc.not.available.list": "VNMC is not available from provider list.",
-    "message.volume.create.template.confirm": "Please confirm that you wish to create a template for this disk volume.  Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
-    "message.you.must.have.at.least.one.physical.network": "You must have at least one physical network",
-    "message.your.cloudstack.is.ready": "Your CloudStack is ready!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Zone creation complete. Would you like to enable this zone?",
-    "message.zone.no.network.selection": "The zone you selected does not have any choices for network selection.",
-    "message.zone.step.1.desc": "Please select a network model for your zone.",
-    "message.zone.step.2.desc": "Please enter the following info to add a new zone",
-    "message.zone.step.3.desc": "Please enter the following info to add a new pod",
-    "message.zoneWizard.enable.local.storage": "WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:<br/><br/>1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.<br/><br/>2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.<br/><br/><br/>Would you like to continue?",
-    "messgae.validate.min": "Please enter a value greater than or equal to {0}.",
-    "mode": "Mode",
-    "network.rate": "Network Rate",
-    "notification.reboot.instance": "إعادة تشغيل النموذج",
-    "notification.start.instance": "بدء النموذج",
-    "notification.stop.instance": "إيقاف النموذج",
-    "side.by.side": "Side by Side",
-    "state.Accepted": "تم القبول",
-    "state.Active": "نشط",
-    "state.Allocated": "تخصيص",
-    "state.Allocating": "Allocating",
-    "state.BackedUp": "Backed Up",
-    "state.BackingUp": "Backing Up",
-    "state.Completed": "تم الاكمال",
-    "state.Creating": "إنشاء",
-    "state.Declined": "تم الرفض",
-    "state.Destroyed": "دمر",
-    "state.Disabled": "Disabled",
-    "state.Enabled": "تمكين",
-    "state.Error": "خطأ",
-    "state.Expunging": "محو",
-    "state.Migrating": "Migrating",
-    "state.Pending": "في الانتظار",
-    "state.Ready": "جاهز",
-    "state.Running": "Running",
-    "state.Starting": "Starting",
-    "state.Stopped": "توقف",
-    "state.Stopping": "Stopping",
-    "state.Suspended": "تم الإيقاف",
-    "state.detached": "Detached",
-    "title.upload.volume": "Upload Volume",
-    "ui.listView.filters.all": "الكل",
-    "ui.listView.filters.mine": "Mine"
-};
diff --git a/ui/legacy/l10n/ca.js b/ui/legacy/l10n/ca.js
deleted file mode 100644
index 1992040..0000000
--- a/ui/legacy/l10n/ca.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP Code",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP Type",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Changed item properties",
-    "confirm.enable.s3": "Please fill in the following information to enable support for S3-backed Secondary Storage",
-    "confirm.enable.swift": "Si us plau ompliu la següent informació per habilitar el suport per a Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Error could not change your password because LDAP is enabled.",
-    "error.could.not.enable.zone": "Could not enable zone",
-    "error.installWizard.message": "Quelcom ha fallat, vostè pot tornar enrere i corregir els errors detalls suggerime",
-    "error.invalid.username.password": "Invalid username or password",
-    "error.login": "Your username/password does not match our records.",
-    "error.menu.select": "Unable to perform action due to no items being selected.",
-    "error.mgmt.server.inaccessible": "The Management Server is unaccessible.  Please try again later.",
-    "error.password.not.match": "Els camps de contrasenya no coincideixen",
-    "error.please.specify.physical.network.tags": "Network offerings is not available until you specify tags for this physical network.",
-    "error.session.expired": "Your session has expired.",
-    "error.something.went.wrong.please.correct.the.following": "Something went wrong; please correct the following",
-    "error.unable.to.reach.management.server": "Unable to reach Management Server",
-    "error.unresolved.internet.name": "Your internet name cannot be resolved.",
-    "force.delete": "Force Delete",
-    "force.delete.domain.warning": "Warning: Choosing this option will cause the deletion of all child domains and all associated accounts and their resources.",
-    "force.remove": "Force Remove",
-    "force.remove.host.warning": "Warning: Choosing this option will cause CloudStack to forcefully stop all running virtual machines before removing this host from the cluster.",
-    "force.stop": "Force Stop",
-    "force.stop.instance.warning": "Warning: Forcing a stop on this instance should be your last option. It can lead to data loss as well as inconsistent behavior of the virtual machine state.",
-    "hint.no.host.tags": "No host tags found",
-    "hint.no.storage.tags": "No storage tags found",
-    "hint.type.part.host.tag": "Type in part of a host tag",
-    "hint.type.part.storage.tag": "Type in part of a storage tag",
-    "image.directory": "Image Directory",
-    "inline": "En línia",
-    "instances.actions.reboot.label": "Reboot instance",
-    "label.CIDR.list": "CIDR list",
-    "label.CIDR.of.destination.network": "CIDR of destination network",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "DHCP Server Type",
-    "label.DNS.domain.for.guest.networks": "DNS domain for Guest Networks",
-    "label.ESP.encryption": "ESP Encryption",
-    "label.ESP.hash": "ESP Hash",
-    "label.ESP.lifetime": "ESP Lifetime (second)",
-    "label.ESP.policy": "ESP policy",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE Encryption",
-    "label.IKE.hash": "IKE Hash",
-    "label.IKE.lifetime": "IKE lifetime (second)",
-    "label.IKE.policy": "IKE policy",
-    "label.IPsec.preshared.key": "IPsec Preshared-Key",
-    "label.LB.isolation": "LB isolation",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto Log Profile",
-    "label.PA.threat.profile": "Palo Alto Threat Profile",
-    "label.PING.CIFS.password": "PING CIFS password",
-    "label.PING.CIFS.username": "PING CIFS username",
-    "label.PING.dir": "PING Directory",
-    "label.PING.storage.IP": "PING storage IP",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Tipus de servidor PXE",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Port",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP Directory",
-    "label.VMFS.datastore": "VMFS datastore",
-    "label.VMs.in.tier": "VMs in tier",
-    "label.VPC.limits": "VPC limits",
-    "label.VPC.router.details": "VPC router details",
-    "label.VPN.connection": "VPN Connection",
-    "label.VPN.customer.gateway": "VPN Customer Gateway",
-    "label.VPN.gateway": "VPN Gateway",
-    "label.Xenserver.Tools.Version61plus": "Original XS Version is 6.1+",
-    "label.about": "About",
-    "label.about.app": "About CloudStack",
-    "label.accept.project.invitation": "Accpetar invitació al projecte",
-    "label.account": "Account",
-    "label.account.and.security.group": "Account, Security group",
-    "label.account.details": "Account details",
-    "label.account.id": "Account ID",
-    "label.account.lower": "account",
-    "label.account.name": "Account Name",
-    "label.account.specific": "Account-Specific",
-    "label.account.type": "Account Type",
-    "label.accounts": "Accounts",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL List Rules",
-    "label.acl.name": "ACL Name",
-    "label.acl.replaced": "ACL replaced",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Acquire New IP",
-    "label.acquire.new.secondary.ip": "Acquire new secondary IP",
-    "label.action": "Action",
-    "label.action.attach.disk": "Attach Disk",
-    "label.action.attach.disk.processing": "Attaching Disk....",
-    "label.action.attach.iso": "Attach ISO",
-    "label.action.attach.iso.processing": "Attaching ISO....",
-    "label.action.cancel.maintenance.mode": "Cancel Maintenance Mode",
-    "label.action.cancel.maintenance.mode.processing": "Cancelling Maintenance Mode....",
-    "label.action.change.password": "Change Password",
-    "label.action.change.service": "Change Service",
-    "label.action.change.service.processing": "Changing Service....",
-    "label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
-    "label.action.copy.ISO": "Copy ISO",
-    "label.action.copy.ISO.processing": "Copying ISO....",
-    "label.action.copy.template": "Copy Template",
-    "label.action.copy.template.processing": "Copying Template....",
-    "label.action.create.template": "Create Template",
-    "label.action.create.template.from.vm": "Create Template from VM",
-    "label.action.create.template.from.volume": "Create Template from Volume",
-    "label.action.create.template.processing": "Creating Template....",
-    "label.action.create.vm": "Create VM",
-    "label.action.create.vm.processing": "Creating VM....",
-    "label.action.create.volume": "Create Volume",
-    "label.action.create.volume.processing": "Creating Volume....",
-    "label.action.delete.IP.range": "Delete IP Range",
-    "label.action.delete.IP.range.processing": "Deleting IP Range....",
-    "label.action.delete.ISO": "Delete ISO",
-    "label.action.delete.ISO.processing": "Deleting ISO....",
-    "label.action.delete.account": "Delete account",
-    "label.action.delete.account.processing": "Deleting account....",
-    "label.action.delete.cluster": "Delete Cluster",
-    "label.action.delete.cluster.processing": "Deleting Cluster....",
-    "label.action.delete.disk.offering": "Delete Disk Offering",
-    "label.action.delete.disk.offering.processing": "Deleting Disk Offering....",
-    "label.action.delete.domain": "Delete Domain",
-    "label.action.delete.domain.processing": "Deleting Domain....",
-    "label.action.delete.firewall": "Delete firewall rule",
-    "label.action.delete.firewall.processing": "Deleting Firewall....",
-    "label.action.delete.ingress.rule": "Delete Ingress Rule",
-    "label.action.delete.ingress.rule.processing": "Deleting Ingress Rule....",
-    "label.action.delete.load.balancer": "Delete load balancer rule",
-    "label.action.delete.load.balancer.processing": "Deleting Load Balancer....",
-    "label.action.delete.network": "Delete Network",
-    "label.action.delete.network.processing": "Deleting Network....",
-    "label.action.delete.nexusVswitch": "Delete Nexus 1000v",
-    "label.action.delete.nic": "Remove NIC",
-    "label.action.delete.physical.network": "Delete physical network",
-    "label.action.delete.pod": "Delete Pod",
-    "label.action.delete.pod.processing": "Deleting Pod....",
-    "label.action.delete.primary.storage": "Delete Primary Storage",
-    "label.action.delete.primary.storage.processing": "Deleting Primary Storage....",
-    "label.action.delete.secondary.storage": "Delete Secondary Storage",
-    "label.action.delete.secondary.storage.processing": "Deleting Secondary Storage....",
-    "label.action.delete.security.group": "Delete Security Group",
-    "label.action.delete.security.group.processing": "Deleting Security Group....",
-    "label.action.delete.service.offering": "Delete Service Offering",
-    "label.action.delete.service.offering.processing": "Deleting Service Offering....",
-    "label.action.delete.snapshot": "Delete Snapshot",
-    "label.action.delete.snapshot.processing": "Deleting Snapshot....",
-    "label.action.delete.system.service.offering": "Delete System Service Offering",
-    "label.action.delete.template": "Delete Template",
-    "label.action.delete.template.processing": "Deleting Template....",
-    "label.action.delete.user": "Delete User",
-    "label.action.delete.user.processing": "Deleting User....",
-    "label.action.delete.volume": "Delete Volume",
-    "label.action.delete.volume.processing": "Deleting Volume....",
-    "label.action.delete.zone": "Delete Zone",
-    "label.action.delete.zone.processing": "Deleting Zone....",
-    "label.action.destroy.instance": "Destroy Instance",
-    "label.action.destroy.instance.processing": "Destroying Instance....",
-    "label.action.destroy.systemvm": "Destroy System VM",
-    "label.action.destroy.systemvm.processing": "Destroying System VM....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Detach Disk",
-    "label.action.detach.disk.processing": "Detaching Disk....",
-    "label.action.detach.iso": "Detach ISO",
-    "label.action.detach.iso.processing": "Detaching ISO....",
-    "label.action.disable.account": "Disable account",
-    "label.action.disable.account.processing": "Disabling account....",
-    "label.action.disable.cluster": "Disable Cluster",
-    "label.action.disable.cluster.processing": "Disabling Cluster....",
-    "label.action.disable.nexusVswitch": "Disable Nexus 1000v",
-    "label.action.disable.physical.network": "Disable physical network",
-    "label.action.disable.pod": "Disable Pod",
-    "label.action.disable.pod.processing": "Disabling Pod....",
-    "label.action.disable.static.NAT": "Disable Static NAT",
-    "label.action.disable.static.NAT.processing": "Disabling Static NAT....",
-    "label.action.disable.user": "Disable User",
-    "label.action.disable.user.processing": "Disabling User....",
-    "label.action.disable.zone": "Disable Zone",
-    "label.action.disable.zone.processing": "Disabling Zone....",
-    "label.action.download.ISO": "Download ISO",
-    "label.action.download.template": "Download Template",
-    "label.action.download.volume": "Download Volume",
-    "label.action.download.volume.processing": "Downloading Volume....",
-    "label.action.edit.ISO": "Edit ISO",
-    "label.action.edit.account": "Edit account",
-    "label.action.edit.disk.offering": "Edit Disk Offering",
-    "label.action.edit.domain": "Edit Domain",
-    "label.action.edit.global.setting": "Edit Global Setting",
-    "label.action.edit.host": "Editar Host",
-    "label.action.edit.instance": "Edit Instance",
-    "label.action.edit.network": "Edit Network",
-    "label.action.edit.network.offering": "Edit Network Offering",
-    "label.action.edit.network.processing": "Editing Network....",
-    "label.action.edit.pod": "Edit Pod",
-    "label.action.edit.primary.storage": "Edit Primary Storage",
-    "label.action.edit.resource.limits": "Edit Resource Limits",
-    "label.action.edit.service.offering": "Edit Service Offering",
-    "label.action.edit.template": "Edit Template",
-    "label.action.edit.user": "Edit User",
-    "label.action.edit.zone": "Edit Zone",
-    "label.action.enable.account": "Enable account",
-    "label.action.enable.account.processing": "Enabling account....",
-    "label.action.enable.cluster": "Enable Cluster",
-    "label.action.enable.cluster.processing": "Enabling Cluster....",
-    "label.action.enable.maintenance.mode": "Enable Maintenance Mode",
-    "label.action.enable.maintenance.mode.processing": "Enabling Maintenance Mode....",
-    "label.action.enable.nexusVswitch": "Enable Nexus 1000v",
-    "label.action.enable.physical.network": "Enable physical network",
-    "label.action.enable.pod": "Enable Pod",
-    "label.action.enable.pod.processing": "Enabling Pod....",
-    "label.action.enable.static.NAT": "Enable Static NAT",
-    "label.action.enable.static.NAT.processing": "Enabling Static NAT....",
-    "label.action.enable.user": "Enable User",
-    "label.action.enable.user.processing": "Enabling User....",
-    "label.action.enable.zone": "Enable Zone",
-    "label.action.enable.zone.processing": "Enabling Zone....",
-    "label.action.expunge.instance": "Expunge Instance",
-    "label.action.expunge.instance.processing": "Expunging Instance....",
-    "label.action.force.reconnect": "Force Reconnect",
-    "label.action.force.reconnect.processing": "Reconnecting....",
-    "label.action.generate.keys": "Generate Keys",
-    "label.action.generate.keys.processing": "Generate Keys....",
-    "label.action.list.nexusVswitch": "List Nexus 1000v",
-    "label.action.lock.account": "Lock account",
-    "label.action.lock.account.processing": "Locking account....",
-    "label.action.manage.cluster": "Manage Cluster",
-    "label.action.manage.cluster.processing": "Managing Cluster....",
-    "label.action.migrate.instance": "Migrate Instance",
-    "label.action.migrate.instance.processing": "Migrating Instance....",
-    "label.action.migrate.router": "Migrar router",
-    "label.action.migrate.router.processing": "Migrant router...",
-    "label.action.migrate.systemvm": "Migrar MV de Sistema",
-    "label.action.migrate.systemvm.processing": "Migrant MV de Sistema...",
-    "label.action.reboot.instance": "Reboot Instance",
-    "label.action.reboot.instance.processing": "Rebooting Instance....",
-    "label.action.reboot.router": "Reboot Router",
-    "label.action.reboot.router.processing": "Rebooting Router....",
-    "label.action.reboot.systemvm": "Reboot System VM",
-    "label.action.reboot.systemvm.processing": "Rebooting System VM....",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Recurring Snapshots",
-    "label.action.register.iso": "Register ISO",
-    "label.action.register.template": "Register Template from URL",
-    "label.action.release.ip": "Release IP",
-    "label.action.release.ip.processing": "Releasing IP....",
-    "label.action.remove.host": "Remove Host",
-    "label.action.remove.host.processing": "Removing Host....",
-    "label.action.reset.password": "Reset Password",
-    "label.action.reset.password.processing": "Resetting Password....",
-    "label.action.resize.volume": "Resize Volume",
-    "label.action.resize.volume.processing": "Resizing Volume....",
-    "label.action.resource.limits": "Resource limits",
-    "label.action.restore.instance": "Restore Instance",
-    "label.action.restore.instance.processing": "Restoring Instance....",
-    "label.action.revert.snapshot": "Revert to Snapshot",
-    "label.action.revert.snapshot.processing": "Reverting to Snapshot...",
-    "label.action.start.instance": "Start Instance",
-    "label.action.start.instance.processing": "Starting Instance....",
-    "label.action.start.router": "Start Router",
-    "label.action.start.router.processing": "Starting Router....",
-    "label.action.start.systemvm": "Start System VM",
-    "label.action.start.systemvm.processing": "Starting System VM....",
-    "label.action.stop.instance": "Stop Instance",
-    "label.action.stop.instance.processing": "Stopping Instance....",
-    "label.action.stop.router": "Stop Router",
-    "label.action.stop.router.processing": "Stopping Router....",
-    "label.action.stop.systemvm": "Stop System VM",
-    "label.action.stop.systemvm.processing": "Stopping System VM....",
-    "label.action.take.snapshot": "Take Snapshot",
-    "label.action.take.snapshot.processing": "Taking Snapshot....",
-    "label.action.unmanage.cluster": "Unmanage Cluster",
-    "label.action.unmanage.cluster.processing": "Unmanaging Cluster....",
-    "label.action.update.OS.preference": "Update OS Preference",
-    "label.action.update.OS.preference.processing": "Updating OS Preference....",
-    "label.action.update.resource.count": "Update Resource Count",
-    "label.action.update.resource.count.processing": "Updating Resource Count....",
-    "label.action.vmsnapshot.create": "Take VM Snapshot",
-    "label.action.vmsnapshot.delete": "Delete VM snapshot",
-    "label.action.vmsnapshot.revert": "Revert to VM snapshot",
-    "label.actions": "Actions",
-    "label.activate.project": "Activar projecte",
-    "label.active.sessions": "Active Sessions",
-    "label.add": "Add",
-    "label.add.ACL": "Add ACL",
-    "label.add.BigSwitchBcf.device": "Add BigSwitch BCF Controller",
-    "label.add.BrocadeVcs.device": "Add Brocade Vcs Switch",
-    "label.add.F5.device": "Add F5 device",
-    "label.add.LDAP.account": "Add LDAP Account",
-    "label.add.NiciraNvp.device": "Add Nvp Controller",
-    "label.add.OpenDaylight.device": "Add OpenDaylight Controller",
-    "label.add.PA.device": "Add Palo Alto device",
-    "label.add.SRX.device": "Add SRX device",
-    "label.add.VM.to.tier": "Add VM to tier",
-    "label.add.VPN.gateway": "Add VPN Gateway",
-    "label.add.account": "Add Account",
-    "label.add.account.to.project": "Afegir compte al projecte",
-    "label.add.accounts": "Afegir comptes",
-    "label.add.accounts.to": "Afegir comptes a",
-    "label.add.acl.list": "Add ACL List",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Add new affinity group",
-    "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
-    "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
-    "label.add.by": "Afegir per",
-    "label.add.by.cidr": "Add By CIDR",
-    "label.add.by.group": "Add By Group",
-    "label.add.ciscoASA1000v": "Add CiscoASA1000v Resource",
-    "label.add.cluster": "Add Cluster",
-    "label.add.compute.offering": "Add compute offering",
-    "label.add.direct.iprange": "Add Direct Ip Range",
-    "label.add.disk.offering": "Add Disk Offering",
-    "label.add.domain": "Add Domain",
-    "label.add.egress.rule": "Afegir regla de sortida",
-    "label.add.firewall": "Add firewall rule",
-    "label.add.globo.dns": "Add GloboDNS",
-    "label.add.gslb": "Add GSLB",
-    "label.add.guest.network": "Add guest network",
-    "label.add.host": "Add Host",
-    "label.add.ingress.rule": "Add Ingress Rule",
-    "label.add.intermediate.certificate": "Add intermediate certificate",
-    "label.add.internal.lb": "Add Internal LB",
-    "label.add.ip.range": "Add IP Range",
-    "label.add.isolated.guest.network": "Add Isolated Guest Network",
-    "label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
-    "label.add.isolated.network": "Add Isolated Network",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Add LDAP account",
-    "label.add.list.name": "ACL List Name",
-    "label.add.load.balancer": "Add Load Balancer",
-    "label.add.more": "Add More",
-    "label.add.netScaler.device": "Add Netscaler device",
-    "label.add.network": "Add Network",
-    "label.add.network.ACL": "Add network ACL",
-    "label.add.network.acl.list": "Add Network ACL List",
-    "label.add.network.device": "Add Network Device",
-    "label.add.network.offering": "Add network offering",
-    "label.add.new.F5": "Afegir nou F5",
-    "label.add.new.NetScaler": "Afegir un nou NetScaler",
-    "label.add.new.PA": "Add new Palo Alto",
-    "label.add.new.SRX": "Afegir nou SRX",
-    "label.add.new.gateway": "Add new gateway",
-    "label.add.new.tier": "Add new tier",
-    "label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
-    "label.add.physical.network": "Afegir xarxa física",
-    "label.add.pod": "Add Pod",
-    "label.add.port.forwarding.rule": "Add port forwarding rule",
-    "label.add.portable.ip.range": "Add Portable IP Range",
-    "label.add.primary.storage": "Add Primary Storage",
-    "label.add.private.gateway": "Add Private Gateway",
-    "label.add.region": "Add Region",
-    "label.add.resources": "Add Resources",
-    "label.add.role": "Add Role",
-    "label.add.route": "Add route",
-    "label.add.rule": "Afegir regla",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Add Secondary Storage",
-    "label.add.security.group": "Add Security Group",
-    "label.add.service.offering": "Add Service Offering",
-    "label.add.static.nat.rule": "Afegir regla de NAT estàtic",
-    "label.add.static.route": "Add static route",
-    "label.add.system.service.offering": "Add System Service Offering",
-    "label.add.template": "Add Template",
-    "label.add.to.group": "Afegir a grup",
-    "label.add.ucs.manager": "Add UCS Manager",
-    "label.add.user": "Add User",
-    "label.add.userdata": "Userdata",
-    "label.add.vlan": "Add VLAN",
-    "label.add.vm": "Afegir MV",
-    "label.add.vms": "Afegir MVs",
-    "label.add.vms.to.lb": "Afegir MV(s) a la regla de balanceig de càrrega",
-    "label.add.vmware.datacenter": "Add VMware datacenter",
-    "label.add.vnmc.device": "Add VNMC device",
-    "label.add.vnmc.provider": "Add VNMC provider",
-    "label.add.volume": "Add Volume",
-    "label.add.vpc": "Add VPC",
-    "label.add.vpc.offering": "Add VPC Offering",
-    "label.add.vpn.customer.gateway": "Add VPN Customer Gateway",
-    "label.add.vpn.user": "Afegir usuari VPN",
-    "label.add.vxlan": "Add VXLAN",
-    "label.add.zone": "Add Zone",
-    "label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
-    "label.added.network.offering": "Added network offering",
-    "label.added.new.bigswitch.bcf.controller": "Added new BigSwitch BCF Controller",
-    "label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
-    "label.addes.new.f5": "Added new F5",
-    "label.adding": "Adding",
-    "label.adding.cluster": "Adding Cluster",
-    "label.adding.failed": "Adding Failed",
-    "label.adding.pod": "Adding Pod",
-    "label.adding.processing": "Adding....",
-    "label.adding.succeeded": "Adding Succeeded",
-    "label.adding.user": "Adding User",
-    "label.adding.zone": "Adding Zone",
-    "label.additional.networks": "Additional Networks",
-    "label.admin": "Admin",
-    "label.admin.accounts": "Admin Accounts",
-    "label.advanced": "Advanced",
-    "label.advanced.mode": "Advanced Mode",
-    "label.advanced.search": "Advanced Search",
-    "label.affinity": "Affinity",
-    "label.affinity.group": "Affinity Group",
-    "label.affinity.groups": "Affinity Groups",
-    "label.agent.password": "Agent Password",
-    "label.agent.port": "Agent Port",
-    "label.agent.state": "Agent State",
-    "label.agent.username": "Agent Username",
-    "label.agree": "D'acord",
-    "label.alert": "Alert",
-    "label.alert.archived": "Alert Archived",
-    "label.alert.deleted": "Alert Deleted",
-    "label.alert.details": "Alert details",
-    "label.algorithm": "Algorithm",
-    "label.allocated": "Allocated",
-    "label.allocation.state": "Allocation State",
-    "label.allow": "Allow",
-    "label.anti.affinity": "Anti-affinity",
-    "label.anti.affinity.group": "Anti-affinity Group",
-    "label.anti.affinity.groups": "Anti-affinity Groups",
-    "label.api.key": "API Key",
-    "label.api.version": "API Version",
-    "label.app.name": "CloudStack",
-    "label.apply": "Aplicar",
-    "label.archive": "Archive",
-    "label.archive.alerts": "Archive alerts",
-    "label.archive.events": "Archive events",
-    "label.assign": "Assign",
-    "label.assign.instance.another": "Assign Instance to Another Account",
-    "label.assign.to.load.balancer": "Assigning instance to load balancer",
-    "label.assign.vms": "Assign VMs",
-    "label.assigned.vms": "Assigned VMs",
-    "label.associate.public.ip": "Associate Public IP",
-    "label.associated.network": "Associated Network",
-    "label.associated.network.id": "Associated Network ID",
-    "label.associated.profile": "Associated Profile",
-    "label.attached.iso": "Attached ISO",
-    "label.author.email": "Author e-mail",
-    "label.author.name": "Author name",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
-    "label.availability": "Availability",
-    "label.availability.zone": "Availability Zone",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "Available",
-    "label.available.public.ips": "Available Public IP Addresses",
-    "label.back": "Back",
-    "label.bandwidth": "Ample de banda",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP Devices",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP Provider",
-    "label.baremetal.pxe.device": "Add Baremetal PXE Device",
-    "label.baremetal.pxe.devices": "Baremetal PXE Devices",
-    "label.baremetal.pxe.provider": "Baremetal PXE Provider",
-    "label.baremetal.rack.configuration": "Baremetal Rack Configuration",
-    "label.basic": "Basic",
-    "label.basic.mode": "Basic Mode",
-    "label.bigswitch.bcf.details": "BigSwitch BCF details",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT Enabled",
-    "label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "Bootable",
-    "label.broadcast.domain.range": "Rang del domini de broadcast",
-    "label.broadcast.domain.type": "Broadcast Domain Type",
-    "label.broadcast.uri": "Broadcast URI",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "Broadcast URI",
-    "label.brocade.vcs.address": "Vcs Switch Address",
-    "label.brocade.vcs.details": "Brocade Vcs Switch details",
-    "label.by.account": "By Account",
-    "label.by.alert.type": "By alert type",
-    "label.by.availability": "By Availability",
-    "label.by.date.end": "By date (end)",
-    "label.by.date.start": "By date (start)",
-    "label.by.domain": "By Domain",
-    "label.by.end.date": "By End Date",
-    "label.by.event.type": "By event type",
-    "label.by.level": "By Level",
-    "label.by.pod": "By Pod",
-    "label.by.role": "By Role",
-    "label.by.start.date": "By Start Date",
-    "label.by.state": "By State",
-    "label.by.traffic.type": "By Traffic Type",
-    "label.by.type": "By Type",
-    "label.by.type.id": "By Type ID",
-    "label.by.zone": "By Zone",
-    "label.bytes.received": "Bytes Received",
-    "label.bytes.sent": "Bytes Sent",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "Cancel",
-    "label.capacity": "Capacitat",
-    "label.capacity.bytes": "Capacity Bytes",
-    "label.capacity.iops": "Capacity IOPS",
-    "label.certificate": "Server certificate",
-    "label.change.affinity": "Change Affinity",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "Canvia oferta de servei",
-    "label.change.value": "Canviar valor",
-    "label.character": "Character",
-    "label.chassis": "Chassis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR or Account/Security Group",
-    "label.cidr.list": "Source CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Address",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Password",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Username",
-    "label.ciscovnmc.resource.details": "CiscoVNMC resource details",
-    "label.clean.up": "Clean up",
-    "label.clear.list": "Esborra llista",
-    "label.close": "Close",
-    "label.cloud.console": "Cloud Management Console",
-    "label.cloud.managed": "Cloud.com Managed",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Cluster Name",
-    "label.cluster.type": "Cluster Type",
-    "label.clusters": "Clusters",
-    "label.clvm": "CLVM",
-    "label.code": "Code",
-    "label.community": "Comunitat",
-    "label.compute": "Computació",
-    "label.compute.and.storage": "Computació i Emmagatzematge",
-    "label.compute.offering": "Compute offering",
-    "label.compute.offerings": "Compute Offerings",
-    "label.configuration": "Configuració",
-    "label.configure": "Configurar",
-    "label.configure.ldap": "Configure LDAP",
-    "label.configure.network.ACLs": "Configure Network ACLs",
-    "label.configure.sticky.policy": "Configure Sticky Policy",
-    "label.configure.vpc": "Configure VPC",
-    "label.confirm.password": "Confirmar contrasenya",
-    "label.confirmation": "Confirmation",
-    "label.congratulations": "Enorabona!",
-    "label.conserve.mode": "Conserve mode",
-    "label.console.proxy": "Console proxy",
-    "label.console.proxy.vm": "Console Proxy VM",
-    "label.continue": "Continuar",
-    "label.continue.basic.install": "Continueu amb la instal·lació bàsica",
-    "label.copying.iso": "Copying ISO",
-    "label.corrections.saved": "Correccions guardades",
-    "label.counter": "Counter",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU Allocated",
-    "label.cpu.allocated.for.VMs": "CPU Allocated for VMs",
-    "label.cpu.limits": "CPU limits",
-    "label.cpu.mhz": "CPU (in MHz)",
-    "label.cpu.utilized": "CPU Utilized",
-    "label.create.VPN.connection": "Create VPN Connection",
-    "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
-    "label.create.nfs.secondary.staging.store": "Create NFS secondary staging store",
-    "label.create.project": "Crear projecte",
-    "label.create.ssh.key.pair": "Create a SSH Key Pair",
-    "label.create.template": "Create template",
-    "label.created": "Created",
-    "label.created.by.system": "Created by system",
-    "label.cross.zones": "Cross Zones",
-    "label.custom": "Custom",
-    "label.custom.disk.iops": "Custom IOPS",
-    "label.custom.disk.offering": "Custom Disk Offering",
-    "label.custom.disk.size": "Custom Disk Size",
-    "label.daily": "Daily",
-    "label.data.disk.offering": "Data Disk Offering",
-    "label.date": "Date",
-    "label.day": "Day",
-    "label.day.of.month": "Day of Month",
-    "label.day.of.week": "Day of Week",
-    "label.dc.name": "DC Name",
-    "label.dead.peer.detection": "Dead Peer Detection",
-    "label.decline.invitation": "Declinar invitació",
-    "label.dedicate": "Dedicate",
-    "label.dedicate.cluster": "Dedicate Cluster",
-    "label.dedicate.host": "Dedicate Host",
-    "label.dedicate.pod": "Dedicate Pod",
-    "label.dedicate.vlan.vni.range": "Dedicate VLAN/VNI Range",
-    "label.dedicate.zone": "Dedicate Zone",
-    "label.dedicated": "Dedicat",
-    "label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
-    "label.default": "Per defecte",
-    "label.default.egress.policy": "Default egress policy",
-    "label.default.use": "Default Use",
-    "label.default.view": "Default View",
-    "label.delete": "Delete",
-    "label.delete.BigSwitchBcf": "Remove BigSwitch BCF Controller",
-    "label.delete.BrocadeVcs": "Remove Brocade Vcs Switch",
-    "label.delete.F5": "Esborrar F5",
-    "label.delete.NetScaler": "Esborrar NetScaler",
-    "label.delete.NiciraNvp": "Remove Nvp Controller",
-    "label.delete.OpenDaylight.device": "Delete OpenDaylight Controller",
-    "label.delete.PA": "Delete Palo Alto",
-    "label.delete.SRX": "Esborar SRX",
-    "label.delete.VPN.connection": "Delete VPN connection",
-    "label.delete.VPN.customer.gateway": "Delete VPN Customer Gateway",
-    "label.delete.VPN.gateway": "Delete VPN Gateway",
-    "label.delete.acl.list": "Delete ACL List",
-    "label.delete.affinity.group": "Delete Affinity Group",
-    "label.delete.alerts": "Delete alerts",
-    "label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
-    "label.delete.ciscoASA1000v": "Delete CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
-    "label.delete.events": "Delete events",
-    "label.delete.gateway": "Delete gateway",
-    "label.delete.internal.lb": "Delete Internal LB",
-    "label.delete.portable.ip.range": "Delete Portable IP Range",
-    "label.delete.profile": "Delete Profile",
-    "label.delete.project": "Esborrar projecte",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Delete Secondary Staging Store",
-    "label.delete.ucs.manager": "Delete UCS Manager",
-    "label.delete.vpn.user": "Esborrar usuari VPN",
-    "label.deleting.failed": "Deleting Failed",
-    "label.deleting.processing": "Deleting....",
-    "label.deny": "Deny",
-    "label.deployment.planner": "Deployment planner",
-    "label.description": "Description",
-    "label.destination.physical.network.id": "ID de xarxa física de destí",
-    "label.destination.zone": "Zona de destí",
-    "label.destroy": "Destroy",
-    "label.destroy.router": "Destruir router",
-    "label.destroy.vm.graceperiod": "Destroy VM Grace Period",
-    "label.detaching.disk": "Detaching Disk",
-    "label.details": "Details",
-    "label.device.id": "Device ID",
-    "label.devices": "Devices",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direct Attached Public IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Shared Network IPs",
-    "label.disable.autoscale": "Disable Autoscale",
-    "label.disable.host": "Disable Host",
-    "label.disable.network.offering": "Disable network offering",
-    "label.disable.provider": "Deshabilitar proveïdor",
-    "label.disable.vnmc.provider": "Disable VNMC provider",
-    "label.disable.vpc.offering": "Disable VPC offering",
-    "label.disable.vpn": "Deshabilitar VPN",
-    "label.disabled": "Deshabilitat",
-    "label.disabling.vpn.access": "Disabling VPN Access",
-    "label.disassociate.profile.blade": "Disassociate Profile from Blade",
-    "label.disbale.vnmc.device": "Disable VNMC device",
-    "label.disk.allocated": "Disk Allocated",
-    "label.disk.bytes.read.rate": "Disk Read Rate (BPS)",
-    "label.disk.bytes.write.rate": "Disk Write Rate (BPS)",
-    "label.disk.iops.max": "Max IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Disk Read Rate (IOPS)",
-    "label.disk.iops.total": "IOPS Total",
-    "label.disk.iops.write.rate": "Disk Write Rate (IOPS)",
-    "label.disk.offering": "Disk Offering",
-    "label.disk.offering.details": "Disk offering details",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisioning Type",
-    "label.disk.read.bytes": "Disk Read (Bytes)",
-    "label.disk.read.io": "Disk Read (IO)",
-    "label.disk.size": "Disk Size",
-    "label.disk.size.gb": "Disk Size (in GB)",
-    "label.disk.total": "Disk Total",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Disk Volume",
-    "label.disk.write.bytes": "Disk Write (Bytes)",
-    "label.disk.write.io": "Disk Write (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Display Name",
-    "label.display.text": "Display Text",
-    "label.distributedrouter": "Distributed Router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domain",
-    "label.domain.admin": "Domain Admin",
-    "label.domain.details": "Domain details",
-    "label.domain.id": "Domain ID",
-    "label.domain.lower": "domain",
-    "label.domain.name": "Domain Name",
-    "label.domain.router": "Domain router",
-    "label.domain.suffix": "DNS Domain Suffix (i.e., xyz.com)",
-    "label.done": "Done",
-    "label.double.quotes.are.not.allowed": "Double quotes are not allowed",
-    "label.download.progress": "Download Progress",
-    "label.drag.new.position": "Arrosegar a la nova posició",
-    "label.duration.in.sec": "Duration (in sec)",
-    "label.dynamically.scalable": "Dynamically Scalable",
-    "label.edit": "Edit",
-    "label.edit.acl.rule": "Edit ACL rule",
-    "label.edit.affinity.group": "Edit Affinity Group",
-    "label.edit.lb.rule": "Edit LB rule",
-    "label.edit.network.details": "Edit network details",
-    "label.edit.project.details": "Editar detalls del projecte",
-    "label.edit.region": "Edit Region",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Edit rule",
-    "label.edit.secondary.ips": "Edit secondary IPs",
-    "label.edit.tags": "Edit tags",
-    "label.edit.traffic.type": "Edit traffic type",
-    "label.edit.vpc": "Edit VPC",
-    "label.egress.default.policy": "Egress Default Policy",
-    "label.egress.rule": "Regla de sortida",
-    "label.egress.rules": "Egress rules",
-    "label.elastic": "Elàstic",
-    "label.elastic.IP": "Elastic IP",
-    "label.elastic.LB": "Elastic LB",
-    "label.email": "Email",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Enable Autoscale",
-    "label.enable.host": "Enable Host",
-    "label.enable.network.offering": "Enable network offering",
-    "label.enable.provider": "Habilitar proveïdor",
-    "label.enable.s3": "Enable S3-backed Secondary Storage",
-    "label.enable.swift": "Habilitar Swift",
-    "label.enable.vnmc.device": "Enable VNMC device",
-    "label.enable.vnmc.provider": "Enable VNMC provider",
-    "label.enable.vpc.offering": "Enable VPC offering",
-    "label.enable.vpn": "Habilitar VPN",
-    "label.enabling.vpn": "Enabling VPN",
-    "label.enabling.vpn.access": "Enabling VPN Access",
-    "label.end.IP": "End IP",
-    "label.end.port": "End Port",
-    "label.end.reserved.system.IP": "End Reserved system IP",
-    "label.end.vlan": "End VLAN",
-    "label.end.vxlan": "End VXLAN",
-    "label.endpoint": "Endpoint",
-    "label.endpoint.or.operation": "Endpoint or Operation",
-    "label.enter.token": "Enter token",
-    "label.error": "Error",
-    "label.error.code": "Error Code",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX/ESXi Host",
-    "label.event": "Event",
-    "label.event.archived": "Event Archived",
-    "label.event.deleted": "Event Deleted",
-    "label.every": "Every",
-    "label.example": "Example",
-    "label.expunge": "Expunge",
-    "label.external.link": "External link",
-    "label.extractable": "Es pot extreure",
-    "label.extractable.lower": "extractable",
-    "label.f5": "F5",
-    "label.f5.details": "F5 details",
-    "label.failed": "Failed",
-    "label.featured": "Featured",
-    "label.fetch.latest": "Fetch latest",
-    "label.filterBy": "Filter by",
-    "label.fingerprint": "FingerPrint",
-    "label.firewall": "Firewall",
-    "label.first.name": "First Name",
-    "label.firstname.lower": "firstname",
-    "label.format": "Format",
-    "label.format.lower": "format",
-    "label.friday": "Friday",
-    "label.full": "Full",
-    "label.full.path": "Camí sencer",
-    "label.gateway": "Gateway",
-    "label.general.alerts": "General Alerts",
-    "label.generating.url": "Generating URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS Configuration",
-    "label.gluster.volume": "Volume",
-    "label.go.step.2": "Go to Step 2",
-    "label.go.step.3": "Go to Step 3",
-    "label.go.step.4": "Go to Step 4",
-    "label.go.step.5": "Go to Step 5",
-    "label.gpu": "GPU",
-    "label.group": "Group",
-    "label.group.by.account": "Group by account",
-    "label.group.by.cluster": "Group by cluster",
-    "label.group.by.pod": "Group by pod",
-    "label.group.by.zone": "Group by zone",
-    "label.group.optional": "Group (Optional)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Assigned load balancing",
-    "label.gslb.assigned.lb.more": "Assign more load balancing",
-    "label.gslb.delete": "Delete GSLB",
-    "label.gslb.details": "GSLB details",
-    "label.gslb.domain.name": "GSLB Domain Name",
-    "label.gslb.lb.details": "Load balancing details",
-    "label.gslb.lb.remove": "Remove load balancing from this GSLB",
-    "label.gslb.lb.rule": "Load balancing rule",
-    "label.gslb.service": "GSLB service",
-    "label.gslb.service.private.ip": "GSLB service Private IP",
-    "label.gslb.service.public.ip": "GSLB service Public IP",
-    "label.gslb.servicetype": "Service Type",
-    "label.guest": "MV",
-    "label.guest.cidr": "Guest CIDR",
-    "label.guest.end.ip": "Fi d'IP per a MV",
-    "label.guest.gateway": "Guest Gateway",
-    "label.guest.ip": "Guest IP Address",
-    "label.guest.ip.range": "Guest IP Range",
-    "label.guest.netmask": "Guest Netmask",
-    "label.guest.network.details": "Guest network details",
-    "label.guest.networks": "Guest networks",
-    "label.guest.start.ip": "Inici d'IP per a MV",
-    "label.guest.traffic": "Tràfic de MV",
-    "label.guest.traffic.vswitch.name": "Guest Traffic vSwitch Name",
-    "label.guest.traffic.vswitch.type": "Guest Traffic vSwitch Type",
-    "label.guest.type": "Guest Type",
-    "label.ha.enabled": "HA Enabled",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "Advanced Options:",
-    "label.health.check.configurations.options": "Configuration Options:",
-    "label.health.check.interval.in.sec": "Health Check Interval (in sec)",
-    "label.health.check.message.desc": "Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check",
-    "label.health.check.wizard": "Health Check Wizard",
-    "label.healthy.threshold": "Healthy Threshold",
-    "label.help": "Help",
-    "label.hide.ingress.rule": "Hide Ingress Rule",
-    "label.hints": "Pistes",
-    "label.home": "Home",
-    "label.host": "Host",
-    "label.host.MAC": "Host MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Host Name",
-    "label.host.tag": "Host Tag",
-    "label.host.tags": "Host Tags",
-    "label.hosts": "Hosts",
-    "label.hourly": "Hourly",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Traffic Label",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Hypervisor capabilities",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Snapshot Reserve",
-    "label.hypervisor.type": "Hypervisor Type",
-    "label.hypervisor.version": "Hypervisor version",
-    "label.hypervisors": "Hypervisors",
-    "label.id": "ID",
-    "label.info": "Info",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Ingress Rule",
-    "label.initiated.by": "Initiated By",
-    "label.inside.port.profile": "Inside Port Profile",
-    "label.installWizard.addClusterIntro.subtitle": "Que és un cluster?",
-    "label.installWizard.addClusterIntro.title": "Anem a afegir un cluster",
-    "label.installWizard.addHostIntro.subtitle": "Què és un amfitrió \"host\"?",
-    "label.installWizard.addHostIntro.title": "Anem a afegir un amfitrió",
-    "label.installWizard.addPodIntro.subtitle": "Que és un pod?",
-    "label.installWizard.addPodIntro.title": "Anem a afegir un pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Què és l'emmagatzematge primari?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Anem a afegir emmagatzematge primari",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Què és el emmagatzematge secundari?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Anem a afegir emmagatzematge secundari",
-    "label.installWizard.addZone.title": "Afegir zona",
-    "label.installWizard.addZoneIntro.subtitle": "Que és una zona?",
-    "label.installWizard.addZoneIntro.title": "Anem a afegir una zona",
-    "label.installWizard.click.launch": "Feu clic al botó d'inici.",
-    "label.installWizard.subtitle": "Auqesta guia us ajudarà a configurar la vostra instal·lació de CloudStack&#8482",
-    "label.installWizard.title": "Hola i benvigut a CloudStack&#8482",
-    "label.instance": "Instance",
-    "label.instance.limits": "Instance Limits",
-    "label.instance.name": "Instance Name",
-    "label.instance.port": "Instance Port",
-    "label.instance.scaled.up": "Instance scaled to the requested offering",
-    "label.instances": "Instances",
-    "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-    "label.intermediate.certificate": "Intermediate certificate {0}",
-    "label.internal.dns.1": "Internal DNS 1",
-    "label.internal.dns.2": "Internal DNS 2",
-    "label.internal.lb": "Internal LB",
-    "label.internal.lb.details": "Internal LB details",
-    "label.internal.name": "Internal name",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Interval Type",
-    "label.introduction.to.cloudstack": "Introducció a la CloudStack&#8482",
-    "label.invalid.integer": "Invalid Integer",
-    "label.invalid.number": "Invalid Number",
-    "label.invitations": "Invitacions",
-    "label.invite": "Convidar",
-    "label.invite.to": "Convidar a",
-    "label.invited.accounts": "Comptes convidades",
-    "label.ip": "IP",
-    "label.ip.address": "IP Address",
-    "label.ip.allocations": "IP Allocations",
-    "label.ip.limits": "Public IP Limits",
-    "label.ip.or.fqdn": "IP or FQDN",
-    "label.ip.range": "IP Range",
-    "label.ip.ranges": "Rangs d'IPs",
-    "label.ipaddress": "IP Address",
-    "label.ips": "IPs",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 End IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 Netmask",
-    "label.ipv4.start.ip": "IPv4 Start IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Address",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 End IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Start IP",
-    "label.is.default": "Is Default",
-    "label.is.redundant.router": "Redundant",
-    "label.is.shared": "Is Shared",
-    "label.is.system": "Is System",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO Boot",
-    "label.isolated.networks": "Isolated networks",
-    "label.isolation.method": "Isolation method",
-    "label.isolation.mode": "Isolation Mode",
-    "label.isolation.uri": "Isolation URI",
-    "label.item.listing": "Llista d'articles",
-    "label.japanese.keyboard": "Japanese keyboard",
-    "label.keep": "Keep",
-    "label.keep.colon": "Keep:",
-    "label.key": "Clau",
-    "label.keyboard.language": "Keyboard language",
-    "label.keyboard.type": "Tipus de teclat",
-    "label.kvm.traffic.label": "KVM traffic label",
-    "label.label": "Label",
-    "label.lang.arabic": "Arabic",
-    "label.lang.brportugese": "Brazilian Portugese",
-    "label.lang.catalan": "Catalan",
-    "label.lang.chinese": "Chinese (Simplified)",
-    "label.lang.dutch": "Dutch (Netherlands)",
-    "label.lang.english": "English",
-    "label.lang.french": "French",
-    "label.lang.german": "German",
-    "label.lang.hungarian": "Hungarian",
-    "label.lang.italian": "Italian",
-    "label.lang.japanese": "Japanese",
-    "label.lang.korean": "Korean",
-    "label.lang.norwegian": "Norwegian",
-    "label.lang.polish": "Polish",
-    "label.lang.russian": "Russian",
-    "label.lang.spanish": "Spanish",
-    "label.last.disconnected": "Last Disconnected",
-    "label.last.name": "Last Name",
-    "label.lastname.lower": "lastname",
-    "label.latest.events": "Latest events",
-    "label.launch": "Iniciar",
-    "label.launch.vm": "Arrencar MV",
-    "label.launch.zone": "Launch zone",
-    "label.lb.algorithm.leastconn": "Least connections",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "Source",
-    "label.ldap.configuration": "LDAP Configuration",
-    "label.ldap.group.name": "LDAP Group",
-    "label.ldap.link.type": "Type",
-    "label.ldap.port": "LDAP port",
-    "label.level": "Level",
-    "label.link.domain.to.ldap": "Link Domain to LDAP",
-    "label.linklocal.ip": "Link Local IP Address",
-    "label.load.balancer": "Load Balancer",
-    "label.load.balancer.type": "Load Balancer Type",
-    "label.load.balancing": "Balanceig de càrrega",
-    "label.load.balancing.policies": "Pol·lítiques de balanceig de càrrega",
-    "label.loading": "Loading",
-    "label.local": "Local",
-    "label.local.file": "Local file",
-    "label.local.storage": "Emmagatzemament local",
-    "label.local.storage.enabled": "Enable local storage for User VMs",
-    "label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
-    "label.login": "Login",
-    "label.logout": "Logout",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Traffic Label",
-    "label.make.project.owner": "Feu la compta propietària del projecte",
-    "label.make.redundant": "Make redundant",
-    "label.manage": "Manage",
-    "label.manage.resources": "Administrar Recursos",
-    "label.managed": "Managed",
-    "label.management": "Administració",
-    "label.management.ips": "Management IP Addresses",
-    "label.management.server": "Management Server",
-    "label.max.cpus": "Max. CPU cores",
-    "label.max.guest.limit": "Max guest limit",
-    "label.max.instances": "Max Instances",
-    "label.max.memory": "Max. memory (MiB)",
-    "label.max.networks": "Max. networks",
-    "label.max.primary.storage": "Max. primary (GiB)",
-    "label.max.public.ips": "Max. IP públiques",
-    "label.max.secondary.storage": "Max. secondary (GiB)",
-    "label.max.snapshots": "Max. instantànies",
-    "label.max.templates": "Max. plantilles",
-    "label.max.vms": "Max. MV d'usuari",
-    "label.max.volumes": "Max. Volums",
-    "label.max.vpcs": "Max. VPCs",
-    "label.maximum": "Maximum",
-    "label.may.continue": "Ara pot continuar",
-    "label.md5.checksum": "MD5 checksum",
-    "label.memory": "Memory",
-    "label.memory.allocated": "Memory Allocated",
-    "label.memory.limits": "Memory limits (MiB)",
-    "label.memory.mb": "Memory (in MB)",
-    "label.memory.total": "Memory Total",
-    "label.memory.used": "Memory Used",
-    "label.menu.accounts": "Accounts",
-    "label.menu.alerts": "Alerts",
-    "label.menu.all.accounts": "All Accounts",
-    "label.menu.all.instances": "All Instances",
-    "label.menu.community.isos": "Community ISOs",
-    "label.menu.community.templates": "Community Templates",
-    "label.menu.configuration": "Configuració",
-    "label.menu.dashboard": "Dashboard",
-    "label.menu.destroyed.instances": "Destroyed Instances",
-    "label.menu.disk.offerings": "Disk Offerings",
-    "label.menu.domains": "Domains",
-    "label.menu.events": "Events",
-    "label.menu.featured.isos": "Featured ISOs",
-    "label.menu.featured.templates": "Featured Templates",
-    "label.menu.global.settings": "Global Settings",
-    "label.menu.infrastructure": "Infrastructure",
-    "label.menu.instances": "Instances",
-    "label.menu.ipaddresses": "IP Addresses",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "My Accounts",
-    "label.menu.my.instances": "My Instances",
-    "label.menu.my.isos": "My ISOs",
-    "label.menu.my.templates": "My Templates",
-    "label.menu.network": "Network",
-    "label.menu.network.offerings": "Network Offerings",
-    "label.menu.physical.resources": "Physical Resources",
-    "label.menu.regions": "Regions",
-    "label.menu.running.instances": "Running Instances",
-    "label.menu.security.groups": "Security Groups",
-    "label.menu.service.offerings": "Service Offerings",
-    "label.menu.snapshots": "Snapshots",
-    "label.menu.sshkeypair": "SSH KeyPair",
-    "label.menu.stopped.instances": "Stopped Instances",
-    "label.menu.storage": "Storage",
-    "label.menu.system": "System",
-    "label.menu.system.service.offerings": "System Offerings",
-    "label.menu.system.vms": "System VMs",
-    "label.menu.templates": "Templates",
-    "label.menu.virtual.appliances": "Virtual Appliances",
-    "label.menu.virtual.resources": "Virtual Resources",
-    "label.menu.volumes": "Volumes",
-    "label.menu.vpc.offerings": "VPC Offerings",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "Allocated",
-    "label.metrics.clusters": "Clusters",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "Used",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "Allocated",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "Size",
-    "label.metrics.disk.storagetype": "Type",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "Used",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "Hosts",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "Used",
-    "label.metrics.name": "Name",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "Scope",
-    "label.metrics.state": "State",
-    "label.metrics.storagepool": "Storage Pool",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "Migrate instance to",
-    "label.migrate.instance.to.host": "Migrar instància a un altre amfitrió \"Host\"",
-    "label.migrate.instance.to.ps": "Migrar instància a un altra emmagatzematge primari",
-    "label.migrate.lb.vm": "Migrate LB VM",
-    "label.migrate.router.to": "Migrar router a",
-    "label.migrate.systemvm.to": "Migrar MV de sistema a:",
-    "label.migrate.to.host": "Migrate to host",
-    "label.migrate.to.storage": "Migrate to storage",
-    "label.migrate.volume": "Migrate Volume",
-    "label.migrate.volume.to.primary.storage": "Migrate volume to another primary storage",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instances",
-    "label.min.past.the.hr": "min past the hr",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "minute(s) past the hour",
-    "label.minutes.past.hour": "minutes(s) past the hour",
-    "label.mode": "Mode",
-    "label.monday": "Monday",
-    "label.monthly": "Monthly",
-    "label.more.templates": "More Templates",
-    "label.move.down.row": "Moure una fila cap a baix",
-    "label.move.to.bottom": "Move to bottom",
-    "label.move.to.top": "Moure a dalt",
-    "label.move.up.row": "Moure una fla cap a dalt",
-    "label.my.account": "My Account",
-    "label.my.network": "La meva xarxa",
-    "label.my.templates": "Les meves plantilles",
-    "label.na": "N/A",
-    "label.name": "Name",
-    "label.name.lower": "name",
-    "label.name.optional": "Name (Optional)",
-    "label.nat.port.range": "NAT Port Range",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Netmask",
-    "label.netscaler.details": "NetScaler details",
-    "label.network": "Network",
-    "label.network.ACL": "Network ACL",
-    "label.network.ACL.total": "Network ACL Total",
-    "label.network.ACLs": "Network ACLs",
-    "label.network.addVM": "Add network to VM",
-    "label.network.cidr": "Network CIDR",
-    "label.network.desc": "Network Desc",
-    "label.network.details": "Network Details",
-    "label.network.device": "Network Device",
-    "label.network.device.type": "Network Device Type",
-    "label.network.domain": "Network Domain",
-    "label.network.domain.text": "Network domain",
-    "label.network.id": "Network ID",
-    "label.network.label.display.for.blank.value": "Use default gateway",
-    "label.network.limits": "Network limits",
-    "label.network.name": "Network Name",
-    "label.network.offering": "Network Offering",
-    "label.network.offering.details": "Network offering details",
-    "label.network.offering.display.text": "Network Offering Display Text",
-    "label.network.offering.id": "Network Offering ID",
-    "label.network.offering.name": "Network Offering Name",
-    "label.network.rate": "Velocitat de xarxa",
-    "label.network.rate.megabytes": "Network Rate (MB/s)",
-    "label.network.read": "Network Read",
-    "label.network.service.providers": "Network Service Providers",
-    "label.network.type": "Network Type",
-    "label.network.write": "Network Write",
-    "label.networking.and.security": "Xarxa i seguretat",
-    "label.networks": "Xarxes",
-    "label.new": "Nou",
-    "label.new.password": "New Password",
-    "label.current.password": "Current Password",
-    "label.new.project": "Nou projecte",
-    "label.new.ssh.key.pair": "New SSH Key Pair",
-    "label.new.vm": "Nova MV",
-    "label.next": "Next",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS Server",
-    "label.nfs.storage": "NFS Storage",
-    "label.nic.adapter.type": "Tipus de tarja de xarxa",
-    "label.nicira.controller.address": "Controller Address",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP details",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "NICs",
-    "label.no": "No",
-    "label.no.actions": "No Available Actions",
-    "label.no.alerts": "No Recent Alerts",
-    "label.no.data": "No hi ha dades",
-    "label.no.errors": "No Recent Errors",
-    "label.no.grouping": "(no grouping)",
-    "label.no.isos": "No available ISOs",
-    "label.no.items": "No Available Items",
-    "label.no.security.groups": "No Available Security Groups",
-    "label.no.thanks": "No gràcies",
-    "label.none": "None",
-    "label.not.found": "Not Found",
-    "label.notifications": "Notifications",
-    "label.num.cpu.cores": "# of CPU Cores",
-    "label.number.of.clusters": "Nombre de clústers",
-    "label.number.of.cpu.sockets": "The Number of CPU Sockets",
-    "label.number.of.hosts": "Nombre de Hosts",
-    "label.number.of.pods": "Nombre de racks",
-    "label.number.of.system.vms": "Number of System VMs",
-    "label.number.of.virtual.routers": "Number of Virtual Routers",
-    "label.number.of.zones": "Nombre de zones",
-    "label.numretries": "Number of Retries",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "of month",
-    "label.offer.ha": "Offer HA",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controllers",
-    "label.operator": "Operator",
-    "label.optional": "Optional",
-    "label.order": "Ordre",
-    "label.os.preference": "OS Preference",
-    "label.os.type": "OS Type",
-    "label.other": "Other",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Action",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Password",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Username",
-    "label.override.guest.traffic": "Override Guest-Traffic",
-    "label.override.public.traffic": "Override Public-Traffic",
-    "label.ovm.traffic.label": "OVM traffic label",
-    "label.ovm3.cluster": "Native Clustering",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Owned Public IP Addresses",
-    "label.owner.account": "Owner Account",
-    "label.owner.domain": "Owner Domain",
-    "label.palo.alto.details": "Palo Alto details",
-    "label.parent.domain": "Parent Domain",
-    "label.passive": "Passive",
-    "label.password": "Password",
-    "label.password.enabled": "Password Enabled",
-    "label.password.lower": "password",
-    "label.password.reset.confirm": "Password has been reset to ",
-    "label.path": "Path",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Persistent ",
-    "label.physical.network": "Physical Network",
-    "label.physical.network.ID": "ID de xarxa física",
-    "label.physical.network.name": "Physical network name",
-    "label.ping.path": "Ping Path",
-    "label.planner.mode": "Planner mode",
-    "label.please.complete.the.following.fields": "Please complete the following fields",
-    "label.please.specify.netscaler.info": "Si us plau doneu informació del NetScaler",
-    "label.please.wait": "Please Wait",
-    "label.plugin.details": "Plugin details",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dedicated",
-    "label.pod.name": "Nom de rack",
-    "label.pods": "Racks",
-    "label.polling.interval.sec": "Polling Interval (in sec)",
-    "label.port": "Port",
-    "label.port.forwarding": "Port Forwarding",
-    "label.port.forwarding.policies": "Pol·lítiques de reenviament de ports",
-    "label.port.range": "Port Range",
-    "label.portable.ip": "Portable IP",
-    "label.portable.ip.range.details": "Portable IP Range details",
-    "label.portable.ip.ranges": "Portable IP Ranges",
-    "label.portable.ips": "Portable IPs",
-    "label.powerstate": "Power State",
-    "label.prev": "Prev",
-    "label.previous": "Anterior",
-    "label.primary.allocated": "Primary Storage Allocated",
-    "label.primary.network": "Primary Network",
-    "label.primary.storage": "Primary Storage",
-    "label.primary.storage.count": "Primary Storage Pools",
-    "label.primary.storage.limits": "Primary Storage limits (GiB)",
-    "label.primary.used": "Primary Storage Used",
-    "label.private.Gateway": "Private Gateway",
-    "label.private.interface": "Private Interface",
-    "label.private.ip": "Private IP Address",
-    "label.private.ip.range": "Private IP Range",
-    "label.private.ips": "Private IP Addresses",
-    "label.private.key": "Private Key",
-    "label.private.network": "Xarxa privada",
-    "label.private.port": "Private Port",
-    "label.private.zone": "Private Zone",
-    "label.privatekey": "PKCS#8 Private Key",
-    "label.profile": "Profile",
-    "label.project": "Projecte",
-    "label.project.dashboard": "Quadre de comandament del projecte",
-    "label.project.id": "ID de projecte",
-    "label.project.invite": "Convidar al projecte",
-    "label.project.name": "Nom del projecte",
-    "label.project.view": "Project View",
-    "label.projects": "Projectes",
-    "label.protocol": "Protocol",
-    "label.protocol.number": "Protocol Number",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Provider",
-    "label.providers": "Proveïdors",
-    "label.public": "Public",
-    "label.public.interface": "Public Interface",
-    "label.public.ip": "Public IP Address",
-    "label.public.ips": "Public IP Addresses",
-    "label.public.key": "Public Key",
-    "label.public.lb": "Public LB",
-    "label.public.load.balancer.provider": "Public Load Balancer Provider",
-    "label.public.network": "Xarxa pública",
-    "label.public.port": "Public Port",
-    "label.public.traffic": "Public traffic",
-    "label.public.traffic.vswitch.name": "Public Traffic vSwitch Name",
-    "label.public.traffic.vswitch.type": "Public Traffic vSwitch Type",
-    "label.public.zone": "Public Zone",
-    "label.purpose": "Purpose",
-    "label.qos.type": "QoS Type",
-    "label.quickview": "Quickview",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Time (in sec)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "Date",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "All Accounts",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "State",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx user",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "Reboot",
-    "label.recent.errors": "Recent Errors",
-    "label.recover.vm": "Recover VM",
-    "label.redundant.router": "Redundant Router",
-    "label.redundant.router.capability": "Redundant router capability",
-    "label.redundant.state": "Estat redundant",
-    "label.redundant.vpc": "Redundant VPC",
-    "label.refresh": "Refresh",
-    "label.refresh.blades": "Refresh Blades",
-    "label.region": "Region",
-    "label.region.details": "Region details",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "Reinstall VM",
-    "label.related": "Related",
-    "label.release.account": "Release from Account",
-    "label.release.account.lowercase": "Release from account",
-    "label.release.dedicated.cluster": "Release Dedicated Cluster",
-    "label.release.dedicated.host": "Release Dedicated Host",
-    "label.release.dedicated.pod": "Release Dedicated Pod",
-    "label.release.dedicated.vlan.range": "Release dedicated VLAN range",
-    "label.release.dedicated.zone": "Release Dedicated Zone",
-    "label.remind.later": "Recordeu-m'ho després",
-    "label.remove.ACL": "Remove ACL",
-    "label.remove.egress.rule": "Esborrar regla de sortida",
-    "label.remove.from.load.balancer": "Removing instance from load balancer",
-    "label.remove.ingress.rule": "Esborrar regla d'entrada",
-    "label.remove.ip.range": "Remove IP range",
-    "label.remove.ldap": "Remove LDAP",
-    "label.remove.network.offering": "Remove network offering",
-    "label.remove.pf": "Esborrar regla de reenviament de port",
-    "label.remove.project.account": "Remove account from project",
-    "label.remove.region": "Remove Region",
-    "label.remove.rule": "Esborrar regla",
-    "label.remove.ssh.key.pair": "Remove SSH Key Pair",
-    "label.remove.static.nat.rule": "Esborrar regla de NAT estàtic",
-    "label.remove.static.route": "Remove static route",
-    "label.remove.this.physical.network": "Remove this physical network",
-    "label.remove.tier": "Remove tier",
-    "label.remove.vm.from.lb": "Treure VM de la regla de balanceig de càrrega",
-    "label.remove.vm.load.balancer": "Remove VM from load balancer",
-    "label.remove.vmware.datacenter": "Remove VMware datacenter",
-    "label.remove.vpc": "Remove VPC",
-    "label.remove.vpc.offering": "Remove VPC offering",
-    "label.removing": "Esborrant",
-    "label.removing.user": "Removing User",
-    "label.reource.id": "Resource ID",
-    "label.replace.acl": "Replace ACL",
-    "label.replace.acl.list": "Replace ACL List",
-    "label.required": "Required",
-    "label.requires.upgrade": "Requires Upgrade",
-    "label.reserved.ip.range": "Reserved IP Range",
-    "label.reserved.system.gateway": "Pasarel·la reservada del sistema",
-    "label.reserved.system.ip": "Reserved System IP",
-    "label.reserved.system.netmask": "Màscara reservada del sistema",
-    "label.reset.VPN.connection": "Reset VPN connection",
-    "label.reset.ssh.key.pair": "Reset SSH Key Pair",
-    "label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
-    "label.resetVM": "Reset VM",
-    "label.resize.new.offering.id": "New Offering",
-    "label.resize.new.size": "New Size (GB)",
-    "label.resize.shrink.ok": "Shrink OK",
-    "label.resource": "Resource",
-    "label.resource.limit.exceeded": "Resource Limit Exceeded",
-    "label.resource.limits": "Resource Limits",
-    "label.resource.name": "Resource Name",
-    "label.resource.state": "Resource state",
-    "label.resources": "Resources",
-    "label.response.timeout.in.sec": "Response Timeout (in sec)",
-    "label.restart.network": "Restart network",
-    "label.restart.required": "Restart required",
-    "label.restart.vpc": "Restart VPC",
-    "label.restore": "Restore",
-    "label.retry.interval": "Retry Interval",
-    "label.review": "Review",
-    "label.revoke.project.invite": "Revocar invitació",
-    "label.role": "Role",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Root certificate",
-    "label.root.disk.controller": "Controlador de disc arrel",
-    "label.root.disk.offering": "Root Disk Offering",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Scaled Up",
-    "label.routing": "Routing",
-    "label.routing.host": "Routing Host",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Rule Number",
-    "label.rules": "Rules",
-    "label.running.vms": "Running VMs",
-    "label.s3.access_key": "Access Key",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Connection Timeout",
-    "label.s3.endpoint": "Endpoint",
-    "label.s3.max_error_retry": "Max Error Retry",
-    "label.s3.nfs.path": "S3 NFS Path",
-    "label.s3.nfs.server": "S3 NFS Server",
-    "label.s3.secret_key": "Secret Key",
-    "label.s3.socket_timeout": "Socket Timeout",
-    "label.s3.use_https": "Use HTTPS",
-    "label.saml.enable": "Authorize SAML SSO",
-    "label.saml.entity": "Identity Provider",
-    "label.saturday": "Saturday",
-    "label.save": "Save",
-    "label.save.and.continue": "Desa i continua",
-    "label.save.changes": "Save changes",
-    "label.saving.processing": "Saving....",
-    "label.scale.up.policy": "SCALE UP POLICY",
-    "label.scaledown.policy": "ScaleDown Policy",
-    "label.scaleup.policy": "ScaleUp Policy",
-    "label.scope": "Scope",
-    "label.search": "Search",
-    "label.secondary.ips": "Secondary IPs",
-    "label.secondary.isolated.vlan.id": "Secondary Isolated VLAN ID",
-    "label.secondary.staging.store": "Secondary Staging Store",
-    "label.secondary.staging.store.details": "Secondary Staging Store details",
-    "label.secondary.storage": "Secondary Storage",
-    "label.secondary.storage.count": "Secondary Storage Pools",
-    "label.secondary.storage.details": "Secondary storage details",
-    "label.secondary.storage.limits": "Secondary Storage limits (GiB)",
-    "label.secondary.storage.vm": "Secondary storage VM",
-    "label.secondary.used": "Secondary Storage Used",
-    "label.secret.key": "Secret Key",
-    "label.security.group": "Security Group",
-    "label.security.group.name": "Security Group Name",
-    "label.security.groups": "Security Groups",
-    "label.security.groups.enabled": "Security Groups Enabled",
-    "label.select": "Select",
-    "label.select-view": "Sel·lecioni vista",
-    "label.select.a.template": "Sel·leccioni una plantilla",
-    "label.select.a.zone": "Sel·leccioni una zona",
-    "label.select.instance": "Select instance",
-    "label.select.instance.to.attach.volume.to": "Select instance to attach volume to",
-    "label.select.iso.or.template": "Sel·leccioni ISO o plantilla",
-    "label.select.offering": "Select offering",
-    "label.select.project": "Sel·leccionar projecte",
-    "label.select.region": "Select region",
-    "label.select.template": "Select Template",
-    "label.select.tier": "Select Tier",
-    "label.select.vm.for.static.nat": "Select VM for static NAT",
-    "label.sent": "Sent",
-    "label.server": "Server",
-    "label.service.capabilities": "Service Capabilities",
-    "label.service.offering": "Service Offering",
-    "label.service.offering.details": "Service offering details",
-    "label.service.state": "Service State",
-    "label.services": "Services",
-    "label.session.expired": "Session Expired",
-    "label.set.default.NIC": "Set default NIC",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Set up zone type",
-    "label.settings": "Settings",
-    "label.setup": "Configuració",
-    "label.setup.network": "Set up Network",
-    "label.setup.zone": "Set up Zone",
-    "label.shared": "Shared",
-    "label.show.advanced.settings": "Show advanced settings",
-    "label.show.ingress.rule": "Show Ingress Rule",
-    "label.shutdown.provider": "Apagar proveïdor",
-    "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Size",
-    "label.skip.guide": "Si heu utilitzat CloudStack abans, ometi aquesta guia",
-    "label.smb.domain": "SMB Domain",
-    "label.smb.password": "SMB Password",
-    "label.smb.username": "SMB Username",
-    "label.snapshot": "Snapshot",
-    "label.snapshot.limits": "Snapshot Limits",
-    "label.snapshot.name": "Snapshot Name",
-    "label.snapshot.s": "Snapshots",
-    "label.snapshot.schedule": "Set up Recurring Snapshot",
-    "label.snapshots": "Snapshots",
-    "label.sockets": "CPU Sockets",
-    "label.source.ip.address": "Source IP Address",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT Supported",
-    "label.source.port": "Source Port",
-    "label.specify.IP.ranges": "Specify IP ranges",
-    "label.specify.vlan": "Specify VLAN",
-    "label.specify.vxlan": "Specify VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX details",
-    "label.ssh.key.pair": "SSH Key Pair",
-    "label.ssh.key.pair.details": "SSH Key Pair Details",
-    "label.ssh.key.pairs": "SSH Key Pairs",
-    "label.standard.us.keyboard": "Standard (US) keyboard",
-    "label.start.IP": "Start IP",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "Start Port",
-    "label.start.reserved.system.IP": "Start Reserved system IP",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "Start VXLAN",
-    "label.state": "State",
-    "label.static.nat": "Static NAT",
-    "label.static.nat.enabled": "NAT estàtic habilitat",
-    "label.static.nat.to": "Static NAT to",
-    "label.static.nat.vm.details": "Static NAT VM Details",
-    "label.static.routes": "Static Routes",
-    "label.statistics": "Statistics",
-    "label.status": "Status",
-    "label.step.1": "Step 1",
-    "label.step.1.title": "Step 1: <strong>Select a Template</strong>",
-    "label.step.2": "Step 2",
-    "label.step.2.title": "Step 2: <strong>Service Offering</strong>",
-    "label.step.3": "Step 3",
-    "label.step.3.title": "Step 3: <strong id=\"step3_label\">Select a Disk Offering</strong>",
-    "label.step.4": "Step 4",
-    "label.step.4.title": "Step 4: <strong>Network</strong>",
-    "label.step.5": "Step 5",
-    "label.step.5.title": "Step 5: <strong>Review</strong>",
-    "label.stickiness": "Tendència",
-    "label.stickiness.method": "Stickiness method",
-    "label.sticky.cookie-name": "Cookie name",
-    "label.sticky.domain": "Domain",
-    "label.sticky.expire": "Expires",
-    "label.sticky.holdtime": "Hold time",
-    "label.sticky.indirect": "Indirect",
-    "label.sticky.length": "Length",
-    "label.sticky.mode": "Mode",
-    "label.sticky.name": "Sticky Name",
-    "label.sticky.nocache": "No cache",
-    "label.sticky.postonly": "Post only",
-    "label.sticky.prefix": "Prefix",
-    "label.sticky.request-learn": "Request learn",
-    "label.sticky.tablesize": "Table size",
-    "label.stop": "Stop",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "Stopped VMs",
-    "label.storage": "Storage",
-    "label.storage.pool": "Storage Pool",
-    "label.storage.tags": "Storage Tags",
-    "label.storage.traffic": "Tràfic d'emmagatzemament",
-    "label.storage.type": "Storage Type",
-    "label.subdomain.access": "Accés de subdomini",
-    "label.submit": "Submit",
-    "label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Succeeded",
-    "label.sunday": "Sunday",
-    "label.super.cidr.for.guest.networks": "Super CIDR for Guest Networks",
-    "label.supported.services": "Supported Services",
-    "label.supported.source.NAT.type": "Supported Source NAT type",
-    "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Suspendre projecte",
-    "label.switch.type": "Switch Type",
-    "label.system.capacity": "System Capacity",
-    "label.system.offering": "System Offering",
-    "label.system.offering.for.router": "System Offering for Router",
-    "label.system.service.offering": "System Service Offering",
-    "label.system.service.offering.details": "System service offering details",
-    "label.system.vm": "System VM",
-    "label.system.vm.details": "System VM details",
-    "label.system.vm.scaled.up": "System VM Scaled Up",
-    "label.system.vm.type": "System VM Type",
-    "label.system.vms": "System VMs",
-    "label.system.wide.capacity": "System-wide capacity",
-    "label.tag.key": "Tag Key",
-    "label.tag.value": "Tag Value",
-    "label.tagged": "Tagged",
-    "label.tags": "Tags",
-    "label.target.iqn": "Target IQN",
-    "label.task.completed": "Tasca complerta",
-    "label.template": "Template",
-    "label.template.limits": "Template Limits",
-    "label.tftp.root.directory": "Tftp root directory",
-    "label.theme.default": "Default Theme",
-    "label.theme.grey": "Custom - Grey",
-    "label.theme.lightblue": "Custom - Light Blue",
-    "label.threshold": "Threshold",
-    "label.thursday": "Thursday",
-    "label.tier": "Tier",
-    "label.tier.details": "Tier details",
-    "label.time": "Time",
-    "label.time.colon": "Time:",
-    "label.time.zone": "Timezone",
-    "label.timeout": "Timeout",
-    "label.timeout.in.second ": " Timeout (seconds)",
-    "label.timezone": "Timezone",
-    "label.timezone.colon": "Timezone:",
-    "label.token": "Token",
-    "label.total.CPU": "Total de CPU",
-    "label.total.cpu": "Total de CPU",
-    "label.total.hosts": "Total de hosts",
-    "label.total.memory": "Total de RAM",
-    "label.total.of.ip": "Total of IP Addresses",
-    "label.total.of.vm": "Total of VMs",
-    "label.total.storage": "Total d'emmagatzemament",
-    "label.total.virtual.routers": "Total of Virtual Routers",
-    "label.total.virtual.routers.upgrade": "Total of Virtual Routers that require upgrade",
-    "label.total.vms": "Total VMs",
-    "label.traffic.label": "Traffic label",
-    "label.traffic.type": "Traffic Type",
-    "label.traffic.types": "Tipus de tràfics",
-    "label.tuesday": "Tuesday",
-    "label.type": "Type",
-    "label.type.id": "Type ID",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK keyboard",
-    "label.unavailable": "Unavailable",
-    "label.unhealthy.threshold": "Unhealthy Threshold",
-    "label.unlimited": "Unlimited",
-    "label.untagged": "Untagged",
-    "label.update.project.resources": "Actualitzar recursos del projecte",
-    "label.update.ssl": " SSL Certificate",
-    "label.update.ssl.cert": " SSL Certificate",
-    "label.updating": "Updating",
-    "label.upgrade.required": "Upgrade is required",
-    "label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
-    "label.upload": "Upload",
-    "label.upload.from.local": "Upload from Local",
-    "label.upload.template.from.local": "Upload Template from Local",
-    "label.upload.volume": "Upload volume",
-    "label.upload.volume.from.local": "Upload Volume from Local",
-    "label.upload.volume.from.url": "Upload volume from URL",
-    "label.url": "URL",
-    "label.usage.interface": "Usage Interface",
-    "label.usage.sanity.result": "Usage Sanity Result",
-    "label.usage.server": "Usage Server",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "Use VM IP:",
-    "label.use.vm.ips": "Use VM IPs",
-    "label.used": "Used",
-    "label.user": "User",
-    "label.user.data": "User Data",
-    "label.user.details": "User details",
-    "label.user.vm": "User VM",
-    "label.username": "Username",
-    "label.username.lower": "username",
-    "label.users": "Users",
-    "label.vSwitch.type": "vSwitch Type",
-    "label.value": "Value",
-    "label.vcdcname": "vCenter DC name",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter Cluster",
-    "label.vcenter.datacenter": "vCenter Datacenter",
-    "label.vcenter.datastore": "vCenter Datastore",
-    "label.vcenter.host": "vCenter Host",
-    "label.vcenter.password": "vCenter Password",
-    "label.vcenter.username": "vCenter Username",
-    "label.vcipaddress": "vCenter IP Address",
-    "label.version": "Version",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Max resolution",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Remaining capacity",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Veure",
-    "label.view.all": "Veure tots",
-    "label.view.console": "Veure consola",
-    "label.view.more": "Veure més",
-    "label.view.secondary.ips": "View secondary IPs",
-    "label.viewing": "Veient",
-    "label.virtual.appliance": "Virtual Appliance",
-    "label.virtual.appliance.details": "Virtual applicance details",
-    "label.virtual.appliances": "Virtual Appliances",
-    "label.virtual.machine": "Virtual Machine",
-    "label.virtual.machines": "Virtual Machines",
-    "label.virtual.network": "Virtual Network",
-    "label.virtual.networking": "Virtual Networking",
-    "label.virtual.router": "Router virtual",
-    "label.virtual.routers": "Virtual Routers",
-    "label.virtual.routers.group.account": "Virtual Routers group by account",
-    "label.virtual.routers.group.cluster": "Virtual Routers group by cluster",
-    "label.virtual.routers.group.pod": "Virtual Routers group by pod",
-    "label.virtual.routers.group.zone": "Virtual Routers group by zone",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI Range",
-    "label.vlan.range.details": "VLAN Range details",
-    "label.vlan.ranges": "VLAN Range(s)",
-    "label.vlan.vni.range": "VLAN/VNI Range",
-    "label.vlan.vni.ranges": "VLAN/VNI Range(s)",
-    "label.vm.add": "Add Instance",
-    "label.vm.destroy": "Destroy",
-    "label.vm.display.name": "VM display name",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP Address",
-    "label.vm.name": "VM name",
-    "label.vm.password": "Password of the VM is",
-    "label.vm.reboot": "Reboot",
-    "label.vm.start": "Start",
-    "label.vm.state": "VM state",
-    "label.vm.stop": "Stop",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "VM Snapshots",
-    "label.vmsnapshot.current": "isCurrent",
-    "label.vmsnapshot.memory": "Snapshot memory",
-    "label.vmsnapshot.parentname": "Parent",
-    "label.vmsnapshot.type": "Type",
-    "label.vmware.datacenter.id": "VMware datacenter ID",
-    "label.vmware.datacenter.name": "VMware datacenter Name",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "VMware traffic label",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC Devices",
-    "label.volatile": "Volatile",
-    "label.volgroup": "Volume Group",
-    "label.volume": "Volume",
-    "label.volume.details": "Volume details",
-    "label.volume.limits": "Volume Limits",
-    "label.volume.migrated": "Volume migrated",
-    "label.volume.name": "Volume Name",
-    "label.volumes": "Volumes",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Distributed VPC Router",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC Offering",
-    "label.vpc.offering.details": "VPC offering details",
-    "label.vpc.router.details": "VPC Router Details",
-    "label.vpc.supportsregionlevelvpc": "Supports Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtual Router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN Customer Gateway",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "Control VLAN ID",
-    "label.vsmpktvlanid": "Packet VLAN ID",
-    "label.vsmstoragevlanid": "Storage VLAN ID",
-    "label.vsphere.managed": "vSphere Managed",
-    "label.vswitch.name": "vSwitch Name",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN Range",
-    "label.waiting": "Waiting",
-    "label.warn": "Warn",
-    "label.warn.upper": "WARN",
-    "label.warning": "Warning",
-    "label.wednesday": "Wednesday",
-    "label.weekly": "Weekly",
-    "label.welcome": "Welcome",
-    "label.welcome.cloud.console": "Welcome to Management Console",
-    "label.what.is.cloudstack": "Que és CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Original XS Version is 6.1+",
-    "label.xenserver.traffic.label": "XenServer traffic label",
-    "label.yes": "Yes",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone Dedicated",
-    "label.zone.details": "Detalls de la zona",
-    "label.zone.id": "Zone ID",
-    "label.zone.lower": "zone",
-    "label.zone.name": "Zone Name",
-    "label.zone.step.1.title": "Step 1: <strong>Select a Network</strong>",
-    "label.zone.step.2.title": "Step 2: <strong>Add a Zone</strong>",
-    "label.zone.step.3.title": "Step 3: <strong>Add a Pod</strong>",
-    "label.zone.step.4.title": "Step 4: <strong>Add an IP range</strong>",
-    "label.zone.type": "Zone Type",
-    "label.zone.wide": "Zone-Wide",
-    "label.zoneWizard.trafficType.guest": "Guest: Traffic between end-user virtual machines",
-    "label.zoneWizard.trafficType.management": "Management: Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs",
-    "label.zoneWizard.trafficType.public": "Public: Traffic between the internet and virtual machines in the cloud.",
-    "label.zoneWizard.trafficType.storage": "Storage: Traffic between primary and secondary storage servers, such as VM templates and snapshots",
-    "label.zones": "Zones",
-    "managed.state": "Managed State",
-    "message.XSTools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
-    "message.Zone.creation.complete": "Zone creation complete",
-    "message.acquire.ip.nic": "Please confirm that you would like to acquire a new secondary IP for this NIC.<br/>NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine.",
-    "message.acquire.new.ip": "Si us plau confirmeu que voleu adquirir una nova IP per aquesta xarxa.",
-    "message.acquire.new.ip.vpc": "Please confirm that you would like to acquire a new IP for this VPC.",
-    "message.acquire.public.ip": "Please select a zone from which you want to acquire your new IP from.",
-    "message.action.cancel.maintenance": "Your host has been successfully canceled for maintenance. This process can take up to several minutes.",
-    "message.action.cancel.maintenance.mode": "Please confirm that you want to cancel this maintenance.",
-    "message.action.change.service.warning.for.instance": "Your instance must be stopped before attempting to change its current service offering.",
-    "message.action.change.service.warning.for.router": "Your router must be stopped before attempting to change its current service offering.",
-    "message.action.delete.ISO": "Please confirm that you want to delete this ISO.",
-    "message.action.delete.ISO.for.all.zones": "The ISO is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.cluster": "Please confirm that you want to delete this cluster.",
-    "message.action.delete.disk.offering": "Please confirm that you want to delete this disk offering.",
-    "message.action.delete.domain": "Please confirm that you want to delete this domain.",
-    "message.action.delete.external.firewall": "Please confirm that you would like to remove this external firewall. Warning: If you are planning to add back the same external firewall, you must reset usage data on the device.",
-    "message.action.delete.external.load.balancer": "Please confirm that you would like to remove this external load balancer. Warning: If you are planning to add back the same external load balancer, you must reset usage data on the device.",
-    "message.action.delete.ingress.rule": "Please confirm that you want to delete this ingress rule.",
-    "message.action.delete.network": "Please confirm that you want to delete this network.",
-    "message.action.delete.nexusVswitch": "Please confirm that you want to delete this nexus 1000v",
-    "message.action.delete.nic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
-    "message.action.delete.physical.network": "Please confirm that you want to delete this physical network",
-    "message.action.delete.pod": "Please confirm that you want to delete this pod.",
-    "message.action.delete.primary.storage": "Please confirm that you want to delete this primary storage.",
-    "message.action.delete.secondary.storage": "Please confirm that you want to delete this secondary storage.",
-    "message.action.delete.security.group": "Please confirm that you want to delete this security group.",
-    "message.action.delete.service.offering": "Please confirm that you want to delete this service offering.",
-    "message.action.delete.snapshot": "Please confirm that you want to delete this snapshot.",
-    "message.action.delete.system.service.offering": "Please confirm that you want to delete this system service offering.",
-    "message.action.delete.template": "Please confirm that you want to delete this template.",
-    "message.action.delete.template.for.all.zones": "The template is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.volume": "Please confirm that you want to delete this volume.",
-    "message.action.delete.zone": "Please confirm that you want to delete this zone.",
-    "message.action.destroy.instance": "Please confirm that you want to destroy this instance.",
-    "message.action.destroy.systemvm": "Please confirm that you want to destroy this System VM.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Please confirm that you want to disable this cluster.",
-    "message.action.disable.nexusVswitch": "Please confirm that you want to disable this nexus 1000v",
-    "message.action.disable.physical.network": "Please confirm that you want to disable this physical network.",
-    "message.action.disable.pod": "Please confirm that you want to disable this pod.",
-    "message.action.disable.static.NAT": "Please confirm that you want to disable static NAT.",
-    "message.action.disable.zone": "Please confirm that you want to disable this zone.",
-    "message.action.download.iso": "Si us plau confirmeu que voleu descarregar aquesta ISO.",
-    "message.action.download.template": "Si us plau confirmeu que voleu descarregar aquesta plantilla.",
-    "message.action.downloading.template": "Downloading template.",
-    "message.action.enable.cluster": "Please confirm that you want to enable this cluster.",
-    "message.action.enable.maintenance": "Your host has been successfully prepared for maintenance.  This process can take up to several minutes or longer depending on how many VMs are currently on this host.",
-    "message.action.enable.nexusVswitch": "Please confirm that you want to enable this nexus 1000v",
-    "message.action.enable.physical.network": "Please confirm that you want to enable this physical network.",
-    "message.action.enable.pod": "Please confirm that you want to enable this pod.",
-    "message.action.enable.zone": "Please confirm that you want to enable this zone.",
-    "message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
-    "message.action.force.reconnect": "Your host has been successfully forced to reconnect.  This process can take up to several minutes.",
-    "message.action.host.enable.maintenance.mode": "Enabling maintenance mode will cause a live migration of all running instances on this host to any available host.",
-    "message.action.instance.reset.password": "Please confirm that you want to change the ROOT password for this virtual machine.",
-    "message.action.manage.cluster": "Please confirm that you want to manage the cluster.",
-    "message.action.primarystorage.enable.maintenance.mode": "Warning: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped.  Do you want to continue?",
-    "message.action.reboot.instance": "Please confirm that you want to reboot this instance.",
-    "message.action.reboot.router": "All services provided by this virtual router will be interrupted. Please confirm that you want to reboot this router.",
-    "message.action.reboot.systemvm": "Please confirm that you want to reboot this system VM.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Please confirm that you want to release this IP.",
-    "message.action.remove.host": "Please confirm that you want to remove this host.",
-    "message.action.reset.password.off": "Your instance currently does not support this feature.",
-    "message.action.reset.password.warning": "Your instance must be stopped before attempting to change its current password.",
-    "message.action.restore.instance": "Please confirm that you want to restore this instance.",
-    "message.action.revert.snapshot": "Please confirm that you want to revert the owning volume to this snapshot.",
-    "message.action.start.instance": "Please confirm that you want to start this instance.",
-    "message.action.start.router": "Please confirm that you want to start this router.",
-    "message.action.start.systemvm": "Please confirm that you want to start this system VM.",
-    "message.action.stop.instance": "Please confirm that you want to stop this instance.",
-    "message.action.stop.router": "All services provided by this virtual router will be interrupted. Please confirm that you want to stop this router.",
-    "message.action.stop.systemvm": "Please confirm that you want to stop this system VM.",
-    "message.action.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
-    "message.action.snapshot.fromsnapshot":"Please confirm that you want to take a snapshot of this VM snapshot.",
-    "message.action.unmanage.cluster": "Please confirm that you want to unmanage the cluster.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Please confirm that you want to delete this VM snapshot.",
-    "message.action.vmsnapshot.revert": "Revert VM snapshot",
-    "message.activate.project": "Esteu segurs d'activar aquest projecte?",
-    "message.add.VPN.gateway": "Please confirm that you want to add a VPN Gateway",
-    "message.add.cluster": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Please specify the following parameters to add a new disk offering",
-    "message.add.domain": "Si us plau especifiqueu el sub-domini que voleu crear sota aquest domini",
-    "message.add.firewall": "Add a firewall to zone",
-    "message.add.guest.network": "Si us plau confirmeu que voleu afegir una xarxa per a MVs",
-    "message.add.host": "Please specify the following parameters to add a new host",
-    "message.add.ip.range": "Add an IP range to public network in zone",
-    "message.add.ip.range.direct.network": "Add an IP range to direct network <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Add an IP range to pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Add a load balancer to zone",
-    "message.add.load.balancer.under.ip": "The load balancer rule has been added under IP:",
-    "message.add.network": "Add a new network for zone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Please specify the information to add a new gateway to this VPC.",
-    "message.add.pod": "Add a new pod for zone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack's internal management traffic. The reserved IP range must be unique for each zone in the cloud.",
-    "message.add.primary": "Please specify the following parameters to add a new primary storage",
-    "message.add.primary.storage": "Add a new Primary Storage for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Please specify the required information to add a new region.",
-    "message.add.secondary.storage": "Add a new storage for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Please fill in the following data to add a new compute offering.",
-    "message.add.system.service.offering": "Please fill in the following data to add a new system service offering.",
-    "message.add.template": "Please enter the following data to create your new template",
-    "message.add.volume": "Please fill in the following data to add a new volume.",
-    "message.added.vpc.offering": "Added VPC offering",
-    "message.adding.Netscaler.device": "Adding Netscaler device",
-    "message.adding.Netscaler.provider": "Adding Netscaler provider",
-    "message.adding.host": "Adding host",
-    "message.additional.networks.desc": "Please select additional network(s) that your virtual instance will be connected to.",
-    "message.admin.guide.read": "For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?,",
-    "message.advanced.mode.desc": "Choose this network model if you wish to enable VLAN support.  This network model provides the most flexibility in allowing administrators to provide custom network offerings such as providing firewall, vpn, or load balancer support as well as enabling direct vs virtual networking.",
-    "message.advanced.security.group": "Choose this if you wish to use security groups to provide guest VM isolation.",
-    "message.advanced.virtual": "Choose this if you wish to use zone-wide VLANs to provide guest VM isolation.",
-    "message.after.enable.s3": "S3-backed Secondary Storage configured. Note: When you leave this page, you will not be able to re-configure S3 again.",
-    "message.after.enable.swift": "Swift configurat. Nota: Quan abandoneu aquesta pàgina, no sereu capaços de reconfigurar Swift de nou.",
-    "message.alert.state.detected": "Estat d'alerta detectat",
-    "message.allow.vpn.access": "Please enter a username and password of the user that you want to allow VPN access.",
-    "message.apply.snapshot.policy": "You have successfully updated your current snapshot policy.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Please confirm that you want to attach the ISO to this virtual instance.",
-    "message.attach.volume": "Please fill in the following data to attach a new volume. If you are attaching a disk volume to a Windows based virtual machine, you will need to reboot the instance to see the attached disk.",
-    "message.basic.mode.desc": "Choose this network model if you do <b>*<u>not</u>*</b> want to enable any VLAN support.  All virtual instances created under this network model will be assigned an IP directly from the network and security groups are used to provide security and segregation.",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "Please confirm that you wish to change the service offering of this virtual instance.",
-    "message.change.password": "Si us plau, canvieu la contrasenya.",
-    "message.cluster.dedicated": "Cluster Dedicated",
-    "message.cluster.dedication.released": "Cluster dedication released",
-    "message.configure.all.traffic.types": "You have multiple physical networks; please configure labels for each traffic type by clicking on the Edit button.",
-    "message.configure.firewall.rules.allow.traffic": "Configure the rules to allow Traffic",
-    "message.configure.firewall.rules.block.traffic": "Configure the rules to block Traffic",
-    "message.configure.ldap": "Please confirm you would like to configure LDAP.",
-    "message.configuring.guest.traffic": "Configuring guest traffic",
-    "message.configuring.physical.networks": "Configuring physical networks",
-    "message.configuring.public.traffic": "Configuring public traffic",
-    "message.configuring.storage.traffic": "Configuring storage traffic",
-    "message.confirm.action.force.reconnect": "Please confirm that you want to force reconnect this host.",
-    "message.confirm.add.vnmc.provider": "Please confirm you would like to add the VNMC provider.",
-    "message.confirm.archive.alert": "Please confirm that you want to archive this alert.",
-    "message.confirm.archive.event": "Please confirm that you want to archive this event.",
-    "message.confirm.archive.selected.alerts": "Please confirm you would like to archive the selected alerts",
-    "message.confirm.archive.selected.events": "Please confirm you would like to archive the selected events",
-    "message.confirm.attach.disk": "Are you sure you want to attach disk?",
-    "message.confirm.create.volume": "Are you sure you want to create volume?",
-    "message.confirm.current.guest.CIDR.unchanged": "Do you want to keep the current guest network CIDR unchanged?",
-    "message.confirm.dedicate.cluster.domain.account": "Do you really want to dedicate this cluster to a domain/account? ",
-    "message.confirm.dedicate.host.domain.account": "Do you really want to dedicate this host to a domain/account? ",
-    "message.confirm.dedicate.pod.domain.account": "Do you really want to dedicate this pod to a domain/account? ",
-    "message.confirm.dedicate.zone": "Do you really want to dedicate this zone to a domain/account?",
-    "message.confirm.delete.BigSwitchBcf": "Please confirm that you would like to delete this BigSwitch BCF Controller",
-    "message.confirm.delete.BrocadeVcs": "Please confirm that you would like to delete Brocade Vcs Switch",
-    "message.confirm.delete.F5": "Si us plau confirmeu que voleu esborrar l'F5",
-    "message.confirm.delete.NetScaler": "Si us plau confirmeu que voleu esborrar el NetScaler",
-    "message.confirm.delete.PA": "Please confirm that you would like to delete Palo Alto",
-    "message.confirm.delete.SRX": "Si us plau confirmeu que voleu esborrar l'SRX",
-    "message.confirm.delete.acl.list": "Are you sure you want to delete this ACL list?",
-    "message.confirm.delete.alert": "Are you sure you want to delete this alert ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Please confirm that you want to delete Baremetal Rack Configuration.",
-    "message.confirm.delete.ciscoASA1000v": "Please confirm you want to delete CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
-    "message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
-    "message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
-    "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
-    "message.confirm.destroy.router": "Si us plau confirmeu que voleu destruir aquest router",
-    "message.confirm.disable.host": "Please confirm that you want to disable the host",
-    "message.confirm.disable.network.offering": "Are you sure you want to disable this network offering?",
-    "message.confirm.disable.provider": "Si us plau confirmeu que voleu deshabilitar aquest proveïdor",
-    "message.confirm.disable.vnmc.provider": "Please confirm you would like to disable the VNMC provider.",
-    "message.confirm.disable.vpc.offering": "Are you sure you want to disable this VPC offering?",
-    "message.confirm.enable.host": "Please confirm that you want to enable the host",
-    "message.confirm.enable.network.offering": "Are you sure you want to enable this network offering?",
-    "message.confirm.enable.provider": "Si us plau confirmeu que voleu habilitar aquest proveïdor",
-    "message.confirm.enable.vnmc.provider": "Please confirm you would like to enable the VNMC provider.",
-    "message.confirm.enable.vpc.offering": "Are you sure you want to enable this VPC offering?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Si us plau confirmeu que voleu unir-vos al projecte.",
-    "message.confirm.migrate.volume": "Do you want to migrate this volume?",
-    "message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
-    "message.confirm.release.dedicate.vlan.range": "Please confirm you want to release dedicated VLAN range",
-    "message.confirm.release.dedicated.cluster": "Do you want to release this dedicated cluster ?",
-    "message.confirm.release.dedicated.host": "Do you want to release this dedicated host ?",
-    "message.confirm.release.dedicated.pod": "Do you want to release this dedicated pod ?",
-    "message.confirm.release.dedicated.zone": "Do you want to release this dedicated zone ? ",
-    "message.confirm.remove.IP.range": "Please confirm that you would like to remove this IP range.",
-    "message.confirm.remove.event": "Are you sure you want to remove this event?",
-    "message.confirm.remove.load.balancer": "Please confirm you want to remove VM from load balancer",
-    "message.confirm.remove.network.offering": "Are you sure you want to remove this network offering?",
-    "message.confirm.remove.selected.alerts": "Please confirm you would like to remove the selected alerts",
-    "message.confirm.remove.selected.events": "Please confirm you would like to remove the selected events",
-    "message.confirm.remove.vmware.datacenter": "Please confirm you want to remove VMware datacenter",
-    "message.confirm.remove.vpc.offering": "Are you sure you want to remove this VPC offering?",
-    "message.confirm.replace.acl.new.one": "Do you want to replace the ACL with a new one?",
-    "message.confirm.scale.up.router.vm": "Do you really want to scale up the Router VM ?",
-    "message.confirm.scale.up.system.vm": "Do you really want to scale up the system VM ?",
-    "message.confirm.shutdown.provider": "Si us plau confirmeu que voleu apagar aquest proveïdor",
-    "message.confirm.start.lb.vm": "Please confirm you want to start LB VM",
-    "message.confirm.stop.lb.vm": "Please confirm you want to stop LB VM",
-    "message.confirm.upgrade.router.newer.template": "Please confirm that you want to upgrade router to use newer template",
-    "message.confirm.upgrade.routers.account.newtemplate": "Please confirm that you want to upgrade all routers in this account to use newer template",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Please confirm that you want to upgrade all routers in this cluster to use newer template",
-    "message.confirm.upgrade.routers.newtemplate": "Please confirm that you want to upgrade all routers in this zone to use newer template",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Please confirm that you want to upgrade all routers in this pod to use newer template",
-    "message.copy.iso.confirm": "Please confirm that you wish to copy your ISO to",
-    "message.copy.template": "Copy template <b id=\"copy_template_name_text\">XXX</b> from zone <b id=\"copy_template_source_zone_text\"></b> to",
-    "message.copy.template.confirm": "Are you sure you want to copy template?",
-    "message.create.template": "Are you sure you want to create template?",
-    "message.create.template.vm": "Create VM from template <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Please specify the following information before creating a template of your disk volume: <b><span id=\"volume_name\"></span></b>. Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.creating.cluster": "Creating cluster",
-    "message.creating.guest.network": "Creating guest network",
-    "message.creating.physical.networks": "Creating physical networks",
-    "message.creating.pod": "Creating pod",
-    "message.creating.primary.storage": "Creating primary storage",
-    "message.creating.secondary.storage": "Creating secondary storage",
-    "message.creating.systemVM": "Creating system VMs (this may take a while)",
-    "message.creating.zone": "Creating zone",
-    "message.decline.invitation": "Esteu segurs de declinar aquesta invitació per al projecte?",
-    "message.dedicate.zone": "Dedicating zone",
-    "message.dedicated.zone.released": "Zone dedication released",
-    "message.delete.VPN.connection": "Please confirm that you want to delete VPN connection",
-    "message.delete.VPN.customer.gateway": "Please confirm that you want to delete this VPN Customer Gateway",
-    "message.delete.VPN.gateway": "Please confirm that you want to delete this VPN Gateway",
-    "message.delete.account": "Please confirm that you want to delete this account.",
-    "message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
-    "message.delete.gateway": "Please confirm you want to delete the gateway",
-    "message.delete.project": "Esteu segurs d'eliminar el projecte?",
-    "message.delete.user": "Si us plau confirmeu que voleu esborrar aquest usuari.",
-    "message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
-    "message.desc.advanced.zone": "For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support.",
-    "message.desc.basic.zone": "Provide a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering).",
-    "message.desc.cluster": "Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.",
-    "message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.<br><br>(1) If public key is set, CloudStack will register the public key. You can use it through your private key.<br><br>(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.<br>",
-    "message.desc.created.ssh.key.pair": "Created a SSH Key Pair.",
-    "message.desc.host": "Each cluster must contain at least one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.<br/><br/>Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.",
-    "message.desc.primary.storage": "Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor.",
-    "message.desc.reset.ssh.key.pair": "Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled.",
-    "message.desc.secondary.storage": "Each zone must have at least one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.<br/><br/>Provide the IP address and exported path.",
-    "message.desc.zone": "A zone is the largest organizational unit in CloudStack, and it typically corresponds to a single datacenter. Zones provide physical isolation and redundancy. A zone consists of one or more pods (each of which contains hosts and primary storage servers) and a secondary storage server which is shared by all pods in the zone.",
-    "message.detach.disk": "Are you sure you want to detach this disk?",
-    "message.detach.iso.confirm": "Please confirm that you want to detach the ISO from this virtual instance.",
-    "message.disable.account": "Please confirm that you want to disable this account.  By disabling the account, all users for this account will no longer have access to their cloud resources.  All running virtual machines will be immediately shut down.",
-    "message.disable.snapshot.policy": "You have successfully disabled your current snapshot policy.",
-    "message.disable.user": "Si us plao confirmeu que voleu deshabilitar aquest usuari.",
-    "message.disable.vpn": "¿Esteu segurs de deshabilitar la VPN?",
-    "message.disable.vpn.access": "Please confirm that you want to disable Remote Access VPN.",
-    "message.disabling.network.offering": "Disabling network offering",
-    "message.disabling.vpc.offering": "Disabling VPC offering",
-    "message.disallowed.characters": "Disallowed characters: <,>",
-    "message.download.ISO": "Please click <a href=\"#\">00000</a> to download ISO",
-    "message.download.template": "Please click <a href=\"#\">00000</a> to download template",
-    "message.download.volume": "Please click <a href=\"#\">00000</a> to download volume",
-    "message.download.volume.confirm": "Please confirm that you want to download this volume.",
-    "message.edit.account": "Editar (\"-1\" indica que no hi ha limit en la quantitat de recursos a crear)",
-    "message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
-    "message.edit.limits": "Please specify limits to the following resources.  A \"-1\" indicates no limit to the amount of resources create.",
-    "message.edit.traffic.type": "Please specify the traffic label you want associated with this traffic type.",
-    "message.enable.account": "Please confirm that you want to enable this account.",
-    "message.enable.user": "Si us plau confirmeu que voleu habilitar aquest usuari.",
-    "message.enable.vpn": "Si us plau confirmeu que voleu habilitar l'accés VPN per aquesta adreça IP",
-    "message.enable.vpn.access": "VPN is currently disabled for this IP Address.  Would you like to enable VPN access?",
-    "message.enabled.vpn": "Your Remote Access VPN is currently enabled and can be accessed via the IP",
-    "message.enabled.vpn.ip.sec": "Your IPSec pre-shared key is",
-    "message.enabling.network.offering": "Enabling network offering",
-    "message.enabling.security.group.provider": "Enabling Security Group provider",
-    "message.enabling.vpc.offering": "Enabling VPC offering",
-    "message.enabling.zone": "Enabling zone",
-    "message.enabling.zone.dots": "Enabling zone...",
-    "message.enter.seperated.list.multiple.cidrs": "Please enter a comma separated list of CIDRs if more than one",
-    "message.enter.token": "Please enter the token that you were given in your invite e-mail.",
-    "message.generate.keys": "Si us plau confirmeu que voleu generar noves claus per aquest usuari.",
-    "message.gslb.delete.confirm": "Please confirm you want to delete this GSLB",
-    "message.gslb.lb.remove.confirm": "Please confirm you want to remove load balancing from GSLB",
-    "message.guest.traffic.in.advanced.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network.",
-    "message.guest.traffic.in.basic.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range.",
-    "message.host.dedicated": "Host Dedicated",
-    "message.host.dedication.released": "Host dedication released",
-    "message.installWizard.click.retry": "Feu clic al botó per tornar a intentar l'inici.",
-    "message.installWizard.copy.whatIsACluster": "A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Virtual machine instances (VMs) can be live-migrated from one host to another within the same cluster, without interrupting service to the user. A cluster is the third-largest organizational unit within a CloudStack&#8482; deployment. Clusters are contained within pods, and pods are contained within zones.<br/><br/>CloudStack&#8482; allows multiple clusters in a cloud deployment, but for a Basic Installation, we only need one cluster.",
-    "message.installWizard.copy.whatIsAHost": "A host is a single computer. Hosts provide the computing resources that run the guest virtual machines. Each host has hypervisor software installed on it to manage the guest VMs (except for bare metal hosts, which are a special case discussed in the Advanced Installation Guide). For example, a Linux KVM-enabled server, a Citrix XenServer server, and an ESXi server are hosts. In a Basic Installation, we use a single host running XenServer or KVM.<br/><br/>The host is the smallest organizational unit within a CloudStack&#8482; deployment. Hosts are contained within clusters, clusters are contained within pods, and pods are contained within zones.",
-    "message.installWizard.copy.whatIsAPod": "A pod often represents a single rack. Hosts in the same pod are in the same subnet.<br/><br/>A pod is the second-largest organizational unit within a CloudStack&#8482; deployment. Pods are contained within zones. Each zone can contain one or more pods; in the Basic Installation, you will have just one pod in your zone.",
-    "message.installWizard.copy.whatIsAZone": "A zone is the largest organizational unit within a CloudStack&#8482; deployment. A zone typically corresponds to a single datacenter, although it is permissible to have multiple zones in a datacenter. The benefit of organizing infrastructure into zones is to provide physical isolation and redundancy. For example, each zone can have its own power supply and network uplink, and the zones can be widely separated geographically (though this is not required).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack&#8482 manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack&#8482 to deploy, manage, and configure cloud computing environments.<br/><br/>Extending beyond individual virtual machine images running on commodity hardware, CloudStack&#8482 provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications. Both open-source and Premium versions are available, with the open-source version offering nearly identical features.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "A CloudStack&#8482; cloud infrastructure makes use of two types of storage: primary storage and secondary storage. Both of these can be iSCSI or NFS servers, or localdisk.<br/><br/><strong>Primary storage</strong> is associated with a cluster, and it stores the disk volumes of each guest VM for all the VMs running on hosts in that cluster. The primary storage server is typically located close to the hosts.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "L'emmagatzemament secundari s'associa amb una zona, i emmagatzema el següent:<ul><li>Plantilles - Imatges de SO que es poden fer servir per arrencar MVs i poden incloure altra informació de configuració, com ara aplicacions instal·lades</li><li>Imatges ISO - Imatges de SO que poden ser arrencables o no</li><li>Snapshots de disc - copies guardades de dades de MV que poden usar-se per recuperació de dades o crear altres plantilles</ul>",
-    "message.installWizard.now.building": "Now building your cloud...",
-    "message.installWizard.tooltip.addCluster.name": "Un nom per al cluster. Pot ser un text de la seva elecció i no utilitzat per CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "El nom DNS o adreça de l'amfitrió \"host\".",
-    "message.installWizard.tooltip.addHost.password": "Aquesta és la contrasenya per a l'usuari del d'amunt (des de la instal·lació de XenServer).",
-    "message.installWizard.tooltip.addHost.username": "Normalment root",
-    "message.installWizard.tooltip.addPod.name": "Un nom per al pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Aquest és el rang IP a la xarxa privada que el CloudStack fa servir per administrar MVs per al Secondary Storage i Proxy de consoles. Aquestes IP es prenen de la mateixa sub-xarxa que els servidors de virtualització.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "La passarel·la per als amfitrions en aquest pot.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "La màscara de xarxa en ús en la subxarxa dels clients a utilitzar",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Aquest és el rang IP a la xarxa privada que el CloudStack fa servir per administrar MVs per al Secondary Storage i Proxy de consoles. Aquestes IP es prenen de la mateixa sub-xarxa que els servidors de virtualització.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "El nom per al dispositiu d'emmagatzematge",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(per a NFS) A NFS, aquest és el camí exportat des del servidor. Camí (per SharedMountPoint). Amb KVM aquest és el camí a cada host on es munta el emmagatzemament primari. Per exemple, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(per NFS, iSCSI, o PreSetup) La adreça IP o nom DNS del dispositiu d'emmagatzematge.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "L'adreça IP del servidor NFS que allotja l'emmagatzematge secundari",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "La ruta d'exportació, que es troba en el servidor que s'ha especificat anteriorment",
-    "message.installWizard.tooltip.addZone.dns1": "These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.dns2": "These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.internaldns1": "These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.internaldns2": "These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.name": "A name for the zone",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Una descripció de la xarxa",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "La passarel·la que els convidats han d'utilitzar",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "La màscara de xarxa en ús en la subxarxa que els clients han d'utilitzar",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Un nom per a la teva xarxa",
-    "message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
-    "message.instanceWizard.noTemplates": "No teniu cap plantilla disponible; si us plau afegiu una plantilla disponible i torneu a usar l'assistent.",
-    "message.ip.address.changed": "Your IP addresses may have changed; would you like to refresh the listing? Note that in this case the details pane will close.",
-    "message.iso.desc": "Disc image containing data or bootable media for OS",
-    "message.join.project": "Us heu unit a un projecte. Si us pla canvieu a vista de projecte per veure el projecte.",
-    "message.launch.vm.on.private.network": "Do you wish to launch your instance on your own private dedicated network?",
-    "message.launch.zone": "Zone is ready to launch; please proceed to the next step.",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Please confirm that you want to lock this account.  By locking the account, all users for this account will no longer be able to manage their cloud resources.  Existing resources can still be accessed.",
-    "message.migrate.instance.confirm": "Please confirm the host you wish to migrate the virtual instance to.",
-    "message.migrate.instance.to.host": "Si us plau, confirmi que vol migrar la instància a un altra  amfitrió \"host\"",
-    "message.migrate.instance.to.ps": "Si us plau, confirmi que vol migrar la instància a un altra emmagatzematge primari.",
-    "message.migrate.router.confirm": "Si us plau confirmeu que voleu migrar el router a:",
-    "message.migrate.systemvm.confirm": "Si us plau confirmeu que voleu migrar la MV de sistema a:",
-    "message.migrate.volume": "Please confirm that you want to migrate volume to another primary storage.",
-    "message.network.addVM.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-    "message.network.addVMNIC": "Please confirm that you would like to add a new VM NIC for this network.",
-    "message.network.remote.access.vpn.configuration": "Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-    "message.new.user": "Specify the following to add a new user to the account",
-    "message.no.affinity.groups": "You do not have any affinity groups. Please continue to the next step.",
-    "message.no.host.available": "No Hosts are available for Migration",
-    "message.no.network.support": "Your selected hypervisor, vSphere, does not have any additional network features.  Please continue to step 5.",
-    "message.no.network.support.configuration.not.true": "You do not have any zone that has security group enabled. Thus, no additional network features.  Please continue to step 5.",
-    "message.no.projects": "No teniu cap projecte.<br/>Si us plau creeu-ne un des de la secció de projecte.",
-    "message.no.projects.adminOnly": "No teniu cap projecte.<br/>Si us plau demaneu a l'administrador que us en crei un.",
-    "message.number.clusters": "<h2><span> # of </span> Clusters</h2>",
-    "message.number.hosts": "<h2><span> # of </span> Hosts</h2>",
-    "message.number.pods": "<h2><span> # of </span> Pods</h2>",
-    "message.number.storage": "<h2><span> # of </span> Primary Storage Volumes</h2>",
-    "message.number.zones": "<h2><span> # of </span> Zones</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Password has been reset to",
-    "message.password.of.the.vm.has.been.reset.to": "Password of the VM has been reset to",
-    "message.pending.projects.1": "Teniu invitacions pendents.",
-    "message.pending.projects.2": "Per veure, si us plau aneu a la secció de projectes, i sel·leccioneu invitacions al desplegable.",
-    "message.please.add.at.lease.one.traffic.range": "Please add at least one traffic range.",
-    "message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
-    "message.please.proceed": "Please proceed to the next step.",
-    "message.please.select.a.configuration.for.your.zone": "Please select a configuration for your zone.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Please select a different public and management network before removing",
-    "message.please.select.networks": "Please select networks for your virtual machine.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Please select a ssh key pair you want this VM to use:",
-    "message.please.wait.while.zone.is.being.created": "Please wait while your zone is being created; this may take a while...",
-    "message.pod.dedication.released": "Pod dedication released",
-    "message.portable.ip.delete.confirm": "Please confirm you want to delete Portable IP Range",
-    "message.project.invite.sent": "Invitació enviada a l'usuari; serà afegit al projecte quan accepti l'invitació",
-    "message.public.traffic.in.advanced.zone": "Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.<br/><br/>Provide at least one range of IP addresses for internet traffic.",
-    "message.public.traffic.in.basic.zone": "Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP.",
-    "message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
-    "message.read.admin.guide.scaling.up": "Please read the dynamic scaling section in the admin guide before scaling up.",
-    "message.recover.vm": "Please confirm that you would like to recover this VM.",
-    "message.redirecting.region": "Redirecting to region...",
-    "message.reinstall.vm": "NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched.",
-    "message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
-    "message.remove.region": "Are you sure you want to remove this region from this management server?",
-    "message.remove.vpc": "Please confirm that you want to remove the VPC",
-    "message.remove.vpn.access": "Please confirm that you want to remove VPN access from the following user.",
-    "message.removed.ssh.key.pair": "Removed a SSH Key Pair",
-    "message.reset.VPN.connection": "Please confirm that you want to reset VPN connection",
-    "message.reset.password.warning.notPasswordEnabled": "The template of this instance was created without password enabled",
-    "message.reset.password.warning.notStopped": "Your instance must be stopped before attempting to change its current password",
-    "message.restart.mgmt.server": "Please restart your management server(s) for your new settings to take effect.",
-    "message.restart.mgmt.usage.server": "Please restart your management server(s) and usage server(s) for your new settings to take effect.",
-    "message.restart.network": "All services provided by this network will be interrupted. Please confirm that you want to restart this network.",
-    "message.restart.vpc": "Please confirm that you want to restart the VPC",
-    "message.restart.vpc.remark": "Please confirm that you want to restart the VPC <p><small><i>Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes</i>.</small></p>",
-    "message.restoreVM": "Do you want to restore the VM ?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Use <strong>Ctrl-click</strong> to select all applicable security groups)",
-    "message.select.a.zone": "A zone typically corresponds to a single datacenter. Multiple zones help make the cloud more reliable by providing physical isolation and redundancy.",
-    "message.select.affinity.groups": "Please select any affinity groups you want this VM to belong to:",
-    "message.select.instance": "Please select an instance.",
-    "message.select.iso": "Please select an ISO for your new virtual instance.",
-    "message.select.item": "Si us plau sel·leccioneu un article",
-    "message.select.security.groups": "Please select security group(s) for your new VM",
-    "message.select.template": "Please select a template for your new virtual instance.",
-    "message.select.tier": "Please select a tier",
-    "message.set.default.NIC": "Please confirm that you would like to make this NIC the default for this VM.",
-    "message.set.default.NIC.manual": "Please manually update the default NIC on the VM now.",
-    "message.setup.physical.network.during.zone.creation": "When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.<br/><br/><strong>Drag and drop one or more traffic types</strong> onto each physical network.",
-    "message.setup.physical.network.during.zone.creation.basic": "When adding a basic zone, you can set up one physical network, which corresponds to a NIC on the hypervisor. The network carries several types of traffic.<br/><br/>You may also <strong>drag and drop</strong> other traffic types onto the physical network.",
-    "message.setup.successful": "Instal·lació del cloud correcte!",
-    "message.snapshot.schedule": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-    "message.specifiy.tag.key.value": "Please specify a tag key and value",
-    "message.specify.url": "Please specify URL",
-    "message.step.1.continue": "Please select a template or ISO to continue",
-    "message.step.1.desc": "Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto.",
-    "message.step.2.continue": "Please select a service offering to continue",
-    "message.step.3.continue": "Please select a disk offering to continue",
-    "message.step.4.continue": "Please select at least one network to continue",
-    "message.step.4.desc": "Please select the primary network that your virtual instance will be connected to.",
-    "message.storage.traffic": "Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here.",
-    "message.suspend.project": "Esteu segurs de suspendre aquest projecte?",
-    "message.systems.vms.ready": "System VMs ready.",
-    "message.template.copying": "Template is being copied.",
-    "message.template.desc": "OS image that can be used to boot VMs",
-    "message.tier.required": "Tier is required",
-    "message.tooltip.dns.1": "Name of a DNS server for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.dns.2": "A second DNS server name for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.internal.dns.1": "Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-    "message.tooltip.internal.dns.2": "Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-    "message.tooltip.network.domain": "A DNS suffix that will create a custom domain name for the network that is accessed by guest VMs.",
-    "message.tooltip.pod.name": "A name for this pod.",
-    "message.tooltip.reserved.system.gateway": "The gateway for the hosts in the pod.",
-    "message.tooltip.reserved.system.netmask": "The network prefix that defines the pod subnet. Uses CIDR notation.",
-    "message.tooltip.zone.name": "A name for the zone.",
-    "message.update.os.preference": "Please choose a OS preference for this host.  All virtual instances with similar preferences will be first allocated to this host before choosing another.",
-    "message.update.resource.count": "Si us plau confirmeu que voleu actualitzar el comptatge de recursos per aquest compte.",
-    "message.update.ssl": "Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance:",
-    "message.update.ssl.failed": "Failed to update SSL Certificate.",
-    "message.update.ssl.succeeded": "Update SSL Certificates succeeded",
-    "message.validate.URL": "Please enter a valid URL.",
-    "message.validate.accept": "Please enter a value with a valid extension.",
-    "message.validate.creditcard": "Please enter a valid credit card number.",
-    "message.validate.date": "Please enter a valid date.",
-    "message.validate.date.ISO": "Please enter a valid date (ISO).",
-    "message.validate.digits": "Please enter only digits.",
-    "message.validate.email.address": "Please enter a valid email address.",
-    "message.validate.equalto": "Please enter the same value again.",
-    "message.validate.fieldrequired": "This field is required.",
-    "message.validate.fixfield": "Please fix this field.",
-    "message.validate.instance.name": "Instance name can not be longer than 63 characters. Only ASCII letters a~z, A~Z, digits 0~9, hyphen are allowed. Must start with a letter and end with a letter or a digit.",
-    "message.validate.invalid.characters": "Invalid characters found; please correct.",
-    "message.validate.max": "Please enter a value less than or equal to {0}.",
-    "message.validate.maxlength": "Please enter no more than {0} characters.",
-    "message.validate.minlength": "Please enter at least {0} characters.",
-    "message.validate.number": "Please enter a valid number.",
-    "message.validate.range": "Please enter a value between {0} and {1}.",
-    "message.validate.range.length": "Please enter a value between {0} and {1} characters long.",
-    "message.virtual.network.desc": "A dedicated virtualized network for your account.  The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router.",
-    "message.vm.create.template.confirm": "Create Template will reboot the VM automatically.",
-    "message.vm.review.launch": "Please review the following information and confirm that your virtual instance is correct before launch.",
-    "message.vnmc.available.list": "VNMC is not available from provider list.",
-    "message.vnmc.not.available.list": "VNMC is not available from provider list.",
-    "message.volume.create.template.confirm": "Please confirm that you wish to create a template for this disk volume.  Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
-    "message.you.must.have.at.least.one.physical.network": "You must have at least one physical network",
-    "message.your.cloudstack.is.ready": "Your CloudStack is ready!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Zone creation complete. Would you like to enable this zone?",
-    "message.zone.no.network.selection": "The zone you selected does not have any choices for network selection.",
-    "message.zone.step.1.desc": "Please select a network model for your zone.",
-    "message.zone.step.2.desc": "Please enter the following info to add a new zone",
-    "message.zone.step.3.desc": "Please enter the following info to add a new pod",
-    "message.zoneWizard.enable.local.storage": "WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:<br/><br/>1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.<br/><br/>2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.<br/><br/><br/>Would you like to continue?",
-    "messgae.validate.min": "Please enter a value greater than or equal to {0}.",
-    "mode": "Mode",
-    "network.rate": "Velocitat de xarxa",
-    "notification.reboot.instance": "Reboot instance",
-    "notification.start.instance": "Start instance",
-    "notification.stop.instance": "Stop instance",
-    "side.by.side": "Costat a costat",
-    "state.Accepted": "Acceptat",
-    "state.Active": "Actiu",
-    "state.Allocated": "Allocated",
-    "state.Allocating": "Allocating",
-    "state.BackedUp": "Backed Up",
-    "state.BackingUp": "Backing Up",
-    "state.Completed": "Complert",
-    "state.Creating": "Creant",
-    "state.Declined": "Declinat",
-    "state.Destroyed": "Destroyed",
-    "state.Disabled": "Deshabilitat",
-    "state.Enabled": "Habilitat",
-    "state.Error": "Error",
-    "state.Expunging": "Esborrant",
-    "state.Migrating": "Migrating",
-    "state.Pending": "Pendent",
-    "state.Ready": "Preparat",
-    "state.Running": "Running",
-    "state.Starting": "Arrencant",
-    "state.Stopped": "Stopped",
-    "state.Stopping": "Stopping",
-    "state.Suspended": "Suspés",
-    "state.detached": "Detached",
-    "title.upload.volume": "Upload Volume",
-    "ui.listView.filters.all": "All",
-    "ui.listView.filters.mine": "Mine"
-};
diff --git a/ui/legacy/l10n/de_DE.js b/ui/legacy/l10n/de_DE.js
deleted file mode 100644
index cfa2811..0000000
--- a/ui/legacy/l10n/de_DE.js
+++ /dev/null
@@ -1,2315 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP-Code",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP-Typ",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Geänderte Eintragseigenschaften",
-    "confirm.enable.s3": "Bitte fügen Sie die folgenden Informationen hinzu, um die Unterstützung für \"S3-backed Secondary Storage\" hinzuzufügen",
-    "confirm.enable.swift": "Bitte fügen Sie die folgenden Informationen hinzu, um die Unterstützung für Swift zu ermöglichen.",
-    "error.could.not.change.your.password.because.non.native.user": "Fehler! Ihr Passwort konnte nicht geändert werden, weil LDAP konfiguriert wurde.",
-    "error.could.not.enable.zone": "Zone konnte nicht aktiviert werden",
-    "error.installWizard.message": "Etwas ging schief; Sie können zurückgehen um mögliche Fehler zu beheben",
-    "error.invalid.username.password": "Ungültiger Benutzername oder ungültiges Passwort",
-    "error.login": "Ihr Benutzername / Passwort stimmt nicht mit unseren Aufzeichnungen überein.",
-    "error.menu.select": "Es ist nicht möglich dies auszuführen, weil nichts ausgewählt wurde.",
-    "error.mgmt.server.inaccessible": "Der Verwaltungsserver ist nicht erreichbar. Bitte versuche Sie es später noch einmal.",
-    "error.password.not.match": "Die Passwortfelder stimmen nicht überein",
-    "error.please.specify.physical.network.tags": "Netzwerk-Angebote sind nicht verfügbar solange Sie keine Tags für dieses physische Netzwerk aufführen.",
-    "error.session.expired": "Ihre Sitzung ist abgelaufen.",
-    "error.something.went.wrong.please.correct.the.following": "Etwas ging schief; bitte korrigieren Sie folgende Angaben",
-    "error.unable.to.reach.management.server": "Verwaltungsserver kann nicht erreicht werden",
-    "error.unresolved.internet.name": "Ihr Internetname kann nicht aufgelöst werden.",
-    "force.delete": "Erzwinge Löschung",
-    "force.delete.domain.warning": "Achtung: Diese Auswahl führt zu einer Löschung aller untergeordneten Domains und aller angeschlossenen Konten sowie ihrer Quellen.",
-    "force.remove": "Erzwinge Entfernung",
-    "force.remove.host.warning": "Achtung: Diese Auswahl wird CloudStack zum sofortigen Anhalten der virtuellen Maschine führen, bevor der Host vom Cluster entfernt wurde.",
-    "force.stop": "Erzwinge Stopp",
-    "force.stop.instance.warning": "Warnung: Das erwzungene Stoppen dieser Instanz sollte Ihre letzte Option sein. Es kann zu Datenverlust und inkonsistentem Zustand der virtuellen Maschine führen.",
-    "hint.no.host.tags": "Keine Host-Tags gefunden",
-    "hint.no.storage.tags": "Keine Speicher-Tags gefunden",
-    "hint.type.part.host.tag": "Teil eines Host-Tags eintragen",
-    "hint.type.part.storage.tag": "Teil eines Storage-Tags eintragen",
-    "image.directory": "Bildverzeichnis",
-    "inline": "Inline",
-    "instances.actions.reboot.label": "Instanz neu starten",
-    "label.CIDR.list": "CIDR-Liste",
-    "label.CIDR.of.destination.network": "CIDR des Zielnetzwerks",
-    "label.CPU.cap": "CPU Obergrenze",
-    "label.DHCP.server.type": "DHCP Server Type",
-    "label.DNS.domain.for.guest.networks": "DNS Domain für Gast-Netzwerke",
-    "label.ESP.encryption": "ESP-Verschlüsselung",
-    "label.ESP.hash": "ESP-Prüfsumme",
-    "label.ESP.lifetime": "ESP-Lebensdauer (Sekunde)",
-    "label.ESP.policy": "ESP-Richtlinie",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE-Verschlüsselung",
-    "label.IKE.hash": "IKE-Prüfsumme",
-    "label.IKE.lifetime": "IKE-Lebensdauer (Sekunde)",
-    "label.IKE.policy": "IKE-Richtlinie",
-    "label.IPsec.preshared.key": "IPsec Preshared-Schlüssel",
-    "label.LB.isolation": "LB-Isolation",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto-Protokollprofil",
-    "label.PA.threat.profile": "Palo Alto Threat Profil",
-    "label.PING.CIFS.password": "PING CIFS Passwort",
-    "label.PING.CIFS.username": "PING CIFS Benutzername",
-    "label.PING.dir": "PING-Verzeichnis",
-    "label.PING.storage.IP": "IP des externen Speichers anpingen",
-    "label.PreSetup": "Voreinstellung",
-    "label.Pxe.server.type": "PXE Server Type",
-    "label.SNMP.community": "SNMP Gemeinschaft",
-    "label.SNMP.port": "SNMP-Port",
-    "label.SR.name": "SR Name-Bezeichnung",
-    "label.SharedMountPoint": "Geteilter Einhängepunkt",
-    "label.TFTP.dir": "TFTP-Verzeichnis",
-    "label.VMFS.datastore": "VMFS-Datenspeicher",
-    "label.VMs.in.tier": "VMs in Ebene",
-    "label.VPC.limits": "VPC-Begrenzungen",
-    "label.VPC.router.details": "VPC-Routerdetails",
-    "label.VPN.connection": "VPN-Verbindung",
-    "label.VPN.customer.gateway": "VPN Customer Gateway",
-    "label.VPN.gateway": "VPN-Gateway",
-    "label.Xenserver.Tools.Version61plus": "Originale XS-Version ist 6.1+",
-    "label.about": "Über",
-    "label.about.app": "Über CloudStack",
-    "label.accept.project.invitation": "Projekteinladung annehmen",
-    "label.account": "Benutzerkonto",
-    "label.account.and.security.group": "Konto, Sicherheitsgruppe",
-    "label.account.details": "Kontodetails",
-    "label.account.id": "Benutzerkonto-ID",
-    "label.account.lower": "Konto",
-    "label.account.name": "Benutzerkonto-Name",
-    "label.account.specific": "Besonderheiten des Benutzerkontos",
-    "label.account.type": "Benutzerkontotyp",
-    "label.accounts": "Benutzerkonten",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL-Kennung",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL-Listenregeln",
-    "label.acl.name": "ACL-Name",
-    "label.acl.replaced": "ACL ersetzt",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Neue IP erwerben",
-    "label.acquire.new.secondary.ip": "Neue sekundäre IP erwerben",
-    "label.action": "Aktion",
-    "label.action.attach.disk": "Festplatte hinzufügen",
-    "label.action.attach.disk.processing": "Festplatte wird hinzugefügt....",
-    "label.action.attach.iso": "ISO hinzufügen",
-    "label.action.attach.iso.processing": "ISO wird hinzugefügt....",
-    "label.action.cancel.maintenance.mode": "Wartungsmodus abbrechen",
-    "label.action.cancel.maintenance.mode.processing": "Abbruch des Wartungsmodus",
-    "label.action.change.password": "Passwort ändern",
-    "label.action.change.service": "Dienst ändern",
-    "label.action.change.service.processing": "Dienst wird gewechselt....",
-    "label.action.configure.samlauthorization": "SAML SSO Autorisation konfigurieren",
-    "label.action.copy.ISO": "ISO kopieren",
-    "label.action.copy.ISO.processing": "ISO wird kopiert....",
-    "label.action.copy.template": "Vorlage kopieren",
-    "label.action.copy.template.processing": "Vorlage wird kopiert....",
-    "label.action.create.template": "Vorlage erstellen",
-    "label.action.create.template.from.vm": "Erstelle Vorlage aus VM",
-    "label.action.create.template.from.volume": "Vorlage vom Volumen erstellen",
-    "label.action.create.template.processing": "Vorlage wird erstellt....",
-    "label.action.create.vm": "Erstelle VM",
-    "label.action.create.vm.processing": "VM wird erstellt....",
-    "label.action.create.volume": "Volumen erstellen",
-    "label.action.create.volume.processing": "Volumen wird erstellt....",
-    "label.action.delete.IP.range": "IP-Bereich löschen",
-    "label.action.delete.IP.range.processing": "IP-Bereich wird gelöscht....",
-    "label.action.delete.ISO": "ISO löschen",
-    "label.action.delete.ISO.processing": "ISO wird gelöscht....",
-    "label.action.delete.account": "Benutzerkonto löschen",
-    "label.action.delete.account.processing": "Konto wird gelöscht....",
-    "label.action.delete.cluster": "Löschen des Clusters",
-    "label.action.delete.cluster.processing": "Cluster wird gelöscht....",
-    "label.action.delete.disk.offering": "Festplattenangebot löschen",
-    "label.action.delete.disk.offering.processing": "Festplattenangebot wird gelöscht....",
-    "label.action.delete.domain": "Löschen der Domain",
-    "label.action.delete.domain.processing": "Domäne wird gelöscht....",
-    "label.action.delete.firewall": "Firewall-Regel löschen",
-    "label.action.delete.firewall.processing": "Firewall wird gelöscht....",
-    "label.action.delete.ingress.rule": "Zutrittsregel löschen",
-    "label.action.delete.ingress.rule.processing": "Zutrittsregel wird gelöscht....",
-    "label.action.delete.load.balancer": "Lastverteilerregel löschen",
-    "label.action.delete.load.balancer.processing": "Lastverteiler wird gelöscht....",
-    "label.action.delete.network": "Löschen des Netzwerks",
-    "label.action.delete.network.processing": "Netzwerk wird gelöscht....",
-    "label.action.delete.nexusVswitch": "Nexus 1000v löschen",
-    "label.action.delete.nic": "NIC entfernen",
-    "label.action.delete.physical.network": "Physikalisches Netzwerk löschen",
-    "label.action.delete.pod": "Pod löschen",
-    "label.action.delete.pod.processing": "Pod wird gelöscht....",
-    "label.action.delete.primary.storage": "Hauptspeicher löschen",
-    "label.action.delete.primary.storage.processing": "Hauptspeicher wird gelöscht....",
-    "label.action.delete.secondary.storage": "Sekundärspeicher löschen",
-    "label.action.delete.secondary.storage.processing": "Sekundärspeicher wird gelöscht....",
-    "label.action.delete.security.group": "Sicherheitsgruppe löschen",
-    "label.action.delete.security.group.processing": "Sicherheitsgruppe wird gelöscht....",
-    "label.action.delete.service.offering": "Dienstangebot löschen",
-    "label.action.delete.service.offering.processing": "Dienstangebot wird gelöscht....",
-    "label.action.delete.snapshot": "Schnappschuss löschen",
-    "label.action.delete.snapshot.processing": "Schnappschuss wird gelöscht....",
-    "label.action.delete.system.service.offering": "Systemdienstangebot löschen",
-    "label.action.delete.template": "Vorlage löschen",
-    "label.action.delete.template.processing": "Vorlage wird gelöscht....",
-    "label.action.delete.user": "Benutzer löschen",
-    "label.action.delete.user.processing": "Benutzer wird gelöscht....",
-    "label.action.delete.volume": "Volumen löschen",
-    "label.action.delete.volume.processing": "Volumen wird gelöscht....",
-    "label.action.delete.zone": "Zone löschen",
-    "label.action.delete.zone.processing": "Zone wird gelöscht....",
-    "label.action.destroy.instance": "Die Instanz vernichten",
-    "label.action.destroy.instance.processing": "Instanz wird zerstört....",
-    "label.action.destroy.systemvm": "System-VM vernichten",
-    "label.action.destroy.systemvm.processing": "System-VM wird zerstört....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Festplatte loslösen",
-    "label.action.detach.disk.processing": "Festplatte wird losgelöst...",
-    "label.action.detach.iso": "ISO loslösen",
-    "label.action.detach.iso.processing": "ISO wird losgelöst....",
-    "label.action.disable.account": "Benutzerkonto deaktivieren",
-    "label.action.disable.account.processing": "Konto wird deaktiviert....",
-    "label.action.disable.cluster": "Deaktivieren des Clusters",
-    "label.action.disable.cluster.processing": "Cluster wird deaktiviert....",
-    "label.action.disable.nexusVswitch": "Nexus 1000v deaktivieren",
-    "label.action.disable.physical.network": "Physikalisches Netzwerk deaktivieren",
-    "label.action.disable.pod": "Deaktiviere Pod",
-    "label.action.disable.pod.processing": "Pod wird deaktiviert....",
-    "label.action.disable.static.NAT": "Statische NAT deaktivieren",
-    "label.action.disable.static.NAT.processing": "Statische NAT wird deaktiviert....",
-    "label.action.disable.user": "Benutzer deaktivieren",
-    "label.action.disable.user.processing": "Benutzer wird deaktiviert....",
-    "label.action.disable.zone": "Deaktivieren der Zone",
-    "label.action.disable.zone.processing": "Zone wird deaktiviert....",
-    "label.action.download.ISO": "ISO herunterladen",
-    "label.action.download.template": "Vorlage herunterladen",
-    "label.action.download.volume": "Volumen herunterladen",
-    "label.action.download.volume.processing": "Volumen wird heruntergeladen....",
-    "label.action.edit.ISO": "ISO bearbeiten",
-    "label.action.edit.account": "Benutzerkonto bearbeiten",
-    "label.action.edit.disk.offering": "Festplattenangebot bearbeiten",
-    "label.action.edit.domain": "Domain bearbeiten",
-    "label.action.edit.global.setting": "Globale Einstellungen bearbeiten",
-    "label.action.edit.host": "Bearbeite Host",
-    "label.action.edit.instance": "Instanz bearbeiten",
-    "label.action.edit.network": "Bearbeiten des Netzwerks",
-    "label.action.edit.network.offering": "Netzwerkangebot bearbeiten",
-    "label.action.edit.network.processing": "Netzwerk wird bearbeitet....",
-    "label.action.edit.pod": "Bearbeiten des Pods",
-    "label.action.edit.primary.storage": "Hauptspeicher bearbeiten",
-    "label.action.edit.resource.limits": "Resourcenlimit bearbeiten",
-    "label.action.edit.service.offering": "Dienstangebot bearbeiten",
-    "label.action.edit.template": "Vorlage bearbeiten",
-    "label.action.edit.user": "Benutzer bearbeiten",
-    "label.action.edit.zone": "Zone bearbeiten",
-    "label.action.enable.account": "Konto aktivieren",
-    "label.action.enable.account.processing": "Konto wird aktiviert....",
-    "label.action.enable.cluster": "Aktivieren des Clusters",
-    "label.action.enable.cluster.processing": "Cluster wird aktiviert....",
-    "label.action.enable.maintenance.mode": "Wartungsmodus aktivieren",
-    "label.action.enable.maintenance.mode.processing": "Aktivieren des Wartungsmodus",
-    "label.action.enable.nexusVswitch": "Nexus 1000v aktivieren",
-    "label.action.enable.physical.network": "Physikalisches Netzwerk aktivieren",
-    "label.action.enable.pod": "Aktiviere Pod",
-    "label.action.enable.pod.processing": "Pod wird aktiviert....",
-    "label.action.enable.static.NAT": "Statische NAT aktivieren",
-    "label.action.enable.static.NAT.processing": "Statische NAT wird aktiviert....",
-    "label.action.enable.user": "Nutzer aktivieren",
-    "label.action.enable.user.processing": "Benutzer wird aktiviert....",
-    "label.action.enable.zone": "Aktivieren der Zone",
-    "label.action.enable.zone.processing": "Zone wird aktiviert....",
-    "label.action.expunge.instance": "Instanz unwiederbringlich löschen",
-    "label.action.expunge.instance.processing": "Lösche Instanz unwiederbringlich...",
-    "label.action.force.reconnect": "Erzwinge wieder verbinden",
-    "label.action.force.reconnect.processing": "Wieder verbinden....",
-    "label.action.generate.keys": "Schlüssel generieren",
-    "label.action.generate.keys.processing": "Generiere Schlüssel...",
-    "label.action.list.nexusVswitch": "Nexus 1000v auflisten",
-    "label.action.lock.account": "Konto sperren",
-    "label.action.lock.account.processing": "Konto wird gesperrt....",
-    "label.action.manage.cluster": "Verwalte Cluster",
-    "label.action.manage.cluster.processing": "Cluster wird verwaltet....",
-    "label.action.migrate.instance": "Eine Instanz migrieren",
-    "label.action.migrate.instance.processing": "Instanz migrieren",
-    "label.action.migrate.router": "Router migrieren",
-    "label.action.migrate.router.processing": "Router wird migriert....",
-    "label.action.migrate.systemvm": "System-VM migrieren",
-    "label.action.migrate.systemvm.processing": "System-VM wird migriert....",
-    "label.action.reboot.instance": "Instanz neu starten",
-    "label.action.reboot.instance.processing": "Instanz wird neu gebootet...",
-    "label.action.reboot.router": "Router neu starten",
-    "label.action.reboot.router.processing": "Router wird neu gebootet....",
-    "label.action.reboot.systemvm": "System-VM neu starten",
-    "label.action.reboot.systemvm.processing": "System-VM wird neu gebootet....",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Wiederkehrende Schnappschüsse",
-    "label.action.register.iso": "ISO registrieren",
-    "label.action.register.template": "Vorlage von URL registrieren",
-    "label.action.release.ip": "IP loslösen",
-    "label.action.release.ip.processing": "IP wird losgelöst....",
-    "label.action.remove.host": "Host entfernen",
-    "label.action.remove.host.processing": "Host wird entfernt....",
-    "label.action.reset.password": "Passwort zurücksetzen",
-    "label.action.reset.password.processing": "Passwort wird zurückgesetzt....",
-    "label.action.resize.volume": "Volumengröße ändern",
-    "label.action.resize.volume.processing": "Volumengröße wird geändert....",
-    "label.action.resource.limits": "Ressourcenlimits",
-    "label.action.restore.instance": "Instanz wiederherstellen",
-    "label.action.restore.instance.processing": "Instanz wird wiederhergestellt....",
-    "label.action.revert.snapshot": "Auf Schnappschuss zurückkehren",
-    "label.action.revert.snapshot.processing": "Es wird auf den Schnappschuss zurückgekehrt...",
-    "label.action.start.instance": "Instanz beginnen",
-    "label.action.start.instance.processing": "Instanz wird gestartet....",
-    "label.action.start.router": "Router starten",
-    "label.action.start.router.processing": "Router wird gestartet....",
-    "label.action.start.systemvm": "System-VM starten",
-    "label.action.start.systemvm.processing": "System-VM wird gestartet....",
-    "label.action.stop.instance": "Instanz stoppen",
-    "label.action.stop.instance.processing": "Instanz wird gestartet....",
-    "label.action.stop.router": "Router stoppen",
-    "label.action.stop.router.processing": "Routers wird gestoppt....",
-    "label.action.stop.systemvm": "System-VM stoppen",
-    "label.action.stop.systemvm.processing": "System-VM wird gestoppt....",
-    "label.action.take.snapshot": "Schnappschuss erstellen",
-    "label.action.take.snapshot.processing": "Schnappschuss wird gemacht....",
-    "label.action.unmanage.cluster": "Vernachlässige Cluster",
-    "label.action.unmanage.cluster.processing": "Cluster wird nicht mehr verwaltet....",
-    "label.action.update.OS.preference": "Betriebssystem Präverenz aktualisieren",
-    "label.action.update.OS.preference.processing": "Betriebssystemeinstellung wird aktualisiert....",
-    "label.action.update.resource.count": "Ressourcenanzahl aktualisieren",
-    "label.action.update.resource.count.processing": "Ressourcenanzahl wird aktualisiert....",
-    "label.action.vmsnapshot.create": "VM-Schnappschuss machen",
-    "label.action.vmsnapshot.delete": "VM-Schnappschuss löschen",
-    "label.action.vmsnapshot.revert": "Auf VM-Schnappschuss zurückkehren",
-    "label.action.vmstoragesnapshot.create":"VM Speicher-Schnappschuss machen",
-    "label.actions": "Aktionen",
-    "label.activate.project": "Projekt aktivieren",
-    "label.active.sessions": "Aktive Sitzungen",
-    "label.add": "Hinzufügen",
-    "label.add.ACL": "ACL hinzufügen",
-    "label.add.BigSwitchBcf.device": "Füge BigSwitch BCF Controller hinzu",
-    "label.add.BrocadeVcs.device": "Brocade Vcs Switch hinzufügen",
-    "label.add.F5.device": "F5-Gerät hinzufügen",
-    "label.add.LDAP.account": "LDAP-Konto hinzufügen",
-    "label.add.NiciraNvp.device": "Nvp Controller hinzufügen",
-    "label.add.OpenDaylight.device": "OpenDaylight Controller hinzufügen",
-    "label.add.PA.device": "Palo Alto-Gerät hinzufügen",
-    "label.add.SRX.device": "SRX-Gerät hinzufügen",
-    "label.add.VM.to.tier": "VM zur Ebene hinzufügen",
-    "label.add.VPN.gateway": "VPN Gateway hinzufügen",
-    "label.add.account": "Konto hinzufügen",
-    "label.add.account.to.project": "Konto zu Projekt hinzufügen",
-    "label.add.accounts": "Konten hinzufügen",
-    "label.add.accounts.to": "Konten hinzufügen zu",
-    "label.add.acl.list": "ACL-Liste hinzufügen",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Neue Affinitätsgruppe hinzufügen",
-    "label.add.baremetal.dhcp.device": "Baremetal DHCP-Gerät hinzufügen",
-    "label.add.baremetal.rack.configuration": "Baremetal Rackkonfiguration hinzufügen",
-    "label.add.by": "Hinzugefügt von",
-    "label.add.by.cidr": "Hinzufügen durch CIDR",
-    "label.add.by.group": "Hinzufügen durch Gruppe",
-    "label.add.ciscoASA1000v": "CiscoASA1000v-Ressource hinzufügen",
-    "label.add.cluster": "Cluster hinzufügen",
-    "label.add.compute.offering": "Berechnungsangebot hinzufügen",
-    "label.add.direct.iprange": "Direkten IP-Bereich hinzufügen",
-    "label.add.disk.offering": "Festplattenangebot hinzufügen",
-    "label.add.domain": "Domain hinzufügen",
-    "label.add.egress.rule": "Egress-Regel hinzufügen",
-    "label.add.firewall": "Firewall-Regel hinzufügen",
-    "label.add.globo.dns": "GloboDNS hinzufügen",
-    "label.add.gslb": "GSLB hinzufügen",
-    "label.add.guest.network": "Gastnetzwerk hinzufügen",
-    "label.add.host": "Host hinzufügen",
-    "label.add.ingress.rule": "Zutrittsregel hinzufügen",
-    "label.add.intermediate.certificate": "Intermediate Zertifikat hinzufügen",
-    "label.add.internal.lb": "Interne LB hinzufügen",
-    "label.add.ip.range": "IP-Bereich hinzufügen",
-    "label.add.isolated.guest.network": "Isoliertes Gastnetzwerk hinzufügen",
-    "label.add.isolated.guest.network.with.sourcenat": "Isoliertes Gastnetzwerk mit Source-NAT hinzufügen",
-    "label.add.isolated.network": "Isoliertes Netzwerk hinzufügen",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "LDAP-Konto hinzufügen",
-    "label.add.list.name": "ACL-Listename",
-    "label.add.load.balancer": "Lastverteiler hinzufügen",
-    "label.add.more": "Mehr hinzufügen",
-    "label.add.netScaler.device": "Netscaler-Gerät hinzufügen",
-    "label.add.network": "Netzwerk hinzufügen",
-    "label.add.network.ACL": "Netzwerk-ACL hinzufügen",
-    "label.add.network.acl.list": "Netzwerk-ACL-Liste hinzufügen",
-    "label.add.network.device": "Hinzufügen eines Netzwerkgerätes",
-    "label.add.network.offering": "Netzwerkangebot hinzufügen",
-    "label.add.new.F5": "Neues F5 hinzufügen",
-    "label.add.new.NetScaler": "Neuer NetScaler hinzufügen",
-    "label.add.new.PA": "Neues Palo Alto hinzufügen",
-    "label.add.new.SRX": "Neuer SRX hinzufügen",
-    "label.add.new.gateway": "Neues Gateway hinzufügen",
-    "label.add.new.tier": "Neue Ebene hinzufügen",
-    "label.add.nfs.secondary.staging.store": "NFS Sekundär Staging Store hinzufügen",
-    "label.add.physical.network": "Physikalisches Netzwerk hinzufügen",
-    "label.add.pod": "Pod hinzufügen",
-    "label.add.port.forwarding.rule": "Portweiterleitungsregel hinzufügen",
-    "label.add.portable.ip.range": "Portablen IP-Bereich hinzufügen",
-    "label.add.primary.storage": "Hauptspeicher hinzufügen",
-    "label.add.private.gateway": "Privaten Gateway hinzufügen",
-    "label.add.region": "Region hinzufügen",
-    "label.add.resources": "Ressourcen hinzufügen",
-    "label.add.role": "Rolle hinzufügen",
-    "label.add.route": "Route hinzufügen",
-    "label.add.rule": "Regel hinzufügen",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Sekundärspeicher hinzufügen",
-    "label.add.security.group": "Sicherheitsgruppe hinzufügen",
-    "label.add.service.offering": "Dienstangebot hinzufügen",
-    "label.add.static.nat.rule": "Statische NAT-Regel hinzufügen",
-    "label.add.static.route": "Füge eine statische Route hinzu",
-    "label.add.system.service.offering": "Systemdienstangebot hinzufügen",
-    "label.add.template": "Vorlage hinzufügen",
-    "label.add.to.group": "Zu Gruppe hinzufügen",
-    "label.add.ucs.manager": "UCS Manager hinzufügen",
-    "label.add.user": "Benutzer hinzufügen",
-    "label.add.userdata": "Benutzerdaten",
-    "label.add.vlan": "VLAN hinzufügen",
-    "label.add.vm": "VM hinzufügen",
-    "label.add.vms": "VMs hinzufügen",
-    "label.add.vms.to.lb": "VM(s) zur Lastverteilerregel hinzufügen",
-    "label.add.vmware.datacenter": "VMware-Rechenzentrum hinzufügen",
-    "label.add.vnmc.device": "VNMC-Gerät hinzufügen",
-    "label.add.vnmc.provider": "VNMC-Anbieter hinzufügen",
-    "label.add.volume": "Volumen hinzufügen",
-    "label.add.vpc": "VPC hinzufügen",
-    "label.add.vpc.offering": "VPC-Angebot hinzufügen",
-    "label.add.vpn.customer.gateway": "VPN Customer Gateway hinzufügen",
-    "label.add.vpn.user": "VPN-Benutzer hinzufügen",
-    "label.add.vxlan": "VXLAN hinzufügen",
-    "label.add.zone": "Zone hinzufügen",
-    "label.added.brocade.vcs.switch": "Neuer Brocade Vcs Switch hinzugefügt",
-    "label.added.network.offering": "Netzwerkangebot hinzugefügt",
-    "label.added.new.bigswitch.bcf.controller": "Neuer BigSwitch BCF Controller hinzugefügt",
-    "label.added.nicira.nvp.controller": "Neuer Nicira NVP Controller hinzugefügt",
-    "label.addes.new.f5": "Neues F5 hinzugefügt",
-    "label.adding": "Hinzufügen",
-    "label.adding.cluster": "Cluster hinzufügen",
-    "label.adding.failed": "Hinzufügen fehlgeschlagen",
-    "label.adding.pod": "Hinzufügen des Pods",
-    "label.adding.processing": "Hinzufügen....",
-    "label.adding.succeeded": "Erfolgreich hinzugefügt",
-    "label.adding.user": "Nutzer hinzufügen",
-    "label.adding.zone": "Hinzufügen der Zone",
-    "label.additional.networks": "Zusätzliche Netzwerke",
-    "label.admin": "Administrator",
-    "label.admin.accounts": "Administratoren-Konten",
-    "label.advanced": "Weitergehend",
-    "label.advanced.mode": "Erweiterter Modus",
-    "label.advanced.search": "Erweiterte Suche",
-    "label.affinity": "Affinität",
-    "label.affinity.group": "Affinitätsgruppe",
-    "label.affinity.groups": "Affinitätsgruppen",
-    "label.agent.password": "Agent-Passwort",
-    "label.agent.port": "Agent-Port",
-    "label.agent.state": "Agent-Status",
-    "label.agent.username": "Agent-Benutzername",
-    "label.agree": "Zustimmen",
-    "label.alert": "Warnung",
-    "label.alert.archived": "Alarm archiviert",
-    "label.alert.deleted": "Alarm gelöscht",
-    "label.alert.details": "Alarmdetails",
-    "label.algorithm": "Algorithmus",
-    "label.allocated": "Zugeteilt",
-    "label.allocation.state": "Belegungszustand",
-    "label.allow": "Erlauben",
-    "label.anti.affinity": "Anti-Affinität",
-    "label.anti.affinity.group": "Anti-Affinitätsgruppe",
-    "label.anti.affinity.groups": "Anti-Affinitätsgruppen",
-    "label.api.key": "API Schlüssel",
-    "label.api.version": "API-Version",
-    "label.app.name": "CloudStack",
-    "label.apply": "Anwenden",
-    "label.archive": "Archiv",
-    "label.archive.alerts": "Alarme archivieren",
-    "label.archive.events": "Ereignisse archivieren",
-    "label.assign": "Zuweisen",
-    "label.assign.instance.another": "Instanz einem anderen Benutzerkonto zuweisen",
-    "label.assign.to.load.balancer": "Instanz zum Lastverteiler hinzufügen",
-    "label.assign.vms": "VMs zuweisen",
-    "label.assigned.vms": "Zugewiesene VMs",
-    "label.associate.public.ip": "Öffentliche IP assoziieren",
-    "label.associated.network": "Zugehöriges Netzwerk",
-    "label.associated.network.id": "Assozierte Netzwerk ID",
-    "label.associated.profile": "Zugehöriges Profil",
-    "label.attached.iso": "Angehängte ISO",
-    "label.author.email": "Autoremail",
-    "label.author.name": "Autorname",
-    "label.autoscale": "Automatische Skalierung",
-    "label.autoscale.configuration.wizard": "Eingabehilfe der Autoskalierungs-Konfiguration",
-    "label.availability": "Verfügbarkeit",
-    "label.availability.zone": "Verfügbare Zone",
-    "label.availabilityZone": "Verfügbarkeitszone",
-    "label.available": "Verfügbar",
-    "label.available.public.ips": "Verfügbaren öffentlichen IP-Adressen",
-    "label.back": "Zurück",
-    "label.bandwidth": "Bandbreite",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP-Geräte",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP-Provider",
-    "label.baremetal.pxe.device": "Baremetal PXE-Gerät hinzufügen",
-    "label.baremetal.pxe.devices": "Baremetal PXE-Geräte",
-    "label.baremetal.pxe.provider": "Baremetal PXE-Provider",
-    "label.baremetal.rack.configuration": "Barematel Rackkonfiguration",
-    "label.basic": "Basis",
-    "label.basic.mode": "Grundmodus",
-    "label.bigswitch.bcf.details": "BigSwitch BCF Details",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT aktiviert",
-    "label.bigswitch.controller.address": "Adresse des BigSwitch BCF Controllers",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "Bootbar",
-    "label.broadcast.domain.range": "Broadcast-Domain Bereich",
-    "label.broadcast.domain.type": "Broadcast Domain Typ",
-    "label.broadcast.uri": "Broadcast URI",
-    "label.broadcasturi": "Broadcast-URI",
-    "label.broadcat.uri": "Broadcast URI",
-    "label.brocade.vcs.address": "Vcs Switch Adresse",
-    "label.brocade.vcs.details": "Brocade Vcs Switch Details",
-    "label.by.account": "Nach Benutzerkonto",
-    "label.by.alert.type": "Nach Alarmtyp",
-    "label.by.availability": "Nach Verfügbarkeit",
-    "label.by.date.end": "Nach Datum (Ende)",
-    "label.by.date.start": "Nach Datum (Start)",
-    "label.by.domain": "Nach Domain",
-    "label.by.end.date": "Nach Endedatum",
-    "label.by.event.type": "Nach Ereignistyp",
-    "label.by.level": "Nach Level",
-    "label.by.pod": "Nach Pod",
-    "label.by.role": "Nach Rolle",
-    "label.by.start.date": "Nach Beginndatum",
-    "label.by.state": "über den Zustand",
-    "label.by.traffic.type": "Nach Traffic-Typ",
-    "label.by.type": "Nach Typ",
-    "label.by.type.id": "Nach Typ ID",
-    "label.by.zone": "Nach Zone",
-    "label.bytes.received": "Empfangene Bytes",
-    "label.bytes.sent": "Gesendete Bytes",
-    "label.cache.mode": "Schreib-Cache-Typ",
-    "label.cancel": "Abbrechen",
-    "label.capacity": "Kapazität",
-    "label.capacity.bytes": "Kapazitäts-Bytes",
-    "label.capacity.iops": "Kapazitäts-IOPS",
-    "label.certificate": "Serverzertifikat",
-    "label.change.affinity": "Affinität ändern",
-    "label.change.ipaddress": "Ändern der IP Adresse für das NIC",
-    "label.change.service.offering": "Dienstangebot ändern",
-    "label.change.value": "Wert ändern",
-    "label.character": "Buchstabe",
-    "label.chassis": "Chassis",
-    "label.checksum": "Prüfsumme",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR oder Benutzerkonto/Sicherheitsgruppe",
-    "label.cidr.list": "Quelle CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v-IP-Adresse",
-    "label.cisco.nexus1000v.password": "Nexus 1000v-Passwort",
-    "label.cisco.nexus1000v.username": "Nexus 1000v-Benutzername",
-    "label.ciscovnmc.resource.details": "CiscoVNMC-Ressourcendetails",
-    "label.clean.up": "Bereinigen",
-    "label.clear.list": "Liste löschen",
-    "label.close": "Schliessen",
-    "label.cloud.console": "Cloud Verwaltungskonsole",
-    "label.cloud.managed": "Geleitet von cloud.com",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Clustername",
-    "label.cluster.type": "Cluster-Typ",
-    "label.clusters": "Cluster",
-    "label.clvm": "CLVM",
-    "label.code": "Code",
-    "label.community": "Gemeinschaft",
-    "label.compute": "Berechnen",
-    "label.compute.and.storage": "Berechnen und Speicher",
-    "label.compute.offering": "Berechnungsangebot",
-    "label.compute.offerings": "Berechnungsangebote",
-    "label.configuration": "Konfiguration",
-    "label.configure": "Konfigurieren",
-    "label.configure.ldap": "LDAP konfigurieren",
-    "label.configure.network.ACLs": "Netzwerk-ACLs konfigurieren",
-    "label.configure.sticky.policy": "Sticky-Richtlinie konfigurieren",
-    "label.configure.vpc": "VPC konfigurieren",
-    "label.confirm.password": "Passwort bestätigen",
-    "label.confirmation": "Bestätigung",
-    "label.congratulations": "Herzlichen Glückwunsch",
-    "label.conserve.mode": "Konserven-Modus",
-    "label.console.proxy": "Konsolenproxy",
-    "label.console.proxy.vm": "Konsolenproxy-VM",
-    "label.continue": "Fortsetzen",
-    "label.continue.basic.install": "Weiterfahren mit Basisinstallation",
-    "label.copying.iso": "ISO wird kopiert",
-    "label.corrections.saved": "Korrekturen gespeichert",
-    "label.counter": "Zähler",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "Zugeteilte CPU",
-    "label.cpu.allocated.for.VMs": "CPU alloziert für VMs",
-    "label.cpu.limits": "CPU-Begrenzungen",
-    "label.cpu.mhz": "CPU (in MHz)",
-    "label.cpu.utilized": "genutzte CPU",
-    "label.create.VPN.connection": "VPN-Verbindung erstellen",
-    "label.create.nfs.secondary.staging.storage": "NFS sekundärer Staging Store erstellen",
-    "label.create.nfs.secondary.staging.store": "NFS sekundärer Staging Store erstellen",
-    "label.create.project": "Projekt erstellen",
-    "label.create.ssh.key.pair": "Erstelle ein SSH-Schlüsselpaar",
-    "label.create.template": "Vorlage erstellen",
-    "label.created": "Erstellt",
-    "label.created.by.system": "Vom System erstellt",
-    "label.cross.zones": "überschneidende Zonen",
-    "label.custom": "Benutzerdefiniert",
-    "label.custom.disk.iops": "Benutzerspezifische IOPS",
-    "label.custom.disk.offering": "Benutzerdefiniertes Festplattenangebot",
-    "label.custom.disk.size": "Benutzerdefinierte Festplattengrösse",
-    "label.daily": "Täglich",
-    "label.data.disk.offering": "Datenspeicherplatzangebot",
-    "label.date": "Datum",
-    "label.day": "Tag",
-    "label.day.of.month": "Tag des Monats",
-    "label.day.of.week": "Tag der Woche",
-    "label.dc.name": "DC-Name",
-    "label.dead.peer.detection": "Dead-Peer-Erkennung",
-    "label.decline.invitation": "Einladung ablehnen",
-    "label.dedicate": "Dedizieren",
-    "label.dedicate.cluster": "Dediziere Cluster",
-    "label.dedicate.host": "Dediziere Host",
-    "label.dedicate.pod": "Dediziere Pod",
-    "label.dedicate.vlan.vni.range": "Dedizierter VLAN/VNI Bereich",
-    "label.dedicate.zone": "Zone dedizieren",
-    "label.dedicated": "Dediziert",
-    "label.dedicated.vlan.vni.ranges": "Dedizierte VLAN/VNI Bereiche",
-    "label.default": "Standard",
-    "label.default.egress.policy": "Standard Egress Richtlinie",
-    "label.default.use": "Standardeinstellung nutzen",
-    "label.default.view": "Standardansicht",
-    "label.delete": "Löschen",
-    "label.delete.BigSwitchBcf": "BigSwitch BCF Controller entfernen",
-    "label.delete.BrocadeVcs": "Brocade Vcs Switch löschen",
-    "label.delete.F5": "F5 löschen",
-    "label.delete.NetScaler": "Lösche NetScaler",
-    "label.delete.NiciraNvp": "Entferne Nvp Controller",
-    "label.delete.OpenDaylight.device": "OpenDaylight Controller löschen",
-    "label.delete.PA": "Palo Alto löschen",
-    "label.delete.SRX": "SRX löschen",
-    "label.delete.VPN.connection": "VPN-Verbindung löschen",
-    "label.delete.VPN.customer.gateway": "VPN Customer Gateway löschen",
-    "label.delete.VPN.gateway": "VPN-Gateway löschen",
-    "label.delete.acl.list": "ACL-Liste ersetzen",
-    "label.delete.affinity.group": "Affinitätsgruppe entfernen",
-    "label.delete.alerts": "Alarme löschen",
-    "label.delete.baremetal.rack.configuration": "Barematel Rackkonfiguration entfernen",
-    "label.delete.ciscoASA1000v": "CiscoASA1000v löschen",
-    "label.delete.ciscovnmc.resource": "CiscoVNMC-Ressource löschen",
-    "label.delete.events": "Ereignisse löschen",
-    "label.delete.gateway": "Lösche Gateway",
-    "label.delete.internal.lb": "Interne LB löschen",
-    "label.delete.portable.ip.range": "Portablen IP-Bereich löschen",
-    "label.delete.profile": "Profil löschen",
-    "label.delete.project": "Projekt löschen",
-    "label.delete.role": "Rolle löschen",
-    "label.delete.secondary.staging.store": "Sekundärer Staging Store löschen",
-    "label.delete.ucs.manager": "UCS Manager löschen",
-    "label.delete.vpn.user": "VPN-Benutzer löschen",
-    "label.deleting.failed": "Löschen fehlgeschlagen",
-    "label.deleting.processing": "Lösche....",
-    "label.deny": "Verweigern",
-    "label.deployment.planner": "Deployment-Planer",
-    "label.description": "Beschreibung",
-    "label.destination.physical.network.id": "Physiche Netzwerk-ID des Zielorts",
-    "label.destination.zone": "Zielzone",
-    "label.destroy": "Zerstören",
-    "label.destroy.router": "Router zerstören",
-    "label.destroy.vm.graceperiod": "Gnadenfrist bis zur Zerstörung der VM",
-    "label.detaching.disk": "Entfernen der Festplatte",
-    "label.details": "Details",
-    "label.device.id": "Geräte-ID",
-    "label.devices": "Geräte",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direkt angeschlossene öffentliche IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Gemeinsame Netzwerk-IPs",
-    "label.disable.autoscale": "Automatische Skalierung deaktivieren",
-    "label.disable.host": "Host deaktivieren",
-    "label.disable.network.offering": "Netzwerkangebot deaktivieren",
-    "label.disable.provider": "Anbieter deaktivieren",
-    "label.disable.vnmc.provider": "VNMC-Anbieter deaktivieren",
-    "label.disable.vpc.offering": "VPC-Angebot deaktivieren",
-    "label.disable.vpn": "Fernzugriff-VPN deaktivieren",
-    "label.disabled": "Deaktiviert",
-    "label.disabling.vpn.access": "Deaktivierung des VPN Zugangs",
-    "label.disassociate.profile.blade": "Verbindung vom Profil zum Blade entfernen",
-    "label.disbale.vnmc.device": "VNMC-Gerät deaktivieren",
-    "label.disk.allocated": "Zugeordnete Festplatte",
-    "label.disk.bytes.read.rate": "Festplatten-Leserate (BPS)",
-    "label.disk.bytes.write.rate": "Festplatten-Schreibrate (BPS)",
-    "label.disk.iops.max": "Max IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Festplatten-Leserate (IOPS)",
-    "label.disk.iops.total": "Gesamte IOPS",
-    "label.disk.iops.write.rate": "Festplatten-Schreibrate (IOPS)",
-    "label.disk.offering": "Festplattenangebot",
-    "label.disk.offering.details": "Festplattenangebotdetails",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisionierungstyp",
-    "label.disk.read.bytes": "Festplatte Lesen (Bytes)",
-    "label.disk.read.io": "Festplatte Lesen (EA)",
-    "label.disk.size": "Festplattengröße",
-    "label.disk.size.gb": "Festplattengröße (in GB)",
-    "label.disk.total": "Gesamtzahl der Festplatten",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Festplattenvolumen",
-    "label.disk.write.bytes": "Festplatte Schreiben (Bytes)",
-    "label.disk.write.io": "Festplatte Schreiben (EA)",
-    "label.diskoffering": "Festplattenangebot",
-    "label.display.name": "Anzeigename",
-    "label.display.text": "Anzeigetext",
-    "label.distributedrouter": "Verteilter Router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domain",
-    "label.domain.admin": "Domain Administrator",
-    "label.domain.details": "Nährere Angaben zu Domains",
-    "label.domain.id": "Domain ID",
-    "label.domain.lower": "Domäne",
-    "label.domain.name": "Domain Name",
-    "label.domain.router": "Domain Router",
-    "label.domain.suffix": "DNS Domainsuffix (z.B. xzy.com)",
-    "label.done": "Fertig",
-    "label.double.quotes.are.not.allowed": "Anführungszeichen sind nicht erlaubt",
-    "label.download.progress": "Download-Fortschritt",
-    "label.drag.new.position": "Ziehe zu neuer Position",
-    "label.duration.in.sec": "Dauer (in Sekunden)",
-    "label.dynamically.scalable": "Dynamisch skalierbar",
-    "label.edit": "Bearbeiten",
-    "label.edit.acl.rule": "ACL-Regel bearbeiten",
-    "label.edit.affinity.group": "Affinitätsgruppe bearbeiten",
-    "label.edit.lb.rule": "LB-Regel bearbeiten",
-    "label.edit.network.details": "Netzwerkdetails bearbeiten",
-    "label.edit.project.details": "Projektdetails bearbeiten",
-    "label.edit.region": "Region bearbeiten",
-    "label.edit.role": "Rolle bearbeiten",
-    "label.edit.rule": "Regel bearbeiten",
-    "label.edit.secondary.ips": "Sekundäre IPs bearbeiten",
-    "label.edit.tags": "Schlagwörter bearbeiten",
-    "label.edit.traffic.type": "Datenverkehrstyp bearbeiten",
-    "label.edit.vpc": "VPC bearbeiten",
-    "label.egress.default.policy": "Egress Standard Richtlinie",
-    "label.egress.rule": "Egress-Regel",
-    "label.egress.rules": "Egress-Regeln",
-    "label.elastic": "Elastisch",
-    "label.elastic.IP": "Elastische IP Adresse",
-    "label.elastic.LB": "Elastischer LB",
-    "label.email": "E-Mail",
-    "label.email.lower": "E-Mail-Adresse",
-    "label.enable.autoscale": "Automatische Skalierung aktivieren",
-    "label.enable.host": "Host aktivieren",
-    "label.enable.network.offering": "Netzwerkangebot aktivieren",
-    "label.enable.provider": "Anbieter aktivieren",
-    "label.enable.s3": "S3-Backend Sekundärspeicher einschalten",
-    "label.enable.swift": "Swift aktivieren",
-    "label.enable.vnmc.device": "VNMC-Gerät aktivieren",
-    "label.enable.vnmc.provider": "VNMC-Anbieter aktivieren",
-    "label.enable.vpc.offering": "VPC-Angebot aktivieren",
-    "label.enable.vpn": "Fernzugriff-VPN einschalten",
-    "label.enabling.vpn": "VPN aktivieren",
-    "label.enabling.vpn.access": "Aktivieren des VPN-Zugriffs",
-    "label.end.IP": "End-IP",
-    "label.end.port": "Beende Port",
-    "label.end.reserved.system.IP": "Reservierte System-End-IP",
-    "label.end.vlan": "End-VLAN",
-    "label.end.vxlan": "End-VXLAN",
-    "label.endpoint": "Endpunkt",
-    "label.endpoint.or.operation": "Endpunkt oder Bedienung",
-    "label.enter.token": "Token eingeben",
-    "label.error": "Fehler",
-    "label.error.code": "Fehlercode",
-    "label.error.upper": "FEHLER",
-    "label.esx.host": "ESX / ESXi-Host",
-    "label.event": "Ereignis",
-    "label.event.archived": "Ereignis archiviert",
-    "label.event.deleted": "Ereignis gelöscht",
-    "label.every": "Jeder",
-    "label.example": "Beispiel",
-    "label.expunge": "Unwiederbringlich löschen",
-    "label.external.link": "Externer Link",
-    "label.extractable": "Extrahierbar",
-    "label.extractable.lower": "extrahierbar",
-    "label.f5": "F5",
-    "label.f5.details": "F5-Details",
-    "label.failed": "Fehlgeschlagen",
-    "label.featured": "Empfohlen",
-    "label.fetch.latest": "Neuste abrufen",
-    "label.filterBy": "Filtern nach",
-    "label.fingerprint": "FingerAbdruck",
-    "label.firewall": "Firewall",
-    "label.first.name": "Vorname",
-    "label.firstname.lower": "Vorname",
-    "label.format": "Format",
-    "label.format.lower": "Format",
-    "label.friday": "Freitag",
-    "label.full": "Voll",
-    "label.full.path": "Vollständiger Pfad",
-    "label.gateway": "Schnittstelle",
-    "label.general.alerts": "Allgemeine Alarme",
-    "label.generating.url": "Generieren der URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS-Konfiguration",
-    "label.gluster.volume": "Volume",
-    "label.go.step.2": "Gehe zu Schritt 2",
-    "label.go.step.3": "Weiter zu Schritt 3",
-    "label.go.step.4": "Weiter mit Schritt 4",
-    "label.go.step.5": "Weiter mit Schritt 5",
-    "label.gpu": "GPU",
-    "label.group": "Gruppe",
-    "label.group.by.account": "Nach Konto gruppieren",
-    "label.group.by.cluster": "Nach Cluster gruppieren",
-    "label.group.by.pod": "Gruppiert nach Pod",
-    "label.group.by.zone": "Nach Zone gruppieren",
-    "label.group.optional": "Gruppe (optional)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Zugewiesene Lastverteilung",
-    "label.gslb.assigned.lb.more": "Mehr Lastverteilung zuweisen",
-    "label.gslb.delete": "GSLB löschen",
-    "label.gslb.details": "GSLB-Details",
-    "label.gslb.domain.name": "GSLB-Domänenname",
-    "label.gslb.lb.details": "Lastverteilungsdetails",
-    "label.gslb.lb.remove": "Lastverteilung aus diesem GSLB entfernen",
-    "label.gslb.lb.rule": "Lastverteilungsregel",
-    "label.gslb.service": "GSLB-Dienst",
-    "label.gslb.service.private.ip": "GSLB-Dienst Private IP",
-    "label.gslb.service.public.ip": "GSLB-Dienst Öffentliche IP",
-    "label.gslb.servicetype": "Diensttyp",
-    "label.guest": "Gast",
-    "label.guest.cidr": "Gast CIDR",
-    "label.guest.end.ip": "Gast-End-IP",
-    "label.guest.gateway": "Gast-Schnittstelle",
-    "label.guest.ip": "Gast IP-Adresse",
-    "label.guest.ip.range": "Gast-IP-Bereich",
-    "label.guest.netmask": "Gast Netzmaske",
-    "label.guest.network.details": "Gastnetzwerkdetails",
-    "label.guest.networks": "Gastnetzwerke",
-    "label.guest.start.ip": "Gast-Start-IP",
-    "label.guest.traffic": "Gast-Datenverkehr",
-    "label.guest.traffic.vswitch.name": "Gast Datenverkehr vSwitch Name",
-    "label.guest.traffic.vswitch.type": "Gast Datenverkehr vSwitch Typ",
-    "label.guest.type": "Gasttyp",
-    "label.ha.enabled": "HA aktiviert",
-    "label.health.check": "Heath-Check",
-    "label.health.check.advanced.options": "Erweiterte Optionen:",
-    "label.health.check.configurations.options": "Konfigurationsoptionen:",
-    "label.health.check.interval.in.sec": "Gesundheitscheck-Interval (in Sek.)",
-    "label.health.check.message.desc": "Ihr Lastverteiler wird autmatisch Heath-Checks ausführen auf Ihren CloudStack Instanzen und nur Datenverkehr zu denjenigen Instanzen routen, welchen den Heath-Check bestehen.",
-    "label.health.check.wizard": "Health-Check Eingabehilfe",
-    "label.healthy.threshold": "Schwellwert gesund",
-    "label.help": "Hilfe",
-    "label.hide.ingress.rule": "Verstecke Regeln, die den Zutritt steuern",
-    "label.hints": "Hinweise",
-    "label.home": "Start",
-    "label.host": "Host",
-    "label.host.MAC": "Host-MAC",
-    "label.host.alerts": "Hosts im Alarmzustand",
-    "label.host.name": "Host Name",
-    "label.host.tag": "Host Tag",
-    "label.host.tags": "Markierungen des Hosts",
-    "label.hosts": "Hosts",
-    "label.hourly": "Stündlich",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Datenverkehrs-Bezeichnung",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Hypervisorfähigkeiten",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Schnappschuss-Reserve",
-    "label.hypervisor.type": "Hypervisor Typ",
-    "label.hypervisor.version": "Hypervisor-Version",
-    "label.hypervisors": "Hypervisoren",
-    "label.id": "Identifikation",
-    "label.info": "Info",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Zutrittsregel",
-    "label.initiated.by": "Initiiert durch",
-    "label.inside.port.profile": "Inside Port Profil",
-    "label.installWizard.addClusterIntro.subtitle": "Was ist ein Cluster?",
-    "label.installWizard.addClusterIntro.title": "Cluster hinzufügen",
-    "label.installWizard.addHostIntro.subtitle": "Was ist ein Host?",
-    "label.installWizard.addHostIntro.title": "Host hinzufügen",
-    "label.installWizard.addPodIntro.subtitle": "Was ist ein Pod?",
-    "label.installWizard.addPodIntro.title": "Pod hinzufügen",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Was ist Primärspeicher?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Primärspeicher hinzufügen",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Was ist Sekundärspeicher?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Sekundärspeicher hinzufügen",
-    "label.installWizard.addZone.title": "Zone hinzufügen",
-    "label.installWizard.addZoneIntro.subtitle": "Was ist eine Zone?",
-    "label.installWizard.addZoneIntro.title": "Zone hinzufügen",
-    "label.installWizard.click.launch": "Bitte den Start-Knopf drücken",
-    "label.installWizard.subtitle": "Diese Führung wird Ihnen beim Aufsetzen Ihrer CloudStack&#8482 Installation behilflich sein.",
-    "label.installWizard.title": "Hallo und Willkommen bei CloudStack&#8482",
-    "label.instance": "Instanz",
-    "label.instance.limits": "Instanz-Limiten",
-    "label.instance.name": "Name der Instanz",
-    "label.instance.port": "Instanz-Port",
-    "label.instance.scaled.up": "Instanz wurde zum gewünschten Angebot skaliert",
-    "label.instances": "Instanzen",
-    "label.instanciate.template.associate.profile.blade": "Vorlage instanzieren und Profil zu Blade assoziieren",
-    "label.intermediate.certificate": "Intermediate Zertifikat {0}",
-    "label.internal.dns.1": "Interner DNS 1",
-    "label.internal.dns.2": "Interner DNS 2",
-    "label.internal.lb": "Interne LB",
-    "label.internal.lb.details": "Interne LB-Details",
-    "label.internal.name": "Interner Name",
-    "label.internallbvm": "Interne LV VM",
-    "label.interval.type": "Interval Typ",
-    "label.introduction.to.cloudstack": "Einführung in CloudStack&#8482",
-    "label.invalid.integer": "Ungültige Ganzzahl",
-    "label.invalid.number": "Ungültige Anzahl",
-    "label.invitations": "Einladungen",
-    "label.invite": "Einladen",
-    "label.invite.to": "Einladen zu",
-    "label.invited.accounts": "Eingeladene Konten",
-    "label.ip": "IP",
-    "label.ip.address": "IP-Adresse",
-    "label.ip.allocations": "IP-Zuweisungen",
-    "label.ip.limits": "Öffentliche IP-Begrenzungen",
-    "label.ip.or.fqdn": "IP oder FQDN",
-    "label.ip.range": "IP-Bereich",
-    "label.ip.ranges": "IP-Bereiche",
-    "label.ipaddress": "IP-Adresse",
-    "label.ips": "IPs",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 End-IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4-Netzmaske",
-    "label.ipv4.start.ip": "IPv4 Start-IP",
-    "label.ipv6.CIDR": "IPv6-CIDR",
-    "label.ipv6.address": "IPv6-IP-Adresse",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 End-IP",
-    "label.ipv6.gateway": "IPv6-Gateway",
-    "label.ipv6.start.ip": "IPv6 Start-IP",
-    "label.is.default": "Ist vorgegeben",
-    "label.is.redundant.router": "Redundant",
-    "label.is.shared": "Gemeinsam",
-    "label.is.system": "Ist System",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO-Boot",
-    "label.isolated.networks": "Isolierte Netzwerke",
-    "label.isolation.method": "Isolationsmethode",
-    "label.isolation.mode": "Isolationsmodus",
-    "label.isolation.uri": "Isolations-URI",
-    "label.item.listing": "Eintragsauflistung",
-    "label.japanese.keyboard": "Japanische Tastatur",
-    "label.keep": "Behalten",
-    "label.keep.colon": "Behalten:",
-    "label.key": "Schlüssel",
-    "label.keyboard.language": "Tastatursprache",
-    "label.keyboard.type": "Tastaturtyp",
-    "label.kvm.traffic.label": "KVM Datenverkehrs-Bezeichnung",
-    "label.label": "Bezeichnung",
-    "label.lang.arabic": "Arabisch",
-    "label.lang.brportugese": "Brasilianisches Portugiesisch",
-    "label.lang.catalan": "Katalanisch",
-    "label.lang.chinese": "Chinesisch (vereinfacht)",
-    "label.lang.dutch": "Niederländisch",
-    "label.lang.english": "Englisch",
-    "label.lang.french": "Französisch",
-    "label.lang.german": "Deutsch",
-    "label.lang.hungarian": "Ungarisch",
-    "label.lang.italian": "Italienisch",
-    "label.lang.japanese": "Japanisch",
-    "label.lang.korean": "Koreanisch",
-    "label.lang.norwegian": "Norwegisch",
-    "label.lang.polish": "Polnisch",
-    "label.lang.russian": "Russisch",
-    "label.lang.spanish": "Spanisch",
-    "label.last.disconnected": "Zuletzt getrennt",
-    "label.last.name": "Nachname",
-    "label.lastname.lower": "Nachname",
-    "label.latest.events": "Neueste Ereignisse",
-    "label.launch": "Start",
-    "label.launch.vm": "VM starten",
-    "label.launch.zone": "Zone starten",
-    "label.lb.algorithm.leastconn": "Mindestverbindungen",
-    "label.lb.algorithm.roundrobin": "Rundlauf-Verfahren",
-    "label.lb.algorithm.source": "Quelle",
-    "label.ldap.configuration": "LDAP-Konfiguration",
-    "label.ldap.group.name": "LDAP-Gruppe",
-    "label.ldap.link.type": "Typ",
-    "label.ldap.port": "LDAP-Port",
-    "label.level": "Ebene",
-    "label.link.domain.to.ldap": "Verbinde Domain mit LDAP",
-    "label.linklocal.ip": "Link-Local IP-Adresse",
-    "label.load.balancer": "Serverlastverteilung",
-    "label.load.balancer.type": "Lastverteilungstyp",
-    "label.load.balancing": "Lastverteilung",
-    "label.load.balancing.policies": "Verteilungsrichtlinien laden",
-    "label.loading": "Laden",
-    "label.local": "Lokal",
-    "label.local.file": "Lokale Datei",
-    "label.local.storage": "Lokaler Speicher",
-    "label.local.storage.enabled": "Ermögliche lokalen Speicher für Benutzer VMs",
-    "label.local.storage.enabled.system.vms": "Aktiviere lokaler Speicher für die System-VMs",
-    "label.login": "Login",
-    "label.logout": "Abmelden",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Datenverkehrs-Bezeichnung",
-    "label.mac.address": "MAC Adresse",
-    "label.make.project.owner": "Mache Benutzerkonto zum Projekteigentümer",
-    "label.make.redundant": "Redundant machen",
-    "label.manage": "Verwalten",
-    "label.manage.resources": "Ressourcen verwalten",
-    "label.managed": "Verwaltet",
-    "label.management": "Verwaltung",
-    "label.management.ips": "Verwaltung IP-Adressen",
-    "label.management.server": "Verwaltungsserver",
-    "label.max.cpus": "Max. CPU-Kerne",
-    "label.max.guest.limit": "Maximales Limit für Anzahl der Gäste",
-    "label.max.instances": "Max Instanzen",
-    "label.max.memory": "Max. Speicher (MiB)",
-    "label.max.networks": "Max. Netzwerke",
-    "label.max.primary.storage": "Max. primärer (GiB)",
-    "label.max.public.ips": "Max. öffentliche IPs",
-    "label.max.secondary.storage": "Max. sekundärer (GiB)",
-    "label.max.snapshots": "Max. Schnappschüsse",
-    "label.max.templates": "Max. Vorlagen",
-    "label.max.vms": "Max. Benutzer-VMs",
-    "label.max.volumes": "Max. Volumen",
-    "label.max.vpcs": "Max. VPCs",
-    "label.maximum": "Maximum",
-    "label.may.continue": "Sie können jetzt fortfahren",
-    "label.md5.checksum": "MD5-Prüfsumme",
-    "label.memory": "Speicher (in MB)",
-    "label.memory.allocated": "zugeordneter Speicher",
-    "label.memory.limits": "Speicherbegrenzungen (MiB)",
-    "label.memory.mb": "Speicher (in MB)",
-    "label.memory.total": "Speicher insgesamt",
-    "label.memory.used": "Genutzter Speicher",
-    "label.menu.accounts": "Benutzerkonten",
-    "label.menu.alerts": "Alarme",
-    "label.menu.all.accounts": "Alle Konten",
-    "label.menu.all.instances": "Alle Instanzen",
-    "label.menu.community.isos": "Gemeinschaft ISOs",
-    "label.menu.community.templates": "Gemeinschaft Vorlagen",
-    "label.menu.configuration": "Konfiguration",
-    "label.menu.dashboard": "Dashboard",
-    "label.menu.destroyed.instances": "Zerstörte Instanzen",
-    "label.menu.disk.offerings": "Festplattenangebote",
-    "label.menu.domains": "Domains",
-    "label.menu.events": "Events",
-    "label.menu.featured.isos": "Empfohlene ISOs",
-    "label.menu.featured.templates": "Empfohlene Vorlagen",
-    "label.menu.global.settings": "Allgemeine Einstellungen",
-    "label.menu.infrastructure": "Infrastruktur",
-    "label.menu.instances": "Instanzen",
-    "label.menu.ipaddresses": "IP-Adressen",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "Meine Konten",
-    "label.menu.my.instances": "Meine Fälle",
-    "label.menu.my.isos": "Meine ISOs",
-    "label.menu.my.templates": "Meine Vorlagen",
-    "label.menu.network": "Netzwerk",
-    "label.menu.network.offerings": "Netzwerkangebote",
-    "label.menu.physical.resources": "Technische Ressourcen",
-    "label.menu.regions": "Regionen",
-    "label.menu.running.instances": "Laufende Instanzen",
-    "label.menu.security.groups": "Sicherheitsgruppen",
-    "label.menu.service.offerings": "Dienstangebote",
-    "label.menu.snapshots": "Schnappschüsse",
-    "label.menu.sshkeypair": "SSH-Schlüsselpaar",
-    "label.menu.stopped.instances": "Beendete Instanzen",
-    "label.menu.storage": "Speicher",
-    "label.menu.system": "System",
-    "label.menu.system.service.offerings": "Systemangebote",
-    "label.menu.system.vms": "System-VMs",
-    "label.menu.templates": "Vorlagen",
-    "label.menu.virtual.appliances": "Virtuelle Appliances",
-    "label.menu.virtual.resources": "Virtuelle Ressourcen",
-    "label.menu.volumes": "Volumina",
-    "label.menu.vpc.offerings": "VPC-Angebote",
-    "label.metrics": "Metriken",
-    "label.metrics.allocated": "Zugeteilt",
-    "label.metrics.clusters": "Cluster",
-    "label.metrics.cpu.allocated": "CPU Zuteilung",
-    "label.metrics.cpu.max.dev": "Abweichung",
-    "label.metrics.cpu.total": "Gesamt",
-    "label.metrics.cpu.usage": "CPU Benutzung",
-    "label.metrics.cpu.used.avg": "Gebraucht",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "Zugeteilt",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Lesen",
-    "label.metrics.disk.size": "Größe",
-    "label.metrics.disk.storagetype": "Typ",
-    "label.metrics.disk.total": "Gesamt",
-    "label.metrics.disk.unallocated": "Unbelegt",
-    "label.metrics.disk.usage": "Festplattennutzung",
-    "label.metrics.disk.used": "Gebraucht",
-    "label.metrics.disk.write": "Schreiben",
-    "label.metrics.hosts": "Hosts",
-    "label.metrics.memory.allocated": "Speicher Belegung",
-    "label.metrics.memory.max.dev": "Abweichung",
-    "label.metrics.memory.total": "Gesamt",
-    "label.metrics.memory.usage": "Speichernutzung",
-    "label.metrics.memory.used.avg": "Gebraucht",
-    "label.metrics.name": "Name",
-    "label.metrics.network.read": "Lesen",
-    "label.metrics.network.usage": "Netzwerk Nutzung",
-    "label.metrics.network.write": "Schreiben",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Betriebszustand",
-    "label.metrics.property": "Eigentum",
-    "label.metrics.scope": "Geltungsbereich",
-    "label.metrics.state": "Status",
-    "label.metrics.storagepool": "Speicher-Pool",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "Instanz migrieren zu",
-    "label.migrate.instance.to.host": "Instanz auf einen anderen Host migrieren",
-    "label.migrate.instance.to.ps": "Instanz auf einen anderen Primärspeicher migrieren",
-    "label.migrate.lb.vm": "LB-VM migrieren",
-    "label.migrate.router.to": "Router migrieren zu",
-    "label.migrate.systemvm.to": "System-VM migrieren zu",
-    "label.migrate.to.host": "Zu Host migrieren",
-    "label.migrate.to.storage": "Zu Speicher migrieren",
-    "label.migrate.volume": "Volumen migrieren",
-    "label.migrate.volume.to.primary.storage": "Migriere ein Speichervolumen zu einem anderen Hauptspeicher",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instanzen",
-    "label.min.past.the.hr": "min seit Std. vergangen",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "Minute(n) seit der Stunde vergangen",
-    "label.minutes.past.hour": "Minute(n) seit der Stunde vergangen",
-    "label.mode": "Modus",
-    "label.monday": "Montag",
-    "label.monthly": "Monatlich",
-    "label.more.templates": "Mehr Vorlagen",
-    "label.move.down.row": "Eine Zeile nach unten verschieben",
-    "label.move.to.bottom": "Nach unten verschieben",
-    "label.move.to.top": "Nach oben verschieben",
-    "label.move.up.row": "Eine Zeile nach oben verschieben",
-    "label.my.account": "Ihr Benutzerkonto",
-    "label.my.network": "Mein Netzwerk",
-    "label.my.templates": "Meine Vorlagen",
-    "label.na": "N/V",
-    "label.name": "Name",
-    "label.name.lower": "Name",
-    "label.name.optional": "Name (Optional)",
-    "label.nat.port.range": "NAT-Portbereich",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Netzmaske",
-    "label.netscaler.details": "NetScaler-Details",
-    "label.network": "Netzwerk",
-    "label.network.ACL": "Netzwerk-ACL",
-    "label.network.ACL.total": "Netzwerk-ACL Total",
-    "label.network.ACLs": "Netzwerk-ACLs",
-    "label.network.addVM": "Netzwerk zur VM hinzufügen",
-    "label.network.cidr": "Netzwerk-CIDR",
-    "label.network.desc": "Netzwerkbeschreibung",
-    "label.network.details": "Netzwerkdetails",
-    "label.network.device": "Netzwerkgerät",
-    "label.network.device.type": "Netzwerkgerätetyp",
-    "label.network.domain": "Netzwerk-Domain",
-    "label.network.domain.text": "Netzwerkdomäne",
-    "label.network.id": "Netzwerk-ID",
-    "label.network.label.display.for.blank.value": "Standard-Gateway verwenden",
-    "label.network.limits": "Netzwerkbegrenzungen",
-    "label.network.name": "Netzwerk Name",
-    "label.network.offering": "Netzwerkangebot",
-    "label.network.offering.details": "Netzwerkangebotdetails",
-    "label.network.offering.display.text": "Netzwerkangebot-Anzeigetext",
-    "label.network.offering.id": "Netzwerkangebotskennung",
-    "label.network.offering.name": "Netzwerkangebotsname",
-    "label.network.rate": "Netzwerk-Rate",
-    "label.network.rate.megabytes": "Netzwerkrate (MB/s)",
-    "label.network.read": "Netzwerk Lesen",
-    "label.network.service.providers": "Netzwerkdienstanbieter",
-    "label.network.type": "Netzwerk-Typ",
-    "label.network.write": "Netzwerk Schreiben",
-    "label.networking.and.security": "Netzwerkbetrieb und Sicherheit",
-    "label.networks": "Netzwerke",
-    "label.new": "Neu",
-    "label.new.password": "Neues Passwort",
-    "label.current.password": "Current Password",
-    "label.new.project": "Neues Projekt",
-    "label.new.ssh.key.pair": "Neues SSH-Schlüsselpaar",
-    "label.new.vm": "Neue VM",
-    "label.next": "Weiter",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS Server",
-    "label.nfs.storage": "NFS-Speicher",
-    "label.nic.adapter.type": "NIC-Adaptertyp",
-    "label.nicira.controller.address": "Controller-Adresse",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP-Details",
-    "label.nicira.transportzoneuuid": "Transportzone Uuid",
-    "label.nics": "NICs",
-    "label.no": "Nein",
-    "label.no.actions": "Nicht verfügbare Aktionen",
-    "label.no.alerts": "Keine aktuellen Alarme",
-    "label.no.data": "Keine anzuzeigenden Daten",
-    "label.no.errors": "Keine neuen Fehler",
-    "label.no.grouping": "(keine Gruppierung)",
-    "label.no.isos": "Kein verfügbaren ISOs",
-    "label.no.items": "Keine verfügbaren Einträge",
-    "label.no.security.groups": "Keine verfügbare Sicherheitsgruppe",
-    "label.no.thanks": "Nein, danke",
-    "label.none": "Kein",
-    "label.not.found": "Nicht gefunden",
-    "label.notifications": "Benachrichtigungen",
-    "label.num.cpu.cores": "Anzahl an CPU-Kernen",
-    "label.number.of.clusters": "Anzahl der Cluster",
-    "label.number.of.cpu.sockets": "Die Anzahl der CPU-Sockeln",
-    "label.number.of.hosts": "Anzahl an Hosts",
-    "label.number.of.pods": "Anzahl Pods",
-    "label.number.of.system.vms": "Anzahl an System-VMs",
-    "label.number.of.virtual.routers": "Anzahl an virtuellen Routern",
-    "label.number.of.zones": "Anzahl an Zonen",
-    "label.numretries": "Anzahl von Wiederholungen",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "des Monats",
-    "label.offer.ha": "HA anbieten",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDayight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controller",
-    "label.operator": "Betreiber",
-    "label.optional": "optional",
-    "label.order": "Reihenfolge",
-    "label.os.preference": "OS Präferenz",
-    "label.os.type": "OS Typ",
-    "label.other": "Andere",
-    "label.outofbandmanagement": "Out-of-band Verwaltung",
-    "label.outofbandmanagement.action": "Aktion",
-    "label.outofbandmanagement.action.issue": "Eine Out-of-band Verwaltungs-Strom Aktion durchführen",
-    "label.outofbandmanagement.address": "Adresse",
-    "label.outofbandmanagement.changepassword": "Passwort für Out-of-band Verwaltung ändern",
-    "label.outofbandmanagement.configure": "Out-of-band Verwaltung konfigurieren",
-    "label.outofbandmanagement.disable": "Out-of-band Verwaltung deaktivieren",
-    "label.outofbandmanagement.driver": "Treiber",
-    "label.outofbandmanagement.enable": "Out-of-band Verwaltung aktivieren",
-    "label.outofbandmanagement.password": "Passwort",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Passwort erneut eingeben",
-    "label.outofbandmanagement.username": "Benutzername",
-    "label.override.guest.traffic": "Gast-Datenverkehr überschreiben",
-    "label.override.public.traffic": "Öffentlichen Datenverkehr überschreiben",
-    "label.ovm.traffic.label": "OVM Datenverkehrs-Bezeichnung",
-    "label.ovm3.cluster": "Natives Clustering",
-    "label.ovm3.pool": "Natives Pooling",
-    "label.ovm3.traffic.label": "OVM3 Datenverkehrs-Bezeichnung",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Ihnen gehörende öffentliche IP-Adressen",
-    "label.owner.account": "Eigentümerkonto",
-    "label.owner.domain": "Eigentümerdomäne",
-    "label.palo.alto.details": "Palo Alto-Details",
-    "label.parent.domain": "Übergeordnete Domäne",
-    "label.passive": "Passiv",
-    "label.password": "Passwort",
-    "label.password.enabled": "Passwort aktiviert",
-    "label.password.lower": "Passwort",
-    "label.password.reset.confirm": "Passwort wurde zurückgesetzt auf",
-    "label.path": "Pfad",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Berechtigung",
-    "label.persistent": "Persistent",
-    "label.physical.network": "Physikalisches Netzwerk",
-    "label.physical.network.ID": "Physikalisches Netzwerkkennung",
-    "label.physical.network.name": "Name des physischen Netzwerks",
-    "label.ping.path": "Ping-Pfad",
-    "label.planner.mode": "Planungs Modus",
-    "label.please.complete.the.following.fields": "Bitte vervollständigen Sie die folgenden Felder",
-    "label.please.specify.netscaler.info": "Bitte Netscaler-Info definieren",
-    "label.please.wait": "Bitte warten",
-    "label.plugin.details": "Plugindetails",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod dediziert",
-    "label.pod.name": "Podname",
-    "label.pods": "Pod",
-    "label.polling.interval.sec": "Abfrageintervall (in Sekunden)",
-    "label.port": "Port",
-    "label.port.forwarding": "Portweiterleitung",
-    "label.port.forwarding.policies": "Portweiterleitungsrichtlinien",
-    "label.port.range": "Portbereich",
-    "label.portable.ip": "Portable IP",
-    "label.portable.ip.range.details": "Portable IP-Bereichsdetails",
-    "label.portable.ip.ranges": "Portable IP-Bereiche",
-    "label.portable.ips": "Portable IPs",
-    "label.powerstate": "Betriebszustand",
-    "label.prev": "Vor",
-    "label.previous": "Vorherige",
-    "label.primary.allocated": "Zugewiesener Hauptspeicher",
-    "label.primary.network": "Hauptnetzwerk",
-    "label.primary.storage": "Hauptspeicher",
-    "label.primary.storage.count": "Hauptspeicher-Pools",
-    "label.primary.storage.limits": "Hauptspeicher-Limits (GiB)",
-    "label.primary.used": "Genutzter Hauptspeicher",
-    "label.private.Gateway": "Privater Gateway",
-    "label.private.interface": "Privates Interface",
-    "label.private.ip": "Private IP-Adresse",
-    "label.private.ip.range": "Privater IP-Bereich",
-    "label.private.ips": "Private IP-Adressen",
-    "label.private.key": "Privater Schlüssel",
-    "label.private.network": "Privates Netzwerk",
-    "label.private.port": "Privater Port",
-    "label.private.zone": "Private Zone",
-    "label.privatekey": "PKCS#8 Privater Schlüssel",
-    "label.profile": "Profil",
-    "label.project": "Projekt",
-    "label.project.dashboard": "Projektübersichtsseite",
-    "label.project.id": "Projektkennung",
-    "label.project.invite": "Zum Projekt einladen",
-    "label.project.name": "Projektname",
-    "label.project.view": "Projektansicht",
-    "label.projects": "Projekte",
-    "label.protocol": "Protokoll",
-    "label.protocol.number": "Protokollnummer",
-    "label.protocol.number.short" : "#Protokoll",
-    "label.provider": "Anbieter",
-    "label.providers": "Anbieter",
-    "label.public": "Öffentlich",
-    "label.public.interface": "Öffentliches Interface",
-    "label.public.ip": "Öffentliche IP-Adresse",
-    "label.public.ips": "Öffentliche IP-Adressen",
-    "label.public.key": "Öffentlicher Schlüssel",
-    "label.public.lb": "Öffentliche LB",
-    "label.public.load.balancer.provider": "Öffentlicher Lastverteileranbieter",
-    "label.public.network": "Öffentliches Netzwerk",
-    "label.public.port": "Öffentlicher Port",
-    "label.public.traffic": "Öffentlicher Datenverkehr",
-    "label.public.traffic.vswitch.name": "Öffentlicher Datenverkehr vSwitch Name",
-    "label.public.traffic.vswitch.type": "Öffentlicher Datenverkehr vSwitch Typ",
-    "label.public.zone": "Öffentliche Zone",
-    "label.purpose": "Zweck",
-    "label.qos.type": "QoS-Typ",
-    "label.quickview": "Schnellansicht",
-    "label.quiesce.vm": "VM stilllegen",
-    "label.quiet.time.sec": "Ruhezeit (in Sekunden)",
-    "label.quota.add.credits": "Guthaben hinzufügen",
-    "label.quota.balance": "Abgleich",
-    "label.quota.configuration": "Konfiguration der Quota",
-    "label.quota.configure": "Konfiguriere eine Quota",
-    "label.quota.credit": "Guthaben",
-    "label.quota.credits": "Guthaben",
-    "label.quota.date": "Datum",
-    "label.quota.dates": "Aktualisierung der Daten",
-    "label.quota.description": "Beschreibung der Quota",
-    "label.quota.email.body": "Körper",
-    "label.quota.email.lastupdated": "Letzte Aktualisierung",
-    "label.quota.email.subject": "Thema",
-    "label.quota.email.template": "Email Vorlage",
-    "label.quota.enddate": "Enddatum",
-    "label.quota.endquota": "Quota Ende",
-    "label.quota.enforcequota": "Erzwinge eine Quota",
-    "label.quota.fullsummary": "Alle Konten",
-    "label.quota.minbalance": "Min Abrechnung",
-    "label.quota.remove": "Eine Quota löschen",
-    "label.quota.startdate": "Startdatum",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "Status",
-    "label.quota.statement": "Aussage",
-    "label.quota.statement.balance": "Quota Abrechnung",
-    "label.quota.statement.bydates": "Aussage",
-    "label.quota.statement.quota": "Quota Verbrauch",
-    "label.quota.statement.tariff": "Quota Tarif",
-    "label.quota.summary": "Summe",
-    "label.quota.tariff": "Tarif",
-    "label.quota.tariff.edit": "Tarif bearbeiten",
-    "label.quota.tariff.effectivedate": "Anwendungsdatum",
-    "label.quota.tariff.value": "Tarif Wert",
-    "label.quota.total": "Gesamt",
-    "label.quota.totalusage": "Gesamte Nutzung",
-    "label.quota.type.name": "Art der Auslastung",
-    "label.quota.type.unit": "Verbrauch der Einheit",
-    "label.quota.usage": "Verbrauch der Quota",
-    "label.quota.value": "Wert der Quota",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx-Benutzer",
-    "label.rbd.monitor": "Ceph-Überwachung",
-    "label.rbd.pool": "Ceph-Pool",
-    "label.rbd.secret": "Cephx-Geheimnis",
-    "label.reboot": "Neustart",
-    "label.recent.errors": "Aktuelle Fehler",
-    "label.recover.vm": "VM wiederherstellen",
-    "label.redundant.router": "Redundanter Router",
-    "label.redundant.router.capability": "Redundanter Router Kapazität",
-    "label.redundant.state": "Redundanter Status",
-    "label.redundant.vpc": "Redundante VPC",
-    "label.refresh": "Aktualisieren",
-    "label.refresh.blades": "Blades aktualisieren",
-    "label.region": "Region",
-    "label.region.details": "Regiondetails",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "VM neu installieren",
-    "label.related": "Verwandt",
-    "label.release.account": "Vom Benutzerkonto loslösen",
-    "label.release.account.lowercase": "Vom Benutzerkonto loslösen",
-    "label.release.dedicated.cluster": "Dedizierter Cluster loslösen",
-    "label.release.dedicated.host": "Dedizierter Host loslösen",
-    "label.release.dedicated.pod": "Dedizierter Pod freigeben",
-    "label.release.dedicated.vlan.range": "Dedizierter VLAN/VNI Bereich loslösen",
-    "label.release.dedicated.zone": "Dedizierte Zone loslösen",
-    "label.remind.later": "Später erinnern",
-    "label.remove.ACL": "ACL entfernen",
-    "label.remove.egress.rule": "Egress Regel entfernen",
-    "label.remove.from.load.balancer": "Instanz von Lastverteiler entfernen",
-    "label.remove.ingress.rule": "Ingress Regel entfernen",
-    "label.remove.ip.range": "IP-Bereich entfernen",
-    "label.remove.ldap": "LDAP entfernen",
-    "label.remove.network.offering": "Netzwerkangebot entfernen",
-    "label.remove.pf": "Portweiterleitungsregel entfernen",
-    "label.remove.project.account": "Konto aus Projekt entfernen",
-    "label.remove.region": "Region entfernen",
-    "label.remove.rule": "Regel entfernen",
-    "label.remove.ssh.key.pair": "SSH-Schlüsselpaar entfernen",
-    "label.remove.static.nat.rule": "Statische NAT-Regel entfernen",
-    "label.remove.static.route": "Statische Route entfernen",
-    "label.remove.this.physical.network": "Dieses physikalische Netzwerk entfernen",
-    "label.remove.tier": "Ebene entfernen",
-    "label.remove.vm.from.lb": "VM von Lastverteiler-Regel entfernen",
-    "label.remove.vm.load.balancer": "VM aus Lastverteiler entfernen",
-    "label.remove.vmware.datacenter": "VMware-Rechenzentrum entfernen",
-    "label.remove.vpc": "VPC entfernen",
-    "label.remove.vpc.offering": "VPC-Angebot entfernen",
-    "label.removing": "am Entfernen",
-    "label.removing.user": "Entfernen von Benutzern",
-    "label.reource.id": "Ressourcenkennung",
-    "label.replace.acl": "ACL ersetzen",
-    "label.replace.acl.list": "ACL-Liste ersetzen",
-    "label.required": "Erforderlich",
-    "label.requires.upgrade": "Erfordert Aktualisierung",
-    "label.reserved.ip.range": "Reservierter IP-Bereich",
-    "label.reserved.system.gateway": "Reservierter System-Gateway",
-    "label.reserved.system.ip": "Reservierte System-IP",
-    "label.reserved.system.netmask": "Reservierte System-Netzmaske",
-    "label.reset.VPN.connection": "VPN-Verbindung zurücksetzen",
-    "label.reset.ssh.key.pair": "SSH-Schlüsselpaar zurücksetzen",
-    "label.reset.ssh.key.pair.on.vm": "SSH-Schlüsselpaar auf VM zurücksetzen",
-    "label.resetVM": "VM zurücksetzen",
-    "label.resize.new.offering.id": "Neues Angebot",
-    "label.resize.new.size": "Neue Größe (GB)",
-    "label.resize.shrink.ok": "Verkleinern OK",
-    "label.resource": "Ressource",
-    "label.resource.limit.exceeded": "Ressourcenbegrenzung erreicht",
-    "label.resource.limits": "Ressourcenbegrenzungen",
-    "label.resource.name": "Ressourcenname",
-    "label.resource.state": "Ressourcenstatus",
-    "label.resources": "Ressourcen",
-    "label.response.timeout.in.sec": "Zeitüberschreitung der Antworkt (in Sek.)",
-    "label.restart.network": "Netzwerk neu starten",
-    "label.restart.required": "Neustart erforderlich",
-    "label.restart.vpc": "VPC neu starten",
-    "label.restore": "Wiederherstellen",
-    "label.retry.interval": "Wiederversuchs-Interval",
-    "label.review": "Nachprüfung",
-    "label.revoke.project.invite": "Einladung widerrufen",
-    "label.role": "Rolle",
-    "label.roles": "Rollen",
-    "label.roletype": "Rollentyp",
-    "label.root.certificate": "Root-Zertifikat",
-    "label.root.disk.controller": "Root-Festplatten-Controller",
-    "label.root.disk.offering": "Root-Festplattenangebot",
-    "label.root.disk.size": "Root-Festplattengröße",
-    "label.router.vm.scaled.up": "Router VM hochskaliert",
-    "label.routing": "Routing",
-    "label.routing.host": "Routing Host",
-    "label.rule": "Regel",
-    "label.rule.number.short": "#Regel",
-    "label.rule.number": "Regelnummer",
-    "label.rules": "Regeln",
-    "label.running.vms": "Laufende VMs",
-    "label.s3.access_key": "Zugriffsschlüssel",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Verbindungszeitüberschreitung",
-    "label.s3.endpoint": "Endpunkt",
-    "label.s3.max_error_retry": "Maximale Fehlerwiederholungen",
-    "label.s3.nfs.path": "S3 NFS-Pfad",
-    "label.s3.nfs.server": "S3 NFS-Server",
-    "label.s3.secret_key": "Secret Key",
-    "label.s3.socket_timeout": "Socket-Zeitüberschreitung",
-    "label.s3.use_https": "HTTPS verwenden",
-    "label.saml.enable": "Autorisiere SAML SSO",
-    "label.saml.entity": "Identitätsanbieter",
-    "label.saturday": "Samstag",
-    "label.save": "Sichern",
-    "label.save.and.continue": "Speichern und fortsetzen",
-    "label.save.changes": "Änderungen speichern",
-    "label.saving.processing": "Speichern....",
-    "label.scale.up.policy": "HOCHSKALIERUNGSRICHTLINIE",
-    "label.scaledown.policy": "Herunterskalierungs-Richtlinie",
-    "label.scaleup.policy": "Hochskalierungs-Richtlinie",
-    "label.scope": "Geltungsbereich",
-    "label.search": "Suche",
-    "label.secondary.ips": "Sekundäre IPs",
-    "label.secondary.isolated.vlan.id": "Sekundäre isolierte VLAN ID",
-    "label.secondary.staging.store": "Sekundärer Staging Store",
-    "label.secondary.staging.store.details": "Sekundärer Staging Store Details",
-    "label.secondary.storage": "Sekundärspeicher",
-    "label.secondary.storage.count": "Sekundärespeicher-Pools",
-    "label.secondary.storage.details": "Sekundärspeicherdetails",
-    "label.secondary.storage.limits": "Sekundärspeicherbegrenzungen (GiB)",
-    "label.secondary.storage.vm": "Sekundärspeicher-VM",
-    "label.secondary.used": "Genutzter Sekundärspeicher",
-    "label.secret.key": "Secret Key",
-    "label.security.group": "Sicherheitsgruppe",
-    "label.security.group.name": "Sicherheitsgruppen-Name",
-    "label.security.groups": "Sicherheitsgruppen",
-    "label.security.groups.enabled": "Sicherheitsgruppe aktiviert",
-    "label.select": "Auswählen",
-    "label.select-view": "Ansicht auswählen",
-    "label.select.a.template": "Vorlage auswählen",
-    "label.select.a.zone": "Zone auswählen",
-    "label.select.instance": "Instanz auswählen",
-    "label.select.instance.to.attach.volume.to": "Instanz wählen an welche das Volumen angefügt wird",
-    "label.select.iso.or.template": "ISO oder Vorlage auswählen",
-    "label.select.offering": "Angebot auswählen",
-    "label.select.project": "Projekt auswählen",
-    "label.select.region": "Region auswählen",
-    "label.select.template": "Vorlage auswählen",
-    "label.select.tier": "Ebene auswählen",
-    "label.select.vm.for.static.nat": "VM für statisches NAT auswählen",
-    "label.sent": "Versendet",
-    "label.server": "Server",
-    "label.service.capabilities": "Dienstfähigkeiten",
-    "label.service.offering": "Dienstangebot",
-    "label.service.offering.details": "Dienstangebotdetails",
-    "label.service.state": "Dienststatus",
-    "label.services": "Dienste",
-    "label.session.expired": "Sitzung abgelaufen",
-    "label.set.default.NIC": "Standard-NIC festlegen",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Zonentyp einrichten",
-    "label.settings": "Einstellungen",
-    "label.setup": "Konfiguration",
-    "label.setup.network": "Netzwerk einrichten",
-    "label.setup.zone": "Zone einrichten",
-    "label.shared": "Gemeinsame",
-    "label.show.advanced.settings": "Erweiterte Einstellungen anzeigen",
-    "label.show.ingress.rule": "Zeige Regeln, die den Zutritt steuern",
-    "label.shutdown.provider": "Herunterfahrungs-Anbieter",
-    "label.simplified.chinese.keyboard": "Vereinfachte Chinesische Tastatur",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Größe",
-    "label.skip.guide": "Ich habe CloudStack bereits vorher benutzt, diese Hilfe überspringen",
-    "label.smb.domain": "SMB-Domäne",
-    "label.smb.password": "SMB-Passwort",
-    "label.smb.username": "SMB-Benutzername",
-    "label.snapshot": "Schnappschuss",
-    "label.snapshot.limits": "Schnappschuss Grenzen",
-    "label.snapshot.name": "Schnappschuss Name",
-    "label.snapshot.s": "Schnappschüsse",
-    "label.snapshot.schedule": "Wiederkehrende Schnappschüsse einrichten",
-    "label.snapshots": "Schnappschüsse",
-    "label.sockets": "CPU-Sockets",
-    "label.source.ip.address": "Quell IP-Adresse",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT unterstützt",
-    "label.source.port": "Port der Quelle",
-    "label.specify.IP.ranges": "IP-Bereiche angeben",
-    "label.specify.vlan": "VLAN angeben",
-    "label.specify.vxlan": "VXLAN angeben",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX-Details",
-    "label.ssh.key.pair": "SSH-Schlüsselpaar",
-    "label.ssh.key.pair.details": "SSH-Schlüsselpaardetails",
-    "label.ssh.key.pairs": "SSH-Schlüsselpaare",
-    "label.standard.us.keyboard": "Standard-(US)-Tastatur",
-    "label.start.IP": "Start-IP",
-    "label.start.lb.vm": "LB-VM starten",
-    "label.start.port": "Startport",
-    "label.start.reserved.system.IP": "Reservierte System-IP starten",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "VXLAN starten",
-    "label.state": "Status",
-    "label.static.nat": "Statische NAT",
-    "label.static.nat.enabled": "Statisches NAT eingeschaltet",
-    "label.static.nat.to": "Statisches NAT nach",
-    "label.static.nat.vm.details": "Statisches NAT VM Details",
-    "label.static.routes": "Statische Routen",
-    "label.statistics": "Statistiken",
-    "label.status": "Status",
-    "label.step.1": "Schritt 1",
-    "label.step.1.title": "Schritt 1: <strong>Wählen Sie eine Vorlage aus</strong>",
-    "label.step.2": "Schritt 2",
-    "label.step.2.title": "Schritt 2: <strong>Dienstangebot</strong>",
-    "label.step.3": "Schritt 3",
-    "label.step.3.title": "Schritt 3: <strong id=\"step3_label\">Wählen Sie ein Festplattenangebot aus</strong>",
-    "label.step.4": "Schritt 4",
-    "label.step.4.title": "Schritt 4: <strong>Netzwerk</strong>",
-    "label.step.5": "Schritt 5",
-    "label.step.5.title": "Schritt 5: <strong>Überprüfung</strong>",
-    "label.stickiness": "Klebrigkeit",
-    "label.stickiness.method": "Stickness-Methode",
-    "label.sticky.cookie-name": "Cookiename",
-    "label.sticky.domain": "Domain",
-    "label.sticky.expire": "Läuft ab",
-    "label.sticky.holdtime": "Haltezeit",
-    "label.sticky.indirect": "Indirekt",
-    "label.sticky.length": "Länge",
-    "label.sticky.mode": "Modus",
-    "label.sticky.name": "Sticky-Name",
-    "label.sticky.nocache": "Kein Cache",
-    "label.sticky.postonly": "nur Post",
-    "label.sticky.prefix": "Präfix",
-    "label.sticky.request-learn": "Verlange zu lernen",
-    "label.sticky.tablesize": "Tabellengröße",
-    "label.stop": "Stopp",
-    "label.stop.lb.vm": "LB-VM stoppen",
-    "label.stopped.vms": "Gestoppte VMs",
-    "label.storage": "Speicher",
-    "label.storage.pool": "Speicher-Pool",
-    "label.storage.tags": "Datenspeicher-Markierung",
-    "label.storage.traffic": "Datenspeicherverkehr",
-    "label.storage.type": "Speichertyp",
-    "label.subdomain.access": "Subdomain-Zugriff",
-    "label.submit": "Absenden",
-    "label.submitted.by": "[Eingereicht von: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Erfolgreich",
-    "label.sunday": "Sonntag",
-    "label.super.cidr.for.guest.networks": "Super CIDR für Gast-Netzwerke",
-    "label.supported.services": "Unterstützte Dienste",
-    "label.supported.source.NAT.type": "Unterstützter Source-NAT-Typ",
-    "label.supportsstrechedl2subnet": "Untersützt Streched L2 Subnet",
-    "label.supportspublicaccess": "Unterstützt öffentlichen Zugriff",
-    "label.suspend.project": "Projekt suspendieren",
-    "label.switch.type": "Switch Typ",
-    "label.system.capacity": "Systemkapazität",
-    "label.system.offering": "Systemangebot",
-    "label.system.offering.for.router": "Systemangebot für Router",
-    "label.system.service.offering": "Systemdienstangebot",
-    "label.system.service.offering.details": "Systemdienstangebotdetails",
-    "label.system.vm": "System-VM",
-    "label.system.vm.details": "System-VM-Details",
-    "label.system.vm.scaled.up": "System-VM hochskaliert",
-    "label.system.vm.type": "System-VM-Typ",
-    "label.system.vms": "System-VMs",
-    "label.system.wide.capacity": "Systemweite Kapazität",
-    "label.tag.key": "Schlagwortschlüssel",
-    "label.tag.value": "Schlagwortwert",
-    "label.tagged": "Markiert",
-    "label.tags": "Markierungen",
-    "label.target.iqn": "Ziel-IQN",
-    "label.task.completed": "Aufgabe fertiggestellt",
-    "label.template": "Vorlage",
-    "label.template.limits": "Vorlagenbegrenzungen",
-    "label.tftp.root.directory": "Tftp root-Verzeichnis",
-    "label.theme.default": "Motiv-Standardeinstellung",
-    "label.theme.grey": "Benutzerdefiniert - Grau",
-    "label.theme.lightblue": "Benutzerdefiniert - Hellblau",
-    "label.threshold": "Schwellenwert",
-    "label.thursday": "Donnerstag",
-    "label.tier": "Ebene",
-    "label.tier.details": "Ebenendetails",
-    "label.time": "Zeit",
-    "label.time.colon": "Zeit:",
-    "label.time.zone": "Zeitzone",
-    "label.timeout": "Zeitüberschreitung",
-    "label.timeout.in.second ": " Zeitüberschreitung (Sekunden)",
-    "label.timezone": "Zeitzone",
-    "label.timezone.colon": "Zeitzone:",
-    "label.token": "Token",
-    "label.total.CPU": "Gesamtanzahl CPU",
-    "label.total.cpu": "Gesamtanzahl CPU",
-    "label.total.hosts": "Gesamtanzahl Hosts",
-    "label.total.memory": "Gesamter Speicher",
-    "label.total.of.ip": "Gesamtzahl der IP-Adressen",
-    "label.total.of.vm": "Gesamtanzahl VMs",
-    "label.total.storage": "Gesamter Speicher",
-    "label.total.virtual.routers": "Total an virtuellen Routern",
-    "label.total.virtual.routers.upgrade": "Total an virtuellen Routern, welche ein Softwareupgrade benötigen",
-    "label.total.vms": "Gesamtanzahl VMs",
-    "label.traffic.label": "Datenverkehrsbezeichnung",
-    "label.traffic.type": "Datenverkehrstyp",
-    "label.traffic.types": "Datenverkehrstypen",
-    "label.tuesday": "Dienstag",
-    "label.type": "Typ",
-    "label.type.id": "Typenkennung",
-    "label.type.lower": "Typ",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK-Tastatur",
-    "label.unavailable": "Nicht verfügbar",
-    "label.unhealthy.threshold": "Schwellwert ungesund",
-    "label.unlimited": "Unbegrenzt",
-    "label.untagged": "Unmarkiert",
-    "label.update.project.resources": "Projektressourcen aktualisieren",
-    "label.update.ssl": " SSL-Zertifikat",
-    "label.update.ssl.cert": " SSL-Zertifikat",
-    "label.updating": "Aktualisierungsvorgang",
-    "label.upgrade.required": "Aktualisierung ist erforderlich",
-    "label.upgrade.router.newer.template": "Router upgraden um neuere Vorlage zu verwenden",
-    "label.upload": "Hochladen",
-    "label.upload.from.local": "Von lokal hochladen",
-    "label.upload.template.from.local": "Vorlage von lokal hochladen",
-    "label.upload.volume": "Volumen hochladen",
-    "label.upload.volume.from.local": "Volumen von lokal hochladen",
-    "label.upload.volume.from.url": "Volumen von URL hochladen",
-    "label.url": "URL",
-    "label.usage.interface": "Auslastungsoberfläche",
-    "label.usage.sanity.result": "Usage Sanity Resultat",
-    "label.usage.server": "Auslastungsserver",
-    "label.usage.type": "Art der Auslastung",
-    "label.usage.unit": "Einheit",
-    "label.use.vm.ip": "VM-IP verwenden:",
-    "label.use.vm.ips": "VM-IPs verwenden",
-    "label.used": "Gebraucht",
-    "label.user": "Benutzer",
-    "label.user.data": "Benutzerdaten",
-    "label.user.details": "Benutzerdetails",
-    "label.user.vm": "Benutzer-VM",
-    "label.username": "Benutzername",
-    "label.username.lower": "Benutzername",
-    "label.users": "Benutzer",
-    "label.vSwitch.type": "vSwitch-Typ",
-    "label.value": "Wert",
-    "label.vcdcname": "vCenter RZ-Name",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter-Cluster",
-    "label.vcenter.datacenter": "vCenter-Rechenzentrum",
-    "label.vcenter.datastore": "vCenter-Datenspeicher",
-    "label.vcenter.host": "vCenter-Host",
-    "label.vcenter.password": "vCenter-Passwort",
-    "label.vcenter.username": "vCenter-Benutzername",
-    "label.vcipaddress": "vCenter-IP-Adresse",
-    "label.version": "Version",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Maximale Auflösung",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs pro GPU",
-    "label.vgpu.remaining.capacity": "Verbleibende Kapazität",
-    "label.vgpu.type": "vGPU-Typ",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Ansicht",
-    "label.view.all": "Alle ansehen",
-    "label.view.console": "Konsole ansehen",
-    "label.view.more": "Weitere ansehen",
-    "label.view.secondary.ips": "Sekundäre IPs ansehen",
-    "label.viewing": "Ansehen",
-    "label.virtual.appliance": "Virtuelle Applicance",
-    "label.virtual.appliance.details": "Virtuelle Appliance Details",
-    "label.virtual.appliances": "Virtuelle Appliances",
-    "label.virtual.machine": "Virtuelle Maschine",
-    "label.virtual.machines": "Virtuelle Maschinen",
-    "label.virtual.network": "Virtuelles Netzwerk",
-    "label.virtual.networking": "Virtuelle Netzwerkverbindung",
-    "label.virtual.router": "Virtueller Router",
-    "label.virtual.routers": "Virtuelle Router",
-    "label.virtual.routers.group.account": "Virtuelle Router gruppiert nach Benutzerkonto",
-    "label.virtual.routers.group.cluster": "Virtuelle Router gruppiert nach Cluster",
-    "label.virtual.routers.group.pod": "Virtuelle Router gruppiert nach Pod",
-    "label.virtual.routers.group.zone": "Virtuelle Router gruppiert nach Zone",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "VLAN/VNI-Kennung",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI-Bereich",
-    "label.vlan.range.details": "VLAN-Bereichdetails",
-    "label.vlan.ranges": "VLAN-Bereich(e)",
-    "label.vlan.vni.range": "VLAN/VNI-Bereich",
-    "label.vlan.vni.ranges": "VLAN/VNI-Bereich(e)",
-    "label.vm.add": "Instanz hinzufügen",
-    "label.vm.destroy": "Zerstören",
-    "label.vm.display.name": "VM-Anzeigename",
-    "label.vm.id": "VM-Kennung",
-    "label.vm.ip": "VM-IP-Adresse",
-    "label.vm.name": "VM-Name",
-    "label.vm.password": "Passwort der VM ist",
-    "label.vm.reboot": "Neustart",
-    "label.vm.start": "Start",
-    "label.vm.state": "VM-Status",
-    "label.vm.stop": "Stopp",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "VM-Schnappschüsse",
-    "label.vmsnapshot.current": "istAktuell",
-    "label.vmsnapshot.memory": "Schnappschussspeicher",
-    "label.vmsnapshot.parentname": "Übergeordnet",
-    "label.vmsnapshot.type": "Typ",
-    "label.vmware.datacenter.id": "VMware-Rechenzentrumskennung",
-    "label.vmware.datacenter.name": "VMware-Rechenzentrumsname",
-    "label.vmware.datacenter.vcenter": "VMware Rechenzentrum-vCenter",
-    "label.vmware.traffic.label": "VMware Datenverkehrs-Bezeichnung",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI-Kennung",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC-Geräte",
-    "label.volatile": "Vergänglich",
-    "label.volgroup": "Volumengruppe",
-    "label.volume": "Volume",
-    "label.volume.details": "Volumendetails",
-    "label.volume.limits": "Volumenbegrenzungen",
-    "label.volume.migrated": "Volumen migriert",
-    "label.volume.name": "Volumenname",
-    "label.volumes": "Volumina",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Verteilter VPC-Router",
-    "label.vpc.id": "VPC-Kennung",
-    "label.vpc.offering": "VPC-Angebot",
-    "label.vpc.offering.details": "VPC-Angebotdetails",
-    "label.vpc.router.details": "VPC-Routerdetails",
-    "label.vpc.supportsregionlevelvpc": "Unterstützt Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtueller Router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN Customer Gateway",
-    "label.vpn.force.encapsulation": "Erzwinge eine Kapselung der UDP- in ESP-Pakete",
-    "label.vsmctrlvlanid": "Steuerungs-VLAN-Kennung",
-    "label.vsmpktvlanid": "Paket-VLAN-Kennung",
-    "label.vsmstoragevlanid": "Speicher-VLAN-Kennung",
-    "label.vsphere.managed": "vSphere verwaltet",
-    "label.vswitch.name": "vSwitch-Name",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN-Kennung",
-    "label.vxlan.range": "VXLAN-Bereich",
-    "label.waiting": "Warten",
-    "label.warn": "Warnen",
-    "label.warn.upper": "WARNEN",
-    "label.warning": "Warnung",
-    "label.wednesday": "Mittwoch",
-    "label.weekly": "Wöchentlich",
-    "label.welcome": "Willkommen",
-    "label.welcome.cloud.console": "Willkommen bei der Verwaltungskonsole",
-    "label.what.is.cloudstack": "Was ist CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Originale XS-Version ist 6.1+",
-    "label.xenserver.traffic.label": "XenServer Datenverkehrs-Bezeichnung",
-    "label.yes": "Ja",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone dediziert",
-    "label.zone.details": "Zonendetails",
-    "label.zone.id": "Zone ID",
-    "label.zone.lower": "Zone",
-    "label.zone.name": "Zonenname",
-    "label.zone.step.1.title": "Schritt 1: <strong>Wählen Sie ein Netzwerk aus</strong>",
-    "label.zone.step.2.title": "Schritt 2: <strong>Fügen Sie eine Zone hinzu</strong>",
-    "label.zone.step.3.title": "Schritt 3: <strong>Pod hinzufügen</strong>",
-    "label.zone.step.4.title": "Schritt 4: <strong>Fügen Sie einen IP-Bereich hinzu</strong>",
-    "label.zone.type": "Zonentyp",
-    "label.zone.wide": "Zonenweit",
-    "label.zoneWizard.trafficType.guest": "Gast: Datenverkehr zwischen den virtuellen Maschinen der Endbenutzer",
-    "label.zoneWizard.trafficType.management": "Management: Datenverkehr zwischen den CloudStack internen Ressourcen, inklusive aller Komponenten, die mit dem Management Server kommunizieren, wie Hosts und CloudStack System VMs",
-    "label.zoneWizard.trafficType.public": "Öffentlich: Datenverkehr zwischen dem Internet und virtuellen Maschinen in der Cloud.",
-    "label.zoneWizard.trafficType.storage": "Speicherung: Datenverkehr zwischen Haupt- und Sekundärspeicherserver, wie VM-Vorlagen und Schnappschüsse.",
-    "label.zones": "Zonen",
-    "managed.state": "Verwalteter Status",
-    "message.XSTools61plus.update.failed": "Die Aktuallisierung des Original XS Version ist 6.1+ Feldes ist fehlgeschlagen. Fehlermeldung:",
-    "message.Zone.creation.complete": "Zonenerstellung abgeschlossen",
-    "message.acquire.ip.nic": "Bitte bestätigen Sie, dass Sie eine neue, sekundäre IP-Adresse für dieses Netzwerk-Schnittstelle benötigen.<br/>HINWEIS: Sie müssen diese neue sekundäre IP-Adresse manuell in der virtuellen Maschine hinzufügen.",
-    "message.acquire.new.ip": "Bitte bestätigen Sie, dass sie eine neue IP Adresse für dieses Netzwerk haben möchten.",
-    "message.acquire.new.ip.vpc": "Bitte bestätigen Sie, dass sie eine neue IP Adresse für diesen VPC benötigen.",
-    "message.acquire.public.ip": "Bitte wählen Sie eine Zone, von der Sie Ihre neue IP erlangen möchten.",
-    "message.action.cancel.maintenance": "Ihr Host ist erfolgreich für die Wartung abgebrochen. Dieser Prozess kann ein paar Minuten dauern.",
-    "message.action.cancel.maintenance.mode": "Bitte bestätigen Sie, dass Sie die Wartung abbrechen möchten.",
-    "message.action.change.service.warning.for.instance": "Ihre Instanz muss zuerst unterbrochen werden, bevor Sie Ihr derzeitiges Dienstangebot ändern können.",
-    "message.action.change.service.warning.for.router": "Ihr Router muss zuerst unterbrochen werden, bevor Sie Ihr derzeitiges Dienstangebot ändern können.",
-    "message.action.delete.ISO": "Bitte bestätigen Sie, dass Sie diese ISO löschen möchten.",
-    "message.action.delete.ISO.for.all.zones": "Die ISO gilt für alle Zonen. Bitte bestätigen Sie, dass Sie diese aus allen Zonen löschen möchten.",
-    "message.action.delete.cluster": "Bitte bestätigen Sie, dass Sie dieses Cluster löschen möchten.",
-    "message.action.delete.disk.offering": "Bitte bestätigen Sie, dass Sie dieses Festplattenangebot löschen möchten.",
-    "message.action.delete.domain": "Bitte bestätigen Sie, dass Sie diese Domain löschen möchten.",
-    "message.action.delete.external.firewall": "Bitte bestätigen Sie, dass Sie die externe Firewall entfernen möchten. Warnung: Wenn Sie planen dieselbe exterene Firewall wieder hinzuzufügen, müssen Sie sämtliche Nutzungsdaten auf diesem Gerät zurücksetzen",
-    "message.action.delete.external.load.balancer": "Bitte bestätigen Sie, dass Sie diesen externen Loadbalancer entfernen möchten. Warnung: Wenn Sie planen denselben exterenen Loadbalancer wieder hinzuzufügen, müssen Sie sämtliche Nutzungsdaten auf diesem Gerät zurücksetzen",
-    "message.action.delete.ingress.rule": "Bitte bestätigen Sie, dass Sie diese Zutrittsregel löschen wollen.",
-    "message.action.delete.network": "Bitte bestätigen Sie, dass Sie dieses Netzwerk löschen möchten.",
-    "message.action.delete.nexusVswitch": "Bitte bestätigen Sie, dass Sie diesen nexus 1000v löschen möchten.",
-    "message.action.delete.nic": "Bitte bestätigen Sie die Löschung dieser NIC, da dies auch zur Löschung des zugehörigen Netzwerks von der VM führt.",
-    "message.action.delete.physical.network": "Bitte bestätigen Sie, dass Sie dieses physikalische Netzwerk löschen möchten",
-    "message.action.delete.pod": "Bitte bestätigen Sie, dass Sie dieses pod löschen möchten.",
-    "message.action.delete.primary.storage": "Bitte bestätigen Sie, dass Sie diese Hauptspeicher löschen möchten.",
-    "message.action.delete.secondary.storage": "Bitte bestätigen Sie, dass Sie diesen Sekundärspeicher löschen möchten.",
-    "message.action.delete.security.group": "Bitte bestätigen Sie, dass Sie diese Sicherheitsgruppe löschen möchten.",
-    "message.action.delete.service.offering": "Bitte bestätigen Sie, dass Sie dieses Dienstangebot löschen möchten.",
-    "message.action.delete.snapshot": "Bitte bestätigen Sie, dass Sie diesen Schnappschuss löschen möchten.",
-    "message.action.delete.system.service.offering": "Bitte bestätigen Sie, dass Sie dieses Dienstangebot des Systems löschen möchten",
-    "message.action.delete.template": "Bitte bestätigen Sie, dass Sie diese Vorlage löschen möchten.",
-    "message.action.delete.template.for.all.zones": "Die Vorlage wird für alle Zonen genutzt. Bitte bestätigen Sie, dass Sie diese für alle Zonen löschen möchten.",
-    "message.action.delete.volume": "Bitte bestätigen Sie, dass Sie dieses Volumen löschen möchten.",
-    "message.action.delete.zone": "Bitte bestätigen Sie, dass Sie diese Zone löschen möchten.",
-    "message.action.destroy.instance": "Bitte bestätigen Sie, dass Sie diese Instanz löschen möchten.",
-    "message.action.destroy.systemvm": "Bitte bestätigen Sie, dass Sie diese System-VM zerstören möchten.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Bitte bestätigen Sie, dass Sie diesen Cluster deaktivieren möchten.",
-    "message.action.disable.nexusVswitch": "Bitte bestätigen Sie, dass sie diesen nexus 1000v deaktivieren möchten.",
-    "message.action.disable.physical.network": "Bitte bestätigen Sie, dass Sie dieses physikalische Netzwerk deaktivieren möchten.",
-    "message.action.disable.pod": "Bitte bestätigen Sie, dass Sie diesen Pod deaktivieren möchten.",
-    "message.action.disable.static.NAT": "Bitte bestätigen Sie, dass Sie die statische NAT deaktivieren möchten.",
-    "message.action.disable.zone": "Bitte bestätigen Sie, dass Sie diese Zone deaktivieren möchten.",
-    "message.action.download.iso": "Bitte bestätigen Sie, dass Sie dieses ISO herunterladen möchten.",
-    "message.action.download.template": "Bitte bestätigen Sie, dass Sie dieses Template herunterladen möchten.",
-    "message.action.downloading.template": "Vorlage wird heruntergeladen.",
-    "message.action.enable.cluster": "Bitte bestätigen Sie, dass Sie diesen Cluster aktivieren möchten.",
-    "message.action.enable.maintenance": "Ihr Host wurde erfolgreich für die Wartung vorbereitet. Dieser Prozess kann einige Minuten, oder abhänig von der jetzigen Anzahl VMs auf diesem Host auch länger, in Anspruch nehmen.",
-    "message.action.enable.nexusVswitch": "Bitte bestätigen Sie, dass sie diesen nexus 1000v aktivieren möchten.",
-    "message.action.enable.physical.network": "Bitte bestätigen Sie, dass Sie dieses physikalische Netzwerk aktivieren möchten.",
-    "message.action.enable.pod": "Bitte bestätigen Sie, dass Sie diesen Pod aktivieren möchten.",
-    "message.action.enable.zone": "Bitte bestätigen Sie, dass Sie diese Zone aktivieren möchten.",
-    "message.action.expunge.instance": "Bitte bestätigen Sie, dasss Sie diese Instanz unwiederbringlich löschen möchten.",
-    "message.action.force.reconnect": "Ihr Host wurde erfolgreich gewzungen wiederzuverbinden. Dieser Prozess kann einige Minuten beanspruchen.",
-    "message.action.host.enable.maintenance.mode": "Die Aktivierung des Wartungsmodus verursacht eine Livemigration aller laufenden Instanzen auf diesem Host zu einem anderen verfügbaren Host.",
-    "message.action.instance.reset.password": "Bitte bestätigen Sie, dass Sie das ROOT Passwort für diese virtuelle Maschine ändern möchten.",
-    "message.action.manage.cluster": "Bitte bestätigen Sie, dass das Cluster bearbeitet werden soll.",
-    "message.action.primarystorage.enable.maintenance.mode": "Warnung: den Hauptspeicher in den Wartungsmodus zu stellen, wird alle VMs stoppen, welche noch Volumen auf demjenigen haben. Möchten Sie fortfahren?",
-    "message.action.reboot.instance": "Bitte bestätigen Sie, dass Sie diese Instanz neu starten möchten.",
-    "message.action.reboot.router": "Alle angebotenen Dienste dieses Routers werden unterbrochen. Bitte bestätigen Sie, dass Sie den Router neu starten möchten.",
-    "message.action.reboot.systemvm": "Bitte bestätigen Sie, dass Sie diese System-VM neu starten möchten.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Bitte bestätigen Sie, dass Sie diese IP freigeben möchten.",
-    "message.action.remove.host": "Bitte bestätigen Sie, dass Sie diesen Host entfernen möchten.",
-    "message.action.reset.password.off": "Ihre Instanz unterschützt derzeitig nicht dieses Feature.",
-    "message.action.reset.password.warning": "Ihre Instanz muss zuerst unterbrochen werden, bevor Sie Ihr derzeitiges Passwort ändern können.",
-    "message.action.restore.instance": "Bitte bestätigen Sie, dass Sie diese Instanz wiederherstellen möchten.",
-    "message.action.revert.snapshot": "Bitte bestätigen Sie, dass Sie das dazugehörige Volumen zu diesen Schnappschuss zurücksetzten möchten.",
-    "message.action.start.instance": "Bitte bestätigen Sie, dass Sie diese Instanz starten möchten.",
-    "message.action.start.router": "Bitte bestätigen Sie, dass Sie diesen Router starten möchten.",
-    "message.action.start.systemvm": "Bitte bestätigen Sie, dass Sie diese System-VM starten möchten.",
-    "message.action.stop.instance": "Bitte bestätigen Sie, dass Sie diese Instanz anhalten möchten.",
-    "message.action.stop.router": "Alle von diesem Router angebotenen Dienste werden unterbrochen. Bitte bestätigen Sie, dass Sie diesen Router stoppen möchten.",
-    "message.action.stop.systemvm": "Bitte bestätigen Sie, dass Sie diese System-VM stoppen möchten.",
-    "message.action.take.snapshot": "Bitte bestätigen Sie, dass Sie einen Schnappschuss von diesem Volumen sichern möchten.",
-    "message.action.snapshot.fromsnapshot":"Bitte bestätigen Sie, dass Sie einen Schnappschuss von diesem VM Schnappschuss sichern möchten.",
-    "message.action.unmanage.cluster": "Bitte bestätigen Sie, dass Sie das Cluster vernachlässigen möchten.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Bitte bestätigen Sie, dass Sie diesen VM Schnappschuss löschen wollen.",
-    "message.action.vmsnapshot.revert": "VM-Schnappschuss zurücksetzen",
-    "message.action.vmstoragesnapshot.create":"Bitte wählen Sie einen Speicher aus, für den ein Schnappschuss erstellt werden soll.",
-    "message.activate.project": "Sind Sie sicher, dass Sie dieses Projekt aktivieren wollen?",
-    "message.add.VPN.gateway": "Bitte bestätigen Sie, dass sie ein VPN Gateway hinzufügen wollen.",
-    "message.add.cluster": "Hinzufügen eines vom Hypervisor verwaltender Clusters für Zone <b><span id=\"zone_name\"></span></b>, Pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Ein Hypervisor verwalteter Cluster für Zone <b><span id=\"zone_name\"></span></b> hinzufügen",
-    "message.add.disk.offering": "Bitte spezifizieren Sie die folgenden Parameter, um ein neues Festplattenangebot hinzuzufügen.",
-    "message.add.domain": "Bitte spezifizieren Sie die Subdomain, die Sie unter dieser Domain erstellen wollen.",
-    "message.add.firewall": "Eine Firewall zur Zone hinzufügen",
-    "message.add.guest.network": "Bitte bestätigen Sie, dass Sie ein Gast-Netzwerk hinzufügen möchten.",
-    "message.add.host": "Bitte spezifizieren Sie die folgenden Parameter, um einen neuen Host hinzuzufügen.",
-    "message.add.ip.range": "IP-Bereich zu öffentlichem Netzwerk in Zone hinzufügen",
-    "message.add.ip.range.direct.network": "Einen IP-Bereich zum direkten Netzwerk<b><span id=\"directnetwork_name\"></span></b> in Zone hinzufügen <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Einen IP-Bereich zum Pod hinzufügen <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Einen Lastverteiler zur Zone hinzufügen",
-    "message.add.load.balancer.under.ip": "Die Lasterverteiler-Regel wurde hinzugefügt zu IP:",
-    "message.add.network": "Eine neues Netzwerk für Zone hinzufügen:  <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Bitte spezifizieren Sie Informationen  um ein neues Gateway für dieses VPC hinzuzufügen.",
-    "message.add.pod": "Ein neuer Pod für Zone <b><span id=\"add_pod_zone_name\"></span></b> hinzufügen",
-    "message.add.pod.during.zone.creation": "Jede Zone muss mindestens einen Pod enthalten, welchen wir nun konfigurieren und hinzufügen. Ein Pod enthält Hosts und primären Storage, welche in einem späteren Schritt hinzugefügt werden. Zuerst konfigurieren Sie den Bereich der reservierten IP-Adressen für CloudStacks internen Verwaltungsdatenverkehr. Der reservierte IP-Bereich muss für jede Zone in der Cloud eindeutig sein.",
-    "message.add.primary": "Bitte spezifizieren Sie die folgenden Parameter, um einen neuen Hauptspeicher hinzuzufügen",
-    "message.add.primary.storage": "Bitte fügen Sie einen neuen primären Speicher für Zone <b><span id=\"zone_name\"></span></b>, und Pod <b><span id=\"pod_name\"></span></b> hinzu.",
-    "message.add.region": "Bitte geben Sie die benötigten Informationen ein um eine neue Region hinzuzufügen",
-    "message.add.secondary.storage": "Bitte fügen Sie einen neuen Speicher für die Zone <b><span id=\"zone_name\"></span></b> hinzu.",
-    "message.add.service.offering": "Bitte geben Sie die folgenden Daten ein, um ein neues Berechnungsangebot hinzuzufügen.",
-    "message.add.system.service.offering": "Bitte geben Sie die folgenden Daten ein, um ein neues Systemdienstangebot hinzuzufügen.",
-    "message.add.template": "Bitte geben Sie die folgende Daten ein, um Ihre neue Vorlage zu erstellen",
-    "message.add.volume": "Bitte geben Sie die folgende Daten ein, um ein neues Volumen hinzuzufügen.",
-    "message.added.vpc.offering": "VPC-Angebot hinzugefügt",
-    "message.adding.Netscaler.device": "Hinzufügen eines Netscaler Gerätes",
-    "message.adding.Netscaler.provider": "Hinzufügen eines Netscaler Provider",
-    "message.adding.host": "Host wird hinzugefügt",
-    "message.additional.networks.desc": "Bitte wählen Sie ein oder mehrere Netzwerke aus, an die Ihre virtuelle Instanz verbunden wird.",
-    "message.admin.guide.read": "Für VMware basierte VMs, lesen Sie bitte den Abschnitt über das dynamische Skalieren in dem Administrations-Leitfaden bevor Sie hochskalieren. Möchten Sie fortfahren?",
-    "message.advanced.mode.desc": "Wählen Sie dieses Netzwerkmodell aus, wenn Sie VLAN-Unterstützung aktivieren möchten. Dieses Netzwerkmodell bietet die größte Flexibilität um Administratoren kundenspezifische Netzwerkangebote zu ermöglichen, wie das Anbieten von Firewall, VPN oder Lastverteilerunterstützung wie auch aktivieren direkten gegen virtuellen Netzwerkverkehr.",
-    "message.advanced.security.group": "Wählen Sie dies, wenn Sie Sicherheits Gruppen verwenden wollen, um eine Isolation für Gast VMs anzubieten.",
-    "message.advanced.virtual": "Wählen Sie dies, wenn Sie Zonen-weite VLANs verwenden wollen, um eine Isolation für Gast VMs anzubieten.",
-    "message.after.enable.s3": "S3-gestützter zweiter Speicher konfiguriert. Hinweis: Wenn Sie dieses Seite verlassen, können Sie S3 nicht mehr umkonfigurieren.",
-    "message.after.enable.swift": "Swift ist konfiguriert. Bemerkung: Wenn Sie diese Seite verlassen, werden Sie nicht mehr in der Lage sein Swift um zu konfigurieren.",
-    "message.alert.state.detected": "Alarmstatus erkannt",
-    "message.allow.vpn.access": "Bitte geben Sie einen Benutzernamen und ein Kennwort für den Benutzer ein, für den Sie VPN-Zugang möchten.",
-    "message.apply.snapshot.policy": "Sie haben Ihre derzeitige Schnappschuss Richtlinie erfolgreich aktualisiert.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Bitte bestätigen Sie, dass sie die ISO zu Ihrer virtuellen Instanz hinzufügen möchten.",
-    "message.attach.volume": "Bitte füllen Sie die folgenden Daten aus um neue Volumen anzubinden. Falls Sie das Festplattenvolumen zu einer Windows-basierten virtuellen Maschine anbinden, müssen Sie die Instanz neu starten um die angebundene Festplatte verwenden zu können.",
-    "message.basic.mode.desc": "Wählen Sie dieses Netzwerk-Modell falls Sie <b>*<u>keine</u>*</b> VLAN-Unterstützung aktivieren möchten. Allen virtuellen Instanzen unter diesem Netzwerk-Modell erhalten eine IP direkt von Netzwerk, Sicherheitsgruppen werden verwendet um Sicherheit und Trennung zu gewährleisten.",
-    "message.change.ipaddress": "Bitte bestätigen Sie, dass Sie die IP Adresse für dieses NIC auf dieser VM ändern möchten.",
-    "message.change.offering.confirm": "Bitte bestätigen Sie, dass Sie das Dienstangebot dieser virtuellen Instanz ändern möchten.",
-    "message.change.password": "Bitte ändern Sie Ihre Passwort.",
-    "message.cluster.dedicated": "Cluster dediziert",
-    "message.cluster.dedication.released": "Cluster-Dedizierung aufgehoben",
-    "message.configure.all.traffic.types": "Sie haben mehrere physikalische Netzwerke; bitte konfigurieren Sie für jeden Datenverkehrstyp Bezeichnungen indem Sie auf den Bearbeiten-Knopf klicken",
-    "message.configure.firewall.rules.allow.traffic": "Konfigurieren Sie die Regeln um Datenverkehr zu erlauben",
-    "message.configure.firewall.rules.block.traffic": "Konfigurieren Sie die Regeln um den Datenverkehr zu blockieren",
-    "message.configure.ldap": "Bitte bestätigen Sie, dass Sie LDAP konfigurieren möchten.",
-    "message.configuring.guest.traffic": "Gast-Datenverkehr wird konfiguriert",
-    "message.configuring.physical.networks": "Physikalische Netzwerke werden konfiguriert",
-    "message.configuring.public.traffic": "Öffentlicher Datenverkehr wird konfiguriert",
-    "message.configuring.storage.traffic": "Speicherungsdatenverkehr wird konfiguriert",
-    "message.confirm.action.force.reconnect": "Bitte bestätigen Sie, dass Sie für diesen Host das Wiederverbinden erzwingen möchten.",
-    "message.confirm.add.vnmc.provider": "Bitte bestätigen Sie, dass Sie den VNMC-Provider hinzufügen möchten.",
-    "message.confirm.archive.alert": "Bitte bestätigen Sie, dass Sie diesen Alarm archivieren möchten.",
-    "message.confirm.archive.event": "Bitte bestätigen Sie, dass Sie dieses Ereignis archivieren möchten.",
-    "message.confirm.archive.selected.alerts": "Bitte bestätigen Sie, dass Sie die ausgewählten Alarme archivieren möchten",
-    "message.confirm.archive.selected.events": "Bitte bestätigen Sie, dass Sie die ausgewählten Vorgänge archivieren möchten",
-    "message.confirm.attach.disk": "Sind Sie sicher, dass Sie eine Platte hinzufügen möchten?",
-    "message.confirm.create.volume": "Sind Sie sicher, dass Sie ein Volumen erstellen möchten?",
-    "message.confirm.current.guest.CIDR.unchanged": "Möchten Sie den aktuellen Gastnetzwerk CIDR unverändert lassen?",
-    "message.confirm.dedicate.cluster.domain.account": "Möchten Sie diesen Cluster wirklich für diese Domain / dieses Benutzerkonto dedizieren?",
-    "message.confirm.dedicate.host.domain.account": "Möchten Sie diesen Host wirklich für diese Domain / dieses Benutzerkonto dedizieren?",
-    "message.confirm.dedicate.pod.domain.account": "Möchten Sie diesen Pod wirklich für diese Domain / dieses Benutzerkonto dedizieren?",
-    "message.confirm.dedicate.zone": "Möchten Sie diese Zone wirklich für diese Domain / dieses Benutzerkonto dedizieren?",
-    "message.confirm.delete.BigSwitchBcf": "Bitte bestätigen Sie, dass Sie diesen BigSwitch BCF Controller löschen möchten",
-    "message.confirm.delete.BrocadeVcs": "Bitte bestätigen Sie, dass Sie Brocade Vcs Switch löschen möchten",
-    "message.confirm.delete.F5": "Bitte bestätigen Sie, dass Sie F5 löschen möchten",
-    "message.confirm.delete.NetScaler": "Bitte bestätigen Sie, dass Sie NetScaler löschen möchten",
-    "message.confirm.delete.PA": "Bitte bestätigen Sie, dass Sie Palo Alto löschen möchten",
-    "message.confirm.delete.SRX": "Bitte bestätigen Sie, dass Sie SRX löschen möchten",
-    "message.confirm.delete.acl.list": "Sind Sie sicher, dass Sie diese ACL-Liste löschen möchten?",
-    "message.confirm.delete.alert": "Sind Sie sicher, dass Sie diesen Alarm löschen möchten?",
-    "message.confirm.delete.baremetal.rack.configuration": "Bitte bestätigen Sie, dass sie die Baremetal Rackkonfiguration löschen wollen.",
-    "message.confirm.delete.ciscoASA1000v": "Bitte bestätigen Sie, dass Sie CiscoASA1000v löschen möchten",
-    "message.confirm.delete.ciscovnmc.resource": "Bitte bestätigen Sie, dass Sie die CiscoVNMC Ressource löschen möchten",
-    "message.confirm.delete.internal.lb": "Bitte bestätigen Sie, dass Sie den internen Loadbalancer löschen möchten",
-    "message.confirm.delete.secondary.staging.store": "Bitte bestätigen Sie, dass Sie diesen Sekundär-Staging-Store löschen möchten.",
-    "message.confirm.delete.ucs.manager": "Bitte bestätigen Sie, dass Sie UCS-Manager löschen möchten",
-    "message.confirm.destroy.router": "Bitte bestätigen Sie, dass Sie diesen Router zerstören möchten",
-    "message.confirm.disable.host": "Bitte bestätigen Sie, dass Sie den Host deaktivieren möchten",
-    "message.confirm.disable.network.offering": "Sind Sie sicher, dass Sie dieses Netzwerkangebot deaktivieren möchten?",
-    "message.confirm.disable.provider": "Bitte bestätigen Sie, dass Sie diesen Anbieter löschen möchten",
-    "message.confirm.disable.vnmc.provider": "Bitte bestätigen Sie, dass Sie den VNMC-Provider deaktivieren möchten.",
-    "message.confirm.disable.vpc.offering": "Sind Sie sicher, dass Sie dieses VPC-Angebot deaktivieren möchten?",
-    "message.confirm.enable.host": "Bitte bestätigen Sie, dass Sie den Host aktivieren möchten",
-    "message.confirm.enable.network.offering": "Sind Sie sicher, dass Sie dieses Netzwerkangebot aktivieren möchten?",
-    "message.confirm.enable.provider": "Bitte bestätigen Sie, dass Sie diesen Anbieter hinzufügen möchten",
-    "message.confirm.enable.vnmc.provider": "Bitte bestätigen Sie, dass Sie den VNMC-Provider aktivieren möchten.",
-    "message.confirm.enable.vpc.offering": "Sind Sie sicher, dass Sie dieses VPC-Angebot aktivieren möchten?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Bitte bestätigen Sie, dass Sie diesem Projekt beitreten möchten.",
-    "message.confirm.migrate.volume": "Möchten Sie dieses Volumen migrieren?",
-    "message.confirm.refresh.blades": "Bitte bestätigen Sie, dass Sie die Blades aktuallisieren möchten.",
-    "message.confirm.release.dedicate.vlan.range": "Bitte bestätigen Sie, dass Sie ein dedizierten VLAN-Bereich loslösen möchten",
-    "message.confirm.release.dedicated.cluster": "Möchten Sie diesen dedizierten Cluster freigeben?",
-    "message.confirm.release.dedicated.host": "Möchten Sie diesen dedizierten Host freigeben?",
-    "message.confirm.release.dedicated.pod": "Möchten Sie diesen dedizierten Pod freigeben?",
-    "message.confirm.release.dedicated.zone": "Möchten Sie diese dedizierte Zone freigeben?",
-    "message.confirm.remove.IP.range": "Bitte bestätigen Sie, dass sie diesen IP Adressbereich löschen möchten.",
-    "message.confirm.remove.event": "Sind Sie sicher, dass Sie dieses Ereignis entfernen möchten?",
-    "message.confirm.remove.load.balancer": "Bitte bestätigen Sie, dass Sie die VM vom Lastverteiler zurückziehen möchten",
-    "message.confirm.remove.network.offering": "Sind Sie sicher, dass Sie dieses Netzwerkangebot entfernen möchten?",
-    "message.confirm.remove.selected.alerts": "Bitte bestätigen Sie, dass Sie die ausgewählten Alarme entfernen möchten",
-    "message.confirm.remove.selected.events": "Bitte bestätigen Sie, dass Sie die ausgewählten Ereignisse entfernen möchten",
-    "message.confirm.remove.vmware.datacenter": "Bitte bestätigen Sie, dass Sie das VMware Rechenzentrum entfernen möchten",
-    "message.confirm.remove.vpc.offering": "Sind Sie sicher, dass Sie dieses VPC-Angebot entfernen möchten?",
-    "message.confirm.replace.acl.new.one": "Möchten Sie die ACL durch die neue ersetzen?",
-    "message.confirm.scale.up.router.vm": "Möchten Sie die Router-VM wirklich hochskalieren?",
-    "message.confirm.scale.up.system.vm": "Möchten Sie die System-VM wirklich hochskalieren?",
-    "message.confirm.shutdown.provider": "Bitte bestätigen Sie, dass sie diesen Anbieter herunterfahren möchten.",
-    "message.confirm.start.lb.vm": "Bitte bestätigen Sie, dass Sie die LB VM starten möchten",
-    "message.confirm.stop.lb.vm": "Bitte bestätigen Sie, dass Sie die LB VM stoppen möchten",
-    "message.confirm.upgrade.router.newer.template": "Bitte bestätigen Sie, dass Sie den Router aktuallisieren möchten, so dass er die neue Vorlage verwendet.",
-    "message.confirm.upgrade.routers.account.newtemplate": "Bitte bestätigen Sie, dass Sie alle Router zu dieser Benutzerkonto aktuallisieren möchten, so dass sie die neue Vorlage verwenden.",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Bitte bestätigen Sie, dass Sie alle Router in diesem Cluster aktuallisieren möchten, so dass sie die neue Vorlage verwenden.",
-    "message.confirm.upgrade.routers.newtemplate": "Bitte bestätigen Sie, dass Sie alle Router in dieser Zone aktuallisieren möchten, so dass sie die neue Vorlage verwenden.",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Bitte bestätigen Sie, dass Sie alle Router in diesem Pod aktuallisieren möchten, so dass sie die neue Vorlage verwenden.",
-    "message.copy.iso.confirm": "Bitte bestätigen Sie, dass Sie Ihre ISO kopieren möchten und zwar nach",
-    "message.copy.template": "Kopiere Vorlage <b id=\"copy_template_name_text\">XXX</b> von Zone <b id=\"copy_template_source_zone_text\"></b> nach",
-    "message.copy.template.confirm": "Sind Sie sicher, dass Sie die Vorlage kopieren möchten?",
-    "message.create.template": "Sind Sie sicher, dass Sie eine Vorlage erstellen möchten?",
-    "message.create.template.vm": "VM aus Vorlage <b id=\"p_name\"></b> erstellen",
-    "message.create.template.volume": "Bitte definieren Sie die folgenden Informationen bevor Sie eine Vorlage für Ihr Festplattenvolumen erstellen: <b><span id=\"volume_name\"></span></b>. Das Erstellen der Vorlage kann einige Minuten oder abhängig von der Volumengröße auch länger dauern.",
-    "message.creating.cluster": "Cluster wird erstellt",
-    "message.creating.guest.network": "Gastnetzwerk wird erstellt",
-    "message.creating.physical.networks": "Physikalische Netzwerke werden erstellt",
-    "message.creating.pod": "Erstelle einen Pod",
-    "message.creating.primary.storage": "Hauptspeicher wird erstellt",
-    "message.creating.secondary.storage": "Sekundärspeicher wird erstellt",
-    "message.creating.systemVM": "Erstellung von System VMs (das kann eine Weile dauern)",
-    "message.creating.zone": "Zone wird erstellt",
-    "message.decline.invitation": "Sind Sie sicher, dass Sie diese Einladung zu dem Projekt ablehnen möchten?",
-    "message.dedicate.zone": "Dediziere Zone",
-    "message.dedicated.zone.released": "Zonen-Dedizierung freigegeben",
-    "message.delete.VPN.connection": "Bitte bestätigen Sie, dass Sie die VPN-Verbindung löschen möchten",
-    "message.delete.VPN.customer.gateway": "Bitte bestätigen Sie, dass Sie dieses Kunden VPN Gateway löschen möchten",
-    "message.delete.VPN.gateway": "Bitte bestätigen Sie, dass Sie dieses VPN Gateway löschen möchten",
-    "message.delete.account": "Bitte bestätigen Sie, dass Sie dieses Benutzerkonto löschen möchten.",
-    "message.delete.affinity.group": "Bitte bestätigen Sie, dass Sie diese Affinitätsgruppe löschen möchten.",
-    "message.delete.gateway": "Bitte bestätigen Sie, dass Sie dieses Gateway löschen möchten",
-    "message.delete.project": "Sind Sie sicher, dass Sie dieses Projekt löschen möchten?",
-    "message.delete.user": "Bitte bestätigen Sie, dass Sie diesen Benutzer löschen möchten.",
-    "message.desc.add.new.lb.sticky.rule": "Neue Lastverteiler Sticky Regel hinzufügen",
-    "message.desc.advanced.zone": "Für anspruchvollere Netzwerk-Topologien. Dieses Netzwerkmodell bietet die höchste Flexibilität beim Definieren der Gast-Netzwerke und beim Anbieten von maßgeschneiderten Nerzwerk-Angeboten wie Firewall-, VPN- oder Lastverteilungsunterstützung.",
-    "message.desc.basic.zone": "Biete ein einzelnes Netzwerk an, in dem alle VM-Instanzen direkt mit IP vom Netzwerk verbunden sind. Gästeisolation kann durch Layer-3 wie Sicherheitsgruppen angeboten werden (IP-Adressen Source Filtering)",
-    "message.desc.cluster": "Jeder Pod muss einen oder mehrere Clusters enthalten, und wir werden jetzt den ersten Cluster hinzufügen. Ein Cluster bietet die Möglichkeit Hosts zu gruppieren. Die Hosts in einem Cluster haben alle identische Hardware, betreiben den selben Hypervisor, sind im selben Subnetz und greiffen auf den selben geteilten Speicher zu. Jeder Cluster besteht aus einem oder mehreren Hosts und einem oder mehreren Hauptspeicher-Server.",
-    "message.desc.create.ssh.key.pair": "Bitte die folgenden Daten eintragen um einen SSH-Schlüsselpaar zu registrieren oder erstellen.<br><br> (1) Wenn öffentlicher Schlüssel ausgewählt, registriert CloudStack einen öffentlichen Schlüssel. Dieser kann über den privaten Schlüssel verwendet werden.<br><br>(2) Wenn öffentlicher Schlüssel nicht ausgewählt ist, erstellt CloudStack einen neuen SSH-Schlüssel. In diesem Fall bitte den privaten Schlüssel kopieren und speichern. CloudStack wird ihn nicht speichern.<br>",
-    "message.desc.created.ssh.key.pair": "Erstellte ein SSH-Schlüsselpaar.",
-    "message.desc.host": "Jeder Cluster muss mindestens ein Host (Computer) beinhalten damit Gast-VMs darauf laufen können und wir werden nun den ersten Host erstellen. Damit ein Host in CloudStack funktioniert, muss eine Hypervisor-Software darauf installiert, eine IP-Adressse zugewiesen sowie sichergestellt sein, dass sich der Host mit dem CloudStack Verwaltungs-Server verbinden kann .<br/><br/>Geben Sie bitte den DNS-Namen oder IP-Adresse, den Benutzernamen (für gewöhnlich root) und das Passwort sowie jegliche Labels ein, mit denen Sie den Host kategorisieren möchten.",
-    "message.desc.primary.storage": "Jeder Cluster muss einen oder mehrere Hauptspeicher-Server enthalten, und wir werden nun den ersten erfassen. Hauptspeicher enthält die Festplatten-Volumen aller VMs, welche auf den Hosts in dem Cluster befinden. Benutzen Sie irgend ein standardkonformes Protokoll, welches vom darunterliegenden Hypervisor unterstützt wird.",
-    "message.desc.reset.ssh.key.pair": "Bitte definieren Sie ein SSH-Schlüsselpaar welches Sie zu dieser VM hinzufügen möchten. Bitte beachten Sie, dass das Root-Passwort dabei geändert wird falls es aktiviert ist.",
-    "message.desc.secondary.storage": "Jede Zone muss mindestens ein NFS oder Sekundärspeicher-Server haben und wir werden nun den ersten hinzufügen. Sekundärspeicher speichert VM-Vorlagen, ISO-Abbilder und VM-Festplatten-Schnappschüsse. Dieser Server muss für alle Host in der Zone erreichbar sein.<br/><br/>Geben Sie die IP und den exportierten Pfad an.",
-    "message.desc.zone": "Eine Zone ist die größte organisatorische Einheit in CloudStack und entspricht typischerweise eines einzelnen Rechenzentrum. Zonen bieten physikalische Isolation und Redundanz. Eine Zone beinhaltet einen oder mehrere Pods (jeder von Ihnen beinhaltet Hosts und Hauptspeicher-Server) und ein Sekundärspeicher-Server, welcher von allen Pods in der Zone geteilt wird.",
-    "message.detach.disk": "Sind Sie sicher, dass Sie diese Festplatte loslösen möchten?",
-    "message.detach.iso.confirm": "Bitte bestätigen Sie, dass Sie die ISO von der virtuellen Instanz trennen möchten.",
-    "message.disable.account": "Bitte bestätigen Sie, dass Sie Ihr Benutzerkonto deaktivieren möchten. Kein Nutzer dieses Kontos wird mehr Zugriff auf die Cloud Ressourcen haben. Alle laufenden virtuellen Maschinen werden sofort abgestellt.",
-    "message.disable.snapshot.policy": "Sie haben Ihre derzeitige Schnappschuss Richtlinie erfolgreich deaktiviert.",
-    "message.disable.user": "Bitte bestätigen Sie, dass Sie diesen Benutzer deaktivieren möchten.",
-    "message.disable.vpn": "Sind Sie sicher, dass Sie das VPN deaktivieren möchten?",
-    "message.disable.vpn.access": "Bitte bestätigen Sie, dass Sie den VPN Zugriff deaktivieren möchten.",
-    "message.disabling.network.offering": "Netzwerkangebot wird deaktiviert",
-    "message.disabling.vpc.offering": "VPC-Angebot wird deaktiviert",
-    "message.disallowed.characters": "Nicht erlaubte Zeichen: <,>",
-    "message.download.ISO": "Bitte klicken Sie auf <a href=\"#\">00000</a>, um das ISO herunterzuladen",
-    "message.download.template": "Bitte klicken Sie auf <a href=\"#\">00000</a>, um die Vorlage herunterzuladen",
-    "message.download.volume": "Bitte klicken Sie auf <a href=\"#\">00000</a>, um das Volumen herunterzuladen",
-    "message.download.volume.confirm": "Bitte bestätigen Sie, dass Sie dieses Volumen herunterladen möchten.",
-    "message.edit.account": "Bearbeiten (\"-1\" bedeutet keine Begrenzung der Anzahl Ressourcen)",
-    "message.edit.confirm": "Bitte bestätigen Sie Ihre Änderungen bevor Sie \"Speichern\" klicken.",
-    "message.edit.limits": "Bitte definieren Sie Begrenzungen für die folgenden Ressourcen. Ein \"-1\" bedeutet keine Begrenzung für die Ressourcen-Erstellung.",
-    "message.edit.traffic.type": "Bitte definieren Sie die Datenverkehrs-Bezeichnung, welche Sie mit diesem Datenverkehrs-Typ verbunden haben möchten.",
-    "message.enable.account": "Bitte bestätigen Sie, dass Sie dieses Konto aktivieren möchten.",
-    "message.enable.user": "Bitte bestätigen Sie, dass sie diesen Benutzer aktivieren möchten.",
-    "message.enable.vpn": "Bitte bestätigen Sie, dass Sie für diese IP-Adresse das Remote Access VPN aktivieren möchten.",
-    "message.enable.vpn.access": "VPN ist zurzeit nicht für diese IP Addresse aktiviert. Möchten Sie den VPN Zugriff aktivieren?",
-    "message.enabled.vpn": "Ihr VPN Zugriff ist zurzeit aktiv und via IP können Sie darauf zugreifen",
-    "message.enabled.vpn.ip.sec": "Ihr IPSec Preshared-Schlüssel ist",
-    "message.enabling.network.offering": "Netzwerkangebot wird aktiviert",
-    "message.enabling.security.group.provider": "Sicherheitsgruppenanbieter wird aktiviert",
-    "message.enabling.vpc.offering": "VPC-Angebot wird aktiviert",
-    "message.enabling.zone": "Zone wird aktiviert",
-    "message.enabling.zone.dots": "Zone wird aktiviert...",
-    "message.enter.seperated.list.multiple.cidrs": "Bitte geben Sie eine Komma separierte Liste von CIDRs ein, sofern es mehrere sind.",
-    "message.enter.token": "Bitte geben Sie dasjenige Merkmal ein, welches Ihnen in Ihrem Einladungsemail mitgeteilt wurde.",
-    "message.generate.keys": "Bitte bestätigen Sie, dass Sie für diesen Benutzer neue Schlüssel generieren möchten.",
-    "message.gslb.delete.confirm": "Bitte bestätigen Sie, dass Sie diesen GSLB löschen möchten.",
-    "message.gslb.lb.remove.confirm": "Bitte bestätigen Sie, dass Sie die Lastverteilung vom GSLB entfernen möchten",
-    "message.guest.traffic.in.advanced.zone": "Gastnetzwerk-Datenverkehr ist die kommunikation zwischen virtuellen Maschinen des Endbenutzers. Definieren Sie einen Bereich von VLAN IDs um den Gast-Datenverkehr jedes physikalischen Netzwerks zuzustellen.",
-    "message.guest.traffic.in.basic.zone": "Gastnetzwerk-Datenverkehr ist die kommunikation zwischen virtuellen Maschinen des Endbenutzers. Definieren Sie einen Bereich von IP-Adressen welche CloudStack Gast-VMs zuweisen kann. Stellen Sie sicher, dass dieser Bereich sich nicht mit dem reservierten IP-Bereich des Systems überlappt.",
-    "message.host.dedicated": "Host dediziert",
-    "message.host.dedication.released": "Host-Dedizierung freigegeben",
-    "message.installWizard.click.retry": "Bitte den Start Button für einen neuen Versuch drücken",
-    "message.installWizard.copy.whatIsACluster": "Ein Cluster bietet die Möglichkeit Hosts zu gruppieren. Die Hosts in einem Cluster haben alle identische Hardware, laufen mit dem selben Hypervisor, sind im selben Subnetz und greifen auf den selben Speicher zu. Instanzen von virtuellen Maschinen (VMs) können von einem Host zum anderen innerhalb des Clusters live-migriert werden, ohne Unterbrechung des Dienstes für den Endbenutzer. Ein Cluster ist die drittgrößte organisatorische Einheit innerhalb einer CloudStack&#8482; Installation. Cluster sind geschlossen innerhalb Pods und Pods sind geschlossen innerhalb Zonen. <br/><br/>CloudStack&#8482; erlaubt mehrere Cluster in einer Cloudinstallation, aber für eine Basisinstallation benötigen wir nur ein Cluster.",
-    "message.installWizard.copy.whatIsAHost": "Ein Host ist ein einzelner Computer. Hosts bieten Rechnungsressourcen für virtuelle Maschinen. Jeder Host hat Hypervisorsoftware installiert, welche die Gäste-VMs verwaltet (ausgenommen davon sind Bare-Metal-Hosts, welche im erweiterten Installationsanleitung als Spezialfall behandelt werden). Beispiele für Hosts sind ein KVM Linuxserver, ein Citrix XenServer-Server oder auch ein ESXi-Server. In der Basisinstallation verwenden wir einen einzelnen Host mit XenServer oder KVM.<br/><br/>Der Host ist die kleinste, organisatorische Einheit innerhalb einer CloudStack&#8482; Installation. Hosts befinden sind innerhalb von Clustern, Cluster innerhalb Pods und Pods innerhalb von Zonen.",
-    "message.installWizard.copy.whatIsAPod": "Ein Pod steht häufig für ein einzelnes Rack. Host im selben Pod sind im selben Subnetz.<br/><br/>Ein Pod ist die zweitgrößte Einheit innerhalb einer CloudStack&#8482; Installation. Pods sind geschlossen innerhalb der Zonen. Jede Zone kann eine oder mehrere Pods enthalten; in der Basisinstallation werden Sie nur ein Pod in Ihrer Zone haben.",
-    "message.installWizard.copy.whatIsAZone": "Eine Zone ist die größte organisatorische Einheit innerhalb einer CloudStack&#8482; Installation. Eine Zone steht typischerweise für ein einzelnes Rechenzentrum, obwohl es natürlich erlaubt ist, mehrere Zonen in einem Rechenzentrum zu haben. Der Vorteil einer Unterteilung der Infrastruktur in Zonen besteht im Anbieten einer physikalischen Isolierung und Redundanz. Zum Beispiel kann jede Zone ihre eigene Stromversorgung und ihr eigener Netzwerk-Uplink haben und geographisch weit auseinanderliegen (obschon dies nicht zwingend ist).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482; ist eine Software-Plattform welche Rechenressourcen zusammenfasst, um öffentliche, private oder hybride \"Infrastructure as a Service\" (IaaS) Clouds zu bauen. CloudStack&#8482; verwaltet das Netzwerk-, Speicher- und Computingknoten was eine Cloud-Infrastruktur ausmacht. Benutzen Sie CloudStack&#8482; um Computing-Umgebungen zu erstellen, verwalten und zu konfigurieren.<br/><br/>Neben dem Erweitern von individuellen virtuellen Maschinenabbilder auf auf Standardhardware bietet CloudStack&#8482; einen schlüsselfertigen Cloud Infrastruktur-Software-Stack für die Bereitstellung von virtueller Rechenzentren as a Service – Liefert alle wesentlichen Komponenten für das Bauen, Bereitstellen und Verwalten von multi-tier- und mandantenfähigen Cloud-Anwendungen. Open-Source sowie Premium-Versionen sind verfügbar, mit nahezu identischen Features.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "Eine CloudStack&#8482; Cloud-Infrastruktur verwendet zwei Arten von Speicher: Hauptspeicher und Sekundärspeicher. Beide können iSCSI- oder NFS-Server, oder auch lokale Festplatten sein.<br/><br/><strong>Hauptspeicher</strong> ist mit einem Cluster verbunden und speichert Festplattenvolumen aller diejenigen Gast-VMs, welche auf Hosts in diesem Cluster laufen. Der Hauptspeicher-Server ist typischerweise nahe am Host gelegen.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Sekundärspeicher wird mit einer Zone verbunden und speichert alles folgende:<ul><li>Vorlagen - Betriebssystemabbilder welche für das Booten der VMs verwendet werden und zusätzliche Konfigurationsinformationen wie installierte Applikationen beinhalten kann</li><li>ISO-Abbilder - Betriebssystemabbilder welche bootbar oder nicht bootbar sein können</li><li>Festplattenvolumen-Schnappschüsse - gesicherte Kopien von VM-Daten, welche für die Datenwiederherstellung oder für neue Vorlagen verwenden werden können</li></ul>",
-    "message.installWizard.now.building": "Ihre Cloud wird erstellt...",
-    "message.installWizard.tooltip.addCluster.name": "Der Name des Clusters. Der Name kann frei gewählt werden und wird von Cloudstack nicht genutzt.",
-    "message.installWizard.tooltip.addHost.hostname": "Der DNS-Name oder die IP-Adresse des hosts",
-    "message.installWizard.tooltip.addHost.password": "Dies ist das Passwort des o.a. Users (von der XenServer Installation)",
-    "message.installWizard.tooltip.addHost.username": "überlicherweise root",
-    "message.installWizard.tooltip.addPod.name": "Der Name für den pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Dies ist der IP-Bereich im privaten Netzwerk, welches CloudStack verwendet um Sekundärspeicher-VMs und Konsolen-Proxies zu verwalten. Diese IP-Adressen werden vom selben Subnetz genommen wie Computing-Server.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "Das Gateways für die Hosts des pod",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "Die Subnetzmaske des Gast-Netzwerks",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Dies ist der IP-Bereich im privaten Netzwerk, welches CloudStack verwendet um Sekundärspeicher-VMs und Konsolen-Proxies zu verwalten. Diese IP-Adressen werden vom selben Subnetz genommen wie Computing-Server.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "Der Name der Storage Devices",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(für NFS) Bei NFS wird hier der exportierte Pfad (Shared Mount Point) angegeben. Für KVM wird hier der Pfad angegeben, wo auf jedem Host das primary storage gemountet wurde. Z.B. \"/mnt/primary\"",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(für NFS, iSCSI oder PreSetup) Die IP-Adresse oder der DNS-Name des storage devices.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "Die IP-Adresse des NFS-Servers, der den Secondary Storage bereitstellt.",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "Der exportierte Pfad, der auf dem o.a. Server liegt.",
-    "message.installWizard.tooltip.addZone.dns1": "Dies sind die DNS Server für die Gäste VMs in dieser Zone. Diese DNS Server werden über das Interface für das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben.",
-    "message.installWizard.tooltip.addZone.dns2": "Dies sind die DNS Server für die Gäste VMs in dieser Zone. Diese DNS Server werden über das Interface für das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Dies sind die DNS Server für die System VMs in dieser Zone. Diese DNS Server werden über das Interface für das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Dies sind die DNS Server für die System VMs in dieser Zone. Diese DNS Server werden über das Interface für das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben.",
-    "message.installWizard.tooltip.addZone.name": "Der Name für die zone",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Eine Beschreibung des Netzwerkes.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "Der Bereich der IP Adressen die für die Verwendung durch Gäster in dieser Zone verfügbar sind. Wenn nur ein NIC verwendet wird, sollten die IP Adressen in demselben CIDR seind wie der CIDR des Pods.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "Das gateway, welches der Gast benutzen soll.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "Die Subnetzmaske des Gast-Netzwerks",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "Der Bereich der IP Adressen die für die Verwendung durch Gäster in dieser Zone verfügbar sind. Wenn nur ein NIC verwendet wird, sollten die IP Adressen in demselben CIDR seind wie der CIDR des Pods.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Der Name für das Netzwerk",
-    "message.instance.scaled.up.confirm": "Möchten Sie Ihre Instanz wirklich hochskalieren?",
-    "message.instanceWizard.noTemplates": "Sie haben keine Vorlagen verfügbar; bitte fügen Sie kompatible Vorlagen hinzu, und starten Sie den Instanz-Installationsassistent neu.",
-    "message.ip.address.changed": "Ihre IP Adresse kann sich geändert haben; möchten Sie die Liste aktualisieren lassen? Bitte beachten Sie, dass sich in diesem Fall die Ansicht der Details schließen wird.",
-    "message.iso.desc": "Dieses Disk Image enthält Daten oder ein bootfähiges Medium für das Betriebssystem.",
-    "message.join.project": "Sie sind jetzt einem Projekt beigetreten. Bitte wechseln Sie in die Ansicht über die Projekte um das Projekt zu sehen.",
-    "message.launch.vm.on.private.network": "Wünschen Sie Ihre Instanze in Ihren eigenen privaten dedizierten Netzwerk zu starten?",
-    "message.launch.zone": "Die Zone kann gestartet werden; bitte fahren sie mit dem nächsten Schritt fort.",
-    "message.ldap.group.import": "Alle Benutzer von der gewählten Gruppe werden importiert.",
-    "message.link.domain.to.ldap": "Autosync für diese Domain mit LDAP einstellen",
-    "message.listView.subselect.multi": "(Strg/Cmd-Klick)",
-    "message.lock.account": "Bitte bestätigen Sie, dass Sie dieses Benutzerkonto sperren möchten. Nach dem Sperren ist es Benutzer dieses Benutzerkontos nicht mehr möglich, ihre Cloud Ressourcen zu verwalten. Auf bestehende Ressourcen kann aber weiterhin zugegriffen werden.",
-    "message.migrate.instance.confirm": "Bitte bestätigen Sie den Host auf den Sie die virtuelle Instanz migrieren wollen.",
-    "message.migrate.instance.to.host": "Bitte bestätigen sie, dass die Instanz auf einen anderen Host migriert werden soll",
-    "message.migrate.instance.to.ps": "Bitte bestätigen sie, dass sie die Instanz auf einen anderen primären Speicher migrieren wollen.",
-    "message.migrate.router.confirm": "Bitte bestätigen Sie den Host, auf welchen Sie den Router migrieren möchten:",
-    "message.migrate.systemvm.confirm": "Bitte bestätigen Sie den Host, auf welchen Sie die System-VM migrieren möchten:",
-    "message.migrate.volume": "Bitte bestätigen sie, dass sie dieses Volume auf einen anderen primären Speicher migrieren wollen.",
-    "message.network.addVM.desc": "Bitte definieren Sie das Netzwerk, zu welchen Sie die VM hinzufügen möchten. Eine neue NIC wird zu diesem Netzwerk hinzugefügt.",
-    "message.network.addVMNIC": "Bitte bestätigen Sie, dass sie eine neue VM NIC zu dieses Netzwerk hinzufügen möchten.",
-    "message.network.remote.access.vpn.configuration": "Remote VPN-Zugang wurde generiert, konnte aber nicht angewendet werden. Bitte überprüfe die Verbindung zum Netzwerkelement und probiere es neu aus.",
-    "message.new.user": "Spezifieren Sie das folgende um einen neuen Nutzer dem Benutzerkonto hinzuzufügen",
-    "message.no.affinity.groups": "Sie haben keine Affinitäts-Gruppen. Bitte fahren Sie fort zum nächsten Schritt.",
-    "message.no.host.available": "Es ist kein Host für eine Migration verfügbar",
-    "message.no.network.support": "Ihr ausgewählter Hypervisor vSphere hat keine zusätzlichen Netzwerk Merkmale. Bitte fahren Sie mit Schritt 5 fort.",
-    "message.no.network.support.configuration.not.true": "Sie haben keine Zone die eine aktivierte Sicherheitsgruppe hat. Deswegen gibt es keine zusätzlichen Netzwerk Merkmale. Bitte fahren Sie mit Schritt 5 fort.",
-    "message.no.projects": "Sie haben keine Projekte.<br/>Bitte erzeugen Sie ein neues aus dem Projekt Bereich.",
-    "message.no.projects.adminOnly": "Sie haben keine Projekt.<br/>Bitte fragen Sie Ihren Administrator damit er ein neues Projekt anlegt.",
-    "message.number.clusters": "<h2><span> # of </span> Cluster</h2>",
-    "message.number.hosts": "<h2><span> # of </span> Hosts</h2>",
-    "message.number.pods": "<h2><span>Anzahl der</span>Pods</h2>",
-    "message.number.storage": "<h2><span> # von </span> Hauptspeichervolumina</h2>",
-    "message.number.zones": "<h2><span> # of </span> Zonen</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warnung Host ist im Wartungsmodus",
-    "message.outofbandmanagement.changepassword": "Passwort für Out-of-band Verwaltung ändern",
-    "message.outofbandmanagement.configure": "Out-of-band Verwaltung konfigurieren",
-    "message.outofbandmanagement.disable": "Out-of-band Verwaltung deaktivieren",
-    "message.outofbandmanagement.enable": "Out-of-band Verwaltung aktivieren",
-    "message.outofbandmanagement.issue": "Eine Out-of-band Verwaltungs-Strom Aktion durchführen",
-    "message.password.has.been.reset.to": "Passwort wurde zurückgesetzt auf",
-    "message.password.of.the.vm.has.been.reset.to": "Passwort der VM wurde zurückgesetzt auf",
-    "message.pending.projects.1": "Sie haben ausstehende Projekteinladungen:",
-    "message.pending.projects.2": "Für die Ansicht wechseln Sie bitte in den Projekt Bereich und wählen die Einladungen aus dem Drop-down-Menü",
-    "message.please.add.at.lease.one.traffic.range": "Bitte fügen Sie mindestens einen Datenverkehrsbereich hinzu.",
-    "message.please.confirm.remove.ssh.key.pair": "Bitte bestätigen Sie, dass Sie dieses SSH-Schlüsselpaar entfernen möchten",
-    "message.please.proceed": "Bitte fahren Sie mit dem nächsten Schritt fort.",
-    "message.please.select.a.configuration.for.your.zone": "Bitte wählen Sie eine Konfiguration für Ihre Zone aus.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Bitte wählen Sie ein anderes öffentliches und Management Netzwerk bevor Sie es löschen",
-    "message.please.select.networks": "Bitte wählen Sie Netzwerke für Ihre virtuelle Maschine aus.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Bitte ein SSH Schlüsselpaar auswählen, welches Sie mit dieser VM verwenden möchten:",
-    "message.please.wait.while.zone.is.being.created": "Bitte warten Sie solange Ihre Zone erstellt wird; dies kann einige Zeit in Anspruch nehmen...",
-    "message.pod.dedication.released": "Pod-Dedizierung freigegeben",
-    "message.portable.ip.delete.confirm": "Bitte bestätigen Sie, dass Sie ein portablen IP-Bereich löschen möchten",
-    "message.project.invite.sent": "Einladung an Benutzer verschickt; sie werden zum Projekt hinzugefügt sobald sie Einladung akzeptiert haben",
-    "message.public.traffic.in.advanced.zone": "Öffentlicher Datenverkehr wird verursacht, wenn VMs in der Cloud auf das Internet zugreifen. Öffentlich zugreifbare IPs müssen für diesen Zweck bezogen werden. Endbenutzer können hierfür das CloudStack UI verwenden um NAT zwischen dem Gast-Netzwerk und Ihrem öffentlichen Netzwerk einzurichten.  <br/><br/>Bitte geben Sie mindestens einen Bereich von IP-Adressen für den Internet-Datenverkehr an.",
-    "message.public.traffic.in.basic.zone": "Öffentlicher Datenverkehr wird generiert, sobald VMs in der Cloud auf das Internet zugreifen oder Dienste an Kunden über das Internet anbieten. Hierfür müssen öffentliche IPs zugewiesen werden. Wenn eine Instanz erstellt wird, wird eine öffentliche IP von diesem Satz zusätzlich zu der Gäste- IP-Adresse zugewiesen. Statisches 1-1-Nat wird automatisch zwischen der öffentlichen IP und der Gäste-IP einrichtet. Endbenutzer können zudem das CloudStack UI verwenden um zusätzliche IPs zu beziehen um statisches NAT zwischen ihren Instanzen und der öffentlichen IP zu implementieren.",
-    "message.question.are.you.sure.you.want.to.add": "Sind Sie sicher, dass Sie hinzufügen möchten",
-    "message.read.admin.guide.scaling.up": "Bitte lesen Sie den Abschnitt über das dynamische Skalieren in dem Administrations-Leitfaden bevor Sie hochskalieren.",
-    "message.recover.vm": "Bitte bestätigen Sie, dass Sie diese VM wiederherstellen möchten.",
-    "message.redirecting.region": "Weiterleitung zu Region...",
-    "message.reinstall.vm": "Hinweis: Mit Vorsicht verwenden. Dies wird dazu führen, dass die VM von der Vorlage neu installiert wird; Daten auf der Root-Ferstplatte werden dadruch gelöscht. Extra Daten-Volumen, falls vorhanden, bleiben jedoch unberührt.",
-    "message.remove.ldap": "Sind Sie sicher, dass Sie die LDAP-Konfiguration löschen möchten?",
-    "message.remove.region": "Sind Sie sicher, dass Sie diese Region vom Verwaltungsserver entfernen möchten?",
-    "message.remove.vpc": "Bitte bestätigen Sie, dass Sie das VPC löschen möchten",
-    "message.remove.vpn.access": "Bitte bestätigen Sie, dass Sie den VPN-Zugriff vom folgenden Benutzer entfernen möchten.",
-    "message.removed.ssh.key.pair": "Hat ein SSH-Schlüsselpaar entfernt",
-    "message.reset.VPN.connection": "Bitte bestätigen Sie, dass Sie die VPN-Verbindung zurücksetzen möchten",
-    "message.reset.password.warning.notPasswordEnabled": "Das Template dieser Instanz wurde erstellt ohne dass ein Passwort erforderlich ist",
-    "message.reset.password.warning.notStopped": "Ihre Instanz muss gestoppt werden bevor Sie versuchen können das Passwort zu ändern",
-    "message.restart.mgmt.server": "Bitte starten Sie Ihre(n) Management Server durch, damit Ihre neuen Einstellungen aktiviert werden.",
-    "message.restart.mgmt.usage.server": "Bitte starten Sie Ihre(n) Management- und Usage Server durch, damit Ihre neuen Einstellungen aktiviert werden.",
-    "message.restart.network": "Alle angebotenen Dienste in diesem Netzwerk werden unterbrochen. Bitte bestätigen Sie, dass Sie dieses Netzwerk neu starten möchten.",
-    "message.restart.vpc": "Bitte bestätigen Sie, dass Sie den VPC neu starten möchten",
-    "message.restart.vpc.remark": "Bitte bestätigen Sie, dass Sie die VPC neu starten möchten <p>small><i>Hinweis: Ein nicht-redundante VPC redundant zu machen wird eine Bereinigung erzwingen. Die Netzwerke werden dadurch einige Minuten nicht verfügbar sein</i>.</small></p>",
-    "message.restoreVM": "Möchten Sie die VM wiederherstellen?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Die Neuordnung der Regelberechtigungen wurde abgebrochen, es sind Änderungen eingetreten während Sie an der Liste Arbeiten durchgeführt haben. Bitte versuchen Sie es erneut.",
-    "message.security.group.usage": "(Verwenden Sie <strong>Ctrl-click</strong> um alle passenden Sicherheits Gruppen auszuwählen)",
-    "message.select.a.zone": "Eine Zone steht typischerweise für ein einzelnes Rechenzentrum. Mehrere Zonen helfen dabei, die Cloud zuverlässiger zu machen durch physikalische Isolation und Redundanz.",
-    "message.select.affinity.groups": "Bitte wählen Sie beliebige Affinitätsgruppen, zu denen diese VM gehören soll:",
-    "message.select.instance": "Bitte wählen Sie eine Instanz aus.",
-    "message.select.iso": "Bitte wählen Sie ein ISO für Ihre neue virtuelle Instanz aus.",
-    "message.select.item": "Bitte wählen Sie ein Element aus.",
-    "message.select.security.groups": "Bitte wählen Sie (eine) Sicherheitsgruppe(n) für Ihre neue VM aus",
-    "message.select.template": "Bitte wählen Sie eine Vorlage für Ihre neue virtuelle Instanz aus.",
-    "message.select.tier": "Bitte Ebene auswählen",
-    "message.set.default.NIC": "Bitte bestätigen Sie, dass Sie für die VM diese NIC zur Standard-NIC möchten.",
-    "message.set.default.NIC.manual": "Bitte aktuallisieren Sie die Standard-NIC auf der VM jetzt manuell.",
-    "message.setup.physical.network.during.zone.creation": "Wenn Sie eine erweiterte Zone hinzufügen, müssen Sie ein oder mehrere physikalische Netzweke einrichten. Jedes Netzwerk entspricht einer NIC auf dem Hypervisor. Jedes physikalische Netzwerk kann eine oder mehere Arten von Datenverkehr behandeln, mit gewissen Beschränkungen wie diese kombiniert werden können. <br/><br/><strong>Durch Ziehen und Loslassen eines oder mehreren Datenverkehrsarten auf jedes einzelne physikalische Netzwerk.",
-    "message.setup.physical.network.during.zone.creation.basic": "Wenn Sie eine Basiszone hinzufügen, können Sie ein einzelnes physikalisches Netzwerk einrichten, welches einer NIC auf dem Hypervisor entspricht. Das Netzwerk behandelt mehrere Arten von Datenverkehr.<br/><br/>Sie können auch weitere Datenverkehrsarten zum pysikalische Netzwerk hinzufügen, durch <strong>Ziehen und Loslassen</strong>.",
-    "message.setup.successful": "Cloud setup erfolgreich",
-    "message.snapshot.schedule": "Sie können wiederkehrende Schnapschuss-Zeitpläne einrichten in dem Sie die untenstehenden verfügbaren Optionen auswählen und Ihren Regeleinstellungen anwenden",
-    "message.specifiy.tag.key.value": "Bitte geben Sie einen Ettikettnamen und -wert an",
-    "message.specify.url": "Bitte geben Sie eine URL an",
-    "message.step.1.continue": "Bitte wählen Sie eine Vorlage oder ISO, um fortzufahren",
-    "message.step.1.desc": "Bitte wählen Sie eine Vorlage für Ihre neue virtuelle Instanz aus. Sie können auch ein leeres Template auswählen, von welchen aus dann ein ISO-Abbild instaliert werden kann.",
-    "message.step.2.continue": "Bitte wählen Sie ein Dienstangebot zum Fortfahren aus",
-    "message.step.3.continue": "Bitte wählen Sie ein Festplattenangebot zum Fortfahren aus",
-    "message.step.4.continue": "Bitte wählen Sie mindestens ein Netzwerk, um fortzufahren",
-    "message.step.4.desc": "Bitte wählen Sie Ihr Hauptnetzwerk zu dem Ihre virtuelle Instanz verbunden sein wird.",
-    "message.storage.traffic": "Datenverkehr zwischen den CloudStack internen Ressourcen, inklusive aller Komponenten, die mit dem Verwaltugns-Server kommunizieren, wie Hosts und CloudStack System VMs. Bitte konfigurieren Sie Speicherdatenverkehr hier.",
-    "message.suspend.project": "Sind Sie sicher, dass sie die Ausführung dieses Projektes unterbrechen möchten?",
-    "message.systems.vms.ready": "System-VMs bereit.",
-    "message.template.copying": "Vorlage wird kopiert.",
-    "message.template.desc": "Betriebssystem Abbild das zum starten von VMs verwendet werden kann",
-    "message.tier.required": "Ebene ist zwingend",
-    "message.tooltip.dns.1": "Name eines DNS Servers zur Verwendung von VMs in der Zone. Die öffentlichen IP Adressen müssen eine Route zu diesem Server haben.",
-    "message.tooltip.dns.2": "Ein zweiter Name eines DNS Servers zur Verwendung von VMs in der Zone. Die öffentlichen IP Adressen müssen eine Route zu diesem Server haben.",
-    "message.tooltip.internal.dns.1": "Ein Name eines DNS Servers zur Verwendung von CloudStack internen System VMs in der Zone. Die öffentlichen IP Adressen müssen eine Route zu diesem Server haben.",
-    "message.tooltip.internal.dns.2": "Ein Name eines DNS Servers zur Verwendung von CloudStack internen System VMs in der Zone. Die öffentlichen IP Adressen müssen eine Route zu diesem Server haben.",
-    "message.tooltip.network.domain": "Ein DNS Suffix zur Erstellung eines Kunden Domain Namens für das Netzwerk das von Gast VMs verwendet wird.",
-    "message.tooltip.pod.name": "Ein Name für diesen Pod.",
-    "message.tooltip.reserved.system.gateway": "Das Gateway für die Hosts des pods.",
-    "message.tooltip.reserved.system.netmask": "Das Netzwerk Prefix welches das Pod Subnetz definiert. Es verwendet CIDR Notation.",
-    "message.tooltip.zone.name": "Einen Namen für die Zone.",
-    "message.update.os.preference": "Bitte geben Sie eine Betriebssystem-Präferenz für diesen Host an, Alle virtuellen Instanzen mit gleichen Präferenzen werden zuerst zu diesem Host zugewiesen bevor andere gewählt werden.",
-    "message.update.resource.count": "Bitte bestätigen Sie, dass Sie die Anzahl der Ressourcen für dieses Benutzerkonto aktualisieren möchten.",
-    "message.update.ssl": "Bitte eine neue X.509 kompatible SSL Zertifikatskette einreichen, diese wird auf jedem Konsolenproxy und der Sekundärspeicher-VM aktuallisiert:",
-    "message.update.ssl.failed": "Fehler beim Aktualisieren des SSL-Zertifikats.",
-    "message.update.ssl.succeeded": "Aktualisierung der SSL Zertifikate erfolgreich durchgeführt",
-    "message.validate.URL": "Bitte geben Sie eine gültige URL ein.",
-    "message.validate.accept": "Bitte geben Sie einen Wert mit einer gültigen Erweiterung ein.",
-    "message.validate.creditcard": "Bitte geben Sie eine gültige Kreditkartennummer ein.",
-    "message.validate.date": "Bitte geben Sie ein gültiges Datum ein.",
-    "message.validate.date.ISO": "Bitte geben Sie ein gültiges Datum (ISO) ein.",
-    "message.validate.digits": "Bitte geben Sie nur Ziffern ein.",
-    "message.validate.email.address": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
-    "message.validate.equalto": "Bitte geben Sie den gleichen Wert erneut ein.",
-    "message.validate.fieldrequired": "Dieses Feld wird benötigt",
-    "message.validate.fixfield": "Bitte korrigieren Sie dieses Feld.",
-    "message.validate.instance.name": "Der Name der Instanz kann nicht länger als 63 Zeichen sein. Nur ASCII Zeichen wie a~z, A~Z, Zahlen 0~9 und Bindestriche sind erlaubt. Er muß mit einem Buchstaben starten und mit einem Buchstaben oder einer Zahl enden.",
-    "message.validate.invalid.characters": "Ungültige Zeichen gefunden; bitte korrigieren.",
-    "message.validate.max": "Bitte geben sie einen Wert kleiner oder gleich {0} ein.",
-    "message.validate.maxlength": "Bitte geben Sie nicht mehr als {0} Zeichen ein.",
-    "message.validate.minlength": "Bitte geben Sie mindestens {0} Zeichen ein.",
-    "message.validate.number": "Bitte geben Sie eine gültige Nummer ein.",
-    "message.validate.range": "Bitte geben Sie einen Wert zwischen {0} und {1} ein.",
-    "message.validate.range.length": "Bitte geben Sie einen Wert zwischen {0}  und {1} Zeichen land ein.",
-    "message.virtual.network.desc": "Ein dediziert virtualisiertes Netzwerk für Ihr Benutzerkonto. Die Broadcast-Domain ist innerhalb  eines VLANs und jeglicher öffentliche Netzwerkzugriff wird von einem virtuellen Router geroutet.",
-    "message.vm.create.template.confirm": "Das Erstellen einer Vorlage führt automatisch zu einem Neustart der VM.",
-    "message.vm.review.launch": "Bitte überprüfen Sie die folgenden Informationen und bestätigen Sie, dass Ihre virtuelle Instanz korrekt ist, bevor Sie sie starten.",
-    "message.vnmc.available.list": "VNMC ist nicht verfügbar aus der Providerliste.",
-    "message.vnmc.not.available.list": "VNMC ist nicht verfügbar aus der Providerliste.",
-    "message.volume.create.template.confirm": "Bitte bestätigen Sie, dass Sie eine Vorlage aus diesem Festplatten-Volumen erstellen möchten. Das Erstellen der Vorlage kann wenige Minuten oder auch länger dauern abhängig von der Größe des Volumen.",
-    "message.waiting.for.builtin.templates.to.load": "Warten bis die mitgelieferten Vorlagen geladen sind...",
-    "message.you.must.have.at.least.one.physical.network": "Sie müssen mindestens ein physikalisches Netzwerk haben",
-    "message.your.cloudstack.is.ready": "Ihr CloudStack ist bereit!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Die Erstellung der Zone ist komplett. Möchten Sie diese Zone aktivieren?",
-    "message.zone.no.network.selection": "Die von Ihnen gewählte Zone bietet keine Alternativen für die Auswahl eines Netzwerks.",
-    "message.zone.step.1.desc": "Bitte wählen Sie ein Netzwerk-Modell für Ihre Zone.",
-    "message.zone.step.2.desc": "Bitte geben Sie die folgende Information ein, um eine neue Zone hinzuzufügen",
-    "message.zone.step.3.desc": "Bitte geben Sie die folgende Information ein, um einen neuen pod hinzuzufügen",
-    "message.zoneWizard.enable.local.storage": "WARNUNG: Wenn Sie den lokalen Speicher für diese Zone aktivieren möchten, müssen Sie, abhängig davon wo Sie Ihre System-VMs starten möchten, wie folgt vorgehen: <br/><br/>1. Wenn die System-VMs im geteilten Hauptspeicher gestartet werden sollen, muss der geteilte Hauptspeicher nach dem Erstellen zur Zone hinzugefügt werden. Zudem muss die Zone im deaktivierten Zustand gestartet werden.<br/><br/>2. Wenn die System-VMs im lokalen Hauptspeicher gestartet werden sollen, muss, \"system.vm.use.local.storage\" auf \"true\" gesetzt werden bevor Sie die Zone aktivieren.<br/><br/><br/>Möchten Sie weiterfahren?",
-    "messgae.validate.min": "Bitte geben sie einen Wert größer oder gleich {0} ein.",
-    "mode": "Modus",
-    "network.rate": "Netzwerk-Rate",
-    "notification.reboot.instance": "Instanz neu starten",
-    "notification.start.instance": "Instanz starten",
-    "notification.stop.instance": "Instanz stoppen",
-    "side.by.side": "Nebeneinander",
-    "state.Accepted": "Angenommen",
-    "state.Active": "Aktiv",
-    "state.Allocated": "Zugeteilt",
-    "state.Allocating": "Zugeteilt",
-    "state.BackedUp": "Daten gesichert",
-    "state.BackingUp": "Daten werden gesichert",
-    "state.Completed": "Fertiggestellt",
-    "state.Creating": "Erstellung",
-    "state.Declined": "Abgelehnt",
-    "state.Destroyed": "Zerstört",
-    "state.Disabled": "Deaktiviert",
-    "state.Enabled": "Aktiviert",
-    "state.Error": "Fehler",
-    "state.Expunging": "Unwiederbringlich gelöscht",
-    "state.Migrating": "Migration",
-    "state.Pending": "Ausstehend",
-    "state.Ready": "Bereit",
-    "state.Running": "Läuft",
-    "state.Starting": "Startet",
-    "state.Stopped": "Gestoppt",
-    "state.Stopping": "Stoppt",
-    "state.Suspended": "Suspendiert",
-    "state.detached": "Losgelöst",
-    "title.upload.volume": "Volumen hochladen",
-    "ui.listView.filters.all": "Alle",
-    "ui.listView.filters.mine": "Meine"
-};
diff --git a/ui/legacy/l10n/en.js b/ui/legacy/l10n/en.js
deleted file mode 100644
index 866b067..0000000
--- a/ui/legacy/l10n/en.js
+++ /dev/null
@@ -1,2492 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-"ICMP.code":"ICMP Code",
-"ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-"ICMP.type":"ICMP Type",
-"ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-"changed.item.properties":"Changed item properties",
-"confirm.enable.s3":"Please fill in the following information to enable support for S3-backed Secondary Storage",
-"confirm.enable.swift":"Please fill in the following information to enable support for Swift",
-"error.could.not.change.your.password.because.non.native.user":"Error could not change your password because user is not a native CloudStack user.",
-"error.could.not.enable.zone":"Could not enable zone",
-"error.installWizard.message":"Something went wrong; you may go back and correct any errors",
-"error.invalid.username.password": "Invalid username or password.<br/><br/>This could also be a restriction on the IP address you are connecting from.",
-"error.login":"Your username/password does not match our records.",
-"error.menu.select":"Unable to perform action due to no items being selected.",
-"error.mgmt.server.inaccessible":"The Management Server is unaccessible.  Please try again later.",
-"error.password.not.match":"The password fields do not match",
-"error.please.specify.physical.network.tags":"Network offerings is not available until you specify tags for this physical network.",
-"error.session.expired":"Your session has expired.",
-"error.something.went.wrong.please.correct.the.following":"Something went wrong; please correct the following",
-"error.unable.to.reach.management.server":"Unable to reach Management Server",
-"error.unresolved.internet.name":"Your internet name cannot be resolved.",
-"force.delete":"Force Delete",
-"force.delete.domain.warning":"Warning: Choosing this option will cause the deletion of all child domains and all associated accounts and their resources.",
-"force.remove":"Force Remove",
-"force.remove.host.warning":"Warning: Choosing this option will cause CloudStack to forcefully stop all running virtual machines before removing this host from the cluster.",
-"force.stop":"Force Stop",
-"force.stop.instance.warning":"Warning: Forcing a stop on this instance should be your last option. It can lead to data loss as well as inconsistent behavior of the virtual machine state.",
-"hint.no.host.tags":"No host tags found",
-"hint.no.storage.tags":"No storage tags found",
-"hint.type.part.host.tag":"Type in part of a host tag",
-"hint.type.part.storage.tag":"Type in part of a storage tag",
-"image.directory":"Image Directory",
-"inline":"Inline",
-"instances.actions.reboot.label":"Reboot instance",
-"label.async.backup":"Async Backup",
-"label.CIDR.list":"CIDR list",
-"label.CIDR.of.destination.network":"CIDR of destination network",
-"label.CPU.cap":"CPU Cap",
-"label.DHCP.server.type":"DHCP Server Type",
-"label.DNS.domain.for.guest.networks":"DNS domain for Guest Networks",
-"label.ESP.encryption":"ESP Encryption",
-"label.ESP.hash":"ESP Hash",
-"label.ESP.lifetime":"ESP Lifetime (second)",
-"label.ESP.policy":"ESP policy",
-"label.import.backup.offering":"Import Backup Offering",
-"label.IKE.DH":"IKE DH",
-"label.IKE.encryption":"IKE Encryption",
-"label.IKE.hash":"IKE Hash",
-"label.IKE.lifetime":"IKE lifetime (second)",
-"label.IKE.policy":"IKE policy",
-"label.IPsec.preshared.key":"IPsec Preshared-Key",
-"label.LB.isolation":"LB isolation",
-"label.LUN.number":"LUN #",
-"label.PA":"Palo Alto",
-"label.PA.log.profile":"Palo Alto Log Profile",
-"label.PA.threat.profile":"Palo Alto Threat Profile",
-"label.PING.CIFS.password":"PING CIFS password",
-"label.PING.CIFS.username":"PING CIFS username",
-"label.PING.dir":"PING Directory",
-"label.PING.storage.IP":"PING storage IP",
-"label.PreSetup":"PreSetup",
-"label.Pxe.server.type":"Pxe Server Type",
-"label.SNMP.community":"SNMP Community",
-"label.SNMP.port":"SNMP Port",
-"label.SR.name":"SR Name-Label",
-"label.SharedMountPoint":"SharedMountPoint",
-"label.TFTP.dir":"TFTP Directory",
-"label.VMFS.datastore":"VMFS datastore",
-"label.VMs.in.tier":"VMs in tier",
-"label.VPC.limits":"VPC limits",
-"label.VPC.router.details":"VPC router details",
-"label.VPN.connection":"VPN Connection",
-"label.VPN.customer.gateway":"VPN Customer Gateway",
-"label.VPN.gateway":"VPN Gateway",
-"label.Xenserver.Tools.Version61plus":"Original XS Version is 6.1+",
-"label.about":"About",
-"label.about.app":"About CloudStack",
-"label.accept.project.invitation":"Accept project invitation",
-"label.access":"Access",
-"label.account":"Account",
-"label.accounts":"Accounts",
-"label.account.and.security.group":"Account, Security group",
-"label.account.details":"Account details",
-"label.account.id":"Account ID",
-"label.account.lower":"account",
-"label.account.name":"Account Name",
-"label.account.specific":"Account-Specific",
-"label.account.type":"Account Type",
-"label.accounts":"Accounts",
-"label.acl":"ACL",
-"label.acl.id":"ACL ID",
-"label.acl.export": "Export ACLs",
-"label.acl.list.rules":"ACL List Rules",
-"label.acl.name":"ACL Name",
-"label.acl.replaced":"ACL replaced",
-"label.acl.reason": "Reason",
-"label.acl.reason.description": "Enter the reason behind an ACL rule.",
-"label.acquire.new.ip":"Acquire New IP",
-"label.acquire.new.secondary.ip":"Acquire new secondary IP",
-"label.action":"Action",
-"label.action.attach.disk":"Attach Disk",
-"label.action.attach.disk.processing":"Attaching Disk....",
-"label.action.attach.iso":"Attach ISO",
-"label.action.attach.iso.processing":"Attaching ISO....",
-"label.action.cancel.maintenance.mode":"Cancel Maintenance Mode",
-"label.action.cancel.maintenance.mode.processing":"Cancelling Maintenance Mode....",
-"label.action.change.password":"Change Password",
-"label.action.change.service":"Change Service",
-"label.action.change.service.processing":"Changing Service....",
-"label.action.configure.samlauthorization":"Configure SAML SSO Authorization",
-"label.action.copy.ISO":"Copy ISO",
-"label.action.copy.ISO.processing":"Copying ISO....",
-"label.action.copy.template":"Copy Template",
-"label.action.copy.template.processing":"Copying Template....",
-"label.action.create.template":"Create Template",
-"label.action.create.template.from.vm":"Create Template from VM",
-"label.action.create.template.from.volume":"Create Template from Volume",
-"label.action.create.template.processing":"Creating Template....",
-"label.action.create.vm":"Create VM",
-"label.action.create.vm.processing":"Creating VM....",
-"label.action.create.volume":"Create Volume",
-"label.action.create.volume.processing":"Creating Volume....",
-"label.action.delete.backup.offering":"Delete Backup Offering",
-"label.action.delete.IP.range":"Delete IP Range",
-"label.action.delete.IP.range.processing":"Deleting IP Range....",
-"label.action.delete.ISO":"Delete ISO",
-"label.action.delete.ISO.processing":"Deleting ISO....",
-"label.action.delete.account":"Delete account",
-"label.action.delete.account.processing":"Deleting account....",
-"label.action.delete.cluster":"Delete Cluster",
-"label.action.delete.cluster.processing":"Deleting Cluster....",
-"label.action.delete.disk.offering":"Delete Disk Offering",
-"label.action.delete.disk.offering.processing":"Deleting Disk Offering....",
-"label.action.delete.domain":"Delete Domain",
-"label.action.delete.domain.processing":"Deleting Domain....",
-"label.action.delete.firewall":"Delete firewall rule",
-"label.action.delete.firewall.processing":"Deleting Firewall....",
-"label.action.delete.ingress.rule":"Delete Ingress Rule",
-"label.action.delete.ingress.rule.processing":"Deleting Ingress Rule....",
-"label.action.delete.load.balancer":"Delete load balancer rule",
-"label.action.delete.load.balancer.processing":"Deleting Load Balancer....",
-"label.action.delete.network":"Delete Network",
-"label.action.delete.network.processing":"Deleting Network....",
-"label.action.delete.nexusVswitch":"Delete Nexus 1000v",
-"label.action.delete.nic":"Remove NIC",
-"label.action.delete.physical.network":"Delete physical network",
-"label.action.delete.pod":"Delete Pod",
-"label.action.delete.pod.processing":"Deleting Pod....",
-"label.action.delete.primary.storage":"Delete Primary Storage",
-"label.action.delete.primary.storage.processing":"Deleting Primary Storage....",
-"label.action.delete.secondary.storage":"Delete Secondary Storage",
-"label.action.delete.secondary.storage.processing":"Deleting Secondary Storage....",
-"label.action.delete.security.group":"Delete Security Group",
-"label.action.delete.security.group.processing":"Deleting Security Group....",
-"label.action.delete.service.offering":"Delete Service Offering",
-"label.action.delete.service.offering.processing":"Deleting Service Offering....",
-"label.action.delete.snapshot":"Delete Snapshot",
-"label.action.delete.snapshot.processing":"Deleting Snapshot....",
-"label.action.delete.system.service.offering":"Delete System Service Offering",
-"label.action.delete.template":"Delete Template",
-"label.action.delete.template.processing":"Deleting Template....",
-"label.action.delete.user":"Delete User",
-"label.action.delete.user.processing":"Deleting User....",
-"label.action.delete.volume":"Delete Volume",
-"label.action.delete.volume.processing":"Deleting Volume....",
-"label.action.delete.zone":"Delete Zone",
-"label.action.delete.zone.processing":"Deleting Zone....",
-"label.action.destroy.instance":"Destroy Instance",
-"label.action.destroy.instance.processing":"Destroying Instance....",
-"label.action.destroy.systemvm":"Destroy System VM",
-"label.action.destroy.systemvm.processing":"Destroying System VM....",
-"label.action.destroy.volume":"Destroy Volume",
-"label.action.detach.disk":"Detach Disk",
-"label.action.detach.disk.processing":"Detaching Disk....",
-"label.action.detach.iso":"Detach ISO",
-"label.action.detach.iso.processing":"Detaching ISO....",
-"label.action.disable.account":"Disable account",
-"label.action.disable.account.processing":"Disabling account....",
-"label.action.disable.cluster":"Disable Cluster",
-"label.action.disable.cluster.processing":"Disabling Cluster....",
-"label.action.disable.nexusVswitch":"Disable Nexus 1000v",
-"label.action.disable.physical.network":"Disable physical network",
-"label.action.disable.pod":"Disable Pod",
-"label.action.disable.pod.processing":"Disabling Pod....",
-"label.action.disable.static.NAT":"Disable Static NAT",
-"label.action.disable.static.NAT.processing":"Disabling Static NAT....",
-"label.action.disable.user":"Disable User",
-"label.action.disable.user.processing":"Disabling User....",
-"label.action.disable.zone":"Disable Zone",
-"label.action.disable.zone.processing":"Disabling Zone....",
-"label.action.download.ISO":"Download ISO",
-"label.action.download.template":"Download Template",
-"label.action.download.volume":"Download Volume",
-"label.action.download.volume.processing":"Downloading Volume....",
-"label.action.edit.ISO":"Edit ISO",
-"label.action.edit.account":"Edit account",
-"label.action.edit.disk.offering":"Edit Disk Offering",
-"label.action.edit.domain":"Edit Domain",
-"label.action.edit.global.setting":"Edit Global Setting",
-"label.action.edit.host":"Edit Host",
-"label.action.edit.instance":"Edit Instance",
-"label.action.edit.network":"Edit Network",
-"label.action.edit.network.offering":"Edit Network Offering",
-"label.action.edit.network.processing":"Editing Network....",
-"label.action.edit.pod":"Edit Pod",
-"label.action.edit.primary.storage":"Edit Primary Storage",
-"label.action.edit.resource.limits":"Edit Resource Limits",
-"label.action.edit.service.offering":"Edit Service Offering",
-"label.action.edit.template":"Edit Template",
-"label.action.edit.user":"Edit User",
-"label.action.edit.zone":"Edit Zone",
-"label.action.enable.account":"Enable account",
-"label.action.enable.account.processing":"Enabling account....",
-"label.action.enable.cluster":"Enable Cluster",
-"label.action.enable.cluster.processing":"Enabling Cluster....",
-"label.action.enable.maintenance.mode":"Enable Maintenance Mode",
-"label.action.enable.maintenance.mode.processing":"Enabling Maintenance Mode....",
-"label.action.enable.nexusVswitch":"Enable Nexus 1000v",
-"label.action.enable.physical.network":"Enable physical network",
-"label.action.enable.pod":"Enable Pod",
-"label.action.enable.pod.processing":"Enabling Pod....",
-"label.action.enable.static.NAT":"Enable Static NAT",
-"label.action.enable.static.NAT.processing":"Enabling Static NAT....",
-"label.action.enable.user":"Enable User",
-"label.action.enable.user.processing":"Enabling User....",
-"label.action.enable.zone":"Enable Zone",
-"label.action.enable.zone.processing":"Enabling Zone....",
-"label.action.expunge.instance":"Expunge Instance",
-"label.action.expunge.instance.processing":"Expunging Instance....",
-"label.action.force.reconnect":"Force Reconnect",
-"label.action.force.reconnect.processing":"Reconnecting....",
-"label.action.generate.keys":"Generate Keys",
-"label.action.generate.keys.processing":"Generate Keys....",
-"label.action.get.diagnostics":"Get Diagnostics Data",
-"label.action.list.nexusVswitch":"List Nexus 1000v",
-"label.action.lock.account":"Lock account",
-"label.action.lock.account.processing":"Locking account....",
-"label.action.manage.cluster":"Manage Cluster",
-"label.action.manage.cluster.processing":"Managing Cluster....",
-"label.action.migrate.instance":"Migrate Instance",
-"label.action.migrate.instance.processing":"Migrating Instance....",
-"label.action.migrate.router":"Migrate Router",
-"label.action.migrate.router.processing":"Migrating Router....",
-"label.action.migrate.systemvm":"Migrate System VM",
-"label.action.migrate.systemvm.processing":"Migrating System VM....",
-"label.action.reboot.instance":"Reboot Instance",
-"label.action.reboot.instance.processing":"Rebooting Instance....",
-"label.action.reboot.router":"Reboot Router",
-"label.action.reboot.router.processing":"Rebooting Router....",
-"label.action.reboot.systemvm":"Reboot System VM",
-"label.action.reboot.systemvm.processing":"Rebooting System VM....",
-"label.action.recover.volume":"Recover Volume",
-"label.action.recurring.snapshot":"Recurring Snapshots",
-"label.action.register.iso":"Register ISO",
-"label.action.register.ncc":"Register NCC",
-"label.action.register.template":"Register Template from URL",
-"label.action.release.ip":"Release IP",
-"label.action.release.ip.processing":"Releasing IP....",
-"label.action.remove.host":"Remove Host",
-"label.action.remove.host.processing":"Removing Host....",
-"label.action.reset.password":"Reset Password",
-"label.action.reset.password.processing":"Resetting Password....",
-"label.action.resize.volume":"Resize Volume",
-"label.action.resize.volume.processing":"Resizing Volume....",
-"label.action.resource.limits":"Resource limits",
-"label.action.restore.instance":"Restore Instance",
-"label.action.restore.instance.processing":"Restoring Instance....",
-"label.action.revert.snapshot":"Revert to Snapshot",
-"label.action.revert.snapshot.processing":"Reverting to Snapshot...",
-"label.action.run.diagnostics":"Run Diagnostics",
-"label.action.secure.host":"Provision Host Security Keys",
-"label.action.start.instance":"Start Instance",
-"label.action.share.iso": "Update ISO Permissions",
-"label.action.share.template": "Update Template Permissions",
-"label.action.start.instance.processing":"Starting Instance....",
-"label.action.start.router":"Start Router",
-"label.action.start.router.processing":"Starting Router....",
-"label.action.start.systemvm":"Start System VM",
-"label.action.start.systemvm.processing":"Starting System VM....",
-"label.action.stop.instance":"Stop Instance",
-"label.action.stop.instance.processing":"Stopping Instance....",
-"label.action.stop.router":"Stop Router",
-"label.action.stop.router.processing":"Stopping Router....",
-"label.action.router.health.checks":"Get health checks result",
-"label.perform.fresh.checks":"Perform fresh checks",
-"label.action.stop.systemvm":"Stop System VM",
-"label.action.stop.systemvm.processing":"Stopping System VM....",
-"label.action.take.snapshot":"Take Snapshot",
-"label.action.take.snapshot.processing":"Taking Snapshot....",
-"label.action.unmanage.cluster":"Unmanage Cluster",
-"label.action.unmanage.cluster.processing":"Unmanaging Cluster....",
-"label.action.update.offering.access":"Update Offering Access",
-"label.action.update.OS.preference":"Update OS Preference",
-"label.action.update.OS.preference.processing":"Updating OS Preference....",
-"label.action.update.resource.count":"Update Resource Count",
-"label.action.update.resource.count.processing":"Updating Resource Count....",
-"label.action.vmsnapshot.create":"Take VM Snapshot",
-"label.action.vmsnapshot.delete":"Delete VM snapshot",
-"label.action.vmsnapshot.revert":"Revert to VM snapshot",
-"label.action.vmstoragesnapshot.create":"Take VM volume snapshot",
-"label.actions":"Actions",
-"label.activate.project":"Activate Project",
-"label.active.sessions":"Active Sessions",
-"label.add":"Add",
-"label.add.ACL":"Add ACL",
-"label.add.BigSwitchBcf.device":"Add BigSwitch BCF Controller",
-"label.add.BrocadeVcs.device":"Add Brocade Vcs Switch",
-"label.add.F5.device":"Add F5 device",
-"label.add.LDAP.account":"Add LDAP Account",
-"label.add.NiciraNvp.device":"Add Nvp Controller",
-"label.add.OpenDaylight.device":"Add OpenDaylight Controller",
-"label.add.PA.device":"Add Palo Alto device",
-"label.add.SRX.device":"Add SRX device",
-"label.add.VM.to.tier":"Add VM to tier",
-"label.add.VPN.gateway":"Add VPN Gateway",
-"label.add.account":"Add Account",
-"label.add.account.to.project":"Add account to project",
-"label.add.accounts":"Add accounts",
-"label.add.accounts.to":"Add accounts to",
-"label.add.acl.list":"Add ACL List",
-"label.edit.acl.list": "Edit ACL List",
-"label.add.affinity.group":"Add new affinity group",
-"label.add.baremetal.dhcp.device":"Add Baremetal DHCP Device",
-"label.add.baremetal.rack.configuration":"Add Baremetal Rack Configuration",
-"label.add.by":"Add by",
-"label.add.by.cidr":"Add By CIDR",
-"label.add.by.group":"Add By Group",
-"label.add.certificate":"Add Certificate",
-"label.add.ciscoASA1000v":"Add CiscoASA1000v Resource",
-"label.add.cluster":"Add Cluster",
-"label.add.compute.offering":"Add compute offering",
-"label.add.direct.iprange":"Add Direct Ip Range",
-"label.add.disk.offering":"Add Disk Offering",
-"label.add.domain":"Add Domain",
-"label.add.egress.rule":"Add egress rule",
-"label.add.firewall":"Add firewall rule",
-"label.add.globo.dns":"Add GloboDNS",
-"label.add.gslb":"Add GSLB",
-"label.add.guest.network":"Add guest network",
-"label.add.host":"Add Host",
-"label.add.ingress.rule":"Add Ingress Rule",
-"label.add.intermediate.certificate":"Add intermediate certificate",
-"label.add.internal.lb":"Add Internal LB",
-"label.add.ip.range":"Add IP Range",
-"label.add.isolated.guest.network":"Add Isolated Guest Network",
-"label.add.isolated.guest.network.with.sourcenat":"Add Isolated Guest Network with SourceNat",
-"label.add.isolated.network":"Add Isolated Network",
-"label.add.kubernetes.cluster":"Add Kubernetes Cluster",
-"label.add.kubernetes.version":"Add Kubernetes Version",
-"label.add.l2.guest.network":"Add L2 Guest Network",
-"label.add.ldap.account":"Add LDAP account",
-"label.add.list.name":"ACL List Name",
-"label.add.load.balancer":"Add Load Balancer",
-"label.add.management.ip.range":"Add Management IP Range",
-"label.add.more":"Add More",
-"label.add.netScaler.device":"Add Netscaler device",
-"label.add.network":"Add Network",
-"label.add.network.ACL":"Add network ACL",
-"label.add.network.acl.list":"Add Network ACL List",
-"label.add.network.device":"Add Network Device",
-"label.add.network.offering":"Add network offering",
-"label.add.new.F5":"Add new F5",
-"label.add.new.iso":"Add new ISO",
-"label.add.new.NetScaler":"Add new NetScaler",
-"label.add.new.PA":"Add new Palo Alto",
-"label.add.new.SRX":"Add new SRX",
-"label.add.new.gateway":"Add new gateway",
-"label.add.new.tier":"Add new tier",
-"label.add.nfs.secondary.staging.store":"Add NFS Secondary Staging Store",
-"label.add.physical.network":"Add physical network",
-"label.add.pod":"Add Pod",
-"label.add.port.forwarding.rule":"Add port forwarding rule",
-"label.add.portable.ip.range":"Add Portable IP Range",
-"label.add.primary.storage":"Add Primary Storage",
-"label.add.private.gateway":"Add Private Gateway",
-"label.add.region":"Add Region",
-"label.add.resources":"Add Resources",
-"label.add.role":"Add Role",
-"label.add.route":"Add route",
-"label.add.rule":"Add rule",
-"label.add.rule.desc": "Create a new ACL rule",
-"label.add.secondary.storage":"Add Secondary Storage",
-"label.add.security.group":"Add Security Group",
-"label.add.service.offering":"Add Service Offering",
-"label.add.static.nat.rule":"Add static NAT rule",
-"label.add.static.route":"Add static route",
-"label.add.system.service.offering":"Add System Service Offering",
-"label.add.template":"Add Template",
-"label.add.to.group":"Add to group",
-"label.add.ucs.manager":"Add UCS Manager",
-"label.add.user":"Add User",
-"label.add.userdata":"Userdata",
-"label.add.vlan":"Add VLAN",
-"label.add.vm":"Add VM",
-"label.add.vms":"Add VMs",
-"label.add.vms.to.lb":"Add VM(s) to load balancer rule",
-"label.add.vmware.datacenter":"Add VMware datacenter",
-"label.add.vnmc.device":"Add VNMC device",
-"label.add.vnmc.provider":"Add VNMC provider",
-"label.add.volume":"Add Volume",
-"label.add.vpc":"Add VPC",
-"label.add.vpc.offering":"Add VPC Offering",
-"label.add.vpn.customer.gateway":"Add VPN Customer Gateway",
-"label.add.vpn.user":"Add VPN user",
-"label.add.vxlan":"Add VXLAN",
-"label.add.zone":"Add Zone",
-"label.added.brocade.vcs.switch":"Added new Brocade Vcs Switch",
-"label.added.network.offering":"Added network offering",
-"label.added.new.bigswitch.bcf.controller":"Added new BigSwitch BCF Controller",
-"label.added.nicira.nvp.controller":"Added new Nicira NVP Controller",
-"label.addes.new.f5":"Added new F5",
-"label.adding":"Adding",
-"label.adding.cluster":"Adding Cluster",
-"label.adding.failed":"Adding Failed",
-"label.adding.pod":"Adding Pod",
-"label.adding.processing":"Adding....",
-"label.adding.succeeded":"Adding Succeeded",
-"label.adding.user":"Adding User",
-"label.adding.zone":"Adding Zone",
-"label.additional.networks":"Additional Networks",
-"label.admin":"Admin",
-"label.admin.accounts":"Admin Accounts",
-"label.advanced":"Advanced",
-"label.advanced.mode":"Advanced Mode",
-"label.advanced.search":"Advanced Search",
-"label.affinity":"Affinity",
-"label.affinity.group":"Affinity Group",
-"label.affinity.groups":"Affinity Groups",
-"label.agent.password":"Agent Password",
-"label.agent.port":"Agent Port",
-"label.agent.state":"Agent State",
-"label.agent.username":"Agent Username",
-"label.agree":"Agree",
-"label.alert":"Alert",
-"label.alert.archived":"Alert Archived",
-"label.alert.deleted":"Alert Deleted",
-"label.alert.details":"Alert details",
-"label.algorithm":"Algorithm",
-"label.allocated":"Allocated",
-"label.allocation.state":"Allocation State",
-"label.allow":"Allow",
-"label.all.zones":"All zones",
-"label.annotated.by":"Annotator",
-"label.annotation":"Annotation",
-"label.anti.affinity":"Anti-affinity",
-"label.anti.affinity.group":"Anti-affinity Group",
-"label.anti.affinity.groups":"Anti-affinity Groups",
-"label.api.key":"API Key",
-"label.api.version":"API Version",
-"label.app.name":"CloudStack",
-"label.apply":"Apply",
-"label.archive":"Archive",
-"label.archive.alerts":"Archive alerts",
-"label.archive.events":"Archive events",
-"label.assign":"Assign",
-"label.assign.instance.another":"Assign Instance to Another Account",
-"label.assign.to.load.balancer":"Assigning instance to load balancer",
-"label.assign.vms":"Assign VMs",
-"label.assigned.vms":"Assigned VMs",
-"label.associate.public.ip":"Associate Public IP",
-"label.associated.network":"Associated Network",
-"label.associated.network.id":"Associated Network ID",
-"label.associated.profile":"Associated Profile",
-"label.attached.iso":"Attached ISO",
-"label.author.email":"Author e-mail",
-"label.author.name":"Author name",
-"label.autoscale":"AutoScale",
-"label.autoscale.configuration.wizard":"AutoScale Configuration Wizard",
-"label.availability":"Availability",
-"label.availability.zone":"Availability Zone",
-"label.availabilityZone":"availabilityZone",
-"label.available":"Available",
-"label.available.public.ips":"Available Public IP Addresses",
-"label.back":"Back",
-"label.bandwidth":"Bandwidth",
-"label.baremetal.dhcp.devices":"Baremetal DHCP Devices",
-"label.baremetal.dhcp.provider":"Baremetal DHCP Provider",
-"label.baremetal.pxe.device":"Add Baremetal PXE Device",
-"label.baremetal.pxe.devices":"Baremetal PXE Devices",
-"label.baremetal.pxe.provider":"Baremetal PXE Provider",
-"label.baremetal.rack.configuration":"Baremetal Rack Configuration",
-"label.basic":"Basic",
-"label.basic.mode":"Basic Mode",
-"label.bigswitch.bcf.details":"BigSwitch BCF details",
-"label.bigswitch.bcf.nat":"BigSwitch BCF NAT Enabled",
-"label.bigswitch.controller.address":"BigSwitch BCF Controller Address",
-"label.blade.id":"Blade ID",
-"label.blades":"Blades",
-"label.bootable":"Bootable",
-"label.broadcast.domain.range":"Broadcast domain range",
-"label.broadcast.domain.type":"Broadcast Domain Type",
-"label.broadcast.uri":"Broadcast URI",
-"label.broadcasturi":"broadcasturi",
-"label.broadcat.uri":"Broadcast URI",
-"label.brocade.vcs.address":"Vcs Switch Address",
-"label.brocade.vcs.details":"Brocade Vcs Switch details",
-"label.by.account":"By Account",
-"label.by.alert.type":"By alert type",
-"label.by.availability":"By Availability",
-"label.by.date.end":"By date (end)",
-"label.by.date.start":"By date (start)",
-"label.by.domain":"By Domain",
-"label.by.end.date":"By End Date",
-"label.by.event.type":"By event type",
-"label.by.level":"By Level",
-"label.by.pod":"By Pod",
-"label.by.role":"By Role",
-"label.by.start.date":"By Start Date",
-"label.by.state":"By State",
-"label.by.traffic.type":"By Traffic Type",
-"label.by.type":"By Type",
-"label.by.type.id":"By Type ID",
-"label.by.zone":"By Zone",
-"label.bypass.vlan.overlap.check": "Bypass VLAN id/range overlap",
-"label.bytes.received":"Bytes Received",
-"label.bytes.sent":"Bytes Sent",
-"label.cache.mode":"Write-cache Type",
-"label.cancel":"Cancel",
-"label.capacity":"Capacity",
-"label.capacity.bytes":"Capacity Bytes",
-"label.capacity.iops":"Capacity IOPS",
-"label.certificate":"Server certificate",
-"label.certificate.details":"Certificate Details",
-"label.certificate.name":"Certificate",
-"label.certificateid":"Certificate ID",
-"label.chain":"Chain",
-"label.change.affinity":"Change Affinity",
-"label.change.ipaddress":"Change IP address for NIC",
-"label.change.service.offering":"Change service offering",
-"label.change.value":"Change value",
-"label.character":"Character",
-"label.chassis":"Chassis",
-"label.checksum":"checksum",
-"label.cidr":"CIDR",
-"label.cidr.account":"CIDR or Account/Security Group",
-"label.cidr.list":"Source CIDR",
-"label.cidr.destination.list":"Destination CIDR",
-"label.cisco.nexus1000v.ip.address":"Nexus 1000v IP Address",
-"label.cisco.nexus1000v.password":"Nexus 1000v Password",
-"label.cisco.nexus1000v.username":"Nexus 1000v Username",
-"label.ciscovnmc.resource.details":"CiscoVNMC resource details",
-"label.clean.up":"Clean up",
-"label.clear.list":"Clear list",
-"label.close":"Close",
-"label.cloud.console":"Cloud Management Console",
-"label.cloud.managed":"Cloud.com Managed",
-"label.cluster":"Cluster",
-"label.cluster.name":"Cluster Name",
-"label.cluster.size":"Cluster size",
-"label.cluster.size.worker.nodes":"Cluster size (Worker nodes)",
-"label.cluster.type":"Cluster Type",
-"label.clusters":"Clusters",
-"label.clvm":"CLVM",
-"label.code":"Code",
-"label.community":"Community",
-"label.compute":"Compute",
-"label.compute.and.storage":"Compute and Storage",
-"label.compute.offering":"Compute offering",
-"label.compute.offering.access":"Compute offering access",
-"label.compute.offering.type":"Compute offering type",
-"label.compute.offering.custom.constrained":"Custom Constrained",
-"label.compute.offering.custom.unconstrained":"Custom Unconstrained",
-"label.compute.offering.fixed":"Fixed Offering",
-"label.compute.offerings":"Compute Offerings",
-"label.configuration":"Configuration",
-"label.configure":"Configure",
-"label.configure.ldap":"Configure LDAP",
-"label.configure.network.ACLs":"Configure Network ACLs",
-"label.configure.sticky.policy":"Configure Sticky Policy",
-"label.configure.vpc":"Configure VPC",
-"label.confirm.password":"Confirm password",
-"label.confirmation":"Confirmation",
-"label.congratulations":"Congratulations!",
-"label.conserve.mode":"Conserve mode",
-"label.console.proxy":"Console proxy",
-"label.console.proxy.vm":"Console Proxy VM",
-"label.continue":"Continue",
-"label.continue.basic.install":"Continue with basic installation",
-"label.copying.iso":"Copying ISO",
-"label.copy.text": "Copy Text",
-"label.corrections.saved":"Corrections saved",
-"label.counter":"Counter",
-"label.cpu":"CPU",
-"label.cpu.allocated":"CPU Allocated",
-"label.cpu.allocated.for.VMs":"CPU Allocated for VMs",
-"label.cpu.limits":"CPU limits",
-"label.cpu.mhz":"CPU (in MHz)",
-"label.cpu.utilized":"CPU Utilized",
-"label.create.backup":"Start Backup",
-"label.create.VPN.connection":"Create VPN Connection",
-"label.create.nfs.secondary.staging.storage":"Create NFS Secondary Staging Store",
-"label.create.nfs.secondary.staging.store":"Create NFS secondary staging store",
-"label.create.project":"Create project",
-"label.create.ssh.key.pair":"Create a SSH Key Pair",
-"label.create.template":"Create template",
-"label.created":"Created",
-"label.created.by.system":"Created by system",
-"label.cross.zones":"Cross Zones",
-"label.custom":"Custom",
-"label.custom.disk.iops":"Custom IOPS",
-"label.custom.disk.offering":"Custom Disk Offering",
-"label.custom.disk.size":"Custom Disk Size",
-"label.daily":"Daily",
-"label.data.disk.offering":"Data Disk Offering",
-"label.date":"Date",
-"label.day":"Day",
-"label.day.of.month":"Day of Month",
-"label.day.of.week":"Day of Week",
-"label.dashboard.endpoint":"Dashboard endpoint",
-"label.dc.name":"DC Name",
-"label.dead.peer.detection":"Dead Peer Detection",
-"label.decline.invitation":"Decline invitation",
-"label.dedicate":"Dedicate",
-"label.dedicate.cluster":"Dedicate Cluster",
-"label.dedicate.host":"Dedicate Host",
-"label.dedicate.pod":"Dedicate Pod",
-"label.dedicate.vlan.vni.range":"Dedicate VLAN/VNI Range",
-"label.dedicate.zone":"Dedicate Zone",
-"label.dedicated":"Dedicated",
-"label.dedicated.vlan.vni.ranges":"Dedicated VLAN/VNI Ranges",
-"label.default":"Default",
-"label.default.egress.policy":"Default egress policy",
-"label.default.use":"Default Use",
-"label.default.view":"Default View",
-"label.delete":"Delete",
-"label.delete.BigSwitchBcf":"Remove BigSwitch BCF Controller",
-"label.delete.BrocadeVcs":"Remove Brocade Vcs Switch",
-"label.delete.F5":"Delete F5",
-"label.delete.NetScaler":"Delete NetScaler",
-"label.delete.NiciraNvp":"Remove Nvp Controller",
-"label.delete.OpenDaylight.device":"Delete OpenDaylight Controller",
-"label.delete.PA":"Delete Palo Alto",
-"label.delete.SRX":"Delete SRX",
-"label.delete.VPN.connection":"Delete VPN connection",
-"label.delete.VPN.customer.gateway":"Delete VPN Customer Gateway",
-"label.delete.VPN.gateway":"Delete VPN Gateway",
-"label.delete.acl.list":"Delete ACL List",
-"label.delete.affinity.group":"Delete Affinity Group",
-"label.delete.alerts":"Delete alerts",
-"label.delete.baremetal.rack.configuration":"Delete Baremetal Rack Configuration",
-"label.delete.ciscoASA1000v":"Delete CiscoASA1000v",
-"label.delete.ciscovnmc.resource":"Delete CiscoVNMC resource",
-"label.delete.events":"Delete events",
-"label.delete.gateway":"Delete gateway",
-"label.delete.internal.lb":"Delete Internal LB",
-"label.delete.iso":"Delete ISO",
-"label.delete.kubernetes.version":"Delete Kubernetes version",
-"label.delete.portable.ip.range":"Delete Portable IP Range",
-"label.delete.profile":"Delete Profile",
-"label.delete.project":"Delete project",
-"label.delete.role":"Delete Role",
-"label.delete.secondary.staging.store":"Delete Secondary Staging Store",
-"label.delete.sslcertificate":"Delete SSL Certificate",
-"label.delete.ucs.manager":"Delete UCS Manager",
-"label.delete.volumes":"Data Volumes to be deleted",
-"label.delete.vpn.user":"Delete VPN user",
-"label.deleting.failed":"Deleting Failed",
-"label.deleting.processing":"Deleting....",
-"label.deny":"Deny",
-"label.deployment.planner":"Deployment planner",
-"label.description":"Description",
-"label.destination.physical.network.id":"Destination physical network ID",
-"label.destination.zone":"Destination Zone",
-"label.destroy":"Destroy",
-"label.destroy.kubernetes.cluster":"Destroy Kubernetes cluster",
-"label.destroy.router":"Destroy router",
-"label.destroy.vm.graceperiod":"Destroy VM Grace Period",
-"label.detaching.disk":"Detaching Disk",
-"label.details":"Details",
-"label.device.id":"Device ID",
-"label.devices":"Devices",
-"label.dhcp":"DHCP",
-"label.direct.attached.public.ip":"Direct Attached Public IP",
-"label.direct.download":"Direct Download",
-"label.direct.ips":"Shared Network IPs",
-"label.disable.autoscale":"Disable Autoscale",
-"label.disable.host":"Disable Host",
-"label.disable.network.offering":"Disable network offering",
-"label.disable.provider":"Disable provider",
-"label.disable.vnmc.provider":"Disable VNMC provider",
-"label.disable.vpc.offering":"Disable VPC offering",
-"label.disable.vpn":"Disable Remote Access VPN",
-"label.disabled":"Disabled",
-"label.disabling.vpn.access":"Disabling VPN Access",
-"label.disassociate.profile.blade":"Disassociate Profile from Blade",
-"label.disbale.vnmc.device":"Disable VNMC device",
-"label.disk.allocated":"Disk Allocated",
-"label.disk.bytes.read.rate":"Disk Read Rate (BPS)",
-"label.disk.bytes.write.rate":"Disk Write Rate (BPS)",
-"label.disk.iops.max":"Max IOPS",
-"label.disk.iops.min":"Min IOPS",
-"label.disk.iops.read.rate":"Disk Read Rate (IOPS)",
-"label.disk.iops.total":"IOPS Total",
-"label.disk.iops.allocated":"IOPS Allocated",
-"label.disk.iops.write.rate":"Disk Write Rate (IOPS)",
-"label.disk.offering":"Disk Offering",
-"label.disk.offering.access":"Disk offering access",
-"label.disk.offering.details":"Disk offering details",
-"label.disk.newOffering": "New Disk Offering",
-"label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-"label.disk.physicalsize":"Physical Size",
-"label.disk.provisioningtype":"Provisioning Type",
-"label.disk.read.bytes":"Disk Read (Bytes)",
-"label.disk.read.io":"Disk Read (IO)",
-"label.disk.size":"Disk Size",
-"label.disk.size.gb":"Disk Size (in GB)",
-"label.disk.total":"Disk Total",
-"label.disk.utilisation":"Utilisation",
-"label.disk.virtualsize":"Virtual Size",
-"label.disk.volume":"Disk Volume",
-"label.disk.write.bytes":"Disk Write (Bytes)",
-"label.disk.write.io":"Disk Write (IO)",
-"label.diskoffering":"diskoffering",
-"label.display.name":"Display Name",
-"label.display.text":"Display Text",
-"label.distributedrouter":"Distributed Router",
-"label.dns":"DNS",
-"label.dns.1":"DNS 1",
-"label.dns.2":"DNS 2",
-"label.domain":"Domain",
-"label.domains":"Domains",
-"label.domain.admin":"Domain Admin",
-"label.domain.details":"Domain details",
-"label.domain.id":"Domain ID",
-"label.domain.lower":"domain",
-"label.domain.name":"Domain Name",
-"label.domain.router":"Domain router",
-"label.domain.suffix":"DNS Domain Suffix (i.e., xyz.com)",
-"label.done":"Done",
-"label.double.quotes.are.not.allowed":"Double quotes are not allowed",
-"label.download.kubernetes.cluster.config":"Download Kubernetes cluster config",
-"label.download.progress":"Download Progress",
-"label.drag.new.position":"Drag to new position",
-"label.duration.in.sec":"Duration (in sec)",
-"label.dynamically.scalable":"Dynamically Scalable",
-"label.edit":"Edit",
-"label.edit.acl.rule":"Edit ACL rule",
-"label.edit.affinity.group":"Edit Affinity Group",
-"label.edit.lb.rule":"Edit LB rule",
-"label.edit.network.details":"Edit network details",
-"label.edit.project.details":"Edit project details",
-"label.edit.region":"Edit Region",
-"label.edit.role":"Edit Role",
-"label.edit.rule":"Edit rule",
-"label.edit.secondary.ips":"Edit secondary IPs",
-"label.edit.tags":"Edit tags",
-"label.edit.traffic.type":"Edit traffic type",
-"label.edit.vpc":"Edit VPC",
-"label.egress.default.policy":"Egress Default Policy",
-"label.egress.rule":"Egress rule",
-"label.egress.rules":"Egress rules",
-"label.elastic":"Elastic",
-"label.elastic.IP":"Elastic IP",
-"label.elastic.LB":"Elastic LB",
-"label.email":"Email",
-"label.email.lower":"email",
-"label.enable.autoscale":"Enable Autoscale",
-"label.enable.host":"Enable Host",
-"label.enable.network.offering":"Enable network offering",
-"label.enable.provider":"Enable provider",
-"label.enable.s3":"Enable S3-backed Secondary Storage",
-"label.enable.swift":"Enable Swift",
-"label.enable.vnmc.device":"Enable VNMC device",
-"label.enable.vnmc.provider":"Enable VNMC provider",
-"label.enable.vpc.offering":"Enable VPC offering",
-"label.enable.vpn":"Enable Remote Access VPN",
-"label.enabling.vpn":"Enabling VPN",
-"label.enabling.vpn.access":"Enabling VPN Access",
-"label.end.IP":"End IP",
-"label.end.port":"End Port",
-"label.end.reserved.system.IP":"End Reserved system IP",
-"label.end.vlan":"End VLAN",
-"label.end.vxlan":"End VXLAN",
-"label.endpoint":"Endpoint",
-"label.endpoint.or.operation":"Endpoint or Operation",
-"label.enter.hardware.setup":"Enter the hardware setup menu",
-"label.enter.token":"Enter token",
-"label.error":"Error",
-"label.error.code":"Error Code",
-"label.error.upper":"ERROR",
-"label.esx.host":"ESX/ESXi Host",
-"label.event":"Event",
-"label.event.archived":"Event Archived",
-"label.event.deleted":"Event Deleted",
-"label.event.timeline":"Event Timeline",
-"label.every":"Every",
-"label.example":"Example",
-"label.expunge":"Expunge",
-"label.external.id":"External ID",
-"label.external.link":"External link",
-'label.external.loadbalancer.ip.address': "External load balancer IP address",
-"label.extractable":"Extractable",
-"label.extractable.lower":"extractable",
-"label.f5":"F5",
-"label.f5.details":"F5 details",
-"label.failed":"Failed",
-"label.featured":"Featured",
-"label.fetch.latest":"Fetch latest",
-"label.filterBy":"Filter by",
-"label.fingerprint":"FingerPrint",
-"label.firewall":"Firewall",
-"label.first.name":"First Name",
-"label.firstname.lower":"firstname",
-"label.forged.transmits":"Forged Transmits",
-"label.format":"Format",
-"label.format.lower":"format",
-"label.friday":"Friday",
-"label.french.azerty.keyboard":"French AZERTY keyboard",
-"label.full":"Full",
-"label.full.path":"Full path",
-"label.gateway":"Gateway",
-"label.general.alerts":"General Alerts",
-"label.generating.url":"Generating URL",
-"label.get.diagnostics.desc":"If you wish to override the standard files returned, enter them here. Otherwise leave blank and press OK",
-"label.get.diagnostics.files":"Alternate Files to Retrieve",
-"label.globo.dns":"GloboDNS",
-"label.globo.dns.configuration":"GloboDNS Configuration",
-"label.gluster.volume":"Volume",
-"label.go.step.2":"Go to Step 2",
-"label.go.step.3":"Go to Step 3",
-"label.go.step.4":"Go to Step 4",
-"label.go.step.5":"Go to Step 5",
-"label.gpu":"GPU",
-"label.group":"Group",
-"label.group.by.account":"Group by account",
-"label.group.by.cluster":"Group by cluster",
-"label.group.by.pod":"Group by pod",
-"label.group.by.zone":"Group by zone",
-"label.group.optional":"Group (Optional)",
-"label.gslb":"GSLB",
-"label.gslb.assigned.lb":"Assigned load balancing",
-"label.gslb.assigned.lb.more":"Assign more load balancing",
-"label.gslb.delete":"Delete GSLB",
-"label.gslb.details":"GSLB details",
-"label.gslb.domain.name":"GSLB Domain Name",
-"label.gslb.lb.details":"Load balancing details",
-"label.gslb.lb.remove":"Remove load balancing from this GSLB",
-"label.gslb.lb.rule":"Load balancing rule",
-"label.gslb.service":"GSLB service",
-"label.gslb.service.private.ip":"GSLB service Private IP",
-"label.gslb.service.public.ip":"GSLB service Public IP",
-"label.gslb.servicetype":"Service Type",
-"label.guest":"Guest",
-"label.guest.cidr":"Guest CIDR",
-"label.guest.end.ip":"Guest end IP",
-"label.guest.externalId":"External Id",
-"label.guest.gateway":"Guest Gateway",
-"label.guest.ip":"Guest IP Address",
-"label.guest.ip.range":"Guest IP Range",
-"label.guest.netmask":"Guest Netmask",
-"label.guest.network.details":"Guest network details",
-"label.guest.networks":"Guest networks",
-"label.guest.start.ip":"Guest start IP",
-"label.guest.traffic":"Guest Traffic",
-"label.guest.traffic.vswitch.name":"Guest Traffic vSwitch Name",
-"label.guest.traffic.vswitch.type":"Guest Traffic vSwitch Type",
-"label.guest.type":"Guest Type",
-"label.ha.enabled":"HA Enabled",
-"label.ha.configure":"Configure HA",
-"label.ha.disable":"Disable HA",
-"label.ha.enable":"Enable HA",
-"label.ha.provider":"HA Provider",
-"label.ha.state":"HA State",
-"label.ha":"HA",
-"label.health.check":"Health Check",
-"label.health.check.advanced.options":"Advanced Options:",
-"label.health.check.configurations.options":"Configuration Options:",
-"label.health.check.interval.in.sec":"Health Check Interval (in sec)",
-"label.health.check.message.desc":"Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check",
-"label.health.check.wizard":"Health Check Wizard",
-"label.healthy.threshold":"Healthy Threshold",
-"label.help":"Help",
-"label.hide.ingress.rule":"Hide Ingress Rule",
-"label.hints":"Hints",
-"label.home":"Home",
-"label.host":"Host",
-"label.host.MAC":"Host MAC",
-"label.host.alerts":"Hosts in Alert State",
-"label.host.name":"Host Name",
-"label.host.tag":"Host Tag",
-"label.host.tags":"Host Tags",
-"label.host.ueficapability":"UEFI Supported",
-"label.hosts":"Hosts",
-"label.hourly":"Hourly",
-"label.hvm":"HVM",
-"label.hyperv.traffic.label":"HyperV Traffic Label",
-"label.hypervisor":"Hypervisor",
-"label.hypervisor.capabilities":"Hypervisor capabilities",
-"label.hypervisor.snapshot.reserve":"Hypervisor Snapshot Reserve",
-"label.hypervisor.type":"Hypervisor Type",
-"label.hypervisor.version":"Hypervisor version",
-"label.hypervisors":"Hypervisors",
-"label.id":"ID",
-"label.info":"Info",
-"label.info.upper":"INFO",
-"label.ingress.rule":"Ingress Rule",
-"label.initiated.by":"Initiated By",
-"label.inside.port.profile":"Inside Port Profile",
-"label.installWizard.addClusterIntro.subtitle":"What is a cluster?",
-"label.installWizard.addClusterIntro.title":"Let&rsquo;s add a cluster",
-"label.installWizard.addHostIntro.subtitle":"What is a host?",
-"label.installWizard.addHostIntro.title":"Let&rsquo;s add a host",
-"label.installWizard.addPodIntro.subtitle":"What is a pod?",
-"label.installWizard.addPodIntro.title":"Let&rsquo;s add a pod",
-"label.installWizard.addPrimaryStorageIntro.subtitle":"What is primary storage?",
-"label.installWizard.addPrimaryStorageIntro.title":"Let&rsquo;s add primary storage",
-"label.installWizard.addSecondaryStorageIntro.subtitle":"What is secondary storage?",
-"label.installWizard.addSecondaryStorageIntro.title":"Let&rsquo;s add secondary storage",
-"label.installWizard.addZone.title":"Add zone",
-"label.installWizard.addZoneIntro.subtitle":"What is a zone?",
-"label.installWizard.addZoneIntro.title":"Let&rsquo;s add a zone",
-"label.installWizard.click.launch":"Click the launch button.",
-"label.installWizard.subtitle":"This tour will aid you in setting up your CloudStack&#8482 installation",
-"label.installWizard.title":"Hello and Welcome to CloudStack&#8482",
-"label.instance":"Instance",
-"label.instance.limits":"Instance Limits",
-"label.instance.name":"Instance Name",
-"label.instance.port":"Instance Port",
-"label.instance.scaled.up":"Instance scaled to the requested offering",
-"label.instances":"Instances",
-"label.instanciate.template.associate.profile.blade":"Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate":"Intermediate certificate {0}",
-"label.internal.dns.1":"Internal DNS 1",
-"label.internal.dns.2":"Internal DNS 2",
-"label.internal.lb":"Internal LB",
-"label.internal.lb.details":"Internal LB details",
-"label.internal.name":"Internal name",
-"label.internallbvm":"InternalLbVm",
-"label.interval.type":"Interval Type",
-"label.introduction.to.cloudstack":"Introduction to CloudStack&#8482",
-"label.invalid.integer":"Invalid Integer",
-"label.invalid.number":"Invalid Number",
-"label.invitations":"Invitations",
-"label.invite":"Invite",
-"label.invite.to":"Invite to",
-"label.invited.accounts":"Invited accounts",
-"label.ip":"IP",
-"label.ip.address":"IP Address",
-"label.ip.allocations":"IP Allocations",
-"label.ip.limits":"Public IP Limits",
-"label.ip.or.fqdn":"IP or FQDN",
-"label.ip.range":"IP Range",
-"label.ip.ranges":"IP Ranges",
-"label.ipaddress":"IP Address",
-"label.ips":"IPs",
-"label.ipv4.cidr":"IPv4 CIDR",
-"label.ipv4.dns1":"IPv4 DNS1",
-"label.ipv4.dns2":"IPv4 DNS2",
-"label.ipv4.end.ip":"IPv4 End IP",
-"label.ipv4.gateway":"IPv4 Gateway",
-"label.ipv4.netmask":"IPv4 Netmask",
-"label.ipv4.start.ip":"IPv4 Start IP",
-"label.ipv6.CIDR":"IPv6 CIDR",
-"label.ipv6.address":"IPv6 IP Address",
-"label.ipv6.dns1":"IPv6 DNS1",
-"label.ipv6.dns2":"IPv6 DNS2",
-"label.ipv6.end.ip":"IPv6 End IP",
-"label.ipv6.gateway":"IPv6 Gateway",
-"label.ipv6.start.ip":"IPv6 Start IP",
-"label.is.default":"Is Default",
-"label.is.redundant.router":"Redundant",
-"label.is.shared":"Is Shared",
-"label.is.system":"Is System",
-"label.iscsi":"iSCSI",
-"label.iso":"ISO",
-"label.iso.boot":"ISO Boot",
-"label.iso.id":"ISO ID",
-"label.iso.name":"ISO name",
-"label.iso.state":"ISO state",
-"label.isolated.networks":"Isolated networks",
-"label.isolation.method":"Isolation method",
-"label.isolation.mode":"Isolation Mode",
-"label.isolation.uri":"Isolation URI",
-"label.item.listing":"Item listing",
-"label.japanese.keyboard":"Japanese keyboard",
-"label.keep":"Keep",
-"label.keep.colon":"Keep:",
-"label.key":"Key",
-"label.keyboard.language":"Keyboard language",
-"label.vm.boottype":"Boot Type",
-"label.vm.bootmode":"Boot Mode",
-"label.vm.enterhardwaresetup":"Enter hardware setup after boot",
-"label.keyboard.type":"Keyboard type",
-"label.kubernetes.cluster":"Kubernetes cluster",
-"label.kubernetes.cluster.details":"Kubernetes cluster details",
-"label.kubernetes.service":"Kubernetes Service",
-"label.kubernetes.version":"Kubernetes version",
-"label.kubernetes.version.details":"Kubernetes version details",
-"label.kvm.traffic.label":"KVM traffic label",
-"label.label":"Label",
-"label.lang.arabic":"Arabic",
-"label.lang.brportugese":"Brazilian Portugese",
-"label.lang.catalan":"Catalan",
-"label.lang.chinese":"Chinese (Simplified)",
-"label.lang.dutch":"Dutch (Netherlands)",
-"label.lang.english":"English",
-"label.lang.french":"French",
-"label.lang.german":"German",
-"label.lang.hungarian":"Hungarian",
-"label.lang.italian":"Italian",
-"label.lang.japanese":"Japanese",
-"label.lang.korean":"Korean",
-"label.lang.norwegian":"Norwegian",
-"label.lang.polish":"Polish",
-"label.lang.russian":"Russian",
-"label.lang.spanish":"Spanish",
-"label.last.annotated":"Last annotation date",
-"label.last.disconnected":"Last Disconnected",
-"label.last.name":"Last Name",
-"label.lastname.lower":"lastname",
-"label.latest.events":"Latest events",
-"label.launch":"Launch",
-"label.launch.vm":"Launch VM",
-"label.launch.zone":"Launch zone",
-"label.lb.algorithm.leastconn":"Least connections",
-"label.lb.algorithm.roundrobin":"Round-robin",
-"label.lb.algorithm.source":"Source",
-"label.lb.protocol.http":"HTTP",
-"label.lb.protocol.ssl":"SSL",
-"label.lb.protocol.tcp":"TCP",
-"label.lb.protocol.tcp.proxy":"TCP-proxy",
-"label.lb.protocol.udp":"UDP",
-"label.ldap.configuration":"LDAP Configuration",
-"label.ldap.group.name":"LDAP Group",
-"label.ldap.link.type":"Type",
-"label.ldap.port":"LDAP port",
-"label.level":"Level",
-"label.link.domain.to.ldap":"Link Domain to LDAP",
-"label.linklocal.ip":"Link Local IP Address",
-"label.load.balancer":"Load Balancer",
-"label.load.balancer.type":"Load Balancer Type",
-"label.load.balancing":"Load Balancing",
-"label.load.balancing.policies":"Load balancing policies",
-"label.loading":"Loading",
-"label.local":"Local",
-"label.local.file":"Local file",
-"label.local.storage":"Local Storage",
-"label.local.storage.enabled":"Enable local storage for User VMs",
-"label.local.storage.enabled.system.vms":"Enable local storage for System VMs",
-"label.login":"Login",
-"label.logout":"Logout",
-"label.lun":"LUN",
-"label.lxc.traffic.label":"LXC Traffic Label",
-"label.make.project.owner":"Make account project owner",
-"label.make.redundant":"Make redundant",
-"label.manage":"Manage",
-"label.manage.resources":"Manage Resources",
-"label.managed":"Managed",
-"label.managed.state":"Managed State",
-"label.management":"Management",
-"label.management.ips":"Management IP Addresses",
-"label.management.server":"Management Server",
-"label.mac.address": "MAC Address",
-"label.management.servers":"Management Servers",
-"label.mac.address.changes":"MAC Address Changes",
-"label.master.nodes":"Master nodes",
-"label.max.cpus":"Max. CPU cores",
-"label.max.guest.limit":"Max guest limit",
-"label.max.instances":"Max Instances",
-"label.max.memory":"Max. memory (MiB)",
-"label.max.networks":"Max. networks",
-"label.max.primary.storage":"Max. primary (GiB)",
-"label.max.public.ips":"Max. public IPs",
-"label.max.secondary.storage":"Max. secondary (GiB)",
-"label.max.snapshots":"Max. snapshots",
-"label.max.templates":"Max. templates",
-"label.max.vms":"Max. user VMs",
-"label.max.volumes":"Max. volumes",
-"label.max.vpcs":"Max. VPCs",
-"label.maximum":"Maximum",
-"label.may.continue":"You may now continue.",
-"label.md5.checksum":"MD5 checksum",
-"label.memory":"Memory",
-"label.memory.allocated":"Memory Allocated",
-"label.memory.limits":"Memory limits (MiB)",
-"label.memory.mb":"Memory (in MB)",
-"label.memory.minimum.mb":"Min Memory (in MB)",
-"label.memory.maximum.mb":"Max Memory (in MB)",
-"label.memory.total":"Memory Total",
-"label.memory.used":"Memory Used",
-"label.menu.accounts":"Accounts",
-"label.menu.alerts":"Alerts",
-"label.menu.all.accounts":"All Accounts",
-"label.menu.all.instances":"All Instances",
-"label.menu.backup":"Backup",
-"label.menu.backup.offerings":"Backup Offerings",
-"label.menu.community.isos":"Community ISOs",
-"label.menu.community.templates":"Community Templates",
-"label.menu.configuration":"Configuration",
-"label.menu.dashboard":"Dashboard",
-"label.menu.destroyed.instances":"Destroyed Instances",
-"label.menu.disk.offerings":"Disk Offerings",
-"label.menu.domains":"Domains",
-"label.menu.events":"Events",
-"label.menu.featured.isos":"Featured ISOs",
-"label.menu.featured.templates":"Featured Templates",
-"label.menu.global.settings":"Global Settings",
-"label.menu.infrastructure":"Infrastructure",
-"label.menu.instances":"Instances",
-"label.menu.ipaddresses":"IP Addresses",
-"label.menu.isos":"ISOs",
-"label.menu.my.accounts":"My Accounts",
-"label.menu.my.instances":"My Instances",
-"label.menu.my.isos":"My ISOs",
-"label.menu.my.templates":"My Templates",
-"label.menu.network":"Network",
-"label.menu.network.offerings":"Network Offerings",
-"label.menu.physical.resources":"Physical Resources",
-"label.menu.regions":"Regions",
-"label.menu.running.instances":"Running Instances",
-"label.menu.security.groups":"Security Groups",
-"label.menu.service.offerings":"Service Offerings",
-"label.menu.snapshots":"Snapshots",
-"label.menu.sshkeypair":"SSH KeyPair",
-"label.menu.stopped.instances":"Stopped Instances",
-"label.menu.storage":"Storage",
-"label.menu.system":"System",
-"label.menu.system.service.offerings":"System Offerings",
-"label.menu.system.vms":"System VMs",
-"label.menu.templates":"Templates",
-"label.menu.virtual.appliances":"Virtual Appliances",
-"label.menu.virtual.resources":"Virtual Resources",
-"label.menu.volumes":"Volumes",
-"label.menu.vpc.offerings":"VPC Offerings",
-"label.metrics":"Metrics",
-"label.metrics.allocated":"Allocated",
-"label.metrics.clusters":"Clusters",
-"label.metrics.cpu.allocated":"CPU Allocation",
-"label.metrics.cpu.max.dev":"Deviation",
-"label.metrics.cpu.total":"Total",
-"label.metrics.cpu.usage":"CPU Usage",
-"label.metrics.cpu.used.avg":"Used",
-"label.metrics.disk":"Disk",
-"label.metrics.disk.allocated":"Allocated",
-"label.metrics.disk.iops.total":"IOPS",
-"label.metrics.disk.read":"Read",
-"label.metrics.disk.size":"Size",
-"label.metrics.disk.storagetype":"Type",
-"label.metrics.disk.total":"Total",
-"label.metrics.disk.unallocated":"Unallocated",
-"label.metrics.disk.usage":"Disk Usage",
-"label.metrics.disk.used":"Used",
-"label.metrics.disk.write":"Write",
-"label.metrics.hosts":"Hosts",
-"label.metrics.memory.allocated":"Mem Allocation",
-"label.metrics.memory.max.dev":"Deviation",
-"label.metrics.memory.total":"Total",
-"label.metrics.memory.usage":"Mem Usage",
-"label.metrics.memory.used.avg":"Used",
-"label.metrics.name":"Name",
-"label.metrics.network.read":"Read",
-"label.metrics.network.usage":"Network Usage",
-"label.metrics.network.write":"Write",
-"label.metrics.num.cpu.cores":"Cores",
-"label.metrics.outofbandmanagementpowerstate":"Power State",
-"label.metrics.property":"Property",
-"label.metrics.scope":"Scope",
-"label.metrics.state":"State",
-"label.metrics.storagepool":"Storage Pool",
-"label.metrics.vm.name":"VM Name",
-"label.migrate.instance.to":"Migrate instance to",
-"label.migrate.instance.to.host":"Migrate instance to another host",
-"label.migrate.instance.to.ps":"Migrate instance to another primary storage",
-"label.migrate.lb.vm":"Migrate LB VM",
-"label.migrate.router.to":"Migrate Router to",
-"label.migrate.systemvm.to":"Migrate System VM to",
-"label.migrate.to.host":"Migrate to host",
-"label.migrate.to.storage":"Migrate to storage",
-"label.migrate.volume":"Migrate Volume",
-"label.migrate.volume.to.primary.storage":"Migrate volume to another primary storage",
-"label.migrate.volume.newDiskOffering": "Replace disk offering?",
-"label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-"label.min.instances":"Min Instances",
-"label.min.past.the.hr":"min past the hr",
-"label.minimum":"Minimum",
-"label.minute.past.hour":"minute(s) past the hour",
-"label.minutes.past.hour":"minutes(s) past the hour",
-"label.mode":"Mode",
-"label.monday":"Monday",
-"label.monthly":"Monthly",
-"label.more.templates":"More Templates",
-"label.move.down.row":"Move down one row",
-"label.move.to.bottom":"Move to bottom",
-"label.move.to.top":"Move to top",
-"label.move.up.row":"Move up one row",
-"label.my.account":"My Account",
-"label.my.network":"My network",
-"label.my.templates":"My templates",
-"label.na":"N/A",
-"label.name":"Name",
-"label.name.lower":"name",
-"label.name.optional":"Name (Optional)",
-"label.nat.port.range":"NAT Port Range",
-"label.ncc":"NCC",
-"label.ncc.delete":"Delete NCC",
-"label.ncc.details":"NCC Details",
-"label.netScaler":"NetScaler",
-"label.netmask":"Netmask",
-"label.netscaler.details":"NetScaler details",
-"label.netscaler.service.packages":"Netscaler Service Packages",
-"label.netscaler.service.packages.description":"Service Package Description",
-"label.network":"Network",
-"label.network.ACL":"Network ACL",
-"label.network.ACL.total":"Network ACL Total",
-"label.network.ACLs":"Network ACLs",
-"label.network.addVM":"Add network to VM",
-"label.network.cidr":"Network CIDR",
-"label.network.desc":"Network Desc",
-"label.network.details":"Network Details",
-"label.network.device":"Network Device",
-"label.network.device.type":"Network Device Type",
-"label.network.domain":"Network Domain",
-"label.network.domain.text":"Network domain",
-"label.network.hideipaddressusage":"Hide IP Address Usage",
-"label.network.id":"Network ID",
-"label.network.label.display.for.blank.value":"Use default gateway",
-"label.network.limits":"Network limits",
-"label.network.name":"Network Name",
-"label.network.offering":"Network Offering",
-"label.network.offering.access":"Network offering access",
-"label.network.offering.details":"Network offering details",
-"label.network.offering.display.text":"Network Offering Display Text",
-"label.network.offering.id":"Network Offering ID",
-"label.network.offering.name":"Network Offering Name",
-"label.network.rate":"Network Rate (Mb/s)",
-"label.network.rate.megabytes":"Network Rate (MB/s)",
-"label.network.read":"Network Read",
-"label.network.service.providers":"Network Service Providers",
-"label.network.type":"Network Type",
-"label.network.write":"Network Write",
-"label.networking.and.security":"Networking and security",
-"label.networks":"Networks",
-"label.new":"New",
-"label.new.password":"New Password",
-"label.current.password": "Current Password",
-"label.new.project":"New Project",
-"label.new.ssh.key.pair":"New SSH Key Pair",
-"label.new.vm":"New VM",
-"label.next":"Next",
-"label.nexusVswitch":"Nexus 1000v",
-"label.nfs":"NFS",
-"label.nfs.server":"NFS Server",
-"label.nfs.storage":"NFS Storage",
-"label.nic.adapter.type":"NIC adapter type",
-"label.nicira.controller.address":"Controller Address",
-"label.nicira.l2gatewayserviceuuid":"L2 Gateway Service Uuid",
-"label.nicira.l3gatewayserviceuuid":"L3 Gateway Service Uuid",
-"label.nicira.nvp.details":"Nicira NVP details",
-"label.nicira.transportzoneuuid":"Transport Zone Uuid",
-"label.nics":"NICs",
-"label.no":"No",
-"label.no.actions":"No Available Actions",
-"label.no.alerts":"No Recent Alerts",
-"label.no.data":"No data to show",
-"label.no.errors":"No Recent Errors",
-"label.no.grouping":"(no grouping)",
-"label.no.isos":"No available ISOs",
-"label.no.items":"No Available Items",
-"label.no.security.groups":"No Available Security Groups",
-"label.no.thanks":"No thanks",
-"label.node.root.disk.size.gb":"Node root disk size (in GB)",
-"label.none":"None",
-"label.not.found":"Not Found",
-"label.notifications":"Notifications",
-"label.num.cpu.cores":"# of CPU Cores",
-"label.min.cpu.cores":"Min CPU Cores",
-"label.max.cpu.cores":"Max CPU Cores",
-"label.number.of.clusters":"Number of Clusters",
-"label.number.of.cpu.sockets":"The Number of CPU Sockets",
-"label.number.of.hosts":"Number of Hosts",
-"label.number.of.management.servers":"Number of Management Servers",
-"label.number.of.pods":"Number of Pods",
-"label.number.of.system.vms":"Number of System VMs",
-"label.number.of.virtual.routers":"Number of Virtual Routers",
-"label.number.of.zones":"Number of Zones",
-"label.numretries":"Number of Retries",
-"label.ocfs2":"OCFS2",
-"label.of.month":"of month",
-"label.offer.ha":"Offer HA",
-"label.ok":"OK",
-"label.openDaylight":"OpenDaylight",
-"label.opendaylight.controller":"OpenDaylight Controller",
-"label.opendaylight.controllerdetail":"OpenDaylight Controller Details",
-"label.opendaylight.controllers":"OpenDaylight Controllers",
-"label.operation": "Operation",
-"label.operator":"Operator",
-"label.optional":"Optional",
-"label.order":"Order",
-"label.os.preference":"OS Preference",
-"label.os.type":"OS Type",
-"label.other":"Other",
-"label.outofbandmanagement":"Out-of-band Management",
-"label.outofbandmanagement.action":"Action",
-"label.outofbandmanagement.action.issue":"Issue Out-of-band Management Power Action",
-"label.outofbandmanagement.address":"Address",
-"label.outofbandmanagement.changepassword":"Change Out-of-band Management Password",
-"label.outofbandmanagement.configure":"Configure Out-of-band Management",
-"label.outofbandmanagement.disable":"Disable Out-of-band Management",
-"label.outofbandmanagement.driver":"Driver",
-"label.outofbandmanagement.enable":"Enable Out-of-band Management",
-"label.outofbandmanagement.password":"Password",
-"label.outofbandmanagement.port":"Port",
-"label.outofbandmanagement.reenterpassword":"Re-enter Password",
-"label.outofbandmanagement.username":"Username",
-"label.override.guest.traffic":"Override Guest-Traffic",
-"label.override.public.traffic":"Override Public-Traffic",
-"label.ovf.properties":"OVF Properties",
-"label.ovm.traffic.label":"OVM traffic label",
-"label.ovm3.cluster":"Native Clustering",
-"label.ovm3.pool":"Native Pooling",
-"label.ovm3.traffic.label":"OVM3 traffic label",
-"label.ovm3.vip":"Master Vip IP",
-"label.ovs":"OVS",
-"label.owned.public.ips":"Owned Public IP Addresses",
-"label.owner.account":"Owner Account",
-"label.owner.domain":"Owner Domain",
-"label.palo.alto.details":"Palo Alto details",
-"label.parent.domain":"Parent Domain",
-"label.passive":"Passive",
-"label.password":"Password",
-"label.password.enabled":"Password Enabled",
-"label.password.lower":"password",
-"label.password.reset.confirm":"Password has been reset to ",
-"label.path":"Path",
-"label.perfect.forward.secrecy":"Perfect Forward Secrecy",
-"label.permission":"Permission",
-"label.persistent":"Persistent ",
-"label.physical.network":"Physical Network",
-"label.physical.network.ID":"Physical network ID",
-"label.physical.network.name":"Physical network name",
-"label.ping.path":"Ping Path",
-"label.planner.mode":"Planner mode",
-"label.please.complete.the.following.fields":"Please complete the following fields",
-"label.please.specify.netscaler.info":"Please specify Netscaler info",
-"label.please.wait":"Please Wait",
-"label.plugin.details":"Plugin details",
-"label.plugins":"Plugins",
-"label.pod":"Pod",
-"label.pod.dedicated":"Pod Dedicated",
-"label.pod.name":"Pod name",
-"label.pods":"Pods",
-"label.polling.interval.sec":"Polling Interval (in sec)",
-"label.port":"Port",
-"label.port.forwarding":"Port Forwarding",
-"label.port.forwarding.policies":"Port forwarding policies",
-"label.port.range":"Port Range",
-"label.portable.ip":"Portable IP",
-"label.portable.ip.range.details":"Portable IP Range details",
-"label.portable.ip.ranges":"Portable IP Ranges",
-"label.portable.ips":"Portable IPs",
-"label.powerstate":"Power State",
-"label.prev":"Prev",
-"label.previous":"Previous",
-"label.primary.allocated":"Primary Storage Allocated",
-"label.primary.network":"Primary Network",
-"label.primary.storage":"Primary Storage",
-"label.primary.storage.count":"Primary Storage Pools",
-"label.primary.storage.limits":"Primary Storage limits (GiB)",
-"label.primary.used":"Primary Storage Used",
-"label.private.Gateway":"Private Gateway",
-"label.private.interface":"Private Interface",
-"label.private.ip":"Private IP Address",
-"label.private.ip.range":"Private IP Range",
-"label.private.ips":"Private IP Addresses",
-"label.private.key":"Private Key",
-"label.private.network":"Private network",
-"label.private.port":"Private Port",
-"label.private.registry":"Private registry",
-"label.private.zone":"Private Zone",
-"label.privatekey":"PKCS#8 Private Key",
-"label.privatekey.name":"Private Key",
-"label.privatekey.password":"Private Key Password",
-"label.profile":"Profile",
-"label.project":"Project",
-"label.project.dashboard":"Project dashboard",
-"label.project.id":"Project ID",
-"label.project.ids":"Project IDs",
-"label.project.invite":"Invite to project",
-"label.project.name":"Project name",
-"label.project.view":"Project View",
-"label.projects":"Projects",
-"label.promiscuous.mode":"Promiscuous Mode",
-"label.protocol":"Protocol",
-"label.protocol.number":"Protocol Number",
-"label.protocol.number.short" : "#Protocol",
-"label.provider":"Provider",
-"label.providers":"Providers",
-"label.public":"Public",
-"label.public.interface":"Public Interface",
-"label.public.ip":"Public IP Address",
-"label.public.ips":"Public IP Addresses",
-"label.public.key":"Public Key",
-"label.public.lb":"Public LB",
-"label.public.load.balancer.provider":"Public Load Balancer Provider",
-"label.public.network":"Public network",
-"label.public.port":"Public Port",
-"label.public.traffic":"Public traffic",
-"label.public.traffic.vswitch.name":"Public Traffic vSwitch Name",
-"label.public.traffic.vswitch.type":"Public Traffic vSwitch Type",
-"label.public.zone":"Public Zone",
-"label.purpose":"Purpose",
-"label.qos.type":"QoS Type",
-"label.quickview":"Quickview",
-"label.quiesce.vm":"Quiesce VM",
-"label.quiet.time.sec":"Quiet Time (in sec)",
-"label.quota.add.credits":"Add Credits",
-"label.quota.balance":"Balance",
-"label.quota.configuration":"Quota Configuration",
-"label.quota.configure":"Configure Quota",
-"label.quota.credit":"Credit",
-"label.quota.credits":"Credits",
-"label.quota.date":"Date",
-"label.quota.dates":"Update Dates",
-"label.quota.description":"Quota Description",
-"label.quota.email.body":"Body",
-"label.quota.email.lastupdated":"Last Update",
-"label.quota.email.subject":"Subject",
-"label.quota.email.template":"Email Template",
-"label.quota.enddate":"End Date",
-"label.quota.endquota":"End Quota",
-"label.quota.enforcequota":"Enforce Quota",
-"label.quota.fullsummary":"All Accounts",
-"label.quota.minbalance":"Min Balance",
-"label.quota.remove":"Remove Quota",
-"label.quota.startdate":"Start Date",
-"label.quota.startquota":"Start Quota",
-"label.quota.state":"State",
-"label.quota.statement":"Statement",
-"label.quota.statement.balance":"Quota Balance",
-"label.quota.statement.bydates":"Statement",
-"label.quota.statement.quota":"Quota Usage",
-"label.quota.statement.tariff":"Quota Tariff",
-"label.quota.summary":"Summary",
-"label.quota.tariff":"Tariff",
-"label.quota.tariff.edit":"Edit Tariff",
-"label.quota.tariff.effectivedate":"Effective Date",
-"label.quota.tariff.value":"Tariff Value",
-"label.quota.total":"Total",
-"label.quota.totalusage":"Total Usage",
-"label.quota.type.name":"Usage Type",
-"label.quota.type.unit":"Usage Unit",
-"label.quota.usage":"Quota Consumption",
-"label.quota.value":"Quota Value",
-"label.rbd":"RBD",
-"label.rbd.id":"Cephx user",
-"label.rbd.monitor":"Ceph monitor",
-"label.rbd.pool":"Ceph pool",
-"label.rbd.secret":"Cephx secret",
-"label.reboot":"Reboot",
-"label.recent.errors":"Recent Errors",
-"label.recover.vm":"Recover VM",
-"label.redundant.router":"Redundant Router",
-"label.redundant.router.capability":"Redundant router capability",
-"label.redundant.state":"Redundant state",
-"label.redundant.vpc":"Redundant VPC",
-"label.refresh":"Refresh",
-"label.refresh.blades":"Refresh Blades",
-"label.region":"Region",
-"label.region.details":"Region details",
-"label.regionlevelvpc":"Region Level VPC",
-"label.reinstall.vm":"Reinstall VM",
-"label.related":"Related",
-"label.release.account":"Release from Account",
-"label.release.account.lowercase":"Release from account",
-"label.release.dedicated.cluster":"Release Dedicated Cluster",
-"label.release.dedicated.host":"Release Dedicated Host",
-"label.release.dedicated.pod":"Release Dedicated Pod",
-"label.release.dedicated.vlan.range":"Release dedicated VLAN range",
-"label.release.dedicated.zone":"Release Dedicated Zone",
-"label.remind.later":"Remind me later",
-"label.remove.ACL":"Remove ACL",
-"label.remove.egress.rule":"Remove egress rule",
-"label.remove.from.load.balancer":"Removing instance from load balancer",
-"label.remove.ingress.rule":"Remove ingress rule",
-"label.remove.ip.range":"Remove IP range",
-"label.remove.ldap":"Remove LDAP",
-"label.remove.management.ip.range":"Remove Management IP Range",
-"label.remove.network.offering":"Remove network offering",
-"label.remove.pf":"Remove port forwarding rule",
-"label.remove.project.account":"Remove account from project",
-"label.remove.region":"Remove Region",
-"label.remove.rule":"Remove rule",
-"label.remove.ssh.key.pair":"Remove SSH Key Pair",
-"label.remove.static.nat.rule":"Remove static NAT rule",
-"label.remove.static.route":"Remove static route",
-"label.remove.this.physical.network":"Remove this physical network",
-"label.remove.tier":"Remove tier",
-"label.remove.vm.from.lb":"Remove VM from load balancer rule",
-"label.remove.vm.load.balancer":"Remove VM from load balancer",
-"label.remove.vmware.datacenter":"Remove VMware datacenter",
-"label.remove.vpc":"Remove VPC",
-"label.remove.vpc.offering":"Remove VPC offering",
-"label.removing":"Removing",
-"label.removing.user":"Removing User",
-"label.reource.id":"Resource ID",
-"label.replace.acl":"Replace ACL",
-"label.replace.acl.list":"Replace ACL List",
-"label.required":"Required",
-"label.requires.upgrade":"Requires Upgrade",
-"label.reserved.ip.range":"Reserved IP Range",
-"label.reserved.system.gateway":"Reserved system gateway",
-"label.reserved.system.ip":"Reserved System IP",
-"label.reserved.system.netmask":"Reserved system netmask",
-"label.reset.VPN.connection":"Reset VPN connection",
-"label.reset.ssh.key.pair":"Reset SSH Key Pair",
-"label.reset.ssh.key.pair.on.vm":"Reset SSH Key Pair on VM",
-"label.resetVM":"Reset VM",
-"label.resize.new.offering.id":"New Offering",
-"label.resize.new.size":"New Size (GB)",
-"label.resize.shrink.ok":"Shrink OK",
-"label.resource":"Resource",
-"label.resource.limit.exceeded":"Resource Limit Exceeded",
-"label.resource.limits":"Resource Limits",
-"label.resource.name":"Resource Name",
-"label.resource.state":"Resource state",
-"label.resources":"Resources",
-"label.response.timeout.in.sec":"Response Timeout (in sec)",
-"label.restart.network":"Restart network",
-"label.restart.required":"Restart required",
-"label.restart.vpc":"Restart VPC",
-"label.restore":"Restore",
-"label.retry.interval":"Retry Interval",
-"label.review":"Review",
-"label.revoke.project.invite":"Revoke invitation",
-"label.role":"Role",
-"label.roles":"Roles",
-"label.roletype":"Role Type",
-"label.root.certificate":"Root certificate",
-"label.root.disk.controller":"Root disk controller",
-"label.root.disk.offering":"Root Disk Offering",
-"label.root.disk.size":"Root disk size (GB)",
-"label.router.vm.scaled.up":"Router VM Scaled Up",
-"label.router.health.checks":"Health Checks",
-"label.router.health.check.name":"Check name",
-"label.router.health.check.type":"Type",
-"label.router.health.check.success":"Success",
-"label.router.health.check.last.updated":"Last updated",
-"label.router.health.check.details":"Details",
-"label.routing":"Routing",
-"label.routing.host":"Routing Host",
-"label.rule":"Rule",
-"label.rule.number":"Rule Number",
-"label.rule.number.short": "#Rule",
-"label.rules":"Rules",
-"label.run.diagnostics.type":"Type",
-"label.run.diagnostics.destination":"Destination",
-"label.run.diagnostics.extra":"Extra Arguments",
-"label.running.vms":"Running VMs",
-"label.s3.access_key":"Access Key",
-"label.s3.bucket":"Bucket",
-"label.s3.connection_timeout":"Connection Timeout",
-"label.s3.endpoint":"Endpoint",
-"label.s3.max_error_retry":"Max Error Retry",
-"label.s3.nfs.path":"S3 NFS Path",
-"label.s3.nfs.server":"S3 NFS Server",
-"label.s3.secret_key":"Secret Key",
-"label.s3.socket_timeout":"Socket Timeout",
-"label.s3.use_https":"Use HTTPS",
-"label.saml.enable":"Authorize SAML SSO",
-"label.saml.entity":"Identity Provider",
-"label.saturday":"Saturday",
-"label.save":"Save",
-"label.save.and.continue":"Save and continue",
-"label.save.changes":"Save changes",
-"label.saving.processing":"Saving....",
-"label.scale.kubernetes.cluster":"Scale Kubernetes cluster",
-"label.scale.up.policy":"SCALE UP POLICY",
-"label.scaledown.policy":"ScaleDown Policy",
-"label.scaleup.policy":"ScaleUp Policy",
-"label.scope":"Scope",
-"label.search":"Search",
-"label.secondary.ips":"Secondary IPs",
-"label.secondary.isolated.vlan.id":"Secondary Isolated VLAN ID",
-"label.secondary.isolated.vlan.type":"Secondary Isolated VLAN Type",
-"label.secondary.isolated.vlan.type.community":"Community",
-"label.secondary.isolated.vlan.type.isolated":"Isolated",
-"label.secondary.isolated.vlan.type.none":"None",
-"label.secondary.isolated.vlan.type.promiscuous":"Promiscuous",
-"label.secondary.staging.store":"Secondary Staging Store",
-"label.secondary.staging.store.details":"Secondary Staging Store details",
-"label.secondary.storage":"Secondary Storage",
-"label.secondary.storage.count":"Secondary Storage Pools",
-"label.secondary.storage.details":"Secondary storage details",
-"label.secondary.storage.limits":"Secondary Storage limits (GiB)",
-"label.secondary.storage.vm":"Secondary storage VM",
-"label.secondary.used":"Secondary Storage Used",
-"label.secret.key":"Secret Key",
-"label.security.group":"Security Group",
-"label.security.group.name":"Security Group Name",
-"label.security.groups":"Security Groups",
-"label.security.groups.enabled":"Security Groups Enabled",
-"label.select":"Select",
-"label.select-view":"Select view",
-"label.select.a.template":"Select a template",
-"label.select.a.zone":"Select a zone",
-"label.select.deployment.infrastructure":"Select deployment infrastructure",
-"label.select.instance":"Select instance",
-"label.select.host":"Select host",
-"label.select.instance.to.attach.volume.to":"Select instance to attach volume to",
-"label.select.iso.or.template":"Select ISO or template",
-"label.select.offering":"Select offering",
-"label.select.project":"Select Project",
-"label.select.region":"Select region",
-"label.select.template":"Select Template",
-"label.select.tier":"Select Tier",
-"label.select.vm.for.static.nat":"Select VM for static NAT",
-"label.semantic.version":"Semantic version",
-"label.sent":"Sent",
-"label.server":"Server",
-"label.service.capabilities":"Service Capabilities",
-"label.service.offering":"Service Offering",
-"label.service.offering.details":"Service offering details",
-"label.service.state":"Service State",
-"label.services":"Services",
-"label.session.expired":"Session Expired",
-"label.set.default.NIC":"Set default NIC",
-"label.set.reservation": "Set reservation",
-"label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-"label.set.up.zone.type":"Set up zone type",
-"label.settings":"Settings",
-"label.setup":"Setup",
-"label.setup.network":"Set up Network",
-"label.setup.zone":"Set up Zone",
-"label.shared":"Shared",
-"label.share.with":"Share With",
-"label.show.advanced.settings":"Show advanced settings",
-"label.show.ingress.rule":"Show Ingress Rule",
-"label.shutdown.provider":"Shutdown provider",
-"label.simplified.chinese.keyboard":"Simplified Chinese keyboard",
-"label.site.to.site.VPN":"Site-to-site VPN",
-"label.size":"Size",
-"label.skip.guide":"I have used CloudStack before, skip this guide",
-"label.smb.domain":"SMB Domain",
-"label.smb.password":"SMB Password",
-"label.smb.username":"SMB Username",
-"label.snapshot":"Snapshot",
-"label.snapshot.limits":"Snapshot Limits",
-"label.snapshot.name":"Snapshot Name",
-"label.snapshot.s":"Snapshots",
-"label.snapshot.schedule":"Set up Recurring Snapshot",
-"label.snapshots":"Snapshots",
-"label.sockets":"CPU Sockets",
-"label.source.ip.address":"Source IP Address",
-"label.source.nat":"Source NAT",
-"label.source.nat.supported":"SourceNAT Supported",
-"label.source.port":"Source Port",
-"label.specify.IP.ranges":"Specify IP ranges",
-"label.specify.vlan":"Specify VLAN",
-"label.specify.vxlan":"Specify VXLAN",
-"label.srx":"SRX",
-"label.srx.details":"SRX details",
-"label.ssh.key.pair":"SSH Key Pair",
-"label.ssh.key.pair.details":"SSH Key Pair Details",
-"label.ssh.key.pairs":"SSH Key Pairs",
-"label.sslcertificates":"SSL Certificates",
-"label.standard.us.keyboard":"Standard (US) keyboard",
-"label.start.IP":"Start IP",
-"label.start.kuberentes.cluster":"Start Kubernetes cluster",
-"label.start.lb.vm":"Start LB VM",
-"label.start.port":"Start Port",
-"label.start.reserved.system.IP":"Start Reserved system IP",
-"label.start.rolling.maintenance":"Start Rolling Maintenance",
-"label.start.rolling.maintenance.force":"Force",
-"label.start.rolling.maintenance.payload":"Payload",
-"label.start.vlan":"Start VLAN",
-"label.start.vxlan":"Start VXLAN",
-"label.state":"State",
-"label.suitability": "Suitability",
-"label.static.nat":"Static NAT",
-"label.static.nat.enabled":"Static NAT Enabled",
-"label.static.nat.to":"Static NAT to",
-"label.static.nat.vm.details":"Static NAT VM Details",
-"label.static.routes":"Static Routes",
-"label.statistics":"Statistics",
-"label.status":"Status",
-"label.step.1":"Step 1",
-"label.step.1.title":"Step 1: <strong>Select a Template</strong>",
-"label.step.2":"Step 2",
-"label.step.2.title":"Step 2: <strong>Service Offering</strong>",
-"label.step.3":"Step 3",
-"label.step.3.title":"Step 3: <strong id=\"step3_label\">Select a Disk Offering</strong>",
-"label.step.4":"Step 4",
-"label.step.4.title":"Step 4: <strong>Network</strong>",
-"label.step.5":"Step 5",
-"label.step.5.title":"Step 5: <strong>Review</strong>",
-"label.stickiness":"Stickiness",
-"label.stickiness.method":"Stickiness method",
-"label.sticky.cookie-name":"Cookie name",
-"label.sticky.domain":"Domain",
-"label.sticky.expire":"Expires",
-"label.sticky.holdtime":"Hold time",
-"label.sticky.indirect":"Indirect",
-"label.sticky.length":"Length",
-"label.sticky.mode":"Mode",
-"label.sticky.name":"Sticky Name",
-"label.sticky.nocache":"No cache",
-"label.sticky.postonly":"Post only",
-"label.sticky.prefix":"Prefix",
-"label.sticky.request-learn":"Request learn",
-"label.sticky.tablesize":"Table size",
-"label.stop":"Stop",
-"label.stop.kuberentes.cluster":"Stop Kubernetes cluster",
-"label.stop.lb.vm":"Stop LB VM",
-"label.stopped.vms":"Stopped VMs",
-"label.storage":"Storage",
-"label.storage.pool":"Storage Pool",
-"label.storage.tags":"Storage Tags",
-"label.storage.traffic":"Storage Traffic",
-"label.storage.type":"Storage Type",
-"label.storagepolicy":"Storage policy",
-"label.subdomain.access":"Subdomain Access",
-"label.submit":"Submit",
-"label.submitted.by":"[Submitted by: <span id=\"submitted_by\"></span>]",
-"label.succeeded":"Succeeded",
-"label.sunday":"Sunday",
-"label.super.cidr.for.guest.networks":"Super CIDR for Guest Networks",
-"label.supported.services":"Supported Services",
-"label.supported.source.NAT.type":"Supported Source NAT type",
-"label.supportsstrechedl2subnet":"Supports Streched L2 Subnet",
-"label.supportspublicaccess":"Supports Public Access",
-"label.suspend.project":"Suspend Project",
-"label.switch.type":"Switch Type",
-"label.system.capacity":"System Capacity",
-"label.system.offering":"System Offering",
-"label.system.offering.for.router":"System Offering for Router",
-"label.system.service.offering":"System Service Offering",
-"label.system.service.offering.details":"System service offering details",
-"label.system.vm":"System VM",
-"label.system.vm.details":"System VM details",
-"label.system.vm.scaled.up":"System VM Scaled Up",
-"label.system.vm.type":"System VM Type",
-"label.system.vms":"System VMs",
-"label.system.wide.capacity":"System-wide capacity",
-"label.tag.key":"Tag Key",
-"label.tag.value":"Tag Value",
-"label.tagged":"Tagged",
-"label.tags":"Tags",
-"label.target.iqn":"Target IQN",
-"label.task.completed":"Task completed",
-"label.template":"Template",
-"label.template.limits":"Template Limits",
-"label.tftp.root.directory":"Tftp root directory",
-"label.theme.default":"Default Theme",
-"label.theme.grey":"Custom - Grey",
-"label.theme.lightblue":"Custom - Light Blue",
-"label.threshold":"Threshold",
-"label.thursday":"Thursday",
-"label.tier":"Tier",
-"label.tier.details":"Tier details",
-"label.time":"Time",
-"label.time.colon":"Time:",
-"label.time.zone":"Timezone",
-"label.timeout":"Timeout",
-"label.timeout.in.second ":" Timeout (seconds)",
-"label.timezone":"Timezone",
-"label.timezone.colon":"Timezone:",
-"label.token":"Token",
-"label.total.CPU":"Total CPU",
-"label.total.cpu":"Total CPU",
-"label.total.hosts":"Total Hosts",
-"label.total.memory":"Total Memory",
-"label.total.of.ip":"Total of IP Addresses",
-"label.total.of.vm":"Total of VMs",
-"label.total.storage":"Total Storage",
-"label.total.virtual.routers":"Total of Virtual Routers",
-"label.total.virtual.routers.upgrade":"Total of Virtual Routers that require upgrade",
-"label.total.vms":"Total VMs",
-"label.traffic.label":"Traffic label",
-"label.traffic.type":"Traffic Type",
-"label.traffic.types":"Traffic Types",
-"label.tuesday":"Tuesday",
-"label.type":"Type",
-"label.type.id":"Type ID",
-"label.type.lower":"type",
-"label.ucs":"UCS",
-"label.uk.keyboard":"UK keyboard",
-"label.unavailable":"Unavailable",
-"label.unhealthy.threshold":"Unhealthy Threshold",
-"label.unlimited":"Unlimited",
-"label.untagged":"Untagged",
-"label.update.kubernetes.version":"Update Kubernetes Version",
-"label.update.project.resources":"Update project resources",
-"label.update.ssl":" SSL Certificate",
-"label.update.ssl.cert":" SSL Certificate",
-"label.update.vmware.datacenter":"Update VMware datacenter",
-"label.updating":"Updating",
-"label.upgrade.kubernetes.cluster":"Upgrade Kubernetes cluster",
-"label.upgrade.required":"Upgrade is required",
-"label.upgrade.router.newer.template":"Upgrade Router to Use Newer Template",
-"label.upload":"Upload",
-"label.upload.from.local":"Upload from Local",
-"label.upload.iso.from.local":"Upload ISO from Local",
-"label.upload.template.from.local":"Upload Template from Local",
-"label.upload.volume":"Upload volume",
-"label.upload.volume.from.local":"Upload Volume from Local",
-"label.upload.volume.from.url":"Upload volume from URL",
-"label.url":"URL",
-"label.usage.interface":"Usage Interface",
-"label.usage.sanity.result":"Usage Sanity Result",
-"label.usage.server":"Usage Server",
-"label.usage.type":"Usage Type",
-"label.usage.unit":"Unit",
-"label.use.vm.ip":"Use VM IP:",
-"label.use.vm.ips":"Use VM IPs",
-"label.used":"Used",
-"label.user":"User",
-"label.user.conflict":"Conflict",
-"label.user.data":"User Data",
-"label.user.details":"User details",
-"label.user.source":"source",
-"label.user.vm":"User VM",
-"label.username":"Username",
-"label.username.lower":"username",
-"label.users":"Users",
-"label.uuid":"UUID",
-"label.versions":"Versions",
-"label.vSwitch.type":"vSwitch Type",
-"label.value":"Value",
-"label.vcdcname":"vCenter DC name",
-"label.vcenter":"vcenter",
-"label.vcenter.cluster":"vCenter Cluster",
-"label.vcenter.datacenter":"vCenter Datacenter",
-"label.vcenter.datastore":"vCenter Datastore",
-"label.vcenter.host":"vCenter Host",
-"label.vcenter.password":"vCenter Password",
-"label.vcenter.username":"vCenter Username",
-"label.vcipaddress":"vCenter IP Address",
-"label.version":"Version",
-"label.vgpu":"VGPU",
-"label.vgpu.max.resolution":"Max resolution",
-"label.vgpu.max.vgpu.per.gpu":"vGPUs per GPU",
-"label.vgpu.remaining.capacity":"Remaining capacity",
-"label.vgpu.type":"vGPU type",
-"label.vgpu.video.ram":"Video RAM",
-"label.view":"View",
-"label.view.all":"View all",
-"label.view.console":"View console",
-"label.view.more":"View more",
-"label.view.secondary.ips":"View secondary IPs",
-"label.viewing":"Viewing",
-"label.virtual.size":"Virtual Size",
-"label.virtual.appliance":"Virtual Appliance",
-"label.virtual.appliance.details":"Virtual applicance details",
-"label.virtual.appliances":"Virtual Appliances",
-"label.virtual.machine":"Virtual Machine",
-"label.virtual.machines":"Virtual Machines",
-"label.virtual.network":"Virtual Network",
-"label.virtual.networking":"Virtual Networking",
-"label.virtual.router":"Virtual Router",
-"label.virtual.routers":"Virtual Routers",
-"label.virtual.routers.group.account":"Virtual Routers group by account",
-"label.virtual.routers.group.cluster":"Virtual Routers group by cluster",
-"label.virtual.routers.group.pod":"Virtual Routers group by pod",
-"label.virtual.routers.group.zone":"Virtual Routers group by zone",
-"label.vlan":"VLAN/VNI",
-"label.vlan.id":"VLAN/VNI ID",
-"label.vlan.only":"VLAN",
-"label.vlan.range":"VLAN/VNI Range",
-"label.vlan.range.details":"VLAN Range details",
-"label.vlan.ranges":"VLAN Range(s)",
-"label.vlan.vni.range":"VLAN/VNI Range",
-"label.vlan.vni.ranges":"VLAN/VNI Range(s)",
-"label.vm.add":"Add Instance",
-"label.vm.destroy":"Destroy",
-"label.vm.display.name":"VM display name",
-"label.vm.id":"VM ID",
-"label.vm.ip":"VM IP Address",
-"label.vm.name":"VM name",
-"label.vm.password":"Password of the VM is",
-"label.vm.reboot":"Reboot",
-"label.vm.start":"Start",
-"label.vm.state":"VM state",
-"label.vm.stop":"Stop",
-"label.vmfs":"VMFS",
-"label.vms":"VMs",
-"label.backup":"Backups",
-"label.backup.offering":"Backup Offering",
-"label.backup.offering.assign":"Assign VM to backup offering",
-"label.backup.offering.remove":"Remove VM from backup offering",
-"label.backup.restore":"Restore VM Backup",
-"label.backup.user.driven":"Allow User Driven Backups",
-"label.vmsnapshot":"VM Snapshots",
-"label.vmsnapshot.current":"isCurrent",
-"label.vmsnapshot.memory":"Snapshot memory",
-"label.vmsnapshot.parentname":"Parent",
-"label.vmsnapshot.type":"Type",
-"label.vmware.datacenter.id":"VMware datacenter ID",
-"label.vmware.datacenter.name":"VMware datacenter Name",
-"label.vmware.datacenter.vcenter":"VMware datacenter vcenter",
-"label.vmware.traffic.label":"VMware traffic label",
-"label.vnet":"VLAN/VNI",
-"label.vnet.id":"VLAN/VNI ID",
-"label.vnmc":"VNMC",
-"label.vnmc.devices":"VNMC Devices",
-"label.volatile":"Volatile",
-"label.volgroup":"Volume Group",
-"label.volume":"Volume",
-"label.volume.details":"Volume details",
-"label.volume.empty":"No data volumes attached to this VM",
-"label.volume.ids":"Volume ID's",
-"label.volume.limits":"Volume Limits",
-"label.volume.migrated":"Volume migrated",
-"label.volume.name":"Volume Name",
-"label.volumes":"Volumes",
-"label.vpc":"VPC",
-"label.vpc.distributedvpcrouter":"Distributed VPC Router",
-"label.vpc.id":"VPC ID",
-"label.vpc.offering":"VPC Offering",
-"label.vpc.offering.access":"VPC offering access",
-"label.vpc.offering.details":"VPC offering details",
-"label.vpc.router.details":"VPC Router Details",
-"label.vpc.supportsregionlevelvpc":"Supports Region Level VPC",
-"label.vpc.virtual.router":"VPC Virtual Router",
-"label.vpn":"VPN",
-"label.vpn.customer.gateway":"VPN Customer Gateway",
-"label.vpn.force.encapsulation":"Force UDP Encapsulation of ESP Packets",
-"label.vpn.users":"VPN Users",
-"label.vsmctrlvlanid":"Control VLAN ID",
-"label.vsmpktvlanid":"Packet VLAN ID",
-"label.vsmstoragevlanid":"Storage VLAN ID",
-"label.vsphere.managed":"vSphere Managed",
-"label.vswitch.name":"vSwitch Name",
-"label.vxlan":"VXLAN",
-"label.vxlan.id":"VXLAN ID",
-"label.vxlan.range":"VXLAN Range",
-"label.waiting":"Waiting",
-"label.warn":"Warn",
-"label.warn.upper":"WARN",
-"label.warning":"Warning",
-"label.wednesday":"Wednesday",
-"label.weekly":"Weekly",
-"label.welcome":"Welcome",
-"label.welcome.cloud.console":"Welcome to Management Console",
-"label.what.is.cloudstack":"What is CloudStack&#8482?",
-"label.xenserver.tools.version.61.plus":"Original XS Version is 6.1+",
-"label.xenserver.traffic.label":"XenServer traffic label",
-"label.yes":"Yes",
-"label.zone":"Zone",
-"label.zone.dedicated":"Zone Dedicated",
-"label.zone.details":"Zone details",
-"label.zone.id":"Zone ID",
-"label.zone.lower":"zone",
-"label.zone.name":"Zone Name",
-"label.zone.step.1.title":"Step 1: <strong>Select a Network</strong>",
-"label.zone.step.2.title":"Step 2: <strong>Add a Zone</strong>",
-"label.zone.step.3.title":"Step 3: <strong>Add a Pod</strong>",
-"label.zone.step.4.title":"Step 4: <strong>Add an IP range</strong>",
-"label.zone.type":"Zone Type",
-"label.zone.wide":"Zone-Wide",
-"label.zoneWizard.trafficType.guest":"Guest: Traffic between end-user virtual machines",
-"label.zoneWizard.trafficType.management":"Management: Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs",
-"label.zoneWizard.trafficType.public":"Public: Traffic between the internet and virtual machines in the cloud.",
-"label.zoneWizard.trafficType.storage":"Storage: Traffic between primary and secondary storage servers, such as VM templates and snapshots",
-"label.zones":"Zones",
-"managed.state":"Managed State",
-"message.XSTools61plus.update.failed":"Failed to update Original XS Version is 6.1+ field. Error:",
-"message.Zone.creation.complete":"Zone creation complete",
-"message.acquire.ip.nic":"Please confirm that you would like to acquire a new secondary IP for this NIC.<br/>NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine.",
-"message.acquire.new.ip":"Please confirm that you would like to acquire a new IP for this network.",
-"message.acquire.new.ip.vpc":"Please confirm that you would like to acquire a new IP for this VPC.",
-"message.acquire.public.ip":"Please select a zone from which you want to acquire your new IP from.",
-"message.action.cancel.maintenance":"Your host has been successfully canceled for maintenance. This process can take up to several minutes.",
-"message.action.cancel.maintenance.mode":"Please confirm that you want to cancel this maintenance.",
-"message.action.change.service.warning.for.instance":"Your instance must be stopped before attempting to change its current service offering.",
-"message.action.change.service.warning.for.router":"Your router must be stopped before attempting to change its current service offering.",
-"message.action.delete.backup.offering":"Please confirm that you want to delete this backup offering?",
-"message.action.delete.ISO":"Please confirm that you want to delete this ISO.",
-"message.action.delete.ISO.for.all.zones":"The ISO is used by all zones. Please confirm that you want to delete it from all zones.",
-"message.action.delete.cluster":"Please confirm that you want to delete this cluster.",
-"message.action.delete.disk.offering":"Please confirm that you want to delete this disk offering.",
-"message.action.delete.domain":"Please confirm that you want to delete this domain.",
-"message.action.delete.external.firewall":"Please confirm that you would like to remove this external firewall. Warning: If you are planning to add back the same external firewall, you must reset usage data on the device.",
-"message.action.delete.external.load.balancer":"Please confirm that you would like to remove this external load balancer. Warning: If you are planning to add back the same external load balancer, you must reset usage data on the device.",
-"message.action.delete.ingress.rule":"Please confirm that you want to delete this ingress rule.",
-"message.action.delete.network":"Please confirm that you want to delete this network.",
-"message.action.delete.nexusVswitch":"Please confirm that you want to delete this nexus 1000v",
-"message.action.delete.nic":"Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
-"message.action.delete.physical.network":"Please confirm that you want to delete this physical network",
-"message.action.delete.pod":"Please confirm that you want to delete this pod.",
-"message.action.delete.primary.storage":"Please confirm that you want to delete this primary storage.",
-"message.action.delete.secondary.storage":"Please confirm that you want to delete this secondary storage.",
-"message.action.delete.security.group":"Please confirm that you want to delete this security group.",
-"message.action.delete.service.offering":"Please confirm that you want to delete this service offering.",
-"message.action.delete.snapshot":"Please confirm that you want to delete this snapshot.",
-"message.action.delete.system.service.offering":"Please confirm that you want to delete this system service offering.",
-"message.action.delete.template":"Please confirm that you want to delete this template.",
-"message.action.delete.template.for.all.zones":"The template is used by all zones. Please confirm that you want to delete it from all zones.",
-"message.action.delete.volume":"Please confirm that you want to delete this volume.",
-"message.action.delete.vpn.user":"Please confirm that you want to delete the VPN user.",
-"message.action.delete.zone":"Please confirm that you want to delete this zone.",
-"message.action.destroy.instance":"Please confirm that you want to destroy this instance.",
-"message.action.destroy.systemvm":"Please confirm that you want to destroy this System VM.",
-"message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-"message.action.disable.cluster":"Please confirm that you want to disable this cluster.",
-"message.action.disable.nexusVswitch":"Please confirm that you want to disable this nexus 1000v",
-"message.action.disable.physical.network":"Please confirm that you want to disable this physical network.",
-"message.action.disable.pod":"Please confirm that you want to disable this pod.",
-"message.action.disable.static.NAT":"Please confirm that you want to disable static NAT.",
-"message.action.disable.zone":"Please confirm that you want to disable this zone.",
-"message.action.download.iso":"Please confirm that you want to download this ISO.",
-"message.action.download.template":"Please confirm that you want to download this template.",
-"message.action.downloading.template":"Downloading template.",
-"message.action.enable.cluster":"Please confirm that you want to enable this cluster.",
-"message.action.enable.maintenance":"Your host has been successfully prepared for maintenance.  This process can take up to several minutes or longer depending on how many VMs are currently on this host.",
-"message.action.enable.nexusVswitch":"Please confirm that you want to enable this nexus 1000v",
-"message.action.enable.physical.network":"Please confirm that you want to enable this physical network.",
-"message.action.enable.pod":"Please confirm that you want to enable this pod.",
-"message.action.enable.zone":"Please confirm that you want to enable this zone.",
-"message.action.expunge.instance":"Please confirm that you want to expunge this instance.",
-"message.action.force.reconnect":"Your host has been successfully forced to reconnect.  This process can take up to several minutes.",
-"message.action.host.enable.maintenance.mode":"Enabling maintenance mode will cause a live migration of all running instances on this host to any available host.",
-"message.action.instance.reset.password":"Please confirm that you want to change the ROOT password for this virtual machine.",
-"message.action.manage.cluster":"Please confirm that you want to manage the cluster.",
-"message.action.primarystorage.enable.maintenance.mode":"Warning: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped.  Do you want to continue?",
-"message.action.reboot.instance":"Please confirm that you want to reboot this instance.",
-"message.action.reboot.router":"All services provided by this virtual router will be interrupted. Please confirm that you want to reboot this router.",
-"message.action.reboot.systemvm":"Please confirm that you want to reboot this system VM.",
-"message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-"message.action.release.ip":"Please confirm that you want to release this IP.",
-"message.action.remove.host":"Please confirm that you want to remove this host.",
-"message.action.reset.password.off":"Your instance currently does not support this feature.",
-"message.action.reset.password.warning":"Your instance must be stopped before attempting to change its current password.",
-"message.action.restore.instance":"Please confirm that you want to restore this instance.",
-"message.action.revert.snapshot":"Please confirm that you want to revert the owning volume to this snapshot.",
-"message.action.secure.host":"This will restart the host agent and libvirtd process after applying new X509 certificates, please confirm?",
-"message.action.settings.warning.vm.running":"Please stop the virtual machine to access settings",
-"message.action.settings.warning.vm.started":"Virtual machine has been started. It needs to be stopped to access settings",
-"message.action.start.instance":"Please confirm that you want to start this instance.",
-"message.action.start.router":"Please confirm that you want to start this router.",
-"message.action.start.systemvm":"Please confirm that you want to start this system VM.",
-"message.action.stop.instance":"Please confirm that you want to stop this instance.",
-"message.action.stop.router":"All services provided by this virtual router will be interrupted. Please confirm that you want to stop this router.",
-"message.action.router.health.checks":"Health checks result will be fetched from router.",
-"message.action.stop.systemvm":"Please confirm that you want to stop this system VM.",
-"message.action.take.snapshot":"Please confirm that you want to take a snapshot of this volume.<br>Note that if this volume is in use by an instance running on KVM, the instance will be paused prior to, and resumed after creation of the snapshot",
-"message.action.snapshot.fromsnapshot":"Please confirm that you want to take a snapshot of this VM snapshot.",
-"message.action.unmanage.cluster":"Please confirm that you want to unmanage the cluster.",
-"message.action.vmsnapshot.create":"Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-"message.action.vmsnapshot.delete":"Please confirm that you want to delete this VM snapshot. <br>Please notice that the instance will be paused before the snapshot deletion, and resumed after deletion, if it runs on KVM.",
-"message.action.vmsnapshot.revert":"Revert VM snapshot",
-"message.action.vmstoragesnapshot.create":"Please choose a volume that you want to take a snapshot of.",
-"message.activate.project":"Are you sure you want to activate this project?",
-"message.add.VPN.gateway":"Please confirm that you want to add a VPN Gateway",
-"message.add.cluster":"Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-"message.add.cluster.zone":"Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>",
-"message.add.disk.offering":"Please specify the following parameters to add a new disk offering",
-"message.add.domain":"Please specify the subdomain you want to create under this domain",
-"message.add.firewall":"Add a firewall to zone",
-"message.add.guest.network":"Please confirm that you would like to add a guest network",
-"message.add.host":"Please specify the following parameters to add a new host",
-"message.add.ip.range":"Add an IP range to public network in zone",
-"message.add.ip.range.direct.network":"Add an IP range to direct network <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-"message.add.ip.range.to.pod":"<p>Add an IP range to pod: <b><span id=\"pod_name_label\"></span></b></p>",
-"message.add.load.balancer":"Add a load balancer to zone",
-"message.add.load.balancer.under.ip":"The load balancer rule has been added under IP:",
-"message.add.network":"Add a new network for zone: <b><span id=\"zone_name\"></span></b>",
-"message.add.new.gateway.to.vpc":"Please specify the information to add a new gateway to this VPC.",
-"message.add.pod":"Add a new pod for zone <b><span id=\"add_pod_zone_name\"></span></b>",
-"message.add.pod.during.zone.creation":"Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack's internal management traffic. The reserved IP range must be unique for each zone in the cloud.",
-"message.add.primary":"Please specify the following parameters to add a new primary storage",
-"message.add.primary.storage":"Add a new Primary Storage for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-"message.add.region":"Please specify the required information to add a new region.",
-"message.add.secondary.storage":"Add a new storage for zone <b><span id=\"zone_name\"></span></b>",
-"message.add.service.offering":"Please fill in the following data to add a new compute offering.",
-"message.add.system.service.offering":"Please fill in the following data to add a new system service offering.",
-"message.add.template":"Please enter the following data to create your new template",
-"message.add.volume":"Please fill in the following data to add a new volume.",
-"message.added.vpc.offering":"Added VPC offering",
-"message.adding.Netscaler.device":"Adding Netscaler device",
-"message.adding.Netscaler.provider":"Adding Netscaler provider",
-"message.adding.host":"Adding host",
-"message.additional.networks.desc":"Please select additional network(s) that your virtual instance will be connected to.",
-"message.admin.guide.read":"For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?,",
-"message.advanced.mode.desc":"Choose this network model if you wish to enable VLAN support.  This network model provides the most flexibility in allowing administrators to provide custom network offerings such as providing firewall, vpn, or load balancer support as well as enabling direct vs virtual networking.",
-"message.advanced.security.group":"Choose this if you wish to use security groups to provide guest VM isolation.",
-"message.advanced.virtual":"Choose this if you wish to use zone-wide VLANs to provide guest VM isolation.",
-"message.after.enable.s3":"S3-backed Secondary Storage configured. Note: When you leave this page, you will not be able to re-configure S3 again.",
-"message.after.enable.swift":"Swift configured. Note: When you leave this page, you will not be able to re-configure Swift again.",
-"message.alert.state.detected":"Alert state detected",
-"message.allow.vpn.access":"Please enter a username and password of the user that you want to allow VPN access.",
-"message.apply.snapshot.policy":"You have successfully updated your current snapshot policy.",
-"message.assign.instance.another":"Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-"message.attach.iso.confirm":"Please confirm that you want to attach the ISO to this virtual instance.",
-"message.attach.volume":"Please fill in the following data to attach a new volume. If you are attaching a disk volume to a Windows based virtual machine, you will need to reboot the instance to see the attached disk.",
-"message.basic.mode.desc":"Choose this network model if you do <b>*<u>not</u>*</b> want to enable any VLAN support.  All virtual instances created under this network model will be assigned an IP directly from the network and security groups are used to provide security and segregation.",
-"message.change.ipaddress":"Please confirm that you would like to change the IP address for this NIC on VM.",
-"message.change.offering.confirm":"Please confirm that you wish to change the service offering of this virtual instance.",
-"message.change.password":"Please change your password.",
-"message.cluster.dedicated":"Cluster Dedicated",
-"message.cluster.dedication.released":"Cluster dedication released",
-"message.configure.all.traffic.types":"You have multiple physical networks; please configure labels for each traffic type by clicking on the Edit button.",
-"message.configure.firewall.rules.allow.traffic":"Configure the rules to allow Traffic",
-"message.configure.firewall.rules.block.traffic":"Configure the rules to block Traffic",
-"message.configure.ldap":"Please confirm you would like to configure LDAP.",
-"message.configuring.guest.traffic":"Configuring guest traffic",
-"message.configuring.physical.networks":"Configuring physical networks",
-"message.configuring.public.traffic":"Configuring public traffic",
-"message.configuring.storage.traffic":"Configuring storage traffic",
-"message.confirm.action.force.reconnect":"Please confirm that you want to force reconnect this host.",
-"message.confirm.add.vnmc.provider":"Please confirm you would like to add the VNMC provider.",
-"message.confirm.archive.alert":"Please confirm that you want to archive this alert.",
-"message.confirm.archive.event":"Please confirm that you want to archive this event.",
-"message.confirm.archive.selected.alerts":"Please confirm you would like to archive the selected alerts",
-"message.confirm.archive.selected.events":"Please confirm you would like to archive the selected events",
-"message.confirm.attach.disk":"Are you sure you want to attach disk?",
-"message.confirm.create.volume":"Are you sure you want to create volume?",
-"message.confirm.current.guest.CIDR.unchanged":"Do you want to keep the current guest network CIDR unchanged?",
-"message.confirm.dedicate.cluster.domain.account":"Do you really want to dedicate this cluster to a domain/account? ",
-"message.confirm.dedicate.host.domain.account":"Do you really want to dedicate this host to a domain/account? ",
-"message.confirm.dedicate.pod.domain.account":"Do you really want to dedicate this pod to a domain/account? ",
-"message.confirm.dedicate.zone":"Do you really want to dedicate this zone to a domain/account?",
-"message.confirm.delete.BigSwitchBcf":"Please confirm that you would like to delete this BigSwitch BCF Controller",
-"message.confirm.delete.BrocadeVcs":"Please confirm that you would like to delete Brocade Vcs Switch",
-"message.confirm.delete.F5":"Please confirm that you would like to delete F5",
-"message.confirm.delete.NetScaler":"Please confirm that you would like to delete NetScaler",
-"message.confirm.delete.PA":"Please confirm that you would like to delete Palo Alto",
-"message.confirm.delete.SRX":"Please confirm that you would like to delete SRX",
-"message.confirm.delete.acl.list":"Are you sure you want to delete this ACL list?",
-"message.confirm.delete.alert":"Are you sure you want to delete this alert ?",
-"message.confirm.delete.baremetal.rack.configuration":"Please confirm that you want to delete Baremetal Rack Configuration.",
-"message.confirm.delete.ciscoASA1000v":"Please confirm you want to delete CiscoASA1000v",
-"message.confirm.delete.ciscovnmc.resource":"Please confirm you want to delete CiscoVNMC resource",
-"message.confirm.delete.internal.lb":"Please confirm you want to delete Internal LB",
-"message.confirm.delete.kubernetes.version":"Please confirm that you want to delete this Kubernetes version.",
-"message.confirm.delete.secondary.staging.store":"Please confirm you want to delete Secondary Staging Store.",
-"message.confirm.delete.ucs.manager":"Please confirm that you want to delete UCS Manager",
-"message.confirm.destroy.kubernetes.cluster":"Please confirm that you want to destroy this Kubernetes cluster.",
-"message.confirm.destroy.router":"Please confirm that you would like to destroy this router",
-"message.confirm.disable.host":"Please confirm that you want to disable the host",
-"message.confirm.disable.network.offering":"Are you sure you want to disable this network offering?",
-"message.confirm.disable.provider":"Please confirm that you would like to disable this provider",
-"message.confirm.disable.vnmc.provider":"Please confirm you would like to disable the VNMC provider.",
-"message.confirm.disable.vpc.offering":"Are you sure you want to disable this VPC offering?",
-"message.confirm.enable.host":"Please confirm that you want to enable the host",
-"message.confirm.enable.network.offering":"Are you sure you want to enable this network offering?",
-"message.confirm.enable.provider":"Please confirm that you would like to enable this provider",
-"message.confirm.enable.vnmc.provider":"Please confirm you would like to enable the VNMC provider.",
-"message.confirm.enable.vpc.offering":"Are you sure you want to enable this VPC offering?",
-"message.confirm.force.update":"Do you want to make a force update?",
-"message.confirm.join.project":"Please confirm you wish to join this project.",
-"message.confirm.migrate.volume":"Do you want to migrate this volume?",
-"message.confirm.refresh.blades":"Please confirm that you want to refresh blades.",
-"message.confirm.release.dedicate.vlan.range":"Please confirm you want to release dedicated VLAN range",
-"message.confirm.release.dedicated.cluster":"Do you want to release this dedicated cluster ?",
-"message.confirm.release.dedicated.host":"Do you want to release this dedicated host ?",
-"message.confirm.release.dedicated.pod":"Do you want to release this dedicated pod ?",
-"message.confirm.release.dedicated.zone":"Do you want to release this dedicated zone ? ",
-"message.confirm.remove.IP.range":"Please confirm that you would like to remove this IP range.",
-"message.confirm.remove.event":"Are you sure you want to remove this event?",
-"message.confirm.remove.load.balancer":"Please confirm you want to remove VM from load balancer",
-"message.confirm.remove.network.offering":"Are you sure you want to remove this network offering?",
-"message.confirm.remove.selected.alerts":"Please confirm you would like to remove the selected alerts",
-"message.confirm.remove.selected.events":"Please confirm you would like to remove the selected events",
-"message.confirm.remove.vmware.datacenter":"Please confirm you want to remove VMware datacenter",
-"message.confirm.remove.vpc.offering":"Are you sure you want to remove this VPC offering?",
-"message.confirm.replace.acl.new.one":"Do you want to replace the ACL with a new one?",
-"message.confirm.scale.up.router.vm":"Do you really want to scale up the Router VM ?",
-"message.confirm.scale.up.system.vm":"Do you really want to scale up the system VM ?",
-"message.confirm.shutdown.provider":"Please confirm that you would like to shutdown this provider",
-"message.confirm.start.kubernetes.cluster":"Please confirm that you want to start this Kubernetes cluster.",
-"message.confirm.start.lb.vm":"Please confirm you want to start LB VM",
-"message.confirm.stop.kubernetes.cluster":"Please confirm that you want to stop this Kubernetes cluster.",
-"message.confirm.stop.lb.vm":"Please confirm you want to stop LB VM",
-"message.confirm.upgrade.router.newer.template":"Please confirm that you want to upgrade router to use newer template",
-"message.confirm.upgrade.routers.account.newtemplate":"Please confirm that you want to upgrade all routers in this account to use newer template",
-"message.confirm.upgrade.routers.cluster.newtemplate":"Please confirm that you want to upgrade all routers in this cluster to use newer template",
-"message.confirm.upgrade.routers.newtemplate":"Please confirm that you want to upgrade all routers in this zone to use newer template",
-"message.confirm.upgrade.routers.pod.newtemplate":"Please confirm that you want to upgrade all routers in this pod to use newer template",
-"message.copy.iso.confirm":"Please confirm that you wish to copy your ISO to",
-"message.copy.template":"Copy template <b id=\"copy_template_name_text\">XXX</b> from zone <b id=\"copy_template_source_zone_text\"></b> to",
-"message.copy.template.confirm":"Are you sure you want to copy template?",
-"message.create.template":"Are you sure you want to create template?",
-"message.create.template.vm":"Create VM from template <b id=\"p_name\"></b>",
-"message.create.template.volume":"Please specify the following information before creating a template of your disk volume: <b><span id=\"volume_name\"></span></b>. Creation of the template can range from several minutes to longer depending on the size of the volume.",
-"message.creating.cluster":"Creating cluster",
-"message.creating.guest.network":"Creating guest network",
-"message.creating.physical.networks":"Creating physical networks",
-"message.creating.pod":"Creating pod",
-"message.creating.primary.storage":"Creating primary storage",
-"message.creating.secondary.storage":"Creating secondary storage",
-"message.creating.systemVM":"Creating system VMs (this may take a while)",
-"message.creating.zone":"Creating zone",
-"message.decline.invitation":"Are you sure you want to decline this project invitation?",
-"message.dedicate.zone":"Dedicating zone",
-"message.dedicated.zone.released":"Zone dedication released",
-"message.delete.VPN.connection":"Please confirm that you want to delete VPN connection",
-"message.delete.VPN.customer.gateway":"Please confirm that you want to delete this VPN Customer Gateway",
-"message.delete.VPN.gateway":"Please confirm that you want to delete this VPN Gateway",
-"message.delete.account":"Please confirm that you want to delete this account.",
-"message.delete.affinity.group":"Please confirm that you would like to remove this affinity group.",
-"message.delete.gateway":"Please confirm you want to delete the gateway",
-"message.delete.project":"Are you sure you want to delete this project?",
-"message.delete.sslcertificate":"Please confirm that you would like to delete this certificate.",
-"message.delete.user":"Please confirm that you would like to delete this user.",
-"message.desc.add.new.lb.sticky.rule":"Add new LB sticky rule",
-"message.desc.advanced.zone":"For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support.",
-"message.desc.basic.zone":"Provide a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering).",
-"message.desc.cluster":"Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.",
-"message.desc.create.ssh.key.pair":"Please fill in the following data to create or register a ssh key pair.<br><br>(1) If public key is set, CloudStack will register the public key. You can use it through your private key.<br><br>(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.<br>",
-"message.desc.created.ssh.key.pair":"Created a SSH Key Pair.",
-"message.desc.host":"Each cluster must contain at least one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.<br/><br/>Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.",
-"message.desc.primary.storage":"Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor.",
-"message.desc.reset.ssh.key.pair":"Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled.",
-"message.desc.secondary.storage":"Each zone must have at least one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.<br/><br/>Provide the IP address and exported path.",
-"message.desc.zone":"A zone is the largest organizational unit in CloudStack, and it typically corresponds to a single datacenter. Zones provide physical isolation and redundancy. A zone consists of one or more pods (each of which contains hosts and primary storage servers) and a secondary storage server which is shared by all pods in the zone.",
-"message.detach.disk":"Are you sure you want to detach this disk?",
-"message.detach.iso.confirm":"Please confirm that you want to detach the ISO from this virtual instance.",
-"message.diagnostics.exitcode":"exitcode: var",
-"message.diagnostics.stderr":"stderr: var",
-"message.diagnostics.stdout":"stdout: var",
-"message.disable.account":"Please confirm that you want to disable this account.  By disabling the account, all users for this account will no longer have access to their cloud resources.  All running virtual machines will be immediately shut down.",
-"message.disable.snapshot.policy":"You have successfully disabled your current snapshot policy.",
-"message.disable.user":"Please confirm that you would like to disable this user.",
-"message.disable.vpn":"Are you sure you want to disable VPN?",
-"message.disable.vpn.access":"Please confirm that you want to disable Remote Access VPN.",
-"message.disabling.network.offering":"Disabling network offering",
-"message.disabling.vpc.offering":"Disabling VPC offering",
-"message.disallowed.characters":"Disallowed characters: <,>",
-"message.download.diagnostics":"Please click the link to download the retrieved diagnostics:<p><a href=\"#\">00000</a>",
-"message.download.ISO":"Please click the link to download the ISO:<p><a href=\"#\">00000</a>",
-"message.download.template":"Please click the link to download the template:<p><a href=\"#\">00000</a>",
-"message.download.volume":"Please click the link to download the volume:<p><a href=\"#\">00000</a>",
-"message.download.volume.confirm":"Please confirm that you want to download this volume.",
-"message.edit.account":"Edit (\"-1\" indicates no limit to the amount of resources create)",
-"message.edit.confirm":"Please confirm your changes before clicking \"Save\".",
-"message.edit.limits":"Please specify limits to the following resources.  A \"-1\" indicates no limit to the amount of resources create.",
-"message.edit.traffic.type":"Please specify the traffic label you want associated with this traffic type.",
-"message.enable.account":"Please confirm that you want to enable this account.",
-"message.enable.user":"Please confirm that you would like to enable this user.",
-"message.enable.vpn":"Please confirm that you want Remote Access VPN enabled for this IP address.",
-"message.enable.vpn.access":"VPN is currently disabled for this IP Address.  Would you like to enable VPN access?",
-"message.enabled.vpn":"Your Remote Access VPN is currently enabled and can be accessed via the IP",
-"message.enabled.vpn.ip.sec":"Your IPSec pre-shared key is",
-"message.enabled.vpn.note":"Note: VPN users are now accessed by changing views at the networks tab.",
-"message.enabling.network.offering":"Enabling network offering",
-"message.enabling.security.group.provider":"Enabling Security Group provider",
-"message.enabling.vpc.offering":"Enabling VPC offering",
-"message.enabling.zone":"Enabling zone",
-"message.enabling.zone.dots":"Enabling zone...",
-"message.enter.seperated.list.multiple.cidrs":"Please enter a comma separated list of CIDRs if more than one",
-"message.enter.token":"Please enter the token that you were given in your invite e-mail.",
-"message.generate.keys":"Please confirm that you would like to generate new keys for this user.",
-"message.gslb.delete.confirm":"Please confirm you want to delete this GSLB",
-"message.gslb.lb.remove.confirm":"Please confirm you want to remove load balancing from GSLB",
-"message.guest.traffic.in.advanced.zone":"Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network.",
-"message.guest.traffic.in.basic.zone":"Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range.",
-"message.host.dedicated":"Host Dedicated",
-"message.host.dedication.released":"Host dedication released",
-"message.installWizard.click.retry":"Click the button to retry launch.",
-"message.installWizard.copy.whatIsACluster":"A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Virtual machine instances (VMs) can be live-migrated from one host to another within the same cluster, without interrupting service to the user. A cluster is the third-largest organizational unit within a CloudStack&#8482; deployment. Clusters are contained within pods, and pods are contained within zones.<br/><br/>CloudStack&#8482; allows multiple clusters in a cloud deployment, but for a Basic Installation, we only need one cluster.",
-"message.installWizard.copy.whatIsAHost":"A host is a single computer. Hosts provide the computing resources that run the guest virtual machines. Each host has hypervisor software installed on it to manage the guest VMs (except for bare metal hosts, which are a special case discussed in the Advanced Installation Guide). For example, a Linux KVM-enabled server, a Citrix XenServer server, and an ESXi server are hosts. In a Basic Installation, we use a single host running XenServer or KVM.<br/><br/>The host is the smallest organizational unit within a CloudStack&#8482; deployment. Hosts are contained within clusters, clusters are contained within pods, and pods are contained within zones.",
-"message.installWizard.copy.whatIsAPod":"A pod often represents a single rack. Hosts in the same pod are in the same subnet.<br/><br/>A pod is the second-largest organizational unit within a CloudStack&#8482; deployment. Pods are contained within zones. Each zone can contain one or more pods; in the Basic Installation, you will have just one pod in your zone.",
-"message.installWizard.copy.whatIsAZone":"A zone is the largest organizational unit within a CloudStack&#8482; deployment. A zone typically corresponds to a single datacenter, although it is permissible to have multiple zones in a datacenter. The benefit of organizing infrastructure into zones is to provide physical isolation and redundancy. For example, each zone can have its own power supply and network uplink, and the zones can be widely separated geographically (though this is not required).",
-"message.installWizard.copy.whatIsCloudStack":"CloudStack&#8482 is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack&#8482 manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack&#8482 to deploy, manage, and configure cloud computing environments.<br/><br/>Extending beyond individual virtual machine images running on commodity hardware, CloudStack&#8482 provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications. Both open-source and Premium versions are available, with the open-source version offering nearly identical features.",
-"message.installWizard.copy.whatIsPrimaryStorage":"A CloudStack&#8482; cloud infrastructure makes use of two types of storage: primary storage and secondary storage. Both of these can be iSCSI or NFS servers, or localdisk.<br/><br/><strong>Primary storage</strong> is associated with a cluster, and it stores the disk volumes of each guest VM for all the VMs running on hosts in that cluster. The primary storage server is typically located close to the hosts.",
-"message.installWizard.copy.whatIsSecondaryStorage":"Secondary storage is associated with a zone, and it stores the following:<ul><li>Templates - OS images that can be used to boot VMs and can include additional configuration information, such as installed applications</li><li>ISO images - OS images that can be bootable or non-bootable</li><li>Disk volume snapshots - saved copies of VM data which can be used for data recovery or to create new templates</ul>",
-"message.installWizard.now.building":"Now building your cloud...",
-"message.installWizard.tooltip.addCluster.name":"A name for the cluster.  This can be text of your choosing and is not used by CloudStack.",
-"message.installWizard.tooltip.addHost.hostname":"The DNS name or IP address of the host.",
-"message.installWizard.tooltip.addHost.password":"This is the password for the user named above (from your XenServer install).",
-"message.installWizard.tooltip.addHost.username":"Usually root.",
-"message.installWizard.tooltip.addPod.name":"A name for the pod",
-"message.installWizard.tooltip.addPod.reservedSystemEndIp":"This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-"message.installWizard.tooltip.addPod.reservedSystemGateway":"The gateway for the hosts in that pod.",
-"message.installWizard.tooltip.addPod.reservedSystemNetmask":"The netmask in use on the subnet the guests will use.",
-"message.installWizard.tooltip.addPod.reservedSystemStartIp":"This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-"message.installWizard.tooltip.addPrimaryStorage.name":"The name for the storage device.",
-"message.installWizard.tooltip.addPrimaryStorage.path":"(for NFS) In NFS this is the exported path from the server. Path (for SharedMountPoint).  With KVM this is the path on each host that is where this primary storage is mounted.  For example, \"/mnt/primary\".",
-"message.installWizard.tooltip.addPrimaryStorage.server":"(for NFS, iSCSI, or PreSetup) The IP address or DNS name of the storage device.",
-"message.installWizard.tooltip.addSecondaryStorage.nfsServer":"The IP address of the NFS server hosting the secondary storage",
-"message.installWizard.tooltip.addSecondaryStorage.path":"The exported path, located on the server you specified above",
-"message.installWizard.tooltip.addZone.dns1":"These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-"message.installWizard.tooltip.addZone.dns2":"These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-"message.installWizard.tooltip.addZone.internaldns1":"These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-"message.installWizard.tooltip.addZone.internaldns2":"These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-"message.installWizard.tooltip.addZone.name":"A name for the zone",
-"message.installWizard.tooltip.configureGuestTraffic.description":"A description for your network",
-"message.installWizard.tooltip.configureGuestTraffic.guestEndIp":"The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-"message.installWizard.tooltip.configureGuestTraffic.guestGateway":"The gateway that the guests should use",
-"message.installWizard.tooltip.configureGuestTraffic.guestNetmask":"The netmask in use on the subnet that the guests should use",
-"message.installWizard.tooltip.configureGuestTraffic.guestStartIp":"The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-"message.installWizard.tooltip.configureGuestTraffic.name":"A name for your network",
-"message.instance.scaled.up.confirm":"Do you really want to scale Up your instance ?",
-"message.instanceWizard.noTemplates":"You do not have any templates available; please add a compatible template, and re-launch the instance wizard.",
-"message.ip.address.changed":"Your IP addresses may have changed; would you like to refresh the listing? Note that in this case the details pane will close.",
-"message.iso.desc":"Disc image containing data or bootable media for OS",
-"message.join.project":"You have now joined a project. Please switch to Project view to see the project.",
-"message.launch.vm.on.private.network":"Do you wish to launch your instance on your own private dedicated network?",
-"message.launch.zone":"Zone is ready to launch; please proceed to the next step.",
-"message.ldap.group.import":"All The users from the given group name will be imported",
-"message.link.domain.to.ldap":"Enable autosync for this domain in LDAP",
-"message.listView.subselect.multi":"(Ctrl/Cmd-click)",
-"message.lock.account":"Please confirm that you want to lock this account.  By locking the account, all users for this account will no longer be able to manage their cloud resources.  Existing resources can still be accessed.",
-"message.migrate.instance.confirm":"Please confirm the host you wish to migrate the virtual instance to.",
-"message.migrate.instance.to.host":"Please confirm that you want to migrate instance to another host.",
-"message.migrate.instance.select.host":"Please select a host for migration",
-"message.migrate.instance.to.ps":"Please confirm that you want to migrate instance to another primary storage.",
-"message.migrate.router.confirm":"Please confirm the host you wish to migrate the router to:",
-"message.migrate.systemvm.confirm":"Please confirm the host you wish to migrate the system VM to:",
-"message.migrate.volume":"Please confirm that you want to migrate volume to another primary storage.",
-"message.ncc.delete.confirm":"Please confirm you want to delete this NCC",
-"message.network.addVM.desc":"Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-"message.network.addVMNIC":"Please confirm that you would like to add a new VM NIC for this network.",
-"message.network.remote.access.vpn.configuration":"Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-"message.new.user":"Specify the following to add a new user to the account",
-"message.no.affinity.groups":"You do not have any affinity groups. Please continue to the next step.",
-"message.no.host.available":"No hosts are available for migration",
-"message.no.more.hosts.available":"No more hosts are available for migration",
-"message.no.network.support":"Your selected hypervisor, vSphere, does not have any additional network features.  Please continue to step 5.",
-"message.no.network.support.configuration.not.true":"You do not have any zone that has security group enabled. Thus, no additional network features.  Please continue to step 5.",
-"message.no.projects":"You do not have any projects.<br/>Please create a new one from the projects section.",
-"message.no.projects.adminOnly":"You do not have any projects.<br/>Please ask your administrator to create a new project.",
-"message.no.datadisk":"The multidisk template has no data disk, please continue to next step.",
-"message.number.clusters":"<h2><span> # of </span> Clusters</h2>",
-"message.number.hosts":"<h2><span> # of </span> Hosts</h2>",
-"message.number.pods":"<h2><span> # of </span> Pods</h2>",
-"message.number.storage":"<h2><span> # of </span> Primary Storage Volumes</h2>",
-"message.number.zones":"<h2><span> # of </span> Zones</h2>",
-"message.outofbandmanagement.action.maintenance":"Warning host is in maintenance mode",
-"message.outofbandmanagement.changepassword":"Change Out-of-band Management password",
-"message.outofbandmanagement.configure":"Configure Out-of-band Management",
-"message.outofbandmanagement.disable":"Disable Out-of-band Management",
-"message.outofbandmanagement.enable":"Enable Out-of-band Management",
-"message.outofbandmanagement.issue":"Issue Out-of-band Management Power Action",
-"message.ovf.properties.available":"There are OVF properties available for customizing the selected appliance. Please edit the values accordingly.",
-"message.password.has.been.reset.to":"Password has been reset to",
-"message.password.of.the.vm.has.been.reset.to":"Password of the VM has been reset to",
-"message.pending.projects.1":"You have pending project invitations:",
-"message.pending.projects.2":"To view, please go to the projects section, then select invitations from the drop-down.",
-"message.please.add.at.lease.one.traffic.range":"Please add at least one traffic range.",
-"message.please.confirm.remove.ssh.key.pair":"Please confirm that you want to remove this SSH Key Pair",
-"message.please.proceed":"Please proceed to the next step.",
-"message.please.select.a.configuration.for.your.zone":"Please select a configuration for your zone.",
-"message.please.select.a.different.public.and.management.network.before.removing":"Please select a different public and management network before removing",
-"message.please.select.networks":"Please select networks for your virtual machine.",
-"message.please.select.ssh.key.pair.use.with.this.vm":"Please select a ssh key pair you want this VM to use:",
-"message.please.wait.while.zone.is.being.created":"Please wait while your zone is being created; this may take a while...",
-"message.pod.dedication.released":"Pod dedication released",
-"message.portable.ip.delete.confirm":"Please confirm you want to delete Portable IP Range",
-"message.project.invite.sent":"Invite sent to user; they will be added to the project once they accept the invitation",
-"message.public.traffic.in.advanced.zone":"Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.<br/><br/>Provide at least one range of IP addresses for internet traffic.",
-"message.public.traffic.in.basic.zone":"Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP.",
-"message.question.are.you.sure.you.want.to.add":"Are you sure you want to add",
-"message.read.admin.guide.scaling.up":"Please read the dynamic scaling section in the admin guide before scaling up.",
-"message.recover.vm":"Please confirm that you would like to recover this VM.",
-"message.redirecting.region":"Redirecting to region...",
-"message.register.failed":"Registration Failed",
-"message.register.succeeded":"Registration Succeeded",
-"message.reinstall.vm":"NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched.",
-"message.remove.ldap":"Are you sure you want to delete the LDAP configuration?",
-"message.remove.region":"Are you sure you want to remove this region from this management server?",
-"message.remove.vpc":"Please confirm that you want to remove the VPC",
-"message.remove.vpn.access":"Please confirm that you want to remove VPN access from the following user.",
-"message.removed.ssh.key.pair":"Removed a SSH Key Pair",
-"message.reset.VPN.connection":"Please confirm that you want to reset VPN connection",
-"message.reset.password.warning.notPasswordEnabled":"The template of this instance was created without password enabled",
-"message.reset.password.warning.notStopped":"Your instance must be stopped before attempting to change its current password",
-"message.restart.mgmt.server":"Please restart your management server(s) for your new settings to take effect.",
-"message.restart.mgmt.usage.server":"Please restart your management server(s) and usage server(s) for your new settings to take effect.",
-"message.restart.network":"All services provided by this network will be interrupted. Please confirm that you want to restart this network.",
-"message.restart.vpc":"Please confirm that you want to restart the VPC",
-"message.restart.vpc.remark":"Please confirm that you want to restart the VPC <p><small><i>Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes</i>.</small></p>",
-"message.restoreVM":"Do you want to restore the VM ?",
-"message.role.update.fail": "Failed updating rule permission",
-"message.role.ordering.fail":"Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-"message.security.group.usage":"(Use <strong>Ctrl-click</strong> to select all applicable security groups)",
-"message.select.a.zone":"A zone typically corresponds to a single datacenter. Multiple zones help make the cloud more reliable by providing physical isolation and redundancy.",
-"message.select.affinity.groups":"Please select any affinity groups you want this VM to belong to:",
-"message.select.instance":"Please select an instance.",
-"message.select.iso":"Please select an ISO for your new virtual instance.",
-"message.select.item":"Please select an item.",
-"message.select.security.groups":"Please select security group(s) for your new VM",
-"message.select.template":"Please select a template for your new virtual instance.",
-"message.select.tier":"Please select a tier",
-"message.set.default.NIC":"Please confirm that you would like to make this NIC the default for this VM.",
-"message.set.default.NIC.manual":"Please manually update the default NIC on the VM now.",
-"message.setup.physical.network.during.zone.creation":"When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.<br/><br/><strong>Drag and drop one or more traffic types</strong> onto each physical network.",
-"message.setup.physical.network.during.zone.creation.basic":"When adding a basic zone, you can set up one physical network, which corresponds to a NIC on the hypervisor. The network carries several types of traffic.<br/><br/>You may also <strong>drag and drop</strong> other traffic types onto the physical network.",
-"message.setup.successful":"Cloud setup successful!",
-"message.snapshot.schedule":"You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-"message.specifiy.tag.key.value":"Please specify a tag key and value",
-"message.specify.url":"Please specify URL",
-"message.step.1.continue":"Please select a template or ISO to continue",
-"message.step.1.desc":"Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto.",
-"message.step.2.continue":"Please select a service offering to continue",
-"message.step.3.continue":"Please select a disk offering to continue",
-"message.step.4.continue":"Please select at least one network to continue",
-"message.step.4.desc":"Please select the primary network that your virtual instance will be connected to.",
-"message.storage.traffic":"Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here.",
-"message.suspend.project":"Are you sure you want to suspend this project?",
-"message.systems.vms.ready":"System VMs ready.",
-"message.template.copying":"Template is being copied.",
-"message.template.copy.select.zone":"Please select a zone to copy template.",
-"message.template.desc":"OS image that can be used to boot VMs",
-"message.tier.required":"Tier is required",
-"message.tooltip.dns.1":"Name of a DNS server for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-"message.tooltip.dns.2":"A second DNS server name for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-"message.tooltip.internal.dns.1":"Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-"message.tooltip.internal.dns.2":"Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-"message.tooltip.network.domain":"A DNS suffix that will create a custom domain name for the network that is accessed by guest VMs.",
-"message.tooltip.pod.name":"A name for this pod.",
-"message.tooltip.reserved.system.gateway":"The gateway for the hosts in the pod.",
-"message.tooltip.reserved.system.netmask":"The network prefix that defines the pod subnet. Uses CIDR notation.",
-"message.tooltip.zone.name":"A name for the zone.",
-"message.update.os.preference":"Please choose a OS preference for this host.  All virtual instances with similar preferences will be first allocated to this host before choosing another.",
-"message.update.resource.count":"Please confirm that you want to update resource counts for this account.",
-"message.update.ssl":"Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance:",
-"message.update.ssl.failed":"Failed to update SSL Certificate.",
-"message.update.ssl.succeeded":"Update SSL Certificates succeeded",
-"message.validate.URL":"Please enter a valid URL.",
-"message.validate.accept":"Please enter a value with a valid extension.",
-"message.validate.creditcard":"Please enter a valid credit card number.",
-"message.validate.date":"Please enter a valid date.",
-"message.validate.date.ISO":"Please enter a valid date (ISO).",
-"message.validate.digits":"Please enter only digits.",
-"message.validate.email.address":"Please enter a valid email address.",
-"message.validate.equalto":"Please enter the same value again.",
-"message.validate.fieldrequired":"This field is required.",
-"message.validate.fixfield":"Please fix this field.",
-"message.validate.instance.name":"Instance name can not be longer than 63 characters. Only ASCII letters a~z, A~Z, digits 0~9, hyphen are allowed. Must start with a letter and end with a letter or a digit.",
-"message.validate.invalid.characters":"Invalid characters found; please correct.",
-"message.validate.max":"Please enter a value less than or equal to {0}.",
-"message.validate.maxlength":"Please enter no more than {0} characters.",
-"message.validate.minlength":"Please enter at least {0} characters.",
-"message.validate.number":"Please enter a valid number.",
-"message.validate.range":"Please enter a value between {0} and {1}.",
-"message.validate.range.length":"Please enter a value between {0} and {1} characters long.",
-"message.virtual.network.desc":"A dedicated virtualized network for your account.  The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router.",
-"message.vm.create.template.confirm":"Create Template will reboot the VM automatically.",
-"message.vm.review.launch":"Please review the following information and confirm that your virtual instance is correct before launch.",
-"message.vnmc.available.list":"VNMC is not available from provider list.",
-"message.vnmc.not.available.list":"VNMC is not available from provider list.",
-"message.volume.create.template.confirm":"Please confirm that you wish to create a template for this disk volume.  Creation of the template can range from several minutes to longer depending on the size of the volume.",
-"message.volume.root.shrink.disk.size" :"Shrink operation on ROOT volume not supported",
-"message.waiting.for.builtin.templates.to.load":"Waiting for builtin templates to load...",
-"message.you.must.have.at.least.one.physical.network":"You must have at least one physical network",
-"message.your.cloudstack.is.ready":"Your CloudStack is ready!",
-"message.zone.creation.complete.would.you.like.to.enable.this.zone":"Zone creation complete. Would you like to enable this zone?",
-"message.zone.no.network.selection":"The zone you selected does not have any choices for network selection.",
-"message.zone.step.1.desc":"Please select a network model for your zone.",
-"message.zone.step.2.desc":"Please enter the following info to add a new zone",
-"message.zone.step.3.desc":"Please enter the following info to add a new pod",
-"message.zoneWizard.enable.local.storage":"WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:<br/><br/>1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.<br/><br/>2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.<br/><br/><br/>Would you like to continue?",
-"messgae.validate.min":"Please enter a value greater than or equal to {0}.",
-"mode":"Mode",
-"network.rate":"Network Rate",
-"notification.reboot.instance":"Reboot instance",
-"notification.start.instance":"Start instance",
-"notification.stop.instance":"Stop instance",
-"side.by.side":"Side by Side",
-"state.Accepted":"Accepted",
-"state.Active":"Active",
-"state.Allocated":"Allocated",
-"state.Allocating":"Allocating",
-"state.BackedUp":"Backed Up",
-"state.BackingUp":"Backing Up",
-"state.Completed":"Completed",
-"state.Creating":"Creating",
-"state.Declined":"Declined",
-"state.Destroyed":"Destroyed",
-"state.Disabled":"Disabled",
-"state.Enabled":"Enabled",
-"state.Error":"Error",
-"state.Expunging":"Expunging",
-"state.Migrating":"Migrating",
-"state.Pending":"Pending",
-"state.Ready":"Ready",
-"state.Running":"Running",
-"state.Starting":"Starting",
-"state.Stopped":"Stopped",
-"state.Stopping":"Stopping",
-"state.Suspended":"Suspended",
-"state.detached":"Detached",
-"title.upload.volume":"Upload Volume",
-"ui.listView.filters.all":"All",
-"ui.listView.filters.mine":"Mine"};
diff --git a/ui/legacy/l10n/es.js b/ui/legacy/l10n/es.js
deleted file mode 100644
index 7772cdb..0000000
--- a/ui/legacy/l10n/es.js
+++ /dev/null
@@ -1,2313 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "Código ICMP",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "Tipo ICMP",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Cambiadas las propiedades del elemento",
-    "confirm.enable.s3": "Por favor, complete la siguiente información para habilitar el soporte del Almacenamiento Secundario sobre S3",
-    "confirm.enable.swift": "Por favor, complete la siguiente información para habilitar el soporte para Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Error, no se puede cambiar la contraseña porque LDAP esta activado",
-    "error.could.not.enable.zone": "No se pudo habilitar la zona",
-    "error.installWizard.message": "Algo salio mal, debes ir para atrás y corregir los errores.",
-    "error.invalid.username.password": "Usuario o contraseña invalido",
-    "error.login": "Su nombre de usuario / contraseña no coinciden con nuestros registros.",
-    "error.menu.select": "Imposible ejecutar la acción, ya que no hay elementos seleccionados.",
-    "error.mgmt.server.inaccessible": "El Servidor de Gestión es inaccesible. Por favor, inténtelo de nuevo más tarde.",
-    "error.password.not.match": "Los campos de contraseña no coinciden",
-    "error.please.specify.physical.network.tags": "Las Ofertas de Red no están disponibles hasta que se especifique los tags para esta red física.",
-    "error.session.expired": "Su sesión ha caducado.",
-    "error.something.went.wrong.please.correct.the.following": "Algo salió mal, por favor corrija lo siguiente",
-    "error.unable.to.reach.management.server": "No es posible alcanzar al Servidor de Gestión",
-    "error.unresolved.internet.name": "El nombre de Internet no se puede resolver.",
-    "force.delete": "Forzar Borrado",
-    "force.delete.domain.warning": "Advertencia: Elegir esta opción, provocará la eliminación de todos los dominios hijos y todas las cuentas asociadas y sus recursos.",
-    "force.remove": "Forzar el retiro",
-    "force.remove.host.warning": "Advertencia: Elegir esta opción provocará que CloudStack detenga a la fuerza todas las máquinas virtuales antes de eliminar este host del clúster.",
-    "force.stop": "Forzar Parar",
-    "force.stop.instance.warning": "Advertencia: Forzar la dertención de esta instancia deberí­a ser su última opción. Puede conducir a la pérdida de datos, así­ como un comportamiento incoherente del estado de la máquina virtual.",
-    "hint.no.host.tags": "No se encontraron las etiquetas de servidor",
-    "hint.no.storage.tags": "No se encontraron las etiquetas de almacenamiento",
-    "hint.type.part.host.tag": "Introduzca parte de la etiqueta de servidor",
-    "hint.type.part.storage.tag": "Introduzca parte de la etiqueta de almacenamiento",
-    "image.directory": "Directorio de Imágenes",
-    "inline": "En línea",
-    "instances.actions.reboot.label": "Reiniciar Instancia",
-    "label.CIDR.list": "Lista CIDR",
-    "label.CIDR.of.destination.network": "CIDR de la red destino",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "Tipo de servidor DHCP",
-    "label.DNS.domain.for.guest.networks": "Dominio DNS de las Redes Invitado",
-    "label.ESP.encryption": "Encriptación ESP",
-    "label.ESP.hash": "Hash ESP",
-    "label.ESP.lifetime": "Tiempo de vida ESP (en segundos)",
-    "label.ESP.policy": "Política ESP",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "Encriptación IKE",
-    "label.IKE.hash": "Hash IKE",
-    "label.IKE.lifetime": "Tiempo de vida IKE (segundos)",
-    "label.IKE.policy": "Política IKE",
-    "label.IPsec.preshared.key": "Clave precompartida IPsec",
-    "label.LB.isolation": "Aislamiento de LB",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Perfil de Log Palo Alto",
-    "label.PA.threat.profile": "Perfíl de Amenazas Palo Alto",
-    "label.PING.CIFS.password": "PING CIFS Contraseña",
-    "label.PING.CIFS.username": "PING CIFS nombre de usuario",
-    "label.PING.dir": "PING Directorio",
-    "label.PING.storage.IP": "PING almacenamiento IP",
-    "label.PreSetup": "PreConfiguración",
-    "label.Pxe.server.type": "Tipo de servidor PXE",
-    "label.SNMP.community": "Comunidad SNMP",
-    "label.SNMP.port": "Puerto SNMP",
-    "label.SR.name": "SR Nombre de etiqueta",
-    "label.SharedMountPoint": "PuntoMontajeCompartido",
-    "label.TFTP.dir": "Directorio de TFTP",
-    "label.VMFS.datastore": "Almacén de datos VMFS",
-    "label.VMs.in.tier": "MVs en el tier",
-    "label.VPC.limits": "Límites de VPC",
-    "label.VPC.router.details": "Detalles del router VPC",
-    "label.VPN.connection": "Conexión VPN",
-    "label.VPN.customer.gateway": "Gateway Usuario de VPN",
-    "label.VPN.gateway": "Gateway VPN",
-    "label.Xenserver.Tools.Version61plus": "Versión Original XS es 6.1+",
-    "label.about": "Acerca de",
-    "label.about.app": "Acerca de CloudStack",
-    "label.accept.project.invitation": "Aceptar invitación al proyecto",
-    "label.account": "Cuenta",
-    "label.account.and.security.group": "Cuenta, Grupo de seguridad",
-    "label.account.details": "Detalles de la Cuenta",
-    "label.account.id": "ID de la cuenta",
-    "label.account.lower": "cuenta",
-    "label.account.name": "Nombre de cuenta",
-    "label.account.specific": "específicas de la cuenta",
-    "label.account.type": "Tipo de Cuenta",
-    "label.accounts": "Cuentas",
-    "label.acl": "ACL",
-    "label.acl.id": "ID de ACL",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "Lista de Reglas ACL",
-    "label.acl.name": "Nombre de ACL",
-    "label.acl.replaced": "ACL reemplazada",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Adquirir nueva IP",
-    "label.acquire.new.secondary.ip": "Adquirir nueva IP secundaria",
-    "label.action": "Acción",
-    "label.action.attach.disk": "Conecte el disco",
-    "label.action.attach.disk.processing": "Conectando el disco....",
-    "label.action.attach.iso": "Conectar ISO",
-    "label.action.attach.iso.processing": "Conectando el ISO....",
-    "label.action.cancel.maintenance.mode": "Cancelar el modo de mantenimiento",
-    "label.action.cancel.maintenance.mode.processing": "Cancelando el modo de mantenimiento....",
-    "label.action.change.password": "Cambiar la contraseña",
-    "label.action.change.service": "Cambiar el Servicio",
-    "label.action.change.service.processing": "Cambiando el servicio....",
-    "label.action.configure.samlauthorization": "Configurar Autorización SAML SSO",
-    "label.action.copy.ISO": "Copiar ISO",
-    "label.action.copy.ISO.processing": "Copiando ISO....",
-    "label.action.copy.template": "Copiar Plantilla",
-    "label.action.copy.template.processing": "Copiando Plantilla....",
-    "label.action.create.template": "Crear plantilla",
-    "label.action.create.template.from.vm": "Crear plantilla de MV",
-    "label.action.create.template.from.volume": "Crear plantilla de Volumen",
-    "label.action.create.template.processing": "Creando Plantilla...",
-    "label.action.create.vm": "Crear MV",
-    "label.action.create.vm.processing": "Creando MV...",
-    "label.action.create.volume": "Crear volumen",
-    "label.action.create.volume.processing": "Creando Volumen ....",
-    "label.action.delete.IP.range": "Eliminar Rango IP",
-    "label.action.delete.IP.range.processing": "Eliminando Rango IP ....",
-    "label.action.delete.ISO": "Eliminar ISO",
-    "label.action.delete.ISO.processing": "Eliminando ISO...",
-    "label.action.delete.account": "Eliminar cuenta",
-    "label.action.delete.account.processing": "Eliminando cuenta ....",
-    "label.action.delete.cluster": "Borrar Clúster",
-    "label.action.delete.cluster.processing": "Borrando Clúster....",
-    "label.action.delete.disk.offering": "Borrar Oferta Disco",
-    "label.action.delete.disk.offering.processing": "Borrando Oferta Disco...",
-    "label.action.delete.domain": "Eliminar Dominio",
-    "label.action.delete.domain.processing": "Eliminando Dominio ....",
-    "label.action.delete.firewall": "Eliminar regla firewall",
-    "label.action.delete.firewall.processing": "Eliminado Firewall...",
-    "label.action.delete.ingress.rule": "Borrar Regla Entrada",
-    "label.action.delete.ingress.rule.processing": "Eliminando Regla Entrada...",
-    "label.action.delete.load.balancer": "Eliminar Balanceador de Carga",
-    "label.action.delete.load.balancer.processing": "Eliminando Balanceador de Carga...",
-    "label.action.delete.network": "Eliminar Red",
-    "label.action.delete.network.processing": "Eliminando Red ....",
-    "label.action.delete.nexusVswitch": "Eliminar Nexus 1000v",
-    "label.action.delete.nic": "Quitar NIC",
-    "label.action.delete.physical.network": "Eliminar red física",
-    "label.action.delete.pod": "Eliminar Pod",
-    "label.action.delete.pod.processing": "Eliminando Pod ....",
-    "label.action.delete.primary.storage": "Eliminar Almacenamiento Primario",
-    "label.action.delete.primary.storage.processing": "Eliminando Almacenamiento Primario....",
-    "label.action.delete.secondary.storage": "Eliminar Almacenamiento Secundario",
-    "label.action.delete.secondary.storage.processing": "Eliminando Almacenamiento Secundario...",
-    "label.action.delete.security.group": "Borrar Grupo de Seguridad",
-    "label.action.delete.security.group.processing": "Eliminando Grupo de Seguridad ....",
-    "label.action.delete.service.offering": "Eliminar Oferta de Servicio",
-    "label.action.delete.service.offering.processing": "Eliminando Oferta de Servicio ....",
-    "label.action.delete.snapshot": "Eliminar instantánea",
-    "label.action.delete.snapshot.processing": "Eliminando instantánea ....",
-    "label.action.delete.system.service.offering": "Eliminar Oferta de Servicio de Sistema",
-    "label.action.delete.template": "Eliminar plantilla",
-    "label.action.delete.template.processing": "Eliminando Plantilla ....",
-    "label.action.delete.user": "Eliminar usuario",
-    "label.action.delete.user.processing": "Eliminando Usuario ....",
-    "label.action.delete.volume": "Eliminar volumen",
-    "label.action.delete.volume.processing": "Eliminando Volumen ....",
-    "label.action.delete.zone": "Eliminar Zona",
-    "label.action.delete.zone.processing": "Eliminando Zona ....",
-    "label.action.destroy.instance": "Destruye Instancia",
-    "label.action.destroy.instance.processing": "Destruyendo Instancia ....",
-    "label.action.destroy.systemvm": "Destruye MV de Sistema",
-    "label.action.destroy.systemvm.processing": "Destruyendo MV de Sistema...",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Desconectar Disco",
-    "label.action.detach.disk.processing": "Desconectando Disco ....",
-    "label.action.detach.iso": "Desconectar ISO",
-    "label.action.detach.iso.processing": "Desconectando ISO ....",
-    "label.action.disable.account": "Desactivar cuenta",
-    "label.action.disable.account.processing": "Deshabilitando Cuenta ....",
-    "label.action.disable.cluster": "Deshabilitar Clúster",
-    "label.action.disable.cluster.processing": "Deshabilitando Clúster...",
-    "label.action.disable.nexusVswitch": "Deshabilitar Nexus 1000v",
-    "label.action.disable.physical.network": "Desactivar la red física",
-    "label.action.disable.pod": "Deshabilitar Pod",
-    "label.action.disable.pod.processing": "Deshabilitar Pod ....",
-    "label.action.disable.static.NAT": "Deshabilitar NAT estática",
-    "label.action.disable.static.NAT.processing": "Deshabilitando NAT estático ....",
-    "label.action.disable.user": "Deshabilitar Usuario",
-    "label.action.disable.user.processing": "Deshabilitando Usuario ....",
-    "label.action.disable.zone": "Deshabilitar Zona",
-    "label.action.disable.zone.processing": "Desactivando Zona ....",
-    "label.action.download.ISO": "Descargar ISO",
-    "label.action.download.template": "Descargar Plantilla",
-    "label.action.download.volume": "Descargar Volumen",
-    "label.action.download.volume.processing": "Descargando Volumen....",
-    "label.action.edit.ISO": "Editar ISO",
-    "label.action.edit.account": "Editar Cuenta",
-    "label.action.edit.disk.offering": "Editar Oferta Disco",
-    "label.action.edit.domain": "Editar Dominio",
-    "label.action.edit.global.setting": "Editar Configuración Global",
-    "label.action.edit.host": "Editar Anfitrión",
-    "label.action.edit.instance": "Editar Instancia",
-    "label.action.edit.network": "Editar Red",
-    "label.action.edit.network.offering": "Editar Oferta de Red",
-    "label.action.edit.network.processing": "Editando Red....",
-    "label.action.edit.pod": "Editar Pod",
-    "label.action.edit.primary.storage": "Editar Almacenamiento Primario",
-    "label.action.edit.resource.limits": "Editar límites de recursos",
-    "label.action.edit.service.offering": "Editar Oferta de Servicio",
-    "label.action.edit.template": "Editar Plantilla",
-    "label.action.edit.user": "Editar usuario",
-    "label.action.edit.zone": "Edición Zona",
-    "label.action.enable.account": "Habilitar cuenta",
-    "label.action.enable.account.processing": "Habilitando Cuenta...",
-    "label.action.enable.cluster": "Habilitar clúster",
-    "label.action.enable.cluster.processing": "Habilitando clúster ....",
-    "label.action.enable.maintenance.mode": "Habilitar Modo de Mantenimiento",
-    "label.action.enable.maintenance.mode.processing": "Habilitando Modo de Mantenimiento ....",
-    "label.action.enable.nexusVswitch": "Habilitar Nexus 1000v",
-    "label.action.enable.physical.network": "Habilitar red física",
-    "label.action.enable.pod": "Habilitar Pod",
-    "label.action.enable.pod.processing": "Habilitando Pod ....",
-    "label.action.enable.static.NAT": "Habilitar NAT estático",
-    "label.action.enable.static.NAT.processing": "Habilitando NAT estático ....",
-    "label.action.enable.user": "Activar Usuario",
-    "label.action.enable.user.processing": "Habilitando Usuario...",
-    "label.action.enable.zone": "Habilitar Zona",
-    "label.action.enable.zone.processing": "Habilitando Zona ....",
-    "label.action.expunge.instance": "Purgar Instancia",
-    "label.action.expunge.instance.processing": "Purgando Instancia....",
-    "label.action.force.reconnect": "Forzar Reconectar",
-    "label.action.force.reconnect.processing": "Reconectando ....",
-    "label.action.generate.keys": "Generar Claves",
-    "label.action.generate.keys.processing": "Generar Claves ....",
-    "label.action.list.nexusVswitch": "Listar Nexus 1000v",
-    "label.action.lock.account": "Bloquear Cuenta",
-    "label.action.lock.account.processing": "Bloqueando Cuenta ....",
-    "label.action.manage.cluster": "Gestionar Clúster",
-    "label.action.manage.cluster.processing": "Gestionando Clúster",
-    "label.action.migrate.instance": "Migrar Instancia",
-    "label.action.migrate.instance.processing": "Migrando Instancia ....",
-    "label.action.migrate.router": "Migrar Router",
-    "label.action.migrate.router.processing": "Migrando Router ....",
-    "label.action.migrate.systemvm": "Migrar MV de Sistema",
-    "label.action.migrate.systemvm.processing": "Migrando MV de Sistema...",
-    "label.action.reboot.instance": "Reiniciar Instancia",
-    "label.action.reboot.instance.processing": "Reiniciando Instancia ....",
-    "label.action.reboot.router": "Reiniciar router",
-    "label.action.reboot.router.processing": "Reiniciando Router ....",
-    "label.action.reboot.systemvm": "Reiniciar MV de Sistema",
-    "label.action.reboot.systemvm.processing": "Reinicando MV de Sistema...",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Instantáneas Recurrentes",
-    "label.action.register.iso": "Registrar ISO",
-    "label.action.register.template": "Registrar Plantilla desde una URL",
-    "label.action.release.ip": "Liberar IP",
-    "label.action.release.ip.processing": "Liberando IP ....",
-    "label.action.remove.host": "Quitar host",
-    "label.action.remove.host.processing": "Quitando Host ....",
-    "label.action.reset.password": "Restablecer contraseña",
-    "label.action.reset.password.processing": "Restableciendo Contraseña ....",
-    "label.action.resize.volume": "Redimensionar Volúmen",
-    "label.action.resize.volume.processing": "Redimensionando Volúmen...",
-    "label.action.resource.limits": "Límites de Recursos",
-    "label.action.restore.instance": "Restaurar Instancia",
-    "label.action.restore.instance.processing": "Restaurando Instancia ....",
-    "label.action.revert.snapshot": "Revertir a Instantánea",
-    "label.action.revert.snapshot.processing": "Volviendo a Instantánea...",
-    "label.action.start.instance": "Iniciar Instancia",
-    "label.action.start.instance.processing": "Iniciando Instancia...",
-    "label.action.start.router": "Iniciar Router",
-    "label.action.start.router.processing": "Iniciando Router ....",
-    "label.action.start.systemvm": "Iniciar MV de Sistema",
-    "label.action.start.systemvm.processing": "Iniciando MV de Sistema...",
-    "label.action.stop.instance": "Parar Instancia",
-    "label.action.stop.instance.processing": "Parando Instancia ....",
-    "label.action.stop.router": "Parar Router",
-    "label.action.stop.router.processing": "Parando Router ....",
-    "label.action.stop.systemvm": "Parar MV de Sistema",
-    "label.action.stop.systemvm.processing": "Parando MV de Sistema",
-    "label.action.take.snapshot": "Tomar Instantánea",
-    "label.action.take.snapshot.processing": "Tomando Instantáneas ....",
-    "label.action.unmanage.cluster": "Parar gestión Clúster",
-    "label.action.unmanage.cluster.processing": "Parando gestión Clúster....",
-    "label.action.update.OS.preference": "Actualizar Preferencia SO",
-    "label.action.update.OS.preference.processing": "Actualizando Prefernecia SO...",
-    "label.action.update.resource.count": "Actualizar Cuenta de Recursos",
-    "label.action.update.resource.count.processing": "Actualizando Cuenta de Recursos...",
-    "label.action.vmsnapshot.create": "Tomar instantánea de MV",
-    "label.action.vmsnapshot.delete": "Borrar Instantanea de MV",
-    "label.action.vmsnapshot.revert": "Volver a Instantánea de MV",
-    "label.actions": "Acciones",
-    "label.activate.project": "Activar Proyecto",
-    "label.active.sessions": "Sesiones activas",
-    "label.add": "Agregar",
-    "label.add.ACL": "Agregar ACL",
-    "label.add.BigSwitchBcf.device": "Agregar Controlador BigSwitch BCF",
-    "label.add.BrocadeVcs.device": "Agregar Switch Brocade Vcs",
-    "label.add.F5.device": "Agregar dispositivo F5",
-    "label.add.LDAP.account": "Agregar Cuenta LDAP",
-    "label.add.NiciraNvp.device": "Agregar Controlador Nvp",
-    "label.add.OpenDaylight.device": "Agregar el Controlador OpenDaylight",
-    "label.add.PA.device": "Agregar dispositivo Palo Alto",
-    "label.add.SRX.device": "Agregar dispositivo SRX",
-    "label.add.VM.to.tier": "Agregar MV al tier",
-    "label.add.VPN.gateway": "Agregar Gateway VPN",
-    "label.add.account": "Añadir Cuenta",
-    "label.add.account.to.project": "Agregar Cuenta al Proyecto",
-    "label.add.accounts": "Agregar Cuentas",
-    "label.add.accounts.to": "Agregar Cuentas a",
-    "label.add.acl.list": "Agregar Lista ACL",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Agregar un nuevo grupo de afinidad",
-    "label.add.baremetal.dhcp.device": "Agregar dispositivo DHCP Baremetal",
-    "label.add.baremetal.rack.configuration": "Agregar Configuración de Rack Baremetal",
-    "label.add.by": "Añadir por",
-    "label.add.by.cidr": "Añadir Por CIDR",
-    "label.add.by.group": "Añadir Por el Grupo de",
-    "label.add.ciscoASA1000v": "Agregar un Recurso CiscoASA1000v",
-    "label.add.cluster": "Añadir Clúster",
-    "label.add.compute.offering": "Agregar oferta de computo",
-    "label.add.direct.iprange": "Añadir Rango IP Directo",
-    "label.add.disk.offering": "Añadir Oferta Disco",
-    "label.add.domain": "Agregar Dominio",
-    "label.add.egress.rule": "Agregar Regla de Salida",
-    "label.add.firewall": "Agregar Regla de Firewall",
-    "label.add.globo.dns": "Agregar GloboDNS",
-    "label.add.gslb": "Agregar GSLB",
-    "label.add.guest.network": "Agregar red de invitado",
-    "label.add.host": "Agregar Anfitrión",
-    "label.add.ingress.rule": "Añadir Regla de Entrada",
-    "label.add.intermediate.certificate": "Agregar certificado intermedio",
-    "label.add.internal.lb": "Agregar LB Interno",
-    "label.add.ip.range": "Añadir Rango IP",
-    "label.add.isolated.guest.network": "Añadir Red Invitado Aislada",
-    "label.add.isolated.guest.network.with.sourcenat": "Agregar Red de Invitado Aislada con NatOrigen",
-    "label.add.isolated.network": "Agregar Red Aislada",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Agregar cuenta LDAP",
-    "label.add.list.name": "Nombre de la Lista ACL",
-    "label.add.load.balancer": "Añadir balanceador de carga",
-    "label.add.more": "Añadir más",
-    "label.add.netScaler.device": "Agregar dispositivo Netscaler",
-    "label.add.network": "Agregar Red",
-    "label.add.network.ACL": "Agregar ACL de Red",
-    "label.add.network.acl.list": "Agregar Lista ACL de Red",
-    "label.add.network.device": "Añadir dispositivo de red",
-    "label.add.network.offering": "Agregar Oferta de Red",
-    "label.add.new.F5": "Agregar un nuevo F5",
-    "label.add.new.NetScaler": "Agregar un nuevo NetScaler",
-    "label.add.new.PA": "Agregar un nuevo Palo Alto",
-    "label.add.new.SRX": "Agregar nuevo SRX",
-    "label.add.new.gateway": "Agregar nuevo gateway",
-    "label.add.new.tier": "Agregar un nuevo tier",
-    "label.add.nfs.secondary.staging.store": "Agregar un Almacenamiento Secundario Temporario NFS",
-    "label.add.physical.network": "Agregar red física",
-    "label.add.pod": "Añadir Pod",
-    "label.add.port.forwarding.rule": "Agregar regla encaminamiento puerto",
-    "label.add.portable.ip.range": "Agregar un Rango IP Portátil",
-    "label.add.primary.storage": "Añadir Almacenamiento primario",
-    "label.add.private.gateway": "Agregar Gateway Privado",
-    "label.add.region": "Agregar Región",
-    "label.add.resources": "Agregar Recursos",
-    "label.add.role": "Agregar Rol",
-    "label.add.route": "Agregar ruta",
-    "label.add.rule": "Agregar regla",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Añadir almacenamiento secundario",
-    "label.add.security.group": "Agregar grupo de seguridad",
-    "label.add.service.offering": "Añadir Oferta de Servicio",
-    "label.add.static.nat.rule": "Agregar regla NAT estática",
-    "label.add.static.route": "Agregar ruta estática",
-    "label.add.system.service.offering": "Agregar Oferta de Servicio para MV de Sistema",
-    "label.add.template": "Añadir plantilla",
-    "label.add.to.group": "Agregar al grupo",
-    "label.add.ucs.manager": "Agregar UCS Manager",
-    "label.add.user": "Agregar Usuario",
-    "label.add.userdata": "DatosUsuario",
-    "label.add.vlan": "Añadir VLAN",
-    "label.add.vm": "Agregar MV",
-    "label.add.vms": "Agregar MVs",
-    "label.add.vms.to.lb": "Agregar MV(s) al balanceador de carga",
-    "label.add.vmware.datacenter": "Agregar Datacenter VMware",
-    "label.add.vnmc.device": "Agregar dispositivo VNMC",
-    "label.add.vnmc.provider": "Agregar proveedor VNMC",
-    "label.add.volume": "Añadir Volumen",
-    "label.add.vpc": "Agregar VPC",
-    "label.add.vpc.offering": "Agregar Ofertas de VPC",
-    "label.add.vpn.customer.gateway": "Agregar VPN para Acceso del Cliente",
-    "label.add.vpn.user": "Agregar usuario VPN",
-    "label.add.vxlan": "Añadir VXLAN",
-    "label.add.zone": "Añadir Zona",
-    "label.added.brocade.vcs.switch": "Agregado nuevo Switch VCS Brocade",
-    "label.added.network.offering": "Agregada Oferta de Red",
-    "label.added.new.bigswitch.bcf.controller": "Agregado nuevo Controlador BigSwitch BCF",
-    "label.added.nicira.nvp.controller": "Agregado nuevo Controlador Nicira NVP",
-    "label.addes.new.f5": "Agregar nuevo F5",
-    "label.adding": "Agregando",
-    "label.adding.cluster": "Agregando Clúster",
-    "label.adding.failed": "No se pudo agregar",
-    "label.adding.pod": "Agregar Pod",
-    "label.adding.processing": "Agregando ....",
-    "label.adding.succeeded": "Agregación correcta",
-    "label.adding.user": "Agregar Usuario",
-    "label.adding.zone": "Agregando Zona",
-    "label.additional.networks": "Redes adicionales",
-    "label.admin": "Admin",
-    "label.admin.accounts": "Cuentas Admin",
-    "label.advanced": "Avanzado",
-    "label.advanced.mode": "Modo avanzado",
-    "label.advanced.search": "Búsqueda Avanzada",
-    "label.affinity": "Afinidad",
-    "label.affinity.group": "Grupo de Afinidad",
-    "label.affinity.groups": "Grupos de Afinidad",
-    "label.agent.password": "Contraseña de Agente",
-    "label.agent.port": "Puerto del Agente",
-    "label.agent.state": "Estado del Agente",
-    "label.agent.username": "Nombre de usuario del agente",
-    "label.agree": "De-acuerdo",
-    "label.alert": "Alerta",
-    "label.alert.archived": "Alerta Archivada",
-    "label.alert.deleted": "Alerta Borrada",
-    "label.alert.details": "Detalles de la Alerta",
-    "label.algorithm": "Algoritmo",
-    "label.allocated": "Asignados",
-    "label.allocation.state": "Estado de la Asignación",
-    "label.allow": "Permitir",
-    "label.anti.affinity": "Anti-afinidad",
-    "label.anti.affinity.group": "Grupo de Anti-Afinidad",
-    "label.anti.affinity.groups": "Grupos de Anti-Afinidad",
-    "label.api.key": "clave de API",
-    "label.api.version": "Versión de API",
-    "label.app.name": "CloudStack",
-    "label.apply": "Aplicar",
-    "label.archive": "Archivar",
-    "label.archive.alerts": "Archivar alertas",
-    "label.archive.events": "Archivar eventos",
-    "label.assign": "Asignar",
-    "label.assign.instance.another": "Asignar Instancias a otra Cuenta",
-    "label.assign.to.load.balancer": "Asignando Instancia a Balanceador de Carga",
-    "label.assign.vms": "Asignar MVs",
-    "label.assigned.vms": "MVs Asignadas",
-    "label.associate.public.ip": "Asociar IP Pública",
-    "label.associated.network": "Red Asociada",
-    "label.associated.network.id": "ID de red asociados",
-    "label.associated.profile": "Perfil Asociado",
-    "label.attached.iso": "ISO Conectada",
-    "label.author.email": "e-mail del Autor",
-    "label.author.name": "Nombre del Autor",
-    "label.autoscale": "Escalado Automático",
-    "label.autoscale.configuration.wizard": "Asistente de configuración de Escalado Automático",
-    "label.availability": "Disponibilidad",
-    "label.availability.zone": "Disponibilidad de la zona",
-    "label.availabilityZone": "zonaDeDisponibilidad",
-    "label.available": "Disponible",
-    "label.available.public.ips": "Direcciones IP públicas disponibles",
-    "label.back": "Volver",
-    "label.bandwidth": "Ancho de banda",
-    "label.baremetal.dhcp.devices": "Dispositivo Baremetal para DHCP",
-    "label.baremetal.dhcp.provider": "Proveedor Baremetal de DHCP",
-    "label.baremetal.pxe.device": "Agregar Proveedor PXE para Baremetal",
-    "label.baremetal.pxe.devices": "Dispositivo Baremetal para PXE",
-    "label.baremetal.pxe.provider": "Proveedor PXE para Baremetal",
-    "label.baremetal.rack.configuration": "Configuración del Rack Baremetal",
-    "label.basic": "Básica",
-    "label.basic.mode": "Modo básico",
-    "label.bigswitch.bcf.details": "Detalles del Controlador BigSwitch BCF",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF con NAT habilitado",
-    "label.bigswitch.controller.address": "Dirección del Controlador BigSwitch BCF",
-    "label.blade.id": "ID de Hoja",
-    "label.blades": "Hojas",
-    "label.bootable": "Arrancable",
-    "label.broadcast.domain.range": "Rango del dominio de Broadcast",
-    "label.broadcast.domain.type": "Tipo de dominio de difusión",
-    "label.broadcast.uri": "URI de Broadcast",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "URI de Broadcast",
-    "label.brocade.vcs.address": "Dirección del Switch VCS",
-    "label.brocade.vcs.details": "Detalles del Switch VCS Brocade",
-    "label.by.account": "Por Cuenta",
-    "label.by.alert.type": "Por tipo de alerta",
-    "label.by.availability": "Por Disponibilidad",
-    "label.by.date.end": "Por fecha (finalización)",
-    "label.by.date.start": "Por fecha (inicio)",
-    "label.by.domain": "Por dominio",
-    "label.by.end.date": "Por Fecha de finalización",
-    "label.by.event.type": "Por tipo de evento",
-    "label.by.level": "por Nivel",
-    "label.by.pod": "Por Pod",
-    "label.by.role": "por Rol",
-    "label.by.start.date": "Por Fecha de inicio",
-    "label.by.state": "Por Estado",
-    "label.by.traffic.type": "Por tipo de tráfico",
-    "label.by.type": "Por tipo",
-    "label.by.type.id": "Por tipo de ID",
-    "label.by.zone": "Por Zona",
-    "label.bytes.received": "Bytes recibidos",
-    "label.bytes.sent": "Bytes enviados",
-    "label.cache.mode": "Tipo de cache de escritura",
-    "label.cancel": "Cancelar",
-    "label.capacity": "Capacidad",
-    "label.capacity.bytes": "Capacidad en Bytes",
-    "label.capacity.iops": "Capacidad en IOPS",
-    "label.certificate": "Certificado",
-    "label.change.affinity": "Cambiar Afinidad",
-    "label.change.ipaddress": "Cambiar la dirección IP de la NIC",
-    "label.change.service.offering": "Cambiar oferta de servicio",
-    "label.change.value": "Cambiar valor",
-    "label.character": "Carácter",
-    "label.chassis": "Chasis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR o Cuenta / Grupo de Seguridad",
-    "label.cidr.list": "CIDR Origen",
-    "label.cisco.nexus1000v.ip.address": "Dirección IP del Nexus 1000v",
-    "label.cisco.nexus1000v.password": "Contraseña del Nexus 1000v",
-    "label.cisco.nexus1000v.username": "Usuario del Nexus 1000v",
-    "label.ciscovnmc.resource.details": "Detalle de recursos CiscoVNMC",
-    "label.clean.up": "Limpiar",
-    "label.clear.list": "Limpiar lista",
-    "label.close": "Cerrar",
-    "label.cloud.console": "Consola de Gestión Cloud",
-    "label.cloud.managed": "Cloud.com Gestionado",
-    "label.cluster": "Clúster",
-    "label.cluster.name": "Nombre del Cluster",
-    "label.cluster.type": "Tipo de Clúster",
-    "label.clusters": "Clústers",
-    "label.clvm": "CLVM",
-    "label.code": "Código",
-    "label.community": "Comunidad",
-    "label.compute": "Computo",
-    "label.compute.and.storage": "Computo y Almacenamiento",
-    "label.compute.offering": "Oferta de Computo",
-    "label.compute.offerings": "Ofertas de Computo",
-    "label.configuration": "Configuración",
-    "label.configure": "Configurar",
-    "label.configure.ldap": "Configurar LDAP",
-    "label.configure.network.ACLs": "Configurar ACLs de la Red",
-    "label.configure.sticky.policy": "Configurar política Sticky",
-    "label.configure.vpc": "Configurar VPC",
-    "label.confirm.password": "Confirmar Contraseña",
-    "label.confirmation": "Confirmación",
-    "label.congratulations": "¡Felicidades!",
-    "label.conserve.mode": "Modo Conservativo",
-    "label.console.proxy": "Proxy de Consolas",
-    "label.console.proxy.vm": "MV Proxy de Consolas",
-    "label.continue": "Continuar",
-    "label.continue.basic.install": "Continuar con la instalación básica",
-    "label.copying.iso": "Copiando ISO",
-    "label.corrections.saved": "Correcciones guardadas",
-    "label.counter": "Contador",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU asignada",
-    "label.cpu.allocated.for.VMs": "CPU asignada para MVs",
-    "label.cpu.limits": "Límites de CPU",
-    "label.cpu.mhz": "CPU(MHz)",
-    "label.cpu.utilized": "CPU Utilizada",
-    "label.create.VPN.connection": "Crear Conexión VPN",
-    "label.create.nfs.secondary.staging.storage": "Crear almacén Temporal Secundario NFS",
-    "label.create.nfs.secondary.staging.store": "Crear almacén temporal secundario NFS",
-    "label.create.project": "Crear proyecto",
-    "label.create.ssh.key.pair": "Crear un par de claves SSH",
-    "label.create.template": "Crear Plantilla",
-    "label.created": "Creado",
-    "label.created.by.system": "Creado por el sistema",
-    "label.cross.zones": "Zonas transversales",
-    "label.custom": "A Medida",
-    "label.custom.disk.iops": "IOPS personalizadas",
-    "label.custom.disk.offering": "Oferta de Disco Personalizada",
-    "label.custom.disk.size": "Personal Disk Size",
-    "label.daily": "Diario",
-    "label.data.disk.offering": "Oferta de Disco de Datos",
-    "label.date": "Fecha",
-    "label.day": "Día",
-    "label.day.of.month": "Día del mes",
-    "label.day.of.week": "Día de la semana",
-    "label.dc.name": "Nombre del DC",
-    "label.dead.peer.detection": "Detección de Dead Peer",
-    "label.decline.invitation": "Declinar invitación",
-    "label.dedicate": "Dedicar",
-    "label.dedicate.cluster": "Dedicar el Cluster",
-    "label.dedicate.host": "Dedicar Anfitrión",
-    "label.dedicate.pod": "DedicarPod",
-    "label.dedicate.vlan.vni.range": "Dedicar Rango VLAN/VNI",
-    "label.dedicate.zone": "Dedicar Zona",
-    "label.dedicated": "Dedicado",
-    "label.dedicated.vlan.vni.ranges": "Rangos VLAN/VNI Dedicados",
-    "label.default": "Por Defecto",
-    "label.default.egress.policy": "Política de salida por defecto",
-    "label.default.use": "Uso por defecto",
-    "label.default.view": "Vista Por Defecto",
-    "label.delete": "Eliminar",
-    "label.delete.BigSwitchBcf": "Remover Controlador BigSwitch BCF",
-    "label.delete.BrocadeVcs": "Remover Switch Brocade Vcs",
-    "label.delete.F5": "Borrar F5",
-    "label.delete.NetScaler": "Borrar NetScaler",
-    "label.delete.NiciraNvp": "Quitar Controlado Nvp",
-    "label.delete.OpenDaylight.device": "Borrar el Controlador OpenDaylight",
-    "label.delete.PA": "Borrar Palo Alto",
-    "label.delete.SRX": "Borrar SRX",
-    "label.delete.VPN.connection": "Borrar conexión VPN",
-    "label.delete.VPN.customer.gateway": "Borrar VPN para Acceso del Cliente",
-    "label.delete.VPN.gateway": "eliminar Gateway VPN",
-    "label.delete.acl.list": "Borrar Lista ACL",
-    "label.delete.affinity.group": "Borrar Grupo de Afinidad",
-    "label.delete.alerts": "Eliminar alertas",
-    "label.delete.baremetal.rack.configuration": "Borrar Configuración del Rack Baremetal",
-    "label.delete.ciscoASA1000v": "Borrar CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Borrar recurso CiscoVNMC",
-    "label.delete.events": "Eliminar sucesos",
-    "label.delete.gateway": "Borrar gateway",
-    "label.delete.internal.lb": "Borrar LB Interno",
-    "label.delete.portable.ip.range": "Borrar Rango IP Portátil",
-    "label.delete.profile": "Borrar Perfil",
-    "label.delete.project": "Eliminar proyecto",
-    "label.delete.role": "Borrar Rol",
-    "label.delete.secondary.staging.store": "Borrar Almacenamiento Secundario Temporal",
-    "label.delete.ucs.manager": "Borrar UCS Manager",
-    "label.delete.vpn.user": "Eliminar usuario VPN",
-    "label.deleting.failed": "No se pudo eliminar",
-    "label.deleting.processing": "Eliminando...",
-    "label.deny": "Denegar",
-    "label.deployment.planner": "Planificador de Despliegue",
-    "label.description": "Descripción",
-    "label.destination.physical.network.id": "ID de la red física destino",
-    "label.destination.zone": "Zona de destino",
-    "label.destroy": "Destruir",
-    "label.destroy.router": "Destruir router",
-    "label.destroy.vm.graceperiod": "Período de Gracia para Destruir MV",
-    "label.detaching.disk": "Extracción del disco",
-    "label.details": "Detalles",
-    "label.device.id": "ID de dispositivo",
-    "label.devices": "Dispositivos",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "IP Pública Conectada en forma Directa",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "IPs de la Red Compartida",
-    "label.disable.autoscale": "Deshabilitar Escalado Automático",
-    "label.disable.host": "Deshabitar Anfitrión",
-    "label.disable.network.offering": "Deshabitar oferta de red",
-    "label.disable.provider": "Deshabilitar proveedor",
-    "label.disable.vnmc.provider": "Deshabitar proveedor VNMC",
-    "label.disable.vpc.offering": "Deshabitar oferta VPC",
-    "label.disable.vpn": "Deshabilitar VPN",
-    "label.disabled": "Deshabilitado",
-    "label.disabling.vpn.access": "Deshabilitando Acceso VPN",
-    "label.disassociate.profile.blade": "Desasociar Perfil del Blade",
-    "label.disbale.vnmc.device": "Deshabitar dispositivo VNMC",
-    "label.disk.allocated": "Disco asignado",
-    "label.disk.bytes.read.rate": "Tasa Lectura Disco (BPS)",
-    "label.disk.bytes.write.rate": "Tasa Escritura Disco (BPS)",
-    "label.disk.iops.max": "IOPS máximas",
-    "label.disk.iops.min": "IOPS mínimas",
-    "label.disk.iops.read.rate": "Tasa Lectura Disco (IOPS)",
-    "label.disk.iops.total": "Total de IOPS",
-    "label.disk.iops.write.rate": "Tasa Escritura de Disco (IOPS)",
-    "label.disk.offering": "Oferta de Disco",
-    "label.disk.offering.details": "Detalles de Oferta de Disco",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Tipo de Aprovisionamiento",
-    "label.disk.read.bytes": "Lectura Disco (Bytes)",
-    "label.disk.read.io": "Lectura Disco (IO)",
-    "label.disk.size": "tamaño de disco",
-    "label.disk.size.gb": "tamaño de disco (en GB)",
-    "label.disk.total": "disco Total",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "volumen de disco",
-    "label.disk.write.bytes": "Escritura Disco (Bytes)",
-    "label.disk.write.io": "Escritura Disco (IO)",
-    "label.diskoffering": "Oferta de Disco",
-    "label.display.name": "Nombre a Mostrar",
-    "label.display.text": "Texto a mostrar",
-    "label.distributedrouter": "Router Distribuido",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Dominio",
-    "label.domain.admin": "Administrador de dominio",
-    "label.domain.details": "Detalles del Dominio",
-    "label.domain.id": "ID de dominio",
-    "label.domain.lower": "dominio",
-    "label.domain.name": "Nombre de dominio",
-    "label.domain.router": "Router de Dominio",
-    "label.domain.suffix": "Sufijo de dominio DNS (es decir, xyz.com)",
-    "label.done": "Listo",
-    "label.double.quotes.are.not.allowed": "No se permiten comillas dobles ",
-    "label.download.progress": "Progreso de la descarga",
-    "label.drag.new.position": "Arrastrar a una nueva ubicación",
-    "label.duration.in.sec": "Duración (en seg)",
-    "label.dynamically.scalable": "Escalable Dinamicamente",
-    "label.edit": "Editar",
-    "label.edit.acl.rule": "Editar regla ACL",
-    "label.edit.affinity.group": "Editar Grupo de Afinidad",
-    "label.edit.lb.rule": "Editar regla LB",
-    "label.edit.network.details": "Editar detalles de red",
-    "label.edit.project.details": "Editar detalles de proyecto",
-    "label.edit.region": "Editar Región",
-    "label.edit.role": "Editar Rol",
-    "label.edit.rule": "Editar regla",
-    "label.edit.secondary.ips": "Editar IPs secundarios",
-    "label.edit.tags": "Editar etiquetas",
-    "label.edit.traffic.type": "Edite el tipo de trafico",
-    "label.edit.vpc": "Editar VPC",
-    "label.egress.default.policy": "Política de salida por defecto",
-    "label.egress.rule": "Regla de salida",
-    "label.egress.rules": "Reglas de salida",
-    "label.elastic": "Elástico",
-    "label.elastic.IP": "IP Elástica",
-    "label.elastic.LB": "LB Elástico",
-    "label.email": "correo electrónico",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Habilitar Autoescalado",
-    "label.enable.host": "Habilitar Anfitrión",
-    "label.enable.network.offering": "Habilitar  oferta de red",
-    "label.enable.provider": "Habilitar proveedor",
-    "label.enable.s3": "Habilitar Almacenamiento Secundario sobre S3",
-    "label.enable.swift": "Habilitar Swift",
-    "label.enable.vnmc.device": "Habilitar dispositivo VNMC",
-    "label.enable.vnmc.provider": "Habilitar proveedor VNMC",
-    "label.enable.vpc.offering": "Habilitar oferta VPC",
-    "label.enable.vpn": "Habilitar acceso remoto VPN",
-    "label.enabling.vpn": "Habilitando VPN",
-    "label.enabling.vpn.access": "Habilitando Acceso VPN",
-    "label.end.IP": "IP Final",
-    "label.end.port": "Puerto final",
-    "label.end.reserved.system.IP": "Última IP de sistema Reservada",
-    "label.end.vlan": "VLAN Final",
-    "label.end.vxlan": "VXLAN Final",
-    "label.endpoint": "Endpoint",
-    "label.endpoint.or.operation": "Endpoint u Operación",
-    "label.enter.token": "Introduzca token",
-    "label.error": "Error",
-    "label.error.code": "Código de error",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX / ESXi anfitrión",
-    "label.event": "Evento",
-    "label.event.archived": "Evento Archivado",
-    "label.event.deleted": "Evento Borrado",
-    "label.every": "Cada",
-    "label.example": "Ejemplo",
-    "label.expunge": "Purgar",
-    "label.external.link": "Enlace externo",
-    "label.extractable": "Descargable",
-    "label.extractable.lower": "Descargable",
-    "label.f5": "F5",
-    "label.f5.details": "Detalles F5",
-    "label.failed": "Error",
-    "label.featured": "Destacados",
-    "label.fetch.latest": "Obtener último",
-    "label.filterBy": "Filtrar por",
-    "label.fingerprint": "Huella Digital",
-    "label.firewall": "Firewall",
-    "label.first.name": "Nombre",
-    "label.firstname.lower": "nombre",
-    "label.format": "Formato",
-    "label.format.lower": "formato",
-    "label.friday": "Viernes",
-    "label.full": "Completo",
-    "label.full.path": "Path completo",
-    "label.gateway": "puerta de enlace",
-    "label.general.alerts": "Alertas Generales",
-    "label.generating.url": "Generando URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "Configuración de GloboDNS",
-    "label.gluster.volume": "Volúmen",
-    "label.go.step.2": "Ir al paso 2",
-    "label.go.step.3": "Ir al paso 3",
-    "label.go.step.4": "Ir al paso 4",
-    "label.go.step.5": "Ir al paso 5",
-    "label.gpu": "GPU",
-    "label.group": "Grupo",
-    "label.group.by.account": "Agrupar por cuenta",
-    "label.group.by.cluster": "Agrupar por clúster",
-    "label.group.by.pod": "Agrupar por pod",
-    "label.group.by.zone": "Agrupar por zona",
-    "label.group.optional": "Grupo (Opcional)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Balanceador de Carga asignado",
-    "label.gslb.assigned.lb.more": "Asignar más Balanceo de Carga",
-    "label.gslb.delete": "Borrar el GSLB",
-    "label.gslb.details": "Detalles del GSLB",
-    "label.gslb.domain.name": "Nombre de Dominio GSLB",
-    "label.gslb.lb.details": "Detalles balanceo de carga",
-    "label.gslb.lb.remove": "Quitar balanceo de carga de este GSLB",
-    "label.gslb.lb.rule": "Regla de balanceo de carga",
-    "label.gslb.service": "Servicio GSLB",
-    "label.gslb.service.private.ip": "IP Privada del Servicio GSLB",
-    "label.gslb.service.public.ip": "IP Pública del Servicio GSLB",
-    "label.gslb.servicetype": "Tipo de Servicio",
-    "label.guest": "Invitado",
-    "label.guest.cidr": "CIDR Invitado",
-    "label.guest.end.ip": "IP final de Invitado",
-    "label.guest.gateway": "Gateway de Invitado",
-    "label.guest.ip": "Dirección IP de Invitado",
-    "label.guest.ip.range": "Rango IP de Invitado",
-    "label.guest.netmask": "Máscara de red de Invitado",
-    "label.guest.network.details": "Detalles de la red de Invitado",
-    "label.guest.networks": "Redes de invitado",
-    "label.guest.start.ip": "IP inicial de Invitado",
-    "label.guest.traffic": "Tráfico de Invitado",
-    "label.guest.traffic.vswitch.name": "Nombre del  vSwitch para Tráfico Invitado",
-    "label.guest.traffic.vswitch.type": "Tipo de vSwitch para Tráfico Invitado",
-    "label.guest.type": "Tipo de Invitado",
-    "label.ha.enabled": "HA Activado",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "Opciones Avanzadas:",
-    "label.health.check.configurations.options": "Opciones de Configuración:",
-    "label.health.check.interval.in.sec": "Intervalo de chequeo de salud (en seg)",
-    "label.health.check.message.desc": "Su balanceador de carga realizará de forma automática chequeos de salud en sus instancias cloudstack  y solo encaminará el tráfico a las instancias que los pasen.",
-    "label.health.check.wizard": "Wizard para chequeo de salud",
-    "label.healthy.threshold": "Barrera de Salud",
-    "label.help": "Ayuda",
-    "label.hide.ingress.rule": "Ocultar Regla Entrada",
-    "label.hints": "Sugerencias",
-    "label.home": "Inicio",
-    "label.host": "Anfitrión",
-    "label.host.MAC": "MAC del Anfitrión",
-    "label.host.alerts": "Anfitriones en Estado de Alerta",
-    "label.host.name": "nombre de host",
-    "label.host.tag": "Etiqueta del Anfitrión",
-    "label.host.tags": "Etiquetas de Anfitrión",
-    "label.hosts": "Anfitriones",
-    "label.hourly": "por hora",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "Etiqueta de tráfico HyperV",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Capacidades del Hipervisor",
-    "label.hypervisor.snapshot.reserve": "Reserva de instantáneas de hipervisores",
-    "label.hypervisor.type": "Tipo Hypervisor",
-    "label.hypervisor.version": "Versión del Hipervisor",
-    "label.hypervisors": "Hipervisores",
-    "label.id": "ID",
-    "label.info": "Información",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Regla Entrada",
-    "label.initiated.by": "Iniciado por",
-    "label.inside.port.profile": "Dentro del Perfil de Puerto",
-    "label.installWizard.addClusterIntro.subtitle": "¿Qué es un cluster?",
-    "label.installWizard.addClusterIntro.title": "Agreguemos un clúster",
-    "label.installWizard.addHostIntro.subtitle": "¿Qué es un Anfitrión?",
-    "label.installWizard.addHostIntro.title": "Agreguemos un Anfitrión",
-    "label.installWizard.addPodIntro.subtitle": "¿Que es un Pod?",
-    "label.installWizard.addPodIntro.title": "Agreguemos un Pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "¿Qué es el almacenamiento primario?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Agreguemos almacenamiento primario",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Qué es almacenamiento secundario?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Agreguemos almacenamiento secundario",
-    "label.installWizard.addZone.title": "Agregar zona",
-    "label.installWizard.addZoneIntro.subtitle": "¿Qué es una zona?",
-    "label.installWizard.addZoneIntro.title": "Agreguemos una zona",
-    "label.installWizard.click.launch": "Click en el botón de lanzar.",
-    "label.installWizard.subtitle": "Esta guía te ayudará a configurar la instalación de CloudStack&#848",
-    "label.installWizard.title": "Hola y Bienvenido a CloudStack&#8482",
-    "label.instance": "Instancia",
-    "label.instance.limits": "Límites de Instancia ",
-    "label.instance.name": "Nombre de instancia",
-    "label.instance.port": "Puerto de Instancia",
-    "label.instance.scaled.up": "Instancia escalada a lo requerido en la oferta",
-    "label.instances": "Instancias",
-    "label.instanciate.template.associate.profile.blade": "Instanciar Plantilla y asociar al Perfil al Blade",
-    "label.intermediate.certificate": "Certificado intermedio {0}",
-    "label.internal.dns.1": "DNS interno una",
-    "label.internal.dns.2": "DNS interno 2",
-    "label.internal.lb": "LB interno",
-    "label.internal.lb.details": "Detalles del LB Interno",
-    "label.internal.name": "Nombre interno",
-    "label.internallbvm": "LbVmInterna",
-    "label.interval.type": "Tipo de intervalo",
-    "label.introduction.to.cloudstack": "Introducción a CloudStack&#8482",
-    "label.invalid.integer": "Entero no válido",
-    "label.invalid.number": "Número no válido",
-    "label.invitations": "Invitaciones",
-    "label.invite": "Invitar",
-    "label.invite.to": "Invitar a .",
-    "label.invited.accounts": "Cuentas de invitado",
-    "label.ip": "IP",
-    "label.ip.address": "Dirección IP",
-    "label.ip.allocations": "Asignaciones IP",
-    "label.ip.limits": "Límites IP pública",
-    "label.ip.or.fqdn": "IP o FQDN",
-    "label.ip.range": "Rango IP",
-    "label.ip.ranges": "Rangos IP",
-    "label.ipaddress": "Dirección IP",
-    "label.ips": "IP",
-    "label.ipv4.cidr": "CIDR IPv4",
-    "label.ipv4.dns1": "DNS1 IPv4 ",
-    "label.ipv4.dns2": "DNS2 IPv4",
-    "label.ipv4.end.ip": "IP Final IPv4",
-    "label.ipv4.gateway": "Puerta de enlace IPv4",
-    "label.ipv4.netmask": "Máscara IPv4",
-    "label.ipv4.start.ip": "IP Inicial IPv4",
-    "label.ipv6.CIDR": "CIDR IPv6",
-    "label.ipv6.address": "Dirección IP IPv6",
-    "label.ipv6.dns1": "DNS1 IPv6",
-    "label.ipv6.dns2": "DNS2 IPv6",
-    "label.ipv6.end.ip": "IP Final IPv6",
-    "label.ipv6.gateway": "Puerta de enlace IPv6",
-    "label.ipv6.start.ip": "IP Inicial IPv6",
-    "label.is.default": "Es por defecto",
-    "label.is.redundant.router": "redundante",
-    "label.is.shared": "es Compartido",
-    "label.is.system": "es Sistema",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO de arranque",
-    "label.isolated.networks": "Redes Aisladas",
-    "label.isolation.method": "Método de aislamiento",
-    "label.isolation.mode": "modo de aislamiento",
-    "label.isolation.uri": "URI de aislamiento",
-    "label.item.listing": "Listado de artículos",
-    "label.japanese.keyboard": "Teclado Japones",
-    "label.keep": "Mantener",
-    "label.keep.colon": "Conservar:",
-    "label.key": "Llave",
-    "label.keyboard.language": "Lenguaje del Teclado",
-    "label.keyboard.type": "Tipo de teclado",
-    "label.kvm.traffic.label": "Etiqueta de tráfico KVM",
-    "label.label": "Etiqueta",
-    "label.lang.arabic": "Árabe",
-    "label.lang.brportugese": "Portugues de Brasil",
-    "label.lang.catalan": "Catalán",
-    "label.lang.chinese": "Chino (simplificado)",
-    "label.lang.dutch": "Holandes",
-    "label.lang.english": "Inglés",
-    "label.lang.french": "Frances",
-    "label.lang.german": "Aleman",
-    "label.lang.hungarian": "Hungaro",
-    "label.lang.italian": "Italiano",
-    "label.lang.japanese": "japonés",
-    "label.lang.korean": "Coreano",
-    "label.lang.norwegian": "Noruego",
-    "label.lang.polish": "Polaco",
-    "label.lang.russian": "Ruso",
-    "label.lang.spanish": "Español",
-    "label.last.disconnected": "Última Desconexión",
-    "label.last.name": "Apellido",
-    "label.lastname.lower": "apellido",
-    "label.latest.events": "Últimos eventos",
-    "label.launch": "Lanzar",
-    "label.launch.vm": "Lanzar MV",
-    "label.launch.zone": "Lanzar zona",
-    "label.lb.algorithm.leastconn": "Menor cantidad de conexiones",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "Origen",
-    "label.ldap.configuration": "Configuración de LDAP",
-    "label.ldap.group.name": "Grupo LDAP",
-    "label.ldap.link.type": "Tipo",
-    "label.ldap.port": "Puerto de LDAP",
-    "label.level": "Nivel",
-    "label.link.domain.to.ldap": "Enlazar Dominio a LDAP",
-    "label.linklocal.ip": "Dirección IP de Enlace Local",
-    "label.load.balancer": "Balanceador de carga",
-    "label.load.balancer.type": "Tipo de Balanceador de Carga",
-    "label.load.balancing": "Balanceo de Carga",
-    "label.load.balancing.policies": "Políticas de balanceo de carga",
-    "label.loading": "Cargando",
-    "label.local": "local",
-    "label.local.file": "Archivo local",
-    "label.local.storage": "Almacenamiento Local",
-    "label.local.storage.enabled": "Habilitar almacenamiento local para MVs de Usuarios",
-    "label.local.storage.enabled.system.vms": "Habilitar almacenamiento local para MVs de Sistema",
-    "label.login": "Login",
-    "label.logout": "Cerrar sesión",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "Etiqueta de tráfico LXC",
-    "label.make.project.owner": "Convertir la cuenta en propietaria del proyecto",
-    "label.make.redundant": "Hacer redundante",
-    "label.manage": "Administrar",
-    "label.manage.resources": "Administrar los Recursos",
-    "label.managed": "Gestionado",
-    "label.management": "Gestión",
-    "label.management.ips": "Dirección IP de Gestión",
-    "label.management.server": "Servidor de Gestión",
-    "label.max.cpus": "CPU cores Máx.",
-    "label.max.guest.limit": "Límite Máx. Invitados",
-    "label.max.instances": "Instancias Máx.",
-    "label.max.memory": "Memoria Máx. (MiB)",
-    "label.max.networks": "Redes Máx.",
-    "label.max.primary.storage": "Primario Máx. (GiB)",
-    "label.max.public.ips": "IPs públicas Máx.",
-    "label.max.secondary.storage": "Secundario Máx. (GiB)",
-    "label.max.snapshots": "Instantáneas Máx.",
-    "label.max.templates": "Plantillas Máx.",
-    "label.max.vms": "MVs de usuario Máx.",
-    "label.max.volumes": "Volúmenes Max.",
-    "label.max.vpcs": "VPCs Máx.",
-    "label.maximum": "Máximo",
-    "label.may.continue": "Ahora puede continuar.",
-    "label.md5.checksum": "suma de verificación MD5",
-    "label.memory": "Memoria",
-    "label.memory.allocated": "Memoria Asignada",
-    "label.memory.limits": "Límites Memoria (MiB)",
-    "label.memory.mb": "Memoria(MB)",
-    "label.memory.total": "Total de memoria",
-    "label.memory.used": "memoria usada",
-    "label.menu.accounts": "Cuentas",
-    "label.menu.alerts": "Alertas",
-    "label.menu.all.accounts": "Todas las cuentas",
-    "label.menu.all.instances": "todas las instancias",
-    "label.menu.community.isos": "SOs Comunidad ",
-    "label.menu.community.templates": "Plantillas Comunidad",
-    "label.menu.configuration": "Configuración",
-    "label.menu.dashboard": "Panel de Control",
-    "label.menu.destroyed.instances": "Instancias Destruidas",
-    "label.menu.disk.offerings": "Ofertas de Disco",
-    "label.menu.domains": "Dominios",
-    "label.menu.events": "Eventos",
-    "label.menu.featured.isos": "ISOs destacadas",
-    "label.menu.featured.templates": "Plantillas Destacadas",
-    "label.menu.global.settings": "Configuración global",
-    "label.menu.infrastructure": "Infraestructura",
-    "label.menu.instances": "Instancias",
-    "label.menu.ipaddresses": "Direcciones IP",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "Mis cuentas",
-    "label.menu.my.instances": "Mis instancias",
-    "label.menu.my.isos": "Mis ISOs",
-    "label.menu.my.templates": "Mis plantillas",
-    "label.menu.network": "Red",
-    "label.menu.network.offerings": "Ofertas de Red",
-    "label.menu.physical.resources": "Recursos Físicos",
-    "label.menu.regions": "Regiones",
-    "label.menu.running.instances": "Instancias en Ejecución",
-    "label.menu.security.groups": "Grupos de seguridad",
-    "label.menu.service.offerings": "Ofertas de Servicios",
-    "label.menu.snapshots": "instantáneas",
-    "label.menu.sshkeypair": "Par de Claves SSH",
-    "label.menu.stopped.instances": "Instancias Paradas",
-    "label.menu.storage": "Almacenamiento",
-    "label.menu.system": "Sistema",
-    "label.menu.system.service.offerings": "Ofertas de Servicio de VM de Sistema",
-    "label.menu.system.vms": "MVs de Sistema",
-    "label.menu.templates": "Plantillas",
-    "label.menu.virtual.appliances": "Appliances virtuales",
-    "label.menu.virtual.resources": "Recursos Virtuales",
-    "label.menu.volumes": "Volúmenes",
-    "label.menu.vpc.offerings": "Ofertas de VPC",
-    "label.metrics": "Métricas",
-    "label.metrics.allocated": "Asignados",
-    "label.metrics.clusters": "Clústeres",
-    "label.metrics.cpu.allocated": "Asignación de CPU",
-    "label.metrics.cpu.max.dev": "Desviación",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "Uso de CPU",
-    "label.metrics.cpu.used.avg": "Usado",
-    "label.metrics.disk": "Disco",
-    "label.metrics.disk.allocated": "Asignados",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Lectura",
-    "label.metrics.disk.size": "Tamaño",
-    "label.metrics.disk.storagetype": "Tipo",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Sin asignar",
-    "label.metrics.disk.usage": "Uso del Disco",
-    "label.metrics.disk.used": "Usado",
-    "label.metrics.disk.write": "Escritura",
-    "label.metrics.hosts": "Anfitriones",
-    "label.metrics.memory.allocated": "Asignación de Memoria",
-    "label.metrics.memory.max.dev": "Desviación",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Uso de Memoria",
-    "label.metrics.memory.used.avg": "Usado",
-    "label.metrics.name": "Nombre",
-    "label.metrics.network.read": "Lectura",
-    "label.metrics.network.usage": "Uso de Red",
-    "label.metrics.network.write": "Escritura",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Estado de la Alimentación",
-    "label.metrics.property": "Propiedad",
-    "label.metrics.scope": "Alcance",
-    "label.metrics.state": "Estado",
-    "label.metrics.storagepool": "Pool de Almacenamiento",
-    "label.metrics.vm.name": "Nombre de la MV",
-    "label.migrate.instance.to": "Migrar instancia a",
-    "label.migrate.instance.to.host": "Migrar instancia a otro anfitrión.",
-    "label.migrate.instance.to.ps": "Migrar instancia a otro almacenamiento primario",
-    "label.migrate.lb.vm": "Migrar MV LB",
-    "label.migrate.router.to": "Migrar Router a",
-    "label.migrate.systemvm.to": "Migrar MV de Sistema a",
-    "label.migrate.to.host": "Migrar a anfitrión",
-    "label.migrate.to.storage": "Migrar a almacenamiento",
-    "label.migrate.volume": "Migrar Volumen",
-    "label.migrate.volume.to.primary.storage": "Migrar volumen a otro almacenamiento primario",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Instancias Mínimas",
-    "label.min.past.the.hr": "minuto(s) después de la hora",
-    "label.minimum": "Mínimo",
-    "label.minute.past.hour": "minuto(s) después de la hora",
-    "label.minutes.past.hour": "minuto(s) después de la hora",
-    "label.mode": "modo",
-    "label.monday": "lunes",
-    "label.monthly": "mensual",
-    "label.more.templates": "Más Plantillas",
-    "label.move.down.row": "Mover abajo una fila",
-    "label.move.to.bottom": "Mover al final",
-    "label.move.to.top": "Mover al principio",
-    "label.move.up.row": "Mover una fila arriba",
-    "label.my.account": "Mi Cuenta",
-    "label.my.network": "Mi red",
-    "label.my.templates": "Mis plantillas",
-    "label.na": "N/A",
-    "label.name": "Nombre",
-    "label.name.lower": "Nombre",
-    "label.name.optional": "Nombre (Opcional)",
-    "label.nat.port.range": "Rango puertos NAT",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "máscara de red",
-    "label.netscaler.details": "Detalles del NetScaler",
-    "label.network": "Red",
-    "label.network.ACL": "ACL de Red",
-    "label.network.ACL.total": "ACL Total de la Red",
-    "label.network.ACLs": "ACLs de Red",
-    "label.network.addVM": "Agregar red a MV",
-    "label.network.cidr": "CIDR de Red",
-    "label.network.desc": "Desc de Red",
-    "label.network.details": "Detalles de la Red",
-    "label.network.device": "Dispositivos de red",
-    "label.network.device.type": "Tipo de dispositivos de red",
-    "label.network.domain": "Dominio de Red",
-    "label.network.domain.text": "Dominio de Red",
-    "label.network.id": "ID de red",
-    "label.network.label.display.for.blank.value": "Usar puerta de enlace por defecto",
-    "label.network.limits": "Límites de la Red",
-    "label.network.name": "Nombre de red",
-    "label.network.offering": "Oferta de Red",
-    "label.network.offering.details": "Detalles de la oferta de red",
-    "label.network.offering.display.text": "Texto a Mostrar en Oferta de Red",
-    "label.network.offering.id": "ID Oferta de Red",
-    "label.network.offering.name": "Nombre Oferta de Red",
-    "label.network.rate": "Tasa de Red (Mb/s)",
-    "label.network.rate.megabytes": "Tráfico de Red (MB/s)",
-    "label.network.read": "Lectura Red",
-    "label.network.service.providers": "Proveedores de Servicios de Red",
-    "label.network.type": "Tipo de red",
-    "label.network.write": "Escritura Red",
-    "label.networking.and.security": "Redes y Seguridad",
-    "label.networks": "Redes",
-    "label.new": "Nuevo",
-    "label.new.password": "Nueva contraseña",
-    "label.current.password": "Current Password",
-    "label.new.project": "Nuevo Proyecto",
-    "label.new.ssh.key.pair": "Nuevo Par de Claves SSH",
-    "label.new.vm": "Nueva MV",
-    "label.next": "Siguiente",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "servidor NFS",
-    "label.nfs.storage": "Almacenamiento NFS",
-    "label.nic.adapter.type": "Tipo de adaptador NIC",
-    "label.nicira.controller.address": "Dirección de Controladora",
-    "label.nicira.l2gatewayserviceuuid": "UUID del Servicio Gateway L2",
-    "label.nicira.l3gatewayserviceuuid": "UUID del Servicio Gateway L3",
-    "label.nicira.nvp.details": "Detalles del NVP Nicira",
-    "label.nicira.transportzoneuuid": "UUID de la Zona de Transporte",
-    "label.nics": "NIC",
-    "label.no": "No",
-    "label.no.actions": "No hay acciones disponibles",
-    "label.no.alerts": "No hay alertas recientes",
-    "label.no.data": "No hay información que mostrar",
-    "label.no.errors": "No hay errores recientes",
-    "label.no.grouping": "(sin agrupar)",
-    "label.no.isos": "No hay ISOs disponibles",
-    "label.no.items": "No hay artículos disponibles",
-    "label.no.security.groups": "No hay grupos de seguridad disponibles",
-    "label.no.thanks": "No, gracias",
-    "label.none": "Ninguno",
-    "label.not.found": "No se ha encontrado",
-    "label.notifications": "Notificaciones",
-    "label.num.cpu.cores": "# cores de CPU",
-    "label.number.of.clusters": "Número de Clusters",
-    "label.number.of.cpu.sockets": "Número de Sockets de CPU",
-    "label.number.of.hosts": "Número de Anfitriones",
-    "label.number.of.pods": "Número de Pods",
-    "label.number.of.system.vms": "Número de MV's de Sistema",
-    "label.number.of.virtual.routers": "Número de Routers Virtuales",
-    "label.number.of.zones": "Número de Zonas",
-    "label.numretries": "Número de reintentos",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "del mes",
-    "label.offer.ha": "Oferta HA",
-    "label.ok": "Aceptar",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "Controlador OpenDaylight",
-    "label.opendaylight.controllerdetail": "Detalles del Controlador OpenDaylight",
-    "label.opendaylight.controllers": "Controlador OpenDaylight",
-    "label.operator": "Operador",
-    "label.optional": "Opcional",
-    "label.order": "Ordenar",
-    "label.os.preference": "Preferencia S.O. ",
-    "label.os.type": "Tipo de Sistema Operativo",
-    "label.other": "Otro",
-    "label.outofbandmanagement": "Gestión Fuera de Banda",
-    "label.outofbandmanagement.action": "Acción",
-    "label.outofbandmanagement.action.issue": "Enviar Acción de Gestión de Alimentacíon Fuera-de-Banda",
-    "label.outofbandmanagement.address": "Dirección",
-    "label.outofbandmanagement.changepassword": "Cambiar la contraseña de la gestión Fuera-de-Banda",
-    "label.outofbandmanagement.configure": "Configurar Gestión Fuera-de-Banda",
-    "label.outofbandmanagement.disable": "Deshabilitar gestión Fuera-de-Banda",
-    "label.outofbandmanagement.driver": "Controlador",
-    "label.outofbandmanagement.enable": "Habilitar gestión Fuera-de-Banda",
-    "label.outofbandmanagement.password": "Contraseña",
-    "label.outofbandmanagement.port": "Puerto",
-    "label.outofbandmanagement.reenterpassword": "Reintroducir contraseña",
-    "label.outofbandmanagement.username": "Nombre de usuario",
-    "label.override.guest.traffic": "Sobreescribir Tráfico Invitado",
-    "label.override.public.traffic": "Sobreescribir Tráfico Público",
-    "label.ovm.traffic.label": "Etiqueta de tráfico OVM",
-    "label.ovm3.cluster": "Clustering Nativo",
-    "label.ovm3.pool": "Pooling Nativo",
-    "label.ovm3.traffic.label": "Etiqueta de tráfico OVM3",
-    "label.ovm3.vip": "IP del VIP Master",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Direcciones IP Públicas Propias",
-    "label.owner.account": "Propietario de la cuenta",
-    "label.owner.domain": "Dueño del Dominio",
-    "label.palo.alto.details": "Detalles de Palo Alto",
-    "label.parent.domain": "Dominio Padre",
-    "label.passive": "Pasivo",
-    "label.password": "Contraseña",
-    "label.password.enabled": "Habilitado por Contraseña",
-    "label.password.lower": "contraseña",
-    "label.password.reset.confirm": "La Contraseña se ha cambiado a",
-    "label.path": "Ruta",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Autorización",
-    "label.persistent": "Persistente",
-    "label.physical.network": "Red Física",
-    "label.physical.network.ID": "ID de red física",
-    "label.physical.network.name": "Nombre de red física",
-    "label.ping.path": "Camino de Ping",
-    "label.planner.mode": "Modo planificación",
-    "label.please.complete.the.following.fields": "Por favor complete los siguientes campos",
-    "label.please.specify.netscaler.info": "Por favor especifique la información del Netscaler",
-    "label.please.wait": "Por favor espere",
-    "label.plugin.details": "Detalles del Plugin",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dedicado",
-    "label.pod.name": "Nombre del Pod",
-    "label.pods": "Pod",
-    "label.polling.interval.sec": "Intervalo de Polling (en seg)",
-    "label.port": "Puerto",
-    "label.port.forwarding": "Encaminamiento de puerto",
-    "label.port.forwarding.policies": "Políticas de encaminamiento de puerto",
-    "label.port.range": "rango de puertos",
-    "label.portable.ip": "IP Portátil",
-    "label.portable.ip.range.details": "Detalles del Rango de IP portátil",
-    "label.portable.ip.ranges": "Rangos de IP portátiles",
-    "label.portable.ips": "IPs Portátiles",
-    "label.powerstate": "Estado de la Alimentación",
-    "label.prev": "Anterior",
-    "label.previous": "Previo",
-    "label.primary.allocated": "Almacenamiento Primario Asignado",
-    "label.primary.network": "Red Primaria",
-    "label.primary.storage": "Almacenamiento Primario",
-    "label.primary.storage.count": "Pools de Almacenamiento Primario",
-    "label.primary.storage.limits": "Límite del Almacenamiento Primario (GiB)",
-    "label.primary.used": "Almacenamiento Primario Usado",
-    "label.private.Gateway": "Gateway Privado",
-    "label.private.interface": "Interfaz privada",
-    "label.private.ip": "dirección IP privada",
-    "label.private.ip.range": "Rango IP privado",
-    "label.private.ips": "direcciones IP privadas",
-    "label.private.key": "Clave Privada",
-    "label.private.network": "Red privada",
-    "label.private.port": "Puerto privado",
-    "label.private.zone": "Zona Privada",
-    "label.privatekey": "Clave privada PKCS#8",
-    "label.profile": "Perfil",
-    "label.project": "Proyecto",
-    "label.project.dashboard": "Tablero del Proyecto",
-    "label.project.id": "ID proyecto",
-    "label.project.invite": "Invitar al proyecto",
-    "label.project.name": "Nombre del Proyecto",
-    "label.project.view": "Vista de Proyecto",
-    "label.projects": "Proyectos",
-    "label.protocol": "Protocolo",
-    "label.protocol.number": "Número de Protocolo",
-    "label.protocol.number.short" : "#Protocolo",
-    "label.provider": "Proveedor",
-    "label.providers": "Proveedores",
-    "label.public": "Pública",
-    "label.public.interface": "interfaz pública",
-    "label.public.ip": "dirección IP pública",
-    "label.public.ips": "direcciones IP públicas",
-    "label.public.key": "Clave Pública",
-    "label.public.lb": "LB Público",
-    "label.public.load.balancer.provider": "Proveedor de Balanceador de Carga Público",
-    "label.public.network": "Red Pública",
-    "label.public.port": "Puerto Público",
-    "label.public.traffic": "Tráfico público",
-    "label.public.traffic.vswitch.name": "Nombre de vSwitch para Tráfico Público",
-    "label.public.traffic.vswitch.type": "Tipo de vSwitch para Tráfico Público",
-    "label.public.zone": "Zona Pública",
-    "label.purpose": "Propósito",
-    "label.qos.type": "Tipo de QoS",
-    "label.quickview": "Vista Rápida",
-    "label.quiesce.vm": "Colocar en estado consistente a la MV",
-    "label.quiet.time.sec": "Tiempo en Silencio (en seg)",
-    "label.quota.add.credits": "Agregar Créditos",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Configuración de cuota",
-    "label.quota.configure": "Configurar cuota",
-    "label.quota.credit": "Crédito",
-    "label.quota.credits": "Créditos",
-    "label.quota.date": "Fecha",
-    "label.quota.dates": "Modificar Fechas",
-    "label.quota.description": "Descripción de cuota",
-    "label.quota.email.body": "Cuerpo",
-    "label.quota.email.lastupdated": "Última Modificación",
-    "label.quota.email.subject": "Tema",
-    "label.quota.email.template": "Plantilla de E-Mail",
-    "label.quota.enddate": "Fecha de Fín",
-    "label.quota.endquota": "Cuota Final",
-    "label.quota.enforcequota": "Forzar cuota",
-    "label.quota.fullsummary": "Todas las cuentas",
-    "label.quota.minbalance": "Balance Mínimo",
-    "label.quota.remove": "Eliminar Cuota",
-    "label.quota.startdate": "Fecha de Inicio",
-    "label.quota.startquota": "Cuota Inicial",
-    "label.quota.state": "Estado",
-    "label.quota.statement": "Declaración",
-    "label.quota.statement.balance": "Balance de Cuota",
-    "label.quota.statement.bydates": "Declaración",
-    "label.quota.statement.quota": "Uso de la Cuota",
-    "label.quota.statement.tariff": "Tarifa de la Cuota",
-    "label.quota.summary": "Resumen",
-    "label.quota.tariff": "Tarifa",
-    "label.quota.tariff.edit": "Editar Tarifa",
-    "label.quota.tariff.effectivedate": "Fecha Efectiva",
-    "label.quota.tariff.value": "Valor Tarifario",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Uso Total",
-    "label.quota.type.name": "Tipo de Uso",
-    "label.quota.type.unit": "Unidad de Uso",
-    "label.quota.usage": "Consumo de Cuota",
-    "label.quota.value": "Valor de Cuota",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Usuario Cephx",
-    "label.rbd.monitor": "Monitor CEPH",
-    "label.rbd.pool": "Pool CEPH",
-    "label.rbd.secret": "Secreto Cephx",
-    "label.reboot": "Reiniciar",
-    "label.recent.errors": "Errores Recientes",
-    "label.recover.vm": "Recuperar la MV",
-    "label.redundant.router": "Router Redundante",
-    "label.redundant.router.capability": "Capacidades del router redundante",
-    "label.redundant.state": "Estado redundante",
-    "label.redundant.vpc": "VPC redundante",
-    "label.refresh": "Actualizar",
-    "label.refresh.blades": "Refrescar Blade",
-    "label.region": "Región",
-    "label.region.details": "Detalles de la Región",
-    "label.regionlevelvpc": "VPC a Nivel de Región",
-    "label.reinstall.vm": "Reinstalar la MV",
-    "label.related": "relacionados",
-    "label.release.account": "Liberar de la Cuenta",
-    "label.release.account.lowercase": "Liberar de la cuenta",
-    "label.release.dedicated.cluster": "Liberar Cluster Dedicado",
-    "label.release.dedicated.host": "Liberar Anfitrión Dedicado",
-    "label.release.dedicated.pod": "Liberar Pod Dedicado",
-    "label.release.dedicated.vlan.range": "Liberar rango VLAN dedicado",
-    "label.release.dedicated.zone": "Liberar Zona Dedicada",
-    "label.remind.later": "Recordar mas tarde",
-    "label.remove.ACL": "Eliminar ACL",
-    "label.remove.egress.rule": "Eliminar regla de salida",
-    "label.remove.from.load.balancer": "Eliminar Instancia del Balanceador de Carga",
-    "label.remove.ingress.rule": "Eliminar regla de entrada",
-    "label.remove.ip.range": "Eliminar Rango IP",
-    "label.remove.ldap": "Quitar LDAP",
-    "label.remove.network.offering": "Quitar Oferta de Red",
-    "label.remove.pf": "Quitar Regla de Encaminamiento de Puerto",
-    "label.remove.project.account": "Quitar Cuenta del Proyecto",
-    "label.remove.region": "Quitar Región",
-    "label.remove.rule": "Quitar Regla",
-    "label.remove.ssh.key.pair": "Quitar Par de Claves SSH",
-    "label.remove.static.nat.rule": "Quitar Regla NAT estática",
-    "label.remove.static.route": "Quitar ruta estática",
-    "label.remove.this.physical.network": "Quitar esta red física",
-    "label.remove.tier": "Quitar tier",
-    "label.remove.vm.from.lb": "Quitar M de la regla del balanceador de carga",
-    "label.remove.vm.load.balancer": "Quitar MV del balanceador de carga",
-    "label.remove.vmware.datacenter": "Quitar Datacenter VMware",
-    "label.remove.vpc": "Quitar VPC",
-    "label.remove.vpc.offering": "Quitar Oferta VPC",
-    "label.removing": "Quitando..",
-    "label.removing.user": "Quitando usuario",
-    "label.reource.id": "ID del Recurso",
-    "label.replace.acl": "Reemplazar ACL",
-    "label.replace.acl.list": "Reemplazar Lista ACL",
-    "label.required": "Requerido",
-    "label.requires.upgrade": "Requiere Actualización",
-    "label.reserved.ip.range": "Rango IP Reservado",
-    "label.reserved.system.gateway": "Gateway de sistema reservado",
-    "label.reserved.system.ip": "IP de Sistema Reservada",
-    "label.reserved.system.netmask": "Máscara de sistema Reservada",
-    "label.reset.VPN.connection": "Resetear la conexión VPN",
-    "label.reset.ssh.key.pair": "Resetear el Par de Claves SSH",
-    "label.reset.ssh.key.pair.on.vm": "Resetear el Par de Claves SSH en la MV",
-    "label.resetVM": "Resetear MV",
-    "label.resize.new.offering.id": "Nueva Oferta",
-    "label.resize.new.size": "Nuevo Tamaño (GB)",
-    "label.resize.shrink.ok": "Reducción OK",
-    "label.resource": "Recursos",
-    "label.resource.limit.exceeded": "Límite de Recursos Excedido",
-    "label.resource.limits": "Límites de Recursos",
-    "label.resource.name": "Nombre del Recurso",
-    "label.resource.state": "Estado del recurso",
-    "label.resources": "Recursos",
-    "label.response.timeout.in.sec": "Timeout de Respuesta (en seg)",
-    "label.restart.network": "Reiniciar red",
-    "label.restart.required": "Reinicio requerido",
-    "label.restart.vpc": "Reiniciar VPC",
-    "label.restore": "Restaurar",
-    "label.retry.interval": "Intervalo de Repetición",
-    "label.review": "Revisar",
-    "label.revoke.project.invite": "Cancelar Invitación",
-    "label.role": "Rol",
-    "label.roles": "Roles",
-    "label.roletype": "Tipo de Rol",
-    "label.root.certificate": "Certificado Raíz",
-    "label.root.disk.controller": "Controladora de disco Root",
-    "label.root.disk.offering": "Oferta de Disco Root",
-    "label.root.disk.size": "Tamaño del disco Root (GB)",
-    "label.router.vm.scaled.up": "MV Router Escalada",
-    "label.routing": "Enrutamiento",
-    "label.routing.host": "Servidor de Routeo",
-    "label.rule": "Regla",
-    "label.rule.number.short": "#Regla",
-    "label.rule.number": "Número de Regla",
-    "label.rules": "Reglas",
-    "label.running.vms": "MVs corriendo",
-    "label.s3.access_key": "Clave de Acceso",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Timeout Conexión",
-    "label.s3.endpoint": "Endpoint",
-    "label.s3.max_error_retry": "Max Error Reintento ",
-    "label.s3.nfs.path": "Ruta NFS S3",
-    "label.s3.nfs.server": "Servidor NFS S3",
-    "label.s3.secret_key": "clave secreta",
-    "label.s3.socket_timeout": "Timeout Socket",
-    "label.s3.use_https": "Use HTTPS",
-    "label.saml.enable": "Autorizar SAML SSO",
-    "label.saml.entity": "Proveedor de Identidad",
-    "label.saturday": "sábado",
-    "label.save": "Guardar",
-    "label.save.and.continue": "Guardar y continuar",
-    "label.save.changes": "Grabar cambios",
-    "label.saving.processing": "Guardando ....",
-    "label.scale.up.policy": "POLITICA DE ESCALADO",
-    "label.scaledown.policy": "Política de Reducción",
-    "label.scaleup.policy": "Política de Escalado",
-    "label.scope": "Alcance",
-    "label.search": "Buscar",
-    "label.secondary.ips": "IPs secundarias",
-    "label.secondary.isolated.vlan.id": "ID de VLAN Aislada Secundaria",
-    "label.secondary.staging.store": "Almacenamiento Secundario Temporal",
-    "label.secondary.staging.store.details": "Detalles del Almacenamiento Secundario Temporal",
-    "label.secondary.storage": "Almacenamiento Secundario",
-    "label.secondary.storage.count": "Pools del Almacenamiento Secundario",
-    "label.secondary.storage.details": "Detalles del Almacenamiento Secundario",
-    "label.secondary.storage.limits": "Límite del Almacenamiento Secundario (GiB)",
-    "label.secondary.storage.vm": "MV de almacenamiento secundario",
-    "label.secondary.used": "Almacenamiento Secundario Utilizado",
-    "label.secret.key": "Clave Secreta",
-    "label.security.group": "Grupo de Seguridad",
-    "label.security.group.name": "Nombre de grupo de seguridad",
-    "label.security.groups": "Grupos de Seguridad",
-    "label.security.groups.enabled": "Grupos de Seguridad Habilitados",
-    "label.select": "Seleccione",
-    "label.select-view": "Seleccione vista",
-    "label.select.a.template": "Seleccione Plantilla",
-    "label.select.a.zone": "Seleccione una zona.",
-    "label.select.instance": "Seleccione instancia",
-    "label.select.instance.to.attach.volume.to": "Elija la instancia para conectar el volumen",
-    "label.select.iso.or.template": "Seleccione una ISO o plantilla",
-    "label.select.offering": "Elija Oferta",
-    "label.select.project": "Elegir Proyecto",
-    "label.select.region": "Elegir Región",
-    "label.select.template": "Elegir Plantilla",
-    "label.select.tier": "Elija Tier",
-    "label.select.vm.for.static.nat": "Seleccione MV para NAT estático",
-    "label.sent": "Enviados",
-    "label.server": "Servidor",
-    "label.service.capabilities": "Capacidades del Servicio",
-    "label.service.offering": "Oferta de Servicio",
-    "label.service.offering.details": "Detalles de la oferta de servicio",
-    "label.service.state": "Estado del servicio",
-    "label.services": "Servicios",
-    "label.session.expired": "Session Caducada",
-    "label.set.default.NIC": "Definir NIC por defecto",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Definir tipo de zona",
-    "label.settings": "Configuración",
-    "label.setup": "Configuración",
-    "label.setup.network": "Configurar Red",
-    "label.setup.zone": "Configurar Zona",
-    "label.shared": "Compartidas",
-    "label.show.advanced.settings": "Mostrar configuración avanzada",
-    "label.show.ingress.rule": "Mostrar Regla Entrada",
-    "label.shutdown.provider": "Apagar proveedor",
-    "label.simplified.chinese.keyboard": "Teclado Chino Simplificado",
-    "label.site.to.site.VPN": "VPN Site-to-site",
-    "label.size": "Tamaño",
-    "label.skip.guide": "He utilizado CloudStack anteriormente, saltar esta guía",
-    "label.smb.domain": "Dominio SMB",
-    "label.smb.password": "Contraseña SMB",
-    "label.smb.username": "Nombre de usuario SMB",
-    "label.snapshot": "Instantánea",
-    "label.snapshot.limits": "Límites Instantánea",
-    "label.snapshot.name": "Nombre Instantánea",
-    "label.snapshot.s": "Instantáneas",
-    "label.snapshot.schedule": "Configurar Instantáneas Recurrentes",
-    "label.snapshots": "Instantáneas",
-    "label.sockets": "Sockets",
-    "label.source.ip.address": "Dirección IP Origen",
-    "label.source.nat": "NAT Orígen",
-    "label.source.nat.supported": "SourceNAT Soportado",
-    "label.source.port": "Puerto Origen",
-    "label.specify.IP.ranges": "Especificar rangos IP",
-    "label.specify.vlan": "Especifique VLAN",
-    "label.specify.vxlan": "Especifique VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "Detalles de SRX",
-    "label.ssh.key.pair": "Par de Claves SSH",
-    "label.ssh.key.pair.details": "Detalles del Par de Claves SSH",
-    "label.ssh.key.pairs": "Par de Claves SSH",
-    "label.standard.us.keyboard": "Teclado estándar (US)",
-    "label.start.IP": "IP inicial",
-    "label.start.lb.vm": "Arrancar MV LB",
-    "label.start.port": "Puerto inicial",
-    "label.start.reserved.system.IP": "IP inicial reservada para el sistema",
-    "label.start.vlan": "VLAN Inicial",
-    "label.start.vxlan": "VXLAN inicial",
-    "label.state": "Estado",
-    "label.static.nat": "NAT estática",
-    "label.static.nat.enabled": "NAT estática habilitada",
-    "label.static.nat.to": "NAT estático para",
-    "label.static.nat.vm.details": "Detalles del NAT estático de la MV",
-    "label.static.routes": "Rutas Estáticas",
-    "label.statistics": "Estadísticas",
-    "label.status": "Estado",
-    "label.step.1": "Paso 1",
-    "label.step.1.title": "Paso 1: <strong> Seleccione una plantilla </strong>",
-    "label.step.2": "Paso 2",
-    "label.step.2.title": "Paso 2: <strong> Oferta de Servicio </strong>",
-    "label.step.3": "Paso 3",
-    "label.step.3.title": "Paso 3: <strong id=\"step3_label\"> Seleccione una Oferta de Disco </strong>",
-    "label.step.4": "Paso 4",
-    "label.step.4.title": "Paso 4: <strong> Red </strong>",
-    "label.step.5": "Paso 5",
-    "label.step.5.title": "Paso 5: Revisión <strong> </strong>",
-    "label.stickiness": "Persistencia",
-    "label.stickiness.method": "Método de persistencia",
-    "label.sticky.cookie-name": "Nombre de Cookie",
-    "label.sticky.domain": "Dominio",
-    "label.sticky.expire": "Expira",
-    "label.sticky.holdtime": "Tiempo de Retención",
-    "label.sticky.indirect": "Indirecto",
-    "label.sticky.length": "Longitud",
-    "label.sticky.mode": "Modo",
-    "label.sticky.name": "Nombre Pegajoso",
-    "label.sticky.nocache": "No Cache",
-    "label.sticky.postonly": "Solo Post",
-    "label.sticky.prefix": "Prefijo",
-    "label.sticky.request-learn": "Solicitar aprendizaje",
-    "label.sticky.tablesize": "Tamaño de tabla",
-    "label.stop": "Detener",
-    "label.stop.lb.vm": "Parar LB MV",
-    "label.stopped.vms": "MVs detenidas",
-    "label.storage": "Almacenamiento",
-    "label.storage.pool": "Pool de Almacenamiento",
-    "label.storage.tags": "Etiquetas de almacenamiento",
-    "label.storage.traffic": "Tráfico de Almacenamiento",
-    "label.storage.type": "Tipo de almacenamiento",
-    "label.subdomain.access": "Acceso al Subdominio",
-    "label.submit": "Enviar",
-    "label.submitted.by": "[Enviado por: <span id=\"submitted_by\"> </span>]",
-    "label.succeeded": "Resultó con éxito",
-    "label.sunday": "Domingo",
-    "label.super.cidr.for.guest.networks": "Super CIDR para Redes Invitado",
-    "label.supported.services": "Servicios Soportados",
-    "label.supported.source.NAT.type": "Tipo de Source NAT soportado",
-    "label.supportsstrechedl2subnet": "Soporta Subred Streched L2",
-    "label.supportspublicaccess": "Soporta Acceso Público",
-    "label.suspend.project": "Suspender Proyecto",
-    "label.switch.type": "Cambiar el tipo",
-    "label.system.capacity": "Capacidad del Sistema",
-    "label.system.offering": "Oferta de Sistema",
-    "label.system.offering.for.router": "Oferta de Sistema para Router",
-    "label.system.service.offering": "Oferta de Servicio de Sistema",
-    "label.system.service.offering.details": "Detalles de la oferta de servicio del sistema",
-    "label.system.vm": "MV de Sistema",
-    "label.system.vm.details": "Detalles de MV de Sistema",
-    "label.system.vm.scaled.up": "MV de Sistema Escaladas",
-    "label.system.vm.type": "Tipo de MV de sistema",
-    "label.system.vms": "MVs de Sistema",
-    "label.system.wide.capacity": "Capacidad total del sistema",
-    "label.tag.key": "Clave de Etiqueta",
-    "label.tag.value": "Valor de Etiqueta",
-    "label.tagged": "Etiquetada",
-    "label.tags": "Etiquetas",
-    "label.target.iqn": "IQN Objetivo",
-    "label.task.completed": "Tarea finalizada",
-    "label.template": "Plantilla",
-    "label.template.limits": "Límites Plantilla",
-    "label.tftp.root.directory": "Directorio raíz de TFTP",
-    "label.theme.default": "Tema Por Defecto",
-    "label.theme.grey": "Personalizado - Gris",
-    "label.theme.lightblue": "Personalizado - Azul",
-    "label.threshold": "Umbral",
-    "label.thursday": "Jueves",
-    "label.tier": "Tier",
-    "label.tier.details": "Detalles del Tier",
-    "label.time": "Tiempo",
-    "label.time.colon": "Tiempo:",
-    "label.time.zone": "Zona horaria",
-    "label.timeout": "Tiempo de espera",
-    "label.timeout.in.second ": " Timeout (segundos)",
-    "label.timezone": "Zona horaria",
-    "label.timezone.colon": "Zona Horaria:",
-    "label.token": "Token",
-    "label.total.CPU": "Total CPU",
-    "label.total.cpu": "Total CPU",
-    "label.total.hosts": "Total de Hosts",
-    "label.total.memory": "Memoria Total",
-    "label.total.of.ip": "Direcciones IP totales",
-    "label.total.of.vm": "MVs totales",
-    "label.total.storage": "Almacenamiento Total",
-    "label.total.virtual.routers": "Virtual Routers Totales",
-    "label.total.virtual.routers.upgrade": "Virtual Routers totales que requieren actualización",
-    "label.total.vms": "Total MVs",
-    "label.traffic.label": "Etiqueta de trafico",
-    "label.traffic.type": "Tipo de Tráfico",
-    "label.traffic.types": "Tipos de Tráfico",
-    "label.tuesday": "Martes",
-    "label.type": "Tipo",
-    "label.type.id": "ID de Tipo",
-    "label.type.lower": "tipo",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "Teclado UK",
-    "label.unavailable": "No disponible",
-    "label.unhealthy.threshold": "Fuera del Umbral Saludable",
-    "label.unlimited": "Ilimitado",
-    "label.untagged": "Sin etiquetar",
-    "label.update.project.resources": "Actualizar recursos del proyecto",
-    "label.update.ssl": " Certificado SSL",
-    "label.update.ssl.cert": " Certificado SSL",
-    "label.updating": "Actualizando",
-    "label.upgrade.required": "Requerida Actualización",
-    "label.upgrade.router.newer.template": "Actualizar Router para usar una Plantilla más Nueva",
-    "label.upload": "Subir",
-    "label.upload.from.local": "Subir desde Local",
-    "label.upload.iso.from.local":"Subir ISO desde Local",
-    "label.upload.template.from.local": "Subir Plantilla desde Local",
-    "label.upload.volume": "Subir volumen",
-    "label.upload.volume.from.local": "Subir un Volumen desde Local",
-    "label.upload.volume.from.url": "Subir un Volumen desde URL",
-    "label.url": "URL",
-    "label.usage.interface": "Interfaz de uso",
-    "label.usage.sanity.result": "Resultado del Uso Sanitizado",
-    "label.usage.server": "Servidor de Uso",
-    "label.usage.type": "Tipo de Uso",
-    "label.usage.unit": "Unidad",
-    "label.use.vm.ip": "Usar IP MV:",
-    "label.use.vm.ips": "Usar las IP de la MV",
-    "label.used": "Usado",
-    "label.user": "Usuario",
-    "label.user.data": "Datos de Usuario",
-    "label.user.details": "Detalles del Usuario",
-    "label.user.vm": "MV de Usuario",
-    "label.username": "Nombre de usuario",
-    "label.username.lower": "nombre de usuario",
-    "label.users": "Usuarios",
-    "label.vSwitch.type": "Tipo de vSwitch",
-    "label.value": "Valor",
-    "label.vcdcname": "nombre DC vCenter",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "Clúster vCenter ",
-    "label.vcenter.datacenter": "Centros de datos vCenter ",
-    "label.vcenter.datastore": "Almacén de datos vCenter",
-    "label.vcenter.host": "Anfitrión vCenter",
-    "label.vcenter.password": "Contraseña vCenter",
-    "label.vcenter.username": "Nombre de usuario vCenter",
-    "label.vcipaddress": "Dirección IP de vCenter",
-    "label.version": "Versión",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Resolución Máx",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs por GPU",
-    "label.vgpu.remaining.capacity": "Capacidad remanente",
-    "label.vgpu.type": "Tipo de vGPU",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Ver",
-    "label.view.all": "Ver todo",
-    "label.view.console": "Ver consola",
-    "label.view.more": "Ver más",
-    "label.view.secondary.ips": "Ver las IP secundarias",
-    "label.viewing": "Mirando",
-    "label.virtual.appliance": "Appliance Virtual",
-    "label.virtual.appliance.details": "Detalles del appliance Virtual",
-    "label.virtual.appliances": "Appliances Virtuales",
-    "label.virtual.machine": "Máquina virtual",
-    "label.virtual.machines": "Maquinas virtuales",
-    "label.virtual.network": "Red Virtual",
-    "label.virtual.networking": "Red Virtual",
-    "label.virtual.router": "Router Virtual",
-    "label.virtual.routers": "Routers Virtuales",
-    "label.virtual.routers.group.account": "Routers Virtuales agrupados por cuenta",
-    "label.virtual.routers.group.cluster": "Routers Virtuales agrupados por clúster",
-    "label.virtual.routers.group.pod": "Routers Virtuales agrupados por pod",
-    "label.virtual.routers.group.zone": "Router Virtuales agrupados por zona",
-    "label.vlan": "VLAN",
-    "label.vlan.id": "ID de VLAN/VNI",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "Rango VLAN/VNI",
-    "label.vlan.range.details": "Detalle de  Rango VLAN",
-    "label.vlan.ranges": "Rango(s) de VLAN",
-    "label.vlan.vni.range": "Rango VLAN/VNI",
-    "label.vlan.vni.ranges": "Rango(s) VLAN/VNI",
-    "label.vm.add": "Añadir Instancia",
-    "label.vm.destroy": "Destroy",
-    "label.vm.display.name": "Nombra a mostrar de la MV",
-    "label.vm.id": "ID de MV",
-    "label.vm.ip": "Dirección IP de la MV",
-    "label.vm.name": "Nombre MV",
-    "label.vm.password": "La Contraseña de la MV es",
-    "label.vm.reboot": "Reiniciar",
-    "label.vm.start": "Inicio",
-    "label.vm.state": "Estado de la MV",
-    "label.vm.stop": "Detener",
-    "label.vmfs": "VMFS",
-    "label.vms": "MVs",
-    "label.vmsnapshot": "Instantáneas de MV",
-    "label.vmsnapshot.current": "esLaActual",
-    "label.vmsnapshot.memory": "Instantánea de la memoria",
-    "label.vmsnapshot.parentname": "Padre",
-    "label.vmsnapshot.type": "Tipo",
-    "label.vmware.datacenter.id": "ID datacenter VMware",
-    "label.vmware.datacenter.name": "Nombre del datacenter VMware",
-    "label.vmware.datacenter.vcenter": "vcenter del datacenter VMware",
-    "label.vmware.traffic.label": "Etiqueta de tráfico VMware",
-    "label.vnet": "VLAN",
-    "label.vnet.id": "ID de VLAN",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "Dispositivo VNMC",
-    "label.volatile": "Volátil",
-    "label.volgroup": "Group de Volúmen",
-    "label.volume": "Volúmen",
-    "label.volume.details": "Detalles del Volumen",
-    "label.volume.limits": "Límites Volúmen",
-    "label.volume.migrated": "Volumen migrado",
-    "label.volume.name": "Nombre de Volumen",
-    "label.volumes": "Volúmenes",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Router Distribuido VPC",
-    "label.vpc.id": "ID VPC",
-    "label.vpc.offering": "Oferta de VPC",
-    "label.vpc.offering.details": "Detalles de las ofertas de VPC",
-    "label.vpc.router.details": "Detalles del Router VPC",
-    "label.vpc.supportsregionlevelvpc": "Soporte de VPC a Nivel de Región",
-    "label.vpc.virtual.router": "Router Virtual VPC",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "Gateway VPN del Cliente",
-    "label.vpn.force.encapsulation": "Forzar la encapsulación UDP de los paquetes ESP",
-    "label.vsmctrlvlanid": "VLAN ID de Control",
-    "label.vsmpktvlanid": "Packet VLAN ID",
-    "label.vsmstoragevlanid": "VLAN ID del Almacenamiento",
-    "label.vsphere.managed": "vSphere Gestionado",
-    "label.vswitch.name": "Nombre del vSwitch",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "ID de VXLAN",
-    "label.vxlan.range": "Rango VXLAN",
-    "label.waiting": "Esperando",
-    "label.warn": "Advertir",
-    "label.warn.upper": "WARN",
-    "label.warning": "Advertencia",
-    "label.wednesday": "Miércoles",
-    "label.weekly": "Semanal",
-    "label.welcome": "Bienvenido",
-    "label.welcome.cloud.console": "Bienvenido a la consola de administración",
-    "label.what.is.cloudstack": "Que es CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Versión Original XS es 6.1+",
-    "label.xenserver.traffic.label": "Etiqueta de tráfico XenServer",
-    "label.yes": "Sí",
-    "label.zone": "Zona",
-    "label.zone.dedicated": "Zona Dedicada",
-    "label.zone.details": "Detalles de Zona",
-    "label.zone.id": "Zona de identificación",
-    "label.zone.lower": "Zona",
-    "label.zone.name": "Nombre de la Zona",
-    "label.zone.step.1.title": "Paso 1: <strong> Seleccione una red </strong>",
-    "label.zone.step.2.title": "Paso 2: <strong>Añadir una zona </strong>",
-    "label.zone.step.3.title": "Paso 3: <strong>Añadir un pod </strong>",
-    "label.zone.step.4.title": "Paso 4: <strong>Añadir un rango IP </strong>",
-    "label.zone.type": "Tipo de Zona",
-    "label.zone.wide": "Zona para todo el",
-    "label.zoneWizard.trafficType.guest": "Guest: Tráfico entre las máquinas virtuales de usuario final",
-    "label.zoneWizard.trafficType.management": "Management: Tráfico entre los recursos internos de CloudStack, incluyendo cualquier componente que se comunique con el Servidor de Gestión, tales como anfitriones y las MVs de Sistema del propio Cloudstack",
-    "label.zoneWizard.trafficType.public": "Public: Tráfico entre internet y las máquinas virtuales en el cloud.",
-    "label.zoneWizard.trafficType.storage": "Almacenamiento: Tráfico entre los servidores de almacenamiento primario y secundario, tales como plantillas de MV e instantáneas",
-    "label.zones": "Zona",
-    "managed.state": "Estado Gestionado",
-    "message.XSTools61plus.update.failed": "La actualización falló, la versión original de XS es 6.1+. Error:",
-    "message.Zone.creation.complete": "Creación de la zona completada",
-    "message.acquire.ip.nic": "Por favor confirme que desea adquirir una IP secundaria nueva para esta NIC.<br/>NOTA: Las direcciones IP secundarios adquiridas deben ser configuradas manualmente desde la máquina virtual.",
-    "message.acquire.new.ip": "Por favor confirme que usted quiere adquirir una nueva IP para esta red",
-    "message.acquire.new.ip.vpc": "Por favor confirme que usted desea adquirir una nueva IP para este VPC.",
-    "message.acquire.public.ip": "Por favor seleccione una zona de la que desea adquirir su nueva IP.",
-    "message.action.cancel.maintenance": "Se ha emitido la cancelación del mantenimiento del anfitrión de forma correcta. Este proceso puede llevar hasta varios minutos.",
-    "message.action.cancel.maintenance.mode": "Por favor, confirme que desea cancelar el mantenimiento",
-    "message.action.change.service.warning.for.instance": "Su instancia debe estar apagada antes de intentar el cambio de la oferta de servicio activa.",
-    "message.action.change.service.warning.for.router": "Su router debe estar apagado antes de intentar el cambio de la oferta de servicio activa.",
-    "message.action.delete.ISO": "Por favor, confirme que desea eliminar esta ISO",
-    "message.action.delete.ISO.for.all.zones": "La ISO es utilizado por todas las zonas. Por favor, confirme que desea eliminar de todas las zonas.",
-    "message.action.delete.cluster": "Por favor, confirme que desea eliminar del clúster",
-    "message.action.delete.disk.offering": "Por favor, confirme que desea eliminar esta Oferta de Disco",
-    "message.action.delete.domain": "Por favor, confirme que desea eliminar este dominio",
-    "message.action.delete.external.firewall": "Por favor, confirme que desea quitar este firewall externo. Advertencia: Si usted está planeando volver a agregar el mismo firewall externo mismo, debe restablecer los datos de uso en el dispositivo.",
-    "message.action.delete.external.load.balancer": "Por favor, confirme que desea eliminar este balanceador de carga externa. Advertencia: Si usted está planeando volver a agregar el mismo balanceador de carga externo, debe restablecer los datos de uso en el dispositivo.",
-    "message.action.delete.ingress.rule": "Por favor, confirme que desea eliminar la regla de Entrada",
-    "message.action.delete.network": "Por favor, confirme que desea eliminar esta red",
-    "message.action.delete.nexusVswitch": "Porfavor confirme que usted quiere eliminar este Nexus 1000v",
-    "message.action.delete.nic": "Por favor, confirme que desea quitar esta NIC, lo que hará que también se quite la red asociada de la MV.",
-    "message.action.delete.physical.network": "Por favor confirme que desea borrar esta red física",
-    "message.action.delete.pod": "Por favor, confirme que desea eliminar este pod.",
-    "message.action.delete.primary.storage": "Por favor, confirme que desea eliminar este almacenamiento primario",
-    "message.action.delete.secondary.storage": "Por favor, confirme que desea eliminar este almacenamiento secundario",
-    "message.action.delete.security.group": "Por favor, confirme que desea eliminar este grupo de seguridad",
-    "message.action.delete.service.offering": "Por favor, confirme que desea eliminar esta oferta de servicio",
-    "message.action.delete.snapshot": "Por favor, confirme que desea eliminar esta instantánea",
-    "message.action.delete.system.service.offering": "Por favor confirme que desea borrar esta oferta de servicio de sistema",
-    "message.action.delete.template": "Por favor, confirme que desea eliminar esta plantilla",
-    "message.action.delete.template.for.all.zones": "La plantilla es utilizada por todas las zonas. Por favor, confirme que desea eliminarla de todas las zonas.",
-    "message.action.delete.volume": "Por favor, confirme que desea eliminar este volumen",
-    "message.action.delete.zone": "Por favor, confirme que desea eliminar esta Zona. ",
-    "message.action.destroy.instance": "Por favor, confirme que desea destruir esta Instancia.",
-    "message.action.destroy.systemvm": "Por favor, confirme que desea destruir esta MV de Sistema.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Por favor, confirme que desea deshabilitar este clúster.",
-    "message.action.disable.nexusVswitch": "Por favor confirme que usted quiere deshabilitar este nexus 1000v",
-    "message.action.disable.physical.network": "Por favor confirmar que usted quiere deshabilitar esta red física",
-    "message.action.disable.pod": "Por favor, confirme que desea desactivar este Pod.",
-    "message.action.disable.static.NAT": "Por favor, confirme que desea desactivar el NAT estático.",
-    "message.action.disable.zone": "Por favor, confirme que desea desactivar esta zona.",
-    "message.action.download.iso": "Por favor confirme que usted quiere descargar esta ISO",
-    "message.action.download.template": "Por favor confirme que usted quiere descargar esta plantilla.",
-    "message.action.downloading.template": "Descargando plantilla.",
-    "message.action.enable.cluster": "Por favor, confirme que desea habilitar este clúster.",
-    "message.action.enable.maintenance": "Su anfitrión ha sido preparado para Mantenimiento correctamente. Este proceso puede llevar varios minutos o más dependiendo de cuantas MVs están corriendo actualmente en este anfitrión. ",
-    "message.action.enable.nexusVswitch": "por favor confirme que usted quiere habilitar este nexus 1000v",
-    "message.action.enable.physical.network": "Por favor confirmar que usted quiere habilitar esta red física",
-    "message.action.enable.pod": "Por favor, confirme que desea habilitar este Pod. ",
-    "message.action.enable.zone": "Por favor, confirme que desea habilitar esta zona.",
-    "message.action.expunge.instance": "Por favor confirme que desea purgar esta instancia.",
-    "message.action.force.reconnect": "Se ha iniciado correctamente la reconexión forzada de su anfitrión. Este proceso puede tardar hasta varios minutos.",
-    "message.action.host.enable.maintenance.mode": "Habilitar el modo mantenimiento causará la migración en vivo de todas las instancias en ejecución de este anfitrión a otro cualquiera disponible.",
-    "message.action.instance.reset.password": "Por favor, confirmar que desea cambiar la contraseña de ROOT para esta máquina virtual.",
-    "message.action.manage.cluster": "Por favor, confirme que desea administrar el Clúster.",
-    "message.action.primarystorage.enable.maintenance.mode": "Advertencia: colocar el almacenamiento principal en modo de mantenimiento hará que todas las MV que utilicen volúmenes de éste se paren. ¿Desea continuar? ",
-    "message.action.reboot.instance": "Por favor, confirme que desea reiniciar esta Instancia.",
-    "message.action.reboot.router": "Todos los servicios provistos por este router virtual serán interrumpidos. Por favor confirmar que desea reiniciarlo.",
-    "message.action.reboot.systemvm": "Por favor, confirme que desea reiniciar esta MV de Sistema.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Por favor, confirme que desea liberar esta IP ",
-    "message.action.remove.host": "Por favor confirme que desea borrar este anfitrión.",
-    "message.action.reset.password.off": "Su instancia no soporta esta característica actualmente.",
-    "message.action.reset.password.warning": "Su instancia debe ser detenida antes de intentar cambiar la contraseña actual.",
-    "message.action.restore.instance": "Por favor, confirme que desea restaurar esta Instancia.",
-    "message.action.revert.snapshot": "Por favor confirme que desea revertir el volumen elegido a esta instantánea.",
-    "message.action.start.instance": "Por favor, confirme que desea iniciar la instancia",
-    "message.action.start.router": "Por favor, confirme que desea iniciar este Router.",
-    "message.action.start.systemvm": "Por favor, confirme que desea iniciar esta MV de Sistema.",
-    "message.action.stop.instance": "Por favor, confirme que desea detener esta Instancia.",
-    "message.action.stop.router": "Todos los servicios provistos por este router virtual serán interrumpidos. Por favor confirmar que desea apagarlo.",
-    "message.action.stop.systemvm": "Por favor, confirme que desea detener esta MV de Sistema. ",
-    "message.action.take.snapshot": "Por favor, confirme que desea tomar una instantánea de este volúmen.",
-    "message.action.snapshot.fromsnapshot":"Por favor, confirme que desea tomar una instantánea de este instantánea VM.",
-    "message.action.unmanage.cluster": "Por favor, confirme que desea dejar de gestionar el Clúster.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Por favor confirme que desea borrar esta instantánea de la MV.",
-    "message.action.vmsnapshot.revert": "Revertir instantánea de MV",
-    "message.activate.project": "Usted esta seguro que quiere activar este proyecto?",
-    "message.add.VPN.gateway": "Por favor confirme que usted quiere agregar un VPN Gateway",
-    "message.add.cluster": "Añadir un Clúster gestionado de hipervisor para la zona <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Añadir un Clúster gestionado de hipervisor para la zona <b> zona <span id=\"zone_name\"> </span> </b>",
-    "message.add.disk.offering": "Por favor, especifique los parámetros siguientes para agregar una nueva Oferta de Disco",
-    "message.add.domain": "por favor especifique el subdominio que usted quiere crear bajo este dominio",
-    "message.add.firewall": "Añadir un Firewall a la Zona",
-    "message.add.guest.network": "Por favor confirme que desea agregar una red de invitado",
-    "message.add.host": "Por favor, especifique los parámetros siguientes para agregar un nuevo Anfitrión.",
-    "message.add.ip.range": "Añadir un rango de IP a la red pública en la zona",
-    "message.add.ip.range.direct.network": "Añadir un rango IP a la red directa <b><span id=\"directnetwork_name\"></span></b> en Zona <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p> Añadir un rango IP al Pod: <b><span id=\"pod_name_label\"> </span> </b> </p> ",
-    "message.add.load.balancer": "Añadir un balanceador de carga a la zona ",
-    "message.add.load.balancer.under.ip": "La regla balanceo de carga ha sido agregada bajo la IP:",
-    "message.add.network": "Agregar una nueva red para la zona: <b><span id=\"zone_name\"> </span> </b>",
-    "message.add.new.gateway.to.vpc": "Por favor especifique la información necesaria para agregar un nuevo gateway a este VPC.",
-    "message.add.pod": "Añadir un nuevo Pod a la zona <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Cada zona debe contener uno o más pods, y agregaremos el primero ahora. Un pod contiene anfitriones y servidores de almacenamiento primario, los cuales se agregaran en un paso posterior. Primero, configure un rango de direcciones IP reservadas para el tráfico interno de gestión utilizado por CloudStack's. El rango de IP reservado debe ser único para cada zona en el cloud.",
-    "message.add.primary": "Por favor, especifique los parámetros siguientes para agregar un nuevo almacenamiento primario",
-    "message.add.primary.storage": "Añadir un nuevo Almacenamiento Primario a la zona <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Por favor especifique la información requerida para agregar una nueva región.",
-    "message.add.secondary.storage": "Añadir un nuevo almacenamiento de <b> zona <span id=\"zone_name\"> </span> </b>",
-    "message.add.service.offering": "Por favor, rellene los siguientes datos para agregar una nueva oferta de servicio.",
-    "message.add.system.service.offering": "Por favor complete los siguientes datos para agregar un nueva oferta de servicio de sistema.",
-    "message.add.template": "Por favor ingrese los siguientes datos para crear la nueva plantilla",
-    "message.add.volume": "Por favor, rellene los siguientes datos para agregar un nuevo volumen.",
-    "message.added.vpc.offering": "Oferta VPC agregada",
-    "message.adding.Netscaler.device": "Agregando un dispositivo NetScaler",
-    "message.adding.Netscaler.provider": "Agregando un proveedor NetScaler",
-    "message.adding.host": "Agregando un anfitrión",
-    "message.additional.networks.desc": "Por favor seleccione red(es) adicional(es) a las cuales estará conectada la instancia virtual.",
-    "message.admin.guide.read": "Para MV basadas en VMware, lea por favor el capítulo de escalado dinámico en la guía de administración antes de escalar. ¿Desea continuar?",
-    "message.advanced.mode.desc": "Seleccione este modelo de red si desea habilitar soporte VLAN. Este modelo de red proporciona la máxima flexibilidad al permitir a los administradores proporcionar ofertas personalizadas de la red como el suministro de firewall, VPN, o balanceador de carga, así­ como red directa vs virtual. ",
-    "message.advanced.security.group": "Elija esta opción si desea utilizar grupos de seguridad para proporcionar aislamiento de MV invitada.",
-    "message.advanced.virtual": "Elija esta opción si desea utilizar VLAN de extensión de zona para proporcionar el aislamiento MV invitado.",
-    "message.after.enable.s3": "Almacenamiento Secundario sobre S3 configurado. Nota: Cuando salga de esta página, no podrá volver a reconfigurar S3 nuevamente.",
-    "message.after.enable.swift": "Swift configurado. Nota: Cuando salga de esta página, no podrá volver a reconfigurar Swift nuevamente.",
-    "message.alert.state.detected": "Estado de Alerta detectado",
-    "message.allow.vpn.access": "Por favor, introduzca un nombre de usuario y la contraseña del usuario al que desea permitir el acceso de VPN.",
-    "message.apply.snapshot.policy": "Ha actualizado su política de instantáneas actual.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Por favor, confirme que desea conectar el ISO a la instancia virtual",
-    "message.attach.volume": "Por favor, rellene los siguientes datos para conectar un nuevo volumen. Si está conectando un volumen de disco a una máquina virtual basada en Windows, deberá reiniciar la instancia para ver el disco conectado.",
-    "message.basic.mode.desc": "Seleccione este modelo de red si * <b> no <u> </u> * </b> desea habilitar cualquier soporte VLAN. Todas las instancias virtuales creados en virtud de este modelo de red se le asignará una dirección IP directamente desde la red y se utilizarán grupos de seguridad para proporcionar la seguridad y la segregación.",
-    "message.change.ipaddress": "Por favor confirme que desea cambiar la dirección IP de esta NIC en la MV.",
-    "message.change.offering.confirm": "Por favor, confirme que desea cambiar la oferta de servicio de la instancia virtual.",
-    "message.change.password": "Por favor cambie la contraseña.",
-    "message.cluster.dedicated": "Clúster Dedicado",
-    "message.cluster.dedication.released": "Eliminada la Dedicación del Clúster ",
-    "message.configure.all.traffic.types": "Tiene multiples redes físicas, por favor configure las etiquetas para cada tipo de tráfico haciendo click en el botón de Editar.",
-    "message.configure.firewall.rules.allow.traffic": "Configurar las reglas para permitir Tráfico",
-    "message.configure.firewall.rules.block.traffic": "Configurar las reglas para bloquear Tráfico",
-    "message.configure.ldap": "Por favor confirme que desea configurar LDAP.",
-    "message.configuring.guest.traffic": "Configurando el tráfico de Invitado",
-    "message.configuring.physical.networks": "Configurando las redes físicas",
-    "message.configuring.public.traffic": "Configurando el tráfico público",
-    "message.configuring.storage.traffic": "Configurando el tráfico de almacenamiento",
-    "message.confirm.action.force.reconnect": "Por favor confirme que desea forzar la reconexión de este servidor",
-    "message.confirm.add.vnmc.provider": "Por favor confirme que desea agregar el proveedor VNMC.",
-    "message.confirm.archive.alert": "Por favor confirme que desea archivar esta alerta.",
-    "message.confirm.archive.event": "Por favor confirme que desea archivar este evento.",
-    "message.confirm.archive.selected.alerts": "Por favor confirme que desea archivar las alertas seleccionadas",
-    "message.confirm.archive.selected.events": "Por favor confirme que desea archivar los eventos seleccionados",
-    "message.confirm.attach.disk": "¿ Está seguro que desea conectar el disco?",
-    "message.confirm.create.volume": "¿Está seguro que desea crear un volumen?",
-    "message.confirm.current.guest.CIDR.unchanged": "¿Desea mantener el CIDR de la red guest actual sin cambios?",
-    "message.confirm.dedicate.cluster.domain.account": "¿Realmente desea dedicar este cluster al dominio/cuenta?",
-    "message.confirm.dedicate.host.domain.account": "¿Desea dedicar este hosts a un dominio/cuenta?",
-    "message.confirm.dedicate.pod.domain.account": "¿Desea dedicar este por a un dominio/cuenta?",
-    "message.confirm.dedicate.zone": "¿Realmente quiere dedicar esta zona a un domino/cuenta?",
-    "message.confirm.delete.BigSwitchBcf": "Por favor confirme que desa borrar este Controlador BigSwitch BCF",
-    "message.confirm.delete.BrocadeVcs": "Por favor confirme que desa borrar este Switch Brocade Vcs",
-    "message.confirm.delete.F5": "Por  favor confirme que quiere eliminar el F5",
-    "message.confirm.delete.NetScaler": "Por favo confirme que desa borrar este NetScaler",
-    "message.confirm.delete.PA": "Por favor confirme que desa borrar este Palo Alto",
-    "message.confirm.delete.SRX": "Por favor confirme que desa borrar este SRX",
-    "message.confirm.delete.acl.list": "¿Esta seguro que desea borrar esta lista de ACL?",
-    "message.confirm.delete.alert": "¿Está seguro que desea borrar esta alerta?",
-    "message.confirm.delete.baremetal.rack.configuration": "Por favor confirme que desea borrar la configuración del Rack Baremetal.",
-    "message.confirm.delete.ciscoASA1000v": "Por favor confirme que desea borrar CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Por favor confirme que desea borrar el recurso CiscoVNMC",
-    "message.confirm.delete.internal.lb": "Por favor confirme que desea borrar este LB Interno",
-    "message.confirm.delete.secondary.staging.store": "Por favor confirme que desea borrar el Almacenamiento Secundario Temporal.",
-    "message.confirm.delete.ucs.manager": "Por favor confirme que desea borrar el UCS Manager",
-    "message.confirm.destroy.router": "Por favor confirme que desa borrar este router",
-    "message.confirm.disable.host": "Por favor confirme que desea deshabitar este servidor",
-    "message.confirm.disable.network.offering": "¿Esta seguro que desea deshabilitar esta oferta de red?",
-    "message.confirm.disable.provider": "Por favor confirme que desea deshabitar este proveedor",
-    "message.confirm.disable.vnmc.provider": "Por favor confirme que desea deshabitar el proveedor VNMC.",
-    "message.confirm.disable.vpc.offering": "¿Esta seguro que desea deshabitar esta oferta de VPC?",
-    "message.confirm.enable.host": "Por favor confirme que desea habilitar este servidor",
-    "message.confirm.enable.network.offering": "¿Esta seguro que desea habilitar esta oferta de red?",
-    "message.confirm.enable.provider": "Por favor confirme que desea habilitar este proveedor",
-    "message.confirm.enable.vnmc.provider": "Por favor confirme que desea habilitar el proveedor VNMC.",
-    "message.confirm.enable.vpc.offering": "¿Esta seguro que desea habilitar esta oferta de VPC?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "por favor confirme que usted desea unirse a este proyecto.",
-    "message.confirm.migrate.volume": "¿Quiere migrar este volumen?",
-    "message.confirm.refresh.blades": "Por favor confirme que desea refrescar los blades.",
-    "message.confirm.release.dedicate.vlan.range": "Por favor confirme que desea liberar este rango dedicado de VLAN",
-    "message.confirm.release.dedicated.cluster": "¿ Desea liberar este clúster dedicado?",
-    "message.confirm.release.dedicated.host": "¿Desea liberar este servidor dedicado?",
-    "message.confirm.release.dedicated.pod": "¿Desea liberar este pod dedicado?",
-    "message.confirm.release.dedicated.zone": "¿Desea liberar esta zona dedicada?",
-    "message.confirm.remove.IP.range": "Por favor confirme que desea quitar este rango IP.",
-    "message.confirm.remove.event": "¿Está seguro que desea quitar este evento?",
-    "message.confirm.remove.load.balancer": "Por favor confirme que desea quitar esta MV del balanceador de carga",
-    "message.confirm.remove.network.offering": "¿Esta seguro que desea quitar esta oferta de red?",
-    "message.confirm.remove.selected.alerts": "Por favor confirme que desea quitar las alertas seleccionadas",
-    "message.confirm.remove.selected.events": "Por favor confirme que desea quitar los eventos seleccionados",
-    "message.confirm.remove.vmware.datacenter": "Por favor confirme que desea quitar el datacenter VMware",
-    "message.confirm.remove.vpc.offering": "¿Esta seguro que desea quitar esta oferta de VPC?",
-    "message.confirm.replace.acl.new.one": "¿Desea reemplazar este ACL con uno nuevo?",
-    "message.confirm.scale.up.router.vm": "¿Desea escalar la MV utilizada como Router?",
-    "message.confirm.scale.up.system.vm": "¿Desea escalar esta MV de Sistema?",
-    "message.confirm.shutdown.provider": "Por favor confirme que desea apagar ester proveedor",
-    "message.confirm.start.lb.vm": "Por favor confirme que desea iniciar esta MV de LB",
-    "message.confirm.stop.lb.vm": "Por favor confirme que desea parar esta MV de LB",
-    "message.confirm.upgrade.router.newer.template": "Por favor confirme que desea actualizar el router con una plantilla nueva",
-    "message.confirm.upgrade.routers.account.newtemplate": "Por favor confirme que desea actualizar todos los routers de esta cuenta con una plantilla nueva",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Por favor confirme que desea actualizar todos los routers de este cluster con una plantilla nueva",
-    "message.confirm.upgrade.routers.newtemplate": "Por favor confirme que desea actualizar todos los routers de esta zona con una plantilla nueva",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Por favor confirme que desea actualizar todos los routers de este pod con una plantilla nueva",
-    "message.copy.iso.confirm": "Por favor, confirme que desea copiar el ISO a",
-    "message.copy.template": "Copia plantilla <b id=\"copy_template_name_text\"> XXX </b> de la zona <b id=\"copy_template_source_zone_text\"> </b>",
-    "message.copy.template.confirm": "¿Desea copiar esta plantilla?",
-    "message.create.template": "Esta seguro que quiere crear una plantilla?",
-    "message.create.template.vm": "Crear MV de la plantilla <b id=\"p_name\"> </b>",
-    "message.create.template.volume": "Por favor, especifique la siguiente información antes de crear una plantilla de su volumen de disco: <b> <span id=\"volume_name\"> </span> </b>. Creación de la plantilla puede oscilar entre varios minutos más, dependiendo del tamaño del volumen.",
-    "message.creating.cluster": "Creando cluster",
-    "message.creating.guest.network": "Creando red de invitado",
-    "message.creating.physical.networks": "Creando redes físicas",
-    "message.creating.pod": "Creando pod",
-    "message.creating.primary.storage": "Creando almacenamiento primario",
-    "message.creating.secondary.storage": "Creando almacenamiento secundario",
-    "message.creating.systemVM": "Creando MVs de sistema (esto puede llevar un rato)",
-    "message.creating.zone": "Creando zona",
-    "message.decline.invitation": "¿Está segura que desea rechazar esta invitación al proyecto?",
-    "message.dedicate.zone": "Dedicando zona",
-    "message.dedicated.zone.released": "Dedicación de zona liberada",
-    "message.delete.VPN.connection": "Por favor confirme que usted quiere eliminar la conexión VPN",
-    "message.delete.VPN.customer.gateway": "Por favor confirme que desea borrar esta VPN Customer Gateway",
-    "message.delete.VPN.gateway": "Por favor confirme que usted quiere eliminar este VPN Gateway",
-    "message.delete.account": "Por favor, confirme que desea eliminar esta cuenta.",
-    "message.delete.affinity.group": "Por favor confirme que desea remover este grupo de afinidad.",
-    "message.delete.gateway": "Por favor confirme que usted quiere eliminar este gateway",
-    "message.delete.project": "Esta seguro que quiere eliminar este proyecto?",
-    "message.delete.user": "Por favor confirme que usted quiere eliminar este usuario",
-    "message.desc.add.new.lb.sticky.rule": "Agregar nueva regla Sticky al LB",
-    "message.desc.advanced.zone": "Para topologia de redes más sofisticadas. Este modelo de red provee la mayor flexibilidad para definir redes de invitado y proveyendo ofertas de redes personalizadas tales como firewall, VPN, o soporte de balanceador de carga.",
-    "message.desc.basic.zone": "Provee una red única donde cada instancia de MV es asignada una IP directamente de la red. El aislamiento de Invitado puede proveerse por medio de mecanismos de capa 3 tales como los grupos de seguridad (filtrado de direcciones IP por origen).",
-    "message.desc.cluster": "Cada pod debe contener uno o más clusters; ahora agregaremos el primero. Un clúster proporciona una forma de agrupar anfitriones. Los anfitriones de un clúster deben tener idéntico hardware, ejecutar el mismo hipervisor, estar en la misma subred y utilizar el mismo almacenamiento compartido. Cada clúster consiste en uno o más anfitriones y uno o más servidores de almacenamiento primario.",
-    "message.desc.create.ssh.key.pair": "Por favor completar los siguientes datos para crear o registrar un par de claves ssh.<br/><br/>1. Si la clave pública esta definida, CloudStack la registrará. Uds puede usarla por medio de la clave privada.<br/><br/>2. Si la clave pública no esta definida, CloudStack creará un nuevo Par de Claves SSH. En este caso, por favor copie y grabé la clave privada. CloudStack no la almacenará.<br/>",
-    "message.desc.created.ssh.key.pair": "Par de Claves SSH creadas.",
-    "message.desc.host": "Cada clúster debe contener por lo menos un anfitrión (servidor) para que se ejecuten las MVs Invitado en éste; agregaremos el primer anfitrión ahora. Para que un anfitrión funcione en CloudStack, se debe instalar el software del hypervisor, asignarle una IP al host en la red de Gestión y asegurarse de que éste conecta correctamente con servidor de gestión de CloudStack.<br/><br/>Indicar el nombre DNS del anfitrión o su dirección IP, el nombre del usuario (usualmente root), su contraseña y las etiquetas necesarias para catalogar a los anfitriones.",
-    "message.desc.primary.storage": "Cada clúster debe contener uno o más servidores primarios de almacenamiento, y ahora se agregará el primero. El almacenamiento primario contiene los volúmenes de disco para todas las MVs en ejecución en los anfitriones del clúster. Utilice cualquier protocolo estándar que soporte el hipervisor.",
-    "message.desc.reset.ssh.key.pair": "Pro favor especifique el par de claves ssh que desea agregar a esta MV. Tenga en cuenta que la clave de root será cambiada al realizar esta operación si la opción de contraseña esta habilitada.",
-    "message.desc.secondary.storage": "Cada zona debe tener al menos un servidor de NFS secundario, y se agregará el primero ahora. El almacenamiento secundario guarda las plantillas de MV, las imágenes ISO, y las instantaneas de volumentes. Este server debe estar disponible a todos los hosts de la zona.<br/><br/>Complete con la dirección IP y el PATH exportado",
-    "message.desc.zone": "Una zona es la unidad organizacional más grande en CloudStack, y típicamente se corresponde con un datacenter en particular. Las Zonas proveen aislamiento físico y redundancia. Una zona consiste de uno o más pod (cada uno conteniendo servidores y almacenamiento primario), junto con el almacenamiento secundario que es compartido entre todos los pods en la zona",
-    "message.detach.disk": "¿ Está seguro que desea desconectar este disco?",
-    "message.detach.iso.confirm": "Por favor, confirme que desea quitar la ISO de la instancia virtual",
-    "message.disable.account": "Por favor confirmar que desea deshabitar esta cuenta. Al hacerlo, todos los usuarios pertenecientes a ella dejaran de tener acceso a los recursos de cloud. Todas las máquinas virtuales en ejecución serán apagadas de forma inmediata.",
-    "message.disable.snapshot.policy": "Ha desactivado su política de instantáneas actual.",
-    "message.disable.user": "Por favor confirme que quiere deshabilitar este usuario",
-    "message.disable.vpn": "Esta seguro que usted quiere deshabilitar la VPN?",
-    "message.disable.vpn.access": "Por favor, confirme que desea desactivar VPN de acceso.",
-    "message.disabling.network.offering": "Deshabilitar oferta de red",
-    "message.disabling.vpc.offering": "Deshabilitando oferta VPC",
-    "message.disallowed.characters": "Caracteres no permitidos: <,>",
-    "message.download.ISO": "Por favor haga click <a href=\"#\">00000</a>para descargar la ISO",
-    "message.download.template": "Por favor haga click <a href=\"#\">00000</a>para descargar la plantilla",
-    "message.download.volume": "Por favor, haga clic <a href=\"#\">00000</a> para bajar el volumen",
-    "message.download.volume.confirm": "Por favor confirme que desea descargar este volumen.",
-    "message.edit.account": "Editar (\"-1\" indica que no hay limite a la cantidad de recursos creados)",
-    "message.edit.confirm": "Por favor confirme sus cambios antes de pulsar en \"Grabar\".",
-    "message.edit.limits": "Por favor, especifique los límites de los recursos siguientes. A \"-1\" indica que no hay límite a la cantidad de los recursos de crear.",
-    "message.edit.traffic.type": "Por favor indique la etiqueta de tráfico que desea asociar con este tipo de tráfico.",
-    "message.enable.account": "Por favor, confirme que desea habilitar esta cuenta.",
-    "message.enable.user": "Por favor confirme que usted quiere habilitar este usuario",
-    "message.enable.vpn": "Por favor, confirme que desea habilitar el Acceso Remoto VPN para esta dirección IP.",
-    "message.enable.vpn.access": "VPN está desactivado actualmente para esta dirección IP. ¿Querría hablitar el acceso VPN?",
-    "message.enabled.vpn": "Su acceso a la VPN está habilitado y se puede acceder a través de la IP",
-    "message.enabled.vpn.ip.sec": "La clave pre-compartida IPSec es",
-    "message.enabling.network.offering": "Habilitar oferta de red",
-    "message.enabling.security.group.provider": "Habilitando el proveedor de Grupos de Seguridad",
-    "message.enabling.vpc.offering": "Habilitando oferta VPC",
-    "message.enabling.zone": "Habilitando zona",
-    "message.enabling.zone.dots": "Habilitando zona...",
-    "message.enter.seperated.list.multiple.cidrs": "Por favor ingrese una lista separada por comas de los CIDRs si son más de uno",
-    "message.enter.token": "Por favor ingrese el token que recibió en la invitación por e-mail.",
-    "message.generate.keys": "Por favor confirme que usted quiere generar nueva llave para este usuario.",
-    "message.gslb.delete.confirm": "Por favor confirme que desea borrar este GSLB",
-    "message.gslb.lb.remove.confirm": "Por favor confirme que desea quitar el balanceo de carga GSLB",
-    "message.guest.traffic.in.advanced.zone": "El tráfico de red invitado se refiere a la comunicación entre las máquinas virtuales del usuario final. Especifique un rango de VLAN IDs para transportar este tráfico para cada red física.",
-    "message.guest.traffic.in.basic.zone": "El tráfico de las redes invitado es el generado entre las máquina virtuales del usuario final. Especifique un rango de direcciones IP para que CloudStack pueda asignar a las MVs Invitado. Aseguresé que este rango no se solape con el rango IP reservado para el sistema.",
-    "message.host.dedicated": "Servidor Dedicado",
-    "message.host.dedication.released": "Dedicación de Servidor liberada",
-    "message.installWizard.click.retry": "Haz click en el botón para re-intentar el lanzamiento.",
-    "message.installWizard.copy.whatIsACluster": "Un cluster provee una forma de agrupar los servidores. Todos los servidores que componen el cluster tienen un hardware idéntico, ejecutan el mismo hipervisor, están en la misma subred y utilizan el mismo almacenamiento compartido. Las instancias de máquinas virtuales (MVs) pueden migrarse en caliente desde un servidor a otro dentro del mismo cluster, sin interrupción del servicio del usuario. Un cluster es la tercera forma organizacional en una instalación de CloudStack&#8482; . Los clústers están contenidos dentro de los pods, los pods estar contenidos en las zonas.<br/><br/>CloudStack&#8482;  permite múltiple clusters en una instalación de cloud, pero para realizar una instalación básica, solo necesitamos uno.",
-    "message.installWizard.copy.whatIsAHost": "Un servidor es una sola computadora. Los Servidores proveen los recursos de óomputo necesarios para ejecutar las máquinas virtuales. Cada servidor tiene un hipervisor instalado para gestionar las MVs invitado (excepto en los servidores baremetal, los cuales son un caso especial que se explica en la Guía de Administración Avanzada). Por ejemplo, un servidor Linux con KVM habilitado, un servidor con Citrix XenServer o un servidor con ESXi. En una instalación Basica, usaremos un solo servidor ejecutando XenServer o KVM. <br/><br/>El servidor es la mínima unidad organizacional de CloudStack&#8482; .Los servidores están contenidos dentro de los clústers, los clústers en los pods, y estos últimos en las zonas.",
-    "message.installWizard.copy.whatIsAPod": "Un pod representa generalmente un solo rock. Los servidores en el mismo pod estarán en la misma subred.<br/><br/>El pod es la segunda agrupación organizacional dentro de CloudStack&#8482; .Los Pod están contenidos dentro de la zona. Cada zona puede contener uno más pods. En la instalación Básica, solo se necesita tener un pod en la zona.",
-    "message.installWizard.copy.whatIsAZone": "Una zona es la unidad organizacional más grande dentro de una instalación de CloudStack&#8482;. Una zona tipicamente se corresponde a un solo centro de datos, sin embargo esta permitido contar con varias zonas dentro del mismo centro de datos. El beneficio de organizar la infraestructura en zonas es que provee aislamiento físico y redundancia. Por ejemplo, cada zona puede tener su propia fuente de alimentación y uplink de red, ademas de poder estar separadas geográficamente en grandes distancias (lo cual no es obligatorio).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 es una plataforma de software que aglutina recursos cómputo para construir Infraestructuras como Servicio (IaaS), tanto de cloud público como privado e híbrido.\nCloudStack&#8482 gestiona la red, el almacenamiento y los nodos de cómputo que conforma la infraestructura de cloud. Se puede usar CloudStack&#8482 para desplegar, gestionar y configurar entornos de computación en la nube.<br/><br/> Cloudstack&#8482 vamás allá del manejo individual de máquinas virtuales en hardware de propósito general, ya que proporciona una solución llave en mano para desplegar datacenters como servicio - proporcionando todos los componentes esenciales para construir, desplegar y gestionar aplicaciones cloud multi-tier y multi-tenant. Se ofrecen dos versiones, la open source y la Premium, brindando la primera características casi idénticas.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "La infraestrucutra cloud de CloudStack&#8482 hace uso de dos tipos de almacenamiento, el primario y el secundario. Ambos pueden ser iSCSI, NFS o discos locales. <br/><br/>El <strong>Almacenamiento Primario</strong> se asocia a un cluster, y almacena los volúmenes de discos de cada MV para todas las MVs en los servidores del clúster. El almacenamiento primario está típicamente alojado cerca de los servidores.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "El almacenamiento secundario está asociado a una zona, y almacena lo siguiente: <ul> <li> Plantillas - imágenes del sistema operativo que se pueden utilizar para arrancar MVs, pueden íncluir información de configuración adicional, como las aplicaciones instaladas </li><li>Imágenes ISO - imágenes del Sistema Operativo que pueden ser arrancables o no arrancables </li><li>Instantáneas de volúmenes de disco  - copias guardadas de datos de MV que se pueden utilizar para la recuperación de datos o para crear nuevas plantillas</ul>",
-    "message.installWizard.now.building": "Ahora construyendo su nube...",
-    "message.installWizard.tooltip.addCluster.name": "Nombre del  Cluster. Puedes ser texto a su elección y no es utilizado por Cloudstack.",
-    "message.installWizard.tooltip.addHost.hostname": "El nombre DNS o dirección IP del host",
-    "message.installWizard.tooltip.addHost.password": "Este es el password para el nombre de usuario mencionado anteriormente (Desde su Instalación XenServer)",
-    "message.installWizard.tooltip.addHost.username": "Generalmente root",
-    "message.installWizard.tooltip.addPod.name": "Nombre del POD",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Este es el rango de direcciones IP en la red privada que CloudStack utiliza para administrar las MVs del Almacenamiento Secundario y proxy de consolas. Estas direcciones IP se han tomado de la misma subred que los servidores informáticos.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "La puerta de enlace para los host en ese pod.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "La máscara en uso en la subred que utilizarán las VM invitado.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Este es el rango de direcciones IP en la red privada que CloudStack utiliza para administrar las MVs del Almacenamiento Secundario y proxy de consolas. Estas direcciones IP se han tomado de la misma subred que los servidores de cómputo.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": " Nombre para el dispositivo de almacenamiento.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(para NFS) En NFS este es el directorio exportado desde el servidor. Directorio (por SharedMountPoint). Con KVM este es el directorio de cada anfitrión en donde se monta el almacenamiento primario. Por ejemplo, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(para NFS, iSCSI, o PreSetup) La dirección IP o el nombre DNS del dispositivo de almacenamiento.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "Dirección IP del servidor NFS que contiene el almacenamiento secundario",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "El path exportado, ubicado en el servidor especificado anteriormente",
-    "message.installWizard.tooltip.addZone.dns1": "Estos son los servidores de DNS que utilizarán las MVs invitado en la zona. A estos servidores DNS se accede por la red pñublica que se añade a posteriori. Las direcciones IP públicas de la zona deben tener una ruta al servidor de nombres mencionado aquí. ",
-    "message.installWizard.tooltip.addZone.dns2": "Estos son los servidores de DNS que utilizarán las MVs invitado en la zona. A estos servidores DNS se accede por la red pñublica que se añade a posteriori. Las direcciones IP públicas de la zona deben tener una ruta al servidor de nombres mencionado aquí. ",
-    "message.installWizard.tooltip.addZone.internaldns1": "Estos son los servidores de DNS que utilizarán las MVs de Sistema en la zona. A estos servidores DNS se accede por la interfaz de red privada de las MV de Sistema. Las direcciones IP privadas que proporcione a los pods deben tener una ruta al servidor de nombres mencionado aquí. ",
-    "message.installWizard.tooltip.addZone.internaldns2": "Estos son los servidores de DNS que utilizarán las MVs de Sistema en la zona. A estos servidores DNS se accede por la interfaz de red privada de las MV de Sistema. Las direcciones IP privadas que proporcione a los pods deben tener una ruta al servidor de nombres mencionado aquí. ",
-    "message.installWizard.tooltip.addZone.name": "Un nombre para la zona.",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Una descripción para su red.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "El rango de direcciones IP que estará disponible para asignar a las MV invitado en esta zona. Si se utiliza una sola NIC, estas IPs deben estar en el mismo CIDR que el CIDR del pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "La puerta de enlace que deben usar las MV invitado.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "La máscara de red en uso en la subred que los clientes deben utilizar",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "El rango de direcciones IP que estará disponible para asignar a las MV invitado en esta zona. Si se utiliza una sola NIC, estas IPs deben estar en el mismo CIDR que el CIDR del pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Nombre para su red",
-    "message.instance.scaled.up.confirm": "¿Realmente desea escalar la instancia?",
-    "message.instanceWizard.noTemplates": "No tienes plantillas disponibles, por favor agregue una plantilla compatible y reinicio el asistente de instancias.",
-    "message.ip.address.changed": "Su dirección IP pudo haber cambiado. ¿Le gustaría actualizar el listado? Tenga en cuenta que en este caso el panel de detalles se cerrará.",
-    "message.iso.desc": "Disco con imagen con datos o medios arrancables para el SO",
-    "message.join.project": "Ahora estas unido al proyecto. Por favor cambiar a la Vista de Proyecto para verlo.",
-    "message.launch.vm.on.private.network": "¿Desea lanzar su instancias en tu red privada dedicada?",
-    "message.launch.zone": "La Zona esta lista para ser lanzada, por favor prosiga al próximo paso.",
-    "message.ldap.group.import": "Todos los usuarios del nombre de grupo indicado serán importados",
-    "message.link.domain.to.ldap": "Habilitar autosync para este dominio en LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Por favor, confirme que desea bloquear esta cuenta. Al bloquear la cuenta, todos los usuarios de esta cuenta ya no serán capaces de gestionar sus recursos cloud. Los recursos existentes podrán seguir siendo accedidos. ",
-    "message.migrate.instance.confirm": "Por favor, confirme a qué anfitrión desea migrar la instancia virtual.",
-    "message.migrate.instance.to.host": "Por favor, confirme que desea mover la instancia a otro anfitrión.",
-    "message.migrate.instance.to.ps": "Por favor, confirme que desea migrar la instancia a otro almacenamiento primario.",
-    "message.migrate.router.confirm": "Por favor, confirme a qué anfitrión que desea migrar el router:",
-    "message.migrate.systemvm.confirm": "Por favor, confirme a qué anfitrión desea migrar la MV de Sistema:",
-    "message.migrate.volume": "Por favor confirme que quiere migrar el volumen a otro almacenamiento primario",
-    "message.network.addVM.desc": "Por favor indique la red que desea agregar a esta MV. Una NIC nueva se agregará para esta red.",
-    "message.network.addVMNIC": "Por favor confirme que desea agregar una nueva NIC a la MV para esta red.",
-    "message.network.remote.access.vpn.configuration": "Se generó la configuración de acceso remoto por VPN, pero falló su aplicación. Por favor verifique la conectividad de todos los elementos de red y vuelva a intentarlo.",
-    "message.new.user": "Especifique lo siguiente para agregar un nuevo usuario a la cuenta",
-    "message.no.affinity.groups": "No hay ningún grupo de afinidad. Por favor continue con el paso siguiente.",
-    "message.no.host.available": "No anfitriones disponibles para la Migración",
-    "message.no.network.support": "El hipervisor seleccionado, vSphere, no tiene funciones de red adicionales. Por favor, continúe con el paso 5.",
-    "message.no.network.support.configuration.not.true": "Usted no tiene ninguna zona con grupo de seguridad habilitado. Por lo tanto, no hay funciones de red adicionales. Por favor, continúe con el paso 5.",
-    "message.no.projects": "No tienes ningún proyecto.<br/>Pro favor crear uno nuevo desde la sección de Proyectos.",
-    "message.no.projects.adminOnly": "No tienes ningún proyecto.<br/>Por favor dile a tu administrador que cree uno nuevo.",
-    "message.number.clusters": "<h2> <span> # de </span> Clústers </h2>",
-    "message.number.hosts": "<h2> <span> # de </span> Anfitriones </h2>",
-    "message.number.pods": "<h2> <span> # de </span> Pods</h2>",
-    "message.number.storage": "<h2> <span> # de </span> Almacenamiento primario </h2>",
-    "message.number.zones": "<h2> <span> # de </span> Zonas </h2>",
-    "message.outofbandmanagement.action.maintenance": "Atención, el anfitrión está en modo mantenimiento",
-    "message.outofbandmanagement.changepassword": "Cambiar contraseña de gestión Fuera-de-banda",
-    "message.outofbandmanagement.configure": "Configurar Gestión Fuera-de-banda",
-    "message.outofbandmanagement.disable": "Deshabilitar gestión Fuera-de-Banda",
-    "message.outofbandmanagement.enable": "Habilitar gestión Fuera-de-Banda",
-    "message.outofbandmanagement.issue": "Enviar Acción de Gestión de Alimentacíon Fuera-de-Banda",
-    "message.password.has.been.reset.to": "La Contraseña se ha cambiado a",
-    "message.password.of.the.vm.has.been.reset.to": "La Contraseña de la MV se ha cambiado a",
-    "message.pending.projects.1": "Tiene invitaciones a proyectos pendientes:",
-    "message.pending.projects.2": "Para visualizar, por favor acceda al sección de proyectos y seleccione la invitación desde la lista desplegable.",
-    "message.please.add.at.lease.one.traffic.range": "Por favor agregue al menos un rango de tráfico.",
-    "message.please.confirm.remove.ssh.key.pair": "Por favor confirme que usted quiere eliminar el Par de Claves SSH",
-    "message.please.proceed": "Por favor proceda al siguiente paso.",
-    "message.please.select.a.configuration.for.your.zone": "Por favor elija una configuración para su zona.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Por favor elija una red pública y de gestióin diferente antes de quitar",
-    "message.please.select.networks": "Por favor seleccione la red para su maquina virtual.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Por favor elija el par de claves ssh que desea usar en esta MV:",
-    "message.please.wait.while.zone.is.being.created": "Por favor espere un momento la zona esta siendo creada, puede llegar a demorar unos minutos...",
-    "message.pod.dedication.released": "Dedicación de Pod liberada",
-    "message.portable.ip.delete.confirm": "Por favor confirme que desea borrar el Rango IP Portátil",
-    "message.project.invite.sent": "Invitación enviada al usuario, se agregará al proyecto solo cuando acepte la invitación.",
-    "message.public.traffic.in.advanced.zone": "El tráfico público se genera cuando las MVs del Cloud acceden a recursos sobre Internet. Para ello se deben asignar direcciones IP públicas. Los usuarios pueden usar la interfaz de  CloudStack para adquirir estas IPs e implementar NAT entre su red de Invitados y su red pública.<br/><br/> Debe proveer por lo menos un rango de direcciones IP para el tráfico de Internet.",
-    "message.public.traffic.in.basic.zone": "El tráfico público se genera cuando las MVs en el cloud acceden a Internet o proveen servicios a clientes sobre Internet. Para este propósito deben asignarse direcciones IPs públicas. Cuando se crea una instancia, se asigna una IP de este conjunto de IPs Publicas ademas de la dirección IP en la red de invitado. Se configurará NAT estático 1-1 de forma automática entre la IP pública y la IP invitado. Los usuarios también pueden utilizar la interfaz de CLoudStack para adquirir IPs adicionales para implementar NAT estático entre las instancias y la IP pública.",
-    "message.question.are.you.sure.you.want.to.add": "Está seguro que quiere agregar",
-    "message.read.admin.guide.scaling.up": "Por favor lea la sección de escalado dinámico en la guía de administración antes de escalar.",
-    "message.recover.vm": "Confirme que quiere recuperar esta MV.",
-    "message.redirecting.region": "Redirigiendo a la región...",
-    "message.reinstall.vm": "NOTA: Proceda con precaución. Esta acción hará que la MV se vuelva a instalar usando la plantilla. Los datos en el disco raíz se perderán. Los volúmenes de datos adicionales no se modificarán.",
-    "message.remove.ldap": "¿Quiere borrar la configuración LDAP?",
-    "message.remove.region": "¿Esta seguro que desea quitar esta región del servidor de gestión?",
-    "message.remove.vpc": "Por favor confirme que usted quiere eliminar el VPC",
-    "message.remove.vpn.access": "Por favor, confirme que desea eliminar el acceso VPN del siguiente usuario",
-    "message.removed.ssh.key.pair": "Se quitó un Par de Claves SSH",
-    "message.reset.VPN.connection": "Por favor confirme que desea resetear la conexión de la VPN",
-    "message.reset.password.warning.notPasswordEnabled": "La plantilla de esta instancia fue creada sin contraseña habilitada",
-    "message.reset.password.warning.notStopped": "Su instancia debe ser detenida antes de intentar cambiar la contraseña actual.",
-    "message.restart.mgmt.server": "Por favor, reinicie el servidor de gestión (s) para que la nueva configuración surta efecto.",
-    "message.restart.mgmt.usage.server": "Por favor reinicie sus servidores de gestión y de uso, para que la nueva configuración se haga efectiva.",
-    "message.restart.network": "Todos los servicios provistos por esta red serán interrumpidos. Por favor confirme que desea reiniciar esta red.",
-    "message.restart.vpc": "Por favor confirme que usted quiere reiniciar el VPC",
-    "message.restart.vpc.remark": "Por favor confirme que desea reiniciar el VPC <p><small><i>Atención: creando un VPC sin redundancia forzara la limpieza. Todas las redes dejaran de estar disponibles por unos minutos</i>.</small></p>",
-    "message.restoreVM": "¿Desea recuperar la MV?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordenación de permisos de reglas abortada ya que la lista ha cambiado mientras realizaba los cambios. Por favor, intente de nuevo. ",
-    "message.security.group.usage": "(Use <strong> Ctrl-click </strong> para seleccionar todos los grupos de seguridad pertinentes)",
-    "message.select.a.zone": "Una zona normalmente se corresponde con un solo datacenter. Múltiples zonas pueden ayudar a aumentar la disponibilidad del cloud al proveer aislamiento físico y redundancia.",
-    "message.select.affinity.groups": "Por favor elija los grupos de afinidad a los que pertenece esta MV:",
-    "message.select.instance": "Por favor seleccione una instancia",
-    "message.select.iso": "Por favor seleccione un ISO para su nueva instancia virtual",
-    "message.select.item": "Por favor, seleccionar un item .",
-    "message.select.security.groups": "Por favor elija el/los grupo(s) de seguridad para su nueva MV",
-    "message.select.template": "Por favor seleccione una plantilla para su nueva instancia virtual",
-    "message.select.tier": "Por favo elija un Tier",
-    "message.set.default.NIC": "Por favor que desea que esta NIC sea la por defecto en esta MV.",
-    "message.set.default.NIC.manual": "Por favor actualice manualmente la NIC por defecto en la MV.",
-    "message.setup.physical.network.during.zone.creation": "Cuando se esta agregando una zona avanzada, se necesita setear una o más redes físicas. Cada red se corresponderá con una NIC del hipervisor. Cada red física puede transportar uno o más tipos de tráfico, con ciertas restricciones en como ellos se combinan.<br/><br/><strong>Arrastre y suelte uno o más tipos de tráfico</strong> sobre cada red física.",
-    "message.setup.physical.network.during.zone.creation.basic": "Cuando se esta agregando un zona básica, puedes configurar un red física que se corresponda a una NIC del hipervisor. La red transporta varios tipos de tráfico.<br/><br/>Puedes también <strong>arrastrar y soltar</strong> otro tipos de tráfico en la interfaz física.",
-    "message.setup.successful": "La configuración del cloud finalizo satisfactoriamente.",
-    "message.snapshot.schedule": "Puedes definir la planificación de instantáneas recurrentes seleccionando de entre las opciones inferiores disponibles y aplicando su política preferente",
-    "message.specifiy.tag.key.value": "Por favor especifique una etiqueta con clave y valor",
-    "message.specify.url": "Por favor especifique la URL",
-    "message.step.1.continue": "Por favor seleccione una plantilla o ISO para continuar",
-    "message.step.1.desc": "Por favor seleccione una plantilla para su nueva instancia virtual. También puede escoger  seleccionar una plantilla en blanco en la que instalar una imágen ISO.",
-    "message.step.2.continue": "Por favor seleccione una oferta de servicio para continuar",
-    "message.step.3.continue": "Por favor seleccione una oferta en disco para continuar",
-    "message.step.4.continue": "Por favor seleccione al menos una red para continuar",
-    "message.step.4.desc": "Por favor, seleccione la red primaria a la que estará conectada su instancia virtual",
-    "message.storage.traffic": "Tráfico entre los recursos internos de CloudStack, incluyendo cualquier componente que se comunique con el servidor de gestión, tales como anfitriones y las Mvs de sistema de CloudStack. Por favor, configure el tráfico del almacenamiento aquí.",
-    "message.suspend.project": "¿Está seguro que desea suspender este proyecto?",
-    "message.systems.vms.ready": "MV de Sistema lista.",
-    "message.template.copying": "La Plantilla esta siendo copiada.",
-    "message.template.desc": "La imagen de SO que puede usarse para iniciar una MV",
-    "message.tier.required": "El Tier es obligatorio.",
-    "message.tooltip.dns.1": "Nombre del servidor DNS que será usado por las MVs en la zona. Las direcciones IP públicas de la zona deberán tener una ruta a este servidor.",
-    "message.tooltip.dns.2": "El nombre del segundo servidor DNS para ser usado por las MVs en esta zona. Las direcciones IP públicas para esta zona deben tener una ruta a este servidor.",
-    "message.tooltip.internal.dns.1": "Nombre del servidor DNS que será usado por las MVs internas de sistema de CloudStack en la zona. Las direcciones IP privadas de los pods deben tener una ruta a este servidor.",
-    "message.tooltip.internal.dns.2": "Nombre del servidor DNS que será usado por las MVs internas de sistema de CloudStack en la zona. Las direcciones IP privadas de la zona deberán tener una ruta a este servidor.",
-    "message.tooltip.network.domain": "Un sufijo DNS que creará un nombre de dominio personalizado para la red que es accedida por las MV invitado.",
-    "message.tooltip.pod.name": "Un nombre para este pod.",
-    "message.tooltip.reserved.system.gateway": "La puerta de enlace para los anfitriones del pod.",
-    "message.tooltip.reserved.system.netmask": "El prefijo de red que define la subred del pod. Usa notación CIDR.",
-    "message.tooltip.zone.name": "Un nombre para la zona.",
-    "message.update.os.preference": "Por favor seleccione una preferencia de S.O. para este anfitrión. Todas las instancias virtuales con preferencias similares serán asignadas en primer lugar a este anfitrión antes que escoger otro.",
-    "message.update.resource.count": "Por favor confirme que usted quiere actualizar el conteo de recursos para esta cuenta",
-    "message.update.ssl": "Por favor, envíe una nueva cadena de certificados SSL compatible X.509  para ser actualizado en cada instancia virtual de proxy de consolas y almacenamiento secundario:",
-    "message.update.ssl.failed": "Fallo la actualización del Certficado SSL.",
-    "message.update.ssl.succeeded": "Actualización del Certificado SSL exitosa",
-    "message.validate.URL": "Por favor ingrese una URL válida.",
-    "message.validate.accept": "Por favor ingrese un valor con extensión válida.",
-    "message.validate.creditcard": "Por favor ingrese un número de tarjeta de crédito válido.",
-    "message.validate.date": "Por favor ingrese una fecha válida.",
-    "message.validate.date.ISO": "Por favor ingrese una fecha (ISO) válida.",
-    "message.validate.digits": "Por favor ingrese solo dígitos.",
-    "message.validate.email.address": "Por favor introduzca un email válido.",
-    "message.validate.equalto": "Por favor ingrese el mismo valor nuevamente.",
-    "message.validate.fieldrequired": "Este campo es obligatorio.",
-    "message.validate.fixfield": "Por favor corrija este campo.",
-    "message.validate.instance.name": "El nombre de la instancia no puede ser más largo de 63 caracteres. Solo se permiten letras ASCII tales como  a~z, A~Z, números 0~9, los guiones están permitidos. Deben empezar con una letra y finalizar con una letra o una cifra.",
-    "message.validate.invalid.characters": "Se han hallado caracteres no válidos. Por favor, corríjalos.",
-    "message.validate.max": "Por favor ingrese un valor menor o igual que  {0}.",
-    "message.validate.maxlength": "Por favor ingrese no más de {0} caracteres.",
-    "message.validate.minlength": "Por favor ingrese al menos  {0} caracteres.",
-    "message.validate.number": "Por favor ingrese un número válido.",
-    "message.validate.range": "Por favor ingrese un valor entre {0} y {1}.",
-    "message.validate.range.length": "Por favor ingrese un valor entre {0} y {1} caracteres de longitud.",
-    "message.virtual.network.desc": "Una red dedicada virtualizada para su cuenta. El dominio de difusión está contenido dentro de una VLAN y todos los accesos a la red pública se encaminan mediante un router virtual.",
-    "message.vm.create.template.confirm": "Crear plantilla reiniciará la máquina virtual automáticamente.",
-    "message.vm.review.launch": "Por favor revise la siguiente información y confirme que su instancia virtual es correcta antes de lanzarla.",
-    "message.vnmc.available.list": "VNMC no esta disponible en esta lista de proveedores.",
-    "message.vnmc.not.available.list": "VNMC no esta disponible en esta lista de proveedores.",
-    "message.volume.create.template.confirm": "Por favor, confirme que desea crear una plantilla para este volumen de disco. La creación de la plantilla puede oscilar de varios minutos a más, dependiendo del tamaño del volumen.",
-    "message.waiting.for.builtin.templates.to.load": "Esperando por las plantillas incorporadas para cargar...",
-    "message.you.must.have.at.least.one.physical.network": "Debes tener por lo menos una red física",
-    "message.your.cloudstack.is.ready": "Tu CloudStack esta listo!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Creción de la zona completada.¿Desea habilitarla?",
-    "message.zone.no.network.selection": "La zona elegida no tiene ninguna red para seleccionar.",
-    "message.zone.step.1.desc": "Por favor seleccione un modelo de red para su zona.",
-    "message.zone.step.2.desc": "Por favor ingrese la siguiente información para agregar una nueva zona",
-    "message.zone.step.3.desc": "Por favor ingrese la siguiente información para agregar un nuevo pod",
-    "message.zoneWizard.enable.local.storage": "PRECAUCIÓN: Si habilita el almacenamiento local para esta zona, debe hacer lo siguiente dependiendo de donde se quieran iniciar las MVs de sistema:<br/><br/>1. Si las MVs de sistema deben ser iniciadas sobre el almacenamiento primario compartido, este debe agregarse a la zona después de creada. También puedes iniciar la zona en estado dshabilitado.<br/><br/>2. Si la MV de sistema necesita ser iniciada en el almacenamiento primario local, el parámetro system.vm.use.local.storage debe ser puesto en true antes de habilitar la zona.<br/><br/><br/>¿Desea continuar?",
-    "messgae.validate.min": "Por favor ingrese un valor mayor o igual que {0}.",
-    "mode": "modo",
-    "network.rate": "Tasa de Red",
-    "notification.reboot.instance": "Reiniciar Instancia",
-    "notification.start.instance": "Iniciar Instancia",
-    "notification.stop.instance": "Detener Instancia",
-    "side.by.side": "Juntos",
-    "state.Accepted": "Aceptado",
-    "state.Active": "Activo",
-    "state.Allocated": "Asignados",
-    "state.Allocating": "Asignando",
-    "state.BackedUp": "Respaldado",
-    "state.BackingUp": "Realizando Backup",
-    "state.Completed": "Completado",
-    "state.Creating": "Creando",
-    "state.Declined": "Declinado",
-    "state.Destroyed": "Destruidas",
-    "state.Disabled": "Deshabilitados",
-    "state.Enabled": "Habilitado",
-    "state.Error": "Error",
-    "state.Expunging": "Purgando",
-    "state.Migrating": "Migrando",
-    "state.Pending": "Pendiente",
-    "state.Ready": "Listo",
-    "state.Running": "Ejecutando",
-    "state.Starting": "Iniciando",
-    "state.Stopped": "Detenidas",
-    "state.Stopping": "Parando",
-    "state.Suspended": "Suspendido",
-    "state.detached": "Desconectado",
-    "title.upload.volume": "Subir Volumen",
-    "ui.listView.filters.all": "Todas",
-    "ui.listView.filters.mine": "Mias"
-};
diff --git a/ui/legacy/l10n/fr_FR.js b/ui/legacy/l10n/fr_FR.js
deleted file mode 100644
index 988f6a4..0000000
--- a/ui/legacy/l10n/fr_FR.js
+++ /dev/null
@@ -1,2314 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "Code ICMP",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "Type ICMP",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Propriétés de l'élément modifiées",
-    "confirm.enable.s3": "Remplir les informations suivantes pour activer le support de stockage secondaire S3",
-    "confirm.enable.swift": "Remplir les informations suivantes pour activer Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Erreur: impossible de changer votre mot de passe car le mode LDAP est activé.",
-    "error.could.not.enable.zone": "Impossible d'activer la zone",
-    "error.installWizard.message": "Une erreur s'est produite ; vous pouvez retourner en arrière et corriger les erreurs",
-    "error.invalid.username.password": "Identifiant ou mot de passe invalide",
-    "error.login": "Votre identifiant / mot de passe ne correspond pas à nos enregistrements.",
-    "error.menu.select": "Échec de l'action car il n'y a aucun élément sélectionné.",
-    "error.mgmt.server.inaccessible": "Le serveur de gestion est inaccessible. Veuillez essayer plus tard.",
-    "error.password.not.match": "Les champs mot de passe ne correspondent pas",
-    "error.please.specify.physical.network.tags": "L'offre de réseau ne sera pas disponible tant que des libellés n'auront pas été renseignés pour ce réseau physique.",
-    "error.session.expired": "Votre session a expirée.",
-    "error.something.went.wrong.please.correct.the.following": "Quelque chose s'est mal passée ; veuillez corriger le point suivant",
-    "error.unable.to.reach.management.server": "Impossible d'attendre le serveur de gestion",
-    "error.unresolved.internet.name": "Votre nom Internet ne peut pas être résolu.",
-    "force.delete": "Forcer la suppression",
-    "force.delete.domain.warning": "Attention : Choisir cette option entraînera la suppression de tous les domaines issus et l'ensemble des comptes associés, ainsi que de leur ressources",
-    "force.remove": "Suppression forcée",
-    "force.remove.host.warning": "Attention : Choisir cette option entraînera CloudStack à forcer l'arrêt de l'ensemble des machines virtuelles avant d'enlever cet hôte du cluster",
-    "force.stop": "Forcer l'arrêt",
-    "force.stop.instance.warning": "Attention : un arrêt forcé sur cette instance est la dernier option. Cela peut engendrer des pertes de données et/ou un comportement inconsistant de votre instance.",
-    "hint.no.host.tags": "Aucun libellé d'hôte trouvé",
-    "hint.no.storage.tags": "Aucune libellé de stockage trouvé",
-    "hint.type.part.host.tag": "Saisir le cadre d'un libellé d'hôte",
-    "hint.type.part.storage.tag": "Saisir le cadre d'un libellé de stockage",
-    "image.directory": "Répertoire d'images",
-    "inline": "Aligné",
-    "instances.actions.reboot.label": "Redémarrer l'instance",
-    "label.CIDR.list": "Liste CIDR",
-    "label.CIDR.of.destination.network": "CIDR du réseau de destination",
-    "label.CPU.cap": "Limitation CPU",
-    "label.DHCP.server.type": "Serveur DHCP",
-    "label.DNS.domain.for.guest.networks": "Domaine DNS pour les réseaux invités",
-    "label.ESP.encryption": "Chiffrement ESP",
-    "label.ESP.hash": "Empreinte ESP",
-    "label.ESP.lifetime": "Durée de vie ESP (secondes)",
-    "label.ESP.policy": "Mode ESP",
-    "label.IKE.DH": "DH IKE",
-    "label.IKE.encryption": "Chiffrement IKE",
-    "label.IKE.hash": "Empreinte IKE",
-    "label.IKE.lifetime": "Durée de vie IKE (secondes)",
-    "label.IKE.policy": "Mode IKE",
-    "label.IPsec.preshared.key": "Clé partagée IPsec",
-    "label.LB.isolation": "Répartition de charge isolée",
-    "label.LUN.number": "N° LUN",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Profil Journal Palo Alto",
-    "label.PA.threat.profile": "Profil menace Palo Alto",
-    "label.PING.CIFS.password": "Mot de passe CIFS PING",
-    "label.PING.CIFS.username": "Identifiant CIFS PING",
-    "label.PING.dir": "Répertoire PING",
-    "label.PING.storage.IP": "IP stockage PING",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Serveur PXE",
-    "label.SNMP.community": "Communauté SNMP",
-    "label.SNMP.port": "Port SNMP",
-    "label.SR.name": "Nom du point de montage",
-    "label.SharedMountPoint": "Point de montage partagé",
-    "label.TFTP.dir": "Répertoire TFTP",
-    "label.VMFS.datastore": "Magasin de données VMFS",
-    "label.VMs.in.tier": "Machines virtuelles dans le tiers",
-    "label.VPC.limits": "Limites VPC",
-    "label.VPC.router.details": "Détails routeur VPC",
-    "label.VPN.connection": "Connexion VPN",
-    "label.VPN.customer.gateway": "Passerelle VPN client",
-    "label.VPN.gateway": "Passerelle VPN",
-    "label.Xenserver.Tools.Version61plus": "XenServer Tools Version 6.1+",
-    "label.about": "A propos de",
-    "label.about.app": "A propos de CloudStack",
-    "label.accept.project.invitation": "Accepter l'invitation au projet",
-    "label.account": "Compte",
-    "label.account.and.security.group": "Compte, groupe de sécurité",
-    "label.account.details": "Détails compte",
-    "label.account.id": "ID de compte",
-    "label.account.lower": "compte",
-    "label.account.name": "Nom de compte",
-    "label.account.specific": "Spécifique au compte",
-    "label.account.type": "Type Compte",
-    "label.accounts": "Comptes",
-    "label.acl": "ACL",
-    "label.acl.id": "ID ACL",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "Liste règles ACL",
-    "label.acl.name": "Nom ACL",
-    "label.acl.replaced": "ACL remplacée",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Acquérir nouvelle adr. IP",
-    "label.acquire.new.secondary.ip": "Acquérir nouvelle IP secondaire",
-    "label.action": "Action",
-    "label.action.attach.disk": "Rattacher disque",
-    "label.action.attach.disk.processing": "Rattachement du disque...",
-    "label.action.attach.iso": "Rattacher image ISO",
-    "label.action.attach.iso.processing": "Rattachement de l'image ISO...",
-    "label.action.cancel.maintenance.mode": "Annuler mode maintenance",
-    "label.action.cancel.maintenance.mode.processing": "Annulation du mode maintenance...",
-    "label.action.change.password": "Changer le mot de passe",
-    "label.action.change.service": "Changer Service",
-    "label.action.change.service.processing": "Changement service...",
-    "label.action.configure.samlauthorization": "Configurer Autorisation SAML SSO",
-    "label.action.copy.ISO": "Copier une image ISO",
-    "label.action.copy.ISO.processing": "Copie ISO...",
-    "label.action.copy.template": "Copier modèle",
-    "label.action.copy.template.processing": "Copie modèle...",
-    "label.action.create.template": "Créer un modèle",
-    "label.action.create.template.from.vm": "Créer un modèle depuis la VM",
-    "label.action.create.template.from.volume": "Créer un modèle depuis le volume",
-    "label.action.create.template.processing": "Création du Modèle...",
-    "label.action.create.vm": "Créer une VM",
-    "label.action.create.vm.processing": "Création de la VM...",
-    "label.action.create.volume": "Créer un Volume",
-    "label.action.create.volume.processing": "Création du Volume...",
-    "label.action.delete.IP.range": "Supprimer la plage IP",
-    "label.action.delete.IP.range.processing": "Suppression de la plage IP...",
-    "label.action.delete.ISO": "Supprimer l'image ISO",
-    "label.action.delete.ISO.processing": "Suppression de l'image ISO...",
-    "label.action.delete.account": "Supprimer un compte",
-    "label.action.delete.account.processing": "Suppression du compte...",
-    "label.action.delete.cluster": "Supprimer le Cluster",
-    "label.action.delete.cluster.processing": "Suppression du Cluster...",
-    "label.action.delete.disk.offering": "Supprimer Offre de Disque",
-    "label.action.delete.disk.offering.processing": "Suppression de l'offre de disque...",
-    "label.action.delete.domain": "Supprimer le domaine",
-    "label.action.delete.domain.processing": "Suppression du domaine...",
-    "label.action.delete.firewall": "Supprimer la règle de pare-feu",
-    "label.action.delete.firewall.processing": "Suppression du Pare-feu...",
-    "label.action.delete.ingress.rule": "Supprimer la règle d'entrée",
-    "label.action.delete.ingress.rule.processing": "Suppression de la règle d'entrée..",
-    "label.action.delete.load.balancer": "Supprimer la règle de répartition de charge",
-    "label.action.delete.load.balancer.processing": "Suppression du répartiteur de charge...",
-    "label.action.delete.network": "Supprimer le réseau",
-    "label.action.delete.network.processing": "Suppression du réseau...",
-    "label.action.delete.nexusVswitch": "Supprimer le Nexus 1000v",
-    "label.action.delete.nic": "Supprimer carte NIC",
-    "label.action.delete.physical.network": "Supprimer le réseau physique",
-    "label.action.delete.pod": "Supprimer le Pod",
-    "label.action.delete.pod.processing": "Suppression du pod...",
-    "label.action.delete.primary.storage": "Supprimer le stockage primaire",
-    "label.action.delete.primary.storage.processing": "Suppression du stockage primaire...",
-    "label.action.delete.secondary.storage": "Supprimer le stockage secondaire",
-    "label.action.delete.secondary.storage.processing": "Suppression du stockage secondaire...",
-    "label.action.delete.security.group": "Supprimer le groupe de sécurité",
-    "label.action.delete.security.group.processing": "Suppression du groupe de sécurité",
-    "label.action.delete.service.offering": "Supprimer Offre Service",
-    "label.action.delete.service.offering.processing": "Suppression de l'offre de service...",
-    "label.action.delete.snapshot": "Supprimer l'instantané",
-    "label.action.delete.snapshot.processing": "Suppression de l'instantané...",
-    "label.action.delete.system.service.offering": "Supprimer Offre de Service Système",
-    "label.action.delete.template": "Supprimer le modèle",
-    "label.action.delete.template.processing": "Suppression du modèle...",
-    "label.action.delete.user": "Supprimer l'utilisateur",
-    "label.action.delete.user.processing": "Suppression de l'utilisateur...",
-    "label.action.delete.volume": "Supprimer le volume",
-    "label.action.delete.volume.processing": "Suppression du volume...",
-    "label.action.delete.zone": "Supprimer la zone",
-    "label.action.delete.zone.processing": "Suppression de la zone...",
-    "label.action.destroy.instance": "Supprimer l'instance",
-    "label.action.destroy.instance.processing": "Suppression de l'instance...",
-    "label.action.destroy.systemvm": "Supprimer VM Système",
-    "label.action.destroy.systemvm.processing": "Suppression de la VM Système...",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Détacher le disque",
-    "label.action.detach.disk.processing": "Détachement du disque...",
-    "label.action.detach.iso": "Détacher l'image ISO",
-    "label.action.detach.iso.processing": "Détachement de l'image ISO...",
-    "label.action.disable.account": "Désactiver le compte",
-    "label.action.disable.account.processing": "Désactivation du compte...",
-    "label.action.disable.cluster": "Désactiver le cluster",
-    "label.action.disable.cluster.processing": "Désactivation du cluster...",
-    "label.action.disable.nexusVswitch": "Désactiver le Nexus 1000v",
-    "label.action.disable.physical.network": "Désactiver le réseau physique",
-    "label.action.disable.pod": "Désactiver le Pod",
-    "label.action.disable.pod.processing": "Désactivation du Pod...",
-    "label.action.disable.static.NAT": "Désactiver le NAT Statique",
-    "label.action.disable.static.NAT.processing": "Désactivation du NAT Statique...",
-    "label.action.disable.user": "Désactiver l'utilisateur",
-    "label.action.disable.user.processing": "Désactivation de l'utilisateur...",
-    "label.action.disable.zone": "Désactivation de la zone",
-    "label.action.disable.zone.processing": "Désactivation de la zone...",
-    "label.action.download.ISO": "Télécharger une image ISO",
-    "label.action.download.template": "Télécharger un modèle",
-    "label.action.download.volume": "Télécharger un volume",
-    "label.action.download.volume.processing": "Téléchargement du volume...",
-    "label.action.edit.ISO": "Modifier l'image ISO",
-    "label.action.edit.account": "Modifier le Compte",
-    "label.action.edit.disk.offering": "Modifier Offre Disque",
-    "label.action.edit.domain": "Modifier le domaine",
-    "label.action.edit.global.setting": "Modifier la configuration globale",
-    "label.action.edit.host": "Modifier l'hôte",
-    "label.action.edit.instance": "Modifier l'instance",
-    "label.action.edit.network": "Modifier le réseau",
-    "label.action.edit.network.offering": "Modifier Offre Réseau",
-    "label.action.edit.network.processing": "Modification du Réseau...",
-    "label.action.edit.pod": "Modifier le pod",
-    "label.action.edit.primary.storage": "Modifier le stockage primaire",
-    "label.action.edit.resource.limits": "Modifier les limites de ressources",
-    "label.action.edit.service.offering": "Modifier Offre Service",
-    "label.action.edit.template": "Modifier le modèle",
-    "label.action.edit.user": "Modifier l'utilisateur",
-    "label.action.edit.zone": "Modifier la zone",
-    "label.action.enable.account": "Activer le compte",
-    "label.action.enable.account.processing": "Activation du compte...",
-    "label.action.enable.cluster": "Activer le cluster",
-    "label.action.enable.cluster.processing": "Activation du cluster...",
-    "label.action.enable.maintenance.mode": "Activer le mode maintenance",
-    "label.action.enable.maintenance.mode.processing": "Activation du mode maintenance...",
-    "label.action.enable.nexusVswitch": "Activer le Nexus 1000v",
-    "label.action.enable.physical.network": "Activer le réseau physique",
-    "label.action.enable.pod": "Activer le Pod",
-    "label.action.enable.pod.processing": "Activation du Pod...",
-    "label.action.enable.static.NAT": "Activer le NAT Statique",
-    "label.action.enable.static.NAT.processing": "Activation du NAT Statique...",
-    "label.action.enable.user": "Activer l'utilisateur",
-    "label.action.enable.user.processing": "Activation de l'utilisateur...",
-    "label.action.enable.zone": "Activer la zone",
-    "label.action.enable.zone.processing": "Activation de la zone...",
-    "label.action.expunge.instance": "Purger Instance",
-    "label.action.expunge.instance.processing": "Purge de l'Instance...",
-    "label.action.force.reconnect": "Forcer la reconnexion",
-    "label.action.force.reconnect.processing": "Reconnexion en cours...",
-    "label.action.generate.keys": "Générer les clés",
-    "label.action.generate.keys.processing": "Génération des clés...",
-    "label.action.list.nexusVswitch": "Liste des Nexus 1000v",
-    "label.action.lock.account": "Verrouiller le compte",
-    "label.action.lock.account.processing": "Verrouillage du compte...",
-    "label.action.manage.cluster": "Gérer le Cluster",
-    "label.action.manage.cluster.processing": "Gestion du cluster...",
-    "label.action.migrate.instance": "Migrer l'instance",
-    "label.action.migrate.instance.processing": "Migration de l'instance...",
-    "label.action.migrate.router": "Migration routeur",
-    "label.action.migrate.router.processing": "Migration routeur en cours...",
-    "label.action.migrate.systemvm": "Migrer VM Système",
-    "label.action.migrate.systemvm.processing": "Migration VM système en cours ...",
-    "label.action.reboot.instance": "Redémarrer l'instance",
-    "label.action.reboot.instance.processing": "Redémarrage de l'instance...",
-    "label.action.reboot.router": "Redémarrer le routeur",
-    "label.action.reboot.router.processing": "Redémarrage du routeur...",
-    "label.action.reboot.systemvm": "Redémarrer VM Système",
-    "label.action.reboot.systemvm.processing": "Redémarrage de la VM Système...",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Instantanés récurrents",
-    "label.action.register.iso": "Enregistrer ISO",
-    "label.action.register.template": "Enregistrer modèle depuis une URL",
-    "label.action.release.ip": "Libérer l'adresse IP",
-    "label.action.release.ip.processing": "Libération de l'adresse IP...",
-    "label.action.remove.host": "Supprimer l'hôte",
-    "label.action.remove.host.processing": "Suppression de l'hôte...",
-    "label.action.reset.password": "Ré-initialiser le mot de passe",
-    "label.action.reset.password.processing": "Ré-initialisation du mot de passe...",
-    "label.action.resize.volume": "Redimensionner Volume",
-    "label.action.resize.volume.processing": "Redimensionnement en cours...",
-    "label.action.resource.limits": "Limites de ressources",
-    "label.action.restore.instance": "Restaurer l'instance",
-    "label.action.restore.instance.processing": "Restauration de l'instance...",
-    "label.action.revert.snapshot": "Rétablir Instantané",
-    "label.action.revert.snapshot.processing": "Retour à l'instantané...",
-    "label.action.start.instance": "Démarrer l'instance",
-    "label.action.start.instance.processing": "Démarrage de l'instance...",
-    "label.action.start.router": "Démarrer le routeur",
-    "label.action.start.router.processing": "Démarrage du routeur...",
-    "label.action.start.systemvm": "Démarrer la VM système",
-    "label.action.start.systemvm.processing": "Démarrage de la VM système...",
-    "label.action.stop.instance": "Arrêter l'Instance",
-    "label.action.stop.instance.processing": "Arrêt de l'Instance...",
-    "label.action.stop.router": "Arrêter le routeur",
-    "label.action.stop.router.processing": "Arrêt du routeur...",
-    "label.action.stop.systemvm": "Arrêter VM Système",
-    "label.action.stop.systemvm.processing": "Arrêt de la VM système...",
-    "label.action.take.snapshot": "Prendre un instantané",
-    "label.action.take.snapshot.processing": "Prise de l'instantané...",
-    "label.action.unmanage.cluster": "Ne plus gérer le Cluster",
-    "label.action.unmanage.cluster.processing": "Arrêt de la gestion du Cluster",
-    "label.action.update.OS.preference": "Mettre à jour les préférences d'OS",
-    "label.action.update.OS.preference.processing": "Mise à jour des préférences d'OS...",
-    "label.action.update.resource.count": "Mettre à jour le compteur des ressources",
-    "label.action.update.resource.count.processing": "Mise à jour du compteur...",
-    "label.action.vmsnapshot.create": "Prendre un instantané VM",
-    "label.action.vmsnapshot.delete": "Supprimer l'instantané VM",
-    "label.action.vmsnapshot.revert": "Rétablir Instantané VM",
-    "label.actions": "Actions",
-    "label.activate.project": "Activer projet",
-    "label.active.sessions": "Sessions actives",
-    "label.add": "Ajouter",
-    "label.add.ACL": "Ajouter règle ACL",
-    "label.add.BigSwitchBcf.device": "Ajouter un contrôleur BigSwitch BCF",
-    "label.add.BrocadeVcs.device": "Ajouter Switch Brocade Vcs",
-    "label.add.F5.device": "Ajouter un F5",
-    "label.add.LDAP.account": "Ajouter Compte LDAP",
-    "label.add.NiciraNvp.device": "Ajouter un contrôleur Nvp",
-    "label.add.OpenDaylight.device": "Ajouter contrôleur OpenDaylight",
-    "label.add.PA.device": "Ajouter périphérique Palo Alto",
-    "label.add.SRX.device": "Ajouter un SRX",
-    "label.add.VM.to.tier": "Ajouter une machine virtuelle au tiers",
-    "label.add.VPN.gateway": "Ajouter une passerelle VPN",
-    "label.add.account": "Ajouter un compte",
-    "label.add.account.to.project": "Ajouter un compte au projet",
-    "label.add.accounts": "Ajouter des comptes",
-    "label.add.accounts.to": "Ajouter des comptes sur",
-    "label.add.acl.list": "Ajouter Liste ACL",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Ajouter nouveau groupe d'affinité",
-    "label.add.baremetal.dhcp.device": "Ajouter un DHCP Baremetal",
-    "label.add.baremetal.rack.configuration": "Ajouter Configuration Rack Baremetal",
-    "label.add.by": "Ajouté par",
-    "label.add.by.cidr": "Ajouter par CIDR",
-    "label.add.by.group": "Ajouter par groupe",
-    "label.add.ciscoASA1000v": "Ajouter ressource CiscoASA1000v",
-    "label.add.cluster": "Ajouter un cluster",
-    "label.add.compute.offering": "Ajouter Offre Calcul",
-    "label.add.direct.iprange": "Ajouter une plage d'adresse IP directe",
-    "label.add.disk.offering": "Ajouter Offre Disque",
-    "label.add.domain": "Ajouter un domaine",
-    "label.add.egress.rule": "Ajouter la règle sortante",
-    "label.add.firewall": "Ajouter une règle de pare-feu",
-    "label.add.globo.dns": "Ajouter GloboDNS",
-    "label.add.gslb": "Ajouter GSLB",
-    "label.add.guest.network": "Ajouter un réseau d'invité",
-    "label.add.host": "Ajouter un hôte",
-    "label.add.ingress.rule": "Ajouter une règle d'entrée",
-    "label.add.intermediate.certificate": "Ajouter certificat intermédiaire",
-    "label.add.internal.lb": "Ajouter LB interne",
-    "label.add.ip.range": "Ajouter une plage IP",
-    "label.add.isolated.guest.network": "Ajouter un réseau d'invité isolé",
-    "label.add.isolated.guest.network.with.sourcenat": "Ajouter un réseau d'invité isolé avec SourceNat",
-    "label.add.isolated.network": "Ajouter un réseau isolé",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Ajouter un compte LDAP",
-    "label.add.list.name": "Nom Liste ACL",
-    "label.add.load.balancer": "Ajouter un répartiteur de charge",
-    "label.add.more": "Ajouter plus",
-    "label.add.netScaler.device": "Ajouter un Netscaler",
-    "label.add.network": "Ajouter un réseau",
-    "label.add.network.ACL": "Ajouter une règle d'accès réseau ACL",
-    "label.add.network.acl.list": "Ajouter Liste ACL réseau",
-    "label.add.network.device": "Ajouter un équipement réseau",
-    "label.add.network.offering": "Ajouter Offre Réseau",
-    "label.add.new.F5": "Ajouter un F5",
-    "label.add.new.NetScaler": "Ajouter un Netscaler",
-    "label.add.new.PA": "Ajouter nouveau Palo Alto",
-    "label.add.new.SRX": "Ajouter un SRX",
-    "label.add.new.gateway": "Ajouter une nouvelle passerelle",
-    "label.add.new.tier": "Ajouter un nouveau tiers",
-    "label.add.nfs.secondary.staging.store": "Ajouter un Stockage Secondaire Intermédiaire NFS",
-    "label.add.physical.network": "Ajouter un réseau physique",
-    "label.add.pod": "Ajouter un pod",
-    "label.add.port.forwarding.rule": "Ajouter une règle de transfert de port",
-    "label.add.portable.ip.range": "Ajouter Plage IP portable",
-    "label.add.primary.storage": "Ajouter un stockage primaire",
-    "label.add.private.gateway": "Ajouter Passerelle Privée",
-    "label.add.region": "Ajouter Région",
-    "label.add.resources": "Ajouter ressources",
-    "label.add.role": "Ajouter Rôle",
-    "label.add.route": "Ajouter route",
-    "label.add.rule": "Ajouter règle",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Ajouter un stockage secondaire",
-    "label.add.security.group": "Ajouter un groupe de sécurité",
-    "label.add.service.offering": "Ajouter Offre Service",
-    "label.add.static.nat.rule": "Ajouter une règle de NAT statique",
-    "label.add.static.route": "Ajouter une route statique",
-    "label.add.system.service.offering": "Ajouter Offre Service Système",
-    "label.add.template": "Ajouter un modèle",
-    "label.add.to.group": "Ajouter au groupe",
-    "label.add.ucs.manager": "Ajouter Gestionnaire UCS",
-    "label.add.user": "Ajouter un utilisateur",
-    "label.add.userdata": "Données Utilisateur",
-    "label.add.vlan": "Ajouter un VLAN",
-    "label.add.vm": "Ajouter VM",
-    "label.add.vms": "Ajouter VMs",
-    "label.add.vms.to.lb": "Ajouter une/des VM(s) à la règle de répartition de charge",
-    "label.add.vmware.datacenter": "Ajouter un datacenter VMware",
-    "label.add.vnmc.device": "Ajouter un VNMC",
-    "label.add.vnmc.provider": "Ajouter fournisseur VNMC",
-    "label.add.volume": "Ajouter un volume",
-    "label.add.vpc": "Ajouter un VPC",
-    "label.add.vpc.offering": "Ajouter Offre VPC",
-    "label.add.vpn.customer.gateway": "Ajouter une passerelle VPN cliente",
-    "label.add.vpn.user": "Ajouter un utilisateur VPN",
-    "label.add.vxlan": "Ajouter un VXLAN",
-    "label.add.zone": "Ajouter une zone",
-    "label.added.brocade.vcs.switch": "Ajout d'un nouveau switch Brocade Vcs",
-    "label.added.network.offering": "Offre de service ajoutée",
-    "label.added.new.bigswitch.bcf.controller": "Ajout du nouveau contrôleur BigSwitch BCF",
-    "label.added.nicira.nvp.controller": "Ajout d'un nouveau contrôleur Nicira NVP",
-    "label.addes.new.f5": "Ajout d'un nouveau F5",
-    "label.adding": "Ajout",
-    "label.adding.cluster": "Ajout du Cluster",
-    "label.adding.failed": "Échec de l'ajout",
-    "label.adding.pod": "Ajout du Pod",
-    "label.adding.processing": "Ajout...",
-    "label.adding.succeeded": "Ajout réussi",
-    "label.adding.user": "Ajout de l'utilisateur",
-    "label.adding.zone": "Ajout de la zone",
-    "label.additional.networks": "Réseaux additionnels",
-    "label.admin": "Administrateur",
-    "label.admin.accounts": "Comptes Administrateur",
-    "label.advanced": "Avancé",
-    "label.advanced.mode": "Mode avancé",
-    "label.advanced.search": "Recherche avancée",
-    "label.affinity": "Affinité",
-    "label.affinity.group": "Groupe d'Affinité",
-    "label.affinity.groups": "Groupes d'Affinité",
-    "label.agent.password": "Mot de passe Agent",
-    "label.agent.port": "Port Agent",
-    "label.agent.state": "Statut Agent",
-    "label.agent.username": "Identifiant Agent",
-    "label.agree": "Accepter",
-    "label.alert": "Alerte",
-    "label.alert.archived": "Alerte archivée",
-    "label.alert.deleted": "Alerte supprimée",
-    "label.alert.details": "Détails Alerte",
-    "label.algorithm": "Algorithme",
-    "label.allocated": "Alloué",
-    "label.allocation.state": "État",
-    "label.allow": "Autoriser",
-    "label.anti.affinity": "Anti-affinité",
-    "label.anti.affinity.group": "Groupe d'Anti-affinité",
-    "label.anti.affinity.groups": "Groupes d'Anti-affinité",
-    "label.api.key": "Clé d'API",
-    "label.api.version": "Version d'API",
-    "label.app.name": "CloudStack",
-    "label.apply": "Appliquer",
-    "label.archive": "Archiver",
-    "label.archive.alerts": "Archiver alertes",
-    "label.archive.events": "Archiver événements",
-    "label.assign": "Assigner",
-    "label.assign.instance.another": "Assigner l'instance à un autre compte",
-    "label.assign.to.load.balancer": "Assigner l'instance au répartiteur de charge",
-    "label.assign.vms": "Assigner VMs",
-    "label.assigned.vms": "VMs Assignées",
-    "label.associate.public.ip": "Associer IP Publique",
-    "label.associated.network": "Réseau associé",
-    "label.associated.network.id": "ID du réseau associé",
-    "label.associated.profile": "Profil associé",
-    "label.attached.iso": "Image ISO attachée",
-    "label.author.email": "Email auteur",
-    "label.author.name": "Nom auteur",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "Assistant de configuration AutoScale",
-    "label.availability": "Disponibilité",
-    "label.availability.zone": "Zone de disponibilité",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "Disponible",
-    "label.available.public.ips": "Adresses IP publiques disponibles",
-    "label.back": "Retour",
-    "label.bandwidth": "Bande passante",
-    "label.baremetal.dhcp.devices": "Équipements DHCP Baremetal",
-    "label.baremetal.dhcp.provider": "Fournisseur DHCP Baremetal",
-    "label.baremetal.pxe.device": "Ajouter un PXE Baremetal",
-    "label.baremetal.pxe.devices": "Équipements PXE Baremetal",
-    "label.baremetal.pxe.provider": "Fournisseur PXE Baremetal",
-    "label.baremetal.rack.configuration": "Configuration Rack Baremetal",
-    "label.basic": "Basique",
-    "label.basic.mode": "Mode basique",
-    "label.bigswitch.bcf.details": "Détails BigSwitch BCF",
-    "label.bigswitch.bcf.nat": "NAT activé BigSwitch BCF",
-    "label.bigswitch.controller.address": "Adresse du contrôleur BigSwitch Vns",
-    "label.blade.id": "ID Lame",
-    "label.blades": "Lames",
-    "label.bootable": "Amorçable",
-    "label.broadcast.domain.range": "Plage du domaine multi-diffusion",
-    "label.broadcast.domain.type": "Type de domaine de multi-diffusion",
-    "label.broadcast.uri": "URI multi-diffusion",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "URI multi-diffusion",
-    "label.brocade.vcs.address": "Adress Vcs Switch",
-    "label.brocade.vcs.details": "Détails Switch Brocade Vcs",
-    "label.by.account": "Par compte",
-    "label.by.alert.type": "Par type d'alerte",
-    "label.by.availability": "Par disponibilité",
-    "label.by.date.end": "Par date (fin)",
-    "label.by.date.start": "Par date (début)",
-    "label.by.domain": "Par domaine",
-    "label.by.end.date": "Par date de fin",
-    "label.by.event.type": "Par type d'événement",
-    "label.by.level": "Par niveau",
-    "label.by.pod": "Par Pod",
-    "label.by.role": "Par rôle",
-    "label.by.start.date": "Par date de début",
-    "label.by.state": "Par état",
-    "label.by.traffic.type": "Par type de trafic",
-    "label.by.type": "Par type",
-    "label.by.type.id": "Par type d'ID",
-    "label.by.zone": "Par zone",
-    "label.bytes.received": "Octets reçus",
-    "label.bytes.sent": "Octets envoyés",
-    "label.cache.mode": "Type Write-cache",
-    "label.cancel": "Annuler",
-    "label.capacity": "Capacité",
-    "label.capacity.bytes": "Capacité Octets",
-    "label.capacity.iops": "Capacité IOPS",
-    "label.certificate": "Certificat",
-    "label.change.affinity": "Changer Affinité",
-    "label.change.ipaddress": "Changer adresse IP pour NIC",
-    "label.change.service.offering": "Modifier Offre Service",
-    "label.change.value": "Modifier la valeur",
-    "label.character": "Caractère",
-    "label.chassis": "Châssis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR ou Compte/Groupe de sécurité",
-    "label.cidr.list": "CIDR Source",
-    "label.cisco.nexus1000v.ip.address": "Adresse IP Nexus 1000v",
-    "label.cisco.nexus1000v.password": "Mot de passe Nexus 1000v",
-    "label.cisco.nexus1000v.username": "Identifiant Nexus 1000v",
-    "label.ciscovnmc.resource.details": "Détails ressource CiscoVNMC",
-    "label.clean.up": "Nettoyage",
-    "label.clear.list": "Purger la liste",
-    "label.close": "Fermer",
-    "label.cloud.console": "Console d'Administration du Cloud",
-    "label.cloud.managed": "Géré par Cloud.com",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Nom du cluster",
-    "label.cluster.type": "Type de Cluster",
-    "label.clusters": "Clusters",
-    "label.clvm": "CLVM",
-    "label.code": "Code",
-    "label.community": "Communauté",
-    "label.compute": "Processeur",
-    "label.compute.and.storage": "Calcul et Stockage",
-    "label.compute.offering": "Offre de calcul",
-    "label.compute.offerings": "Offres de Calcul",
-    "label.configuration": "Configuration",
-    "label.configure": "Configurer",
-    "label.configure.ldap": "Configurer LDAP",
-    "label.configure.network.ACLs": "Configurer les règles d'accès réseau ACL",
-    "label.configure.sticky.policy": "Configurer Stratégie Sticky",
-    "label.configure.vpc": "Configurer le VPC",
-    "label.confirm.password": "Confirmer le mot de passe",
-    "label.confirmation": "Confirmation",
-    "label.congratulations": "Félicitations !",
-    "label.conserve.mode": "Conserver le mode",
-    "label.console.proxy": "Console proxy",
-    "label.console.proxy.vm": "VM Console Proxy",
-    "label.continue": "Continuer",
-    "label.continue.basic.install": "Continuer avec l'installation basique",
-    "label.copying.iso": "Copie ISO",
-    "label.corrections.saved": "Modifications enregistrées",
-    "label.counter": "Compteur",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU allouée",
-    "label.cpu.allocated.for.VMs": "CPU allouée aux VMs",
-    "label.cpu.limits": "Limites CPU",
-    "label.cpu.mhz": "CPU (en MHz)",
-    "label.cpu.utilized": "CPU utilisée",
-    "label.create.VPN.connection": "Créer une connexion VPN",
-    "label.create.nfs.secondary.staging.storage": "Créer le Stockage Secondaire Intermédiaire NFS",
-    "label.create.nfs.secondary.staging.store": "Créer le stockage secondaire intermédiaire NFS",
-    "label.create.project": "Créer un projet",
-    "label.create.ssh.key.pair": "Créer une bi-clé SSH",
-    "label.create.template": "Créer un modèle",
-    "label.created": "Créé",
-    "label.created.by.system": "Créé par le système",
-    "label.cross.zones": "Multi Zones",
-    "label.custom": "Personnalisé",
-    "label.custom.disk.iops": "IOPS personnalisé",
-    "label.custom.disk.offering": "Offre de disque personnalisée",
-    "label.custom.disk.size": "Personalisable",
-    "label.daily": "Quotidien",
-    "label.data.disk.offering": "Offre de disque de données",
-    "label.date": "Date",
-    "label.day": "Jour",
-    "label.day.of.month": "Jour du mois",
-    "label.day.of.week": "Jour de la semaine",
-    "label.dc.name": "Nom DC",
-    "label.dead.peer.detection": "Détection de pair mort",
-    "label.decline.invitation": "Refuser l'invitation",
-    "label.dedicate": "Dédier",
-    "label.dedicate.cluster": "Dédier Cluster",
-    "label.dedicate.host": "Dédier Hôte",
-    "label.dedicate.pod": "Dédier Pod",
-    "label.dedicate.vlan.vni.range": "Plage VLAN/VNI dédiée",
-    "label.dedicate.zone": "Dédier Zone",
-    "label.dedicated": "Dédié",
-    "label.dedicated.vlan.vni.ranges": "Plages VLAN/VNI dédiées",
-    "label.default": "Par défaut",
-    "label.default.egress.policy": "Politique Egress par défaut",
-    "label.default.use": "Utilisation par défaut",
-    "label.default.view": "Vue par défaut",
-    "label.delete": "Supprimer",
-    "label.delete.BigSwitchBcf": "Supprimer contrôleur BigSwitch BCF",
-    "label.delete.BrocadeVcs": "Supprimer Brocade Vcs Switch",
-    "label.delete.F5": "Supprimer F5",
-    "label.delete.NetScaler": "Supprimer Netscaler",
-    "label.delete.NiciraNvp": "Supprimer un contrôleur Nvp",
-    "label.delete.OpenDaylight.device": "Supprimer contrôleur OpenDaylight",
-    "label.delete.PA": "Supprimer Palo Alto",
-    "label.delete.SRX": "Supprimer SRX",
-    "label.delete.VPN.connection": "Supprimer la connexion VPN",
-    "label.delete.VPN.customer.gateway": "Supprimer la passerelle VPN client",
-    "label.delete.VPN.gateway": "Supprimer la passerelle VPN",
-    "label.delete.acl.list": "Supprimer Liste ACL",
-    "label.delete.affinity.group": "Supprimer le groupe d'affinité",
-    "label.delete.alerts": "Supprimer alertes",
-    "label.delete.baremetal.rack.configuration": "Supprimer Configuration Rack Baremetal",
-    "label.delete.ciscoASA1000v": "Supprimer CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Supprimer ressource CiscoVNMC",
-    "label.delete.events": "Supprimer événements",
-    "label.delete.gateway": "Supprimer la passerelle",
-    "label.delete.internal.lb": "Supprimer LB interne",
-    "label.delete.portable.ip.range": "Supprimer Plage IP portable",
-    "label.delete.profile": "Supprimer Profil",
-    "label.delete.project": "Supprimer projet",
-    "label.delete.role": "Supprimer Rôle",
-    "label.delete.secondary.staging.store": "Supprimer Stockage Secondaire Intermédiaire",
-    "label.delete.ucs.manager": "Supprimer Gestionnaire UCS",
-    "label.delete.vpn.user": "Supprimer l'utilisateur VPN",
-    "label.deleting.failed": "Suppression échouée",
-    "label.deleting.processing": "Suppression...",
-    "label.deny": "Interdire",
-    "label.deployment.planner": "Planning déploiement",
-    "label.description": "Description",
-    "label.destination.physical.network.id": "Identifiant du réseau physique de destination",
-    "label.destination.zone": "Zone de destination",
-    "label.destroy": "Détruire",
-    "label.destroy.router": "Supprimer le routeur",
-    "label.destroy.vm.graceperiod": "Détruire Période de grâce VM",
-    "label.detaching.disk": "Détacher le disque",
-    "label.details": "Détails",
-    "label.device.id": "ID du périphérique",
-    "label.devices": "Machines",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "IP publique attachée directement",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Adresses IP du réseau partagé",
-    "label.disable.autoscale": "Désactiver Autoscale",
-    "label.disable.host": "Désactiver Hôte",
-    "label.disable.network.offering": "Désactiver Offre de réseau",
-    "label.disable.provider": "Désactiver ce fournisseur",
-    "label.disable.vnmc.provider": "Désactiver fournisseur VNMC",
-    "label.disable.vpc.offering": "Désactiver offre VPC",
-    "label.disable.vpn": "Désactiver le VPN",
-    "label.disabled": "Désactivé",
-    "label.disabling.vpn.access": "Désactiver l'accès VPN",
-    "label.disassociate.profile.blade": "Dé-associer le Profil de la Lame",
-    "label.disbale.vnmc.device": "Désactiver VNMC",
-    "label.disk.allocated": "Disque Alloué",
-    "label.disk.bytes.read.rate": "Débit lecture disque (BPS)",
-    "label.disk.bytes.write.rate": "Débit écriture disque (BPS)",
-    "label.disk.iops.max": "IOPS maximum",
-    "label.disk.iops.min": "IOPS minimum",
-    "label.disk.iops.read.rate": "Débit lecture disque (IOPS)",
-    "label.disk.iops.total": "IOPS Total",
-    "label.disk.iops.write.rate": "Débit écriture disque (IOPS)",
-    "label.disk.offering": "Offre de Disque",
-    "label.disk.offering.details": "Détails offre de disque",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Type de provisionnement",
-    "label.disk.read.bytes": "Lecture Disque (Octets)",
-    "label.disk.read.io": "Lecture Disque (IO)",
-    "label.disk.size": "Capacité disque",
-    "label.disk.size.gb": "Capacité disque (Go)",
-    "label.disk.total": "Espace disque total",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Volume disque",
-    "label.disk.write.bytes": "Écriture Disque (Octets)",
-    "label.disk.write.io": "Écriture Disque (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Nom d'affichage",
-    "label.display.text": "Texte affiché",
-    "label.distributedrouter": "Routeur Distribué",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domaine",
-    "label.domain.admin": "Administrateur du domaine",
-    "label.domain.details": "Détails domaine",
-    "label.domain.id": "ID du domaine",
-    "label.domain.lower": "domaine",
-    "label.domain.name": "Nom de domaine",
-    "label.domain.router": "Routeur du domaine",
-    "label.domain.suffix": "Suffixe de domaine DNS (i.e., xyz.com)",
-    "label.done": "Terminé",
-    "label.double.quotes.are.not.allowed": "Les guillemets ne sont pas autorisées",
-    "label.download.progress": "Progression du téléchargement",
-    "label.drag.new.position": "Déplacer sur une autre position",
-    "label.duration.in.sec": "Durée (en sec)",
-    "label.dynamically.scalable": "Dimensionnement dynamique",
-    "label.edit": "Modifier",
-    "label.edit.acl.rule": "Modifier règle ACL",
-    "label.edit.affinity.group": "Modifier le groupe d'affinité",
-    "label.edit.lb.rule": "Modifier la règle LB",
-    "label.edit.network.details": "Modifier les paramètres réseau",
-    "label.edit.project.details": "Modifier les détails du projet",
-    "label.edit.region": "Éditer Région",
-    "label.edit.role": "Éditer Rôle",
-    "label.edit.rule": "Modifier règle",
-    "label.edit.secondary.ips": "Éditer IPs secondaires",
-    "label.edit.tags": "Modifier les balises",
-    "label.edit.traffic.type": "Modifier le type de trafic",
-    "label.edit.vpc": "Modifier le VPC",
-    "label.egress.default.policy": "Politique par défaut Egress",
-    "label.egress.rule": "Règle sortante",
-    "label.egress.rules": "Règles de sortie",
-    "label.elastic": "Élastique",
-    "label.elastic.IP": "IP extensible",
-    "label.elastic.LB": "Répartition de charge extensible",
-    "label.email": "Email",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Activer Autoscale",
-    "label.enable.host": "Activer Hôte",
-    "label.enable.network.offering": "Activer Offre de réseau",
-    "label.enable.provider": "Activer le fournisseur",
-    "label.enable.s3": "Activer le stockage secondaire de type S3",
-    "label.enable.swift": "Activer Swift",
-    "label.enable.vnmc.device": "Activer VNMC",
-    "label.enable.vnmc.provider": "Activer fournisseur VNMC",
-    "label.enable.vpc.offering": "Activer offre VPC",
-    "label.enable.vpn": "Activer VPN",
-    "label.enabling.vpn": "Activation du VPN",
-    "label.enabling.vpn.access": "Activation de l'accès VPN",
-    "label.end.IP": "IP fin plage",
-    "label.end.port": "Port de fin",
-    "label.end.reserved.system.IP": "Adresse IP de fin réservée Système",
-    "label.end.vlan": "Fin VLAN",
-    "label.end.vxlan": "Fin VXLAN",
-    "label.endpoint": "Terminaison",
-    "label.endpoint.or.operation": "Terminaison ou Opération",
-    "label.enter.token": "Entrez le jeton unique",
-    "label.error": "Erreur",
-    "label.error.code": "Code d'erreur",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "Hôte ESX/ESXi",
-    "label.event": "Événement",
-    "label.event.archived": "Événement archivé",
-    "label.event.deleted": "Événement supprimé",
-    "label.every": "Tous",
-    "label.example": "Exemple",
-    "label.expunge": "Purger",
-    "label.external.link": "Lien externe",
-    "label.extractable": "Téléchargeable",
-    "label.extractable.lower": "Téléchargeable",
-    "label.f5": "F5",
-    "label.f5.details": "Détails F5",
-    "label.failed": "Échoué",
-    "label.featured": "Sponsorisé",
-    "label.fetch.latest": "Rafraîchir",
-    "label.filterBy": "Filtre",
-    "label.fingerprint": "Empreinte",
-    "label.firewall": "Pare-feu",
-    "label.first.name": "Prénom",
-    "label.firstname.lower": "prénom",
-    "label.format": "Format",
-    "label.format.lower": "format",
-    "label.friday": "Vendredi",
-    "label.full": "Complet",
-    "label.full.path": "Chemin complet",
-    "label.gateway": "Passerelle",
-    "label.general.alerts": "Alertes générales",
-    "label.generating.url": "Génération de l'URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "Configuration GloboDNS",
-    "label.gluster.volume": "Volume",
-    "label.go.step.2": "Aller à l'étape 2",
-    "label.go.step.3": "Aller à l'étape 3",
-    "label.go.step.4": "Aller à l'étape 4",
-    "label.go.step.5": "Aller à l'étape 5",
-    "label.gpu": "GPU",
-    "label.group": "Groupe",
-    "label.group.by.account": "Regrouper par compte",
-    "label.group.by.cluster": "Regrouper par cluster",
-    "label.group.by.pod": "Regrouper par pod",
-    "label.group.by.zone": "Regrouper par zone",
-    "label.group.optional": "Groupe (optionnel)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Répartition de charge assignée",
-    "label.gslb.assigned.lb.more": "Assigner plus de répartition de charge",
-    "label.gslb.delete": "Supprimer GSLB",
-    "label.gslb.details": "Détails GSLB",
-    "label.gslb.domain.name": "Nom de domaine GSLB",
-    "label.gslb.lb.details": "Détails répartition de charge",
-    "label.gslb.lb.remove": "Supprimer répartition de charge depuis ce GSLB",
-    "label.gslb.lb.rule": "Règle de répartition de charge",
-    "label.gslb.service": "Service GSLB",
-    "label.gslb.service.private.ip": "IP privée service GSLB",
-    "label.gslb.service.public.ip": "IP publique service GSLB",
-    "label.gslb.servicetype": "Type service",
-    "label.guest": "Invité",
-    "label.guest.cidr": "CIDR invité",
-    "label.guest.end.ip": "Adresse IP de fin pour les invités",
-    "label.guest.gateway": "Passerelle pour les invités",
-    "label.guest.ip": "Adresse IP des invités",
-    "label.guest.ip.range": "Plage d'adresses IP des invités",
-    "label.guest.netmask": "Masque de réseau des invités",
-    "label.guest.network.details": "Détails réseau invité",
-    "label.guest.networks": "Réseaux d'invité",
-    "label.guest.start.ip": "Adresse IP de début pour les invités",
-    "label.guest.traffic": "Trafic invité",
-    "label.guest.traffic.vswitch.name": "Nom Trafic Invité vSwitch",
-    "label.guest.traffic.vswitch.type": "Type Trafic Invité vSwitch",
-    "label.guest.type": "Type d'invité",
-    "label.ha.enabled": "Haute disponibilité activée",
-    "label.health.check": "Vérification statut",
-    "label.health.check.advanced.options": "Options avancées :",
-    "label.health.check.configurations.options": "Options de configuration :",
-    "label.health.check.interval.in.sec": "Fréquence de vérification d'état (sec)",
-    "label.health.check.message.desc": "Votre répartiteur de charge va automatiquement effectuer des vérifications d'état sur vos instances CloudStack et router seulement le trafic vers les instances ayant passées les vérifications avec succès",
-    "label.health.check.wizard": "Assistant Vérification Santé",
-    "label.healthy.threshold": "Seuil d'état",
-    "label.help": "Aide",
-    "label.hide.ingress.rule": "Cacher la règle d'entrée",
-    "label.hints": "Astuces",
-    "label.home": "Accueil",
-    "label.host": "Hôte",
-    "label.host.MAC": "Adresse MAC hôte",
-    "label.host.alerts": "Hôtes en état d'Alerte",
-    "label.host.name": "Nom d'hôte",
-    "label.host.tag": "Etiquette hôte",
-    "label.host.tags": "Étiquettes d'hôte",
-    "label.hosts": "Hôtes",
-    "label.hourly": "Chaque heure",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "Libellé trafic HyperV",
-    "label.hypervisor": "Hyperviseur",
-    "label.hypervisor.capabilities": "Fonctions hyperviseur",
-    "label.hypervisor.snapshot.reserve": "Réserve d'instantanée de l'Hyperviseur",
-    "label.hypervisor.type": "Type d'hyperviseur",
-    "label.hypervisor.version": "Version hyperviseur",
-    "label.hypervisors": "Hyperviseurs",
-    "label.id": "ID",
-    "label.info": "Information",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Règle d'entrée",
-    "label.initiated.by": "Initié par",
-    "label.inside.port.profile": "Profil Port entrant",
-    "label.installWizard.addClusterIntro.subtitle": "Qu'est ce qu'un cluster ?",
-    "label.installWizard.addClusterIntro.title": "Ajoutons un cluster",
-    "label.installWizard.addHostIntro.subtitle": "Qu'est ce qu'un hôte ?",
-    "label.installWizard.addHostIntro.title": "Ajoutons un hôte",
-    "label.installWizard.addPodIntro.subtitle": "Qu'est ce qu'un pod ?",
-    "label.installWizard.addPodIntro.title": "Ajoutons un pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Qu'est ce que le stockage primaire ?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Ajoutons du stockage primaire",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Qu'est ce que le stockage secondaire ?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Ajoutons du stockage secondaire",
-    "label.installWizard.addZone.title": "Ajouter une zone",
-    "label.installWizard.addZoneIntro.subtitle": "Qu'est ce qu'une zone ?",
-    "label.installWizard.addZoneIntro.title": "Ajoutons une zone",
-    "label.installWizard.click.launch": "Appuyer sur le bouton démarrer.",
-    "label.installWizard.subtitle": "Ce tutoriel vous aidera à configurer votre installation CloudStack&#8482;",
-    "label.installWizard.title": "Bonjour et bienvenue dans CloudStack&#8482;",
-    "label.instance": "Instance",
-    "label.instance.limits": "Limites des instances",
-    "label.instance.name": "Nom de l'instance",
-    "label.instance.port": "Port Instance",
-    "label.instance.scaled.up": "Instance agrandie",
-    "label.instances": "Instances",
-    "label.instanciate.template.associate.profile.blade": "Instancier Modèle et Profil associé à la Lame",
-    "label.intermediate.certificate": "Certificat intermédiaire {0}",
-    "label.internal.dns.1": "DNS interne 1",
-    "label.internal.dns.2": "DNS interne 2",
-    "label.internal.lb": "Répartiteur interne",
-    "label.internal.lb.details": "Détails du LB interne",
-    "label.internal.name": "Nom interne",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Type d'intervalle",
-    "label.introduction.to.cloudstack": "Introduction à CloudStack&#8482;",
-    "label.invalid.integer": "Nombre entier invalide",
-    "label.invalid.number": "Nombre invalide",
-    "label.invitations": "Invitations",
-    "label.invite": "Inviter",
-    "label.invite.to": "Inviter sur",
-    "label.invited.accounts": "Comptes invités",
-    "label.ip": "IP",
-    "label.ip.address": "Adresse IP",
-    "label.ip.allocations": "Allocations de IPs",
-    "label.ip.limits": "Limite de IPs publiques",
-    "label.ip.or.fqdn": "IP ou FQDN",
-    "label.ip.range": "Plage IP",
-    "label.ip.ranges": "Plages IP",
-    "label.ipaddress": "Adresse IP",
-    "label.ips": "Adresse IP",
-    "label.ipv4.cidr": "CIDR IPv4",
-    "label.ipv4.dns1": "DNS1 IPv4",
-    "label.ipv4.dns2": "DNS2 IPv4",
-    "label.ipv4.end.ip": "IP fin IPv4",
-    "label.ipv4.gateway": "Passerelle IPv4",
-    "label.ipv4.netmask": "Masque de réseau IPv4",
-    "label.ipv4.start.ip": "IP début IPv4",
-    "label.ipv6.CIDR": "CIDR IPv6",
-    "label.ipv6.address": "Adresse IPv6",
-    "label.ipv6.dns1": "DNS1 IPv6",
-    "label.ipv6.dns2": "DNS2 IPv6",
-    "label.ipv6.end.ip": "IP fin IPv6",
-    "label.ipv6.gateway": "Passerelle IPv6",
-    "label.ipv6.start.ip": "IP début IPv6",
-    "label.is.default": "Est par défaut",
-    "label.is.redundant.router": "Redondant",
-    "label.is.shared": "Est partagé",
-    "label.is.system": "Est Système",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "Démarrage par ISO",
-    "label.isolated.networks": "Réseaux isolés",
-    "label.isolation.method": "Isolation",
-    "label.isolation.mode": "Mode d'isolation",
-    "label.isolation.uri": "URI d'isolation",
-    "label.item.listing": "Liste des éléments",
-    "label.japanese.keyboard": "Clavier japonais",
-    "label.keep": "Conserver",
-    "label.keep.colon": "Conserver :",
-    "label.key": "Clef",
-    "label.keyboard.language": "Langage clavier",
-    "label.keyboard.type": "Type de clavier",
-    "label.kvm.traffic.label": "Libellé trafic KVM",
-    "label.label": "Libellé",
-    "label.lang.arabic": "Arabe",
-    "label.lang.brportugese": "Portuguais Brésil",
-    "label.lang.catalan": "Catalan",
-    "label.lang.chinese": "Chinois (simplifié)",
-    "label.lang.dutch": "Néerlandais",
-    "label.lang.english": "Anglais",
-    "label.lang.french": "Français",
-    "label.lang.german": "Allemand",
-    "label.lang.hungarian": "Hongrois",
-    "label.lang.italian": "Italien",
-    "label.lang.japanese": "Japonais",
-    "label.lang.korean": "Coréen",
-    "label.lang.norwegian": "Norvégien",
-    "label.lang.polish": "Polonais",
-    "label.lang.russian": "Russe",
-    "label.lang.spanish": "Espagnol",
-    "label.last.disconnected": "Dernière Déconnexion",
-    "label.last.name": "Nom",
-    "label.lastname.lower": "nom",
-    "label.latest.events": "Derniers événements",
-    "label.launch": "Démarrer",
-    "label.launch.vm": "Démarrer VM",
-    "label.launch.zone": "Démarrer la zone",
-    "label.lb.algorithm.leastconn": "Le moins de connexions",
-    "label.lb.algorithm.roundrobin": "Cyclique",
-    "label.lb.algorithm.source": "Origine",
-    "label.ldap.configuration": "Configuration LDAP",
-    "label.ldap.group.name": "Groupe LDAP",
-    "label.ldap.link.type": "Type",
-    "label.ldap.port": "Port LDAP",
-    "label.level": "Niveau",
-    "label.link.domain.to.ldap": "Lien Domaine vers LDAP",
-    "label.linklocal.ip": "Adresse IP lien local",
-    "label.load.balancer": "Répartiteur de charge",
-    "label.load.balancer.type": "Type Répartiteur de charge",
-    "label.load.balancing": "Répartition de charge",
-    "label.load.balancing.policies": "Règles de répartition de charge",
-    "label.loading": "Chargement en cours",
-    "label.local": "Local",
-    "label.local.file": "Fichier local",
-    "label.local.storage": "Stockage local",
-    "label.local.storage.enabled": "Activer le stockage local pour les VMs Utilisateurs",
-    "label.local.storage.enabled.system.vms": "Activer le stockage local pour les VMs Systèmes",
-    "label.login": "Connexion",
-    "label.logout": "Déconnexion",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "Libellé trafic LXC",
-    "label.make.project.owner": "Devenir propriétaire du projet",
-    "label.make.redundant": "Rendre redondant",
-    "label.manage": "Géré",
-    "label.manage.resources": "Gérer les ressources",
-    "label.managed": "Géré",
-    "label.management": "Administration",
-    "label.management.ips": "Adresses IP de gestion",
-    "label.management.server": "Serveur de gestion",
-    "label.management.servers": "Serveurs de gestion",
-    "label.max.cpus": "Nombre coeurs CPU max.",
-    "label.max.guest.limit": "Nombre maximum d'invités",
-    "label.max.instances": "Instance Max.",
-    "label.max.memory": "Mémoire max. (Mo)",
-    "label.max.networks": "Réseaux Max.",
-    "label.max.primary.storage": "Principal max. (Go)",
-    "label.max.public.ips": "Max. IP publiques",
-    "label.max.secondary.storage": "Secondaire max. (Go)",
-    "label.max.snapshots": "Max instantanées",
-    "label.max.templates": "Max. modèles",
-    "label.max.vms": "Max. VMs utilisateur",
-    "label.max.volumes": "Max. volumes",
-    "label.max.vpcs": "Max. VPCs",
-    "label.maximum": "Maximum",
-    "label.may.continue": "Vous pouvez continuer.",
-    "label.md5.checksum": "Empreinte MD5",
-    "label.memory": "Mémoire (en Mo)",
-    "label.memory.allocated": "Mémoire allouée",
-    "label.memory.limits": "Limites mémoire (Mo)",
-    "label.memory.mb": "Mémoire (en MB)",
-    "label.memory.total": "Mémoire totale",
-    "label.memory.used": "Mémoire utilisée",
-    "label.menu.accounts": "Comptes",
-    "label.menu.alerts": "Alertes",
-    "label.menu.all.accounts": "Tous les comptes",
-    "label.menu.all.instances": "Toutes les instances",
-    "label.menu.community.isos": "ISO de la communauté",
-    "label.menu.community.templates": "Modèles de la communauté",
-    "label.menu.configuration": "Configuration",
-    "label.menu.dashboard": "Tableau de bord",
-    "label.menu.destroyed.instances": "Instances détruites",
-    "label.menu.disk.offerings": "Offres de Disque",
-    "label.menu.domains": "Domaines",
-    "label.menu.events": "Événements",
-    "label.menu.featured.isos": "ISOs Sponsorisées",
-    "label.menu.featured.templates": "Modèles sponsorisés",
-    "label.menu.global.settings": "Paramètres globaux",
-    "label.menu.infrastructure": "Infrastructure",
-    "label.menu.instances": "Instances",
-    "label.menu.ipaddresses": "Adresses IP",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "Mes comptes",
-    "label.menu.my.instances": "Mes instances",
-    "label.menu.my.isos": "Mes ISOs",
-    "label.menu.my.templates": "Mes modèles",
-    "label.menu.network": "Réseau",
-    "label.menu.network.offerings": "Offres de Réseau",
-    "label.menu.physical.resources": "Ressources physiques",
-    "label.menu.regions": "Régions",
-    "label.menu.running.instances": "Instances actives",
-    "label.menu.security.groups": "Groupes de sécurité",
-    "label.menu.service.offerings": "Offres de Service",
-    "label.menu.snapshots": "Instantanés",
-    "label.menu.sshkeypair": "Bi-clé SSH",
-    "label.menu.stopped.instances": "Instances Arrêtées",
-    "label.menu.storage": "Stockage",
-    "label.menu.system": "Système",
-    "label.menu.system.service.offerings": "Offres de Système",
-    "label.menu.system.vms": " VMs Systèmes",
-    "label.menu.templates": "Modèles",
-    "label.menu.virtual.appliances": "Appliances Virtuelles",
-    "label.menu.virtual.resources": "Ressources Virtuelles",
-    "label.menu.volumes": "Volumes",
-    "label.menu.vpc.offerings": "Offres de VPC",
-    "label.metrics": "Métriques",
-    "label.metrics.allocated": "Alloué",
-    "label.metrics.clusters": "Clusters",
-    "label.metrics.cpu.allocated": "Allocation CPU",
-    "label.metrics.cpu.max.dev": "Écart",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "Util. CPU",
-    "label.metrics.cpu.used.avg": "Utilisé",
-    "label.metrics.disk": "Disque",
-    "label.metrics.disk.allocated": "Alloué",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Lecture",
-    "label.metrics.disk.size": "Capacité",
-    "label.metrics.disk.storagetype": "Type",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Non alloué",
-    "label.metrics.disk.usage": "Util. Disque",
-    "label.metrics.disk.used": "Utilisé",
-    "label.metrics.disk.write": "Écriture",
-    "label.metrics.hosts": "Hôtes",
-    "label.metrics.memory.allocated": "Allocation Mém.",
-    "label.metrics.memory.max.dev": "Écart",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Util. Mém.",
-    "label.metrics.memory.used.avg": "Utilisé",
-    "label.metrics.name": "Nom",
-    "label.metrics.network.read": "Lecture",
-    "label.metrics.network.usage": "Util. Réseau",
-    "label.metrics.network.write": "Écriture",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Status Alimentation",
-    "label.metrics.property": "Propriété",
-    "label.metrics.scope": "Portée",
-    "label.metrics.state": "État",
-    "label.metrics.storagepool": "Pool de stockage",
-    "label.metrics.vm.name": "Nom VM",
-    "label.migrate.instance.to": "Migrer l'instance vers",
-    "label.migrate.instance.to.host": "Migration de l'instance sur un autre hôte",
-    "label.migrate.instance.to.ps": "Migration de l'instance sur un autre stockage primaire",
-    "label.migrate.lb.vm": "Migrer LB VM",
-    "label.migrate.router.to": "Migrer le routeur vers",
-    "label.migrate.systemvm.to": "Migrer la VM système vers",
-    "label.migrate.to.host": "Migrer vers un hôte",
-    "label.migrate.to.storage": "Migrer vers un stockage",
-    "label.migrate.volume": "Volume Migré",
-    "label.migrate.volume.to.primary.storage": "Migration du volume vers un autre stockage primaire",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Instances Min.",
-    "label.min.past.the.hr": "min ap. l'heure",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "minute(s) après l'heure",
-    "label.minutes.past.hour": "minute(s) après l'heure",
-    "label.mode": "Mode",
-    "label.monday": "Lundi",
-    "label.monthly": "Mensuel",
-    "label.more.templates": "Plus de modèles",
-    "label.move.down.row": "Descendre d'un niveau",
-    "label.move.to.bottom": "Déplacer en bas",
-    "label.move.to.top": "Placer au dessus",
-    "label.move.up.row": "Monter d'un niveau",
-    "label.my.account": "Mon compte",
-    "label.my.network": "Mon réseau",
-    "label.my.templates": "Mes modèles",
-    "label.na": "N/A",
-    "label.name": "Nom",
-    "label.name.lower": "name",
-    "label.name.optional": "Nom (optionnel)",
-    "label.nat.port.range": "Plage de port NAT",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Masque de réseau",
-    "label.netscaler.details": "Détails NetScaler",
-    "label.network": "Réseau",
-    "label.network.ACL": "Règles d'accès réseau ACL",
-    "label.network.ACL.total": "Total Règles d'accès réseau",
-    "label.network.ACLs": "Règles d'accès réseau",
-    "label.network.addVM": "Ajouter réseau à la VM",
-    "label.network.cidr": "CIDR réseau",
-    "label.network.desc": "Description réseau",
-    "label.network.details": "Détails réseau",
-    "label.network.device": "Équipement Réseau",
-    "label.network.device.type": "Type d'équipement réseau",
-    "label.network.domain": "Nom de domaine",
-    "label.network.domain.text": "Domaine réseau",
-    "label.network.id": "ID réseau",
-    "label.network.label.display.for.blank.value": "Utiliser la passerelle par défaut",
-    "label.network.limits": "Limites réseau",
-    "label.network.name": "Nom du réseau",
-    "label.network.offering": "Offre de Réseau",
-    "label.network.offering.details": "Détails offre de réseau",
-    "label.network.offering.display.text": "Texte affiché Offre Réseau",
-    "label.network.offering.id": "ID Offre Réseau",
-    "label.network.offering.name": "Nom Offre Réseau",
-    "label.network.rate": "Débit Réseau",
-    "label.network.rate.megabytes": "Débit réseau (Mo/s)",
-    "label.network.read": "Lecture réseau",
-    "label.network.service.providers": "Fournisseurs de service réseau",
-    "label.network.type": "Type de réseau",
-    "label.network.write": "Écriture réseau",
-    "label.networking.and.security": "Réseau et sécurité",
-    "label.networks": "Réseaux",
-    "label.new": "Nouveau",
-    "label.new.password": "Nouveau mot de passe",
-    "label.current.password": "Current Password",
-    "label.new.project": "Nouveau projet",
-    "label.new.ssh.key.pair": "Nouvelle bi-clé SSH",
-    "label.new.vm": "Nouvelle VM",
-    "label.next": "Suivant",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "Serveur NFS",
-    "label.nfs.storage": "Stockage NFS",
-    "label.nic.adapter.type": "Type de carte réseau",
-    "label.nicira.controller.address": "Adresse du contrôleur",
-    "label.nicira.l2gatewayserviceuuid": "Uuid du service passerelle L2",
-    "label.nicira.l3gatewayserviceuuid": "Uuid du service passerelle L3",
-    "label.nicira.nvp.details": "Détails Nicira NVP",
-    "label.nicira.transportzoneuuid": "Uuid de la Zone Transport",
-    "label.nics": "Cartes NIC",
-    "label.no": "Non",
-    "label.no.actions": "Aucune action disponible",
-    "label.no.alerts": "Aucune alerte récente",
-    "label.no.data": "Aucune donnée",
-    "label.no.errors": "Aucune erreur récente",
-    "label.no.grouping": "(pas de groupement)",
-    "label.no.isos": "Aucun ISOs disponible",
-    "label.no.items": "Aucun élément disponible",
-    "label.no.security.groups": "Aucun groupe de sécurité disponible",
-    "label.no.thanks": "Non merci",
-    "label.none": "Aucun",
-    "label.not.found": "Introuvable",
-    "label.notifications": "Messages",
-    "label.num.cpu.cores": "Nombre de cœurs",
-    "label.number.of.clusters": "Nombre de clusters",
-    "label.number.of.cpu.sockets": "Le nombre de sockets CPU",
-    "label.number.of.hosts": "Nombre d'Hôtes",
-    "label.number.of.management.servers":"Nombre de serveurs de gestion",
-    "label.number.of.pods": "Nombre de Pods",
-    "label.number.of.system.vms": "Nombre de VM Système",
-    "label.number.of.virtual.routers": "Nombre de routeurs virtuels",
-    "label.number.of.zones": "Nombre de zones",
-    "label.numretries": "Nombre de tentatives",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "du mois",
-    "label.offer.ha": "Offrir la haute disponibilité",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "Contrôleur OpenDaylight",
-    "label.opendaylight.controllerdetail": "Détails Contrôleur OpenDaylight",
-    "label.opendaylight.controllers": "Contrôleurs OpenDaylight",
-    "label.operator": "Opérateur",
-    "label.optional": "Facultatif",
-    "label.order": "Ordre",
-    "label.os.preference": "Préférence OS",
-    "label.os.type": "Type du OS",
-    "label.other": "Autre",
-    "label.outofbandmanagement": "Gestion flux administration",
-    "label.outofbandmanagement.action": "Action",
-    "label.outofbandmanagement.action.issue": "Problème dans l'allumage via la gestion du flux administration",
-    "label.outofbandmanagement.address": "Adresse",
-    "label.outofbandmanagement.changepassword": "Modifier le mot de passe du flux d'administration",
-    "label.outofbandmanagement.configure": "Configurer la gestion du flux d'administration",
-    "label.outofbandmanagement.disable": "Désactiver la gestion du flux d'administration",
-    "label.outofbandmanagement.driver": "Pilote",
-    "label.outofbandmanagement.enable": "Activer la gestion du flux d'administration",
-    "label.outofbandmanagement.password": "Mot de passe",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-saisir Mot de passe",
-    "label.outofbandmanagement.username": "Identifiant",
-    "label.override.guest.traffic": "Remplacer Trafic-invité",
-    "label.override.public.traffic": "Remplacer Trafic-public",
-    "label.ovm.traffic.label": "Libellé trafic OVM",
-    "label.ovm3.cluster": "Cluster natif",
-    "label.ovm3.pool": "Pool natif",
-    "label.ovm3.traffic.label": "Libellé trafic OVM3",
-    "label.ovm3.vip": "IP Maître Vip",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Adresses IP Publiques détenues",
-    "label.owner.account": "Propriétaire",
-    "label.owner.domain": "Propriétaire",
-    "label.palo.alto.details": "Détails Palo Alto",
-    "label.parent.domain": "Parent du Domaine",
-    "label.passive": "Passif",
-    "label.password": "Mot de passe",
-    "label.password.enabled": "Mot de passe activé",
-    "label.password.lower": "mot de passe",
-    "label.password.reset.confirm": "Le mot de passe a été ré-initialiser en",
-    "label.path": "Chemin",
-    "label.perfect.forward.secrecy": "Confidentialité persistante",
-    "label.permission": "Autorisation",
-    "label.persistent": "Persistant",
-    "label.physical.network": "Réseau physique",
-    "label.physical.network.ID": "Identifiant du réseau physique",
-    "label.physical.network.name": "Nom réseau physique",
-    "label.ping.path": "Chemin Ping",
-    "label.planner.mode": "Mode planification",
-    "label.please.complete.the.following.fields": "Veuillez remplir les champs suivants",
-    "label.please.specify.netscaler.info": "Renseigner les informations sur le Netscaler",
-    "label.please.wait": "Patientez s'il vous plait",
-    "label.plugin.details": "Détails extension",
-    "label.plugins": "Extensions",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dédié",
-    "label.pod.name": "Nom du pod",
-    "label.pods": "Pods",
-    "label.polling.interval.sec": "Intervalle d'appel (en sec)",
-    "label.port": "Port",
-    "label.port.forwarding": "Redirection de port",
-    "label.port.forwarding.policies": "Règles de transfert de port",
-    "label.port.range": "Plage de ports",
-    "label.portable.ip": "IP Portable",
-    "label.portable.ip.range.details": "Détails Plages IP portables",
-    "label.portable.ip.ranges": "Plages IP portables",
-    "label.portable.ips": "IPs portables",
-    "label.powerstate": "Status Alimentation",
-    "label.prev": "Précédent",
-    "label.previous": "Retour",
-    "label.primary.allocated": "Stockage primaire alloué",
-    "label.primary.network": "Réseau principal",
-    "label.primary.storage": "Stockages primaires",
-    "label.primary.storage.count": "Groupes de stockage primaire",
-    "label.primary.storage.limits": "Limites stockage primaire (Go)",
-    "label.primary.used": "Stockage primaire utilisé",
-    "label.private.Gateway": "Passerelle privée",
-    "label.private.interface": "Interface privée",
-    "label.private.ip": "Adresse IP Privée",
-    "label.private.ip.range": "Plage d'adresses IP Privées",
-    "label.private.ips": "Adresses IP Privées",
-    "label.private.key": "Clé privée",
-    "label.private.network": "Réseau privé",
-    "label.private.port": "Port privé",
-    "label.private.zone": "Zone Privée",
-    "label.privatekey": "Clé privée PKCS#8",
-    "label.profile": "Profil",
-    "label.project": "Projet",
-    "label.project.dashboard": "Tableau de bord projet",
-    "label.project.id": "ID projet",
-    "label.project.invite": "Inviter sur le projet",
-    "label.project.name": "Nom du projet",
-    "label.project.view": "Vue projet",
-    "label.projects": "Projets",
-    "label.protocol": "Protocole",
-    "label.protocol.number": "Numéro Protocole",
-    "label.protocol.number.short" : "#Protocole",
-    "label.provider": "Fournisseur",
-    "label.providers": "Fournisseurs",
-    "label.public": "Publique",
-    "label.public.interface": "Interface publique",
-    "label.public.ip": "Adresse IP publique",
-    "label.public.ips": "Adresses IP publiques",
-    "label.public.key": "Clé publique",
-    "label.public.lb": "Répartiteur public",
-    "label.public.load.balancer.provider": "Fournisseur répartition de charge public",
-    "label.public.network": "Réseau public",
-    "label.public.port": "Port public",
-    "label.public.traffic": "Trafic public",
-    "label.public.traffic.vswitch.name": "Nom Trafic Public vSwitch",
-    "label.public.traffic.vswitch.type": "Type Trafic Public vSwitch",
-    "label.public.zone": "Zone publique",
-    "label.purpose": "Rôle",
-    "label.qos.type": "Type de QoS",
-    "label.quickview": "Aperçu",
-    "label.quiesce.vm": "Mettre en veille VM",
-    "label.quiet.time.sec": "Quiet Time (en sec)",
-    "label.quota.add.credits": "Ajouter Crédits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Configuration Quota",
-    "label.quota.configure": "Configurer Quota",
-    "label.quota.credit": "Crédit",
-    "label.quota.credits": "Crédits",
-    "label.quota.date": "Date",
-    "label.quota.dates": "Mettre à jour Dates",
-    "label.quota.description": "Description Quota",
-    "label.quota.email.body": "Corps de message",
-    "label.quota.email.lastupdated": "Dernière mise à jour",
-    "label.quota.email.subject": "Sujet",
-    "label.quota.email.template": "Modèle d'email",
-    "label.quota.enddate": "Date fin",
-    "label.quota.endquota": "Fin Quota",
-    "label.quota.enforcequota": "Forcer Quota",
-    "label.quota.fullsummary": "Tous les comptes",
-    "label.quota.minbalance": "Balance Min.",
-    "label.quota.remove": "Supprimer Quota",
-    "label.quota.startdate": "Date début",
-    "label.quota.startquota": "Début Quota",
-    "label.quota.state": "État",
-    "label.quota.statement": "Relevé",
-    "label.quota.statement.balance": "Balance Quota",
-    "label.quota.statement.bydates": "Relevé",
-    "label.quota.statement.quota": "Utilisation Quota",
-    "label.quota.statement.tariff": "Tarif Quota",
-    "label.quota.summary": "Récapitulatif",
-    "label.quota.tariff": "Tarif",
-    "label.quota.tariff.edit": "Modifier Tarif",
-    "label.quota.tariff.effectivedate": "Date d'effet",
-    "label.quota.tariff.value": "Valeur Tarif",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Usage Total",
-    "label.quota.type.name": "Type Usage",
-    "label.quota.type.unit": "Unité d'usage",
-    "label.quota.usage": "Consommation Quota",
-    "label.quota.value": "Valeur Quota",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Utilisateur Cephx",
-    "label.rbd.monitor": "Superviseur Ceph",
-    "label.rbd.pool": "Pool Ceph",
-    "label.rbd.secret": "Secret Cephx",
-    "label.reboot": "Redémarrer",
-    "label.recent.errors": "Erreurs récentes",
-    "label.recover.vm": "Restaurer VM",
-    "label.redundant.router": "Routeur redondant",
-    "label.redundant.router.capability": "Router redondant",
-    "label.redundant.state": "État de la redondance",
-    "label.redundant.vpc": "VPC Redondant",
-    "label.refresh": "Actualiser",
-    "label.refresh.blades": "Rafraîchir Lames",
-    "label.region": "Région",
-    "label.region.details": "Détails Région",
-    "label.regionlevelvpc": "VPC niveau région",
-    "label.reinstall.vm": "Ré-installer VM",
-    "label.related": "Connexes",
-    "label.release.account": "Libérer compte",
-    "label.release.account.lowercase": "libérer compte",
-    "label.release.dedicated.cluster": "Libération du cluster dédie",
-    "label.release.dedicated.host": "Libération de l'hôte dédié",
-    "label.release.dedicated.pod": "Libération du pod dédié",
-    "label.release.dedicated.vlan.range": "Libérer plage VLAN dédiée",
-    "label.release.dedicated.zone": "Libérer la zone dédiée",
-    "label.remind.later": "Rappeler moi plus tard",
-    "label.remove.ACL": "Supprimer une règle ACL",
-    "label.remove.egress.rule": "Supprimer la règle sortante",
-    "label.remove.from.load.balancer": "Supprimer l'instance du répartiteur de charge",
-    "label.remove.ingress.rule": "Supprimer la règle entrante",
-    "label.remove.ip.range": "Supprimer la plage IP",
-    "label.remove.ldap": "Supprimer LDAP",
-    "label.remove.network.offering": "Supprimer Offre de réseau",
-    "label.remove.pf": "Supprimer la règle de transfert de port",
-    "label.remove.project.account": "Supprimer le compte projet",
-    "label.remove.region": "Supprimer région",
-    "label.remove.rule": "Supprimer la règle",
-    "label.remove.ssh.key.pair": "Supprimer bi-clé SSH",
-    "label.remove.static.nat.rule": "Supprimer le NAT statique",
-    "label.remove.static.route": "Supprimer une route statique",
-    "label.remove.this.physical.network": "Supprimer ce réseau physique",
-    "label.remove.tier": "Supprimer le tiers",
-    "label.remove.vm.from.lb": "Supprimer la VM de la règle de répartition de charge",
-    "label.remove.vm.load.balancer": "Supprimer VM du répartiteur de charge",
-    "label.remove.vmware.datacenter": "Supprimer un datacenter VMware",
-    "label.remove.vpc": "Supprimer le VPC",
-    "label.remove.vpc.offering": "Supprimer offre VPC",
-    "label.removing": "Suppression",
-    "label.removing.user": "Retrait de l'utilisateur",
-    "label.reource.id": "ID Ressource",
-    "label.replace.acl": "Remplacer ACL",
-    "label.replace.acl.list": "Remplacer Liste ACL",
-    "label.required": "Requis",
-    "label.requires.upgrade": "Mise à jour nécessaire",
-    "label.reserved.ip.range": "Plage IP réservée",
-    "label.reserved.system.gateway": "Passerelle réservée Système",
-    "label.reserved.system.ip": "Adresse IP Système réservée",
-    "label.reserved.system.netmask": "Masque de sous-réseau réservé Système",
-    "label.reset.VPN.connection": "Ré-initialiser la connexion VPN",
-    "label.reset.ssh.key.pair": "Ré-initialiser bi-clé SSH",
-    "label.reset.ssh.key.pair.on.vm": "Ré-initialiser bi-clé sur la VM",
-    "label.resetVM": "Ré-initialiser VM",
-    "label.resize.new.offering.id": "Nouvelle Offre",
-    "label.resize.new.size": "Nouvelle Taille (Go)",
-    "label.resize.shrink.ok": "Réduction OK",
-    "label.resource": "Ressource",
-    "label.resource.limit.exceeded": "Limite ressource dépassée",
-    "label.resource.limits": "Limite des ressources",
-    "label.resource.name": "Nom Ressource",
-    "label.resource.state": "État des ressources",
-    "label.resources": "Ressources",
-    "label.response.timeout.in.sec": "Délai d'attente de réponse (sec)",
-    "label.restart.network": "Redémarrage du réseau",
-    "label.restart.required": "Redémarrage nécessaire",
-    "label.restart.vpc": "Redémarrer le VPC",
-    "label.restore": "Restaurer",
-    "label.retry.interval": "Interval du nouvel essai",
-    "label.review": "Revoir",
-    "label.revoke.project.invite": "Révoquer l'invitation",
-    "label.role": "Rôle",
-    "label.roles": "Rôles",
-    "label.roletype": "Type Rôle",
-    "label.root.certificate": "Certificat racine",
-    "label.root.disk.controller": "Contrôleur de disque racine",
-    "label.root.disk.offering": "Offre de disque racine",
-    "label.root.disk.size": "Taille du disque principal (en Go)",
-    "label.router.vm.scaled.up": "VM Routeur agrandi",
-    "label.routing": "Routage",
-    "label.routing.host": "Hôte de routage",
-    "label.rule": "Règle",
-    "label.rule.number.short": "#Règle",
-    "label.rule.number": "Numéro règle",
-    "label.rules": "Règles",
-    "label.running.vms": "VMs actives",
-    "label.s3.access_key": "Clé d'Accès",
-    "label.s3.bucket": "Seau",
-    "label.s3.connection_timeout": "Délai d'expiration de connexion",
-    "label.s3.endpoint": "Terminaison",
-    "label.s3.max_error_retry": "Nombre d'essai en erreur max.",
-    "label.s3.nfs.path": "Chemin NFS S3",
-    "label.s3.nfs.server": "Serveur NFS S3",
-    "label.s3.secret_key": "Clé privée",
-    "label.s3.socket_timeout": "Délai d'expiration de la socket",
-    "label.s3.use_https": "Utiliser HTTPS",
-    "label.saml.enable": "Autoriser SAML SSO",
-    "label.saml.entity": "Fournisseur d'identité",
-    "label.saturday": "Samedi",
-    "label.save": "Sauvegarder",
-    "label.save.and.continue": "Enregistrer et continuer",
-    "label.save.changes": "Sauver changements",
-    "label.saving.processing": "Sauvegarde en cours...",
-    "label.scale.up.policy": "POLITIQUE D'AGRANDISSEMENT",
-    "label.scaledown.policy": "Stratégie ScaleDown",
-    "label.scaleup.policy": "Stratégie ScaleUp",
-    "label.scope": "Portée",
-    "label.search": "Rechercher",
-    "label.secondary.ips": "IPs secondaires",
-    "label.secondary.isolated.vlan.id": "VLAN ID isolé secondaire",
-    "label.secondary.staging.store": "Stockage Secondaire Intermédiaire",
-    "label.secondary.staging.store.details": "Détails Stockage Secondaire Intermédiaire",
-    "label.secondary.storage": "Stockages secondaires",
-    "label.secondary.storage.count": "Groupes de stockage secondaire",
-    "label.secondary.storage.details": "Détails Stockage Secondaire",
-    "label.secondary.storage.limits": "Limites stockage secondaire (Go)",
-    "label.secondary.storage.vm": "VM stockage secondaire",
-    "label.secondary.used": "Stockage secondaire utilisé",
-    "label.secret.key": "Clé privée",
-    "label.security.group": "Groupe de sécurité",
-    "label.security.group.name": "Nom du groupe de sécurité",
-    "label.security.groups": "Groupes de sécurité",
-    "label.security.groups.enabled": "Groupes de sécurité Activés",
-    "label.select": "Sélectionner",
-    "label.select-view": "Sélectionner la vue",
-    "label.select.a.template": "Sélectionner un modèle",
-    "label.select.a.zone": "Sélectionner une zone",
-    "label.select.instance": "Sélectionner une instance",
-    "label.select.instance.to.attach.volume.to": "Sélectionner l'instance à laquelle rattacher ce volume",
-    "label.select.iso.or.template": "Sélectionner un ISO ou un modèle",
-    "label.select.offering": "Sélectionner une offre",
-    "label.select.project": "Sélectionner un projet",
-    "label.select.region": "Sélectionner région",
-    "label.select.template": "Sélectionner Modèle",
-    "label.select.tier": "Sélectionner le tiers",
-    "label.select.vm.for.static.nat": "Sélectionner une VM pour le NAT statique",
-    "label.sent": "Envoyé",
-    "label.server": "Serveur",
-    "label.service.capabilities": "Fonctions disponibles",
-    "label.service.offering": "Offre de Service",
-    "label.service.offering.details": "Détails offre de service",
-    "label.service.state": "État du service",
-    "label.services": "Services",
-    "label.session.expired": "Session expirée",
-    "label.set.default.NIC": "Définir NIC par défaut",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Configurer le type de zone",
-    "label.settings": "Paramètres",
-    "label.setup": "Configuration",
-    "label.setup.network": "Configurer Réseau",
-    "label.setup.zone": "Configurer Zone",
-    "label.shared": "En partage",
-    "label.show.advanced.settings": "Voir paramètres avancés",
-    "label.show.ingress.rule": "Montrer la règle d'entrée",
-    "label.shutdown.provider": "Éteindre ce fournisseur",
-    "label.simplified.chinese.keyboard": "Clavier chinois simplifié",
-    "label.site.to.site.VPN": "VPN Site-à-Site",
-    "label.size": "Capacité",
-    "label.skip.guide": "J'ai déjà utilisé CloudStack avant, passer ce tutoriel",
-    "label.smb.domain": "Domaine SMB",
-    "label.smb.password": "Mot de passe SMB",
-    "label.smb.username": "Identifiant SMB",
-    "label.snapshot": "Instantané",
-    "label.snapshot.limits": "Limites d'instantanés",
-    "label.snapshot.name": "Nom Instantané",
-    "label.snapshot.s": "Instantanés",
-    "label.snapshot.schedule": "Configurer un instantané récurrent",
-    "label.snapshots": "Instantanés",
-    "label.sockets": "Sockets CPU",
-    "label.source.ip.address": "Adresse IP source",
-    "label.source.nat": "NAT Source",
-    "label.source.nat.supported": "Source NAT supporté",
-    "label.source.port": "Port Source",
-    "label.specify.IP.ranges": "Spécifier des plages IP",
-    "label.specify.vlan": "Préciser le VLAN",
-    "label.specify.vxlan": "Préciser le VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "Détails SRX",
-    "label.ssh.key.pair": "Bi-clé SSH",
-    "label.ssh.key.pair.details": "Détails bi-clé SSH",
-    "label.ssh.key.pairs": "Bi-clés SSH",
-    "label.standard.us.keyboard": "Clavier standard (US)",
-    "label.start.IP": "IP début plage",
-    "label.start.lb.vm": "Démarrer LB VM",
-    "label.start.port": "Port de début",
-    "label.start.reserved.system.IP": "Adresse IP de début réservée Système",
-    "label.start.vlan": "Début VLAN",
-    "label.start.vxlan": "Début VXLAN",
-    "label.state": "État",
-    "label.static.nat": "NAT Statique",
-    "label.static.nat.enabled": "NAT statique activé",
-    "label.static.nat.to": "NAT Statique vers",
-    "label.static.nat.vm.details": "Détails des NAT statique VM",
-    "label.static.routes": "Routes statiques",
-    "label.statistics": "Statistiques",
-    "label.status": "Statut",
-    "label.step.1": "Étape 1",
-    "label.step.1.title": "Étape 1 : <strong>Sélectionnez un modèle</strong>",
-    "label.step.2": "Étape 2",
-    "label.step.2.title": "Étape 2 : <strong>Offre de Service</strong>",
-    "label.step.3": "Étape 3",
-    "label.step.3.title": "Étape 3 : <strong id=\"step3_label\">Sélectionnez une offre de service</strong>",
-    "label.step.4": "Étape 4",
-    "label.step.4.title": "Étape 4 : <strong>Réseau</strong>",
-    "label.step.5": "Étape 5",
-    "label.step.5.title": "Étape 5 : <strong>Vérification</strong>",
-    "label.stickiness": "Fidélité",
-    "label.stickiness.method": "Méthode de fidélité",
-    "label.sticky.cookie-name": "Nom du cookie",
-    "label.sticky.domain": "Domaine",
-    "label.sticky.expire": "Expiration",
-    "label.sticky.holdtime": "Temps de pause",
-    "label.sticky.indirect": "Indirect",
-    "label.sticky.length": "Longueur",
-    "label.sticky.mode": "Mode",
-    "label.sticky.name": "Nom de fidélité",
-    "label.sticky.nocache": "Pas de cache",
-    "label.sticky.postonly": "Après seulement",
-    "label.sticky.prefix": "Préfixe",
-    "label.sticky.request-learn": "Apprendre la requête",
-    "label.sticky.tablesize": "Dimension tableau",
-    "label.stop": "Arrêter",
-    "label.stop.lb.vm": "Arrêter LB VM",
-    "label.stopped.vms": "VMs arrêtées",
-    "label.storage": "Stockage",
-    "label.storage.pool": "Pool de stockage",
-    "label.storage.tags": "Étiquettes de stockage",
-    "label.storage.traffic": "Trafic stockage",
-    "label.storage.type": "Type de stockage",
-    "label.subdomain.access": "Accès sous-domaine",
-    "label.submit": "Envoyer",
-    "label.submitted.by": "[Soumis par : <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Réussi",
-    "label.sunday": "Dimanche",
-    "label.super.cidr.for.guest.networks": "Super CIDR pour les réseaux invités",
-    "label.supported.services": "Services supportés",
-    "label.supported.source.NAT.type": "Type de NAT supporté",
-    "label.supportsstrechedl2subnet": "Sous-réseau Streched L2 supporté",
-    "label.supportspublicaccess": "Accès publiques activés",
-    "label.suspend.project": "Suspendre projet",
-    "label.switch.type": "Type commutateur",
-    "label.system.capacity": "Capacité système",
-    "label.system.offering": "Offre de Système",
-    "label.system.offering.for.router": "Offre de Système pour Routeur",
-    "label.system.service.offering": "Offre de Service Système",
-    "label.system.service.offering.details": "Détails offre de service système",
-    "label.system.vm": "VM Système",
-    "label.system.vm.details": "Détails VM Système",
-    "label.system.vm.scaled.up": "VM Système agrandie",
-    "label.system.vm.type": "Type de VM système",
-    "label.system.vms": " VMs Systèmes",
-    "label.system.wide.capacity": "Capacité globale",
-    "label.tag.key": "Clé Tag",
-    "label.tag.value": "Valeur Tag",
-    "label.tagged": "Étiqueté",
-    "label.tags": "Étiquette",
-    "label.target.iqn": "Cible IQN",
-    "label.task.completed": "Tâche terminée",
-    "label.template": "Modèle",
-    "label.template.limits": "Limites de modèle",
-    "label.tftp.root.directory": "Répertoire racine TFTP",
-    "label.theme.default": "Thème par défaut",
-    "label.theme.grey": "Personnalisé - Gris",
-    "label.theme.lightblue": "Personnalisé - Bleu clair",
-    "label.threshold": "Seuil",
-    "label.thursday": "Jeudi",
-    "label.tier": "Tiers",
-    "label.tier.details": "Détails du tiers",
-    "label.time": "Temps",
-    "label.time.colon": "Heure :",
-    "label.time.zone": "Fuseau horaire",
-    "label.timeout": "Délai d'expiration",
-    "label.timeout.in.second ": " Timeout (secondes)",
-    "label.timezone": "Fuseau horaire",
-    "label.timezone.colon": "Fuseau horaire :",
-    "label.token": "Jeton unique",
-    "label.total.CPU": "Capacité totale en CPU",
-    "label.total.cpu": "Capacité totale en CPU",
-    "label.total.hosts": "Total Hôtes",
-    "label.total.memory": "Total mémoire",
-    "label.total.of.ip": "Total adresses IP",
-    "label.total.of.vm": "Total VMs",
-    "label.total.storage": "Total stockage",
-    "label.total.virtual.routers": "Total des Routeurs virtuels",
-    "label.total.virtual.routers.upgrade": "Total des routeurs virtuels avec mise à niveau nécessaire",
-    "label.total.vms": "Nombre total de VMs",
-    "label.traffic.label": "Libellé trafic",
-    "label.traffic.type": "Type Trafic",
-    "label.traffic.types": "Types de trafic",
-    "label.tuesday": "Mardi",
-    "label.type": "Type",
-    "label.type.id": "ID du Type",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "Clavier UK",
-    "label.unavailable": "Indisponible",
-    "label.unhealthy.threshold": "Seuil non toléré",
-    "label.unlimited": "Illimité",
-    "label.untagged": "Non Taggé",
-    "label.update.project.resources": "Mettre à jour les ressources du projet",
-    "label.update.ssl": " Certificat SSL",
-    "label.update.ssl.cert": " Certificat SSL",
-    "label.updating": "Mise à jour",
-    "label.upgrade.required": "Une mise à jour est nécessaire",
-    "label.upgrade.router.newer.template": "Mette à jour le routeur pour utiliser le modèle le plus récent",
-    "label.upload": "Téléverser",
-    "label.upload.from.local": "Téléverser depuis Local",
-    "label.upload.template.from.local": "Téléverser Modèle depuis Local",
-    "label.upload.volume": "Téléverser un volume",
-    "label.upload.volume.from.local": "Téléverser Volume depuis Local",
-    "label.upload.volume.from.url": "Téléverser volume depuis URL",
-    "label.url": "URL",
-    "label.usage.interface": "Interface Utilisation",
-    "label.usage.sanity.result": "Résultat de santé Usage",
-    "label.usage.server": "Serveur d'Usage",
-    "label.usage.type": "Type Usage",
-    "label.usage.unit": "Unité",
-    "label.use.vm.ip": "Utiliser IP VM :",
-    "label.use.vm.ips": "Utiliser IP VMs",
-    "label.used": "Utilisé",
-    "label.user": "Utilisateur",
-    "label.user.data": "Données utilisateur",
-    "label.user.details": "Détails utilisateur",
-    "label.user.vm": "Utilisateur VM",
-    "label.username": "Identifiant",
-    "label.username.lower": "identifiant",
-    "label.users": "Utilisateurs",
-    "label.vSwitch.type": "Type vSwitch",
-    "label.value": "Valeur",
-    "label.vcdcname": "Nom du DC vCenter",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "Cluster vCenter",
-    "label.vcenter.datacenter": "Datacenter vCenter",
-    "label.vcenter.datastore": "Datastore vCenter",
-    "label.vcenter.host": "Hôte vCenter",
-    "label.vcenter.password": "Mot de passe vCenter",
-    "label.vcenter.username": "Identifiant vCenter",
-    "label.vcipaddress": "Adresse IP vCenter",
-    "label.version": "Version",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Résolution Max.",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs par GPU",
-    "label.vgpu.remaining.capacity": "Capacité restante",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Mémoire Vidéo",
-    "label.view": "Voir",
-    "label.view.all": "Voir tout",
-    "label.view.console": "Voir la console",
-    "label.view.more": "Voir plus",
-    "label.view.secondary.ips": "Voir IPs secondaires",
-    "label.viewing": "Consultation en cours",
-    "label.virtual.appliance": "Appliance Virtuelle",
-    "label.virtual.appliance.details": "Détails Appliance Virtuelle",
-    "label.virtual.appliances": "Appliances Virtuelles",
-    "label.virtual.machine": "Machine Virtuelle",
-    "label.virtual.machines": "Machines virtuelles",
-    "label.virtual.network": "Réseau virtuel",
-    "label.virtual.networking": "Mise en réseau virtuelle",
-    "label.virtual.router": "Routeur Virtuel",
-    "label.virtual.routers": "Routeurs virtuels",
-    "label.virtual.routers.group.account": "Routeurs virtuels groupés par compte",
-    "label.virtual.routers.group.cluster": "Routeurs virtuels groupés par cluster",
-    "label.virtual.routers.group.pod": "Routeurs virtuels groupés par pod",
-    "label.virtual.routers.group.zone": "Routeurs virtuels groupés par zone",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "ID VLAN/VNI",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "Plage du VLAN",
-    "label.vlan.range.details": "Détails plage VLAN",
-    "label.vlan.ranges": "Plage(s) VLAN",
-    "label.vlan.vni.range": "Plage du VLAN",
-    "label.vlan.vni.ranges": "Plage(s) VLAN/VNI",
-    "label.vm.add": "Ajouter une instance",
-    "label.vm.destroy": "Détruire",
-    "label.vm.display.name": "Nom commun VM",
-    "label.vm.id": "ID VM",
-    "label.vm.ip": "Adresse IP VM",
-    "label.vm.name": "Nom VM",
-    "label.vm.password": "Le mot de passe de cette VM est",
-    "label.vm.reboot": "Redémarrer",
-    "label.vm.start": "Démarrer",
-    "label.vm.state": "État VM",
-    "label.vm.stop": "Arrêter",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "Instantanés VM",
-    "label.vmsnapshot.current": "estCourant",
-    "label.vmsnapshot.memory": "Mémore instantané",
-    "label.vmsnapshot.parentname": "Parent",
-    "label.vmsnapshot.type": "Type",
-    "label.vmware.datacenter.id": "ID datacenter VMware",
-    "label.vmware.datacenter.name": "Nom datacenter VMware",
-    "label.vmware.datacenter.vcenter": "vcenter datacenter VMware",
-    "label.vmware.traffic.label": "Libellé trafic VMware",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "ID VLAN/VNI",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "Équipement VNMC",
-    "label.volatile": "Volatile",
-    "label.volgroup": "Groupe de Volume",
-    "label.volume": "Volume",
-    "label.volume.details": "Détails du volume",
-    "label.volume.limits": "Limites des volumes",
-    "label.volume.migrated": "Volume migré",
-    "label.volume.name": "Nom du volume",
-    "label.volumes": "Volumes",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Routeur VPC Distribué",
-    "label.vpc.id": "ID VPC",
-    "label.vpc.offering": "Offre de VPC",
-    "label.vpc.offering.details": "Détails offre VPC",
-    "label.vpc.router.details": "Détails Routeur VPC",
-    "label.vpc.supportsregionlevelvpc": "VPC niveau Région supporté",
-    "label.vpc.virtual.router": "Routeur virtuel VPC",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "Passerelle VPN client",
-    "label.vpn.force.encapsulation": "Force l'encapsulation UDP des paquets ESP",
-    "label.vsmctrlvlanid": " ID VLAN Contrôle",
-    "label.vsmpktvlanid": "ID VLAN Paquet",
-    "label.vsmstoragevlanid": "VLAN ID Stockage",
-    "label.vsphere.managed": "Gérée par vSphere",
-    "label.vswitch.name": "Nom vSwitch",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "Plage du VXLAN",
-    "label.waiting": "En attente",
-    "label.warn": "Avertissement",
-    "label.warn.upper": "WARN",
-    "label.warning": "Avertissement",
-    "label.wednesday": "Mercredi",
-    "label.weekly": "Hebdomadaire",
-    "label.welcome": "Bienvenue",
-    "label.welcome.cloud.console": "Bienvenue dans la Console d'Administration",
-    "label.what.is.cloudstack": "Qu'est-ce-que CloudStack&#8482; ?",
-    "label.xenserver.tools.version.61.plus": "XenServer Tools Version 6.1+",
-    "label.xenserver.traffic.label": "Libellé trafic XenServer",
-    "label.yes": "Oui",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone dédiée",
-    "label.zone.details": "Détails de la zone",
-    "label.zone.id": "ID de la zone",
-    "label.zone.lower": "zone",
-    "label.zone.name": "Nom de la zone",
-    "label.zone.step.1.title": "Étape 1 : <strong>Sélectionnez un réseau</strong>",
-    "label.zone.step.2.title": "Étape 2 : <strong>Ajoutez une zone</strong>",
-    "label.zone.step.3.title": "Étape 3 : <strong>Ajoutez un Pod</strong>",
-    "label.zone.step.4.title": "Étape 4 : <strong>Ajoutez une plage d'adresses IP</strong>",
-    "label.zone.type": "Type de zone",
-    "label.zone.wide": "Transverse à la zone",
-    "label.zoneWizard.trafficType.guest": "Invité : Trafic entre les machines virtuelles utilisateurs",
-    "label.zoneWizard.trafficType.management": "Administration : Trafic entre les ressources internes de CloudStack, incluant tous les composants qui communiquent avec le serveur d'administration, tels que les hôtes et les machines virtuelles Systèmes CloudStack",
-    "label.zoneWizard.trafficType.public": "Public : Trafic entre Internet et les machines virtuelles dans le nuage",
-    "label.zoneWizard.trafficType.storage": "Stockage : Trafic entre les serveurs de stockages principaux et secondaires, tel que le transfert de machines virtuelles modèles et des instantanés de disques",
-    "label.zones": "Zones",
-    "managed.state": "État de la gestion",
-    "message.XSTools61plus.update.failed": "Échec de mise à jour champ XenServer Tools Version 6.1+. Erreur :",
-    "message.Zone.creation.complete": "Création de la zone terminée",
-    "message.acquire.ip.nic": "Confirmez que vous souhaitez acquérir une nouvelle IP secondaire pour cette carte NIC.<br/>N.B. Vous devez configurer manuellement la nouvelle IP secondaire dans la machine virtuelle.",
-    "message.acquire.new.ip": "Confirmer l'acquisition d'une nouvelle adresse IP pour ce réseau.",
-    "message.acquire.new.ip.vpc": "Veuillez confirmer que vous voulez une nouvelle adresse IP pour ce VPC",
-    "message.acquire.public.ip": "Sélectionnez la zone dans laquelle vous voulez acquérir votre nouvelle adresse IP.",
-    "message.action.cancel.maintenance": "Votre hôte a quitté la maintenance. Ce processus peut prendre jusqu'à plusieurs minutes.",
-    "message.action.cancel.maintenance.mode": "Confirmer l'annulation de cette maintenance.",
-    "message.action.change.service.warning.for.instance": "Votre instance doit être arrêtée avant d'essayer de changer son offre de service.",
-    "message.action.change.service.warning.for.router": "Votre routeur doit être arrêté avant d'essayer de changer son offre de service.",
-    "message.action.delete.ISO": "Supprimer cet ISO ?",
-    "message.action.delete.ISO.for.all.zones": "L'ISO est utilisé par toutes les zones. S'il vous plaît confirmer que vous voulez le supprimer de toutes les zones.",
-    "message.action.delete.cluster": "Êtes-vous sûr que vous voulez supprimer ce cluster.",
-    "message.action.delete.disk.offering": "Supprimer cette offre de disque ?",
-    "message.action.delete.domain": "Êtes-vous sûr que vous voulez supprimer ce domaine.",
-    "message.action.delete.external.firewall": "Supprimer ce pare-feu externe ? Attention : Si vous prévoyez de rajouter le même pare-feu externe de nouveau, vous devez ré-initialiser les données d'utilisation sur l'appareil.",
-    "message.action.delete.external.load.balancer": "Supprimer ce répartiteur de charge externe ? Attention : Si vous pensez ajouter le même répartiteur de charge plus tard, vous devez remettre à zéro les statistiques d'utilisation de cet équipement.",
-    "message.action.delete.ingress.rule": "Supprimer cette règle de flux entrant ?",
-    "message.action.delete.network": "Êtes-vous sûr que vous voulez supprimer ce réseau.",
-    "message.action.delete.nexusVswitch": "Confirmer la suppession de ce Nexus 1000v",
-    "message.action.delete.nic": "Veuillez confirmer que vous souhaitez supprimer cette carte NIC, ce qui supprimera également le réseau associé sur la machine virtuelle.",
-    "message.action.delete.physical.network": "Confirmer la suppression du réseau physique",
-    "message.action.delete.pod": "Supprimer ce pod ?",
-    "message.action.delete.primary.storage": "Êtes-vous sûr que vous voulez supprimer ce stockage primaire.",
-    "message.action.delete.secondary.storage": "Supprimer ce stockage secondaire ?",
-    "message.action.delete.security.group": "Supprimer ce groupe de sécurité ?",
-    "message.action.delete.service.offering": "Supprimer cette offre de service ?",
-    "message.action.delete.snapshot": "Supprimer cet instantané ?",
-    "message.action.delete.system.service.offering": "Êtes-vous sûr que vous voulez supprimer l'offre système.",
-    "message.action.delete.template": "Supprimer ce modèle ?",
-    "message.action.delete.template.for.all.zones": "Ce modèle est utilisé par toutes les zones. Supprimer de toutes les zones ?",
-    "message.action.delete.volume": "Supprimer ce volume ?",
-    "message.action.delete.zone": "Supprimer cette zone ?",
-    "message.action.destroy.instance": "Supprimer cette instance ?",
-    "message.action.destroy.systemvm": "Supprimer cette VM Système ?",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Désactiver ce cluster ?",
-    "message.action.disable.nexusVswitch": "Confirmer la désactivation de ce Nexus 1000v",
-    "message.action.disable.physical.network": "Confirmer l'activation de ce réseau physique.",
-    "message.action.disable.pod": "Désactiver ce pod ?",
-    "message.action.disable.static.NAT": "Désactiver le NAT statique ?",
-    "message.action.disable.zone": "Désactiver cette zone ?",
-    "message.action.download.iso": "Confirmer le téléchargement de cet ISO",
-    "message.action.download.template": "Confirmer le téléchargement de ce modèle",
-    "message.action.downloading.template": "Téléchargement modèle.",
-    "message.action.enable.cluster": "Activer ce cluster ?",
-    "message.action.enable.maintenance": "Votre hôte a été mis en mode maintenance avec succès. Ce processus peut durer plusieurs minutes ou plus, suivant le nombre de VMs actives sur cet hôte.",
-    "message.action.enable.nexusVswitch": "Confirmer l'activation de ce Nexus 1000v",
-    "message.action.enable.physical.network": "Confirmer l'activation de ce réseau physique.",
-    "message.action.enable.pod": "Activer ce pod ?",
-    "message.action.enable.zone": "Activer cette zone ?",
-    "message.action.expunge.instance": "Confirmez que vous souhaitez effacer cette instance.",
-    "message.action.force.reconnect": "Votre hôte a été forcée à se reconnecter avec succès. Ce processus peut prendre jusqu'à plusieurs minutes.",
-    "message.action.host.enable.maintenance.mode": "Activer le mode maintenance va causer la migration à chaud de l'ensemble des instances de cet hôte sur les autres hôtes disponibles.",
-    "message.action.instance.reset.password": "Confirmer le changement du mot de passe ROOT pour cette machine virtuelle.",
-    "message.action.manage.cluster": "Gérer le cluster ?",
-    "message.action.primarystorage.enable.maintenance.mode": "Attention : placer ce stockage primaire en mode maintenance va provoquer l'arrêt de l'ensemble des VMs utilisant des volumes sur ce stockage. Souhaitez-vous continuer ?",
-    "message.action.reboot.instance": "Redémarrer cette instance ?",
-    "message.action.reboot.router": "Tous les services fournit par ce routeur virtuel vont être interrompus. Confirmer le ré-amorçage de ce routeur.",
-    "message.action.reboot.systemvm": "Redémarrer cette VM Système ?",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Libérer cette adresse IP ?",
-    "message.action.remove.host": "Êtes-vous sûr que vous voulez supprimer cet hôte.",
-    "message.action.reset.password.off": "Votre instance ne supporte pas pour le moment cette fonctionnalité.",
-    "message.action.reset.password.warning": "Votre instance doit être arrêtée avant d'essayer de changer son mot de passe.",
-    "message.action.restore.instance": "Restaurer cette instance ?",
-    "message.action.revert.snapshot": "Confirmez que vous souhaitez rétablir ce volume pour cet instantané",
-    "message.action.start.instance": "Démarrer cette instance ?",
-    "message.action.start.router": "Démarrer ce routeur ?",
-    "message.action.start.systemvm": "Redémarrer cette VM système ?",
-    "message.action.stop.instance": "Arrêter cette instance ?",
-    "message.action.stop.router": "Tous les services fournit par ce routeur virtuel vont être interrompus. Confirmer l'arrêt de ce routeur.",
-    "message.action.stop.systemvm": "Arrêter cette VM ?",
-    "message.action.take.snapshot": "Confirmer la prise d'un instantané pour ce volume.",
-    "message.action.snapshot.fromsnapshot":"Confirmer la prise d'un instantané pour ce instantané VM.",
-    "message.action.unmanage.cluster": "Confirmez que vous ne voulez plus gérer le cluster",
-    "message.action.vmsnapshot.create": "Veuillez confirmer que vous souhaitez prendre un instantané de cette instance. <br>Notez que l'instance sera mise en pause durant la prise de l'instantané puis remise en route une fois terminée, si elle fonctionne sur KVM.",
-    "message.action.vmsnapshot.delete": "Confirmez que vous souhaitez supprimer cet instantané VM.",
-    "message.action.vmsnapshot.revert": "Rétablir l'instantané VM",
-    "message.activate.project": "Voulez-vous activer ce projet ?",
-    "message.add.VPN.gateway": "Confirmer l'ajout d'une passerelle VPN",
-    "message.add.cluster": "Ajouter un cluster d'hyperviseurs géré pour cette zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Ajouter un cluster d'hyperviseurs géré pour cette zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Renseignez les paramètres suivants pour ajouter un offre de service de disques",
-    "message.add.domain": "Spécifier le sous domaine que vous souhaitez créer sous ce domaine",
-    "message.add.firewall": "Ajouter un pare-feu à cette zone",
-    "message.add.guest.network": "Confirmer l'ajout du réseau invité",
-    "message.add.host": "Renseignez les paramètres suivants pour ajouter une hôte",
-    "message.add.ip.range": "Ajouter une plage IP pour le réseau publique dans la zone",
-    "message.add.ip.range.direct.network": "Ajouter une plage IP au réseau direct <b><span id=\"directnetwork_name\"></span></b> dans la zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Ajouter une plage IP pour le pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Ajouter un répartiteur de charge à la zone",
-    "message.add.load.balancer.under.ip": "La règle de répartition de charge été ajoutée sous l'adresse IP :",
-    "message.add.network": "Ajouter un nouveau réseau à la zone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Renseigner les informations suivantes pour ajouter une nouvelle passerelle pour ce VPC",
-    "message.add.pod": "Ajouter un nouveau pod à la zone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Chaque zone doit contenir un ou plusieurs pods, et le premier pod sera ajouté maintenant. Une pod contient les hôtes et les serveurs de stockage primaire, qui seront ajoutés dans une étape ultérieure. Configurer une plage d'adresses IP réservées pour le trafic de gestion interne de CloudStack. La plage d'IP réservée doit être unique pour chaque zone dans le nuage.",
-    "message.add.primary": "Renseignez les paramètres suivants pour ajouter un stockage primaire",
-    "message.add.primary.storage": "Ajouter un nouveau stockage primaire à la zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Renseigner les informations suivantes pour ajouter une nouvelle région.",
-    "message.add.secondary.storage": "Ajouter un nouveau stockage pour la zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Renseigner les informations suivantes pour ajouter une nouvelle offre de service de calcul.",
-    "message.add.system.service.offering": "Ajouter les informations suivantes pour créer une nouvelle offre de système.",
-    "message.add.template": "Renseignez les informations suivantes pour créer votre nouveau modèle",
-    "message.add.volume": "Renseignez les informations suivantes pour ajouter un nouveau volume",
-    "message.added.vpc.offering": "Offre de VPC ajoutée",
-    "message.adding.Netscaler.device": "Ajouter un Netscaler",
-    "message.adding.Netscaler.provider": "Ajouter un fournisseur Netscaler",
-    "message.adding.host": "Ajout un hôte",
-    "message.additional.networks.desc": "Sélectionnez le(s) réseau(x) additionnel(s) au(x)quel(s) sera connectée votre instance.",
-    "message.admin.guide.read": "Pour les VMs VMware, veuillez lire le paragraphe \"dynamic scaling\" dans le guide d'administration avant d'opérer un dimensionnement. Voulez-vous continuer ?,",
-    "message.advanced.mode.desc": "Choisissez ce modèle de réseau si vous souhaitez bénéficier du support des VLANs. Ce mode de réseau donne le plus de flexibilité aux administrateurs pour fournir des offres de service réseau personnalisées comme fournir des pare-feux, VPN, répartiteurs de charge ou également activer des réseaux virtuels ou directs.",
-    "message.advanced.security.group": "Choisissez ceci si vous souhaitez utiliser les groupes de sécurité pour fournir l'isolation des VMs invitées.",
-    "message.advanced.virtual": "Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l'isolation des VMs invitées.",
-    "message.after.enable.s3": "Le stockage secondaire S3 est configuré. Note : Quand vous quitterez cette page, vous ne pourrez plus re-configurer le support S3.",
-    "message.after.enable.swift": "Swift configuré. Remarque : une fois que vous quitterez cette page, il ne sera plus possible de re-configurer Swift à nouveau.",
-    "message.alert.state.detected": "État d'alerte détecté",
-    "message.allow.vpn.access": "Entrez un identifiant et un mot de passe pour l'utilisateur que vous souhaitez autoriser à utiliser l'accès VPN.",
-    "message.apply.snapshot.policy": "Vous avez mis à jour votre politique d'instantanés avec succès.",
-    "message.assign.instance.another": "Veuillez spécifier le type de compte, domaine, nom de compte et réseau (optionnel) pour le nouveau compte. <br> Si l'interface par défaut de la machine virtuelle est sur un réseau partagé, CloudStack va vérifier si le réseau peut être utilisé par le nouveau compte si vous n'avez pas spécifier de réseau. <br> Si l'interface par défaut de la machine virtuelle est sur un réseau isolé, et que le nouveau compte a plus d'un réseau isolé, vous devez en spécifier un.",
-    "message.attach.iso.confirm": "Attacher l'image ISO à cette instance ?",
-    "message.attach.volume": "Renseignez les données suivantes pour attacher un nouveau volume. Si vous attachez un volume disque à une machine virtuelle sous Windows, vous aurez besoin de redémarrer l'instance pour voir le nouveau disque.",
-    "message.basic.mode.desc": "Choisissez ce modèle de réseau si vous  <b>*<u>ne voulez pas</u>*</b> activer le support des VLANs. Toutes les instances créées avec ce modèle de réseau se verront assigner une adresse IP et les groupes de sécurité seront utilisés pour fournir l'isolation entre les VMs.",
-    "message.change.ipaddress": "Confirmer que vous souhaitez changer l'adresse IP pour cette NIC sur la VM.",
-    "message.change.offering.confirm": "Changer l'offre de service de cette instance ?",
-    "message.change.password": "Merci de modifier votre mot de passe.",
-    "message.cluster.dedicated": "Cluster dédiée",
-    "message.cluster.dedication.released": "Libération de cluster dédié",
-    "message.configure.all.traffic.types": "Vous avez de multiples réseaux physiques ; veuillez configurer les libellés pour chaque type de trafic en cliquant sur le bouton Modifier.",
-    "message.configure.firewall.rules.allow.traffic": "Configurer les règles autorisant le trafic",
-    "message.configure.firewall.rules.block.traffic": "Configurer les règles bloquant le trafic",
-    "message.configure.ldap": "Confirmer la configuration LDAP",
-    "message.configuring.guest.traffic": "Configuration du réseau VM",
-    "message.configuring.physical.networks": "Configuration des réseaux physiques",
-    "message.configuring.public.traffic": "Configuration du réseau public",
-    "message.configuring.storage.traffic": "Configuration du réseau de stockage",
-    "message.confirm.action.force.reconnect": "Confirmer la re-connexion forcée de cet hôte.",
-    "message.confirm.add.vnmc.provider": "Confirmer l'ajout du fournisseur VNMC.",
-    "message.confirm.archive.alert": "Confirmer la suppression de cette alerte.",
-    "message.confirm.archive.event": "Confirmer l'archivage de cet événement.",
-    "message.confirm.archive.selected.alerts": "Confirmer l'archivage des alertes sélectionnées",
-    "message.confirm.archive.selected.events": "Confirmez l'archivage des événements sélectionnés",
-    "message.confirm.attach.disk": "Confirmer le rattachement de ce disque ?",
-    "message.confirm.create.volume": "Confirmer la création de ce volume ?",
-    "message.confirm.current.guest.CIDR.unchanged": "Voulez-vous garder l'actuel réseau d'invité CIDR inchangé ?",
-    "message.confirm.dedicate.cluster.domain.account": "Dédier ce cluster à un domaine/compte ?",
-    "message.confirm.dedicate.host.domain.account": "Dédier cet hôte à un domaine/compte ?",
-    "message.confirm.dedicate.pod.domain.account": "Dédier ce pod à un domaine/compte ?",
-    "message.confirm.dedicate.zone": "Êtes-vous sûr de dédier cette zone à un domaine/compte ?",
-    "message.confirm.delete.BigSwitchBcf": "Confirmer que vous voulez supprimer ce contrôleur BigSwitch BCF",
-    "message.confirm.delete.BrocadeVcs": "Confirmer la suppression du switch Brocade Vcs",
-    "message.confirm.delete.F5": "Confirmer la suppression du F5",
-    "message.confirm.delete.NetScaler": "Confirmer la suppression du Netscaler",
-    "message.confirm.delete.PA": "Confirmer la suppression du Palo Alto",
-    "message.confirm.delete.SRX": "Confirmer la suppression du SRX",
-    "message.confirm.delete.acl.list": "Confirmer la suppression de cette liste ACL ?",
-    "message.confirm.delete.alert": "Confirmer la suppression de cette alerte ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Confirmer que vous voulez supprimer cette configuration Rack Baremetal",
-    "message.confirm.delete.ciscoASA1000v": "Confirmez la suppression du CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Confirmer la suppression de la ressource CiscoVNMC",
-    "message.confirm.delete.internal.lb": "Confirmer la suppression de ce LB interne.",
-    "message.confirm.delete.secondary.staging.store": "Confirmer que vous voulez supprimer le Stockage Secondaire Intermédiaire.",
-    "message.confirm.delete.ucs.manager": "Confirmez que vous voulez supprimer le gestionnaire UCS",
-    "message.confirm.destroy.router": "Êtes-vous sûr que vous voulez supprimer ce routeur",
-    "message.confirm.disable.host": "Confirmer la dés-activation de cet hôte.",
-    "message.confirm.disable.network.offering": "Voulez-vous désactiver cette offre réseau ?",
-    "message.confirm.disable.provider": "Confirmer la désactivation de ce fournisseur",
-    "message.confirm.disable.vnmc.provider": "Confirmer la désactivation du fournisseur VNMC.",
-    "message.confirm.disable.vpc.offering": "Voulez-vous désactiver cette offre VPC ?",
-    "message.confirm.enable.host": "Confirmer l'activation de cet hôte.",
-    "message.confirm.enable.network.offering": "Voulez-vous activer cette offre réseau ?",
-    "message.confirm.enable.provider": "Confirmer l'activation de ce fournisseur",
-    "message.confirm.enable.vnmc.provider": "Confirmer l'activation du fournisseur VNMC.",
-    "message.confirm.enable.vpc.offering": "Voulez-vous activer cette offre VPC ?",
-    "message.confirm.force.update": "Voulez-vous forcer la mise à jour ?",
-    "message.confirm.join.project": "Rejoindre ce projet ?",
-    "message.confirm.migrate.volume": "Confirmer la migration de ce volume ?",
-    "message.confirm.refresh.blades": "Confirmer que vous voulez rafraîchr les lames.",
-    "message.confirm.release.dedicate.vlan.range": "Confirmez que vous souhaitez libérer cette plage VLAN dédiée.",
-    "message.confirm.release.dedicated.cluster": "Libérer ce cluster dédié ?",
-    "message.confirm.release.dedicated.host": "Libérer cet hôte dédiée ?",
-    "message.confirm.release.dedicated.pod": "Libérer ce pod dédié ?",
-    "message.confirm.release.dedicated.zone": "Libérer cette zone dédiée ?",
-    "message.confirm.remove.IP.range": "Êtes-vous sûr que vous voulez supprimer cette plage d'adresses IP",
-    "message.confirm.remove.event": "Voulez-vous supprimer cet événement ?",
-    "message.confirm.remove.load.balancer": "Confirmer la suppression de cette VM du répartiteur de charge ?",
-    "message.confirm.remove.network.offering": "Voulez-vous supprimer cette offre réseau ?",
-    "message.confirm.remove.selected.alerts": "Confirmer la suppression des alertes sélectionnées",
-    "message.confirm.remove.selected.events": "Confirmez la suppression des événements sélectionnés",
-    "message.confirm.remove.vmware.datacenter": "Veuillez confirmer que vous voulez supprimer le datacenter VMware",
-    "message.confirm.remove.vpc.offering": "Voulez-vous supprimer cette offre VPC ?",
-    "message.confirm.replace.acl.new.one": "Voulez-vous remplacer l'ACL par cette nouvelle ?",
-    "message.confirm.scale.up.router.vm": "Agrandir la VM Routeur ?",
-    "message.confirm.scale.up.system.vm": "Agrandir la VM Système ?",
-    "message.confirm.shutdown.provider": "Confirmer l'arrêt de ce fournisseur",
-    "message.confirm.start.lb.vm": "Confirmez que vous souhaitez démarrer ce LB VM.",
-    "message.confirm.stop.lb.vm": "Confirmez que vous souhaitez arrêter ce LB VM.",
-    "message.confirm.upgrade.router.newer.template": "Confirmez que vous souhaitez mettre à jour le routeur avec un modèle plus récent.",
-    "message.confirm.upgrade.routers.account.newtemplate": "Confirmez que vous souhaitez mettre à jour tous les routeurs dans ce compte avec un modèle plus récent.",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Confirmez que vous souhaitez mettre à jour tous les routeurs dans ce cluster avec un modèle plus récent.",
-    "message.confirm.upgrade.routers.newtemplate": "Confirmez que vous souhaitez mettre à jour tous les routeurs dans cette zone avec un modèle plus récent.",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Confirmez que vous souhaitez mettre à jour tous les routeurs dans ce pod avec un modèle plus récent.",
-    "message.copy.iso.confirm": "Copier votre image ISO vers",
-    "message.copy.template": "Copier le modèle <b id=\"copy_template_name_text\">XXX</b> de la zone <b id=\"copy_template_source_zone_text\"></b> vers",
-    "message.copy.template.confirm": "Voulez-vous copier le modèle ?",
-    "message.create.template": "Voulez-vous créer un modèle ?",
-    "message.create.template.vm": "Créer la VM depuis le modèle <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Renseignez les informations suivantes avec de créer un modèle à partir de votre volume de disque:<b><span id=\"volume_name\"></span></b>. La création du modèle peut prendre plusieurs minutes suivant la taille du volume.",
-    "message.creating.cluster": "Création du cluster",
-    "message.creating.guest.network": "Création du réseau pour les invités",
-    "message.creating.physical.networks": "Création des réseaux physiques",
-    "message.creating.pod": "Création d'un pod",
-    "message.creating.primary.storage": "Création du stockage primaire",
-    "message.creating.secondary.storage": "Création du stockage secondaire",
-    "message.creating.systemVM": "Création des VMs Systèmes (peut prendre du temps)...",
-    "message.creating.zone": "Création de la zone",
-    "message.decline.invitation": "Voulez-vous refuser cette invitation au projet ?",
-    "message.dedicate.zone": "Zone dédiée",
-    "message.dedicated.zone.released": "Libération de zone dédiée",
-    "message.delete.VPN.connection": "Êtes-vous sûr que vous voulez supprimer la connexion VPN",
-    "message.delete.VPN.customer.gateway": "Êtes-vous sûr que vous voulez supprimer cette passerelle VPN client",
-    "message.delete.VPN.gateway": "Êtes-vous sûr que vous voulez supprimer cette passerelle VPN",
-    "message.delete.account": "Supprimer ce compte ?",
-    "message.delete.affinity.group": "Confirmer la supression de ce groupe d'affinité.",
-    "message.delete.gateway": "Êtes-vous sûr que vous voulez supprimer cette passerelle",
-    "message.delete.project": "Voulez-vous supprimer ce projet ?",
-    "message.delete.user": "Êtes-vous sûr que vous voulez supprimer cet utilisateur.",
-    "message.desc.add.new.lb.sticky.rule": "Ajouter nouvelle règle LB sticky",
-    "message.desc.advanced.zone": "Pour des topologies de réseau plus sophistiquées. Ce modèle de réseau permet plus de flexibilité dans la définition des réseaux d'invités et propose des offres personnalisées telles que le support de pare-feu, VPN ou d'équilibrage de charge.",
-    "message.desc.basic.zone": "Fournit un réseau unique où chaque instance de machine virtuelle se voit attribuer une adresse IP directement depuis le réseau. L'isolation des invités peut être assuré au niveau de la couche réseau-3 tels que les groupes de sécurité (filtrage d'adresse IP source).",
-    "message.desc.cluster": "Chaque pod doit contenir un ou plusieurs clusters, et le premier cluster sera ajouté tout de suite. Un cluster est un regroupement pour hôtes. Les hôtes d'un cluster ont tous un matériel identique, exécutent le même hyperviseur, sont dans le même sous-réseau, et accèdent au même stockage partagé. Chaque cluster comprend une ou plusieurs hôtes et un ou plusieurs serveurs de stockage primaire.",
-    "message.desc.create.ssh.key.pair": "Veuillez remplir les champs suivants pour créer ou enregistrer une bi-clé SSH.<br><br>(1) Si la clé publique est définie, CloudStack va enregistrer cette clé. Vous pouvez ensuite l'utiliser avec sa clé privée.<br><br>(2) Si la clé publique n'est pas définie, CloudStack va créer une nouvelle bi-clé SSH. Dans ce cas, veuillez copier et sauvegarder la clé privée. CloudStack ne va pas la conserver.<br>",
-    "message.desc.created.ssh.key.pair": "Bi-clé SSH créée",
-    "message.desc.host": "Chaque cluster doit contenir au moins un hôte (machine) pour exéctuer des machines virtuelles invitées, et le premier hôte sera ajoutée maintenant. Pour un hôte fonctionnant dans CloudStack, vous devez installer un logiciel hyperviseur sur l'hôte, attribuer une adresse IP à l'hôte, et s'assurer que l'hôte est connecté au serveur d'administration CloudStack.<br/><br/>Indiquer le nom de l'hôte ou son adresse IP, l'identifiant de connexion (généralement root) et le mot de passe ainsi que toutes les étiquettes permettant de classer les hôtes.",
-    "message.desc.primary.storage": "Chaque cluster doit contenir un ou plusieurs serveurs de stockage primaire, et le premier sera ajouté tout de suite. Le stockage principal contient les volumes de disque pour les machines virtuelles s'exécutant sur les hôtes dans le cluster. Utiliser les protocoles standards pris en charge par l'hyperviseur sous-jacent.",
-    "message.desc.reset.ssh.key.pair": "Veuillez spécifier une bi-clé SSH que vous souhaitez ajouter à cette VM. Noter que le mot de passe root sera changé durant cette opération si l'option mot de passe est activée.",
-    "message.desc.secondary.storage": "Chaque zone doit avoir au moins un serveur NFS ou un serveur de stockage secondaire, et sera ajouté en premier tout de suite. Le stockage secondaire entrepose les modèles de machines virtuelles, les images ISO et les images disques des volumes des machines virtuelles. Ce serveur doit être accessible pour toutes les machines hôtes dans la zone.<br/><br/>Saisir l'adresse IP et le chemin d'export.",
-    "message.desc.zone": "Une zone est la plus grande unité organisationnelle dans CloudStack, et correspond typiquement à un centre de données. Les zones fournissent un isolement physique et de la redondance. Une zone est constituée d'un ou plusieurs pods (dont chacun contient les hôtes et les serveurs de stockage primaire) et un serveur de stockage secondaire qui est partagée par tous les pods dans la zone.",
-    "message.detach.disk": "Voulez-vous détacher ce disque ?",
-    "message.detach.iso.confirm": "Détacher l'image ISO de cette instance ?",
-    "message.disable.account": "Veuillez confirmer que vous voulez désactiver ce compte. En désactivant le compte, tous les utilisateurs pour ce compte n'auront plus accès à leurs ressources sur le cloud. Toutes les machines virtuelles vont être arrêtées immédiatement.",
-    "message.disable.snapshot.policy": "Vous avez désactivé votre politique d'instantané avec succès.",
-    "message.disable.user": "Confirmer la désactivation de cet utilisateur.",
-    "message.disable.vpn": "Voulez-vous désactiver le VPN ?",
-    "message.disable.vpn.access": "Désactiver l'accès VPN ?",
-    "message.disabling.network.offering": "Désactivation de l'offre réseau",
-    "message.disabling.vpc.offering": "Désactivation de l'offre VPC",
-    "message.disallowed.characters": "Caractères non autorisés : <,>",
-    "message.download.ISO": "Cliquer <a href=\"#\">00000</a> pour télécharger une image ISO",
-    "message.download.template": "Cliquer sur <a href=\"#\">00000</a> pour télécharger le modèle",
-    "message.download.volume": "Cliquer sur <a href=\"#\">00000</a> pour télécharger le volume",
-    "message.download.volume.confirm": "Veuillez confirmer que vous voulez télécharger ce volume.",
-    "message.edit.account": "Modifier (\"-1\" signifie pas de limite de ressources)",
-    "message.edit.confirm": "Vérifier vos changements avant de cliquer sur \"Enregistrer\".",
-    "message.edit.limits": "Renseignez les limites pour les ressources suivantes. \"-1\" indique qu'il n'y a pas de limites pour la création de ressources.",
-    "message.edit.traffic.type": "Spécifier le libellé de trafic associé avec ce type de trafic.",
-    "message.enable.account": "Activer ce compte ?",
-    "message.enable.user": "Confirmer l'activation de cet utilisateur.",
-    "message.enable.vpn": "Confirmer l'activation de l'accès VPN pour cette adresse IP.",
-    "message.enable.vpn.access": "Le VPN est désactivé pour cette adresse IP. Voulez vous activer l'accès VPN ?",
-    "message.enabled.vpn": "Votre accès VPN est activé et peut être accédé par l'IP",
-    "message.enabled.vpn.ip.sec": "Votre clé partagée IPSec est",
-    "message.enabling.network.offering": "Activation de l'offre réseau",
-    "message.enabling.security.group.provider": "Activation du fournisseur de groupe de sécurité",
-    "message.enabling.vpc.offering": "Activation de l'offre VPC",
-    "message.enabling.zone": "Activation de la zone",
-    "message.enabling.zone.dots": "Activation de la zone...",
-    "message.enter.seperated.list.multiple.cidrs": "Veuillez entrer une liste de CIDRs séparés par des virgules si plusieurs",
-    "message.enter.token": "Entrer le jeton unique reçu dans le message d'invitation.",
-    "message.generate.keys": "Confirmer la génération de nouvelles clefs pour cet utilisateur.",
-    "message.gslb.delete.confirm": "Confirmer la suppression de ce GSLB",
-    "message.gslb.lb.remove.confirm": "Enlever la répartition de charge du GSLB ?",
-    "message.guest.traffic.in.advanced.zone": "Le trafic réseau d'invité est la communication entre les machines virtuelles utilisateur. Spécifier une plage d'identifiant VLAN pour le trafic des invités pour chaque réseau physique.",
-    "message.guest.traffic.in.basic.zone": "Le trafic réseau d'invité est la communication entre les machines virtuelles utilisateur. Spécifier une plage d'adresses IP que CloudStack peut assigner aux machines virtuelles Invité. S'assurer que cette plage n'empiète pas sur la plage réservée aux adresses IP Système.",
-    "message.host.dedicated": "Hôte dédiée",
-    "message.host.dedication.released": "Libération de l'hôte dédié",
-    "message.installWizard.click.retry": "Appuyer sur le bouton pour essayer à nouveau le démarrage.",
-    "message.installWizard.copy.whatIsACluster": "Un cluster permet de grouper les hôtes. Les hôtes d'un cluster ont un matériel identique, exécutent le même hyperviseur, sont sur le même sous-réseau, et accèdent au même stockage partagé. Les instances de machines virtuelles (VM) peuvent être migrées à chaud d'un hôte à un autre au sein du même groupe, sans interrompre les services utilisateur. Un cluster est la trois ème plus large unité organisationnelle dans un déploiement CloudStack&#8482;. Les clusters sont contenus dans les pods et les pods sont contenus dans les zones.<br/><br/>CloudStack&#8482; permet d'avoir plusieurs clusters dans un déploiement en nuage, mais pour une installation basique, il n'y a qu'un seul cluster.",
-    "message.installWizard.copy.whatIsAHost": "Un hôte est une machine. Les hôtes fournissent les ressources informatiques qui exécutent les machines virtuelles invitées. Chaque hôte a un logiciel hyperviseur installé pour gérer les machines virtuelles invitées (sauf pour les hôtes de type 'bare-metal', qui sont un cas particulier détaillé dans le Guide d'installation avancée). Par exemple, un serveur Linux avec KVM, un serveur Citrix XenServer, et un serveur ESXi sont des hôtes. Dans une installation basique, un seul hôte exécutant XenServer ou KVM est utilisé.<br/><br/>L'hôte est la plus petite unité organisation au sein d'un déploiement CloudStack&#8482;. Les hôtes sont contenus dans les clusters, les clusters sont contenus dans les pods et les pods sont contenus dans les zones.",
-    "message.installWizard.copy.whatIsAPod": "Un pod représente souvent un seul rack. Les hôtes dans le même pod sont dans le même sous-réseau.<br/>Un pod est la deuxième plus grande unité organisationnelle au sein d'un déploiement CloudStack&#8482;. Les pods sont contenus dans les zones. Chaque zone peut contenir un ou plusieurs pods ; dans l'Installation Basique, vous aurez juste un pod dans votre zone.",
-    "message.installWizard.copy.whatIsAZone": "Une zone est la plus grande unité organisationnelle au sein d'un déploiement CloudStack&#8482;. Une zone correspond typiquement à un centre de données, mais il est permis d'avoir plusieurs zones dans un centre de données. L'avantage d'organiser une infrastructure en zones est de fournir une isolation physique et de la redondance. Par exemple, chaque zone peut avoir sa propre alimentation et de liaison avec le réseau, et les zones peuvent être très éloignées géographiquement (même si ce n'est pas une obligation).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482; est une plate-forme logicielle de pools de ressources informatiques pour construire des infrastructures publiques, privées et hybrides en tant que services (IaaS) dans les nuages. CloudStack&#8482; gère le réseau, le stockage et les noeuds de calcul qui composent une infrastructure dans les nuages. Utilisez CloudStack&#8482; pour déployer, gérer et configurer les environnements d'informatiques dans les nuages.<br/><br/>S'étendant au-delà des machines virtuelles individuelles fonctionnant sur du matériel standard, CloudStack&#8482; offre une solution d'informatique en nuage clé en main pour fournir des centres de données virtuels comme service - fournissant tous les composants essentiels pour construire, déployer et gérer des applications 'cloud' multi-niveaux et multi-locataire. Les versions libre et Premium sont disponibles, la version Libre offrant des caractéristiques presque identiques.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "Une infrastructure CloudStack&#8482; utilise deux types de stockage : stockage primaire et stockage secondaire. Les deux peuvent être des serveurs iSCSI ou NFS, ou sur disque local.<br/><br/><strong>Le stockage principal</strong> est associé à un cluster, et stocke les volumes disques de chaque machine virtuelle pour toutes les VMs s'exécutant sur les hôtes dans le cluster. Le serveur de stockage primaire est typiquement proche des hôtes.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Le stockage secondaire est associé à une zone, et il stocke les éléments suivants:<ul><li>Modèles - images de systèmes d'exploitation qui peuvent être utilisées pour démarrer les machines virtuelles et peuvent inclure des informations de configuration supplémentaires, telles que les applications pré-installées</li><li>Images ISO - images de système d'exploitation ou d'installation d'OS qui peuvent être amorçable ou non-amorçable</li><li>Images de volume disque - capture des données de machines virtuelles qui peuvent être utilisées pour la récupération des données ou créer des modèles</ul>",
-    "message.installWizard.now.building": "Construction de votre Cloud en cours",
-    "message.installWizard.tooltip.addCluster.name": "Un nom pour le cluster. Ce choix est libre et n'est pas utilisé par CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "Le nom DNS ou adresse IP du serveur.",
-    "message.installWizard.tooltip.addHost.password": "Le mot de passe pour l'utilisateur indiqué précédemment (issu de l'installation XenServer).",
-    "message.installWizard.tooltip.addHost.username": "Habituellement root.",
-    "message.installWizard.tooltip.addPod.name": "Nom pour le pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Ceci est la plage d'adresses IP dans le réseau privé que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le même sous-réseau que les serveurs hôtes.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "Passerelle pour les serveurs dans ce pod",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "Le masque réseau que les instances utiliseront sur le réseau",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Ceci est la plage d'adresses IP dans le réseau privé que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le même sous-réseau que les serveurs hôtes.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "Nom pour ce stockage",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(pour NFS) Dans NFS, c'est le chemin d'export depuis le serveur. Le chemin (pour SharedMountPoint). Avec KVM, c'est le chemin sur chaque hôte où ce stockage primaire est monté. Par exemple, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(pour NFS, iSCSI ou PreSetup) Adresse IP ou nom DNS du stockage",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "Adresse IP du serveur NFS supportant le stockage secondaire",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "Le chemin exporté, situé sur le serveur spécifié précédemment",
-    "message.installWizard.tooltip.addZone.dns1": "Ces serveurs DNS sont utilisés par les machines virtuelles Invitées dans la zone. Ces serveurs DNS seront accessibles par le réseau public, ce dernier sera ajouté plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqués ici.",
-    "message.installWizard.tooltip.addZone.dns2": "Ces serveurs DNS sont utilisés par les machines virtuelles Invitées dans la zone. Ces serveurs DNS seront accessibles par le réseau public, ce dernier sera ajouté plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqués ici.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Ces serveurs DNS sont utilisés par les machines virtuelles Invitées dans la zone. Ces serveurs DNS seront accessibles par le réseau public, ce dernier sera ajouté plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqués ici.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Ces serveurs DNS sont utilisés par les machines virtuelles Invitées dans la zone. Ces serveurs DNS seront accessibles par le réseau public, ce dernier sera ajouté plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqués ici.",
-    "message.installWizard.tooltip.addZone.name": "Nom pour la zone",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Description pour ce réseau",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "La plage d'adresses IP qui sera disponible en allocation pour les machines invitées dans cette zone. Si une carte réseau est utilisée, ces adresses IP peuvent être dans le même CIDR que le CIDR du pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "La passerelle que les instances invitées doivent utiliser",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "Le masque réseau que les instances devrait utiliser sur le réseau",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "La plage d'adresses IP qui sera disponible en allocation pour les machines invitées dans cette zone. Si une carte réseau est utilisée, ces adresses IP peuvent être dans le même CIDR que le CIDR du pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Nom pour ce réseau",
-    "message.instance.scaled.up.confirm": "Êtes-vous sûr de vouloir agrandir votre instance ?",
-    "message.instanceWizard.noTemplates": "Vous n'avez pas de image disponible ; Ajouter un modèle compatible puis relancer l'assistant de création d'instance.",
-    "message.ip.address.changed": "Vos adresses IP ont peut être changées ; Voulez vous rafraîchir la liste ? Dans ce cas, le panneau de détail se fermera.",
-    "message.iso.desc": "Image disque contenant des données ou un support amorçable pour OS",
-    "message.join.project": "Vous avez rejoint un projet. Sélectionnez la vue Projet pour le voir.",
-    "message.launch.vm.on.private.network": "Souhaitez vous démarrer cette instance sur votre propre réseau privé ?",
-    "message.launch.zone": "La zone est prête à démarrer ; passer à l'étape suivante.",
-    "message.ldap.group.import": "Tous les utilisateurs du groupe indiqué seront importés",
-    "message.link.domain.to.ldap": "Activer autosync pour ce domaine dans le LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-clic)",
-    "message.lock.account": "Verrouiller ce compte ? En le verrouillant, les utilisateurs de ce compte ne seront plus capables de gérer leurs ressources. Les ressources existantes resteront toutefois accessibles.",
-    "message.migrate.instance.confirm": "Confirmez l'hôte vers lequel vous souhaitez migrer cette instance",
-    "message.migrate.instance.to.host": "Confirmer la migration de l'instance vers un autre hôte",
-    "message.migrate.instance.to.ps": "Confirmer la migration de l'instance vers un autre stockage primaire",
-    "message.migrate.router.confirm": "Confirmer la migration du routeur vers :",
-    "message.migrate.systemvm.confirm": "Confirmer la migration de la VM système vers :",
-    "message.migrate.volume": "Confirmer la migration du volume vers un autre stockage primaire.",
-    "message.network.addVM.desc": "Veuillez spécifier le réseau que vous souhaitez ajouter à cette VM. Une nouvelle interface NIC sera ajoutée pour ce réseau.",
-    "message.network.addVMNIC": "Confirmer l'ajout d'une nouvelle NIC VM pour ce réseau.",
-    "message.network.remote.access.vpn.configuration": "La configuration VPN Accés Distant a été générée mais elle n'a pas pu être appliquée. Veuillez vérifier la connectivité des éléments réseau, et ré-essayez.",
-    "message.new.user": "Renseigner les informations suivantes pour ajouter un nouveau compte utilisateur",
-    "message.no.affinity.groups": "Vous n'avez pas de groupes d'affinité. Continuer vers la prochaine étape.",
-    "message.no.host.available": "Aucun hôte n'est disponible pour la migration",
-    "message.no.network.support": "Sélectionnez l'hyperviseur. vSphere, n'a pas de fonctionnalités supplémentaires pour le réseau. Continuez à l'étape 5.",
-    "message.no.network.support.configuration.not.true": "Il n'y a pas de zone avec la fonction groupe de sécurité active. Dès lors, pas de fonction réseau supplémentaires disponibles. Continuer à l'étape 5.",
-    "message.no.projects": "Vous n'avez pas de projet.<br/>Vous pouvez en créer un depuis la section projets.",
-    "message.no.projects.adminOnly": "Vous n'avez pas de projet.<br/>Contacter votre administrateur pour ajouter un projet.",
-    "message.number.clusters": "<h2><span> # de </span> Clusters</h2>",
-    "message.number.hosts": "<h2><span> # d' </span> Hôtes</h2>",
-    "message.number.pods": "<h2><span> # de </span> Pods</h2>",
-    "message.number.storage": "<h2><span> # de </span> Volumes de Stockage Primaire</h2>",
-    "message.number.zones": "<h2><span> # de </span> Zones</h2>",
-    "message.outofbandmanagement.action.maintenance": "L'hôte en avertissement est en mode maintenance",
-    "message.outofbandmanagement.changepassword": "Modifier le mot de passe du flux d'administration",
-    "message.outofbandmanagement.configure": "Configurer la gestion du flux d'administration",
-    "message.outofbandmanagement.disable": "Désactiver la gestion du flux d'administration",
-    "message.outofbandmanagement.enable": "Activer la gestion du flux d'administration",
-    "message.outofbandmanagement.issue": "Problème dans l'allumage via la gestion du flux administration.",
-    "message.password.has.been.reset.to": "Le mot de passe a été ré-initialiser en",
-    "message.password.of.the.vm.has.been.reset.to": "Le mot de passe de la VM a été ré-initialisé en",
-    "message.pending.projects.1": "Vous avez des invitations projet en attente :",
-    "message.pending.projects.2": "Pour les visualiser, aller dans la section projets, puis sélectionner invitation dans la liste déroulante.",
-    "message.please.add.at.lease.one.traffic.range": "Ajouter au moins une plage réseau",
-    "message.please.confirm.remove.ssh.key.pair": "Confirmer la suppression de cette bi-clé SSH",
-    "message.please.proceed": "Continuer vers la prochaine étape.",
-    "message.please.select.a.configuration.for.your.zone": "Sélectionner une configuration pour la zone.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Sélectionner un réseau public et d'administration différent avant de supprimer",
-    "message.please.select.networks": "Sélectionner les réseaux pour votre machine virtuelle.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Veuillez sélectionner la bi-clé SSH que vous souhaitez utiliser avec cette VM :",
-    "message.please.wait.while.zone.is.being.created": "Patienter pendant la création de la zone, cela peut prendre du temps...",
-    "message.pod.dedication.released": "Libération du pod dédié",
-    "message.portable.ip.delete.confirm": "Supprimer la plage IP portable ?",
-    "message.project.invite.sent": "Invitation envoyée ; les utilisateurs seront ajoutés après acceptation de l'invitation",
-    "message.public.traffic.in.advanced.zone": "Le trafic public est généré lorsque les machines virtuelles dans le nuage accèdent à Internet. Des adresses IP publiquement accessibles doivent être prévues à cet effet. Les utilisateurs peuvent utiliser l'interface d'administration de CloudStack pour acquérir ces adresses IP qui implémenteront une translation d'adresse NAT entre le réseau d'invité et le réseau public.<br/><br/>Fournir au moins une plage d'adresses IP pour le trafic Internet.",
-    "message.public.traffic.in.basic.zone": "Le trafic public est généré lorsque les machines virtuelles dans le nuage accèdent à Internet ou fournissent des services à des utilisateurs sur Internet. Des adresses IP publiquement accessibles doivent être prévus à cet effet. Quand une instance est créée, une adresse IP publique depuis un ensemble d'adresses IP publiques sera allouée à l'instance, en plus de l'adresse IP de l'invité. La translation d'adresses statique NAT 1-1 sera mises en place automatiquement entre l'adresse IP publique et l'adresse IP de l'invité. Les utilisateurs peuvent également utiliser l'interface d'administration CloudStack pour acquérir des adresses IP supplémentaires pour ajouter une translation d'adresse statique NAT entre leurs instances et le réseau d'adresses IP publiques.",
-    "message.question.are.you.sure.you.want.to.add": "Êtes-vous certain de vouloir ajouter",
-    "message.read.admin.guide.scaling.up": "Veuillez lire le paragraphe \"dynamic scaling\" dans le guide d'administration avant d'opérer un dimensionnement dynamique.",
-    "message.recover.vm": "Confirmer la restauration de cette VM.",
-    "message.redirecting.region": "Redirection vers région...",
-    "message.reinstall.vm": "NOTE: Procédez avec prudence. Cela entraînera la ré-installation de la VM à partir du modèle; les données sur le disque ROOT seront perdues. Les volumes de données supplémentaires, le cas échéant, ne seront pas touchés.",
-    "message.remove.ldap": "Voulez-vous supprimer la configuration LDAP ?",
-    "message.remove.region": "Voulez-vous supprimer cette région depuis ce serveur d'administration ?",
-    "message.remove.vpc": "Confirmer la suppression du VPC",
-    "message.remove.vpn.access": "Supprimer l'accès VPN de cet utilisateur ?",
-    "message.removed.ssh.key.pair": "Bi-clé SSH supprimée",
-    "message.reset.VPN.connection": "Confirmer le ré-initialisation de la connexion VPN",
-    "message.reset.password.warning.notPasswordEnabled": "Le modèle de cette instance a été créé sans la gestion de mot de passe",
-    "message.reset.password.warning.notStopped": "Votre instance doit être arrêtée avant de changer son mot de passe",
-    "message.restart.mgmt.server": "Redémarrez votre(vos) serveur(s) de management pour appliquer les nouveaux paramètres.",
-    "message.restart.mgmt.usage.server": "Redémarrer le ou les serveur(s) de gestion et le ou les serveur(s) de consommation pour que les nouveaux paramètres soient pris en compte.",
-    "message.restart.network": "Tous les services fournit par ce routeur virtuel vont être interrompus. Confirmer le redémarrage de ce routeur.",
-    "message.restart.vpc": "Confirmer le redémarrage du VPC",
-    "message.restart.vpc.remark": "Veuillez confirmer que vous voulez redémarrer le VPC <p><small><i>Note : transformer un VPC non-redondant en VPC redondant va forcer un nettoyage du routeur. Le réseau associé ne sera pas disponible durant quelques minutes</i>.</small></p>",
-    "message.restoreVM": "Voulez-vous restaurer la VM ?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "La réorganisation des règles d'autorisations a été abandonnée car la liste a changé pendant que vous apportez des modifications. Veuillez réessayer.",
-    "message.security.group.usage": "(Utilisez <strong>Ctrl-clic</strong> pour sélectionner les groupes de sécurité visés)",
-    "message.select.a.zone": "Une zone correspond typiquement à un seul centre de données. Des zones multiples peuvent permettre de rendre votre cloud plus fiable en apportant une isolation physique et de la redondance.",
-    "message.select.affinity.groups": "Sélectionner les groupes d'affinité qui appartiendront à cette machine virtuelle :",
-    "message.select.instance": "Sélectionner une instance.",
-    "message.select.iso": "Sélectionner un ISO pour votre nouvelle instance virtuelle.",
-    "message.select.item": "Merci de sélectionner un élément.",
-    "message.select.security.groups": "Merci de sélectionner un(des) groupe(s) de sécurité pour la nouvelle VM",
-    "message.select.template": "Sélectionner un modèle pour votre nouvelle instance virtuelle.",
-    "message.select.tier": "Veuillez selectionner un tiers",
-    "message.set.default.NIC": "Confirmer la mise par défaut de cette NIC pour cette VM.",
-    "message.set.default.NIC.manual": "Veuillez mettre à jour manuellement la NIC par défaut sur la VM maintenant.",
-    "message.setup.physical.network.during.zone.creation": "Lorsque vous ajoutez une zone avancée, vous avez besoin de définir un ou plusieurs réseaux physiques. Chaque réseau correspond à une carte réseau sur l'hyperviseur. Chaque réseau physique peut supporter un ou plusieurs types de trafic, avec certaines restrictions sur la façon dont ils peuvent être combinés.<br/><br/><strong>Glisser et déposer un ou plusieurs types de trafic</strong> sur chaque réseau physique.",
-    "message.setup.physical.network.during.zone.creation.basic": "Quand vous ajoutez une zone basique, vous pouvez paramétrer un seul réseau physique, correspondant à une carte réseau sur l'hyperviseur. Ce réseau comportera plusieurs types de trafic.<br/><br/>Vous pouvez également <strong>glisser et déposer</strong> d'autres types de trafic sur le réseau physique.",
-    "message.setup.successful": "Installation du Cloud réussie !",
-    "message.snapshot.schedule": "Vous pouvez configurer des plannings d'instantanés récurrents en sélectionnant les options disponibles ci-dessous et en appliquant votre politique préférée.",
-    "message.specifiy.tag.key.value": "Spécifier une clé et valeur de tag",
-    "message.specify.url": "Renseigner l'URL",
-    "message.step.1.continue": "Sélectionnez un modèle ou une image ISO pour continuer",
-    "message.step.1.desc": "Sélectionnez un modèle pour votre nouvelle instance virtuelle. Vous pouvez également choisir un modèle vierge sur lequel une image ISO pourra être installée.",
-    "message.step.2.continue": "Sélectionnez une offre de service pour continuer",
-    "message.step.3.continue": "Sélectionnez un offre de service de disque pour continuer",
-    "message.step.4.continue": "Sélectionnez au moins un réseau pour continuer",
-    "message.step.4.desc": "Sélectionnez le réseau principal auquel votre instance va être connecté.",
-    "message.storage.traffic": "Trafic entre les ressources internes de CloudStack, incluant tous les composants qui communiquent avec le serveur d'administration, tels que les hôtes et les machines virtuelles Systèmes CloudStack. Veuillez configurer le trafic de stockage ici.",
-    "message.suspend.project": "Voulez-vous suspendre ce projet ?",
-    "message.systems.vms.ready": "VMs Systèmes prêts.",
-    "message.template.copying": "Le modèle est copié.",
-    "message.template.desc": "Image OS pouvant être utilisée pour démarrer une VM",
-    "message.tier.required": "Le tiers est obligatoire",
-    "message.tooltip.dns.1": "Nom d'un serveur DNS utilisé par les VM de la zone. Les adresses IP publiques de cette zone doivent avoir une route vers ce serveur.",
-    "message.tooltip.dns.2": "Nom d'un serveur DNS secondaire utilisé par les VM de la zone. Les adresses IP publiques de cette zone doivent avoir une route vers ce serveur.",
-    "message.tooltip.internal.dns.1": "Nom d'un serveur DNS que CloudStack peut utiliser pour les VM système dans cette zone. Les adresses IP privées des pods doivent avoir une route vers ce serveur.",
-    "message.tooltip.internal.dns.2": "Nom d'un serveur DNS que CloudStack peut utiliser pour les VM système dans cette zone. Les adresses IP privées des pods doivent avoir une route vers ce serveur.",
-    "message.tooltip.network.domain": "Suffixe DNS qui créera un nom de domaine personnalisé pour les réseau accessible par les VM invitées.",
-    "message.tooltip.pod.name": "Nom pour ce pod.",
-    "message.tooltip.reserved.system.gateway": "La passerelle pour les hôtes du pod.",
-    "message.tooltip.reserved.system.netmask": "Le préfixe réseau utilisé par le sous-réseau du pod. Au format CIDR.",
-    "message.tooltip.zone.name": "Nom pour cette zone.",
-    "message.update.os.preference": "Choisissez votre OS préféré pour cet hôte. Toutes les instances avec des préférences similaires seront d'abord allouées à cet hôte avant d'en choisir un autre.",
-    "message.update.resource.count": "Confirmer la mise à jour des ressources pour ce compte.",
-    "message.update.ssl": "Soumettez un nouveau certificat SSL compatible X.509 qui sera mis à jour sur chaque VM console proxy et VM sockage secondaire :",
-    "message.update.ssl.failed": "Échec dans la mise à jour du certificat SSL",
-    "message.update.ssl.succeeded": "Mise à jour réussie des certificats SSL",
-    "message.validate.URL": "Veuillez entrer une URL valide.",
-    "message.validate.accept": "Veuillez entrer une valeur avec une extension valide.",
-    "message.validate.creditcard": "Veuillez entrer un numéro de carte de crédit valide.",
-    "message.validate.date": "Veuillez entrer une date valide.",
-    "message.validate.date.ISO": "Veuillez entrer une date (ISO) valide.",
-    "message.validate.digits": "Veuillez entrer uniquement des chiffres.",
-    "message.validate.email.address": "Veuillez entrer une adresse email valide.",
-    "message.validate.equalto": "Veuillez entrer de nouveau la même valeur.",
-    "message.validate.fieldrequired": "Ce champ est obligatoire.",
-    "message.validate.fixfield": "Veuillez corriger ce champ.",
-    "message.validate.instance.name": "Le nom de l'instance ne peut dépasser 63 caractères. Seuls les lettres de a à z, les chiffres de 0 à 9 et les tirets sont acceptés. Le nom doit commencer par une lettre et se terminer par une lettre ou un chiffre.",
-    "message.validate.invalid.characters": "Caractères invalides trouvés ; veuillez corriger.",
-    "message.validate.max": "Veuillez entrer une valeur inférieure ou égale à {0}.",
-    "message.validate.maxlength": "Veuillez entrer uniquement {0} caractères.",
-    "message.validate.minlength": "Veuillez entrer au moins {0} caractères.",
-    "message.validate.number": "Veuillez entrer un nombre valide.",
-    "message.validate.range": "Veuillez entrer une valeur de {0} à {1}.",
-    "message.validate.range.length": "Veuillez entrer une valeur de {0} à {1} caractères.",
-    "message.virtual.network.desc": "Un réseau virtuel dédié pour votre compte. Ce domaine de multi-diffusion est contenu dans un VLAN et l'ensemble des réseaux d'accès publique sont routés par un routeur virtuel.",
-    "message.vm.create.template.confirm": "Créer un modèle va redémarrer la VM automatiquement",
-    "message.vm.review.launch": "Merci de vérifier les informations suivantes et de confirmer que votre instance virtuelle est correcte avant de la démarrer.",
-    "message.vnmc.available.list": "VNMC n'est pas disponible dans la liste des fournisseurs.",
-    "message.vnmc.not.available.list": "VNMC n'est pas disponible dans la liste des fournisseurs.",
-    "message.volume.create.template.confirm": "Créer un modèle pour ce disque ? La création peut prendre plusieurs minutes, voir plus, selon la taille du volume.",
-    "message.waiting.for.builtin.templates.to.load": "Attendre le chargement des modèles pré-construit...",
-    "message.you.must.have.at.least.one.physical.network": "Vous devez avoir au moins un réseau physique",
-    "message.your.cloudstack.is.ready": "Votre CloudStack est prêt !",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Création de la zone terminée. Voulez-vous l'activer ?",
-    "message.zone.no.network.selection": "La zone sélectionnée ne propose pas le réseau choisi",
-    "message.zone.step.1.desc": "Sélectionnez un modèle de réseau pour votre zone.",
-    "message.zone.step.2.desc": "Renseigner les informations suivantes pour ajouter une nouvelle zone",
-    "message.zone.step.3.desc": "Renseigner les informations suivantes pour ajouter un nouveau pod",
-    "message.zoneWizard.enable.local.storage": "ATTENTION : si vous activez le stockage local pour cette zone, vous devez effectuer les opérations suivantes, selon l'endroit où vous souhaitez lancer vos machines virtuelles Systèmes :<br/><br/>1. Si les machines virtuelles Systèmes doivent être lancées depuis le stockage primaire, ce dernier doit être ajouté à la zone après la création. Vous devez également démarrer la zone dans un état désactivé.<br/><br/>2. Si les machines virtuelles Systèmes doivent être lancées depuis le stockage local, le paramètre system.vm.use.local.storage doit être défini à 'true' avant d'activer la zone.<br/><br/><br/>Voulez-vous continuer ?",
-    "messgae.validate.min": "Veuillez entrer une valeur supérieure ou égale à {0}.",
-    "mode": "Mode",
-    "network.rate": "Débit Réseau",
-    "notification.reboot.instance": "Redémarrer l'instance",
-    "notification.start.instance": "Démarrer l'instance",
-    "notification.stop.instance": "Stopper l'instance",
-    "side.by.side": "Côte à côte",
-    "state.Accepted": "Accepté",
-    "state.Active": "Actif",
-    "state.Allocated": "Alloué",
-    "state.Allocating": "Allocation en cours",
-    "state.BackedUp": "Sauvegardé",
-    "state.BackingUp": "Sauvegarde en cours",
-    "state.Completed": "Terminé",
-    "state.Creating": "Création en cours",
-    "state.Declined": "Refusé",
-    "state.Destroyed": "Supprimée",
-    "state.Disabled": "Désactivé",
-    "state.Enabled": "Actifs",
-    "state.Error": "Erreur",
-    "state.Expunging": "Purge en cours",
-    "state.Migrating": "Migration en cours",
-    "state.Pending": "En attente",
-    "state.Ready": "Prêt",
-    "state.Running": "Démarrée",
-    "state.Starting": "Démarrage en cours",
-    "state.Stopped": "Arrêtée",
-    "state.Stopping": "Arrêt en cours",
-    "state.Suspended": "Suspendu",
-    "state.detached": "Détaché",
-    "title.upload.volume": "Téléverser Volume",
-    "ui.listView.filters.all": "Tous",
-    "ui.listView.filters.mine": "Les miennes"
-};
diff --git a/ui/legacy/l10n/hu.js b/ui/legacy/l10n/hu.js
deleted file mode 100644
index ad16519..0000000
--- a/ui/legacy/l10n/hu.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP kód",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP típus",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Az elem tulajdonságai megváltoztak",
-    "confirm.enable.s3": "Töltsd ki a következő információkat az S3 másodlagos tár bekapcsolásához!",
-    "confirm.enable.swift": "Töltsd ki a következő információkat a Swift támogatás bekapcsolásához!",
-    "error.could.not.change.your.password.because.non.native.user": "Nem sikerült megváltoztatni a jelszavadat, mert az LDAP be van kapcsolva.",
-    "error.could.not.enable.zone": "A zóna engedélyezése sikertelen",
-    "error.installWizard.message": "Valami nem sikerült, visszamehetsz kijavítani a hibákat.",
-    "error.invalid.username.password": "Érvénytelen felhasználónév vagy jelszó",
-    "error.login": "A felhasználónév/jelszó pár nem érvényes.",
-    "error.menu.select": "A művelet nem hajtható végre, mert nincsenek kiválasztott elemek.",
-    "error.mgmt.server.inaccessible": "A vezérlő szerver nem érhető el. Próbáld újra később!",
-    "error.password.not.match": "A jelszavak nem egyeznek.",
-    "error.please.specify.physical.network.tags": "A hálózati ajánlatok nem érhetőek el addig, amíg meg nem adsz címkéket a fizikai hálótathoz.",
-    "error.session.expired": "A munkamenet lejárt.",
-    "error.something.went.wrong.please.correct.the.following": "Valami nem jó! Javítsd a következőket:",
-    "error.unable.to.reach.management.server": "A vezérlő szerver nem elérhető",
-    "error.unresolved.internet.name": "Az internet neved nem oldható fel.",
-    "force.delete": "Törlés kikényszerítése",
-    "force.delete.domain.warning": "Figyelmeztetés: Ha ezt választod, törlődni fog minden alárendelt domén és minden kapcsolódó számla és a hozzájuk tartozó erőforrások.",
-    "force.remove": "Eltávolítás kikényszerítése",
-    "force.remove.host.warning": "Figyelmeztetés: Ha ezt az opciót választod, a CloudStack minden virtuális gépet leállít mielőtt eltávolítja a kiszolgálót a fürtből.",
-    "force.stop": "Leállás kikényszerítése",
-    "force.stop.instance.warning": "Figyelmeztetés: A példány erőszakos leállítása az utolsó lehetőség. Ez adatvesztéshez és a virtuális gép inkonzisztens viselkedéséhez vezethet.",
-    "hint.no.host.tags": "Nincsenek kiszolgáló címkék",
-    "hint.no.storage.tags": "Nincsenek tár címkék",
-    "hint.type.part.host.tag": "Írd be egy kiszolgáló címke részét",
-    "hint.type.part.storage.tag": "Írd be egy tár címke részét",
-    "image.directory": "Image Könyvtár",
-    "inline": "Inline",
-    "instances.actions.reboot.label": "Példány újraindítása",
-    "label.CIDR.list": "CIDR lista",
-    "label.CIDR.of.destination.network": "A cél hálózat CIDR",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "DHCP kiszolgáló típus",
-    "label.DNS.domain.for.guest.networks": "Vendég hálózatok DNS tartománya",
-    "label.ESP.encryption": "ESP titkosítás",
-    "label.ESP.hash": "ESP Hash",
-    "label.ESP.lifetime": "ESP élettartam (mp)",
-    "label.ESP.policy": "ESP szabályzat",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE titkosítás",
-    "label.IKE.hash": "IKE Hash",
-    "label.IKE.lifetime": "IKE élettartam (mp)",
-    "label.IKE.policy": "IKE szabályzat",
-    "label.IPsec.preshared.key": "IPsec Preshared-Key",
-    "label.LB.isolation": "Terheléselosztó izoláció",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto log profil",
-    "label.PA.threat.profile": "Palo Alto fenyegetés profil",
-    "label.PING.CIFS.password": "PING CIFS jelszó",
-    "label.PING.CIFS.username": "PING CIFS felhasználó",
-    "label.PING.dir": "PING Directory",
-    "label.PING.storage.IP": "PING tár IP",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Pxe szerver típus",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Port",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP könyvtár",
-    "label.VMFS.datastore": "VMFS adattár",
-    "label.VMs.in.tier": "Réteg VM-ei",
-    "label.VPC.limits": "VPC korlátok",
-    "label.VPC.router.details": "VPC router részletek",
-    "label.VPN.connection": "VPN kapcsolat",
-    "label.VPN.customer.gateway": "VPN ügyfélkapu",
-    "label.VPN.gateway": "VPN átjáró",
-    "label.Xenserver.Tools.Version61plus": "Original XS Version is 6.1+",
-    "label.about": "Névjegy",
-    "label.about.app": "A CloudStack-ről",
-    "label.accept.project.invitation": "Project-meghívó elfogadása",
-    "label.account": "Számla",
-    "label.account.and.security.group": "Számla, biztonsági csoport",
-    "label.account.details": "Számla részletei",
-    "label.account.id": "Számla azonosító",
-    "label.account.lower": "számla",
-    "label.account.name": "Számla név",
-    "label.account.specific": "Számla-specifikus",
-    "label.account.type": "Számla típus",
-    "label.accounts": "Számlák",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL List Rules",
-    "label.acl.name": "ACL név",
-    "label.acl.replaced": "ACL lehelyettesítve",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Új IP cím beszerzése",
-    "label.acquire.new.secondary.ip": "Új másodlagos IP cím beszerzése",
-    "label.action": "Művelet",
-    "label.action.attach.disk": "Merevlemez csatlakoztatása",
-    "label.action.attach.disk.processing": "Merevlemez csatlakoztatása...",
-    "label.action.attach.iso": "ISO csatlakoztatása",
-    "label.action.attach.iso.processing": "ISO csatlakoztatása...",
-    "label.action.cancel.maintenance.mode": "Karbantartási mód megszakítása",
-    "label.action.cancel.maintenance.mode.processing": "Karbantartási mód megszakítása...",
-    "label.action.change.password": "Jelszó csere",
-    "label.action.change.service": "Szolgáltatás változtatása",
-    "label.action.change.service.processing": "Szolgáltatás változtatása...",
-    "label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
-    "label.action.copy.ISO": "ISO másolása",
-    "label.action.copy.ISO.processing": "ISO másolása...",
-    "label.action.copy.template": "Sablon másolása",
-    "label.action.copy.template.processing": "Sablon másolása...",
-    "label.action.create.template": "Sablon létrehozása",
-    "label.action.create.template.from.vm": "Sablon létrehozása VM-ből",
-    "label.action.create.template.from.volume": "Sablon létrehozása kötetből",
-    "label.action.create.template.processing": "Sablon létrehozása...",
-    "label.action.create.vm": "VM létrehozása",
-    "label.action.create.vm.processing": "VM létrehozása...",
-    "label.action.create.volume": "Kötet létrehozása",
-    "label.action.create.volume.processing": "Kötet létrehozása....",
-    "label.action.delete.IP.range": "IP címtartomány törlése",
-    "label.action.delete.IP.range.processing": "IP címtartomány törlése...",
-    "label.action.delete.ISO": "ISO törlése",
-    "label.action.delete.ISO.processing": "ISO törlése...",
-    "label.action.delete.account": "Számla törlése",
-    "label.action.delete.account.processing": "Számla törlése...",
-    "label.action.delete.cluster": "Fürt törlése",
-    "label.action.delete.cluster.processing": "Fürt törlése...",
-    "label.action.delete.disk.offering": "Tár ajánlat törlése",
-    "label.action.delete.disk.offering.processing": "Tár ajánlat törlése...",
-    "label.action.delete.domain": "Domén törlése",
-    "label.action.delete.domain.processing": "Domén törlése...",
-    "label.action.delete.firewall": "Tűzfal szabály törlése",
-    "label.action.delete.firewall.processing": "Tűzfal törlése...",
-    "label.action.delete.ingress.rule": "Ingress szabály törlése",
-    "label.action.delete.ingress.rule.processing": "Ingress szabály törlése...",
-    "label.action.delete.load.balancer": "Terheléselosztó szabály törlése",
-    "label.action.delete.load.balancer.processing": "Terheléselosztó törlése...",
-    "label.action.delete.network": "Hálózat törlése",
-    "label.action.delete.network.processing": "Hálózat törlése...",
-    "label.action.delete.nexusVswitch": "Nexus 1000v törlése",
-    "label.action.delete.nic": "NIC eltávolítása",
-    "label.action.delete.physical.network": "Fizikai hálózat törlése",
-    "label.action.delete.pod": "Pod törlése",
-    "label.action.delete.pod.processing": "Pod törlése...",
-    "label.action.delete.primary.storage": "Elsődleges tár törlése",
-    "label.action.delete.primary.storage.processing": "Elsődleges tár törlése...",
-    "label.action.delete.secondary.storage": "Másodlagos tár törlése",
-    "label.action.delete.secondary.storage.processing": "Másodlagos tár törlése...",
-    "label.action.delete.security.group": "Biztonsági csoport törlése",
-    "label.action.delete.security.group.processing": "Biztonsági csoport törlése...",
-    "label.action.delete.service.offering": "Szolgáltatás ajánlat törlése",
-    "label.action.delete.service.offering.processing": "Szolgáltatás ajánlat törlése...",
-    "label.action.delete.snapshot": "Pillanatfelvétel törlése",
-    "label.action.delete.snapshot.processing": "Pillanatfelvétel törlése...",
-    "label.action.delete.system.service.offering": "Rendszer szolgáltatás ajánlat törlése",
-    "label.action.delete.template": "Sablon törlése",
-    "label.action.delete.template.processing": "Sablon törlése...",
-    "label.action.delete.user": "Felhasználó törlése",
-    "label.action.delete.user.processing": "Felhasználó törlése...",
-    "label.action.delete.volume": "Kötet törlése",
-    "label.action.delete.volume.processing": "Kötet törlése...",
-    "label.action.delete.zone": "Zóna törlése",
-    "label.action.delete.zone.processing": "Zóna törlése...",
-    "label.action.destroy.instance": "Példány elpusztítása",
-    "label.action.destroy.instance.processing": "Példány elpusztítása...",
-    "label.action.destroy.systemvm": "Rendszer VM elpusztítása",
-    "label.action.destroy.systemvm.processing": "Rendszer VM elpusztítása...",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Merevlemez leválasztása",
-    "label.action.detach.disk.processing": "Merevlemez leválasztása...",
-    "label.action.detach.iso": "ISO leválasztása",
-    "label.action.detach.iso.processing": "ISO leválasztása...",
-    "label.action.disable.account": "Számla kikapcsolása",
-    "label.action.disable.account.processing": "Számla kikapcsolása...",
-    "label.action.disable.cluster": "Fürt kikapcsolása",
-    "label.action.disable.cluster.processing": "Fürt kikapcsolása...",
-    "label.action.disable.nexusVswitch": "Nexus 1000v kikapcsolása",
-    "label.action.disable.physical.network": "Fizikikai hálózat kikapcsolása",
-    "label.action.disable.pod": "Pod kikapcsolása",
-    "label.action.disable.pod.processing": "Pod kikapcsolása...",
-    "label.action.disable.static.NAT": "Statikus NAT kikapcsolása",
-    "label.action.disable.static.NAT.processing": "Statikus NAT kikapcsolása...",
-    "label.action.disable.user": "Felhasználó kikapcsolása",
-    "label.action.disable.user.processing": "Felhasználó kikapcsolása...",
-    "label.action.disable.zone": "Zóna kikapcsolása",
-    "label.action.disable.zone.processing": "Zóna kikapcsolása...",
-    "label.action.download.ISO": "ISO letöltése",
-    "label.action.download.template": "Sablon letöltése",
-    "label.action.download.volume": "Kötet letöltése",
-    "label.action.download.volume.processing": "Kötet letöltése...",
-    "label.action.edit.ISO": "ISO szerkesztése",
-    "label.action.edit.account": "Számla engedélyezése",
-    "label.action.edit.disk.offering": "Merevlemez ajánlat szerkesztése",
-    "label.action.edit.domain": "Domén szerkesztése",
-    "label.action.edit.global.setting": "Globális beállítás szerkesztése",
-    "label.action.edit.host": "Kiszolgáló szerkesztése",
-    "label.action.edit.instance": "Példány szerkesztése",
-    "label.action.edit.network": "Hálózat szerkesztése",
-    "label.action.edit.network.offering": "Hálózat ajánlat szerkesztése",
-    "label.action.edit.network.processing": "Hálózat szerkesztése...",
-    "label.action.edit.pod": "Pod szerkesztése",
-    "label.action.edit.primary.storage": "Elsődleges tár szerkesztése",
-    "label.action.edit.resource.limits": "Erőforrás korlátok szerkesztése",
-    "label.action.edit.service.offering": "Szolgáltatás ajánlat szerkesztése",
-    "label.action.edit.template": "Sablon szerkesztése",
-    "label.action.edit.user": "Felhasználó szerkesztése",
-    "label.action.edit.zone": "Zóna szerkesztése",
-    "label.action.enable.account": "Számla engedélyezése",
-    "label.action.enable.account.processing": "Számla szerkesztése...",
-    "label.action.enable.cluster": "Fürt engedélyezése",
-    "label.action.enable.cluster.processing": "Fürt engedélyezése...",
-    "label.action.enable.maintenance.mode": "Karbantartási üzemmód engedélyezése",
-    "label.action.enable.maintenance.mode.processing": "Karbantartási üzemmód engedélyezése...",
-    "label.action.enable.nexusVswitch": "Nexus 1000v bekapcsolása",
-    "label.action.enable.physical.network": "Fizikai hálózat bekapcsolása",
-    "label.action.enable.pod": "Pod bekapcsolása",
-    "label.action.enable.pod.processing": "Pod bekapcsolása...",
-    "label.action.enable.static.NAT": "Statikus NAT bekapcsolása",
-    "label.action.enable.static.NAT.processing": "Statikus NAT bekapcsolása...",
-    "label.action.enable.user": "Felhasználó bekapcsolása",
-    "label.action.enable.user.processing": "Felhasználó bekapcsolása...",
-    "label.action.enable.zone": "Zóna bekapcsolása",
-    "label.action.enable.zone.processing": "Zóna bekapcsolása....",
-    "label.action.expunge.instance": "Példány törlése",
-    "label.action.expunge.instance.processing": "Példány törlése...",
-    "label.action.force.reconnect": "Újracsatlakozás kikényszerítése",
-    "label.action.force.reconnect.processing": "Újrakapcsolódás...",
-    "label.action.generate.keys": "Kulcsgenerálás",
-    "label.action.generate.keys.processing": "Kulcsgenerálás....",
-    "label.action.list.nexusVswitch": "Nexus 1000v lista",
-    "label.action.lock.account": "Számla zárása",
-    "label.action.lock.account.processing": "Számla zárása...",
-    "label.action.manage.cluster": "Fürt vezérlése",
-    "label.action.manage.cluster.processing": "Fürt vezérlése...",
-    "label.action.migrate.instance": "Példány költöztetése",
-    "label.action.migrate.instance.processing": "Példány mozgatása...",
-    "label.action.migrate.router": "Router költöztetése",
-    "label.action.migrate.router.processing": "Router mozgatása...",
-    "label.action.migrate.systemvm": "Rendszer VM költöztetése",
-    "label.action.migrate.systemvm.processing": "Rendszer VM mozgatása...",
-    "label.action.reboot.instance": "Példány újraindítása",
-    "label.action.reboot.instance.processing": "Példány újraindítása",
-    "label.action.reboot.router": "Router újraindítása",
-    "label.action.reboot.router.processing": "Router újraindítása...",
-    "label.action.reboot.systemvm": "Rendszer VM újraindítása",
-    "label.action.reboot.systemvm.processing": "Rendszer VM újraindítása",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Ismétlődő pillanatfelvételek",
-    "label.action.register.iso": "ISO regisztrációja",
-    "label.action.register.template": "Sablon regisztrációja URL-ről",
-    "label.action.release.ip": "IP cím elengedése",
-    "label.action.release.ip.processing": "IP cím elengedése",
-    "label.action.remove.host": "Kiszolgáló eltávolítása",
-    "label.action.remove.host.processing": "Kiszolgáló eltávolítása...",
-    "label.action.reset.password": "Jelszó újrabeállítása",
-    "label.action.reset.password.processing": "Jelszó újrabeállítása...",
-    "label.action.resize.volume": "Kötet átméretezése",
-    "label.action.resize.volume.processing": "Kötet átméretezése",
-    "label.action.resource.limits": "Erőforrás korlátok",
-    "label.action.restore.instance": "Példány helyreállítása",
-    "label.action.restore.instance.processing": "Példány helyreállítása...",
-    "label.action.revert.snapshot": "Visszaállás pillanatfelvételre",
-    "label.action.revert.snapshot.processing": "Visszaállás pillanatfelvételre...",
-    "label.action.start.instance": "Példány indítása",
-    "label.action.start.instance.processing": "Példány indítása...",
-    "label.action.start.router": "Router indítása",
-    "label.action.start.router.processing": "Router leállítása...",
-    "label.action.start.systemvm": "Rendszer VM indítása",
-    "label.action.start.systemvm.processing": "Rendszer VM indítása",
-    "label.action.stop.instance": "Példány leállítása",
-    "label.action.stop.instance.processing": "Példány leállítása...",
-    "label.action.stop.router": "Router leállítása",
-    "label.action.stop.router.processing": "Router leállítása...",
-    "label.action.stop.systemvm": "Rendszer VM leállítása",
-    "label.action.stop.systemvm.processing": "Rendszer VM leállítása...",
-    "label.action.take.snapshot": "Pillanatfelvétel készítése",
-    "label.action.take.snapshot.processing": "Pillanatfelvétel készítése...",
-    "label.action.unmanage.cluster": "Fürt vezérlés leállítása",
-    "label.action.unmanage.cluster.processing": "Fürt vezérlés leállítása...",
-    "label.action.update.OS.preference": "OS preferencia módosítása",
-    "label.action.update.OS.preference.processing": "OS preferencia módosítása...",
-    "label.action.update.resource.count": "Erőforrás szám módosítása",
-    "label.action.update.resource.count.processing": "Erőforrás szám módosítása...",
-    "label.action.vmsnapshot.create": "VM pillanatfelvétel készítése",
-    "label.action.vmsnapshot.delete": "VM pillanatfelvétel készítése",
-    "label.action.vmsnapshot.revert": "Visszaállás VM pillanatfelvételre",
-    "label.actions": "Műveletek",
-    "label.activate.project": "Projekt aktiválása",
-    "label.active.sessions": "Aktív munkamenetek",
-    "label.add": "Felvétel",
-    "label.add.ACL": "ACL felvétele",
-    "label.add.BigSwitchBcf.device": "BigSwitch BCF vezérlő felvétele",
-    "label.add.BrocadeVcs.device": "Brocade Vcs Switch felvétele",
-    "label.add.F5.device": "F5 eszköz felvétele",
-    "label.add.LDAP.account": "LDAP számla felvétele",
-    "label.add.NiciraNvp.device": "Nvp Controller felvétele",
-    "label.add.OpenDaylight.device": "OpenDaylight Controller hozzáadása",
-    "label.add.PA.device": "Palo Alto eszköz felvétele",
-    "label.add.SRX.device": "SRX szköz felvétele",
-    "label.add.VM.to.tier": "VM felvétele rétegbe",
-    "label.add.VPN.gateway": "VPN átjáró felvétele",
-    "label.add.account": "Számla felvétele",
-    "label.add.account.to.project": "Számla felvétele a projekthez",
-    "label.add.accounts": "Számlák felvétele",
-    "label.add.accounts.to": "Számla felvétele:",
-    "label.add.acl.list": "ACL lista felvétele",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Új affinítási csoport felvétele",
-    "label.add.baremetal.dhcp.device": "Baremetal DHCP eszköz felvétele",
-    "label.add.baremetal.rack.configuration": "Baremetal rack konfiguráció felvétele",
-    "label.add.by": "Add by",
-    "label.add.by.cidr": "Add By CIDR",
-    "label.add.by.group": "Add By Group",
-    "label.add.ciscoASA1000v": "CiscoASA1000v erőforrás felvétele",
-    "label.add.cluster": "Fürt felvétele",
-    "label.add.compute.offering": "CPU ajánlat felvétele",
-    "label.add.direct.iprange": "IP tartomány felvétele",
-    "label.add.disk.offering": "Merevlemez ajánlat felvétele",
-    "label.add.domain": "Domén felvétele",
-    "label.add.egress.rule": "Kimenő szabály felvétele",
-    "label.add.firewall": "Tűzfal szabály felvétele",
-    "label.add.globo.dns": "GloboDNS felvétele",
-    "label.add.gslb": "GSLB felvétele",
-    "label.add.guest.network": "Vendég hálózat felvétele",
-    "label.add.host": "Kiszolgáló felvétele",
-    "label.add.ingress.rule": "Ingress szabály felvétele",
-    "label.add.intermediate.certificate": "Közbülső tanúsítvány felvétele",
-    "label.add.internal.lb": "Belső LB felvétele",
-    "label.add.ip.range": "IP címtartomány felvétele",
-    "label.add.isolated.guest.network": "Izolált vendég hálózat felvétele",
-    "label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
-    "label.add.isolated.network": "Izolált hálózat felvétele",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "LDAP hozzáférés felvétele",
-    "label.add.list.name": "ACL lista név",
-    "label.add.load.balancer": "Terheléselosztó felvétele",
-    "label.add.more": "További felvétele",
-    "label.add.netScaler.device": "Netscaler eszköz felvétele",
-    "label.add.network": "Hálózat felvétele",
-    "label.add.network.ACL": "Hálózati ACL felvétele",
-    "label.add.network.acl.list": "Hálózati ACL lista felvétele",
-    "label.add.network.device": "Add Network Device",
-    "label.add.network.offering": "Hálózati ajánlat felvétele",
-    "label.add.new.F5": "Új F5 felvétele",
-    "label.add.new.NetScaler": "Új NetScaler felvétele",
-    "label.add.new.PA": "Új Palo Alto felvétele",
-    "label.add.new.SRX": "Új SRX felvétele",
-    "label.add.new.gateway": "Új átjáró felvétele",
-    "label.add.new.tier": "Új réteg felvétele",
-    "label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
-    "label.add.physical.network": "Fizikai hálózat felvétele",
-    "label.add.pod": "Pod felvétele",
-    "label.add.port.forwarding.rule": "Port továbbító szabály felvétele",
-    "label.add.portable.ip.range": "Portolható IP tartomány felvétele",
-    "label.add.primary.storage": "Elsődleges tár felvétele",
-    "label.add.private.gateway": "Privát átjáró felvétele",
-    "label.add.region": "Régió felvétele",
-    "label.add.resources": "Erőforrások felvétele",
-    "label.add.role": "Add Role",
-    "label.add.route": "Útvonal felvétele",
-    "label.add.rule": "Szabály felvétele",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Másodlagos tár felvétele",
-    "label.add.security.group": "Biztonsági csoport felvétele",
-    "label.add.service.offering": "Szolgáltatás ajánlat felvétele",
-    "label.add.static.nat.rule": "Statikus NAT szabály felvétele",
-    "label.add.static.route": "Statikus útvonal felvétele",
-    "label.add.system.service.offering": "Add System Service Offering",
-    "label.add.template": "Sablon felvétele",
-    "label.add.to.group": "Felvétel a csoportba",
-    "label.add.ucs.manager": "UCS Manager felvétele",
-    "label.add.user": "Felhasználó felvétele",
-    "label.add.userdata": "Felhasználó adat",
-    "label.add.vlan": "VLAN felvétele",
-    "label.add.vm": "VM felvétele",
-    "label.add.vms": "VM-ek felvétele",
-    "label.add.vms.to.lb": "VM(ek) felvétele a terheléselosztó szabályba",
-    "label.add.vmware.datacenter": "VMware adatközpont felvétele",
-    "label.add.vnmc.device": "VNMC eszköz felvétele",
-    "label.add.vnmc.provider": "VNMC szolgáltató felvétele",
-    "label.add.volume": "Kötet felvétele",
-    "label.add.vpc": "VPC felvétele",
-    "label.add.vpc.offering": "VPC ajánlat felvétele",
-    "label.add.vpn.customer.gateway": "VPN ügyfélkapu felvétele",
-    "label.add.vpn.user": "VPN felhasználó felvétele",
-    "label.add.vxlan": "VXLAN felvétele",
-    "label.add.zone": "Zóna felvétele",
-    "label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
-    "label.added.network.offering": "Hálózat ajánlat felvéve",
-    "label.added.new.bigswitch.bcf.controller": "BigSwitch BCF vezérlő felvéve",
-    "label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
-    "label.addes.new.f5": "Új F5 felvétele",
-    "label.adding": "Felvétel",
-    "label.adding.cluster": "Fürt felvétele",
-    "label.adding.failed": "Hiba a felvétel során",
-    "label.adding.pod": "Pod felvétele",
-    "label.adding.processing": "Felvétel...",
-    "label.adding.succeeded": "Sikeres felvétel",
-    "label.adding.user": "Felhasználó felvétele",
-    "label.adding.zone": "Zóna felvétele",
-    "label.additional.networks": "További hálózatok",
-    "label.admin": "Adminisztrátor",
-    "label.admin.accounts": "Adminisztrátor hozzáférések",
-    "label.advanced": "Haladó",
-    "label.advanced.mode": "Haladó mód",
-    "label.advanced.search": "Haladó keresés",
-    "label.affinity": "Affinítás",
-    "label.affinity.group": "Affinítási csoport",
-    "label.affinity.groups": "Affinítási csoportok",
-    "label.agent.password": "Ügynök jelszó",
-    "label.agent.port": "Ügynök port",
-    "label.agent.state": "Ügynök állapot",
-    "label.agent.username": "Ügynök felhasználónév",
-    "label.agree": "Elfogadom",
-    "label.alert": "Riasztás",
-    "label.alert.archived": "Riasztás archiválva",
-    "label.alert.deleted": "Riasztás törölve",
-    "label.alert.details": "Riasztás részletei",
-    "label.algorithm": "Algoritmus",
-    "label.allocated": "Lekötöve",
-    "label.allocation.state": "Lefoglalás állapota",
-    "label.allow": "Engedélyez",
-    "label.anti.affinity": "Anti-affinítás",
-    "label.anti.affinity.group": "Anti-affinítás csoport",
-    "label.anti.affinity.groups": "Anti-affinítás csoportok",
-    "label.api.key": "API kulcs",
-    "label.api.version": "API verzió",
-    "label.app.name": "CloudStack",
-    "label.apply": "Alkalmaz",
-    "label.archive": "Archive",
-    "label.archive.alerts": "Riasztások archiválása",
-    "label.archive.events": "Események archiválása",
-    "label.assign": "Hozzárendelés",
-    "label.assign.instance.another": "Példány hozzárendelése másik számlához",
-    "label.assign.to.load.balancer": "Példány hozzárendelése terheléselosztóhoz",
-    "label.assign.vms": "VM-ek hozzárendelése",
-    "label.assigned.vms": "Hozzárendelt VM-ek",
-    "label.associate.public.ip": "Publikus IP cím hozzárendelése",
-    "label.associated.network": "Kapcsolt hálózat",
-    "label.associated.network.id": "Kapcsolt hálózat ID",
-    "label.associated.profile": "Kapacsolt profil",
-    "label.attached.iso": "Kapcsolt ISO",
-    "label.author.email": "Szerző e-mail",
-    "label.author.name": "Szerző név",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "AutoScale konfiguráció varázsló",
-    "label.availability": "Elérhetőség",
-    "label.availability.zone": "Elérhetőségi zóna",
-    "label.availabilityZone": "Elérhetőségi zóna",
-    "label.available": "Elérhető",
-    "label.available.public.ips": "Elérhető publikus PI címek",
-    "label.back": "Vissza",
-    "label.bandwidth": "Sávszélesség",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP eszközök",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP szolgáltató",
-    "label.baremetal.pxe.device": "Baremetal PXE eszköz felvétele",
-    "label.baremetal.pxe.devices": "Baremetal PXE eszközök",
-    "label.baremetal.pxe.provider": "Baremetal PXE szolgáltató",
-    "label.baremetal.rack.configuration": "Baremetal rack konfiguráció",
-    "label.basic": "Alap",
-    "label.basic.mode": "Alap mód",
-    "label.bigswitch.bcf.details": "BigSwitch BCF részletek",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT bekapcsolva",
-    "label.bigswitch.controller.address": "BigSwitch BCF vezérlő cím",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blade-k",
-    "label.bootable": "Indítható",
-    "label.broadcast.domain.range": "Broadcast domain range",
-    "label.broadcast.domain.type": "Broadcast Domain Type",
-    "label.broadcast.uri": "Broadcast URI",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "Broadcast URI",
-    "label.brocade.vcs.address": "Vcs Switch cím",
-    "label.brocade.vcs.details": "Brocade Vcs Switch részletek",
-    "label.by.account": "By Account",
-    "label.by.alert.type": "Riasztás típus szerint",
-    "label.by.availability": "By Availability",
-    "label.by.date.end": "Dátum szerint (vég)",
-    "label.by.date.start": "Dátum szerint (kezdő)",
-    "label.by.domain": "By Domain",
-    "label.by.end.date": "By End Date",
-    "label.by.event.type": "Esemény típus szerint",
-    "label.by.level": "By Level",
-    "label.by.pod": "By Pod",
-    "label.by.role": "By Role",
-    "label.by.start.date": "By Start Date",
-    "label.by.state": "By State",
-    "label.by.traffic.type": "By Traffic Type",
-    "label.by.type": "By Type",
-    "label.by.type.id": "By Type ID",
-    "label.by.zone": "By Zone",
-    "label.bytes.received": "Fogadott byte-ok",
-    "label.bytes.sent": "Küldött byte-ok",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "Megszakítás",
-    "label.capacity": "Kapacítás",
-    "label.capacity.bytes": "Byte kapacítás",
-    "label.capacity.iops": "IOPS kapacítás",
-    "label.certificate": "Server certificate",
-    "label.change.affinity": "Affinítás változtatása",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "Change service offering",
-    "label.change.value": "Érték változtatása",
-    "label.character": "Karakter",
-    "label.chassis": "Ház",
-    "label.checksum": "ellenörző összeg",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR vagy számla/biztonsági csoport",
-    "label.cidr.list": "Forrás CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP cím",
-    "label.cisco.nexus1000v.password": "Nexus 1000v jelszó",
-    "label.cisco.nexus1000v.username": "Nexus 1000v felhasználónév",
-    "label.ciscovnmc.resource.details": "CiscoVNMC erőforrás részletek",
-    "label.clean.up": "Takarítás",
-    "label.clear.list": "Lista törlése",
-    "label.close": "Bezárás",
-    "label.cloud.console": "Cloud Management Console",
-    "label.cloud.managed": "Cloud.com Managed",
-    "label.cluster": "Fürt",
-    "label.cluster.name": "Fürt név",
-    "label.cluster.type": "Fürt típus",
-    "label.clusters": "Fürt",
-    "label.clvm": "CLVM",
-    "label.code": "Kód",
-    "label.community": "Közösség",
-    "label.compute": "Számítás",
-    "label.compute.and.storage": "Számítás és tár",
-    "label.compute.offering": "CPU ajánlat",
-    "label.compute.offerings": "Számítási ajánlatok",
-    "label.configuration": "Konfiguráció",
-    "label.configure": "Konfiguráció",
-    "label.configure.ldap": "LDAP konfigurációja",
-    "label.configure.network.ACLs": "Hálózati ACL-ek konfigurációja",
-    "label.configure.sticky.policy": "Configure Sticky Policy",
-    "label.configure.vpc": "VPC konfigurációja",
-    "label.confirm.password": "Jelszó megerősítés",
-    "label.confirmation": "Megerősítés",
-    "label.congratulations": "Gratuláció!",
-    "label.conserve.mode": "Conserve mode",
-    "label.console.proxy": "Konzol proxy",
-    "label.console.proxy.vm": "Konzol Proxy VM",
-    "label.continue": "Tovább",
-    "label.continue.basic.install": "Folytatás alaptelepítéssel",
-    "label.copying.iso": "ISO másolása",
-    "label.corrections.saved": "Javítások mentve",
-    "label.counter": "Számláló",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU allokálva",
-    "label.cpu.allocated.for.VMs": "CPU lefoglalva a VM-ek részére",
-    "label.cpu.limits": "CPU korlátok",
-    "label.cpu.mhz": "CPU (MHz)",
-    "label.cpu.utilized": "CPU használat",
-    "label.create.VPN.connection": "VPN kapcsolat létrehozása",
-    "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
-    "label.create.nfs.secondary.staging.store": "NFS másodlagos tár létrehozása",
-    "label.create.project": "Projekt létrehozása",
-    "label.create.ssh.key.pair": "SSH kulcspár létrehozása",
-    "label.create.template": "Sablon létrehozása",
-    "label.created": "Létrehozás dátuma",
-    "label.created.by.system": "Created by system",
-    "label.cross.zones": "Cross Zones",
-    "label.custom": "Egyedi",
-    "label.custom.disk.iops": "Egyedi IOPS",
-    "label.custom.disk.offering": "Egyedi tár ajánlat",
-    "label.custom.disk.size": "Egyedi merevlemez méret",
-    "label.daily": "Napi",
-    "label.data.disk.offering": "Adat merevlemez ajánlat",
-    "label.date": "Dátum",
-    "label.day": "Nap",
-    "label.day.of.month": "Hónap napja",
-    "label.day.of.week": "Hét napja",
-    "label.dc.name": "DC név",
-    "label.dead.peer.detection": "Dead Peer Detection",
-    "label.decline.invitation": "Meghívó elutasítása",
-    "label.dedicate": "Dedikálás",
-    "label.dedicate.cluster": "Fürt dedikálása",
-    "label.dedicate.host": "Kiszolgáló dedikálása",
-    "label.dedicate.pod": "Pod dedikálása",
-    "label.dedicate.vlan.vni.range": "Dedikált VLAN/VNI tartomány",
-    "label.dedicate.zone": "Dedikált zóna",
-    "label.dedicated": "Dedikált",
-    "label.dedicated.vlan.vni.ranges": "Dedikált VLAN/VNI tartományok",
-    "label.default": "Alapértelmezett",
-    "label.default.egress.policy": "Default egress policy",
-    "label.default.use": "Alapértelmezett használat",
-    "label.default.view": "Alapértelmezett nézet",
-    "label.delete": "Törlés",
-    "label.delete.BigSwitchBcf": "BigSwitch BCF vezérlő eltávolítása",
-    "label.delete.BrocadeVcs": "Brocade Vcs Switch törlése",
-    "label.delete.F5": "F5 törlése",
-    "label.delete.NetScaler": "NetScaler törlése",
-    "label.delete.NiciraNvp": "Nvp vezérlő törlése",
-    "label.delete.OpenDaylight.device": "OpenDaylight Controller törlése",
-    "label.delete.PA": "Palo Alto törlése",
-    "label.delete.SRX": "SRX törlése",
-    "label.delete.VPN.connection": "VPN kapcsolat törlése",
-    "label.delete.VPN.customer.gateway": "VPN ügyfél kapu törlése",
-    "label.delete.VPN.gateway": "VPN kapu törlése",
-    "label.delete.acl.list": "ACL lista törlése",
-    "label.delete.affinity.group": "Affinítási csoport törlése",
-    "label.delete.alerts": "Törlés riasztások",
-    "label.delete.baremetal.rack.configuration": "Baremetal rack konfiguráció törlése",
-    "label.delete.ciscoASA1000v": "CiscoASA1000v törlése",
-    "label.delete.ciscovnmc.resource": "CiscoVNMC erőforrás törlése",
-    "label.delete.events": "Törlés események",
-    "label.delete.gateway": "Átjáró törlése",
-    "label.delete.internal.lb": "Belső LB törlése",
-    "label.delete.portable.ip.range": "Hordozható IP tartomány törlése",
-    "label.delete.profile": "Profil törlése",
-    "label.delete.project": "Projekt törlése",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Delete Secondary Staging Store",
-    "label.delete.ucs.manager": "UCS Manager törlése",
-    "label.delete.vpn.user": "VPN felhasználó törlése",
-    "label.deleting.failed": "Törlés sikertelen",
-    "label.deleting.processing": "Törlés...",
-    "label.deny": "Megtilt",
-    "label.deployment.planner": "Felhasználás tervező",
-    "label.description": "Leírás",
-    "label.destination.physical.network.id": "Cél fizikai hálózat ID",
-    "label.destination.zone": "Cél zóna",
-    "label.destroy": "Elpusztít",
-    "label.destroy.router": "Router elpusztítása",
-    "label.destroy.vm.graceperiod": "VM elpusztítás türelmi idő",
-    "label.detaching.disk": "Merevlemez leválasztása",
-    "label.details": "Részletek",
-    "label.device.id": "Eszköz ID",
-    "label.devices": "Eszközök",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direct Attached Public IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Osztott hálózati IP címek",
-    "label.disable.autoscale": "Automatikus skálázás kikapcsolása",
-    "label.disable.host": "Kiszolgáló kikapcsolása",
-    "label.disable.network.offering": "Hálózati ajánlat kikapcsolása",
-    "label.disable.provider": "Szolgáltató kikapcsolása",
-    "label.disable.vnmc.provider": "VNMC szolgáltató kikapcsolása",
-    "label.disable.vpc.offering": "VPC ajánlat kikapcsolása",
-    "label.disable.vpn": "Távoli VPN hozzáférés kikapcsolása",
-    "label.disabled": "Kikapcsolt",
-    "label.disabling.vpn.access": "VPN hozzáférés kikapcsolása",
-    "label.disassociate.profile.blade": "Profil elválasztása a blade-től",
-    "label.disbale.vnmc.device": "VNMC eszkösz kikapcsolása",
-    "label.disk.allocated": "Merevlemez lefoglalva",
-    "label.disk.bytes.read.rate": "Olvasási ráta (BPS)",
-    "label.disk.bytes.write.rate": "Írási ráta (BPS)",
-    "label.disk.iops.max": "IOPS maximum",
-    "label.disk.iops.min": "IOPS minimum",
-    "label.disk.iops.read.rate": "Olvasási ráta (IOPS)",
-    "label.disk.iops.total": "IOPS összesen",
-    "label.disk.iops.write.rate": "Írási ráta (IOPS)",
-    "label.disk.offering": "Merevlemez ajánlat",
-    "label.disk.offering.details": "Merevlemez ajánlat részletei",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Létrehozás típusa",
-    "label.disk.read.bytes": "Merevlemez olvasás (Byte)",
-    "label.disk.read.io": "Merevlemez írás (IO)",
-    "label.disk.size": "Merevlemez méret",
-    "label.disk.size.gb": "Merevlemez méret (GB)",
-    "label.disk.total": "Merevlemez összes",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Merevlemez kötet",
-    "label.disk.write.bytes": "Merevlemez írás (byte)",
-    "label.disk.write.io": "Merevlemez írás (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Megjelenítendő név",
-    "label.display.text": "Megjelenítendő szöveg",
-    "label.distributedrouter": "Elosztott router",
-    "label.dns": "DNS",
-    "label.dns.1": "1. DNS",
-    "label.dns.2": "2. DNS",
-    "label.domain": "Domén",
-    "label.domain.admin": "Tartomány adminisztrátor",
-    "label.domain.details": "Domain details",
-    "label.domain.id": "Tartomány ID",
-    "label.domain.lower": "domain",
-    "label.domain.name": "Tartomány név",
-    "label.domain.router": "Domain router",
-    "label.domain.suffix": "DNS domén végződés (pl. xyz.com)",
-    "label.done": "Kész",
-    "label.double.quotes.are.not.allowed": "A kettős idézőjel nem engedélyezett",
-    "label.download.progress": "Letöltés folyamat",
-    "label.drag.new.position": "Új helyre húzás",
-    "label.duration.in.sec": "Időtartam (mp)",
-    "label.dynamically.scalable": "Dinakikusan skálázható",
-    "label.edit": "Szerkesztés",
-    "label.edit.acl.rule": "ACL szabály szerkesztése",
-    "label.edit.affinity.group": "Affinítási csoport szerkesztése",
-    "label.edit.lb.rule": "LB szabály módosítása",
-    "label.edit.network.details": "Hálózat részleteinek szerkesztése",
-    "label.edit.project.details": "Projekt részletek szerkesztése",
-    "label.edit.region": "Régió szerkesztése",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Szabály módosítása",
-    "label.edit.secondary.ips": "Másodlagos IP címek módosítása",
-    "label.edit.tags": "Cimkék szerkesztése",
-    "label.edit.traffic.type": "Forgalom típus szerkesztése",
-    "label.edit.vpc": "VPC szerkesztése",
-    "label.egress.default.policy": "Alapértelmezett egress szabályzat",
-    "label.egress.rule": "Egress szabály",
-    "label.egress.rules": "Egress szabályok",
-    "label.elastic": "Elasztikus",
-    "label.elastic.IP": "Elasztikus IP",
-    "label.elastic.LB": "Elasztikus LB",
-    "label.email": "Email",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Automatikus skálázás bekapcsolása",
-    "label.enable.host": "Kiszolgáló bekapcsolása",
-    "label.enable.network.offering": "Hálózati ajánlat bekapcsolása",
-    "label.enable.provider": "Szolgáltató bekapcsolása",
-    "label.enable.s3": "S3-alapú másodlagos tár bekapcsolása",
-    "label.enable.swift": "Swift engedélyezése",
-    "label.enable.vnmc.device": "VNMC eszköz bekapcsolása",
-    "label.enable.vnmc.provider": "VNMC szolgáltató bekapcsolása",
-    "label.enable.vpc.offering": "VPC ajánlat bekapcsolása",
-    "label.enable.vpn": "Enable Remote Access VPN",
-    "label.enabling.vpn": "VPN engedélyezése",
-    "label.enabling.vpn.access": "VPN hozzáférés engedélyezése",
-    "label.end.IP": "Utolsó IP",
-    "label.end.port": "Utolsó Port",
-    "label.end.reserved.system.IP": "Utolsó elkülönített rendszer IP",
-    "label.end.vlan": "Utolsó VLAN",
-    "label.end.vxlan": "Utolsó VXLAN",
-    "label.endpoint": "Végpont",
-    "label.endpoint.or.operation": "Végpont vagy művelet",
-    "label.enter.token": "Add meg a token-t!",
-    "label.error": "Hiba",
-    "label.error.code": "Hibakód",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX/ESXi kiszolgáló",
-    "label.event": "Esemény",
-    "label.event.archived": "Esemény archiválva",
-    "label.event.deleted": "Esemény törölve",
-    "label.every": "Minden",
-    "label.example": "Példa",
-    "label.expunge": "Törlés",
-    "label.external.link": "Külső hivatkozás",
-    "label.extractable": "Kicsomagolható",
-    "label.extractable.lower": "kicsomagolható",
-    "label.f5": "F5",
-    "label.f5.details": "F5 részletek",
-    "label.failed": "Hiba",
-    "label.featured": "Kiemelt",
-    "label.fetch.latest": "Legfrissebb letöltése",
-    "label.filterBy": "Szűrés",
-    "label.fingerprint": "Újlenyomat",
-    "label.firewall": "Tűzfal",
-    "label.first.name": "Keresztnév",
-    "label.firstname.lower": "keresztnév",
-    "label.format": "Formátum",
-    "label.format.lower": "formátum",
-    "label.friday": "Péntek",
-    "label.full": "Teljes",
-    "label.full.path": "Teljes elérési útvonal",
-    "label.gateway": "Átjáró",
-    "label.general.alerts": "Általános riasztások",
-    "label.generating.url": "URL generálása",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS konfiguráció",
-    "label.gluster.volume": "Kötet",
-    "label.go.step.2": "2. lépésre",
-    "label.go.step.3": "3. lépésre",
-    "label.go.step.4": "4. lépésre",
-    "label.go.step.5": "5. lépsre",
-    "label.gpu": "GPU",
-    "label.group": "Csoport",
-    "label.group.by.account": "Számlánként csoportosítva",
-    "label.group.by.cluster": "Fürtönként csoportosítva",
-    "label.group.by.pod": "Pod-onként csoportosítva",
-    "label.group.by.zone": "Zónánként csoportosítva",
-    "label.group.optional": "Csoport (opcionális)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Hozzárendelt terheléselosztás",
-    "label.gslb.assigned.lb.more": "Több terheléselosztás hozzárendelése",
-    "label.gslb.delete": "GSLB törlése",
-    "label.gslb.details": "GSLB részletek",
-    "label.gslb.domain.name": "GSLB domén név",
-    "label.gslb.lb.details": "Terheléselosztó részletek",
-    "label.gslb.lb.remove": "Terheléselosztás törlése ebből a GSLB-ből",
-    "label.gslb.lb.rule": "Terheléselosztó szabály",
-    "label.gslb.service": "GSLB szolgáltatás",
-    "label.gslb.service.private.ip": "GSLB szolgáltatás privát IP",
-    "label.gslb.service.public.ip": "GSLB szolgáltatás publikus IP",
-    "label.gslb.servicetype": "Szolgáltatás típus",
-    "label.guest": "Vendég",
-    "label.guest.cidr": "Vendég CIDR",
-    "label.guest.end.ip": "Utolsó vengég IP",
-    "label.guest.gateway": "Vendég átjáró",
-    "label.guest.ip": "Vendég IP cím",
-    "label.guest.ip.range": "Vendég IP tartomány",
-    "label.guest.netmask": "Vendég hálózati maszk",
-    "label.guest.network.details": "Vendég hálózat részletek",
-    "label.guest.networks": "Vendég hálózatok",
-    "label.guest.start.ip": "Kezdő vendég IP",
-    "label.guest.traffic": "Vendég forgalom",
-    "label.guest.traffic.vswitch.name": "Vendég forgalom vSwitch név",
-    "label.guest.traffic.vswitch.type": "Vendég forgalom vSwitch típus",
-    "label.guest.type": "Vendég típus",
-    "label.ha.enabled": "HA bekapcsolva",
-    "label.health.check": "Ellenőrzés",
-    "label.health.check.advanced.options": "Haladó beállítások:",
-    "label.health.check.configurations.options": "Beallítások:",
-    "label.health.check.interval.in.sec": "Ellenőrzés időköz (mp)",
-    "label.health.check.message.desc": "A terheléselosztód autómatikusan fog elenőrzéseket végrehajtani a cloudstack példányokon és a forgalmat a működő példányokhoz írányítja",
-    "label.health.check.wizard": "Health Check Wizard",
-    "label.healthy.threshold": "Egészséges küszöb",
-    "label.help": "Segítség",
-    "label.hide.ingress.rule": "Ingress szabály rejtése",
-    "label.hints": "Tippek",
-    "label.home": "Kezdőlap",
-    "label.host": "Kiszolgáló",
-    "label.host.MAC": "Kiszolgáló MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Kiszolgáló név",
-    "label.host.tag": "Kiszolgáló címke",
-    "label.host.tags": "Kiszolgáló címkék",
-    "label.hosts": "Kiszolgálók",
-    "label.hourly": "Óránként",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Traffic Label",
-    "label.hypervisor": "Hipervizor",
-    "label.hypervisor.capabilities": "Hipervizor képességek",
-    "label.hypervisor.snapshot.reserve": "Hipervizor Snapshot Reserve",
-    "label.hypervisor.type": "Hipervizor típus",
-    "label.hypervisor.version": "Hipervizor verzió",
-    "label.hypervisors": "Hipervizorok",
-    "label.id": "ID",
-    "label.info": "Infó",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Ingress szabály",
-    "label.initiated.by": "Kezdeményező",
-    "label.inside.port.profile": "Inside Port Profile",
-    "label.installWizard.addClusterIntro.subtitle": "Mi a fürt?",
-    "label.installWizard.addClusterIntro.title": "Csináljunk egy fürtöt!",
-    "label.installWizard.addHostIntro.subtitle": "Mi a kiszolgáló?",
-    "label.installWizard.addHostIntro.title": "Regisztráljunk egy kiszolgálót!",
-    "label.installWizard.addPodIntro.subtitle": "Mi a pod?",
-    "label.installWizard.addPodIntro.title": "Csináljunk egy pod-ot!",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Mi az elsődleges tár?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Hozzuk létre az elsődleges tárolót!",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Mi a másodlagos tár?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Hozzuk létre a másodlagos tárolót!",
-    "label.installWizard.addZone.title": "Zóna létrozása",
-    "label.installWizard.addZoneIntro.subtitle": "Mi a zóna?",
-    "label.installWizard.addZoneIntro.title": "Hozzunk létre egy zónát!",
-    "label.installWizard.click.launch": "Kattints az indítás gombra!",
-    "label.installWizard.subtitle": "Ez a párbeszédablak segít konfigurálni a CloudStack&#8482 rendszered",
-    "label.installWizard.title": "Üdvözöl a CloudStack&#8482",
-    "label.instance": "Példány",
-    "label.instance.limits": "Példány korlátok",
-    "label.instance.name": "Példány név",
-    "label.instance.port": "Példány port",
-    "label.instance.scaled.up": "Példány átméretezve a kért ajánlathoz",
-    "label.instances": "Példányok",
-    "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-    "label.intermediate.certificate": "Közbülső tanúsítvány {0}",
-    "label.internal.dns.1": "1. belső DNS",
-    "label.internal.dns.2": "2. belső DNS",
-    "label.internal.lb": "Belső LB",
-    "label.internal.lb.details": "Belső LB részletek",
-    "label.internal.name": "Belső név",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Időköz típus",
-    "label.introduction.to.cloudstack": "Bemutatkozik a CloudStack&#8482",
-    "label.invalid.integer": "Érvénytelen egész szám",
-    "label.invalid.number": "Érvénytelen szám",
-    "label.invitations": "Meghívók",
-    "label.invite": "Meghivás",
-    "label.invite.to": "Meghívás:",
-    "label.invited.accounts": "Meghívottak",
-    "label.ip": "IP",
-    "label.ip.address": "IP cím",
-    "label.ip.allocations": "IP címfoglalások",
-    "label.ip.limits": "Publikus IP korlátok",
-    "label.ip.or.fqdn": "IP vagy FQDN",
-    "label.ip.range": "IP tartomány",
-    "label.ip.ranges": "IP tartományok",
-    "label.ipaddress": "IP cím",
-    "label.ips": "IP címek",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 1. DNS",
-    "label.ipv4.dns2": "IPv4 2. DNS",
-    "label.ipv4.end.ip": "IPv4 utolsó IP",
-    "label.ipv4.gateway": "IPv4 átjáró",
-    "label.ipv4.netmask": "IPv4 hálózati maszk",
-    "label.ipv4.start.ip": "IPv4 kezdő IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP cím",
-    "label.ipv6.dns1": "IPv6 1. DNS",
-    "label.ipv6.dns2": "IPv6 2. DNS",
-    "label.ipv6.end.ip": "IPv6 utolsó IP",
-    "label.ipv6.gateway": "IPv6 átjáró",
-    "label.ipv6.start.ip": "IPv6 kezdő IP",
-    "label.is.default": "Alapértelmezett",
-    "label.is.redundant.router": "Redundáns",
-    "label.is.shared": "Osztott",
-    "label.is.system": "Rendszer",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO Boot",
-    "label.isolated.networks": "Izolált hálózatok",
-    "label.isolation.method": "Izoláció módszer",
-    "label.isolation.mode": "Izoláció mód",
-    "label.isolation.uri": "Izoláció URI",
-    "label.item.listing": "Lista",
-    "label.japanese.keyboard": "Japán billentyűzet",
-    "label.keep": "Megtartás",
-    "label.keep.colon": "Megtart:",
-    "label.key": "Kulcs",
-    "label.keyboard.language": "Billentyűzet kiosztás",
-    "label.keyboard.type": "Billentyűzet típus",
-    "label.kvm.traffic.label": "KVM traffic label",
-    "label.label": "Címke",
-    "label.lang.arabic": "Arab",
-    "label.lang.brportugese": "Brazil-portugál",
-    "label.lang.catalan": "Katalán",
-    "label.lang.chinese": "Kínai (egyszerűsített)",
-    "label.lang.dutch": "Holland (Hollandia)",
-    "label.lang.english": "Angol",
-    "label.lang.french": "Francia",
-    "label.lang.german": "Német",
-    "label.lang.hungarian": "Magyar",
-    "label.lang.italian": "Olasz",
-    "label.lang.japanese": "Japán",
-    "label.lang.korean": "Kóreai",
-    "label.lang.norwegian": "Norvég",
-    "label.lang.polish": "Lengyel",
-    "label.lang.russian": "Orosz",
-    "label.lang.spanish": "Spanyol",
-    "label.last.disconnected": "Utoljára lecsatlakozott",
-    "label.last.name": "Családnév",
-    "label.lastname.lower": "családnév",
-    "label.latest.events": "Utolsó események",
-    "label.launch": "Indítás",
-    "label.launch.vm": "VM indítása",
-    "label.launch.zone": "Zóna indítása",
-    "label.lb.algorithm.leastconn": "Legkevesebb kapcsolat",
-    "label.lb.algorithm.roundrobin": "Körbe forgó",
-    "label.lb.algorithm.source": "Forrás",
-    "label.ldap.configuration": "LDAP konfiguráció",
-    "label.ldap.group.name": "LDAP csoport",
-    "label.ldap.link.type": "Típus",
-    "label.ldap.port": "LDAP port",
-    "label.level": "Szint",
-    "label.link.domain.to.ldap": "Link Domain to LDAP",
-    "label.linklocal.ip": "Link Local IP Address",
-    "label.load.balancer": "Terheléselosztó",
-    "label.load.balancer.type": "Terheléselosztó típus",
-    "label.load.balancing": "Terheléselosztás",
-    "label.load.balancing.policies": "Terheléselosztó szabályok",
-    "label.loading": "Betöltés",
-    "label.local": "Helyi",
-    "label.local.file": "Helyi file",
-    "label.local.storage": "Helyi tár",
-    "label.local.storage.enabled": "Helyi tár bekapcsolása felhasználói VM-ek részére",
-    "label.local.storage.enabled.system.vms": "Helyi tár bekapcsolása a rendszer VM számára",
-    "label.login": "Bejelentkezés",
-    "label.logout": "Kijelentkezés",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Traffic Label",
-    "label.make.project.owner": "Számla projekt-tulajdonossá tétele",
-    "label.make.redundant": "Redundánssá tétel",
-    "label.manage": "Vezérlés",
-    "label.manage.resources": "Erőforrások vezérlése",
-    "label.managed": "Vezérelt",
-    "label.management": "Vezérlés",
-    "label.management.ips": "Vezérlő IP cím",
-    "label.management.server": "Vezérlő szerver",
-    "label.max.cpus": "CPU magok max.",
-    "label.max.guest.limit": "Max guest limit",
-    "label.max.instances": "Példányok maximális száma",
-    "label.max.memory": "Max. memória (MB)",
-    "label.max.networks": "Max. hálózatok",
-    "label.max.primary.storage": "Max. elsődleges (GiB)",
-    "label.max.public.ips": "Publikus IP címek max.",
-    "label.max.secondary.storage": "Max. másodlagos (GiB)",
-    "label.max.snapshots": "Pillanatfelvételek max.",
-    "label.max.templates": "Sablonok max.",
-    "label.max.vms": "Felhasználói VMek max.",
-    "label.max.volumes": "Kötetek max.",
-    "label.max.vpcs": "VPC-k max.",
-    "label.maximum": "Maximum",
-    "label.may.continue": "Most folytathatod",
-    "label.md5.checksum": "MD5 ellenörzőösszeg",
-    "label.memory": "Memória",
-    "label.memory.allocated": "Allokált memória",
-    "label.memory.limits": "Memória korlátok (MiB)",
-    "label.memory.mb": "Memória (MB)",
-    "label.memory.total": "Tejes memória",
-    "label.memory.used": "Használt memória",
-    "label.menu.accounts": "Számlák",
-    "label.menu.alerts": "Riasztások",
-    "label.menu.all.accounts": "Minden számla",
-    "label.menu.all.instances": "Minden példány",
-    "label.menu.community.isos": "Közösségi ISO-k",
-    "label.menu.community.templates": "Közösségi sablonok",
-    "label.menu.configuration": "Konfiguráció",
-    "label.menu.dashboard": "Műszertábla",
-    "label.menu.destroyed.instances": "Elpusztított példányok",
-    "label.menu.disk.offerings": "Merevlemez ajánlatok",
-    "label.menu.domains": "Domének",
-    "label.menu.events": "Események",
-    "label.menu.featured.isos": "Kiemelt ISO-k",
-    "label.menu.featured.templates": "Kiemelt sablonok",
-    "label.menu.global.settings": "Globális beállítások",
-    "label.menu.infrastructure": "Infrastruktúra",
-    "label.menu.instances": "Példányok",
-    "label.menu.ipaddresses": "IP cím",
-    "label.menu.isos": "ISO-k",
-    "label.menu.my.accounts": "Saját számlák",
-    "label.menu.my.instances": "Saját példányok",
-    "label.menu.my.isos": "Saját ISO-k",
-    "label.menu.my.templates": "Saját sablonok",
-    "label.menu.network": "Hálózatok",
-    "label.menu.network.offerings": "Hálózati ajánlatok",
-    "label.menu.physical.resources": "Fizikai erőforrások",
-    "label.menu.regions": "Régiók",
-    "label.menu.running.instances": "Futó példányok",
-    "label.menu.security.groups": "Biztonsági csoportok",
-    "label.menu.service.offerings": "Szolgáltatás ajánlatok",
-    "label.menu.snapshots": "Pillanatfelvételek",
-    "label.menu.sshkeypair": "SSH kulcspár",
-    "label.menu.stopped.instances": "Leállított példányok",
-    "label.menu.storage": "Tár",
-    "label.menu.system": "Rendszer",
-    "label.menu.system.service.offerings": "Rendszer ajánlatok",
-    "label.menu.system.vms": "Rendszer VM-ek",
-    "label.menu.templates": "Sablonok",
-    "label.menu.virtual.appliances": "Virtuális készülékek",
-    "label.menu.virtual.resources": "Virtuális erőforrások",
-    "label.menu.volumes": "Kötetek",
-    "label.menu.vpc.offerings": "VPC ajánlatok",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "Lekötöve",
-    "label.metrics.clusters": "Fürt",
-    "label.metrics.cpu.allocated": "CPU foglalás",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Összes",
-    "label.metrics.cpu.usage": "CPU használat",
-    "label.metrics.cpu.used.avg": "Használt",
-    "label.metrics.disk": "Merevlemez",
-    "label.metrics.disk.allocated": "Lekötöve",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Olvasás",
-    "label.metrics.disk.size": "Méret",
-    "label.metrics.disk.storagetype": "Típus",
-    "label.metrics.disk.total": "Összes",
-    "label.metrics.disk.unallocated": "Lefoglalatlan",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "Használt",
-    "label.metrics.disk.write": "Írás",
-    "label.metrics.hosts": "Kiszolgálók",
-    "label.metrics.memory.allocated": "Memória foglalás",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Összes",
-    "label.metrics.memory.usage": "Memória használat",
-    "label.metrics.memory.used.avg": "Használt",
-    "label.metrics.name": "Név",
-    "label.metrics.network.read": "Olvasás",
-    "label.metrics.network.usage": "Hálózat használat",
-    "label.metrics.network.write": "Írás",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "Hatály",
-    "label.metrics.state": "Állapot",
-    "label.metrics.storagepool": "Storage Pool",
-    "label.metrics.vm.name": "VM név",
-    "label.migrate.instance.to": "Példány mozgatása:",
-    "label.migrate.instance.to.host": "Példány mozgatása másik kiszolgálóra",
-    "label.migrate.instance.to.ps": "Példány mozgatása másik elsődleges tárra",
-    "label.migrate.lb.vm": "Terheléselosztó VM mozgatása",
-    "label.migrate.router.to": "Router mozgatása:",
-    "label.migrate.systemvm.to": "Rendszer Vm mozgatása:",
-    "label.migrate.to.host": "Mozgatás kiszolgálóra",
-    "label.migrate.to.storage": "Mozgatás tárra",
-    "label.migrate.volume": "Kötet mozgatása",
-    "label.migrate.volume.to.primary.storage": "Kötet mozgatása másik elsődleges tárra",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Példányok minimális száma",
-    "label.min.past.the.hr": "percben",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "Perc",
-    "label.minutes.past.hour": "percben az egész óra után",
-    "label.mode": "Mód",
-    "label.monday": "Hétfő",
-    "label.monthly": "Havi",
-    "label.more.templates": "További sablonok",
-    "label.move.down.row": "Egy sorral lejjebb",
-    "label.move.to.bottom": "Aljára",
-    "label.move.to.top": "Tetejére",
-    "label.move.up.row": "Egy sorral feljebb",
-    "label.my.account": "Saját számlám",
-    "label.my.network": "Saját hálózat",
-    "label.my.templates": "Saját sablonok",
-    "label.na": "Nem értelmezett",
-    "label.name": "Név",
-    "label.name.lower": "Név",
-    "label.name.optional": "Név (opcionális)",
-    "label.nat.port.range": "NAT port tartomány",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Hálózati maszk",
-    "label.netscaler.details": "NetScaler részletek",
-    "label.network": "Hálózatok",
-    "label.network.ACL": "Hálózati ACL",
-    "label.network.ACL.total": "Hálózati ACL összesen",
-    "label.network.ACLs": "Hálózati ACL-ek",
-    "label.network.addVM": "Hálózat felvétele a VM-hez",
-    "label.network.cidr": "Hálózat CIDR",
-    "label.network.desc": "Hálózat leírás",
-    "label.network.details": "Hálózat részletei",
-    "label.network.device": "Hálózati eszköz",
-    "label.network.device.type": "Hálózati eszköz típus",
-    "label.network.domain": "Network Domain",
-    "label.network.domain.text": "Network domain",
-    "label.network.id": "Hálózat ID",
-    "label.network.label.display.for.blank.value": "Alapértelmezett átjáró használata",
-    "label.network.limits": "Hálózat korlátok",
-    "label.network.name": "Hálózat név",
-    "label.network.offering": "Hálózat ajánlat",
-    "label.network.offering.details": "Hálózat ajánlat részletei",
-    "label.network.offering.display.text": "Hálózat ajánlat megjelenítendő szöveg",
-    "label.network.offering.id": "Hálózat ajánlat ID",
-    "label.network.offering.name": "Hálózat ajánlat neve",
-    "label.network.rate": "Hálózati ráta (Mb/mp)",
-    "label.network.rate.megabytes": "Hálózati ráta (MB/mp)",
-    "label.network.read": "Hálózat olvasás",
-    "label.network.service.providers": "Hálózat szolgáltatók",
-    "label.network.type": "Hálózat típus",
-    "label.network.write": "Hálózat írás",
-    "label.networking.and.security": "Hálózat és biztonság",
-    "label.networks": "Hálózatok",
-    "label.new": "Új",
-    "label.new.password": "Új jelszó",
-    "label.current.password": "Current Password",
-    "label.new.project": "Új projekt",
-    "label.new.ssh.key.pair": "Új SSH kulcspár",
-    "label.new.vm": "Új VM",
-    "label.next": "Következő",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS kiszolgáló",
-    "label.nfs.storage": "NFS tár",
-    "label.nic.adapter.type": "NIC adapter típus",
-    "label.nicira.controller.address": "Vezérlő cím",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP részletek",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "NIC-ek",
-    "label.no": "Nem",
-    "label.no.actions": "Nincs elérhető művelet",
-    "label.no.alerts": "Nem voltak riasztások a közelmúltban",
-    "label.no.data": "Nincs megjelenítendő adat",
-    "label.no.errors": "Nem voltak hibák a közelmúltban",
-    "label.no.grouping": "(nincs csoportosítás)",
-    "label.no.isos": "Nincsenek elérhető ISO-k",
-    "label.no.items": "Nincsenek elérhető elemek",
-    "label.no.security.groups": "Nincs elérhető biztonsági csoport",
-    "label.no.thanks": "Nem, köszi!",
-    "label.none": "Nincs",
-    "label.not.found": "Nem található",
-    "label.notifications": "Értesítések",
-    "label.num.cpu.cores": "CPU magok száma",
-    "label.number.of.clusters": "Fürtök száma",
-    "label.number.of.cpu.sockets": "CPU-aljzatok száma",
-    "label.number.of.hosts": "Kiszolgálók száma",
-    "label.number.of.pods": "Pod-ok száma:",
-    "label.number.of.system.vms": "Rendszer VM-ek száma",
-    "label.number.of.virtual.routers": "Virtuális routerek száma",
-    "label.number.of.zones": "Zónák száma",
-    "label.numretries": "Újrapróbálkozások száma",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "hónap",
-    "label.offer.ha": "Offer HA",
-    "label.ok": "Rendben",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight vezérlő",
-    "label.opendaylight.controllerdetail": "OpenDaylight vezérlő részletek",
-    "label.opendaylight.controllers": "OpenDaylight vezérlők",
-    "label.operator": "Operátor",
-    "label.optional": "Opcionális",
-    "label.order": "Sorrend",
-    "label.os.preference": "OS preferencia",
-    "label.os.type": "OS típus",
-    "label.other": "Más",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Művelet",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Jelszó",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Felhasználónév",
-    "label.override.guest.traffic": "Vendég forgalom felülbírálása",
-    "label.override.public.traffic": "Publikus forgalom felülbírálása",
-    "label.ovm.traffic.label": "OVM traffic label",
-    "label.ovm3.cluster": "Natív fürtözés",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Birtokolt publikus IP címek",
-    "label.owner.account": "Tulajdonos számla",
-    "label.owner.domain": "Owner Domain",
-    "label.palo.alto.details": "Palo Alto részletek",
-    "label.parent.domain": "Szülő domén",
-    "label.passive": "Passzív",
-    "label.password": "Jelszó",
-    "label.password.enabled": "Jelszó bekapcsolva",
-    "label.password.lower": "jelszó",
-    "label.password.reset.confirm": "A jelszó újrabeállítva:",
-    "label.path": "Útvonal",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Perzisztens",
-    "label.physical.network": "Fizikai hálózat",
-    "label.physical.network.ID": "Fizikai hálózat ID",
-    "label.physical.network.name": "A fizikai hálózat neve",
-    "label.ping.path": "Ping útvonal",
-    "label.planner.mode": "Tervező mód",
-    "label.please.complete.the.following.fields": "Kérlek töltsd ki ki a következő mezőket",
-    "label.please.specify.netscaler.info": "Please specify Netscaler info",
-    "label.please.wait": "Kérlek várj!",
-    "label.plugin.details": "Plugin részletek",
-    "label.plugins": "Plugin-ek",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod dedikálva",
-    "label.pod.name": "Pod név",
-    "label.pods": "Pod-ok",
-    "label.polling.interval.sec": "Lekérdezés időköze (mp)",
-    "label.port": "Port",
-    "label.port.forwarding": "Port továbbítás",
-    "label.port.forwarding.policies": "Port forwarding policies",
-    "label.port.range": "Port tartomány",
-    "label.portable.ip": "Mozgatható IP",
-    "label.portable.ip.range.details": "Hordozható IP tartomány részletek",
-    "label.portable.ip.ranges": "Hordozható IP tartományok",
-    "label.portable.ips": "Hordozható IP címek",
-    "label.powerstate": "Power State",
-    "label.prev": "Előző",
-    "label.previous": "Előző",
-    "label.primary.allocated": "Elsődleges tár elkülönítve",
-    "label.primary.network": "Elsődleges hálózat",
-    "label.primary.storage": "Elsődleges tár",
-    "label.primary.storage.count": "Primary Storage Pools",
-    "label.primary.storage.limits": "Elsődleges tár korlátok (GiB)",
-    "label.primary.used": "Használt elsődleges tár",
-    "label.private.Gateway": "Privát átjáró",
-    "label.private.interface": "Private Interface",
-    "label.private.ip": "Privát IP cím",
-    "label.private.ip.range": "Privát IP tartomány",
-    "label.private.ips": "Privát IP címek",
-    "label.private.key": "Privát kulcs",
-    "label.private.network": "Privát hálózat",
-    "label.private.port": "Privát port",
-    "label.private.zone": "Privát zóna",
-    "label.privatekey": "PKCS#8 privát kulcs",
-    "label.profile": "Profil",
-    "label.project": "Projekt",
-    "label.project.dashboard": "Projekt műszerfal",
-    "label.project.id": "Projekt ID",
-    "label.project.invite": "Meghívás a projektbe",
-    "label.project.name": "Projekt név",
-    "label.project.view": "Projekt nézet",
-    "label.projects": "Projektek",
-    "label.protocol": "Protokol",
-    "label.protocol.number": "Protokoll szám",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Szolgáltató",
-    "label.providers": "Szolgáltatók",
-    "label.public": "Publikus",
-    "label.public.interface": "Public Interface",
-    "label.public.ip": "Publikus IP cím",
-    "label.public.ips": "Publikus IP címek",
-    "label.public.key": "Publikus kulcs",
-    "label.public.lb": "Publikus LB",
-    "label.public.load.balancer.provider": "Publikus terheléselosztó szolgáltató",
-    "label.public.network": "Publikus hálózat",
-    "label.public.port": "Publikus port",
-    "label.public.traffic": "Publikus forgalom",
-    "label.public.traffic.vswitch.name": "Publikus forgalom vSwitch név",
-    "label.public.traffic.vswitch.type": "Publikus forgalom vSwitch típus",
-    "label.public.zone": "Publikus zóna",
-    "label.purpose": "Rendeltetés",
-    "label.qos.type": "QoS típus",
-    "label.quickview": "Gyorsnézet",
-    "label.quiesce.vm": "VM felfüggesztése",
-    "label.quiet.time.sec": "Várakozás (mp)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "Dátum",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "Vég dátum",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "Minden számla",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Kezdő dátum",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "Állapot",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Összes",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx felhasználó",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "Újraindítás",
-    "label.recent.errors": "Legutóbbi hibák",
-    "label.recover.vm": "VM helyreállítása",
-    "label.redundant.router": "Redundáns router",
-    "label.redundant.router.capability": "Redundáns router képesség",
-    "label.redundant.state": "Redundáns állapot",
-    "label.redundant.vpc": "Redundáns VPC",
-    "label.refresh": "Frissités",
-    "label.refresh.blades": "Blade-k frissítése",
-    "label.region": "Régió",
-    "label.region.details": "Régió részletek",
-    "label.regionlevelvpc": "Régió szintű VPC",
-    "label.reinstall.vm": "VM újratelepítése",
-    "label.related": "Kapcsolódó",
-    "label.release.account": "Release from Account",
-    "label.release.account.lowercase": "Release from account",
-    "label.release.dedicated.cluster": "Dedikált fürt elengedése",
-    "label.release.dedicated.host": "Dedikált kiszolgáló elengedése",
-    "label.release.dedicated.pod": "Dedikált pod elengedése",
-    "label.release.dedicated.vlan.range": "Dedikált VLAN tartomány elengedése",
-    "label.release.dedicated.zone": "Dedikált zóna elengedése",
-    "label.remind.later": "Emlékeztess később!",
-    "label.remove.ACL": "ACL eltávolítása",
-    "label.remove.egress.rule": "Egress szabály törlése",
-    "label.remove.from.load.balancer": "Példány eltávolítása terheléselosztóból",
-    "label.remove.ingress.rule": "Ingress szabály törlése",
-    "label.remove.ip.range": "IP tartomány eltávolítása",
-    "label.remove.ldap": "LDAP eltávolítása",
-    "label.remove.network.offering": "Hálózati ajánlat eltávolítása",
-    "label.remove.pf": "Port továbbító szabály eltávolítása",
-    "label.remove.project.account": "Számla eltávolítása a projektből",
-    "label.remove.region": "Régió eltávolítása",
-    "label.remove.rule": "Szabály eltávolítása",
-    "label.remove.ssh.key.pair": "SSH kulcspár eltávolítása",
-    "label.remove.static.nat.rule": "Statikus NAT szabály eltávolítása",
-    "label.remove.static.route": "Remove static route",
-    "label.remove.this.physical.network": "A fizikai hálózat eltávolítása",
-    "label.remove.tier": "Réteg eltávolítása",
-    "label.remove.vm.from.lb": "VM eltávolítása terheléselosztó szabályból",
-    "label.remove.vm.load.balancer": "VM eltávolítása a terheléselosztóból",
-    "label.remove.vmware.datacenter": "VMware adatközpont eltávolítása",
-    "label.remove.vpc": "VPC eltávolítása",
-    "label.remove.vpc.offering": "VPC ajánlat törlése",
-    "label.removing": "Törlés",
-    "label.removing.user": "Felhasználó eltávolítása",
-    "label.reource.id": "Erőforrás ID",
-    "label.replace.acl": "ACL csere",
-    "label.replace.acl.list": "ACL lista cseréje",
-    "label.required": "Szükséges",
-    "label.requires.upgrade": "Frissítést igényel",
-    "label.reserved.ip.range": "Elkülönített IP címtartomány",
-    "label.reserved.system.gateway": "Reserved system gateway",
-    "label.reserved.system.ip": "Elkülönített rendszer IP",
-    "label.reserved.system.netmask": "Elkülönített rendszer hálózati maszk",
-    "label.reset.VPN.connection": "VPN kapcsolat újraindítása",
-    "label.reset.ssh.key.pair": "SSH kulcspár újrabeállítása",
-    "label.reset.ssh.key.pair.on.vm": "SSH kulcspár újrabeállítása a VM-en",
-    "label.resetVM": "VM újraindítása",
-    "label.resize.new.offering.id": "Új ajánlat",
-    "label.resize.new.size": "Új méret (GB)",
-    "label.resize.shrink.ok": "Csökkentés OK",
-    "label.resource": "Erőforrás",
-    "label.resource.limit.exceeded": "Erőforrás-korlát túllépés",
-    "label.resource.limits": "Erőforrás korlátok",
-    "label.resource.name": "Erőforrás név",
-    "label.resource.state": "Erőforrás állapot",
-    "label.resources": "Erőforrások",
-    "label.response.timeout.in.sec": "Válasz időtúllépés (mp)",
-    "label.restart.network": "Hálózat újraindítása",
-    "label.restart.required": "Újraindítás szükséges",
-    "label.restart.vpc": "VPC újraindítása",
-    "label.restore": "Helyreállítás",
-    "label.retry.interval": "Újraprobálkozás időköz",
-    "label.review": "Ellenőrzés",
-    "label.revoke.project.invite": "Meghívó visszavonása",
-    "label.role": "Szerep",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Főtanúsítvány",
-    "label.root.disk.controller": "Root disk controller",
-    "label.root.disk.offering": "Root Disk Offering",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Scaled Up",
-    "label.routing": "Útvonalválasztás",
-    "label.routing.host": "Routing kiszolgáló",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Szabály szám",
-    "label.rules": "Szabályok",
-    "label.running.vms": "Futó VM-ek",
-    "label.s3.access_key": "Hozzáférési kulcs",
-    "label.s3.bucket": "Kosár",
-    "label.s3.connection_timeout": "Kapcsolódási időtúllépés",
-    "label.s3.endpoint": "Végpont",
-    "label.s3.max_error_retry": "Újrapróbálkozás max.",
-    "label.s3.nfs.path": "S3 NFS útvonal",
-    "label.s3.nfs.server": "S3 NFS kiszolgáló",
-    "label.s3.secret_key": "Titkos kulcs",
-    "label.s3.socket_timeout": "Kapcsolat időtúllépés",
-    "label.s3.use_https": "HTTPS használata",
-    "label.saml.enable": "Authorize SAML SSO",
-    "label.saml.entity": "Identity Provider",
-    "label.saturday": "Szombat",
-    "label.save": "Mentés",
-    "label.save.and.continue": "Mentés és folytatás",
-    "label.save.changes": "Változások mentése",
-    "label.saving.processing": "Mentés...",
-    "label.scale.up.policy": "SCALE UP POLICY",
-    "label.scaledown.policy": "ScaleDown szabályzat",
-    "label.scaleup.policy": "ScaleUp szabályzat",
-    "label.scope": "Hatály",
-    "label.search": "Keresés",
-    "label.secondary.ips": "Másodlagos IP címek",
-    "label.secondary.isolated.vlan.id": "Másodlagos izolált VLAN ID",
-    "label.secondary.staging.store": "Secondary Staging Store",
-    "label.secondary.staging.store.details": "Secondary Staging Store details",
-    "label.secondary.storage": "Másodlagos tár",
-    "label.secondary.storage.count": "Secondary Storage Pools",
-    "label.secondary.storage.details": "Másodlagos tár részletek",
-    "label.secondary.storage.limits": "Secondary Storage limits (GiB)",
-    "label.secondary.storage.vm": "Secondary storage VM",
-    "label.secondary.used": "Használt másodlagos tár",
-    "label.secret.key": "Titkos kulcs",
-    "label.security.group": "Biztonsági csoport",
-    "label.security.group.name": "Biztonsági csoport név",
-    "label.security.groups": "Biztonsági csoportok",
-    "label.security.groups.enabled": "Biztonsági csoportok bekapcsolva",
-    "label.select": "Kiválasztás",
-    "label.select-view": "Nézet",
-    "label.select.a.template": "Válassz egy sablont!",
-    "label.select.a.zone": "Válassz egy zónát!",
-    "label.select.instance": "Válaszd ki a pédányt!",
-    "label.select.instance.to.attach.volume.to": "Válaszd ki a példányt, amelyikhez a kötetet csatlakoztatni szeretnéd!",
-    "label.select.iso.or.template": "Válassz ISO-t vagy sablont!",
-    "label.select.offering": "Válassz ajánlatot!",
-    "label.select.project": "Válassz projektet!",
-    "label.select.region": "Régió kiválasztása",
-    "label.select.template": "Sablon kiválasztása",
-    "label.select.tier": "Válassz réteget!",
-    "label.select.vm.for.static.nat": "Válassz VM-et a statikus NAT-hoz",
-    "label.sent": "Elküldött",
-    "label.server": "Szerver",
-    "label.service.capabilities": "Szolgáltatás képességek",
-    "label.service.offering": "Szolgáltatás ajánlat",
-    "label.service.offering.details": "Szolgáltatás ajánlat részletei",
-    "label.service.state": "Szolgáltatás állapot",
-    "label.services": "Szolgáltatások",
-    "label.session.expired": "A munkamenet lejárt",
-    "label.set.default.NIC": "Alapértelmezett NIC beállítása",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Zóna-típus beállítása",
-    "label.settings": "Beállítások",
-    "label.setup": "Beállítások",
-    "label.setup.network": "Hálózat beállítása",
-    "label.setup.zone": "Zóna beállítása",
-    "label.shared": "Osztott",
-    "label.show.advanced.settings": "Haladó szintű beállítások",
-    "label.show.ingress.rule": "Ingress szabály megjelenítése",
-    "label.shutdown.provider": "Szolgáltató leállítása",
-    "label.simplified.chinese.keyboard": "Egyszerűsített kínai billentyűzet",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Méret",
-    "label.skip.guide": "Használtam már a CloudStack-et, kihagyom ezt az útmutatót",
-    "label.smb.domain": "SMB domén",
-    "label.smb.password": "SMB jelszó",
-    "label.smb.username": "SMB felhasználónév",
-    "label.snapshot": "Pillanatfelvétel",
-    "label.snapshot.limits": "Pillanatfelvétel korlátok",
-    "label.snapshot.name": "Pillanatfelvétel név",
-    "label.snapshot.s": "Pillanatfelvételek",
-    "label.snapshot.schedule": "Ismétlődő pillanatfelvétel beállítása",
-    "label.snapshots": "Pillanatfelvételek",
-    "label.sockets": "CPU aljzatok",
-    "label.source.ip.address": "Forrás IP cím",
-    "label.source.nat": "Forrás NAT",
-    "label.source.nat.supported": "SourceNAT Supported",
-    "label.source.port": "Forrás port",
-    "label.specify.IP.ranges": "Add meg az IP tartományokat!",
-    "label.specify.vlan": "VLAN megadása",
-    "label.specify.vxlan": "VXLAN megadása",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX részletek",
-    "label.ssh.key.pair": "SSH kulcspár",
-    "label.ssh.key.pair.details": "SSH kucspár részletei",
-    "label.ssh.key.pairs": "SSH kulcspárok",
-    "label.standard.us.keyboard": "Amerikai (USA) szabványos billentyűzet",
-    "label.start.IP": "Kezdő IP",
-    "label.start.lb.vm": "Terheléselosztó VM indítása",
-    "label.start.port": "Kezdő port",
-    "label.start.reserved.system.IP": "Kezdő elkülönített rendszer IP",
-    "label.start.vlan": "Első VLAN",
-    "label.start.vxlan": "Első VXLAN",
-    "label.state": "Állapot",
-    "label.static.nat": "Statikus NAT",
-    "label.static.nat.enabled": "Statikus NAT bekapcsolva",
-    "label.static.nat.to": "Statikus NAT célpont",
-    "label.static.nat.vm.details": "Static NAT VM Details",
-    "label.static.routes": "Statikus útvonalak",
-    "label.statistics": "Statisztika",
-    "label.status": "Állapot",
-    "label.step.1": "1. lépés",
-    "label.step.1.title": "1. lépés: <strong>Sablon kiválasztása</strong>",
-    "label.step.2": "2. lépés",
-    "label.step.2.title": "2. lépés: <strong>Szolgáltatás ajánlat</strong>",
-    "label.step.3": "3. lépés",
-    "label.step.3.title": "3. lépés: <strong id=\"step3_label\">Merevlemez ajánlat választása</strong>",
-    "label.step.4": "4. lépés",
-    "label.step.4.title": "4. lépés: <strong>Hálózat</strong>",
-    "label.step.5": "5. lépés",
-    "label.step.5.title": "5. lépés: <strong>Ellenőrzés</strong>",
-    "label.stickiness": "Stickiness",
-    "label.stickiness.method": "Stickiness method",
-    "label.sticky.cookie-name": "Cookie név",
-    "label.sticky.domain": "Domén",
-    "label.sticky.expire": "Lejárat",
-    "label.sticky.holdtime": "Hold time",
-    "label.sticky.indirect": "Indirekt",
-    "label.sticky.length": "Hossz",
-    "label.sticky.mode": "Mód",
-    "label.sticky.name": "Sticky Name",
-    "label.sticky.nocache": "Nincs gyorsítótár",
-    "label.sticky.postonly": "Post only",
-    "label.sticky.prefix": "Előtag",
-    "label.sticky.request-learn": "Request learn",
-    "label.sticky.tablesize": "Tábla méret",
-    "label.stop": "Álj",
-    "label.stop.lb.vm": "Terheléselosztó VM leállítása",
-    "label.stopped.vms": "Leállított VM-ek",
-    "label.storage": "Tár",
-    "label.storage.pool": "Storage Pool",
-    "label.storage.tags": "Tár címkék",
-    "label.storage.traffic": "Tár forgalom",
-    "label.storage.type": "Tár típus",
-    "label.subdomain.access": "Subdomain Access",
-    "label.submit": "Elküldés",
-    "label.submitted.by": "[Beküldő: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Sikerült",
-    "label.sunday": "Vasárnap",
-    "label.super.cidr.for.guest.networks": "Super CIDR for Guest Networks",
-    "label.supported.services": "Támogatott szolgáltatások",
-    "label.supported.source.NAT.type": "Támogatott forrás NAT típus",
-    "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Projekt felfüggesztése",
-    "label.switch.type": "Switch típus",
-    "label.system.capacity": "Rendszer kapacítás",
-    "label.system.offering": "Rendszer ajánlat",
-    "label.system.offering.for.router": "Rendszer ajánlat router-re",
-    "label.system.service.offering": "Rendszer szolgáltatás ajánlat",
-    "label.system.service.offering.details": "Rendszer szolgáltatás ajánlat részletei",
-    "label.system.vm": "Rendszer VM",
-    "label.system.vm.details": "Rendszer VM részletek",
-    "label.system.vm.scaled.up": "Rendszer VM felméretezve",
-    "label.system.vm.type": "Rendszer VM típus",
-    "label.system.vms": "Rendszer VM-ek",
-    "label.system.wide.capacity": "Rendszer-szintű kapacítás",
-    "label.tag.key": "Címke kulcs",
-    "label.tag.value": "Címke érték",
-    "label.tagged": "Cimkézve",
-    "label.tags": "Cimkék",
-    "label.target.iqn": "Cél IQN",
-    "label.task.completed": "Feladat végrehajtva",
-    "label.template": "Sablon",
-    "label.template.limits": "Sablon korlátok",
-    "label.tftp.root.directory": "Tftp root directory",
-    "label.theme.default": "Alapértelmezett téma",
-    "label.theme.grey": "Egyedi - szürke",
-    "label.theme.lightblue": "Egyedi - világoskék",
-    "label.threshold": "Küszöbérték",
-    "label.thursday": "Csütörtök",
-    "label.tier": "Réteg",
-    "label.tier.details": "Réteg részletei",
-    "label.time": "Idő",
-    "label.time.colon": "Idő:",
-    "label.time.zone": "Időzóna",
-    "label.timeout": "Időtúllépés",
-    "label.timeout.in.second ": " Időtúllépés (mp)",
-    "label.timezone": "Időzóna",
-    "label.timezone.colon": "Időzóna",
-    "label.token": "Token",
-    "label.total.CPU": "Összes CPU",
-    "label.total.cpu": "Összes CPU",
-    "label.total.hosts": "Összes kiszolgáló",
-    "label.total.memory": "Memória összesen",
-    "label.total.of.ip": "IP címek összesen",
-    "label.total.of.vm": "Összes VM",
-    "label.total.storage": "Összes tár",
-    "label.total.virtual.routers": "Total of Virtual Routers",
-    "label.total.virtual.routers.upgrade": "Total of Virtual Routers that require upgrade",
-    "label.total.vms": "Összes VM",
-    "label.traffic.label": "Forgalom címke",
-    "label.traffic.type": "Forgalom típus",
-    "label.traffic.types": "Forgalom típusok",
-    "label.tuesday": "Kedd",
-    "label.type": "Típus",
-    "label.type.id": "Típus ID",
-    "label.type.lower": "típus",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK billentyűzet",
-    "label.unavailable": "Nem elérhető",
-    "label.unhealthy.threshold": "Nem egészséges küszöb",
-    "label.unlimited": "Korlátlan",
-    "label.untagged": "Cimkézetlen",
-    "label.update.project.resources": "Update project resources",
-    "label.update.ssl": " SSL tanústvány",
-    "label.update.ssl.cert": " SSL tanústvány",
-    "label.updating": "Updating",
-    "label.upgrade.required": "Frissitésre van szükség",
-    "label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
-    "label.upload": "Feltöltés",
-    "label.upload.from.local": "Feltöltés",
-    "label.upload.template.from.local": "Sablon feltöltése",
-    "label.upload.volume": "Kötet feltöltése",
-    "label.upload.volume.from.local": "Kötet feltöltése",
-    "label.upload.volume.from.url": "Kötet feltöltése URL-ről",
-    "label.url": "URL",
-    "label.usage.interface": "Usage Interface",
-    "label.usage.sanity.result": "Usage Sanity Result",
-    "label.usage.server": "Usage Server",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "VM IP cím használata:",
-    "label.use.vm.ips": "VM IP címek használata",
-    "label.used": "Használt",
-    "label.user": "Felhasználó",
-    "label.user.data": "Felhasználói adat",
-    "label.user.details": "Felhasználó adatai",
-    "label.user.vm": "Felhasználói VM",
-    "label.username": "Felhasználónév",
-    "label.username.lower": "felhasználónév",
-    "label.users": "Felhasználók",
-    "label.vSwitch.type": "vSwitch típus",
-    "label.value": "Érték",
-    "label.vcdcname": "vCenter DC név",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter fürt",
-    "label.vcenter.datacenter": "vCenter adatközpont",
-    "label.vcenter.datastore": "vCenter tár",
-    "label.vcenter.host": "vCenter kiszolgálók",
-    "label.vcenter.password": "vCenter jelszó",
-    "label.vcenter.username": "vCenter felhasználónév",
-    "label.vcipaddress": "vCenter IP cím",
-    "label.version": "Verzió",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Max képméret",
-    "label.vgpu.max.vgpu.per.gpu": "vGPU-k GPU-nként",
-    "label.vgpu.remaining.capacity": "Megmaradó kapacítás",
-    "label.vgpu.type": "vGPU típus",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Nézet",
-    "label.view.all": "Összes megtekintése",
-    "label.view.console": "Konzol megtekintése",
-    "label.view.more": "Továbbiak megtekintése",
-    "label.view.secondary.ips": "Másodlagos IP címek megtekintése",
-    "label.viewing": "Megtekintés",
-    "label.virtual.appliance": "Virtuális készülék",
-    "label.virtual.appliance.details": "Virtuális készülék részletei",
-    "label.virtual.appliances": "Virtuális készülékek",
-    "label.virtual.machine": "Virtuális gép",
-    "label.virtual.machines": "Virtuális gépek",
-    "label.virtual.network": "Virtuális hálózat",
-    "label.virtual.networking": "Virtuális hálózat",
-    "label.virtual.router": "Virtuális router",
-    "label.virtual.routers": "Virtuális routerek",
-    "label.virtual.routers.group.account": "Virtuális routerek számlánként",
-    "label.virtual.routers.group.cluster": "Virtual Routers group by cluster",
-    "label.virtual.routers.group.pod": "Virtual Routers group by pod",
-    "label.virtual.routers.group.zone": "Virtuális routerek zónánként csoportosítva",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI tartomány",
-    "label.vlan.range.details": "VLAN tartomány részletei",
-    "label.vlan.ranges": "VLAN tartomány(ok)",
-    "label.vlan.vni.range": "VLAN/VNI tartomány",
-    "label.vlan.vni.ranges": "VLAN/VNI tartomány(ok)",
-    "label.vm.add": "Példány felvétele",
-    "label.vm.destroy": "Elpusztít",
-    "label.vm.display.name": "VM megjelenítendő név",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP cím",
-    "label.vm.name": "VM név",
-    "label.vm.password": "A VM jelszava",
-    "label.vm.reboot": "Újraindítás",
-    "label.vm.start": "Indítás",
-    "label.vm.state": "VM állapot",
-    "label.vm.stop": "Álj",
-    "label.vmfs": "VMFS",
-    "label.vms": "VM-ek",
-    "label.vmsnapshot": "VM pillanatfelvételek",
-    "label.vmsnapshot.current": "Jelnlegi",
-    "label.vmsnapshot.memory": "Pillanatfelvétel memória",
-    "label.vmsnapshot.parentname": "Szülő",
-    "label.vmsnapshot.type": "Típus",
-    "label.vmware.datacenter.id": "VMware adatközpont ID",
-    "label.vmware.datacenter.name": "VMware adatközpont név",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "VMware traffic label",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC eszközök",
-    "label.volatile": "Illékony",
-    "label.volgroup": "Kötet csoport",
-    "label.volume": "Kötet",
-    "label.volume.details": "Kötet részletek",
-    "label.volume.limits": "Köteg korlátok",
-    "label.volume.migrated": "Kötet átköltöztetve",
-    "label.volume.name": "Kötet név",
-    "label.volumes": "Kötetek",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Elosztott VPC Router",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC ajánlat",
-    "label.vpc.offering.details": "VPC ajánlat részletei",
-    "label.vpc.router.details": "VPC Router Details",
-    "label.vpc.supportsregionlevelvpc": "Régió-szintű VPC-t támogat",
-    "label.vpc.virtual.router": "VPC virtuális router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN ügyfélkapu",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "Vezérlő VLAN ID",
-    "label.vsmpktvlanid": "Csomag VLAN ID",
-    "label.vsmstoragevlanid": "Tár VLAN ID",
-    "label.vsphere.managed": "vSphere Managed",
-    "label.vswitch.name": "vSwitch név",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN tartomány",
-    "label.waiting": "Várakozás",
-    "label.warn": "Figyelmeztetés",
-    "label.warn.upper": "WARN",
-    "label.warning": "Figyelmeztetés",
-    "label.wednesday": "Szerda",
-    "label.weekly": "Heti",
-    "label.welcome": "Üdvözöllek!",
-    "label.welcome.cloud.console": "Üdvözöl a vezérlőkonzol!",
-    "label.what.is.cloudstack": "Mi a CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Original XS Version is 6.1+",
-    "label.xenserver.traffic.label": "XenServer traffic label",
-    "label.yes": "Igen",
-    "label.zone": "Zóna",
-    "label.zone.dedicated": "A zóna dedikálva",
-    "label.zone.details": "Zóna részletei",
-    "label.zone.id": "Zóna ID",
-    "label.zone.lower": "zóna",
-    "label.zone.name": "Zóna név",
-    "label.zone.step.1.title": "1. lépés: <strong>Hálózat kiválasztása</strong>",
-    "label.zone.step.2.title": "2. lépés: <strong>Zóna felvétele</strong>",
-    "label.zone.step.3.title": "3. lépés: <strong>Pod felvétele</strong>",
-    "label.zone.step.4.title": "4. lépés: <strong>IP címtartomány felvétele</strong>",
-    "label.zone.type": "Zóna típus",
-    "label.zone.wide": "Egész zónára kiterjedő",
-    "label.zoneWizard.trafficType.guest": "Vendég: forgalom végfelhasználói virtuális gépek között",
-    "label.zoneWizard.trafficType.management": "Vezérlés: forgalom a CloudStack felhő erőforrásai között, beleértve azokat a komponenseket, amelyek a vezérlő szerverrel kommunikálnak, mint a kiszolgálók és a rendszer VM-ek",
-    "label.zoneWizard.trafficType.public": "Publikus: forgalom az internet és a felhő virtuális gépei között",
-    "label.zoneWizard.trafficType.storage": "Tár: forgalom az elsődleges és másodlagos tár szerverek között, például VM sablonok és pillanatfelvételek",
-    "label.zones": "Zónák",
-    "managed.state": "Managed State",
-    "message.XSTools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
-    "message.Zone.creation.complete": "A zóna létrehozása befejeződött",
-    "message.acquire.ip.nic": "Erősítsd meg, hogy új másodlagos IP címet kérsz ehhez a NIC-hez!<br/>Megjegyzés: manuálisan kell beállítanod a frissen beszerzett másodlagos IP címet a virtuális gépben.",
-    "message.acquire.new.ip": "Erősítsd meg, hogy új IP címet kérsz ennek a hálózatnak!",
-    "message.acquire.new.ip.vpc": "Erősítsd meg, hogy új IP címet kérsz ennek a VPC-nek!",
-    "message.acquire.public.ip": "Válassz ki egy zónát, amelyikből az új IP címet kérni akarod!",
-    "message.action.cancel.maintenance": "A kiszolgáló karbantartását sikeresen megszakítottad. Ez a folyamat több percet vehet igénybe.",
-    "message.action.cancel.maintenance.mode": "Erősítsd meg, hogy meg akarod szakítani ezt a karbantartást!",
-    "message.action.change.service.warning.for.instance": "A példányt le kell állítani, mielőtt a jelenlegi szolgáltatási ajánlatait megpróbálod megváltoztatni.",
-    "message.action.change.service.warning.for.router": "A routert le kell állítani mielött a jelenlegi szolgáltatási ajánlatait megpróbálod megváltoztatni.",
-    "message.action.delete.ISO": "Erősítsd meg, hogy törölni akarod ezt az ISO-t!",
-    "message.action.delete.ISO.for.all.zones": "Az ISO-t minden zóna használja. Erősítsd meg, hogy minden zónából törölni akarod!",
-    "message.action.delete.cluster": "Erősítsd meg, hogy törölni akarod a fürtöt!",
-    "message.action.delete.disk.offering": "Erősítsd meg, hogy törölni akarod a merevlemez ajánlatot!",
-    "message.action.delete.domain": "Erősítsd meg, hogy törölni akarod ezt a domént!",
-    "message.action.delete.external.firewall": "Erősítsd meg, hogy törölni akarod ezt a külső tűzfalat! Figyelmeztetés: Ha azt tervezed, hogy ugyanazt a külső tűzfalat regisztrálod újra, az eszközön törölnöd kell a használati adatokat.",
-    "message.action.delete.external.load.balancer": "Erősítsd meg, hogy törölni akarod ezt a külső terheléselosztót! Figyelmeztetés: Ha azt tervezed, hogy ugyanazt a külső terheléselosztót regisztrálod újra, az eszközön törölnöd kell a használati adatokat.",
-    "message.action.delete.ingress.rule": "Erősítsd meg, hogy törölni akarod ezt az ingress szabályt!",
-    "message.action.delete.network": "Erősítsd meg, hogy le akarod törölni ezt a hálózatot!",
-    "message.action.delete.nexusVswitch": "Erősítsd meg, hogy törölni akarod ezt a nexus 1000v-t!",
-    "message.action.delete.nic": "Erősítsd meg, hogy el akarod távolítani a NIC-t! A hozzá kapcsolt hálózat is törlődik a VM-ből.",
-    "message.action.delete.physical.network": "Erősítsd meg, hogy törölni akarod ezt a fizikai hálózatot!",
-    "message.action.delete.pod": "Erősítsd meg, hogy törölni akarod ezt a pod-ot!",
-    "message.action.delete.primary.storage": "Erősítsd meg, hogy törölni akarod ezt az elsődleges tárat!",
-    "message.action.delete.secondary.storage": "Erősítsd meg, hogy törölni akarod ezt a másodlagos tárat!",
-    "message.action.delete.security.group": "Kérlek erősítsd meg, hogy törölni akarod ezt a biztonsági csoportot!",
-    "message.action.delete.service.offering": "Erősítsd meg, hogy törölni akarod ezt a szolgáltatás ajánlatot!",
-    "message.action.delete.snapshot": "Erősítsd meg, hogy törölni akarod ezt a pillanatfelvételt!",
-    "message.action.delete.system.service.offering": "Erősítsd meg, hogy törölni akarod ezt a rendszer szolgáltatás ajánlatot!",
-    "message.action.delete.template": "Erősítsd meg, hogy törölni akarod ezt a sablont!",
-    "message.action.delete.template.for.all.zones": "Ezt a sablont minden zóna használja. Erősítsd meg, hogy minden zónából törölni szeretnéd!",
-    "message.action.delete.volume": "Erősítsd meg, hogy törölni akarod ezt a kötetet!",
-    "message.action.delete.zone": "Erősítsd meg, hogy törölni akarod ezt a zónát!",
-    "message.action.destroy.instance": "Erősítsd meg, hogy el akarod pusztítani ezt a példányt!",
-    "message.action.destroy.systemvm": "Erősítsd meg, hogy el akarod pusztítani ezt a rendszer VM-et!",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Erősítsd meg, hogy ki akarod kapcsolni ezt a fürtöt!",
-    "message.action.disable.nexusVswitch": "Erősítsd meg, hogy ki akarod kapcsolni ezt a nexus 1000v-t!",
-    "message.action.disable.physical.network": "Erősítsd meg, hogy ki akarod kapcsolni ezt a fizikai hálózatot!",
-    "message.action.disable.pod": "Erősítsd meg, hogy ki akarod kapcsolni ezt a pod-ot!",
-    "message.action.disable.static.NAT": "Erősítsd meg, hogy ki akarod kapcsolni a statikus NAT-ot!",
-    "message.action.disable.zone": "Erősítsd meg, hogy ki akarod kapcsolni ezt a zónát!",
-    "message.action.download.iso": "Erősítsd meg, hogy le akarod tölteni ezt az ISO-t!",
-    "message.action.download.template": "Erősítsd meg, hogy le akarod tölteni ezt a sablont!",
-    "message.action.downloading.template": "Sablon letöltése",
-    "message.action.enable.cluster": "Erősítsd meg, hogy be akarod kapcsolni ezt a fürtöt!",
-    "message.action.enable.maintenance": "A kiszolgáló sikeresen felkészült a karbantartásra. Ez a művelet több percet is igénybe vehet attól függően, mennyi VM fut rajta jelenleg.",
-    "message.action.enable.nexusVswitch": "Erősítsd meg, hogy be akarod kapcsolni ezt a nexus 1000v-t!",
-    "message.action.enable.physical.network": "Erősítsd meg, hogy be akarod kapcsolni ezt a fizikai hálózatot.",
-    "message.action.enable.pod": "Erősítsd meg, hogy be akarod kapcsolni ezt a pod-ot!",
-    "message.action.enable.zone": "Erősítsd meg, hogy be akarod kapcsolni ezt a zónát!",
-    "message.action.expunge.instance": "Erősítsd meg, hogy törölni akarod ezt a példányt!",
-    "message.action.force.reconnect": "A kiszolgáló újrakapcsolódását sikerült kikényszeríteni. Ez a folyamat több percet veet igénybe.",
-    "message.action.host.enable.maintenance.mode": "A karbantartás elindítása az összes a kiszolgálón futó példány más kiszolgálóra költöztetését indítja el.",
-    "message.action.instance.reset.password": "Erősítsd meg, hogy meg akarod változtatni a virtuális gép ROOT jelszavát!",
-    "message.action.manage.cluster": "Erősítsd meg, hogy vezérelni akarod ezt a fürtöt!",
-    "message.action.primarystorage.enable.maintenance.mode": "Figyelmeztetés: az elsődleges tár karbantartási módba helyezése minden azt használó VM-et leállít. Akarod folytatni?",
-    "message.action.reboot.instance": "Erősítsd meg, hogy újra akarod indítani ezt a példányt!",
-    "message.action.reboot.router": "Minden a router által nyújtott szolgáltatás megszakad. Erősítsd meg, hogy újra akarod indítani a routert!",
-    "message.action.reboot.systemvm": "Erősítsd meg, hogy újra akarod indítani ezt a rendszer VM-et!",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Erősítsd meg, hogy el akarod engedni ezt az IP címet!",
-    "message.action.remove.host": "Erősítsd meg, hogy törölni akarod ezt a kiszolgálót!",
-    "message.action.reset.password.off": "A példány nem támogatja ezt a lehetőséget.",
-    "message.action.reset.password.warning": "A példányt le kell állítanod, mielött megpróbálnád lecserélni a jelszavát.",
-    "message.action.restore.instance": "Erősítsd meg, hogy helyre akarod állítani ezt a példányt!",
-    "message.action.revert.snapshot": "Erősítsd meg, hogy vissza akarod állítani a kötetet erre a pillanatfelvétlere!",
-    "message.action.start.instance": "Erősítsd meg, hogy el akarod indítani ezt a példányt!",
-    "message.action.start.router": "Erősítsd meg, hogy el akarod indítani ezt a routert!",
-    "message.action.start.systemvm": "Erősítsd meg, hogy el akarod indítani ezt a rendszer VM-et!",
-    "message.action.stop.instance": "Erősítsd meg, hogy le akarod állítani ezt a példányt!",
-    "message.action.stop.router": "Minden ezzel a routerrel kapcsolatos szolgáltatás megszakad. Erősítsd meg, hogy le akarod állítani ezt a routert!",
-    "message.action.stop.systemvm": "Erősítsd meg, hogy le akarod állítani ezt a rendszer VM-et!",
-    "message.action.take.snapshot": "Erősítsd meg, hogy pillanatfelvételt kérsz erről a kötetről!",
-    "message.action.snapshot.fromsnapshot":"Erősítsd meg, hogy pillanatfelvételt kérsz erről a VM pillanatfelvételt!",
-    "message.action.unmanage.cluster": "Erősítsd meg, hogy megszakítod a fürt vezérlését!",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Erősítsd meg, hogy törölni akarod ezt a VM pillanatfelvételt!",
-    "message.action.vmsnapshot.revert": "Revert VM snapshot",
-    "message.activate.project": "Biztosan aktiválni szeretnéd ezt a projektet?",
-    "message.add.VPN.gateway": "Erősítsd meg, hogy új VPN átjárót akarsz felvenni!",
-    "message.add.cluster": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Add meg a következő paramétereket az új merevlemez ajánlat felvételéhez",
-    "message.add.domain": "Please specify the subdomain you want to create under this domain",
-    "message.add.firewall": "Tűzfal felvétele a zónába",
-    "message.add.guest.network": "Erősítsd meg, hogy vendég hálózatot szeretnél felvenni!",
-    "message.add.host": "Add meg a következő adatokat az új kiszolgáló felvételéhez",
-    "message.add.ip.range": "IP tartomány felvétele a zóna publikus hálózatához",
-    "message.add.ip.range.direct.network": "Add an IP range to direct network <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>IP tartomány felvétele a <b><span id=\"pod_name_label\"></span></b> pod-hoz</p>",
-    "message.add.load.balancer": "Terheléselosztó felvétele a zónába",
-    "message.add.load.balancer.under.ip": "The load balancer rule has been added under IP:",
-    "message.add.network": "Hálózat felvétele a <b><span id=\"zone_name\"></span></b> zónában",
-    "message.add.new.gateway.to.vpc": "Please specify the information to add a new gateway to this VPC.",
-    "message.add.pod": "Új pod felvétele a <b><span id=\"add_pod_zone_name\"></span></b> zónában",
-    "message.add.pod.during.zone.creation": "Minden zónának egy vagy több pod-ot kell tartalmaznia. Vegyük fel az első pod-ot! A pod tartalmaz kiszolgálókat és elsődleges tár szervereket, amelyeket a következő lépésekben veszünk majd fel. Először állíts be egy elkülönített IP címtartományt a CloudStack belső forgalmának. A címtartománynak egyedinek kell lennie a felhőben.",
-    "message.add.primary": "Please specify the following parameters to add a new primary storage",
-    "message.add.primary.storage": "Új elsődleges tár felvétele a <b><span id=\"zone_name\"></span></b> zónában a <b><span id=\"pod_name\"></span> pod-hoz</b>",
-    "message.add.region": "Add meg az információkat az új régió felvételéhez!",
-    "message.add.secondary.storage": "Új tár felvétele a <b><span id=\"zone_name\"></span> zónához</b>",
-    "message.add.service.offering": "Töltsd ki a következő adatokat új számítási ajánlat felvételéhez",
-    "message.add.system.service.offering": "Töltsd ki a következő adatokat új rendszer szolgáltatás ajánlat felvételéhez",
-    "message.add.template": "Add meg a következő adatokat új sablon létrehozásához",
-    "message.add.volume": "Töltsd ki a következő adatokat új kötet létrehozásához",
-    "message.added.vpc.offering": "VPC ajánlat felvéve",
-    "message.adding.Netscaler.device": "Netscaler eszköz felvétele",
-    "message.adding.Netscaler.provider": "Netscaler szolgáltató felvétele",
-    "message.adding.host": "Kiszolgáló felvétele",
-    "message.additional.networks.desc": "Válaszd ki a további hálózatokat, amelyhez a példány csatlakozni fog!",
-    "message.admin.guide.read": "VMware-alapú VM-ek esetében kérlek olvasd el a dinakikus skálázásról szóló fejezetet! Szeretnéd folytatni?,",
-    "message.advanced.mode.desc": "Akkor válaszd ezt a hálózat modellt, ha szeretnéd használni a VLAN támogatást. Ez a hálózat modell biztosítja a legnagyobb rugalmasságot és lehetővé teszi, hogy a rendszergazdák olyan ajánlatokat biztosítsanak, mint a tűzfalak, VPN vagy terheléselosztók valamint a direkt és virtuális hálózatok.",
-    "message.advanced.security.group": "Válaszd ezt, ha biztonsági csoportokat akarsz használni a vendég VM izolációhoz!",
-    "message.advanced.virtual": "Válaszd ezt, ha zóna-szintű VLAN-okat szeretnél használni a vendég VM-ek izolációjára!",
-    "message.after.enable.s3": "Az S3-alapú másodlagos tár konfigurációja kész. Megjegyzés: miután elhagytad ezt az oldalt, nem tudod majd az S3-at ismét konfigurálni.",
-    "message.after.enable.swift": "A Swift konfigurációja kész. Megjegyzés: miután elhagytad ezt az oldalt, nem tudod majd újrakonfigurálni a Swift-et!",
-    "message.alert.state.detected": "Alert state detected",
-    "message.allow.vpn.access": "Add meg a VPN felhasználó nevét és jelszavát",
-    "message.apply.snapshot.policy": "Sikeresen módosítottad a jelenlegi pillanatfelvétel szabályzatodat!",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Erősítsd meg, hogy az ISO-t ehhez a virtuális géphez akarod csatolni!",
-    "message.attach.volume": "Töltsd ki a következő adatokat a kötet csatlakoztatásához! Ha Windows-alapú virtuális géphez csatlakoztatsz merevlemezt, akkor újra kell indítanod a példányt ahhoz, hogy lásd a merevlemezt.",
-    "message.basic.mode.desc": "Akkor válaszd ezt a hálózati modellt, ha <b>*<u>nem</u>*</b> akarsz VLAN támogatást bekapcsolni.  Ezen a hálózaton minden példány közvetlenül a hálózattól kap IP címet és a biztonsági csoportok szolgáltatnak biztonságot és szegregációt.",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "Please confirm that you wish to change the service offering of this virtual instance.",
-    "message.change.password": "Változtass jelszót!",
-    "message.cluster.dedicated": "Fürt dedikálva",
-    "message.cluster.dedication.released": "Fürt dedikálás elengedve",
-    "message.configure.all.traffic.types": "Több fizikai hálózatod van. Kattints a 'Szerkesztés' gombra és állíts be címkéket minden egyes forgalom típushoz!",
-    "message.configure.firewall.rules.allow.traffic": "Határozz meg szabályokat forgalom engedélyezéséhez",
-    "message.configure.firewall.rules.block.traffic": "Határozz meg szabályokat forgalom szűréséhez",
-    "message.configure.ldap": "Erősítsd meg, hogy szeretnél LDAP-t konfigurálni!",
-    "message.configuring.guest.traffic": "Vendég forgalom konfigurálása",
-    "message.configuring.physical.networks": "Fizikai hálózatok konfigurálása",
-    "message.configuring.public.traffic": "Publikus forgalom konfigurálása",
-    "message.configuring.storage.traffic": "Tár forgalom konfigurálása",
-    "message.confirm.action.force.reconnect": "Erősítsd meg, hogy újrakapcsolódni akarsz a kiszolgálóhoz!",
-    "message.confirm.add.vnmc.provider": "Erősítsd meg, hogy fel szeretnéd venni a VNMC szolgáltatót.",
-    "message.confirm.archive.alert": "Erősítsd meg, hogy archiválni akarod ezt a riasztást!",
-    "message.confirm.archive.event": "Erősítsd meg, hogy archiválni szeretnéd az eseményt!",
-    "message.confirm.archive.selected.alerts": "Erősítsd meg, hogy le akarod archiválni a kiválasztott riasztásokat!",
-    "message.confirm.archive.selected.events": "Erősítsd meg, hogy archiválni szeretnéd a kiválasztott eseményeket!",
-    "message.confirm.attach.disk": "Biztosan csatolni szeretnéd a merevlemezt?",
-    "message.confirm.create.volume": "Biztosan szeretnél kötetet létrehozni?",
-    "message.confirm.current.guest.CIDR.unchanged": "Változatlanul akarod hagyni a vendég hálózat CIDR-jét?",
-    "message.confirm.dedicate.cluster.domain.account": "Tényleg dedikálni akarod  ezt a fürtöt egy doménnek/számlának?",
-    "message.confirm.dedicate.host.domain.account": "Tényleg dedikálni akarod ezt a kiszolgálót egy doménnek vagy számlának?",
-    "message.confirm.dedicate.pod.domain.account": "Tényleg dedikálni szeretnéd ezt a pod-ot egy doménnek/számlának?",
-    "message.confirm.dedicate.zone": "Biztosan dedikálni akarod ezt a zónát egy doménhoz/számlához?",
-    "message.confirm.delete.BigSwitchBcf": "Erősítsd meg, hogy törölni szeretnéd ezt a BigSwitch BCF vezérlőt!",
-    "message.confirm.delete.BrocadeVcs": "Erősítsd meg, hogy törölni szeretnéd a Brocade Vcs Switch-et",
-    "message.confirm.delete.F5": "Erősítsd meg, hogy törölni szeretnéd az F5-öt",
-    "message.confirm.delete.NetScaler": "Erősítsd meg, hogy törölni szeretnéd a NetScaler-t",
-    "message.confirm.delete.PA": "Erősítsd meg, hogy törölni szeretnéd a Palo Alto-t",
-    "message.confirm.delete.SRX": "Erősítsd meg, hogy törölni szeretnéd a SRX-et",
-    "message.confirm.delete.acl.list": "Biztosan törölni akarod ezt a ACL listát?",
-    "message.confirm.delete.alert": "Biztosan törölni akarod ezt a riasztást?",
-    "message.confirm.delete.baremetal.rack.configuration": "Erősítsd meg, hogy törölni akarod a Baremetal rack konfigurációt!",
-    "message.confirm.delete.ciscoASA1000v": "Erősítsd meg, hogy törölni akarod a CiscoASA1000v-t",
-    "message.confirm.delete.ciscovnmc.resource": "Erősítsd meg, hogy törölni akarod a CiscoVNMC erőforrást!",
-    "message.confirm.delete.internal.lb": "Erősítsd meg, hogy törölni akarod ezt a belső LB-t!",
-    "message.confirm.delete.secondary.staging.store": "Erősítsd meg, hogy törölni akarod a másodlagos tárat!",
-    "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
-    "message.confirm.destroy.router": "Erősítsd meg, hogy el akarod pusztítani ezt a routert",
-    "message.confirm.disable.host": "Erősítsd meg, hogy ki akarod kapcsolni a kiszolgálót",
-    "message.confirm.disable.network.offering": "Biztos vagy abban, hogy ki akarod kapcsolni ezt a hálózat ajánlatot?",
-    "message.confirm.disable.provider": "Erősítsd meg, hogy ki akarod kapcsolni ezt a szolgáltatót",
-    "message.confirm.disable.vnmc.provider": "Erősítsd meg, hogy ki szeretnéd kapcsolni a VNMC szolgáltatót!",
-    "message.confirm.disable.vpc.offering": "Biztos vagy abban, hogy ki akarod kapcsolni ezt a VPC ajánlatot?",
-    "message.confirm.enable.host": "Erősítsd meg, hogy be akarod kapcsolni a kiszolgálót",
-    "message.confirm.enable.network.offering": "Biztos vagy abban, hogy be akarod kapcsolni ezt a hálózati ajánlatot?",
-    "message.confirm.enable.provider": "Erősítsd meg, hogy be szeretnéd kapcsolni ezt a szolgáltatót",
-    "message.confirm.enable.vnmc.provider": "Erősítsd meg, hogy be szeretnéd kapcsolni a VNMC szolgáltatót!",
-    "message.confirm.enable.vpc.offering": "Biztos vagy abban, hogy be akarod kapcsolni ezt a VPC ajánlatot?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Erősítsd meg, hogy csatlakozni szeretnél a projekthez",
-    "message.confirm.migrate.volume": "El akarod költöztetni ezt a kötetet?",
-    "message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
-    "message.confirm.release.dedicate.vlan.range": "Erősítsd meg, hogy elengeded a dedikált VLAN tartományt!",
-    "message.confirm.release.dedicated.cluster": "El akarod engedni ezt a dedikált fürtöt?",
-    "message.confirm.release.dedicated.host": "El akarod engedni ezt a dedikált kiszolgálót?",
-    "message.confirm.release.dedicated.pod": "El akarod engedni ezt a dedikált pod-ot?",
-    "message.confirm.release.dedicated.zone": "El akarod engedni ezt a dedikált zónát?",
-    "message.confirm.remove.IP.range": "Erősítsd meg, hogy el akarod távolítani ezt az IP tartományt",
-    "message.confirm.remove.event": "Biztosan törölni szeretnéd ezt az eseményt?",
-    "message.confirm.remove.load.balancer": "Erősítsd meg, hogy el akarod távolítani a VM-et a terheléselosztóról!",
-    "message.confirm.remove.network.offering": "Biztos vagy abban, hogy törölni akarod ezt a hálózati ajánlatot?",
-    "message.confirm.remove.selected.alerts": "Erősítsd meg, hogy el akarod távolítani a kiválasztott riasztásokat!",
-    "message.confirm.remove.selected.events": "Erősítsd meg, hogy törölni szeretnéd a kiválasztott eseményeket",
-    "message.confirm.remove.vmware.datacenter": "Erősítsd meg, hogy el akarod távolítani a VMware adatközpontot!",
-    "message.confirm.remove.vpc.offering": "Biztos vagy abban, hogy törölni akarod ezt a VPC ajánlatot?",
-    "message.confirm.replace.acl.new.one": "Le akarod cserélni ez ACL listát egy újjal?",
-    "message.confirm.scale.up.router.vm": "Biztosan fel akarod méretezni a router VM-et?",
-    "message.confirm.scale.up.system.vm": "Biztosan fel akarod méretezni a rendszer VM-et?",
-    "message.confirm.shutdown.provider": "Erősítsd meg, hogy le akarod állítani ezt a szolgáltatót",
-    "message.confirm.start.lb.vm": "Erősítsd meg, hogy el akarod indítani az LB VM-et!",
-    "message.confirm.stop.lb.vm": "Erősítsd meg, hogy le akarod állítani az LB VM-et!",
-    "message.confirm.upgrade.router.newer.template": "Erősítsd meg, hogy a routert új sablonnal akarod frissíteni!",
-    "message.confirm.upgrade.routers.account.newtemplate": "Erősítsd meg, hogy minden a számla minden routerét frissíteni akarod az új sablonnal!",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Erősítsd meg, hogy minden a fürt minden routerét frissíteni akarod az új sablonnal!",
-    "message.confirm.upgrade.routers.newtemplate": "Erősítsd meg, hogy a zóna minden routerét frissíteni akarod új sablonnal!",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Erősítsd meg, hogy a pod minden routerét frissíteni akarod új sablonnal!",
-    "message.copy.iso.confirm": "Erősítsd meg, hogy az ISO-t másolni akarod:",
-    "message.copy.template": "A <b id=\"copy_template_name_text\">XXX</b> sablon másolása a <b id=\"copy_template_source_zone_text\"></b> zónából a",
-    "message.copy.template.confirm": "Biztos vagy benne, hogy le akarod másolni a sablont?",
-    "message.create.template": "Biztosan szeretnél sablont létrehozni?",
-    "message.create.template.vm": "VM lérehozása <b id=\"p_name\"></b> sablonból",
-    "message.create.template.volume": "Please specify the following information before creating a template of your disk volume: <b><span id=\"volume_name\"></span></b>. Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.creating.cluster": "Fürt létrehozása",
-    "message.creating.guest.network": "Vendég hálózat létrehozása",
-    "message.creating.physical.networks": "Fizikai hálózat létrehozása",
-    "message.creating.pod": "Pod létrehozása",
-    "message.creating.primary.storage": "Elsődleges tár létrehozása",
-    "message.creating.secondary.storage": "Másodlagos tár létrehozása",
-    "message.creating.systemVM": "A rendszer VM-ek létrehozása folyamatban (ez eltarthat egy darabig)",
-    "message.creating.zone": "Zóna létrehozása",
-    "message.decline.invitation": "Biztosan el akarod utasítani ezt a projekt meghívást?",
-    "message.dedicate.zone": "Zóna dedikálása",
-    "message.dedicated.zone.released": "Zóna elengedve",
-    "message.delete.VPN.connection": "Erősítsd meg, hogy törölni akarod a VPN kapcsolatot",
-    "message.delete.VPN.customer.gateway": "Erősítsd meg, hogy törölni akarod ezt a VPN ügyfélkaput!",
-    "message.delete.VPN.gateway": "Erősítsd meg, hogy törölni akarod ezt a VPN átjárót!",
-    "message.delete.account": "Erősítsd meg, hogy törölni szeretnéd ezt a számlát!",
-    "message.delete.affinity.group": "Erősítsd meg, hogy törölni szeretnéd ezt az affinítás csoportot",
-    "message.delete.gateway": "Erősítsd meg, hogy törölni akarod ezt az átjárót",
-    "message.delete.project": "Biztosan törölni akarod ezt a projektet?",
-    "message.delete.user": "Erősítsd meg, hogy törölni szeretnéd ezt a felhasználót!",
-    "message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
-    "message.desc.advanced.zone": "Összetettebb hálózati topológiákhoz. Ez a hálózat modell biztosítja a legnagyobb rugalmasságot a vendég hálózatok felépítésében és olyan hálózati ajánlatokat tesz lehetővé, mint a tűzfalak, VPN vagy terheléselosztók.",
-    "message.desc.basic.zone": "Adj meg egy hálózatot, amelyen minden egyes VM példány közvetlenül a hálózattól kap IP címet. A vendég rendszerek izolációját 3. réteg-béli megoldásokkal, mint például biztonsági csoportokkal (IP cím filterezés) oldható meg.",
-    "message.desc.cluster": "Minden pod-nak tartalmaznia kell egy vagy több fürtöt és most létrehozzuk az első fürtöt. A fürt csoportosítja a kiszolgálókat. Egy fürtben található kiszolgálók ugyanolyan hardverrel rendelkeznek, ugyanolyan hipervizort futtatnak és ugyanahhoz az elsődleges tárolóhoz férnek hozzá. Minden fürt egy vagy több kiszolgálót és elsődleges tár szervert tartalmaz.",
-    "message.desc.create.ssh.key.pair": "Add meg a következő adatokat az ssh kulcs bejegyzéséhez!<br><br> (1) Ha publikus kulcsot adsz meg, a CloudStack eltárolja és a privát kulcsoddal használhatod. <br><br> (2) Ha nem adsz meg publikus kulcsot, a CloudStack készít neked egyet. Másold le és mentsd el a privát kulcsot, a CloudStack nem tartja meg.<br>",
-    "message.desc.created.ssh.key.pair": "Az SSH kulcspár létrejött.",
-    "message.desc.host": "Minden fürtnek legalább egy kiszolgálót kell tartalmaznia, amelyen a VM-ek futhatnak. Most vegyük fel az első kiszolgálót! Hogy a kiszolgáló működhessen, hipervizor szoftvert kell rá telepíteni, IP címet rendelni hozzá és biztosítani a kapcsolatot a CloudStack vezérlő szerverrel. <br/><br/> Add meg a kiszolgáló DNS vagy IP címét, a felhasználó nevét (általában root) és jelszavát, valamint a kiszolgáló kategorizálására szolgáló címkéket.",
-    "message.desc.primary.storage": "Minden fürt tartalmaz egy vagy több elsődleges tár szervert  és most létrehozzuk az elsőt. Az elsődleges tár tartalmazza a fürt kiszolgálóin futó összes VM virtuális merevlemezeit.",
-    "message.desc.reset.ssh.key.pair": "Adj meg egy ssh kulcspárt, amelyet fel szeretnél venni ehhez a VM-hez! A root jelszó megváltozik, ha a jelszó engedélyezett.",
-    "message.desc.secondary.storage": "Minden zónának rendelkeznie kell legalább egy NFS vagy másodlagos tár szervert és most létrehozzuk az elsőt. A másodlagos tár tárolja a VM sablonok, ISO fájlok és pillanatfelvételek adatait. Ennek a szervernek minden kiszolgáló számára hozzáférhetőnek kell lennie.<br/><br/> Add meg az IP címet és az útvonalat!",
-    "message.desc.zone": "A zóna a CloudStack legnagyobb egysége és általában egy adatközpontnak felel meg. A zónák fizikai izolációt adnak. Egy zóna egy vagy több pod-ból áll (amelyek kiszolgálókat és elsődleges tárolókat tartalmaznak) és egy másodlagos tárból, amelyet az összes pod használ.",
-    "message.detach.disk": "Biztosan la akarod választani a merevlemezt?",
-    "message.detach.iso.confirm": "Erősítsd meg, hogy le akarod választani az ISO-t a virtuális gépről!",
-    "message.disable.account": "Erősítsd meg, hogy ki szeretnéd kapcsolni ezt a számlát. A számla kikapcsolásával a számla felhasználóinak hozzáférése az erőforrásokhoz megszünik. Minden futó virtuális gép azonnal le lesz állítva.",
-    "message.disable.snapshot.policy": "Sikeresen kikapcsoltad a jelenlegi pillanatfelvétel szabályt.",
-    "message.disable.user": "Erősítsd meg, hogy ki akarod kapcsolni a felhasználót!",
-    "message.disable.vpn": "Biztosan ki akarod kapcsolni a VPN-t?",
-    "message.disable.vpn.access": "Erősítsd meg, hogy ki akarod kapcsolni a távoli VPN hozzáférést!",
-    "message.disabling.network.offering": "Hálózat ajánlat kikapcsolása",
-    "message.disabling.vpc.offering": "VPC ajánlat kikapcsolása",
-    "message.disallowed.characters": "Nem engedélyezett karakterek: <,>",
-    "message.download.ISO": "Az ISO letöltéséhez kattints <a href=\"#\">00000</a>",
-    "message.download.template": "A sablon letöltéséhez kattints <a href=\"#\">00000</a>",
-    "message.download.volume": "A kötet letöltéséhez kattints href=\"#\">00000</a>",
-    "message.download.volume.confirm": "Erősítsd meg, hogy le akarod tölteni ezt a kötetet!",
-    "message.edit.account": "Szerkesztés (\"-1\" jelzi az erőforrás használatának korlátlanságát)",
-    "message.edit.confirm": "Kérlek erősítsd meg a változtatásokat mielött elmented!",
-    "message.edit.limits": "Határozz meg korlátokat a következő erőforrásokhoz! A \"-1\" jelzi a korlátlanan felhasználást.",
-    "message.edit.traffic.type": "Please specify the traffic label you want associated with this traffic type.",
-    "message.enable.account": "Erősítsd meg, hogy be akarod kapcsolni ezt a számlát!",
-    "message.enable.user": "Erősítsd meg, hogy be akarod kapcsolni ezt a felhasználót!",
-    "message.enable.vpn": "Erősítsd meg, hogy be szeretnéd kapcsolni a távoli hozzáférésű VPN-t ehhez az IP címhez!",
-    "message.enable.vpn.access": "A VPN jelenleg ki van kapcsolva erre az IP címre. Szeretnéd bekapcsolni a VPN hozzáférést?",
-    "message.enabled.vpn": "A távoli hozzáférésű VPN jelenleg be van kapcsolva és hozzáférhető az IP címmel",
-    "message.enabled.vpn.ip.sec": "Your IPSec pre-shared key is",
-    "message.enabling.network.offering": "Hálózat ajánlat bekapcsolása",
-    "message.enabling.security.group.provider": "Biztonsági csoport szolgáltató bekapcsolása",
-    "message.enabling.vpc.offering": "VPC ajánlat bekapcsolása",
-    "message.enabling.zone": "Zóna bekapcsolása",
-    "message.enabling.zone.dots": "Zóna engedélyezése...",
-    "message.enter.seperated.list.multiple.cidrs": "Add meg a CIDR listát vesszőkkel elválaszva, ha egynél töb van!",
-    "message.enter.token": "Add meg a token-t, amit a meghívóban kaptál!",
-    "message.generate.keys": "Erősítsd meg, hogy új kulcsokat szeretnél generálni a felhasználónak!",
-    "message.gslb.delete.confirm": "Erősítsd meg, hogy törölni akarod a GSLB-t!",
-    "message.gslb.lb.remove.confirm": "Please confirm you want to remove load balancing from GSLB",
-    "message.guest.traffic.in.advanced.zone": "A vendég hálózat forgalom kommunikáció végfelhasználói virtuális gépek között. Határozz meg egy VLAN ID tartományt a vendég hálózatok forgalmának minden fizikai hálózathoz!",
-    "message.guest.traffic.in.basic.zone": "A vendég hálózat forgalma kommunikóció végfelhasználói virtuális gépek között. Határozz meg egy IP címtartományt, amelyből a CloudStack a virtuális gépekhez rendelhet címet. Győződj meg róla, hogy ez a tartomány nincs átfedésben az elkülönített rendszer IP tartománnyal!",
-    "message.host.dedicated": "Dedikált kiszolgáló",
-    "message.host.dedication.released": "Kiszolgáló elengedve",
-    "message.installWizard.click.retry": "Kattints az indítás gombra az ismétléshez.",
-    "message.installWizard.copy.whatIsACluster": "A fürt kiszolgálók csoportja. A fürt kiszolgálói egyforma hardverrel rendelkeznek, ugyanazt a hiőervízort használják, ugyanazon az alhálózaton találhatóak és hozzáférnek ugyanahhoz az osztott tárhoz. A virtuális gépek egy fürtön belül átköltöztethető másik kiszolgálóra annélkül, hogy annak működését megszakítanánk. A fürt a CloudStack&#8482; harmadik legnagyobb egysége. A fürtök pod-okba, a pod-ok zónákba rendeződnek. <br/><br/>A CloudStack&#8482; lehetővé teszi, hogy több fürtöt használj, de egy alap telepítésben csak egy fürtre van szükség.",
-    "message.installWizard.copy.whatIsAHost": "A kiszolgáló egy számítógép. A kiszolgálók biztosítják a számítási erőforrásokat, amelyeket a virtuális gépek felhasználnak. Minden kiszolgáló rendelkezik hipervizor szoftverrel, amely a vendég VM-eket futtatja (kivétel a bare-metal kiszolgálók). Például egy Linux KVM szerver, Citrix XenServer vagy egy ESXi szerver. Az alaptelepítésben csak egy KVM-et vagy XenServer-t futtató kiszolgálót használunk.<br/><br/>A kiszolgáló a CloudStack&#8482; telepítés legkissebb egysége. A kiszolgálók fürtökbe, a fürtök pod-okba, a pod-ok zónákba rendeződnek.",
-    "message.installWizard.copy.whatIsAPod": "A pod-ra gyakran egy rack-szekrényt jelent. Az egy pod-ban található kiszolgálók egy alhálózaton vannak.<br/><br/>A pod a CloudStack&#8482; telepítés második legnagyobb egysége. A pod-ok zónákat alkotnak. Minden zóna tartalmazhat egy vagy több pod-ot. Az alaptelepítésben csak egy pod-ra van szükségünk.",
-    "message.installWizard.copy.whatIsAZone": "A zóna a CloudStack&#8482; telepítés legnagyobb egysége. Egy zóna általában egy adatközpontnak felel meg, bár megengedhető egy adatközponton belül több zóna létrehozása. Az erőforrások zónákra való osztásának célja a redundancia és a fizikai izoláció. Például minden zónának lehet saját áramellátása és hálózati kapcsolata, valamint a zónák földrajzilag egymástól távol helyezkedhetnek el (bár ez nem feltétlenül szükséges).",
-    "message.installWizard.copy.whatIsCloudStack": "A CloudStack&#8482 egy szoftver, amely számítási erőforrásokat felügyel és alkalmas publikus, privát, vagy hibrid infrastruktúra szolgáltatás (IaaS) felhők építésére. A CloudStack&#8482 irányítja a hálózatokat, az adattárolókat és kiszolgálókat, amelyek a felhő infrastruktúrát alkotják.<br/><br/> A különálló virtuális gépeken túl a CloudStack&#8482 teljes felhő insfrastruktúrát szolgáltat. Nyílt forráskódú és prémium verziók egyaránt elérhetőek, a nyílt forráskódú verziók közel azonos képességekkel rendelkeznek.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "A CloudStack&#8482; infrastruktúra két féle afattárolót használ: elsődleges és másodlagos tárat. Mindkettő lehet ezek közül iSCIS, NFS vagy helyi merevlemez.<br/><br/>Az <strong>elsődleges tár</strong> egy fürthöz kapcsolódik és a fürtön futó virtuális gépek virtuális merevlemezeit tárolja. Az elsődleges tár tipikusan a kiszolgálókhoz közel található.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "A másodlagos tár egyzónához tartozik és a következőket tartalmazza:<ul><li>Sablonok - Telepített operációs rendszerek, amelyek a VM-ek létrehozására használható és tartalmazhat egyéb konfigurációs információkat, mint pl telepített alkalmazások.</li><li>ISO fájlok - OS images that can be bootable or non-bootable</li><li>Disk volume snapshots - saved copies of VM data which can be used for data recovery or to create new templates</ul>",
-    "message.installWizard.now.building": "A felhőd most épül...",
-    "message.installWizard.tooltip.addCluster.name": "A fürt neve. Ez tetszőleges általad választott szöveg lehet.",
-    "message.installWizard.tooltip.addHost.hostname": "A kiszolgáló IP címe vagy DNS neve.",
-    "message.installWizard.tooltip.addHost.password": "A fenti felhasználó jelszava.",
-    "message.installWizard.tooltip.addHost.username": "Általában root.",
-    "message.installWizard.tooltip.addPod.name": "A pod neve",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "Átjáró a pod kiszolgálóinak.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "A hálózati maszk, amit a vendég operációs rendszerek használnak majd.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "A tár eszköz neve.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(NFS esetében) In NFS this is the exported path from the server. Path (for SharedMountPoint).  With KVM this is the path on each host that is where this primary storage is mounted.  For example, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(NFS, iSCSI vagy PreSetup esetében) A táreszköz IP vagy DNS címe.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "A másodlagos tárat kiszolgáló NFS szerver IP címe",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "A fenti szerveren kiexportált útvonal",
-    "message.installWizard.tooltip.addZone.dns1": "Ezeket a DNS szervereket a zóna vendég VM-ei használják. A DNS szervereket publikus hálózaton fogják elérni, amelyet később veszel fel. A zóna publikus IP címeinek hozzá kell tudni férnie az itt megnevezett DNS szerverhez.",
-    "message.installWizard.tooltip.addZone.dns2": "Ezeket a DNS szervereket a zóna vendég VM-ei használják. A DNS szervereket publikus hálózaton fogják elérni, amelyet később veszel fel. A zóna publikus IP címeinek hozzá kell tudni férnie az itt megnevezett DNS szerverhez.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Ezeket a DNS szervereket a zóna rendszer VM-ei használják. A DNS szervereket privát hálózaton fogják elérni. A zóna privát IP címeinek hozzá kell tudni férnie az itt megnevezett DNS szerverhez.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Ezeket a DNS szervereket a zóna rendszer VM-ei használják. A DNS szervereket privát hálózaton fogják elérni. A zóna privát IP címeinek hozzá kell tudni férnie az itt megnevezett DNS szerverhez.",
-    "message.installWizard.tooltip.addZone.name": "A zóna neve",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "A hálózat leírása",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "A hálózati átjáró, amelyet a vendég rendszerek használhatnak",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "A vengég rendszerek hálózatának maszkja",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "A hálózat neve",
-    "message.instance.scaled.up.confirm": "Tényleg nagyobbra akarod méretezni a példányt?",
-    "message.instanceWizard.noTemplates": "You do not have any templates available; please add a compatible template, and re-launch the instance wizard.",
-    "message.ip.address.changed": "Az IP címid megváltzhattak, szeretnéd frissíteni a listát? Ebben az esetben a részletek fül be fog zárulni.",
-    "message.iso.desc": "A merevlemez kép, amely az indítható operációs rendszert tartalmazza",
-    "message.join.project": "Csatlakoztál egy projekthez. Válts a projekt nézetre!",
-    "message.launch.vm.on.private.network": "Szeretnéd a saját dedikált hálózatodon indítani a példányt?",
-    "message.launch.zone": "A zóna készen áll az indításra, folytasd a következő lépéssel",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-kattintás)",
-    "message.lock.account": "Erősítsd meg, hogy zárolni akarod ezt a számlát. A számla zárolásával a számla felhasználói nem lesznek képesek a felhő erőforrásaikat vezérelni. A létező erőforrások továbbra is hozzáférhetőek lesznek.",
-    "message.migrate.instance.confirm": "Erősítsd meg a kiszolgáló választást, ahova a virtuális gépet mozgatnád!",
-    "message.migrate.instance.to.host": "Erősítsd meg, hogy másik kiszolgálóra akarod mozgatni a példányt!",
-    "message.migrate.instance.to.ps": "Erősítsd meg, hogy a példányt másik elsődleges tárra szeretnéd mozgatni!",
-    "message.migrate.router.confirm": "Erősítsd meg, hogy a routert mozgatni szeretnéd a következő célpontra:",
-    "message.migrate.systemvm.confirm": "Erősítsd meg, hogy a rendszer VM-et a következő célpontra szeretnéd mozgatni:",
-    "message.migrate.volume": "Erősítsd meg, hogy másik elsődleges tárra akarod mozgatni a kötetet",
-    "message.network.addVM.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-    "message.network.addVMNIC": "Erősítsd meg, hogy szeretnél egy új VM NIC-et ehhez a hálózathoz!",
-    "message.network.remote.access.vpn.configuration": "Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-    "message.new.user": "A következőket adja meg új számla létrehozásához",
-    "message.no.affinity.groups": "Nincsenek affinítási csoportaid. Kérlek folytasd a következő lépéssel!",
-    "message.no.host.available": "Nincs elérhető kiszolgáló az átköltöztetéshez",
-    "message.no.network.support": "A kiválasztott hipervizor, a vSphere nem támogat semmilyen további hálózat beállítást.  Folytasd az 5. lépéssel!",
-    "message.no.network.support.configuration.not.true": "Nincs olyan zónád, amelyben a biztonsági csoportok be lenne kapcsolva, így a további hálózati lehetőségek nem érhetőek el. Folytasd az 5. lépéssel!",
-    "message.no.projects": "Nincsenek projekteid.<br/>A Projektek szekcióban tudsz újat csinálni.",
-    "message.no.projects.adminOnly": "Nincsenek projekteid.<br/>Kérd meg az adminisztrátort, hogy hozzon létre neked egyet!",
-    "message.number.clusters": "<h2>Fürtök <span>száma</span></h2>",
-    "message.number.hosts": "<h2>Kiszolgálók <span>száma</span></h2>",
-    "message.number.pods": "<h2>Pods-ok <span>száma</span></h2>",
-    "message.number.storage": "<h2>Elsődleges tár kötetek<span>száma</span></h2>",
-    "message.number.zones": "<h2>Zónák <span>száma</span></h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "A jelszó újrabeállítva:",
-    "message.password.of.the.vm.has.been.reset.to": "A VM jelszava újrabeállítva:",
-    "message.pending.projects.1": "Projekt meghívók várnak rád:",
-    "message.pending.projects.2": "A megtekintéshez menj a projektek szekcióhoz és válaszd a meghívókat a legördülő menüből!",
-    "message.please.add.at.lease.one.traffic.range": "Adj meg legalább egy forgalom tartományt!",
-    "message.please.confirm.remove.ssh.key.pair": "Erősítsd meg, hogy törölni akarod ezt az SSH kulcspárt!",
-    "message.please.proceed": "Menj tovább a következő lépéshez!",
-    "message.please.select.a.configuration.for.your.zone": "Válassz konfigurációt a zónádnak!",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Please select a different public and management network before removing",
-    "message.please.select.networks": "Válassz hálózatokat a virtuális gépedhez!",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Válassz ki egy SSH kulcspárt, amelyet ezzel a VM-mel használni szeretnél!",
-    "message.please.wait.while.zone.is.being.created": "Kérlek várj, amíg a zónád létrejön. Ez eltarthat egy ideig...",
-    "message.pod.dedication.released": "Pod dedikáció elengedve",
-    "message.portable.ip.delete.confirm": "Erősítsd meg, hogy törölni akarod a hordozható IP tartományt!",
-    "message.project.invite.sent": "Meghívó elküldve a felhasználónak. A felhasználó akkor kerül a projektbe, amikor elfogadja a meghívót.",
-    "message.public.traffic.in.advanced.zone": "Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.<br/><br/>Provide at least one range of IP addresses for internet traffic.",
-    "message.public.traffic.in.basic.zone": "A publikus forgalom akkor keletkezik, amikor a felhő virtuális gépei hozzáférnek az internethez vagy az interneten szolgáltatásokat biztosítanak. Publikusan elérhető IP címeket kell erre a célra elkülöníteni. Amikor létrejön egy példány, ezekből a publikus IP címekből kap egyet a példány a vendég IP címen kívül. Statikus 1-1 NAT lesz beállŧva a publikus és a vendég IP címek között. Végfelhasználók használhatják a CloudStack felületet is új IP címek beszerzéséhez és statikus NAT beállításához.",
-    "message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
-    "message.read.admin.guide.scaling.up": "Olvasd el az adminisztrátorok útmutatójában a dinamikus méretezésre vonatkozó részt mielőtt folytatod!",
-    "message.recover.vm": "Erősítsd meg, hogy helyre akarod állítani a VM-et.",
-    "message.redirecting.region": "Átirányítás régióba...",
-    "message.reinstall.vm": "Figyelmeztetés: Óvatosan! Ha folytatod, a VM újra lesz telepítve a sablon alapján, a fő lemezén található adat elveszik. Amennyiben vannak további merevlemezek, azok érintetlenek maradnak.",
-    "message.remove.ldap": "Biztosan törölni akarod az LDAP konfigurációt?",
-    "message.remove.region": "Biztosan törölni akarod ezt a régiót erről a vezérlő szerverről?",
-    "message.remove.vpc": "Erősítsd meg, hoy el akarod távolítani ezt a VPC-t!",
-    "message.remove.vpn.access": "Erősítsd meg, hogy törölni akarod a következő felhasználó VPN hozzáférését!",
-    "message.removed.ssh.key.pair": "SSH kulcspár eltávolítva",
-    "message.reset.VPN.connection": "Erősítsd meg, hogy alaphelyzetbe akarod állítani a VPN kapcsolatot!",
-    "message.reset.password.warning.notPasswordEnabled": "A példány sablonja jelszó bekapcsolása nélkül lett létrehozva",
-    "message.reset.password.warning.notStopped": "A példányt le kell állítanod, mielőtt megpróbálnál jelszót beállítani.",
-    "message.restart.mgmt.server": "Indítsd újra a vezérlő szervert (szervereket) ahhoz, hogy az új beállítás hatályba lépjen!",
-    "message.restart.mgmt.usage.server": "Please restart your management server(s) and usage server(s) for your new settings to take effect.",
-    "message.restart.network": "Megszakad minden szolgáltatás, amit a hálózat biztosít. Erősítsd meg, hogy újra akarod indítani a hálózatot!",
-    "message.restart.vpc": "Erősítsd meg, hogy újra akarod indítani a VPC-t!",
-    "message.restart.vpc.remark": "Erősítsd meg, hogy újra akarod indítani a VPC-t! <p><small><i>Megjegyzés: egy nem redundáns VPC redundánssá tétele takarítást tesz szükségessé. A hálózatok nem lesznek elérhetőek egy pár percig.</i>.</small></p>",
-    "message.restoreVM": "Helyre akarod állítani a VM-et?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(A <strong>Ctrl-kattintás</strong> használatával tudod az összes alkalmazható biztonsági csoportot kiválasztani)",
-    "message.select.a.zone": "Egy zóna tipikusan egy adatközpontnak felel meg. Több zóna segíthet a felhőt megbízhatóbbá tenni fizikai izolációval és redundanciával.",
-    "message.select.affinity.groups": "Válasszd ki azokat az affinitási csoportokat, amelyekhez a VM tartozzon:",
-    "message.select.instance": "Válassz egy példányt!",
-    "message.select.iso": "Válassz egy ISO-t az új virtuális példánynak!",
-    "message.select.item": "Válassz egy elemet!",
-    "message.select.security.groups": "Válassz biztonsági csoportokat az új VM-hez!",
-    "message.select.template": "Válassz egy sablont az új virtuális példánynak!",
-    "message.select.tier": "Válassz egy réteget!",
-    "message.set.default.NIC": "Erősítsd meg, hogy alapértelmezetté szeretnéd tenni ezt a NIC-et a VM-ben!",
-    "message.set.default.NIC.manual": "Most manuálisan módosítsd apalértelmezett NIC-et a VM-ben!",
-    "message.setup.physical.network.during.zone.creation": "Haladó zóna létrehozásakor egy vagy több fizikai hálózatot kell konfigurálnod. Minden hálózat egy hálózati kártyának felel meg a hipervízoron. Minden fizikai hálózat egy vagy több típusú forgalmat bonyolíthat, bizonyos megkötésekkel arra, hogy azokat hogyan lehet kombinálni. <br/><br/><strong>Húzz egy vagy több forgalom típust</strong> minden fizikai hálózatra.",
-    "message.setup.physical.network.during.zone.creation.basic": "Alap zóna létrehozásakor egy fizikai hálózatot hozhatsz létre amely hipervízor hálózati kártyájának felel meg.<br/><br/>Más forgalom-típusokat is <strong>ráhúzhatsz</strong> a fizikai hálózatra.",
-    "message.setup.successful": "A felhő beállítása sikeres!",
-    "message.snapshot.schedule": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-    "message.specifiy.tag.key.value": "Please specify a tag key and value",
-    "message.specify.url": "Kérlek adj meg egy URL-t!",
-    "message.step.1.continue": "Válassz egy sablont vagy ISO-t a folytatáshoz",
-    "message.step.1.desc": "Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto.",
-    "message.step.2.continue": "Válassz egy ajánlatot a folytatáshoz!",
-    "message.step.3.continue": "Válassz egy merevlemez ajánlatot a folytatáshoz!",
-    "message.step.4.continue": "Válassz legalább egy hálózatot a folytatáshoz!",
-    "message.step.4.desc": "Please select the primary network that your virtual instance will be connected to.",
-    "message.storage.traffic": "Forgalom a CloudStack felhő erőforrásai között, beleértve azokat a komponenseket, amelyek a vezérlő szerverrel kommunikálnak, mint a kiszolgálók és a rendszer VM-ek. Állítsd be a tár forgalmat itt!",
-    "message.suspend.project": "Biztosan fel akarod függeszteni ezt a projektet?",
-    "message.systems.vms.ready": "A rendszer VM-ek elkészültek.",
-    "message.template.copying": "A sablon másolás alatt áll.",
-    "message.template.desc": "Operációs rendszer kép, amelyet a virtuális gépek el tudnak indítani",
-    "message.tier.required": "A réteg kötelező.",
-    "message.tooltip.dns.1": "Name of a DNS server for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.dns.2": "A second DNS server name for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.internal.dns.1": "Egy DNS szerver neve, a zóna belső rendszer VM-einek kiszolgálására. A pod-ok privát IP címeinek szüksége van egy útvonalhoz ehhez a címhez.",
-    "message.tooltip.internal.dns.2": "Egy DNS szerver neve, a zóna belső rendszer VM-einek kiszolgálására. A pod-ok privát IP címeinek szüksége van egy útvonalhoz ehhez a címhez.",
-    "message.tooltip.network.domain": "A DNS suffix that will create a custom domain name for the network that is accessed by guest VMs.",
-    "message.tooltip.pod.name": "Név a pod-nak",
-    "message.tooltip.reserved.system.gateway": "Az átjáró a pod kiszolgálói számára",
-    "message.tooltip.reserved.system.netmask": "The network prefix that defines the pod subnet. Uses CIDR notation.",
-    "message.tooltip.zone.name": "Név a zónának.",
-    "message.update.os.preference": "Határozz meg egy OS preferenciát a kiszolgálóhoz. Minden példány, aminek hasonló preferenciái vannak először ezen a kiszolgálón indul el.",
-    "message.update.resource.count": "Erősítsd meg, hogy módosítani akarod a számla erőforrásainak számát!",
-    "message.update.ssl": "Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance:",
-    "message.update.ssl.failed": "Nem sikerült az SSL tanúsítványt módosítani",
-    "message.update.ssl.succeeded": "Az SSL tanúsítványok módosítása sikeres",
-    "message.validate.URL": "Adj meg egy érvényes URL-t!",
-    "message.validate.accept": "Please enter a value with a valid extension.",
-    "message.validate.creditcard": "Adj meg egy érvényes bankkártyaszámot!",
-    "message.validate.date": "Adj meg egy érvényes dátumot!",
-    "message.validate.date.ISO": "Adj meg egy érvényes (ISO) dátumot!",
-    "message.validate.digits": "Csak számjegyeket írj!",
-    "message.validate.email.address": "Adj meg egy érvényes e-mail címet!",
-    "message.validate.equalto": "Írd be ugyanazt az értéket újra!",
-    "message.validate.fieldrequired": "Ez a mező kötelező.",
-    "message.validate.fixfield": "Javítsd ki ez a mezőt!",
-    "message.validate.instance.name": "A példány neve nem lehet hosszabb 63 karakternél. Csak ASCII karakterek a-z és A-Z, számok 0-9 és kötőjelek engedélyezettek. Betűvel kell kezdődnie és betűvel vagy számmal kell végződnie[",
-    "message.validate.invalid.characters": "Érvénytelen karakter; kérlek javítsd!",
-    "message.validate.max": "Adj meg egy értéket, ami legfeljebb {0}!",
-    "message.validate.maxlength": "Legfeljebb {0} karaktert adj meg!",
-    "message.validate.minlength": "Legalább {0} karaktert adj meg!",
-    "message.validate.number": "Adj meg egy érvényes számot!",
-    "message.validate.range": "Adj meg egy értéket {0} és {1} között!",
-    "message.validate.range.length": "Adj meg egy {0} és {1} közötti hosszúságú értéket!",
-    "message.virtual.network.desc": "A dedicated virtualized network for your account.  The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router.",
-    "message.vm.create.template.confirm": "Sablon létrehozása automatikusan újraindítja a VM-et!",
-    "message.vm.review.launch": "Please review the following information and confirm that your virtual instance is correct before launch.",
-    "message.vnmc.available.list": "VNMC nem elérhető a szolgáltató listáról.",
-    "message.vnmc.not.available.list": "VNMC nem elérhető a szolgáltató listáról.",
-    "message.volume.create.template.confirm": "Please confirm that you wish to create a template for this disk volume.  Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.waiting.for.builtin.templates.to.load": "Várakozás a beépített sablonk betöltésére...",
-    "message.you.must.have.at.least.one.physical.network": "Szükséged van legalább egy fizikai hálózatra.",
-    "message.your.cloudstack.is.ready": "A CloudStack készen áll!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "A zóna létrehozása befejeződött. Szeretnéd bekapcsolni a zónát?",
-    "message.zone.no.network.selection": "A kiválasztott zónában nem választható ki hálózat.",
-    "message.zone.step.1.desc": "Válassz hálózat modellt a zónádnak!",
-    "message.zone.step.2.desc": "Add meg a következő információkat az új zónához",
-    "message.zone.step.3.desc": "Add meg a következő információkat az új pod-hoz",
-    "message.zoneWizard.enable.local.storage": "Figyelmeztetés: Ha bekapcsolod a helyi tárat ebben a zónában, akkor a következőt kell tenned attól függően, hogy hol szeretnéd elindítani a rendszer VM-eket: <br/><br/>1. Ha a rendszer VM-eknek osztott elsődleges táron kell futnia, akkor egy elosztott tárat kell létrehoznod a zóna létrejötte után. A zónát kikapcsolt állapotban kell elindítanod.<br/><br/>2. Ha a rendszer VM-eknek helyi elsődleges táron kell futni, akkor a system.vm.use.local.storage értékét true-ra kell állítani mielött a zónát bekapcsolod.<br/><br/><br/>Szeretnéd folytatni?",
-    "messgae.validate.min": "Adj meg egy értéket, ami legalább {0}!",
-    "mode": "Mód",
-    "network.rate": "Hálózati ráta",
-    "notification.reboot.instance": "Példány újraindítása",
-    "notification.start.instance": "Példány indítása",
-    "notification.stop.instance": "Példány leállítása",
-    "side.by.side": "Egymás mellett",
-    "state.Accepted": "Elfogadva",
-    "state.Active": "Aktív",
-    "state.Allocated": "Lekötöve",
-    "state.Allocating": "Lekötés folyamatban",
-    "state.BackedUp": "Lementve",
-    "state.BackingUp": "Mentés folyamatban",
-    "state.Completed": "Kész",
-    "state.Creating": "Készül",
-    "state.Declined": "Elromlott",
-    "state.Destroyed": "Törölt",
-    "state.Disabled": "Kikapcsolt",
-    "state.Enabled": "Engedélyezett",
-    "state.Error": "Hiba",
-    "state.Expunging": "Törlés alatt",
-    "state.Migrating": "Áthelyezés alatt",
-    "state.Pending": "Függ",
-    "state.Ready": "Készen áll",
-    "state.Running": "Fut",
-    "state.Starting": "Indul",
-    "state.Stopped": "Leállítva",
-    "state.Stopping": "Leállás folyamatban",
-    "state.Suspended": "Felfüggesztett",
-    "state.detached": "Lecsatolt",
-    "title.upload.volume": "Kötet feltöltése",
-    "ui.listView.filters.all": "Mind",
-    "ui.listView.filters.mine": "Saját"
-};
diff --git a/ui/legacy/l10n/it_IT.js b/ui/legacy/l10n/it_IT.js
deleted file mode 100644
index 37da3f9..0000000
--- a/ui/legacy/l10n/it_IT.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "Codice ICMP",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "Tipo ICMP",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Elementi delle proprietà modificati",
-    "confirm.enable.s3": "Si prega di inserire i valori richiesti per abilitare il supporto per il Secondary Storage di tipo S3",
-    "confirm.enable.swift": "Si prega di inserire i valori richiesti per abilitare il supporto per Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Errore non è possibile cambiare la tua password perchè LDAP è abilitato.",
-    "error.could.not.enable.zone": "Impossibile abilitare la zona",
-    "error.installWizard.message": "E' stato rilevato un errore: tornare agli step precedenti e correggere gli errori",
-    "error.invalid.username.password": "Username o Password non valida",
-    "error.login": "Le credenziali fornite per username/password non corrispondono a quelle nei nostri sistemi.",
-    "error.menu.select": "Impossibile effettuare operazioni senza aver selezionato alcun elemento.",
-    "error.mgmt.server.inaccessible": "Impossibile accedere al Management Server. Si prega di riprovare più tardi.",
-    "error.password.not.match": "I campi password non corrispondono",
-    "error.please.specify.physical.network.tags": "Le offerte di rete non sono disponibili se non si specificano tag per questa rete fisica.",
-    "error.session.expired": "La sessione è scaduta.",
-    "error.something.went.wrong.please.correct.the.following": "E' stato rilevato un errore; si prega di correggere quanto indicato di seguito",
-    "error.unable.to.reach.management.server": "Impossibile raggiungere il Management Server",
-    "error.unresolved.internet.name": "Il tuo nome internet non può essere risolto.",
-    "force.delete": "Forza la Cancellazione",
-    "force.delete.domain.warning": "Attenzione: La scelta di questa opzione provocherà la rimozione di tutti i sotto domini e agli account associati e alle loro risorse.",
-    "force.remove": "Forza la Rimozione",
-    "force.remove.host.warning": "Attenzione: La scelta di questa opzione provocherà l'arresto forzato di tutte le virtual machine da parte di CloudStack prima di rimuovere questo host dal cluster.",
-    "force.stop": "Forza l'Arresto",
-    "force.stop.instance.warning": "Attenzione: Forzare un arresto su questa instanza dovrebbe essere l'ultima opzione. C'è il rischio di perdita di dati e di un comportamento inconsistente dello stato della virtual machine.",
-    "hint.no.host.tags": "No host tags found",
-    "hint.no.storage.tags": "No storage tags found",
-    "hint.type.part.host.tag": "Type in part of a host tag",
-    "hint.type.part.storage.tag": "Type in part of a storage tag",
-    "image.directory": "Directory Immagine",
-    "inline": "Inline",
-    "instances.actions.reboot.label": "Riavviare una instanza",
-    "label.CIDR.list": "Lista CIDR",
-    "label.CIDR.of.destination.network": "Valore CIDR della rete di destinazione",
-    "label.CPU.cap": "Limite CPU",
-    "label.DHCP.server.type": "Tipo di DHCP Server",
-    "label.DNS.domain.for.guest.networks": "Dominio DNS per Reti Guest",
-    "label.ESP.encryption": "Encryption di ESP",
-    "label.ESP.hash": "Hash di ESP",
-    "label.ESP.lifetime": "ESP Lifetime (second)",
-    "label.ESP.policy": "Policy di ESP",
-    "label.IKE.DH": "DH di IKE",
-    "label.IKE.encryption": "Encryption di IKE",
-    "label.IKE.hash": "Hash di IKE",
-    "label.IKE.lifetime": "IKE lifetime (second)",
-    "label.IKE.policy": "Policy di IKE",
-    "label.IPsec.preshared.key": "Preshared-Key di IPsec",
-    "label.LB.isolation": "Isolamento di LB",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto Log Profile",
-    "label.PA.threat.profile": "Palo Alto Threat Profile",
-    "label.PING.CIFS.password": "PING CIFS password",
-    "label.PING.CIFS.username": "PING CIFS username",
-    "label.PING.dir": "PING Directory",
-    "label.PING.storage.IP": "PING storage IP",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Pxe Server Type",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Port",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP Directory",
-    "label.VMFS.datastore": "VMFS datastore",
-    "label.VMs.in.tier": "VM nei livelli",
-    "label.VPC.limits": "VPC limits",
-    "label.VPC.router.details": "Dettagli del router VPC",
-    "label.VPN.connection": "Connessione VPN",
-    "label.VPN.customer.gateway": "Gateway VPN del Cliente",
-    "label.VPN.gateway": "Gateway VPN",
-    "label.Xenserver.Tools.Version61plus": "Original XS Version is 6.1+",
-    "label.about": "About",
-    "label.about.app": "About CloudStack",
-    "label.accept.project.invitation": "Accettare un invito ad un progetto",
-    "label.account": "Account",
-    "label.account.and.security.group": "Account, Security group",
-    "label.account.details": "Account details",
-    "label.account.id": "ID dell'Account",
-    "label.account.lower": "account",
-    "label.account.name": "Nome Account",
-    "label.account.specific": "Specifico dell'Account",
-    "label.account.type": "Account Type",
-    "label.accounts": "Utenti",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL List Rules",
-    "label.acl.name": "ACL Name",
-    "label.acl.replaced": "ACL replaced",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Acquisizione nuovo indirizzo IP",
-    "label.acquire.new.secondary.ip": "Acquisizione nuovo IP secondario",
-    "label.action": "Action",
-    "label.action.attach.disk": "Collegamento di un Disco",
-    "label.action.attach.disk.processing": "Collegamento Disco in corso...",
-    "label.action.attach.iso": "Collegamento di una immagine ISO",
-    "label.action.attach.iso.processing": "Collegamento immagine ISO in corso...",
-    "label.action.cancel.maintenance.mode": "Annullamento dello stato di Maintenance Mode",
-    "label.action.cancel.maintenance.mode.processing": "Cancellazione dello stato Maintenance Mode in corso...",
-    "label.action.change.password": "Modifica della Password",
-    "label.action.change.service": "Modificare Servizio",
-    "label.action.change.service.processing": "Modifica del Servizio in corso...",
-    "label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
-    "label.action.copy.ISO": "Copia della immagine ISO",
-    "label.action.copy.ISO.processing": "Copia immagine ISO in corso...",
-    "label.action.copy.template": "Copia di un Template",
-    "label.action.copy.template.processing": "Copia di un Template in corso...",
-    "label.action.create.template": "Creazione Template",
-    "label.action.create.template.from.vm": "Creazione Template da una VM",
-    "label.action.create.template.from.volume": "Creazione Template da un Volume",
-    "label.action.create.template.processing": "Creazione Template in corso...",
-    "label.action.create.vm": "Creazione VM",
-    "label.action.create.vm.processing": "Creazione VM in corso...",
-    "label.action.create.volume": "Creazione Volume",
-    "label.action.create.volume.processing": "Creazione Volume in corso...",
-    "label.action.delete.IP.range": "Cancellazione intervallo indirizzi IP",
-    "label.action.delete.IP.range.processing": "Cancellazione intervallo indirizzi IP in corso....",
-    "label.action.delete.ISO": "Cancellazione immagine ISO",
-    "label.action.delete.ISO.processing": "Cancellazione immagine ISO in corso....",
-    "label.action.delete.account": "Cancellazione account",
-    "label.action.delete.account.processing": "Cancellazione account in corso....",
-    "label.action.delete.cluster": "Cancellazione Cluster",
-    "label.action.delete.cluster.processing": "Cancellazione Cluster in corso....",
-    "label.action.delete.disk.offering": "Cancellazione Offerta Disco",
-    "label.action.delete.disk.offering.processing": "Cancellazione Offerta Disco in corso....",
-    "label.action.delete.domain": "Cancellazione Dominio",
-    "label.action.delete.domain.processing": "Cancellazione Dominio in corso....",
-    "label.action.delete.firewall": "Cancellazione regola firewall",
-    "label.action.delete.firewall.processing": "Cancellazione Firewall in corso....",
-    "label.action.delete.ingress.rule": "Cancella Regola in Ingresso",
-    "label.action.delete.ingress.rule.processing": "Cancellazione della Regola in Ingresso in corso...",
-    "label.action.delete.load.balancer": "Cancellazione regola load balancer",
-    "label.action.delete.load.balancer.processing": "Cancellazione Load Balancer in corso....",
-    "label.action.delete.network": "Cancellazione Rete",
-    "label.action.delete.network.processing": "Cancellazione Rete in corso....",
-    "label.action.delete.nexusVswitch": "Cancellare Nexus 1000v",
-    "label.action.delete.nic": "Rimuovi NIC",
-    "label.action.delete.physical.network": "Cancellazione di una rete fisica",
-    "label.action.delete.pod": "Cancellazione Pod",
-    "label.action.delete.pod.processing": "Cancellazione Pod in corso....",
-    "label.action.delete.primary.storage": "Cancellazione Storage Primario",
-    "label.action.delete.primary.storage.processing": "Cancellazione Storage Primario in corso....",
-    "label.action.delete.secondary.storage": "Cancellazione Storage Secondario",
-    "label.action.delete.secondary.storage.processing": "Cancellazione Storage Secondario in corso....",
-    "label.action.delete.security.group": "Cancellazione Security Group",
-    "label.action.delete.security.group.processing": "Cancellazione Security Group in corso....",
-    "label.action.delete.service.offering": "Cancellazione Offerta di Servizio",
-    "label.action.delete.service.offering.processing": "Cancellazione Offerta di Servizio in corso....",
-    "label.action.delete.snapshot": "Cancellazione Snapshot",
-    "label.action.delete.snapshot.processing": "Cancellazione Snapshot in corso....",
-    "label.action.delete.system.service.offering": "Cancellare Offerta di Servizio di Sistema",
-    "label.action.delete.template": "Cancellazione Template",
-    "label.action.delete.template.processing": "Cancellazione Template in corso....",
-    "label.action.delete.user": "Cancellazione Utente",
-    "label.action.delete.user.processing": "Cancellazione Utente in corso....",
-    "label.action.delete.volume": "Cancellazione Volume",
-    "label.action.delete.volume.processing": "Cancellazione Volume in corso....",
-    "label.action.delete.zone": "Cancellazione Zona",
-    "label.action.delete.zone.processing": "Cancellazione Zona in corso....",
-    "label.action.destroy.instance": "Rimozione instanza",
-    "label.action.destroy.instance.processing": "Rimozione Instanza in corso....",
-    "label.action.destroy.systemvm": "Rimozione VM di sistema",
-    "label.action.destroy.systemvm.processing": "Rimozione VM di Sistema in corso....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Scollegamento di un Disco",
-    "label.action.detach.disk.processing": "Scollegamento Disco in corso....",
-    "label.action.detach.iso": "Scollegamento immagine ISO",
-    "label.action.detach.iso.processing": "Scollegamento immagine ISO in corso....",
-    "label.action.disable.account": "Disabilitazione account",
-    "label.action.disable.account.processing": "Disabilitazione account in corso....",
-    "label.action.disable.cluster": "Disabilitazione Cluster",
-    "label.action.disable.cluster.processing": "Disabilitazione Cluster in corso....",
-    "label.action.disable.nexusVswitch": "Disabilitare Nexus 1000v",
-    "label.action.disable.physical.network": "Disabilitare la rete fisica",
-    "label.action.disable.pod": "Disabilitazione Pod",
-    "label.action.disable.pod.processing": "Disabilitazione Pod in corso....",
-    "label.action.disable.static.NAT": "Disabilitazione NAT Statico",
-    "label.action.disable.static.NAT.processing": "Disabilitazione NAT Statico in corso....",
-    "label.action.disable.user": "Disabilitazione Utente",
-    "label.action.disable.user.processing": "Disabilitazione Utente in corso....",
-    "label.action.disable.zone": "Disabilitazione Zona",
-    "label.action.disable.zone.processing": "Disabilitazione Zona in corso....",
-    "label.action.download.ISO": "Download immagine ISO",
-    "label.action.download.template": "Download Template",
-    "label.action.download.volume": "Download Volume",
-    "label.action.download.volume.processing": "Download Volume in corso....",
-    "label.action.edit.ISO": "Modifica immagine ISO",
-    "label.action.edit.account": "Modifica account",
-    "label.action.edit.disk.offering": "Modifica Offerta Disco",
-    "label.action.edit.domain": "Modifica Dominio",
-    "label.action.edit.global.setting": "Modifica Impostazioni Globali",
-    "label.action.edit.host": "Modifica Host",
-    "label.action.edit.instance": "Modifica Instanza",
-    "label.action.edit.network": "Modifica Rete",
-    "label.action.edit.network.offering": "Modifica Offerta di Rete",
-    "label.action.edit.network.processing": "Modifica Rete in corso....",
-    "label.action.edit.pod": "Modifica Pod",
-    "label.action.edit.primary.storage": "Modifica Storage Primario",
-    "label.action.edit.resource.limits": "Modifica Limiti delle Risorse",
-    "label.action.edit.service.offering": "Modifica Offerta di Servizio",
-    "label.action.edit.template": "Modifica Template",
-    "label.action.edit.user": "Modifica Utente",
-    "label.action.edit.zone": "Modifica Zona",
-    "label.action.enable.account": "Abilitazione account",
-    "label.action.enable.account.processing": "Abilitazione account in corso....",
-    "label.action.enable.cluster": "Abilitazione Cluster",
-    "label.action.enable.cluster.processing": "Abilitazione Cluster in corso....",
-    "label.action.enable.maintenance.mode": "Abilitazione dello stato Maintenance Mode",
-    "label.action.enable.maintenance.mode.processing": "Abilitazione dello stato Maintenance Mode in corso....",
-    "label.action.enable.nexusVswitch": "Abilitare Nexus 1000v",
-    "label.action.enable.physical.network": "Abilitare la rete fisica",
-    "label.action.enable.pod": "Abilitazione Pod",
-    "label.action.enable.pod.processing": "Abilitazione Pod in corso....",
-    "label.action.enable.static.NAT": "Abilitazione NAT Statico",
-    "label.action.enable.static.NAT.processing": "Abilitazione NAT Statico in corso....",
-    "label.action.enable.user": "Abilitazione Utente",
-    "label.action.enable.user.processing": "Abilitazione Utente in corso....",
-    "label.action.enable.zone": "Abilitazione Zona",
-    "label.action.enable.zone.processing": "Abilitazione Zona in corso....",
-    "label.action.expunge.instance": "Cancellare l'Istanza",
-    "label.action.expunge.instance.processing": "Cancellazione dell'Istanza in corso...",
-    "label.action.force.reconnect": "Forza la Riconnessione",
-    "label.action.force.reconnect.processing": "Riconnessione in corso....",
-    "label.action.generate.keys": "Generazione Chiavi",
-    "label.action.generate.keys.processing": "Generazione Chiavi in corso....",
-    "label.action.list.nexusVswitch": "Elencare Nexus 1000v",
-    "label.action.lock.account": "Blocco di un account",
-    "label.action.lock.account.processing": "Blocco account in corso....",
-    "label.action.manage.cluster": "Gestione Cluster",
-    "label.action.manage.cluster.processing": "Gestione Cluster in corso....",
-    "label.action.migrate.instance": "Migrazione Instanza",
-    "label.action.migrate.instance.processing": "Migrazione Instanza in corso....",
-    "label.action.migrate.router": "Migrazione Router",
-    "label.action.migrate.router.processing": "Migrazione Router...",
-    "label.action.migrate.systemvm": "Migrazione VM di Systema",
-    "label.action.migrate.systemvm.processing": "Migrazione VM di Sistema in corso....",
-    "label.action.reboot.instance": "Riavvio Instanza",
-    "label.action.reboot.instance.processing": "Riavvio Instanza in corso....",
-    "label.action.reboot.router": "Riavvio Router",
-    "label.action.reboot.router.processing": "Riavvio Router in corso....",
-    "label.action.reboot.systemvm": "Riavvio VM di Sistema",
-    "label.action.reboot.systemvm.processing": "Riavvio VM di Sistema in corso....",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Snapshot Ricorrenti",
-    "label.action.register.iso": "Registrare una ISO",
-    "label.action.register.template": "Registra un Template da URL",
-    "label.action.release.ip": "Rilascio indirizzo IP",
-    "label.action.release.ip.processing": "Rilascio indirizzo IP in corso....",
-    "label.action.remove.host": "Rimozione Host",
-    "label.action.remove.host.processing": "Rimozione Host in corso....",
-    "label.action.reset.password": "Reset Password",
-    "label.action.reset.password.processing": "Reset della Password in corso....",
-    "label.action.resize.volume": "Ridimensionamento Volume",
-    "label.action.resize.volume.processing": "Ridimensionamento Volume in corso....",
-    "label.action.resource.limits": "Limiti delle Risorse",
-    "label.action.restore.instance": "Restore Instanza",
-    "label.action.restore.instance.processing": "Restore dell'Instanza in corso....",
-    "label.action.revert.snapshot": "Ripristinare lo Snapshot",
-    "label.action.revert.snapshot.processing": "Ripristino dello Snapshot in corso...",
-    "label.action.start.instance": "Avvio Instanza",
-    "label.action.start.instance.processing": "Avvio Instanza in corso....",
-    "label.action.start.router": "Avvio Router",
-    "label.action.start.router.processing": "Avvio Router in corso....",
-    "label.action.start.systemvm": "Avvio VM di Sistema",
-    "label.action.start.systemvm.processing": "Avvio VM di Sistema in corso....",
-    "label.action.stop.instance": "Arresto Instanza",
-    "label.action.stop.instance.processing": "Arresto Instanza in corso....",
-    "label.action.stop.router": "Arresto Router",
-    "label.action.stop.router.processing": "Arresto Router in corso....",
-    "label.action.stop.systemvm": "Arresto VM di Sistema",
-    "label.action.stop.systemvm.processing": "Arresto VM di Sistema in corso....",
-    "label.action.take.snapshot": "Cattura uno Snapshot",
-    "label.action.take.snapshot.processing": "Esecuzione di Snapshot in corso....",
-    "label.action.unmanage.cluster": "Unmanage Cluster",
-    "label.action.unmanage.cluster.processing": "Unmanaging Cluster....",
-    "label.action.update.OS.preference": "Aggiornamento Preferenze OS",
-    "label.action.update.OS.preference.processing": "Aggiornamento preferenze OS in corso....",
-    "label.action.update.resource.count": "Aggiornare il conteggio delle Risorse",
-    "label.action.update.resource.count.processing": "Aggiornamento del conteggio delle Risorse in corso...",
-    "label.action.vmsnapshot.create": "Cattura uno Snapshot della VM",
-    "label.action.vmsnapshot.delete": "Cancella lo Snapshot della VM",
-    "label.action.vmsnapshot.revert": "Ripristinare lo snapshot della VM",
-    "label.actions": "Azioni",
-    "label.activate.project": "Attivare il Progetto",
-    "label.active.sessions": "Sessioni Attive",
-    "label.add": "Add",
-    "label.add.ACL": "Aggiungere ACL",
-    "label.add.BigSwitchBcf.device": "Aggiungere Controller BigSwitch BCF",
-    "label.add.BrocadeVcs.device": "Aggiungere Switch Brocade Vcs",
-    "label.add.F5.device": "Aggiungere device F5",
-    "label.add.LDAP.account": "Add LDAP Account",
-    "label.add.NiciraNvp.device": "Aggiungere Controller Nvp",
-    "label.add.OpenDaylight.device": "Add OpenDaylight Controller",
-    "label.add.PA.device": "Aggiungere un device Palo Alto",
-    "label.add.SRX.device": "Aggiungere device SRX",
-    "label.add.VM.to.tier": "Aggiungere una VM al livello",
-    "label.add.VPN.gateway": "Aggiungere un Gateway VPN",
-    "label.add.account": "Aggiungi un Account",
-    "label.add.account.to.project": "Aggiungere account al progetto",
-    "label.add.accounts": "Aggiungere utenti",
-    "label.add.accounts.to": "Aggiungere utenti a",
-    "label.add.acl.list": "Add ACL List",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Aggiungere un nuovo gruppo di affinità",
-    "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
-    "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
-    "label.add.by": "Add by",
-    "label.add.by.cidr": "Aggiungere da CIDR",
-    "label.add.by.group": "Add By Group",
-    "label.add.ciscoASA1000v": "Add CiscoASA1000v Resource",
-    "label.add.cluster": "Aggiunta Cluster",
-    "label.add.compute.offering": "Aggiungere una offerta computazionale",
-    "label.add.direct.iprange": "Add Direct Ip Range",
-    "label.add.disk.offering": "Aggiungere Offerta Disco",
-    "label.add.domain": "Aggiunta Dominio",
-    "label.add.egress.rule": "Aggiungere una regola d'uscita",
-    "label.add.firewall": "Aggiunta regola firewall",
-    "label.add.globo.dns": "Add GloboDNS",
-    "label.add.gslb": "Add GSLB",
-    "label.add.guest.network": "Aggiungere una rete guest",
-    "label.add.host": "Aggiunta Host",
-    "label.add.ingress.rule": "Add Ingress Rule",
-    "label.add.intermediate.certificate": "Aggiungere un certificato intermedio",
-    "label.add.internal.lb": "Add Internal LB",
-    "label.add.ip.range": "Aggiungere un IP Range",
-    "label.add.isolated.guest.network": "Add Isolated Guest Network",
-    "label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
-    "label.add.isolated.network": "Add Isolated Network",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Aggiungi un account LDAP",
-    "label.add.list.name": "ACL List Name",
-    "label.add.load.balancer": "Aggiungere un Load Balancer",
-    "label.add.more": "Add More",
-    "label.add.netScaler.device": "Aggiungere device Netscaler",
-    "label.add.network": "Aggiungere una Rete",
-    "label.add.network.ACL": "Aggiungere le ACL di rete",
-    "label.add.network.acl.list": "Add Network ACL List",
-    "label.add.network.device": "Aggiungere un Dispositivo di Rete",
-    "label.add.network.offering": "Aggiungere offerta di rete",
-    "label.add.new.F5": "Aggiungere nuovo F5",
-    "label.add.new.NetScaler": "Aggiungere nuovo NetScaler",
-    "label.add.new.PA": "Aggiungere un nuovo Palo Alto",
-    "label.add.new.SRX": "Aggiungere nuovo SRX",
-    "label.add.new.gateway": "Aggiungere un nuovo gateway",
-    "label.add.new.tier": "Aggiungere un nuovo livello",
-    "label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
-    "label.add.physical.network": "Aggiungere rete fisica",
-    "label.add.pod": "Aggiungere un Pod",
-    "label.add.port.forwarding.rule": "Aggiungere una regola di port forwarding",
-    "label.add.portable.ip.range": "Add Portable IP Range",
-    "label.add.primary.storage": "Aggiungere uno Storage Primario",
-    "label.add.private.gateway": "Add Private Gateway",
-    "label.add.region": "Aggiungere una Regione",
-    "label.add.resources": "Aggiungere Risorse",
-    "label.add.role": "Add Role",
-    "label.add.route": "Aggiungere una rotta",
-    "label.add.rule": "Aggiungere regola",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Aggiungere uno Storage Secondario",
-    "label.add.security.group": "Aggiungere un Gruppo di Sicurezza",
-    "label.add.service.offering": "Aggiungere un'Offerta di Servizio",
-    "label.add.static.nat.rule": "Aggiungere regola di NAT statico",
-    "label.add.static.route": "Aggiungere una rotta statica",
-    "label.add.system.service.offering": "Aggiungere Offerte di Servizio di Sistema",
-    "label.add.template": "Aggiungere un Template",
-    "label.add.to.group": "Aggiungere al gruppo",
-    "label.add.ucs.manager": "Add UCS Manager",
-    "label.add.user": "Aggiungere un Utente",
-    "label.add.userdata": "Userdata",
-    "label.add.vlan": "Aggiungere una VLAN",
-    "label.add.vm": "Aggiungere VM",
-    "label.add.vms": "Aggiunvere VM",
-    "label.add.vms.to.lb": "Aggiungere VM a regola di bilanciamento di carico",
-    "label.add.vmware.datacenter": "Add VMware datacenter",
-    "label.add.vnmc.device": "Add VNMC device",
-    "label.add.vnmc.provider": "Add VNMC provider",
-    "label.add.volume": "Aggiungere un Volume",
-    "label.add.vpc": "Aggiungere VPC",
-    "label.add.vpc.offering": "Add VPC Offering",
-    "label.add.vpn.customer.gateway": "Aggiungere Gateway VPN del Cliente",
-    "label.add.vpn.user": "Aggiungere utente VPN",
-    "label.add.vxlan": "Aggiungere una VXLAN",
-    "label.add.zone": "Aggiungere una Zona",
-    "label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
-    "label.added.network.offering": "Added network offering",
-    "label.added.new.bigswitch.bcf.controller": "Added new BigSwitch BCF Controller",
-    "label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
-    "label.addes.new.f5": "Added new F5",
-    "label.adding": "Aggiunta",
-    "label.adding.cluster": "Aggiunta del Cluster",
-    "label.adding.failed": "Aggiunta Fallita",
-    "label.adding.pod": "Aggiuta del Pod",
-    "label.adding.processing": "Aggiunta in corso...",
-    "label.adding.succeeded": "Aggiunta avvenuta",
-    "label.adding.user": "Aggiunta dell'Utente",
-    "label.adding.zone": "Aggiunta della Zona",
-    "label.additional.networks": "Network Aggiuntivi",
-    "label.admin": "Amministratore",
-    "label.admin.accounts": "Account Amministrativi",
-    "label.advanced": "Avanzato",
-    "label.advanced.mode": "Modalità Avanzata",
-    "label.advanced.search": "Ricerca Avanzata",
-    "label.affinity": "Affinità",
-    "label.affinity.group": "Gruppo di Affinità",
-    "label.affinity.groups": "Gruppi di Affinità",
-    "label.agent.password": "Password per l'Agent",
-    "label.agent.port": "Agent Port",
-    "label.agent.state": "Agent State",
-    "label.agent.username": "Username per l'Agent",
-    "label.agree": "Agree",
-    "label.alert": "Allarme",
-    "label.alert.archived": "Alert Archived",
-    "label.alert.deleted": "Alert Deleted",
-    "label.alert.details": "Alert details",
-    "label.algorithm": "Algoritmo",
-    "label.allocated": "Allocato",
-    "label.allocation.state": "Allocation State",
-    "label.allow": "Allow",
-    "label.anti.affinity": "Anti-affinità",
-    "label.anti.affinity.group": "Anti-affinity Group",
-    "label.anti.affinity.groups": "Anti-affinity Groups",
-    "label.api.key": "Chiave API",
-    "label.api.version": "Versione API",
-    "label.app.name": "CloudStack",
-    "label.apply": "Applicare",
-    "label.archive": "Archive",
-    "label.archive.alerts": "Archivia allarmi",
-    "label.archive.events": "Archivia eventi",
-    "label.assign": "Assign",
-    "label.assign.instance.another": "Assign Instance to Another Account",
-    "label.assign.to.load.balancer": "Assigning instance to load balancer",
-    "label.assign.vms": "Assign VMs",
-    "label.assigned.vms": "Assigned VMs",
-    "label.associate.public.ip": "Associate Public IP",
-    "label.associated.network": "Rete Associata",
-    "label.associated.network.id": "Associated Network ID",
-    "label.associated.profile": "Associated Profile",
-    "label.attached.iso": "ISO Collegata",
-    "label.author.email": "Author e-mail",
-    "label.author.name": "Author name",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
-    "label.availability": "Availability",
-    "label.availability.zone": "Availability Zone",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "Disponibile",
-    "label.available.public.ips": "Indirizzi IP Pubblici Disponibili",
-    "label.back": "Indietro",
-    "label.bandwidth": "Capacità della banda (Bandwidth)",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP Devices",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP Provider",
-    "label.baremetal.pxe.device": "Add Baremetal PXE Device",
-    "label.baremetal.pxe.devices": "Baremetal PXE Devices",
-    "label.baremetal.pxe.provider": "Baremetal PXE Provider",
-    "label.baremetal.rack.configuration": "Baremetal Rack Configuration",
-    "label.basic": "Basic",
-    "label.basic.mode": "Modalità Base",
-    "label.bigswitch.bcf.details": "BigSwitch BCF details",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT Enabled",
-    "label.bigswitch.controller.address": "Indirizzo Controller BigSwitch BCF",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "Avviabile",
-    "label.broadcast.domain.range": "Broadcast domain range",
-    "label.broadcast.domain.type": "Broadcast Domain Type",
-    "label.broadcast.uri": "URI di Broadcast",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "URI di Broadcast",
-    "label.brocade.vcs.address": "Vcs Switch Address",
-    "label.brocade.vcs.details": "Brocade Vcs Switch details",
-    "label.by.account": "By Account",
-    "label.by.alert.type": "Per tipo di allarme",
-    "label.by.availability": "By Availability",
-    "label.by.date.end": "Per data (fino a)",
-    "label.by.date.start": "Per data (da)",
-    "label.by.domain": "By Domain",
-    "label.by.end.date": "By End Date",
-    "label.by.event.type": "Per tipo di evento",
-    "label.by.level": "By Level",
-    "label.by.pod": "By Pod",
-    "label.by.role": "By Role",
-    "label.by.start.date": "By Start Date",
-    "label.by.state": "By State",
-    "label.by.traffic.type": "By Traffic Type",
-    "label.by.type": "By Type",
-    "label.by.type.id": "By Type ID",
-    "label.by.zone": "By Zone",
-    "label.bytes.received": "Byte Ricevuti",
-    "label.bytes.sent": "Byte Inviati",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "Annulla",
-    "label.capacity": "Capacità",
-    "label.capacity.bytes": "Capacità Byte",
-    "label.capacity.iops": "Capacità IOPS",
-    "label.certificate": "Certificato",
-    "label.change.affinity": "Change Affinity",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "Modificare offerta di servizio",
-    "label.change.value": "Modifica il valore",
-    "label.character": "Carattere",
-    "label.chassis": "Chassis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR or Account/Security Group",
-    "label.cidr.list": "Source CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Address",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Password",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Username",
-    "label.ciscovnmc.resource.details": "CiscoVNMC resource details",
-    "label.clean.up": "Clean up",
-    "label.clear.list": "Pulizia dell'elenco",
-    "label.close": "Chiudi",
-    "label.cloud.console": "Console di Gestione Cloud",
-    "label.cloud.managed": "Cloud.com Managed",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Nome del Cluster",
-    "label.cluster.type": "Tipo di Cluster",
-    "label.clusters": "Cluster",
-    "label.clvm": "CLVM",
-    "label.code": "Codice",
-    "label.community": "Community",
-    "label.compute": "Computazionale",
-    "label.compute.and.storage": "Computazione e Storage",
-    "label.compute.offering": "Offerta computazionale",
-    "label.compute.offerings": "Compute Offerings",
-    "label.configuration": "Configurazione",
-    "label.configure": "Configurare",
-    "label.configure.ldap": "Configura LDAP",
-    "label.configure.network.ACLs": "Configurare le ACL di rete",
-    "label.configure.sticky.policy": "Configure Sticky Policy",
-    "label.configure.vpc": "Configurare VPC",
-    "label.confirm.password": "Confermare la password",
-    "label.confirmation": "Conferma",
-    "label.congratulations": "Congratulazioni!",
-    "label.conserve.mode": "Conserve mode",
-    "label.console.proxy": "Proxy di Console",
-    "label.console.proxy.vm": "Console Proxy VM",
-    "label.continue": "Continuare",
-    "label.continue.basic.install": "Proseguire con l'installazione di base",
-    "label.copying.iso": "Copying ISO",
-    "label.corrections.saved": "Salvataggio correzioni effettuato",
-    "label.counter": "Counter",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU Allocate",
-    "label.cpu.allocated.for.VMs": "CPU Allocate per VM",
-    "label.cpu.limits": "Limiti CPU",
-    "label.cpu.mhz": "CPU (in MHz)",
-    "label.cpu.utilized": "CPU Utilizzata",
-    "label.create.VPN.connection": "Creare una Connessione VPN",
-    "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
-    "label.create.nfs.secondary.staging.store": "Create NFS secondary staging store",
-    "label.create.project": "Creare un progetto",
-    "label.create.ssh.key.pair": "Create a SSH Key Pair",
-    "label.create.template": "Creare un template",
-    "label.created": "Creato",
-    "label.created.by.system": "Creato dal sistema",
-    "label.cross.zones": "Cross Zones",
-    "label.custom": "Custom",
-    "label.custom.disk.iops": "Custom IOPS",
-    "label.custom.disk.offering": "Custom Disk Offering",
-    "label.custom.disk.size": "Dimensione Disco Personalizzata",
-    "label.daily": "Quotidiano",
-    "label.data.disk.offering": "Data Disk Offering",
-    "label.date": "Data",
-    "label.day": "Day",
-    "label.day.of.month": "Giorno del Mese",
-    "label.day.of.week": "Giorno della Settimana",
-    "label.dc.name": "DC Name",
-    "label.dead.peer.detection": "Dead Peer Detection",
-    "label.decline.invitation": "Declinare un invito",
-    "label.dedicate": "Dedicate",
-    "label.dedicate.cluster": "Dedicate Cluster",
-    "label.dedicate.host": "Dedicate Host",
-    "label.dedicate.pod": "Dedicate Pod",
-    "label.dedicate.vlan.vni.range": "Dedicate VLAN/VNI Range",
-    "label.dedicate.zone": "Dedicate Zone",
-    "label.dedicated": "Dedicato",
-    "label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
-    "label.default": "Default",
-    "label.default.egress.policy": "Default egress policy",
-    "label.default.use": "Default Use",
-    "label.default.view": "Vista di default",
-    "label.delete": "Cancellare",
-    "label.delete.BigSwitchBcf": "Rimuovere Controller BigSwitch BCF",
-    "label.delete.BrocadeVcs": "Remove Brocade Vcs Switch",
-    "label.delete.F5": "Rimozione F5",
-    "label.delete.NetScaler": "Rimozione NetScaler",
-    "label.delete.NiciraNvp": "Rimuovere Controller Nvp",
-    "label.delete.OpenDaylight.device": "Delete OpenDaylight Controller",
-    "label.delete.PA": "Cancellare Palo Alto",
-    "label.delete.SRX": "Rimozione SRX",
-    "label.delete.VPN.connection": "cancellare la connessione VPN",
-    "label.delete.VPN.customer.gateway": "cancellare il Gateway VPN del Cliente",
-    "label.delete.VPN.gateway": "cancellare un Gateway VPN",
-    "label.delete.acl.list": "Delete ACL List",
-    "label.delete.affinity.group": "Cancellare Gruppo di Affinità",
-    "label.delete.alerts": "Cancella allarmi",
-    "label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
-    "label.delete.ciscoASA1000v": "Delete CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
-    "label.delete.events": "Cancella eventi",
-    "label.delete.gateway": "Rimuovere il gateway",
-    "label.delete.internal.lb": "Delete Internal LB",
-    "label.delete.portable.ip.range": "Delete Portable IP Range",
-    "label.delete.profile": "Delete Profile",
-    "label.delete.project": "Cancellare progetto",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Delete Secondary Staging Store",
-    "label.delete.ucs.manager": "Delete UCS Manager",
-    "label.delete.vpn.user": "Cancellare utente VPN",
-    "label.deleting.failed": "Cancellazione Fallita",
-    "label.deleting.processing": "Cancellazione in corso...",
-    "label.deny": "Deny",
-    "label.deployment.planner": "Deployment planner",
-    "label.description": "Descrizione",
-    "label.destination.physical.network.id": "ID della rete fisica di destinazione",
-    "label.destination.zone": "Zona di destinazione",
-    "label.destroy": "Distruggere",
-    "label.destroy.router": "Distruggere il router",
-    "label.destroy.vm.graceperiod": "Destroy VM Grace Period",
-    "label.detaching.disk": "Scollegamento Disco",
-    "label.details": "Dettagli",
-    "label.device.id": "ID Dispositivo",
-    "label.devices": "Device",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direct Attached Public IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Indirizzi IP di Rete condivisi",
-    "label.disable.autoscale": "Disable Autoscale",
-    "label.disable.host": "Disable Host",
-    "label.disable.network.offering": "Disable network offering",
-    "label.disable.provider": "Disabilitare il provider",
-    "label.disable.vnmc.provider": "Disable VNMC provider",
-    "label.disable.vpc.offering": "Disable VPC offering",
-    "label.disable.vpn": "Disabilitare VPN",
-    "label.disabled": "Disabilitato",
-    "label.disabling.vpn.access": "Disabilitare VPN",
-    "label.disassociate.profile.blade": "Disassociate Profile from Blade",
-    "label.disbale.vnmc.device": "Disable VNMC device",
-    "label.disk.allocated": "Disk Allocated",
-    "label.disk.bytes.read.rate": "Disk Read Rate (BPS)",
-    "label.disk.bytes.write.rate": "Disk Write Rate (BPS)",
-    "label.disk.iops.max": "Max IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Disk Read Rate (IOPS)",
-    "label.disk.iops.total": "IOPS Totali",
-    "label.disk.iops.write.rate": "Disk Write Rate (IOPS)",
-    "label.disk.offering": "Offerta Disco",
-    "label.disk.offering.details": "Disk offering details",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Tipo di Provisioning",
-    "label.disk.read.bytes": "Disk Read (Bytes)",
-    "label.disk.read.io": "Disk Read (IO)",
-    "label.disk.size": "Disk Size",
-    "label.disk.size.gb": "Disk Size (in GB)",
-    "label.disk.total": "Disk Total",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Disk Volume",
-    "label.disk.write.bytes": "Disk Write (Bytes)",
-    "label.disk.write.io": "Disk Write (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Display Name",
-    "label.display.text": "Display Text",
-    "label.distributedrouter": "Distributed Router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Dominio",
-    "label.domain.admin": "Amministratore di Dominio",
-    "label.domain.details": "Domain details",
-    "label.domain.id": "ID del Dominio",
-    "label.domain.lower": "domain",
-    "label.domain.name": "Nome del Dominio",
-    "label.domain.router": "Router di Dominio",
-    "label.domain.suffix": "Suffisso DNS (es. xyz.com)",
-    "label.done": "Fatto",
-    "label.double.quotes.are.not.allowed": "Doppi apici non consentiti",
-    "label.download.progress": "Avanzamento del Download",
-    "label.drag.new.position": "Trascina nella nuova posizione",
-    "label.duration.in.sec": "Duration (in sec)",
-    "label.dynamically.scalable": "Dynamically Scalable",
-    "label.edit": "Modifica",
-    "label.edit.acl.rule": "Edit ACL rule",
-    "label.edit.affinity.group": "Edit Affinity Group",
-    "label.edit.lb.rule": "Modifica regola LB",
-    "label.edit.network.details": "Modificare le impostazioni di rete",
-    "label.edit.project.details": "Modificare i dettagli del progetto",
-    "label.edit.region": "Edit Region",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Edit rule",
-    "label.edit.secondary.ips": "Modifica IP Secondari",
-    "label.edit.tags": "Modifica dei tag",
-    "label.edit.traffic.type": "Modifica del tipo di traffico",
-    "label.edit.vpc": "Modificare VPC",
-    "label.egress.default.policy": "Egress Default Policy",
-    "label.egress.rule": "Regola d'uscita",
-    "label.egress.rules": "Regole d'uscita",
-    "label.elastic": "Elastic",
-    "label.elastic.IP": "Elastic IP",
-    "label.elastic.LB": "Elastic LB",
-    "label.email": "Email",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Enable Autoscale",
-    "label.enable.host": "Enable Host",
-    "label.enable.network.offering": "Enable network offering",
-    "label.enable.provider": "Abilitare il provider",
-    "label.enable.s3": "Abilitare il Secondary Storage di tipo S3",
-    "label.enable.swift": "Abilitare Swift",
-    "label.enable.vnmc.device": "Enable VNMC device",
-    "label.enable.vnmc.provider": "Enable VNMC provider",
-    "label.enable.vpc.offering": "Enable VPC offering",
-    "label.enable.vpn": "Abilitare VPN",
-    "label.enabling.vpn": "Abilitazione della VPN",
-    "label.enabling.vpn.access": "Abilitazione dell'Accesso VPN",
-    "label.end.IP": "Indirizzo IP finale",
-    "label.end.port": "End Port",
-    "label.end.reserved.system.IP": "Indirizzo IP finale riservato di sistema",
-    "label.end.vlan": "End VLAN",
-    "label.end.vxlan": "End VXLAN",
-    "label.endpoint": "Dispositivo",
-    "label.endpoint.or.operation": "Endpoint or Operation",
-    "label.enter.token": "Inserire il token",
-    "label.error": "Errore",
-    "label.error.code": "Error Code",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX/ESXi Host",
-    "label.event": "Event",
-    "label.event.archived": "Event Archived",
-    "label.event.deleted": "Event Deleted",
-    "label.every": "Every",
-    "label.example": "Esempio",
-    "label.expunge": "Expunge",
-    "label.external.link": "Link Esterno",
-    "label.extractable": "Estraibile",
-    "label.extractable.lower": "extractable",
-    "label.f5": "F5",
-    "label.f5.details": "F5 details",
-    "label.failed": "Errore",
-    "label.featured": "Featured",
-    "label.fetch.latest": "Fetch latest",
-    "label.filterBy": "Filter by",
-    "label.fingerprint": "FingerPrint",
-    "label.firewall": "Firewall",
-    "label.first.name": "Nome",
-    "label.firstname.lower": "firstname",
-    "label.format": "Formato",
-    "label.format.lower": "format",
-    "label.friday": "Venerdì",
-    "label.full": "Completo",
-    "label.full.path": "Path completo",
-    "label.gateway": "Gateway",
-    "label.general.alerts": "General Alerts",
-    "label.generating.url": "Generating URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS Configuration",
-    "label.gluster.volume": "Volume",
-    "label.go.step.2": "Go to Step 2",
-    "label.go.step.3": "Go to Step 3",
-    "label.go.step.4": "Go to Step 4",
-    "label.go.step.5": "Go to Step 5",
-    "label.gpu": "GPU",
-    "label.group": "Group",
-    "label.group.by.account": "Group by account",
-    "label.group.by.cluster": "Group by cluster",
-    "label.group.by.pod": "Group by pod",
-    "label.group.by.zone": "Group by zone",
-    "label.group.optional": "Group (Optional)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Assigned load balancing",
-    "label.gslb.assigned.lb.more": "Assign more load balancing",
-    "label.gslb.delete": "Delete GSLB",
-    "label.gslb.details": "GSLB details",
-    "label.gslb.domain.name": "GSLB Domain Name",
-    "label.gslb.lb.details": "Load balancing details",
-    "label.gslb.lb.remove": "Remove load balancing from this GSLB",
-    "label.gslb.lb.rule": "Load balancing rule",
-    "label.gslb.service": "GSLB service",
-    "label.gslb.service.private.ip": "GSLB service Private IP",
-    "label.gslb.service.public.ip": "GSLB service Public IP",
-    "label.gslb.servicetype": "Service Type",
-    "label.guest": "Guest",
-    "label.guest.cidr": "Guest CIDR",
-    "label.guest.end.ip": "Indirizzo IP guest finale",
-    "label.guest.gateway": "Guest Gateway",
-    "label.guest.ip": "Guest IP Address",
-    "label.guest.ip.range": "Guest IP Range",
-    "label.guest.netmask": "Guest Netmask",
-    "label.guest.network.details": "Guest network details",
-    "label.guest.networks": "Reti guest",
-    "label.guest.start.ip": "Indirizzo IP guest iniziale",
-    "label.guest.traffic": "Traffico della rete Guest",
-    "label.guest.traffic.vswitch.name": "Guest Traffic vSwitch Name",
-    "label.guest.traffic.vswitch.type": "Guest Traffic vSwitch Type",
-    "label.guest.type": "Tipo di Guest",
-    "label.ha.enabled": "HA Enabled",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "Advanced Options:",
-    "label.health.check.configurations.options": "Configuration Options:",
-    "label.health.check.interval.in.sec": "Health Check Interval (in sec)",
-    "label.health.check.message.desc": "Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check",
-    "label.health.check.wizard": "Health Check Wizard",
-    "label.healthy.threshold": "Healthy Threshold",
-    "label.help": "Help",
-    "label.hide.ingress.rule": "Hide Ingress Rule",
-    "label.hints": "Suggerimenti",
-    "label.home": "Home",
-    "label.host": "Host",
-    "label.host.MAC": "MAC del sistema host",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Host Name",
-    "label.host.tag": "Host Tag",
-    "label.host.tags": "Host Tags",
-    "label.hosts": "Hosts",
-    "label.hourly": "Hourly",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Traffic Label",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Funzionalità del Hypervisor",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Snapshot Reserve",
-    "label.hypervisor.type": "Hypervisor Type",
-    "label.hypervisor.version": "Versione hypervisor",
-    "label.hypervisors": "Hypervisor",
-    "label.id": "ID",
-    "label.info": "Info",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Ingress Rule",
-    "label.initiated.by": "Initiated By",
-    "label.inside.port.profile": "Inside Port Profile",
-    "label.installWizard.addClusterIntro.subtitle": "Che cosa è un cluster?",
-    "label.installWizard.addClusterIntro.title": "Let&rsquo;s aggiungere un cluster",
-    "label.installWizard.addHostIntro.subtitle": "Che cosa è un host?",
-    "label.installWizard.addHostIntro.title": "Let&rsquo;s aggiungere un host",
-    "label.installWizard.addPodIntro.subtitle": "Che cosa è un pod?",
-    "label.installWizard.addPodIntro.title": "Let&rsquo;s aggiungere un pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Che cosa è un primary storage?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Let&rsquo;s aggiungere primary storage",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Che cosa è un secondary storage?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Let&rsquo;s aggiungere secondary storage",
-    "label.installWizard.addZone.title": "Aggiungere una zona",
-    "label.installWizard.addZoneIntro.subtitle": "Che cosa è una zona?",
-    "label.installWizard.addZoneIntro.title": "Let&rsquo;s aggiungere una zone",
-    "label.installWizard.click.launch": "Fare click sul pulsante di avvio.",
-    "label.installWizard.subtitle": "Questa guida fornisce supporto nelle attività di configurazione di una installazione CloudStack&#8482",
-    "label.installWizard.title": "Ciao e Benvenuti nel mondo di CloudStack&#8482",
-    "label.instance": "Istanza",
-    "label.instance.limits": "Limiti dell'Istanza",
-    "label.instance.name": "Nome dell'Istanza",
-    "label.instance.port": "Instance Port",
-    "label.instance.scaled.up": "Instance scaled to the requested offering",
-    "label.instances": "Istanze",
-    "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-    "label.intermediate.certificate": "Intermediate certificate {0}",
-    "label.internal.dns.1": "DNS 1 Interno",
-    "label.internal.dns.2": "DNS2 Interno",
-    "label.internal.lb": "Internal LB",
-    "label.internal.lb.details": "Internal LB details",
-    "label.internal.name": "Nome Interno",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Interval Type",
-    "label.introduction.to.cloudstack": "Introduzione a CloudStack&#8482",
-    "label.invalid.integer": "Invalid Integer",
-    "label.invalid.number": "Invalid Number",
-    "label.invitations": "Inviti",
-    "label.invite": "Invito",
-    "label.invite.to": "Invito a",
-    "label.invited.accounts": "Utenti invitati",
-    "label.ip": "Indirizzo IP",
-    "label.ip.address": "Indirizzo IP",
-    "label.ip.allocations": "IP Allocations",
-    "label.ip.limits": "Public IP Limits",
-    "label.ip.or.fqdn": "IP o FQDN",
-    "label.ip.range": "IP Range",
-    "label.ip.ranges": "Intervalli di indirizzi IP",
-    "label.ipaddress": "Indirizzo IP",
-    "label.ips": "Indirizzi IP",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 End IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 Netmask",
-    "label.ipv4.start.ip": "IPv4 Start IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Address",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 End IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Start IP",
-    "label.is.default": "E' Default",
-    "label.is.redundant.router": "Redundant",
-    "label.is.shared": "E' Condiviso",
-    "label.is.system": "Is System",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO Boot",
-    "label.isolated.networks": "Reti isolate",
-    "label.isolation.method": "Metodo di isolamento",
-    "label.isolation.mode": "Modalità di Isolamento",
-    "label.isolation.uri": "URI di isolamento",
-    "label.item.listing": "Item listing",
-    "label.japanese.keyboard": "Japanese keyboard",
-    "label.keep": "Keep",
-    "label.keep.colon": "Keep:",
-    "label.key": "Key",
-    "label.keyboard.language": "Keyboard language",
-    "label.keyboard.type": "Tipo di tastiera",
-    "label.kvm.traffic.label": "Etichetta del traffico via KVM",
-    "label.label": "Label",
-    "label.lang.arabic": "Arabo",
-    "label.lang.brportugese": "Brazilian Portugese",
-    "label.lang.catalan": "Catalan",
-    "label.lang.chinese": "Chinese (Simplified)",
-    "label.lang.dutch": "Dutch (Netherlands)",
-    "label.lang.english": "Inglese",
-    "label.lang.french": "French",
-    "label.lang.german": "German",
-    "label.lang.hungarian": "Hungarian",
-    "label.lang.italian": "Italian",
-    "label.lang.japanese": "Japanese",
-    "label.lang.korean": "Korean",
-    "label.lang.norwegian": "Norwegian",
-    "label.lang.polish": "Polish",
-    "label.lang.russian": "Russian",
-    "label.lang.spanish": "Spanish",
-    "label.last.disconnected": "Last Disconnected",
-    "label.last.name": "Last Name",
-    "label.lastname.lower": "lastname",
-    "label.latest.events": "Ultimi eventi",
-    "label.launch": "Avvio",
-    "label.launch.vm": "Avviare una VM",
-    "label.launch.zone": "Launch zone",
-    "label.lb.algorithm.leastconn": "Least connections",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "Sorgente",
-    "label.ldap.configuration": "Configurazione LDAP",
-    "label.ldap.group.name": "LDAP Group",
-    "label.ldap.link.type": "Type",
-    "label.ldap.port": "Porta LDAP",
-    "label.level": "Livello",
-    "label.link.domain.to.ldap": "Link Domain to LDAP",
-    "label.linklocal.ip": "Link Local IP Address",
-    "label.load.balancer": "Load Balancer",
-    "label.load.balancer.type": "Load Balancer Type",
-    "label.load.balancing": "Bilanciamento di Carico",
-    "label.load.balancing.policies": "Politiche di Bilanciamento di Carico",
-    "label.loading": "Loading",
-    "label.local": "Local",
-    "label.local.file": "Local file",
-    "label.local.storage": "Storage locale",
-    "label.local.storage.enabled": "Enable local storage for User VMs",
-    "label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
-    "label.login": "Login",
-    "label.logout": "Logout",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Traffic Label",
-    "label.make.project.owner": "Make account project owner",
-    "label.make.redundant": "Rendi ridondante",
-    "label.manage": "Manage",
-    "label.manage.resources": "Gestione Risorse",
-    "label.managed": "Managed",
-    "label.management": "Gestione",
-    "label.management.ips": "Indirizzo IP di Management",
-    "label.management.server": "Management Server",
-    "label.max.cpus": "Max. CPU cores",
-    "label.max.guest.limit": "Limite max di guest",
-    "label.max.instances": "Max Instances",
-    "label.max.memory": "Max. memory (MiB)",
-    "label.max.networks": "Numero Max di reti",
-    "label.max.primary.storage": "Max. primary (GiB)",
-    "label.max.public.ips": "Numero max di indirizzi IP pubblici",
-    "label.max.secondary.storage": "Max. secondary (GiB)",
-    "label.max.snapshots": "Numero max di snapshot",
-    "label.max.templates": "Numero max di template",
-    "label.max.vms": "Numero max di VM utente",
-    "label.max.volumes": "Numero max di volumi",
-    "label.max.vpcs": "Numero max di VPC",
-    "label.maximum": "Maximum",
-    "label.may.continue": "E' ora possibile continuare.",
-    "label.md5.checksum": "Checksum MD5",
-    "label.memory": "Memory",
-    "label.memory.allocated": "Memory Allocated",
-    "label.memory.limits": "Memory limits (MiB)",
-    "label.memory.mb": "Memoria (in MB)",
-    "label.memory.total": "Memory Total",
-    "label.memory.used": "Memory Used",
-    "label.menu.accounts": "Utenti",
-    "label.menu.alerts": "Alerts",
-    "label.menu.all.accounts": "All Accounts",
-    "label.menu.all.instances": "All Instances",
-    "label.menu.community.isos": "Community ISOs",
-    "label.menu.community.templates": "Community Templates",
-    "label.menu.configuration": "Configurazione",
-    "label.menu.dashboard": "Dashboard",
-    "label.menu.destroyed.instances": "Destroyed Instances",
-    "label.menu.disk.offerings": "Disk Offerings",
-    "label.menu.domains": "Domains",
-    "label.menu.events": "Events",
-    "label.menu.featured.isos": "Featured ISOs",
-    "label.menu.featured.templates": "Featured Templates",
-    "label.menu.global.settings": "Global Settings",
-    "label.menu.infrastructure": "Infrastruttura",
-    "label.menu.instances": "Istanze",
-    "label.menu.ipaddresses": "IP Addresses",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "My Accounts",
-    "label.menu.my.instances": "My Instances",
-    "label.menu.my.isos": "My ISOs",
-    "label.menu.my.templates": "My Templates",
-    "label.menu.network": "Network",
-    "label.menu.network.offerings": "Network Offerings",
-    "label.menu.physical.resources": "Physical Resources",
-    "label.menu.regions": "Regions",
-    "label.menu.running.instances": "Running Instances",
-    "label.menu.security.groups": "Security Groups",
-    "label.menu.service.offerings": "Service Offerings",
-    "label.menu.snapshots": "Snapshots",
-    "label.menu.sshkeypair": "SSH KeyPair",
-    "label.menu.stopped.instances": "Stopped Instances",
-    "label.menu.storage": "Storage",
-    "label.menu.system": "System",
-    "label.menu.system.service.offerings": "Offerte di Sistema",
-    "label.menu.system.vms": "System VMs",
-    "label.menu.templates": "Template",
-    "label.menu.virtual.appliances": "Virtual Appliances",
-    "label.menu.virtual.resources": "Virtual Resources",
-    "label.menu.volumes": "Volumes",
-    "label.menu.vpc.offerings": "VPC Offerings",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "Allocato",
-    "label.metrics.clusters": "Cluster",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "Used",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "Allocato",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "Size",
-    "label.metrics.disk.storagetype": "Type",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "Used",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "Hosts",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "Used",
-    "label.metrics.name": "Name",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "Scope",
-    "label.metrics.state": "State",
-    "label.metrics.storagepool": "Storage Pool",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "Migrate instance to",
-    "label.migrate.instance.to.host": "Migrare instance verso un altro host",
-    "label.migrate.instance.to.ps": "Migrare instance verso un altro primary storage",
-    "label.migrate.lb.vm": "Migrate LB VM",
-    "label.migrate.router.to": "Migrate Router to",
-    "label.migrate.systemvm.to": "Migrate System VM to",
-    "label.migrate.to.host": "Migrare verso un host",
-    "label.migrate.to.storage": "Migrare verso uno storage",
-    "label.migrate.volume": "Migrate Volume",
-    "label.migrate.volume.to.primary.storage": "Migrare un volume verso un altro primary storage",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instances",
-    "label.min.past.the.hr": "min past the hr",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "minute(s) past the hour",
-    "label.minutes.past.hour": "minutes(s) past the hour",
-    "label.mode": "Modalità",
-    "label.monday": "Monday",
-    "label.monthly": "Monthly",
-    "label.more.templates": "More Templates",
-    "label.move.down.row": "Sposta giù di una riga",
-    "label.move.to.bottom": "Sposta giù alla fine",
-    "label.move.to.top": "Sposta in su all'inizio",
-    "label.move.up.row": "Sposta su di una riga",
-    "label.my.account": "My Account",
-    "label.my.network": "La mia rete",
-    "label.my.templates": "I miei template",
-    "label.na": "N/A",
-    "label.name": "Name",
-    "label.name.lower": "name",
-    "label.name.optional": "Name (Optional)",
-    "label.nat.port.range": "Intervallo di porte NAT",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Netmask",
-    "label.netscaler.details": "NetScaler details",
-    "label.network": "Network",
-    "label.network.ACL": "ACL di rete",
-    "label.network.ACL.total": "Totale ACL di rete",
-    "label.network.ACLs": "ACL di rete",
-    "label.network.addVM": "Add network to VM",
-    "label.network.cidr": "Network CIDR",
-    "label.network.desc": "Network Desc",
-    "label.network.details": "Network Details",
-    "label.network.device": "Network Device",
-    "label.network.device.type": "Network Device Type",
-    "label.network.domain": "Network Domain",
-    "label.network.domain.text": "Dominio di Rete",
-    "label.network.id": "Network ID",
-    "label.network.label.display.for.blank.value": "Utilizzare il default gateway",
-    "label.network.limits": "Network limits",
-    "label.network.name": "Network Name",
-    "label.network.offering": "Network Offering",
-    "label.network.offering.details": "Network offering details",
-    "label.network.offering.display.text": "Network Offering Display Text",
-    "label.network.offering.id": "Network Offering ID",
-    "label.network.offering.name": "Network Offering Name",
-    "label.network.rate": "Network Rate (Mb/s)",
-    "label.network.rate.megabytes": "Network Rate (MB/s)",
-    "label.network.read": "Network Read",
-    "label.network.service.providers": "Service Provider di Rete",
-    "label.network.type": "Network Type",
-    "label.network.write": "Network Write",
-    "label.networking.and.security": "Networking e sicurezza",
-    "label.networks": "Reti",
-    "label.new": "Nuovo",
-    "label.new.password": "New Password",
-    "label.current.password": "Current Password",
-    "label.new.project": "Nuovo Progetto",
-    "label.new.ssh.key.pair": "New SSH Key Pair",
-    "label.new.vm": "Nuova VM",
-    "label.next": "Next",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS Server",
-    "label.nfs.storage": "NFS Storage",
-    "label.nic.adapter.type": "Tipo di scheda NIC",
-    "label.nicira.controller.address": "Controller Address",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP details",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "NICs",
-    "label.no": "No",
-    "label.no.actions": "No Available Actions",
-    "label.no.alerts": "No Recent Alerts",
-    "label.no.data": "Nessun dato da mostrare",
-    "label.no.errors": "No Recent Errors",
-    "label.no.grouping": "(no grouping)",
-    "label.no.isos": "No available ISOs",
-    "label.no.items": "No Available Items",
-    "label.no.security.groups": "No Available Security Groups",
-    "label.no.thanks": "No grazie",
-    "label.none": "None",
-    "label.not.found": "Not Found",
-    "label.notifications": "Notifiche",
-    "label.num.cpu.cores": "# of CPU Cores",
-    "label.number.of.clusters": "Numero di Cluster",
-    "label.number.of.cpu.sockets": "The Number of CPU Sockets",
-    "label.number.of.hosts": "Numero di Host",
-    "label.number.of.pods": "Numero di Pod",
-    "label.number.of.system.vms": "Numero delle VM di Sistema",
-    "label.number.of.virtual.routers": "Numero dei Router Virtuali",
-    "label.number.of.zones": "Numero di Zone",
-    "label.numretries": "Number of Retries",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "of month",
-    "label.offer.ha": "Offer HA",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controllers",
-    "label.operator": "Operator",
-    "label.optional": "Optional",
-    "label.order": "Ordine",
-    "label.os.preference": "OS Preference",
-    "label.os.type": "OS Type",
-    "label.other": "Other",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Action",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Password",
-    "label.outofbandmanagement.port": "Porta",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Username",
-    "label.override.guest.traffic": "Override Guest-Traffic",
-    "label.override.public.traffic": "Override Public-Traffic",
-    "label.ovm.traffic.label": "OVM traffic label",
-    "label.ovm3.cluster": "Native Clustering",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Owned Public IP Addresses",
-    "label.owner.account": "Owner Account",
-    "label.owner.domain": "Owner Domain",
-    "label.palo.alto.details": "Palo Alto details",
-    "label.parent.domain": "Parent Domain",
-    "label.passive": "Passive",
-    "label.password": "Password",
-    "label.password.enabled": "Password Enabled",
-    "label.password.lower": "password",
-    "label.password.reset.confirm": "Password has been reset to ",
-    "label.path": "Path",
-    "label.perfect.forward.secrecy": "Segretezza di Forward perfetta",
-    "label.permission": "Permission",
-    "label.persistent": "Persistent ",
-    "label.physical.network": "Physical Network",
-    "label.physical.network.ID": "ID della rete fisica",
-    "label.physical.network.name": "Physical network name",
-    "label.ping.path": "Ping Path",
-    "label.planner.mode": "Planner mode",
-    "label.please.complete.the.following.fields": "Please complete the following fields",
-    "label.please.specify.netscaler.info": "Si prega di specificare le informazioni per Netscaler",
-    "label.please.wait": "Please Wait",
-    "label.plugin.details": "Plugin details",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dedicated",
-    "label.pod.name": "Nome del Pod",
-    "label.pods": "Pod",
-    "label.polling.interval.sec": "Polling Interval (in sec)",
-    "label.port": "Porta",
-    "label.port.forwarding": "Port Forwarding",
-    "label.port.forwarding.policies": "Politiche di Port Forwarding",
-    "label.port.range": "Port Range",
-    "label.portable.ip": "Portable IP",
-    "label.portable.ip.range.details": "Portable IP Range details",
-    "label.portable.ip.ranges": "Portable IP Ranges",
-    "label.portable.ips": "Portable IPs",
-    "label.powerstate": "Power State",
-    "label.prev": "Prev",
-    "label.previous": "Precedente",
-    "label.primary.allocated": "Primary Storage Allocated",
-    "label.primary.network": "Primary Network",
-    "label.primary.storage": "Storage Primario",
-    "label.primary.storage.count": "Pool del Primary Storage",
-    "label.primary.storage.limits": "Primary Storage limits (GiB)",
-    "label.primary.used": "Primary Storage Used",
-    "label.private.Gateway": "Gateway Privato",
-    "label.private.interface": "Private Interface",
-    "label.private.ip": "Private IP Address",
-    "label.private.ip.range": "Private IP Range",
-    "label.private.ips": "Private IP Addresses",
-    "label.private.key": "Private Key",
-    "label.private.network": "Rete privata",
-    "label.private.port": "Private Port",
-    "label.private.zone": "Private Zone",
-    "label.privatekey": "PKCS#8 Private Key",
-    "label.profile": "Profile",
-    "label.project": "Project",
-    "label.project.dashboard": "Dashboard di progetto",
-    "label.project.id": "Project ID",
-    "label.project.invite": "Invitare ad un progetto",
-    "label.project.name": "Nome del progetto",
-    "label.project.view": "Vista Progetto",
-    "label.projects": "Progetti",
-    "label.protocol": "Protocol",
-    "label.protocol.number": "Protocol Number",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Provider",
-    "label.providers": "Fornitori",
-    "label.public": "Public",
-    "label.public.interface": "Public Interface",
-    "label.public.ip": "Public IP Address",
-    "label.public.ips": "Public IP Addresses",
-    "label.public.key": "Public Key",
-    "label.public.lb": "Public LB",
-    "label.public.load.balancer.provider": "Public Load Balancer Provider",
-    "label.public.network": "Rete pubblica",
-    "label.public.port": "Public Port",
-    "label.public.traffic": "Public traffic",
-    "label.public.traffic.vswitch.name": "Public Traffic vSwitch Name",
-    "label.public.traffic.vswitch.type": "Public Traffic vSwitch Type",
-    "label.public.zone": "Public Zone",
-    "label.purpose": "Scopo",
-    "label.qos.type": "QoS Type",
-    "label.quickview": "Panoramica rapida",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Time (in sec)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "Data",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "All Accounts",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "State",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx user",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "Reboot",
-    "label.recent.errors": "Recent Errors",
-    "label.recover.vm": "Recupera la VM",
-    "label.redundant.router": "Redundant Router",
-    "label.redundant.router.capability": "Capacità di ridondanza del router",
-    "label.redundant.state": "Redundant state",
-    "label.redundant.vpc": "Redundant VPC",
-    "label.refresh": "Refresh",
-    "label.refresh.blades": "Refresh Blades",
-    "label.region": "Region",
-    "label.region.details": "Region details",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "Reinstalla la VM",
-    "label.related": "Related",
-    "label.release.account": "Release from Account",
-    "label.release.account.lowercase": "Release from account",
-    "label.release.dedicated.cluster": "Release Dedicated Cluster",
-    "label.release.dedicated.host": "Release Dedicated Host",
-    "label.release.dedicated.pod": "Release Dedicated Pod",
-    "label.release.dedicated.vlan.range": "Release dedicated VLAN range",
-    "label.release.dedicated.zone": "Release Dedicated Zone",
-    "label.remind.later": "Ricordami in seguito",
-    "label.remove.ACL": "Rimuovere ACL",
-    "label.remove.egress.rule": "Rimuovere una regola d'uscita",
-    "label.remove.from.load.balancer": "Removing instance from load balancer",
-    "label.remove.ingress.rule": "Remove ingress rule",
-    "label.remove.ip.range": "Rimuovere intervallo di indirizzi IP",
-    "label.remove.ldap": "Rimuovi LDAP",
-    "label.remove.network.offering": "Remove network offering",
-    "label.remove.pf": "Rimuovere regola di port forwarding",
-    "label.remove.project.account": "Remove account from project",
-    "label.remove.region": "Remove Region",
-    "label.remove.rule": "Rimuovere regola",
-    "label.remove.ssh.key.pair": "Remove SSH Key Pair",
-    "label.remove.static.nat.rule": "Rimuovere regola di NAT statico",
-    "label.remove.static.route": "Rimuovere una rotta statica",
-    "label.remove.this.physical.network": "Remove this physical network",
-    "label.remove.tier": "Rimuovere un livello",
-    "label.remove.vm.from.lb": "Rimuovere una VM da regola di bilanciamento di carico",
-    "label.remove.vm.load.balancer": "Remove VM from load balancer",
-    "label.remove.vmware.datacenter": "Remove VMware datacenter",
-    "label.remove.vpc": "Rimuovere VPC",
-    "label.remove.vpc.offering": "Remove VPC offering",
-    "label.removing": "Rimozione",
-    "label.removing.user": "Removing User",
-    "label.reource.id": "Resource ID",
-    "label.replace.acl": "Replace ACL",
-    "label.replace.acl.list": "Replace ACL List",
-    "label.required": "Required",
-    "label.requires.upgrade": "Requires Upgrade",
-    "label.reserved.ip.range": "Reserved IP Range",
-    "label.reserved.system.gateway": "Gateway di sistema riservato",
-    "label.reserved.system.ip": "Reserved System IP",
-    "label.reserved.system.netmask": "Netmask di sistema riservata",
-    "label.reset.VPN.connection": "Reset della connessione VPN",
-    "label.reset.ssh.key.pair": "Reset SSH Key Pair",
-    "label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
-    "label.resetVM": "Reset VM",
-    "label.resize.new.offering.id": "New Offering",
-    "label.resize.new.size": "New Size (GB)",
-    "label.resize.shrink.ok": "Shrink OK",
-    "label.resource": "Resource",
-    "label.resource.limit.exceeded": "Resource Limit Exceeded",
-    "label.resource.limits": "Resource Limits",
-    "label.resource.name": "Resource Name",
-    "label.resource.state": "Stato della risorsa",
-    "label.resources": "Resources",
-    "label.response.timeout.in.sec": "Response Timeout (in sec)",
-    "label.restart.network": "Riavviare il servizio di rete",
-    "label.restart.required": "E' necessario un riavvio",
-    "label.restart.vpc": "Riavviare VPC",
-    "label.restore": "Restore",
-    "label.retry.interval": "Retry Interval",
-    "label.review": "Riesaminare",
-    "label.revoke.project.invite": "Revocare un invit",
-    "label.role": "Role",
-    "label.roles": "Ruoli",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Root certificate",
-    "label.root.disk.controller": "Controller del disco root",
-    "label.root.disk.offering": "Root Disk Offering",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Scaled Up",
-    "label.routing": "Routing",
-    "label.routing.host": "Routing Host",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Rule Number",
-    "label.rules": "Regole",
-    "label.running.vms": "Running VMs",
-    "label.s3.access_key": "Access Key",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Tempo di scadenza connessione",
-    "label.s3.endpoint": "Dispositivo",
-    "label.s3.max_error_retry": "Numero massimo di tentativi a seguito di errore",
-    "label.s3.nfs.path": "Percorso S3 NFS",
-    "label.s3.nfs.server": "S3 NFS Server",
-    "label.s3.secret_key": "Secret Key",
-    "label.s3.socket_timeout": "Tempo di scadenza del Socket",
-    "label.s3.use_https": "Utilizzare HTTPS",
-    "label.saml.enable": "Authorize SAML SSO",
-    "label.saml.entity": "Identity Provider",
-    "label.saturday": "Saturday",
-    "label.save": "Save",
-    "label.save.and.continue": "Salvare e proseguire",
-    "label.save.changes": "Save changes",
-    "label.saving.processing": "Saving....",
-    "label.scale.up.policy": "SCALE UP POLICY",
-    "label.scaledown.policy": "ScaleDown Policy",
-    "label.scaleup.policy": "ScaleUp Policy",
-    "label.scope": "Scope",
-    "label.search": "Search",
-    "label.secondary.ips": "IP Secondari",
-    "label.secondary.isolated.vlan.id": "Secondary Isolated VLAN ID",
-    "label.secondary.staging.store": "Secondary Staging Store",
-    "label.secondary.staging.store.details": "Secondary Staging Store details",
-    "label.secondary.storage": "Storage Secondario",
-    "label.secondary.storage.count": "Pool del Secondary Storage",
-    "label.secondary.storage.details": "Secondary storage details",
-    "label.secondary.storage.limits": "Secondary Storage limits (GiB)",
-    "label.secondary.storage.vm": "VM di Secondary Storage",
-    "label.secondary.used": "Secondary Storage Used",
-    "label.secret.key": "Secret Key",
-    "label.security.group": "Security Group",
-    "label.security.group.name": "Security Group Name",
-    "label.security.groups": "Security Groups",
-    "label.security.groups.enabled": "Security Groups Enabled",
-    "label.select": "Selezionare",
-    "label.select-view": "Selezionare la vista",
-    "label.select.a.template": "Selezionare un template",
-    "label.select.a.zone": "Selezionare una zone",
-    "label.select.instance": "Selezionare una instanza",
-    "label.select.instance.to.attach.volume.to": "Selezionare l'instanza da collegare al volume",
-    "label.select.iso.or.template": "Selezionare immagine ISO o template",
-    "label.select.offering": "Seleziona l'offerta",
-    "label.select.project": "Selezionare un Progetto",
-    "label.select.region": "Select region",
-    "label.select.template": "Select Template",
-    "label.select.tier": "Selezionare il Livello",
-    "label.select.vm.for.static.nat": "Selezionare una VM per il NAT statico",
-    "label.sent": "Sent",
-    "label.server": "Server",
-    "label.service.capabilities": "Capacità di Servizio",
-    "label.service.offering": "Service Offering",
-    "label.service.offering.details": "Service offering details",
-    "label.service.state": "Stato del Servizio",
-    "label.services": "Services",
-    "label.session.expired": "Session Expired",
-    "label.set.default.NIC": "Set default NIC",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Configurazione del tipo di Zona",
-    "label.settings": "Settings",
-    "label.setup": "Installazione",
-    "label.setup.network": "Set up Network",
-    "label.setup.zone": "Set up Zone",
-    "label.shared": "Shared",
-    "label.show.advanced.settings": "Show advanced settings",
-    "label.show.ingress.rule": "Show Ingress Rule",
-    "label.shutdown.provider": "Arresto del provider",
-    "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Size",
-    "label.skip.guide": "Se si ha familiarità con CloudStack per utilizzi precedenti, si può saltare questa guida",
-    "label.smb.domain": "Dominio SMB",
-    "label.smb.password": "Password SMB",
-    "label.smb.username": "Username SMB",
-    "label.snapshot": "Snapshot",
-    "label.snapshot.limits": "Snapshot Limits",
-    "label.snapshot.name": "Snapshot Name",
-    "label.snapshot.s": "Snapshots",
-    "label.snapshot.schedule": "Set up Recurring Snapshot",
-    "label.snapshots": "Snapshots",
-    "label.sockets": "CPU Socket",
-    "label.source.ip.address": "Source IP Address",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT Supported",
-    "label.source.port": "Source Port",
-    "label.specify.IP.ranges": "Specificare intervallo di indirizzi IP",
-    "label.specify.vlan": "Specify VLAN",
-    "label.specify.vxlan": "Specify VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX details",
-    "label.ssh.key.pair": "SSH Key Pair",
-    "label.ssh.key.pair.details": "SSH Key Pair Details",
-    "label.ssh.key.pairs": "SSH Key Pairs",
-    "label.standard.us.keyboard": "Standard (US) keyboard",
-    "label.start.IP": "Indirizzo IP iniziale",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "Start Port",
-    "label.start.reserved.system.IP": "Indirizzo IP iniziale riservato di sistema",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "Start VXLAN",
-    "label.state": "State",
-    "label.static.nat": "Static NAT",
-    "label.static.nat.enabled": "NAT Statico Abilitato",
-    "label.static.nat.to": "Static NAT to",
-    "label.static.nat.vm.details": "Dettagli di NAT Statico della VM",
-    "label.static.routes": "Static Routes",
-    "label.statistics": "Statistics",
-    "label.status": "Status",
-    "label.step.1": "Step 1",
-    "label.step.1.title": "Step 1: <strong>Select a Template</strong>",
-    "label.step.2": "Step 2",
-    "label.step.2.title": "Step 2: <strong>Service Offering</strong>",
-    "label.step.3": "Step 3",
-    "label.step.3.title": "Step 3: <strong id=\"step3_label\">Select a Disk Offering</strong>",
-    "label.step.4": "Step 4",
-    "label.step.4.title": "Step 4: <strong>Network</strong>",
-    "label.step.5": "Step 5",
-    "label.step.5.title": "Step 5: <strong>Review</strong>",
-    "label.stickiness": "Stickiness",
-    "label.stickiness.method": "Stickiness method",
-    "label.sticky.cookie-name": "Nome del cookie",
-    "label.sticky.domain": "Dominio",
-    "label.sticky.expire": "Scadenza",
-    "label.sticky.holdtime": "Hold time",
-    "label.sticky.indirect": "Indirect",
-    "label.sticky.length": "Lunghezza",
-    "label.sticky.mode": "Modalità",
-    "label.sticky.name": "Sticky Name",
-    "label.sticky.nocache": "Senza cache",
-    "label.sticky.postonly": "Post only",
-    "label.sticky.prefix": "Prefisso",
-    "label.sticky.request-learn": "Request learn",
-    "label.sticky.tablesize": "Dimensione della tabella",
-    "label.stop": "Stop",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "Stopped VMs",
-    "label.storage": "Storage",
-    "label.storage.pool": "Storage Pool",
-    "label.storage.tags": "Storage Tags",
-    "label.storage.traffic": "Traffico della rete Storage",
-    "label.storage.type": "Storage Type",
-    "label.subdomain.access": "Subdomain Access",
-    "label.submit": "Submit",
-    "label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Succeeded",
-    "label.sunday": "Sunday",
-    "label.super.cidr.for.guest.networks": "Super CIDR per Reti Guest",
-    "label.supported.services": "Servizi Supportati",
-    "label.supported.source.NAT.type": "Tipo di Source NAT supportato",
-    "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Sospendere il Progett",
-    "label.switch.type": "Switch Type",
-    "label.system.capacity": "System Capacity",
-    "label.system.offering": "Offerta del sistema",
-    "label.system.offering.for.router": "System Offering for Router",
-    "label.system.service.offering": "System Service Offering",
-    "label.system.service.offering.details": "System service offering details",
-    "label.system.vm": "System VM",
-    "label.system.vm.details": "System VM details",
-    "label.system.vm.scaled.up": "System VM Scaled Up",
-    "label.system.vm.type": "System VM Type",
-    "label.system.vms": "System VMs",
-    "label.system.wide.capacity": "Capacità del Sistema",
-    "label.tag.key": "Tag Key",
-    "label.tag.value": "Tag Value",
-    "label.tagged": "Tagged",
-    "label.tags": "Tags",
-    "label.target.iqn": "Target IQN",
-    "label.task.completed": "Attività completata",
-    "label.template": "Template",
-    "label.template.limits": "Template Limits",
-    "label.tftp.root.directory": "Tftp root directory",
-    "label.theme.default": "Default Theme",
-    "label.theme.grey": "Custom - Grey",
-    "label.theme.lightblue": "Custom - Light Blue",
-    "label.threshold": "Threshold",
-    "label.thursday": "Thursday",
-    "label.tier": "Livello",
-    "label.tier.details": "Dettagli del livello",
-    "label.time": "Time",
-    "label.time.colon": "Time:",
-    "label.time.zone": "Timezone",
-    "label.timeout": "Timeout",
-    "label.timeout.in.second ": " Timeout (seconds)",
-    "label.timezone": "Timezone",
-    "label.timezone.colon": "Timezone:",
-    "label.token": "Token",
-    "label.total.CPU": "CPU Totali",
-    "label.total.cpu": "CPU Totali",
-    "label.total.hosts": "Host Totali",
-    "label.total.memory": "Memoria Totale",
-    "label.total.of.ip": "Total of IP Addresses",
-    "label.total.of.vm": "Total of VMs",
-    "label.total.storage": "Storage Totale",
-    "label.total.virtual.routers": "Total of Virtual Routers",
-    "label.total.virtual.routers.upgrade": "Total of Virtual Routers that require upgrade",
-    "label.total.vms": "Total VMs",
-    "label.traffic.label": "Etichetta del traffico",
-    "label.traffic.type": "Traffic Type",
-    "label.traffic.types": "Tipi di Traffico",
-    "label.tuesday": "Tuesday",
-    "label.type": "Type",
-    "label.type.id": "Type ID",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK keyboard",
-    "label.unavailable": "Unavailable",
-    "label.unhealthy.threshold": "Unhealthy Threshold",
-    "label.unlimited": "Unlimited",
-    "label.untagged": "Untagged",
-    "label.update.project.resources": "Aggiornare le risorse di progetto",
-    "label.update.ssl": " SSL Certificate",
-    "label.update.ssl.cert": " SSL Certificate",
-    "label.updating": "Updating",
-    "label.upgrade.required": "Upgrade is required",
-    "label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
-    "label.upload": "Upload",
-    "label.upload.from.local": "Upload from Local",
-    "label.upload.template.from.local": "Upload Template from Local",
-    "label.upload.volume": "Volume di upload",
-    "label.upload.volume.from.local": "Upload Volume from Local",
-    "label.upload.volume.from.url": "Upload volume from URL",
-    "label.url": "URL",
-    "label.usage.interface": "Usage Interface",
-    "label.usage.sanity.result": "Usage Sanity Result",
-    "label.usage.server": "Usage Server",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "Use VM IP:",
-    "label.use.vm.ips": "Usa Indirizzo IP della VM",
-    "label.used": "Used",
-    "label.user": "User",
-    "label.user.data": "User Data",
-    "label.user.details": "User details",
-    "label.user.vm": "User VM",
-    "label.username": "Username",
-    "label.username.lower": "username",
-    "label.users": "Users",
-    "label.vSwitch.type": "vSwitch Type",
-    "label.value": "Value",
-    "label.vcdcname": "Nome DC del vCenter",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter Cluster",
-    "label.vcenter.datacenter": "vCenter Datacenter",
-    "label.vcenter.datastore": "vCenter Datastore",
-    "label.vcenter.host": "vCenter Host",
-    "label.vcenter.password": "vCenter Password",
-    "label.vcenter.username": "vCenter Username",
-    "label.vcipaddress": "Indirizzo IP del vCenter",
-    "label.version": "Version",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Max resolution",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Remaining capacity",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Vista",
-    "label.view.all": "View all",
-    "label.view.console": "View console",
-    "label.view.more": "View more",
-    "label.view.secondary.ips": "Vedi IP Secondari",
-    "label.viewing": "Visualizzazione",
-    "label.virtual.appliance": "Virtual Appliance",
-    "label.virtual.appliance.details": "Virtual applicance details",
-    "label.virtual.appliances": "Virtual Appliances",
-    "label.virtual.machine": "Virtual Machine",
-    "label.virtual.machines": "Virtual Machines",
-    "label.virtual.network": "Virtual Network",
-    "label.virtual.networking": "Virtual Networking",
-    "label.virtual.router": "Virtual Router",
-    "label.virtual.routers": "Router Virtuali",
-    "label.virtual.routers.group.account": "Virtual Routers group by account",
-    "label.virtual.routers.group.cluster": "Virtual Routers group by cluster",
-    "label.virtual.routers.group.pod": "Virtual Routers group by pod",
-    "label.virtual.routers.group.zone": "Virtual Routers group by zone",
-    "label.vlan": "VLAN",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI Range",
-    "label.vlan.range.details": "VLAN Range details",
-    "label.vlan.ranges": "VLAN Range(s)",
-    "label.vlan.vni.range": "VLAN/VNI Range",
-    "label.vlan.vni.ranges": "VLAN/VNI Range(s)",
-    "label.vm.add": "Add Instance",
-    "label.vm.destroy": "Destroy",
-    "label.vm.display.name": "Nome visualizzato della VM",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "Indirizzo IP della VM",
-    "label.vm.name": "Nome VM",
-    "label.vm.password": "Password of the VM is",
-    "label.vm.reboot": "Reboot",
-    "label.vm.start": "Start",
-    "label.vm.state": "Stato VM",
-    "label.vm.stop": "Stop",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "VM Snapshots",
-    "label.vmsnapshot.current": "isCurrent",
-    "label.vmsnapshot.memory": "Snapshot memory",
-    "label.vmsnapshot.parentname": "Parent",
-    "label.vmsnapshot.type": "Type",
-    "label.vmware.datacenter.id": "VMware datacenter ID",
-    "label.vmware.datacenter.name": "VMware datacenter Name",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "Etichetta del traffico via VMware",
-    "label.vnet": "VLAN",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC Devices",
-    "label.volatile": "Volatile",
-    "label.volgroup": "Volume Group",
-    "label.volume": "Volume",
-    "label.volume.details": "Volume details",
-    "label.volume.limits": "Volume Limits",
-    "label.volume.migrated": "Volume migrated",
-    "label.volume.name": "Volume Name",
-    "label.volumes": "Volumes",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Distributed VPC Router",
-    "label.vpc.id": "ID del VPC",
-    "label.vpc.offering": "VPC Offering",
-    "label.vpc.offering.details": "VPC offering details",
-    "label.vpc.router.details": "VPC Router Details",
-    "label.vpc.supportsregionlevelvpc": "Supports Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtual Router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "Gateway VPN del Cliente",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "VLAN ID di Controllo",
-    "label.vsmpktvlanid": "VLAN ID del Pacchetto",
-    "label.vsmstoragevlanid": "VLAN ID di Storage",
-    "label.vsphere.managed": "vSphere Managed",
-    "label.vswitch.name": "vSwitch Name",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN Range",
-    "label.waiting": "Waiting",
-    "label.warn": "Warn",
-    "label.warn.upper": "WARN",
-    "label.warning": "Warning",
-    "label.wednesday": "Wednesday",
-    "label.weekly": "Weekly",
-    "label.welcome": "Welcome",
-    "label.welcome.cloud.console": "Welcome to Management Console",
-    "label.what.is.cloudstack": "Che cosa è CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Original XS Version is 6.1+",
-    "label.xenserver.traffic.label": "Etichetta del traffico via XenServer",
-    "label.yes": "Sì",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone Dedicated",
-    "label.zone.details": "Dettagli della Zona",
-    "label.zone.id": "Zone ID",
-    "label.zone.lower": "zone",
-    "label.zone.name": "Zone Name",
-    "label.zone.step.1.title": "Step 1: <strong>Select a Network</strong>",
-    "label.zone.step.2.title": "Step 2: <strong>Add a Zone</strong>",
-    "label.zone.step.3.title": "Step 3: <strong>Add a Pod</strong>",
-    "label.zone.step.4.title": "Step 4: <strong>Add an IP range</strong>",
-    "label.zone.type": "Tipo di Zona",
-    "label.zone.wide": "Zone-Wide",
-    "label.zoneWizard.trafficType.guest": "Guest: Traffico di rete tra le virtual machine dell'utente finale",
-    "label.zoneWizard.trafficType.management": "Management: Traffico di rete tra le risorse interne di CloudStack, incluso qualsiasi componente che comunichi con il Management Server, come ad esempio gli host e le VM di Sistema di CloudStack",
-    "label.zoneWizard.trafficType.public": "Public: Traffico di rete tra la rete internet e le virtual machine nell'infrastruttura cloud.",
-    "label.zoneWizard.trafficType.storage": "Storage: Traffico di rete tra i server di primary e secondary storage, come ad esempio i template delle VM e le operazioni di snapshot",
-    "label.zones": "Zone",
-    "managed.state": "Managed State",
-    "message.XSTools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
-    "message.Zone.creation.complete": "Creazione zona completata",
-    "message.acquire.ip.nic": "Prego confermare che si vuole acquisire un nuovo IP secondario per questa NIC.<br/>NOTA: Deve essere configurato manualmente il nuovo IP secondario acquisito all'interno della virtual machine.",
-    "message.acquire.new.ip": "Si prega di confermare di voler acquisire un nuovo indirizzo IP per questa rete.",
-    "message.acquire.new.ip.vpc": "Si prega di confermare di voler acquisire un nuovo indirizzo IP per questo VPC.",
-    "message.acquire.public.ip": "Please select a zone from which you want to acquire your new IP from.",
-    "message.action.cancel.maintenance": "Your host has been successfully canceled for maintenance. This process can take up to several minutes.",
-    "message.action.cancel.maintenance.mode": "Please confirm that you want to cancel this maintenance.",
-    "message.action.change.service.warning.for.instance": "Your instance must be stopped before attempting to change its current service offering.",
-    "message.action.change.service.warning.for.router": "Your router must be stopped before attempting to change its current service offering.",
-    "message.action.delete.ISO": "Please confirm that you want to delete this ISO.",
-    "message.action.delete.ISO.for.all.zones": "The ISO is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.cluster": "Please confirm that you want to delete this cluster.",
-    "message.action.delete.disk.offering": "Please confirm that you want to delete this disk offering.",
-    "message.action.delete.domain": "Please confirm that you want to delete this domain.",
-    "message.action.delete.external.firewall": "Please confirm that you would like to remove this external firewall. Warning: If you are planning to add back the same external firewall, you must reset usage data on the device.",
-    "message.action.delete.external.load.balancer": "Please confirm that you would like to remove this external load balancer. Warning: If you are planning to add back the same external load balancer, you must reset usage data on the device.",
-    "message.action.delete.ingress.rule": "Please confirm that you want to delete this ingress rule.",
-    "message.action.delete.network": "Please confirm that you want to delete this network.",
-    "message.action.delete.nexusVswitch": "Si prega di confermare di voler cancellare questo nexus 1000v",
-    "message.action.delete.nic": "Prego conferma che si vuole rimuovere questa NIC, questo rimuoverà anche le reti associate dalla VM.",
-    "message.action.delete.physical.network": "Si prega di confermare di voler cancellare questa rete fisica",
-    "message.action.delete.pod": "Please confirm that you want to delete this pod.",
-    "message.action.delete.primary.storage": "Please confirm that you want to delete this primary storage.",
-    "message.action.delete.secondary.storage": "Please confirm that you want to delete this secondary storage.",
-    "message.action.delete.security.group": "Please confirm that you want to delete this security group.",
-    "message.action.delete.service.offering": "Please confirm that you want to delete this service offering.",
-    "message.action.delete.snapshot": "Please confirm that you want to delete this snapshot.",
-    "message.action.delete.system.service.offering": "Si prega di confermare di voler cancellare questa offerta di servizio di sistema.",
-    "message.action.delete.template": "Please confirm that you want to delete this template.",
-    "message.action.delete.template.for.all.zones": "The template is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.volume": "Please confirm that you want to delete this volume.",
-    "message.action.delete.zone": "Please confirm that you want to delete this zone.",
-    "message.action.destroy.instance": "Please confirm that you want to destroy this instance.",
-    "message.action.destroy.systemvm": "Please confirm that you want to destroy this System VM.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Please confirm that you want to disable this cluster.",
-    "message.action.disable.nexusVswitch": "Si prega di confermare di voler disabilitare questo nexus 1000v",
-    "message.action.disable.physical.network": "Si prega di confermare di voler disabilitare questa rete fisica.",
-    "message.action.disable.pod": "Please confirm that you want to disable this pod.",
-    "message.action.disable.static.NAT": "Please confirm that you want to disable static NAT.",
-    "message.action.disable.zone": "Please confirm that you want to disable this zone.",
-    "message.action.download.iso": "Si prega di confermare di voler scaricare questa immagine ISO.",
-    "message.action.download.template": "Si prega di confermare di voler scaricare questo template.",
-    "message.action.downloading.template": "Downloading template.",
-    "message.action.enable.cluster": "Please confirm that you want to enable this cluster.",
-    "message.action.enable.maintenance": "Your host has been successfully prepared for maintenance.  This process can take up to several minutes or longer depending on how many VMs are currently on this host.",
-    "message.action.enable.nexusVswitch": "Si prega di confermare di voler abilitare questo nexus 1000v",
-    "message.action.enable.physical.network": "Si prega di confermare l'intenzione di abilitare questa rete fisica.",
-    "message.action.enable.pod": "Please confirm that you want to enable this pod.",
-    "message.action.enable.zone": "Please confirm that you want to enable this zone.",
-    "message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
-    "message.action.force.reconnect": "Your host has been successfully forced to reconnect.  This process can take up to several minutes.",
-    "message.action.host.enable.maintenance.mode": "Enabling maintenance mode will cause a live migration of all running instances on this host to any available host.",
-    "message.action.instance.reset.password": "Please confirm that you want to change the ROOT password for this virtual machine.",
-    "message.action.manage.cluster": "Please confirm that you want to manage the cluster.",
-    "message.action.primarystorage.enable.maintenance.mode": "Warning: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped.  Do you want to continue?",
-    "message.action.reboot.instance": "Please confirm that you want to reboot this instance.",
-    "message.action.reboot.router": "Tutti i servizi forniti da questo router virtuale saranno interrotti. Si prega di confermare di voler riavviare questo router.",
-    "message.action.reboot.systemvm": "Please confirm that you want to reboot this system VM.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Please confirm that you want to release this IP.",
-    "message.action.remove.host": "Si prega di confermare di voler rimuovere questo host.",
-    "message.action.reset.password.off": "Your instance currently does not support this feature.",
-    "message.action.reset.password.warning": "Your instance must be stopped before attempting to change its current password.",
-    "message.action.restore.instance": "Please confirm that you want to restore this instance.",
-    "message.action.revert.snapshot": "Please confirm that you want to revert the owning volume to this snapshot.",
-    "message.action.start.instance": "Please confirm that you want to start this instance.",
-    "message.action.start.router": "Please confirm that you want to start this router.",
-    "message.action.start.systemvm": "Please confirm that you want to start this system VM.",
-    "message.action.stop.instance": "Please confirm that you want to stop this instance.",
-    "message.action.stop.router": "Tutti i servizi forniti da questo router virtuale saranno interrotti. Si prega di confermare di voler arrestare questo router.",
-    "message.action.stop.systemvm": "Please confirm that you want to stop this system VM.",
-    "message.action.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
-    "message.action.snapshot.fromsnapshot":"Please confirm that you want to take a snapshot of this VM snapshot.",
-    "message.action.unmanage.cluster": "Please confirm that you want to unmanage the cluster.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Please confirm that you want to delete this VM snapshot.",
-    "message.action.vmsnapshot.revert": "Revert VM snapshot",
-    "message.activate.project": "Si è sicuri di voler attivare questo progetto?",
-    "message.add.VPN.gateway": "Si prega di confermare di voler aggiungere un Gateway VPN",
-    "message.add.cluster": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Please specify the following parameters to add a new disk offering",
-    "message.add.domain": "Si prega di specificare il sottodominio che si vuole creare in questo dominio",
-    "message.add.firewall": "Add a firewall to zone",
-    "message.add.guest.network": "Si prega di confermare di voler aggiungere una rete guest",
-    "message.add.host": "Please specify the following parameters to add a new host",
-    "message.add.ip.range": "Add an IP range to public network in zone",
-    "message.add.ip.range.direct.network": "Add an IP range to direct network <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Add an IP range to pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Add a load balancer to zone",
-    "message.add.load.balancer.under.ip": "La regola di bilanciamento di carico è stata aggiunta all'indirizzo IP:",
-    "message.add.network": "Add a new network for zone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Si prega di specificare le informazioni per aggiungere un nuovo gateway a questo VPC.",
-    "message.add.pod": "Add a new pod for zone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack's internal management traffic. The reserved IP range must be unique for each zone in the cloud.",
-    "message.add.primary": "Please specify the following parameters to add a new primary storage",
-    "message.add.primary.storage": "Add a new Primary Storage for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Please specify the required information to add a new region.",
-    "message.add.secondary.storage": "Add a new storage for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Please fill in the following data to add a new compute offering.",
-    "message.add.system.service.offering": "Si prega di inserire le seguenti informazioni per aggiungere una nuova offerta di servizio di sistema.",
-    "message.add.template": "Please enter the following data to create your new template",
-    "message.add.volume": "Please fill in the following data to add a new volume.",
-    "message.added.vpc.offering": "Added VPC offering",
-    "message.adding.Netscaler.device": "Aggiunta di dispositivo Netscaler",
-    "message.adding.Netscaler.provider": "Aggiunta di un provider Netscaler",
-    "message.adding.host": "Aggiunta host",
-    "message.additional.networks.desc": "Please select additional network(s) that your virtual instance will be connected to.",
-    "message.admin.guide.read": "For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?,",
-    "message.advanced.mode.desc": "Choose this network model if you wish to enable VLAN support.  This network model provides the most flexibility in allowing administrators to provide custom network offerings such as providing firewall, vpn, or load balancer support as well as enabling direct vs virtual networking.",
-    "message.advanced.security.group": "Choose this if you wish to use security groups to provide guest VM isolation.",
-    "message.advanced.virtual": "Choose this if you wish to use zone-wide VLANs to provide guest VM isolation.",
-    "message.after.enable.s3": "Il Secondary Storage S3 è configurato. NOTA: Una volta chiusa questa pagina, non sarà più possibile ri-configurare S3.",
-    "message.after.enable.swift": "Configurazione Swift completata. NOTA: Una volta che questa pagina viene chiusa, non sarà possibile ri-configurare nuovamente Swift.",
-    "message.alert.state.detected": "Rilevato uno stato di Alert",
-    "message.allow.vpn.access": "Please enter a username and password of the user that you want to allow VPN access.",
-    "message.apply.snapshot.policy": "You have successfully updated your current snapshot policy.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Please confirm that you want to attach the ISO to this virtual instance.",
-    "message.attach.volume": "Please fill in the following data to attach a new volume. If you are attaching a disk volume to a Windows based virtual machine, you will need to reboot the instance to see the attached disk.",
-    "message.basic.mode.desc": "Choose this network model if you do <b>*<u>not</u>*</b> want to enable any VLAN support.  All virtual instances created under this network model will be assigned an IP directly from the network and security groups are used to provide security and segregation.",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "Please confirm that you wish to change the service offering of this virtual instance.",
-    "message.change.password": "Si prega di modificare la propria password.",
-    "message.cluster.dedicated": "Cluster Dedicated",
-    "message.cluster.dedication.released": "Cluster dedication released",
-    "message.configure.all.traffic.types": "Si dispone di più reti fisiche; si prega di configurare le label per ogni tipo di traffico facendo click sul tasto 'Edit'.",
-    "message.configure.firewall.rules.allow.traffic": "Configure the rules to allow Traffic",
-    "message.configure.firewall.rules.block.traffic": "Configure the rules to block Traffic",
-    "message.configure.ldap": "Please confirm you would like to configure LDAP.",
-    "message.configuring.guest.traffic": "Configurazione del traffico guest",
-    "message.configuring.physical.networks": "Configurazione di reti fisiche",
-    "message.configuring.public.traffic": "Configurazione del traffico pubblico",
-    "message.configuring.storage.traffic": "Configurazione del traffico storage",
-    "message.confirm.action.force.reconnect": "Si prega di confermare di voler forzare la riconnessione a questo host.",
-    "message.confirm.add.vnmc.provider": "Please confirm you would like to add the VNMC provider.",
-    "message.confirm.archive.alert": "Please confirm that you want to archive this alert.",
-    "message.confirm.archive.event": "Please confirm that you want to archive this event.",
-    "message.confirm.archive.selected.alerts": "Please confirm you would like to archive the selected alerts",
-    "message.confirm.archive.selected.events": "Please confirm you would like to archive the selected events",
-    "message.confirm.attach.disk": "Are you sure you want to attach disk?",
-    "message.confirm.create.volume": "Are you sure you want to create volume?",
-    "message.confirm.current.guest.CIDR.unchanged": "Do you want to keep the current guest network CIDR unchanged?",
-    "message.confirm.dedicate.cluster.domain.account": "Do you really want to dedicate this cluster to a domain/account? ",
-    "message.confirm.dedicate.host.domain.account": "Do you really want to dedicate this host to a domain/account? ",
-    "message.confirm.dedicate.pod.domain.account": "Do you really want to dedicate this pod to a domain/account? ",
-    "message.confirm.dedicate.zone": "Do you really want to dedicate this zone to a domain/account?",
-    "message.confirm.delete.BigSwitchBcf": "Please confirm that you would like to delete this BigSwitch BCF Controller",
-    "message.confirm.delete.BrocadeVcs": "Please confirm that you would like to delete Brocade Vcs Switch",
-    "message.confirm.delete.F5": "Si prega di confermare di voler rimuovere F5",
-    "message.confirm.delete.NetScaler": "Si prega di confermare di voler rimuovere NetScaler",
-    "message.confirm.delete.PA": "Please confirm that you would like to delete Palo Alto",
-    "message.confirm.delete.SRX": "Si prega di confermare di voler rimuovere SRX",
-    "message.confirm.delete.acl.list": "Are you sure you want to delete this ACL list?",
-    "message.confirm.delete.alert": "Are you sure you want to delete this alert ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Please confirm that you want to delete Baremetal Rack Configuration.",
-    "message.confirm.delete.ciscoASA1000v": "Please confirm you want to delete CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
-    "message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
-    "message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
-    "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
-    "message.confirm.destroy.router": "Si prega di confermare di voler rimuovere questo router",
-    "message.confirm.disable.host": "Please confirm that you want to disable the host",
-    "message.confirm.disable.network.offering": "Are you sure you want to disable this network offering?",
-    "message.confirm.disable.provider": "Si prega di confermare di voler disabilitare questo provider",
-    "message.confirm.disable.vnmc.provider": "Please confirm you would like to disable the VNMC provider.",
-    "message.confirm.disable.vpc.offering": "Are you sure you want to disable this VPC offering?",
-    "message.confirm.enable.host": "Please confirm that you want to enable the host",
-    "message.confirm.enable.network.offering": "Are you sure you want to enable this network offering?",
-    "message.confirm.enable.provider": "Si prega di confermare di voler abilitare questo provider",
-    "message.confirm.enable.vnmc.provider": "Please confirm you would like to enable the VNMC provider.",
-    "message.confirm.enable.vpc.offering": "Are you sure you want to enable this VPC offering?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Si prega di confermare di volersi unire a questo progetto.",
-    "message.confirm.migrate.volume": "Do you want to migrate this volume?",
-    "message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
-    "message.confirm.release.dedicate.vlan.range": "Please confirm you want to release dedicated VLAN range",
-    "message.confirm.release.dedicated.cluster": "Do you want to release this dedicated cluster ?",
-    "message.confirm.release.dedicated.host": "Do you want to release this dedicated host ?",
-    "message.confirm.release.dedicated.pod": "Do you want to release this dedicated pod ?",
-    "message.confirm.release.dedicated.zone": "Do you want to release this dedicated zone ? ",
-    "message.confirm.remove.IP.range": "Si prega di confermare di voler rimuovere questo intervallo di indirizzi IP.",
-    "message.confirm.remove.event": "Are you sure you want to remove this event?",
-    "message.confirm.remove.load.balancer": "Please confirm you want to remove VM from load balancer",
-    "message.confirm.remove.network.offering": "Are you sure you want to remove this network offering?",
-    "message.confirm.remove.selected.alerts": "Please confirm you would like to remove the selected alerts",
-    "message.confirm.remove.selected.events": "Please confirm you would like to remove the selected events",
-    "message.confirm.remove.vmware.datacenter": "Please confirm you want to remove VMware datacenter",
-    "message.confirm.remove.vpc.offering": "Are you sure you want to remove this VPC offering?",
-    "message.confirm.replace.acl.new.one": "Do you want to replace the ACL with a new one?",
-    "message.confirm.scale.up.router.vm": "Do you really want to scale up the Router VM ?",
-    "message.confirm.scale.up.system.vm": "Do you really want to scale up the system VM ?",
-    "message.confirm.shutdown.provider": "Si prega di confermare di voler arrestare questo provider",
-    "message.confirm.start.lb.vm": "Please confirm you want to start LB VM",
-    "message.confirm.stop.lb.vm": "Please confirm you want to stop LB VM",
-    "message.confirm.upgrade.router.newer.template": "Please confirm that you want to upgrade router to use newer template",
-    "message.confirm.upgrade.routers.account.newtemplate": "Please confirm that you want to upgrade all routers in this account to use newer template",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Please confirm that you want to upgrade all routers in this cluster to use newer template",
-    "message.confirm.upgrade.routers.newtemplate": "Please confirm that you want to upgrade all routers in this zone to use newer template",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Please confirm that you want to upgrade all routers in this pod to use newer template",
-    "message.copy.iso.confirm": "Please confirm that you wish to copy your ISO to",
-    "message.copy.template": "Copy template <b id=\"copy_template_name_text\">XXX</b> from zone <b id=\"copy_template_source_zone_text\"></b> to",
-    "message.copy.template.confirm": "Are you sure you want to copy template?",
-    "message.create.template": "Si è sicuri di voler creare il template?",
-    "message.create.template.vm": "Create VM from template <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Please specify the following information before creating a template of your disk volume: <b><span id=\"volume_name\"></span></b>. Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.creating.cluster": "Creazione cluster",
-    "message.creating.guest.network": "Creazione di una rete guest",
-    "message.creating.physical.networks": "Creazione di reti fisiche",
-    "message.creating.pod": "Creazione pod",
-    "message.creating.primary.storage": "Creazione storage primario",
-    "message.creating.secondary.storage": "Creazione storage secondario",
-    "message.creating.systemVM": "Creating system VMs (this may take a while)",
-    "message.creating.zone": "Creazione della zona in corso",
-    "message.decline.invitation": "Si è sicuri di voler declinare l'invito a questo progetto?",
-    "message.dedicate.zone": "Dedicating zone",
-    "message.dedicated.zone.released": "Zone dedication released",
-    "message.delete.VPN.connection": "Si prega di confermare di voler cancellare la connessione VPN",
-    "message.delete.VPN.customer.gateway": "Si prega di confermare di voler cancellare questo Gateway VPN del Cliente",
-    "message.delete.VPN.gateway": "Si prega di confermare di voler cancellare questo Gateway VPN",
-    "message.delete.account": "Please confirm that you want to delete this account.",
-    "message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
-    "message.delete.gateway": "Si prega di confermare di voler cancellare il gateway",
-    "message.delete.project": "Si è sicuri di voler cancellare questo progetto?",
-    "message.delete.user": "Si prega di confermare di voler cancellare questo utente.",
-    "message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
-    "message.desc.advanced.zone": "Per topologie di rete più sofisticate. Queto modello di rete fornisce la maggior flessibilità nel definire reti guest e offrendo funzionalità di rete personalizzate come per esempio firewall, VPN, o supporto per bilanciamento di carico.",
-    "message.desc.basic.zone": "Indicare una rete singola in cui ogni instanza VM riceverà un indirizzo IP assegnato. L'isolamento di istanze guest viene effettuato attraverso funzioni di tipo layer-3 come ad esempio i security group (filtraggio dell'indirizzo IP sorgente).",
-    "message.desc.cluster": "Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.",
-    "message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.<br><br>(1) If public key is set, CloudStack will register the public key. You can use it through your private key.<br><br>(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.<br>",
-    "message.desc.created.ssh.key.pair": "Created a SSH Key Pair.",
-    "message.desc.host": "Each cluster must contain at least one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.<br/><br/>Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.",
-    "message.desc.primary.storage": "Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor.",
-    "message.desc.reset.ssh.key.pair": "Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled.",
-    "message.desc.secondary.storage": "Each zone must have at least one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.<br/><br/>Provide the IP address and exported path.",
-    "message.desc.zone": "Una zona è l'unità organizzativa più grandi in CloudStack, e corrisponde tipicamente ad un datacenter singolo. Le zono offrono isolamento fisico e ridondanza. Una zona è costituita da uno o più pod (ognuno dei quali contiene più host e server di storage primario) ed un server di storage secondario condiviso da tutti i pod appartenenti alla zona.",
-    "message.detach.disk": "Si è sicuri di voler sganciare questo disco?",
-    "message.detach.iso.confirm": "Please confirm that you want to detach the ISO from this virtual instance.",
-    "message.disable.account": "Please confirm that you want to disable this account.  By disabling the account, all users for this account will no longer have access to their cloud resources.  All running virtual machines will be immediately shut down.",
-    "message.disable.snapshot.policy": "You have successfully disabled your current snapshot policy.",
-    "message.disable.user": "Si prega di confermare di voler disabilitare questo utente.",
-    "message.disable.vpn": "Si è sicuri di voler disabilitare la VPN?",
-    "message.disable.vpn.access": "Please confirm that you want to disable Remote Access VPN.",
-    "message.disabling.network.offering": "Disabling network offering",
-    "message.disabling.vpc.offering": "Disabling VPC offering",
-    "message.disallowed.characters": "Disallowed characters: <,>",
-    "message.download.ISO": "Please click <a href=\"#\">00000</a> to download ISO",
-    "message.download.template": "Please click <a href=\"#\">00000</a> to download template",
-    "message.download.volume": "Please click <a href=\"#\">00000</a> to download volume",
-    "message.download.volume.confirm": "Please confirm that you want to download this volume.",
-    "message.edit.account": "Edit (\"-1\" indicates no limit to the amount of resources create)",
-    "message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
-    "message.edit.limits": "Please specify limits to the following resources.  A \"-1\" indicates no limit to the amount of resources create.",
-    "message.edit.traffic.type": "Si prega si specificare la label del traffico che si vuole associare a questo tipo di traffico.",
-    "message.enable.account": "Please confirm that you want to enable this account.",
-    "message.enable.user": "Si prega di confermare di voler abilitare questo utente.",
-    "message.enable.vpn": "Si prega di confermare di voler abilitare l'accesso VPN per questo indirizzo IP.",
-    "message.enable.vpn.access": "VPN is currently disabled for this IP Address.  Would you like to enable VPN access?",
-    "message.enabled.vpn": "Your Remote Access VPN is currently enabled and can be accessed via the IP",
-    "message.enabled.vpn.ip.sec": "Your IPSec pre-shared key is",
-    "message.enabling.network.offering": "Enabling network offering",
-    "message.enabling.security.group.provider": "Abilitazione di un provider di Security Group",
-    "message.enabling.vpc.offering": "Enabling VPC offering",
-    "message.enabling.zone": "Abilitazione zona",
-    "message.enabling.zone.dots": "Enabling zone...",
-    "message.enter.seperated.list.multiple.cidrs": "Please enter a comma separated list of CIDRs if more than one",
-    "message.enter.token": "Si prega di inserire il token ricevuto nella e-mail di invito.",
-    "message.generate.keys": "Si prega di confermare di voler generare nuove chiavi per questo utente.",
-    "message.gslb.delete.confirm": "Please confirm you want to delete this GSLB",
-    "message.gslb.lb.remove.confirm": "Please confirm you want to remove load balancing from GSLB",
-    "message.guest.traffic.in.advanced.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network.",
-    "message.guest.traffic.in.basic.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range.",
-    "message.host.dedicated": "Host Dedicated",
-    "message.host.dedication.released": "Host dedication released",
-    "message.installWizard.click.retry": "Fare click sul pulsante per riprovare l'avvio.",
-    "message.installWizard.copy.whatIsACluster": "A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Virtual machine instances (VMs) can be live-migrated from one host to another within the same cluster, without interrupting service to the user. A cluster is the third-largest organizational unit within a CloudStack&#8482; deployment. Clusters are contained within pods, and pods are contained within zones.<br/><br/>CloudStack&#8482; allows multiple clusters in a cloud deployment, but for a Basic Installation, we only need one cluster.",
-    "message.installWizard.copy.whatIsAHost": "A host is a single computer. Hosts provide the computing resources that run the guest virtual machines. Each host has hypervisor software installed on it to manage the guest VMs (except for bare metal hosts, which are a special case discussed in the Advanced Installation Guide). For example, a Linux KVM-enabled server, a Citrix XenServer server, and an ESXi server are hosts. In a Basic Installation, we use a single host running XenServer or KVM.<br/><br/>The host is the smallest organizational unit within a CloudStack&#8482; deployment. Hosts are contained within clusters, clusters are contained within pods, and pods are contained within zones.",
-    "message.installWizard.copy.whatIsAPod": "Un pod può essere utilizzato ad esempio per identificare un singolo rack. Gli host appartenenti al pod sono nella stessa subnet.<br/><br/>Un pod è il secondo componente organizzativo più grande in una installazione CloudStack&#8482;. I pod sono contenuti in zone. Ogni zona può contenere uno o più pod; in una Installazione di Base, si configura un solo pod nella zona.",
-    "message.installWizard.copy.whatIsAZone": "Una zona è il componente organizzativo più grande in una installazione CloudStack&#8482;. Una zona corrisponde solitamente ad un singolo datacenter, sebbene sia consentito avere più zone in un datacenter. Il beneficio di organizzare l'infrastruttura in zone deriva dalla possibilità di creare isolamento e ridondanza. Per esempio, ogni zona può avere la propria configurazione di alimentazione elettrica e collegamenti di rete, e le zone possono essere anche separate geograficamente (anche se non è un requisito).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack&#8482 manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack&#8482 to deploy, manage, and configure cloud computing environments.<br/><br/>Extending beyond individual virtual machine images running on commodity hardware, CloudStack&#8482 provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications. Both open-source and Premium versions are available, with the open-source version offering nearly identical features.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "A CloudStack&#8482; cloud infrastructure makes use of two types of storage: primary storage and secondary storage. Both of these can be iSCSI or NFS servers, or localdisk.<br/><br/><strong>Primary storage</strong> is associated with a cluster, and it stores the disk volumes of each guest VM for all the VMs running on hosts in that cluster. The primary storage server is typically located close to the hosts.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Un Secondary storage è associato ad una zona, ed è utilizzato per la memorizzazione di:<ul><li>Template - Immagini SO che possono essere usate per eseguire il boot delle VM e che possono includere informazioni di configurazioni aggiuntive, come ad esempio applicazioni installate</li><li>Immagini ISO - Immagini OS utilizzabili che possono anche essere non-bootable</li><li>Snapshot di volumi disco - copie salvate di dati delle VM utilizzabili per il recupero di dati o per la creazione di nuovi template</ul>",
-    "message.installWizard.now.building": "Now building your cloud...",
-    "message.installWizard.tooltip.addCluster.name": "Un nome per il cluster. Questo può essere assegnato utilizzando testo a scelta e non è utilizzato da CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "Il nome DNS o l'indirizzo IP del sistema host.",
-    "message.installWizard.tooltip.addHost.password": "Questa è la password per l'utente identificato precedentemente (dall'installazione XenServer).",
-    "message.installWizard.tooltip.addHost.username": "Tipicamente root.",
-    "message.installWizard.tooltip.addPod.name": "Un nome per il pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Questo è l'intervallo di indirizzi IP nella rete privata che CloudStack utilizza per la gestione delle VM del Secondary Storage e le VM della Console Proxy. Questi indirizzi IP sono ricavati dalla stessa subnet dei server computazionali.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "Il gateway per gli host appartenenti al pod.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "La netmask in uso nella subnet utilizzata dalle VM guest.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Questo è l'intervallo di indirizzi IP nella rete privata che CloudStack utilizza per la gestione delle VM del Secondary Storage e le VM della Console Proxy. Questi indirizzi IP sono ricavati dalla stessa subnet dei server computazionali.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "Il nome del dispositivo storage.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(per NFS) In NFS questo corrisponde al path condiviso dal server. Path (per SharedMountPoint). Con KVM questo è il path su ogni host su cui viene effettuato il mount di questo primary storage. Per esempio, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(per NFS, iSCSI, o PreSetup) L'indirizzo IP o il nome DNS del dispositivo di storage.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "L'indirizzo IP del server NFS su cui è condiviso il secondary storage",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "Il percorso esportato, posizionato sul server precedentemente specificato",
-    "message.installWizard.tooltip.addZone.dns1": "Questi sono i server DNS da usare per le VM guest nella zona. Questi server DNS saranno raggiunti attraverso la rete pubblica che si configurerà nel seguito. Gli indirizzi IP pubblici per la zona devono disporre di una rotta per raggiungere i server DNS indicati qui.",
-    "message.installWizard.tooltip.addZone.dns2": "Questi sono i server DNS da usare per le VM guest nella zona. Questi server DNS saranno raggiunti attraverso la rete pubblica che si configurerà nel seguito. Gli indirizzi IP pubblici per la zona devono disporre di una rotta per raggiungere i server DNS indicati qui.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Questi sono i server DNS da utilizzare per le VM di sistema nella zona. Questi server DNS saranno raggiunti attraverso l'interfaccia di rete configurata nella rete privata delle VM di Sistema. L'indirizzo IP privato fornito ai pod devono disporre di una rotta per raggiungere il server DNS indicato qui.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Questi sono i server DNS da utilizzare per le VM di sistema nella zona. Questi server DNS saranno raggiunti attraverso l'interfaccia di rete configurata nella rete privata delle VM di Sistema. L'indirizzo IP privato fornito ai pod devono disporre di una rotta per raggiungere il server DNS indicato qui.",
-    "message.installWizard.tooltip.addZone.name": "Un nome per la zona",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Una descrizione per identificare la rete",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "L'intervallo degli indirizzi IP che saranno disponibili per l'allocazione alle VM guest in questa zona. Se viene usata una NIC, questi indirizzi IP dovrebbero appartenere allo stesso CIDR a cui appartiene il pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "Il gateway da assegnare alle VM guest",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "La netmask in uso nella subnet utilizzata dalle VM guest",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "L'intervallo degli indirizzi IP che saranno disponibili per l'allocazione alle VM guest in questa zona. Se viene usata una NIC, questi indirizzi IP dovrebbero appartenere allo stesso CIDR a cui appartiene il pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Un nome da assegnare alla rete",
-    "message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
-    "message.instanceWizard.noTemplates": "Non ci sono template disponibili: si prega di aggiungere un template compatibile, e ri-avviare il wizard per la instanza.",
-    "message.ip.address.changed": "Il tuo indirizzo IP potrebbe essere cambiato; si desidera aggiornare l'elenco? Notare che in tal caso verrà chiusa la finestra dettagli.",
-    "message.iso.desc": "Immagine disco contenente dati o supporto avviabile di boot per il SO",
-    "message.join.project": "Ora appartieni al progetto. Si prega di passare alla vista Progetto per accedere.",
-    "message.launch.vm.on.private.network": "Do you wish to launch your instance on your own private dedicated network?",
-    "message.launch.zone": "La Zona è pronta per l'avvio; si prega di procedere al passo successivo.",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Please confirm that you want to lock this account.  By locking the account, all users for this account will no longer be able to manage their cloud resources.  Existing resources can still be accessed.",
-    "message.migrate.instance.confirm": "Please confirm the host you wish to migrate the virtual instance to.",
-    "message.migrate.instance.to.host": "Si prega di confermare di voler migrare instance verso un altro host.",
-    "message.migrate.instance.to.ps": "Si prega di confermare di voler migrare instance verso un altro primary storage.",
-    "message.migrate.router.confirm": "Si prega di confermare l'host a cui si intende migrare il router:",
-    "message.migrate.systemvm.confirm": "Please confirm the host you wish to migrate the system VM to:",
-    "message.migrate.volume": "Si prega di confermare di voler migrare il volume verso un altro primary storage.",
-    "message.network.addVM.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-    "message.network.addVMNIC": "Please confirm that you would like to add a new VM NIC for this network.",
-    "message.network.remote.access.vpn.configuration": "Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-    "message.new.user": "Specify the following to add a new user to the account",
-    "message.no.affinity.groups": "Non è presente alcun gruppo di affinità. Prego proseguire al prossimo passaggio.",
-    "message.no.host.available": "No Hosts are available for Migration",
-    "message.no.network.support": "Your selected hypervisor, vSphere, does not have any additional network features.  Please continue to step 5.",
-    "message.no.network.support.configuration.not.true": "You do not have any zone that has security group enabled. Thus, no additional network features.  Please continue to step 5.",
-    "message.no.projects": "Non si possiedono progetti.<br/>Si prega di creare un nuovo progetto dalla sezione progetti.",
-    "message.no.projects.adminOnly": "Non si dispone di alcun progetto.<br/>Si prega di chiedere la creazione di un nuovo progetto al proprio amministratore.",
-    "message.number.clusters": "<h2><span> # of </span> Clusters</h2>",
-    "message.number.hosts": "<h2><span> # of </span> Hosts</h2>",
-    "message.number.pods": "<h2><span> # of </span> Pods</h2>",
-    "message.number.storage": "<h2><span> # of </span> Primary Storage Volumes</h2>",
-    "message.number.zones": "<h2><span> # of </span> Zones</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Password has been reset to",
-    "message.password.of.the.vm.has.been.reset.to": "Password of the VM has been reset to",
-    "message.pending.projects.1": "Ci sono inviti a progetti in attesa di risposta:",
-    "message.pending.projects.2": "To view, please go to the projects section, then select invitations from the drop-down.",
-    "message.please.add.at.lease.one.traffic.range": "Si prega di aggiungere almeno un intervallo relativo al traffico.",
-    "message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
-    "message.please.proceed": "Si prega di procedere al passo successivo.",
-    "message.please.select.a.configuration.for.your.zone": "Si prega di selezionare una configurazione per la zona.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Si prega di selezionare una diversa rete pubblica e di management prima della rimozione",
-    "message.please.select.networks": "Si prega di selezionare le reti per la virtual machine.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Please select a ssh key pair you want this VM to use:",
-    "message.please.wait.while.zone.is.being.created": "Si prega di attendere la creazione della zona; può richiedere tempo...",
-    "message.pod.dedication.released": "Pod dedication released",
-    "message.portable.ip.delete.confirm": "Please confirm you want to delete Portable IP Range",
-    "message.project.invite.sent": "L'invito è stato spedito all'utente; l'utente sarà aggiunto al progetto solo dopo aver accettato l'invito",
-    "message.public.traffic.in.advanced.zone": "Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.<br/><br/>Provide at least one range of IP addresses for internet traffic.",
-    "message.public.traffic.in.basic.zone": "Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP.",
-    "message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
-    "message.read.admin.guide.scaling.up": "Please read the dynamic scaling section in the admin guide before scaling up.",
-    "message.recover.vm": "Prego confermare che si vuole recuperare questa VM.",
-    "message.redirecting.region": "Redirecting to region...",
-    "message.reinstall.vm": "NOTA: Attenzione. Questo causerà la reinstallazione della VM partendo dal template; i dati nel disco principale verranno persi. I dati nei volumi aggiuntivi, se esistenti, non verranno toccati.",
-    "message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
-    "message.remove.region": "Are you sure you want to remove this region from this management server?",
-    "message.remove.vpc": "Si prega di confermare di voler rimuovere VPC",
-    "message.remove.vpn.access": "Please confirm that you want to remove VPN access from the following user.",
-    "message.removed.ssh.key.pair": "Removed a SSH Key Pair",
-    "message.reset.VPN.connection": "Si prega di confermare di voler effettuare il reset della connessione VPN",
-    "message.reset.password.warning.notPasswordEnabled": "L'immagine template di questa instanza è stata creata senza l'abilitazione della password",
-    "message.reset.password.warning.notStopped": "L'instanza deve essere arrestata prima di poter modificare la password",
-    "message.restart.mgmt.server": "Please restart your management server(s) for your new settings to take effect.",
-    "message.restart.mgmt.usage.server": "Please restart your management server(s) and usage server(s) for your new settings to take effect.",
-    "message.restart.network": "Tutti i servizi forniti da questa rete saranno interrotti. Si prega di confermare di voler riavviare questa rete.",
-    "message.restart.vpc": "Si prega di confermare di voler riavviare VPC",
-    "message.restart.vpc.remark": "Please confirm that you want to restart the VPC <p><small><i>Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes</i>.</small></p>",
-    "message.restoreVM": "Do you want to restore the VM ?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Use <strong>Ctrl-click</strong> to select all applicable security groups)",
-    "message.select.a.zone": "Una zona corrisponde tipicamente ad un singolo datacenter. Zone multiple consentono di aumentare l'affidabilità creando isolamento fisico e ridondanza.",
-    "message.select.affinity.groups": "Prego selezionare un gruppo di affinità a cui si vuole far appartenere questa VM:",
-    "message.select.instance": "Si prega di selezionare una instanza.",
-    "message.select.iso": "Si prega di selezionare una immagine ISO per la nuova instanza virtuale.",
-    "message.select.item": "Si prega di selezionare un elemento.",
-    "message.select.security.groups": "Si prega di selezionare i security group per la nuova VM",
-    "message.select.template": "Si prega di selezionare un template per la nuova instanza virtuale.",
-    "message.select.tier": "Please select a tier",
-    "message.set.default.NIC": "Please confirm that you would like to make this NIC the default for this VM.",
-    "message.set.default.NIC.manual": "Please manually update the default NIC on the VM now.",
-    "message.setup.physical.network.during.zone.creation": "When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.<br/><br/><strong>Drag and drop one or more traffic types</strong> onto each physical network.",
-    "message.setup.physical.network.during.zone.creation.basic": "Quando si aggiunge una zona di base, si può configurare una rete fisica, che corrisponde ad una NIC sul sistema host di virtualizzazione. La rete consente il trasporto di vari tipi di traffico di comunicazione.<br/><br/>E' possibile anche spostare altri tipi di traffico sulla rete fisica in modalità <strong>drag and drop</strong>.",
-    "message.setup.successful": "L'installazione del cloud è completata con successo!",
-    "message.snapshot.schedule": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-    "message.specifiy.tag.key.value": "Please specify a tag key and value",
-    "message.specify.url": "Si prega di specificare la URL",
-    "message.step.1.continue": "Please select a template or ISO to continue",
-    "message.step.1.desc": "Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto.",
-    "message.step.2.continue": "Please select a service offering to continue",
-    "message.step.3.continue": "Please select a disk offering to continue",
-    "message.step.4.continue": "Please select at least one network to continue",
-    "message.step.4.desc": "Please select the primary network that your virtual instance will be connected to.",
-    "message.storage.traffic": "Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here.",
-    "message.suspend.project": "Si è sicuri di voler sospendere questo progetto?",
-    "message.systems.vms.ready": "System VMs ready.",
-    "message.template.copying": "Template is being copied.",
-    "message.template.desc": "Immagine SO utilizzabile per eseguire il boot delle VM",
-    "message.tier.required": "Tier is required",
-    "message.tooltip.dns.1": "Nome di un server DNS per l'uso da parte delle VM in questa zona. Gli indirizzi IP pubblici per la zona devono avere un percorso di instradamento verso questo server.",
-    "message.tooltip.dns.2": "Un nome di un server DNS aggiuntivo per l'uso da parte delle VM in questa zona. Gli indirizzi IP pubblici per la zona devono avere un percorso di instradamento verso questo server.",
-    "message.tooltip.internal.dns.1": "Nome di un server DNS per l'uso da parte delle VM interne di CloudStack di sistema nella zona. Gli indirizzi IP privati per i pod devono avere un percorso di instradamento verso questo server.",
-    "message.tooltip.internal.dns.2": "Nome di un server DNS per l'uso da parte delle VM interne di CloudStack di sistema nella zona. Gli indirizzi IP privati per i pod devono avere un percorso di instradamento verso questo server.",
-    "message.tooltip.network.domain": "Un suffisso DNS che consentirà la creazione di un nome di dominio personalizzato per la rete a cui accedono le VM ospiti.",
-    "message.tooltip.pod.name": "Un nome per questo pod",
-    "message.tooltip.reserved.system.gateway": "Il gateway per gli host appartenenti al pod.",
-    "message.tooltip.reserved.system.netmask": "Il prefisso di rete che definisce la subnet del pod. Utilizza la notazione CIDR.",
-    "message.tooltip.zone.name": "Un nome per la zona.",
-    "message.update.os.preference": "Please choose a OS preference for this host.  All virtual instances with similar preferences will be first allocated to this host before choosing another.",
-    "message.update.resource.count": "Si prega di confermare di voler aggiornare il valore delle risorse per questo account.",
-    "message.update.ssl": "Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance:",
-    "message.update.ssl.failed": "Failed to update SSL Certificate.",
-    "message.update.ssl.succeeded": "Update SSL Certificates succeeded",
-    "message.validate.URL": "Please enter a valid URL.",
-    "message.validate.accept": "Please enter a value with a valid extension.",
-    "message.validate.creditcard": "Please enter a valid credit card number.",
-    "message.validate.date": "Please enter a valid date.",
-    "message.validate.date.ISO": "Please enter a valid date (ISO).",
-    "message.validate.digits": "Please enter only digits.",
-    "message.validate.email.address": "Please enter a valid email address.",
-    "message.validate.equalto": "Please enter the same value again.",
-    "message.validate.fieldrequired": "This field is required.",
-    "message.validate.fixfield": "Please fix this field.",
-    "message.validate.instance.name": "Il nome dell'instanza non può avere lunghezza superiore a 63 caratteri. Sono consentite solo lettere ASCII a-z, A-Z, numeri 0-9, segni '-'. Il primo carattere deve essere una lettera, e l'ultimo una lettera o un numero.",
-    "message.validate.invalid.characters": "Rilevati caratteri non validi; prego correggere.",
-    "message.validate.max": "Please enter a value less than or equal to {0}.",
-    "message.validate.maxlength": "Please enter no more than {0} characters.",
-    "message.validate.minlength": "Please enter at least {0} characters.",
-    "message.validate.number": "Please enter a valid number.",
-    "message.validate.range": "Please enter a value between {0} and {1}.",
-    "message.validate.range.length": "Please enter a value between {0} and {1} characters long.",
-    "message.virtual.network.desc": "A dedicated virtualized network for your account.  The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router.",
-    "message.vm.create.template.confirm": "Create Template will reboot the VM automatically.",
-    "message.vm.review.launch": "Si prega di riesaminare le informazioni e confermare l'instance virtuale scelta sia corretta prima di avviarla.",
-    "message.vnmc.available.list": "VNMC is not available from provider list.",
-    "message.vnmc.not.available.list": "VNMC is not available from provider list.",
-    "message.volume.create.template.confirm": "Please confirm that you wish to create a template for this disk volume.  Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
-    "message.you.must.have.at.least.one.physical.network": "E' necessario disporre di almeno una rete fisica",
-    "message.your.cloudstack.is.ready": "Your CloudStack is ready!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Creazione zona completata. Si desidera abilitare questa zona?",
-    "message.zone.no.network.selection": "La zona selezionata non contiene opzioni per la selezione della rete.",
-    "message.zone.step.1.desc": "Please select a network model for your zone.",
-    "message.zone.step.2.desc": "Please enter the following info to add a new zone",
-    "message.zone.step.3.desc": "Please enter the following info to add a new pod",
-    "message.zoneWizard.enable.local.storage": "WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:<br/><br/>1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.<br/><br/>2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.<br/><br/><br/>Would you like to continue?",
-    "messgae.validate.min": "Please enter a value greater than or equal to {0}.",
-    "mode": "Modalità",
-    "network.rate": "Network Rate",
-    "notification.reboot.instance": "Riavviare una instanza",
-    "notification.start.instance": "Avviare una instanza",
-    "notification.stop.instance": "Arrestare una instanza",
-    "side.by.side": "Side by Side",
-    "state.Accepted": "Accettato",
-    "state.Active": "Attivo",
-    "state.Allocated": "Allocato",
-    "state.Allocating": "Allocazione in corso",
-    "state.BackedUp": "Salvataggio eseguito",
-    "state.BackingUp": "Salvataggio in esecuzione",
-    "state.Completed": "Completato",
-    "state.Creating": "Creazione in corso",
-    "state.Declined": "Declinato",
-    "state.Destroyed": "Destroyed",
-    "state.Disabled": "Disabilitato",
-    "state.Enabled": "Abilitato",
-    "state.Error": "Errore",
-    "state.Expunging": "Expunging",
-    "state.Migrating": "Migrazione in corso",
-    "state.Pending": "Pending",
-    "state.Ready": "Pronto",
-    "state.Running": "In esecuzione",
-    "state.Starting": "Avvio in corso",
-    "state.Stopped": "Arrestato",
-    "state.Stopping": "Arresto in corso",
-    "state.Suspended": "Sospeso",
-    "state.detached": "Detached",
-    "title.upload.volume": "Upload Volume",
-    "ui.listView.filters.all": "All",
-    "ui.listView.filters.mine": "Mine"
-};
diff --git a/ui/legacy/l10n/ja_JP.js b/ui/legacy/l10n/ja_JP.js
deleted file mode 100644
index b3d114b..0000000
--- a/ui/legacy/l10n/ja_JP.js
+++ /dev/null
@@ -1,2316 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP コード",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP の種類",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "項目のプロパティの変更",
-    "confirm.enable.s3": "S3 ベースのセカンダリ ストレージのサポートを有効にするには、次の情報を入力してください。",
-    "confirm.enable.swift": "Swift のサポートを有効にするには、次の情報を入力してください。",
-    "error.could.not.change.your.password.because.non.native.user": "エラー。LDAP が有効なためパスワードを変更できません。",
-    "error.could.not.enable.zone": "ゾーンを有効にできませんでした",
-    "error.installWizard.message": "問題が発生しました。戻ってエラーを修正できます。",
-    "error.invalid.username.password": "無効なユーザー名またはパスワードです。",
-    "error.login": "ユーザー名/パスワードが記録と一致しません。",
-    "error.menu.select": "項目が選択されていないため操作を実行できません。",
-    "error.mgmt.server.inaccessible": "管理サーバーにアクセスできません。後で再実行してください。",
-    "error.password.not.match": "パスワードが一致しません",
-    "error.please.specify.physical.network.tags": "この物理ネットワークのタグを指定しなければ、ネットワーク オファリングは使用できません。",
-    "error.session.expired": "セッションの有効期限が切れました。",
-    "error.something.went.wrong.please.correct.the.following": "問題が発生しました。次の内容を修正してください",
-    "error.unable.to.reach.management.server": "管理サーバーと通信できません",
-    "error.unresolved.internet.name": "インターネット名を解決できません。",
-    "force.delete": "強制的に削除する",
-    "force.delete.domain.warning": "警告: このオプションを選択すると、すべての子ドメインおよび関連するすべてのアカウントとそのリソースが削除されます。",
-    "force.remove": "強制的に解除する",
-    "force.remove.host.warning": "警告: このオプションを選択すると、実行中のすべての仮想マシンが強制的に停止され、クラスターからこのホストが強制的に解除されます。",
-    "force.stop": "強制的に停止する",
-    "force.stop.instance.warning": "警告: インスタンスの強制停止は、最終手段にしてください。データを損失するだけでなく、仮想マシンの動作が一貫しなくなる可能性があります。",
-    "hint.no.host.tags": "ホストタグが見つかりません",
-    "hint.no.storage.tags": "ストレージタグが見つかりません",
-    "hint.type.part.host.tag": "ホストタグの種類",
-    "hint.type.part.storage.tag": "ストレージタグの種類",
-    "image.directory": "画像ディレクトリ",
-    "inline": "直列",
-    "instances.actions.reboot.label": "インスタンスの再起動",
-    "label.CIDR.list": "CIDR 一覧",
-    "label.CIDR.of.destination.network": "宛先ネットワークの CIDR",
-    "label.CPU.cap": "CPU キャップ",
-    "label.DHCP.server.type": "DHCP サーバーの種類",
-    "label.DNS.domain.for.guest.networks": "ゲスト ネットワークの DNS ドメイン",
-    "label.ESP.encryption": "ESP 暗号化",
-    "label.ESP.hash": "ESP ハッシュ",
-    "label.ESP.lifetime": "ESP 有効期間 (秒)",
-    "label.ESP.policy": "ESP ポリシー",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE 暗号化",
-    "label.IKE.hash": "IKE ハッシュ",
-    "label.IKE.lifetime": "IKE 有効期間 (秒)",
-    "label.IKE.policy": "IKE ポリシー",
-    "label.IPsec.preshared.key": "IPsec 事前共有キー",
-    "label.LB.isolation": "LB 分離",
-    "label.LUN.number": "LUN 番号",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto ログ プロファイル",
-    "label.PA.threat.profile": "Palo Alto 脅威プロファイル",
-    "label.PING.CIFS.password": "PING CIFS パスワード",
-    "label.PING.CIFS.username": "PING CIFS ユーザー名",
-    "label.PING.dir": "PING ディレクトリ",
-    "label.PING.storage.IP": "PING 対象のストレージ IP アドレス",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "PXE サーバーの種類",
-    "label.SNMP.community": "SNMP コミュニティ",
-    "label.SNMP.port": "SNMP ポート",
-    "label.SR.name": "SR 名ラベル",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP ディレクトリ",
-    "label.VMFS.datastore": "VMFS データストア",
-    "label.VMs.in.tier": "階層内の VM",
-    "label.VPC.limits": "VPC 制限",
-    "label.VPC.router.details": "VPC ルーターの詳細",
-    "label.VPN.connection": "VPN 接続",
-    "label.VPN.customer.gateway": "VPN カスタマー ゲートウェイ",
-    "label.VPN.gateway": "VPN ゲートウェイ",
-    "label.Xenserver.Tools.Version61plus": "元の XS バージョンは 6.1 以降",
-    "label.about": "バージョン情報",
-    "label.about.app": "CloudStack について",
-    "label.accept.project.invitation": "プロジェクトへの招待の承諾",
-    "label.account": "アカウント",
-    "label.account.and.security.group": "アカウント、セキュリティ グループ",
-    "label.account.details": "アカウントの詳細",
-    "label.account.id": "アカウント ID",
-    "label.account.lower": "アカウント",
-    "label.account.name": "アカウント名",
-    "label.account.specific": "アカウント固有",
-    "label.account.type": "アカウントタイプ",
-    "label.accounts": "アカウント",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL ルールのリスト",
-    "label.acl.name": "ACL 名",
-    "label.acl.replaced": "ACL が置き換えられました",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "新しい IP アドレスの取得",
-    "label.acquire.new.secondary.ip": "セカンダリ IP アドレスの取得",
-    "label.action": "操作",
-    "label.action.attach.disk": "ディスクのアタッチ",
-    "label.action.attach.disk.processing": "ディスクをアタッチしています...",
-    "label.action.attach.iso": "ISO のアタッチ",
-    "label.action.attach.iso.processing": "ISO をアタッチしています...",
-    "label.action.cancel.maintenance.mode": "保守モードのキャンセル",
-    "label.action.cancel.maintenance.mode.processing": "保守モードをキャンセルしています...",
-    "label.action.change.password": "パスワードの変更",
-    "label.action.change.service": "サービスの変更",
-    "label.action.change.service.processing": "サービスを変更しています...",
-    "label.action.configure.samlauthorization": "SAML SSO 認証を設定する",
-    "label.action.copy.ISO": "ISO のコピー",
-    "label.action.copy.ISO.processing": "ISO をコピーしています....",
-    "label.action.copy.template": "テンプレートのコピー",
-    "label.action.copy.template.processing": "テンプレートをコピーしています....",
-    "label.action.create.template": "テンプレートの作成",
-    "label.action.create.template.from.vm": "VM からのテンプレート作成",
-    "label.action.create.template.from.volume": "ボリュームからのテンプレート作成",
-    "label.action.create.template.processing": "テンプレートを作成しています...",
-    "label.action.create.vm": "VM の作成",
-    "label.action.create.vm.processing": "VM を作成しています...",
-    "label.action.create.volume": "ボリュームの作成",
-    "label.action.create.volume.processing": "ボリュームを作成しています...",
-    "label.action.delete.IP.range": "IP アドレスの範囲の削除",
-    "label.action.delete.IP.range.processing": "IP アドレスの範囲を削除しています...",
-    "label.action.delete.ISO": "ISO の削除",
-    "label.action.delete.ISO.processing": "ISO を削除しています...",
-    "label.action.delete.account": "アカウントの削除",
-    "label.action.delete.account.processing": "アカウントを削除しています...",
-    "label.action.delete.cluster": "クラスターの削除",
-    "label.action.delete.cluster.processing": "クラスターを削除しています...",
-    "label.action.delete.disk.offering": "ディスク オファリングの削除",
-    "label.action.delete.disk.offering.processing": "ディスク オファリングを削除しています...",
-    "label.action.delete.domain": "ドメインの削除",
-    "label.action.delete.domain.processing": "ドメインを削除しています...",
-    "label.action.delete.firewall": "ファイアウォール規則の削除",
-    "label.action.delete.firewall.processing": "ファイアウォールを削除しています...",
-    "label.action.delete.ingress.rule": "受信規則の削除",
-    "label.action.delete.ingress.rule.processing": "受信規則を削除しています...",
-    "label.action.delete.load.balancer": "ロード バランサー規則の削除",
-    "label.action.delete.load.balancer.processing": "ロード バランサーを削除しています...",
-    "label.action.delete.network": "ネットワークの削除",
-    "label.action.delete.network.processing": "ネットワークを削除しています...",
-    "label.action.delete.nexusVswitch": "Nexus 1000V の削除",
-    "label.action.delete.nic": "NIC の削除",
-    "label.action.delete.physical.network": "物理ネットワークの削除",
-    "label.action.delete.pod": "ポッドの削除",
-    "label.action.delete.pod.processing": "ポッドを削除しています...",
-    "label.action.delete.primary.storage": "プライマリ ストレージの削除",
-    "label.action.delete.primary.storage.processing": "プライマリ ストレージを削除しています...",
-    "label.action.delete.secondary.storage": "セカンダリ ストレージの削除",
-    "label.action.delete.secondary.storage.processing": "セカンダリ ストレージを削除しています...",
-    "label.action.delete.security.group": "セキュリティ グループの削除",
-    "label.action.delete.security.group.processing": "セキュリティ グループを削除しています...",
-    "label.action.delete.service.offering": "サービス オファリングの削除",
-    "label.action.delete.service.offering.processing": "サービス オファリングを削除しています...",
-    "label.action.delete.snapshot": "スナップショットの削除",
-    "label.action.delete.snapshot.processing": "スナップショットを削除しています...",
-    "label.action.delete.system.service.offering": "システム サービス オファリングの削除",
-    "label.action.delete.template": "テンプレートの削除",
-    "label.action.delete.template.processing": "テンプレートを削除しています...",
-    "label.action.delete.user": "ユーザーの削除",
-    "label.action.delete.user.processing": "ユーザーを削除しています...",
-    "label.action.delete.volume": "ボリュームの削除",
-    "label.action.delete.volume.processing": "ボリュームを削除しています...",
-    "label.action.delete.zone": "ゾーンの削除",
-    "label.action.delete.zone.processing": "ゾーンを削除しています...",
-    "label.action.destroy.instance": "インスタンスの破棄",
-    "label.action.destroy.instance.processing": "インスタンスを破棄しています...",
-    "label.action.destroy.systemvm": "システム VM の破棄",
-    "label.action.destroy.systemvm.processing": "システム VM を破棄しています...",
-    "label.action.destroy.volume":"ボリュームの破棄",
-    "label.action.detach.disk": "ディスクのデタッチ",
-    "label.action.detach.disk.processing": "ディスクをデタッチしています...",
-    "label.action.detach.iso": "ISO のデタッチ",
-    "label.action.detach.iso.processing": "ISO をデタッチしています...",
-    "label.action.disable.account": "アカウントの無効化",
-    "label.action.disable.account.processing": "アカウントを無効にしています...",
-    "label.action.disable.cluster": "クラスターの無効化",
-    "label.action.disable.cluster.processing": "クラスターを無効にしています...",
-    "label.action.disable.nexusVswitch": "Nexus 1000V の無効化",
-    "label.action.disable.physical.network": "物理ネットワークの無効化",
-    "label.action.disable.pod": "ポッドの無効化",
-    "label.action.disable.pod.processing": "ポッドを無効にしています...",
-    "label.action.disable.static.NAT": "静的 NAT の無効化",
-    "label.action.disable.static.NAT.processing": "静的 NAT を無効にしています...",
-    "label.action.disable.user": "ユーザーの無効化",
-    "label.action.disable.user.processing": "ユーザーを無効にしています...",
-    "label.action.disable.zone": "ゾーンの無効化",
-    "label.action.disable.zone.processing": "ゾーンを無効にしています...",
-    "label.action.download.ISO": "ISO のダウンロード",
-    "label.action.download.template": "テンプレートのダウンロード",
-    "label.action.download.volume": "ボリュームのダウンロード",
-    "label.action.download.volume.processing": "ボリュームをダウンロードしています...",
-    "label.action.edit.ISO": "ISO の編集",
-    "label.action.edit.account": "アカウントの編集",
-    "label.action.edit.disk.offering": "ディスク オファリングの編集",
-    "label.action.edit.domain": "ドメインの編集",
-    "label.action.edit.global.setting": "グローバル設定の編集",
-    "label.action.edit.host": "ホストの編集",
-    "label.action.edit.instance": "インスタンスの編集",
-    "label.action.edit.network": "ネットワークの編集",
-    "label.action.edit.network.offering": "ネットワーク オファリングの編集",
-    "label.action.edit.network.processing": "ネットワークを編集しています...",
-    "label.action.edit.pod": "ポッドの編集",
-    "label.action.edit.primary.storage": "プライマリ ストレージの編集",
-    "label.action.edit.resource.limits": "リソース制限の編集",
-    "label.action.edit.service.offering": "サービス オファリングの編集",
-    "label.action.edit.template": "テンプレートの編集",
-    "label.action.edit.user": "ユーザーの編集",
-    "label.action.edit.zone": "ゾーンの編集",
-    "label.action.enable.account": "アカウントの有効化",
-    "label.action.enable.account.processing": "アカウントを有効にしています...",
-    "label.action.enable.cluster": "クラスターの有効化",
-    "label.action.enable.cluster.processing": "クラスターを有効にしています...",
-    "label.action.enable.maintenance.mode": "保守モードの有効化",
-    "label.action.enable.maintenance.mode.processing": "保守モードを有効にしています...",
-    "label.action.enable.nexusVswitch": "Nexus 1000V の有効化",
-    "label.action.enable.physical.network": "物理ネットワークの有効化",
-    "label.action.enable.pod": "ポッドの有効化",
-    "label.action.enable.pod.processing": "ポッドを有効にしています...",
-    "label.action.enable.static.NAT": "静的 NAT の有効化",
-    "label.action.enable.static.NAT.processing": "静的 NAT を有効にしています...",
-    "label.action.enable.user": "ユーザーの有効化",
-    "label.action.enable.user.processing": "ユーザーを有効にしています...",
-    "label.action.enable.zone": "ゾーンの有効化",
-    "label.action.enable.zone.processing": "ゾーンを有効にしています...",
-    "label.action.expunge.instance": "インスタンスの抹消",
-    "label.action.expunge.instance.processing": "インスタンスを抹消しています...",
-    "label.action.force.reconnect": "強制再接続",
-    "label.action.force.reconnect.processing": "再接続しています...",
-    "label.action.generate.keys": "キーの生成",
-    "label.action.generate.keys.processing": "キーを生成しています...",
-    "label.action.list.nexusVswitch": "Nexus 1000V の一覧表示",
-    "label.action.lock.account": "アカウントのロック",
-    "label.action.lock.account.processing": "アカウントをロックしています...",
-    "label.action.manage.cluster": "クラスターの管理対象化",
-    "label.action.manage.cluster.processing": "クラスターを管理対象にしています...",
-    "label.action.migrate.instance": "インスタンスの移行",
-    "label.action.migrate.instance.processing": "インスタンスを移行しています...",
-    "label.action.migrate.router": "ルーターの移行",
-    "label.action.migrate.router.processing": "ルーターを移行しています...",
-    "label.action.migrate.systemvm": "システム VM の移行",
-    "label.action.migrate.systemvm.processing": "システム VM を移行しています...",
-    "label.action.reboot.instance": "インスタンスの再起動",
-    "label.action.reboot.instance.processing": "インスタンスを再起動しています...",
-    "label.action.reboot.router": "ルーターの再起動",
-    "label.action.reboot.router.processing": "ルーターを再起動しています...",
-    "label.action.reboot.systemvm": "システム VM の再起動",
-    "label.action.reboot.systemvm.processing": "システム VM を再起動しています...",
-    "label.action.recover.volume":"ボリュームの復元",
-    "label.action.recurring.snapshot": "定期スナップショット",
-    "label.action.register.iso": "ISO の登録",
-    "label.action.register.template": "URL からのテンプレートの登録",
-    "label.action.release.ip": "IP アドレスの解放",
-    "label.action.release.ip.processing": "IP アドレスを解放しています...",
-    "label.action.remove.host": "ホストの削除",
-    "label.action.remove.host.processing": "ホストを削除しています...",
-    "label.action.reset.password": "パスワードのリセット",
-    "label.action.reset.password.processing": "パスワードをリセットしています...",
-    "label.action.resize.volume": "ボリューム サイズの変更",
-    "label.action.resize.volume.processing": "ボリュームのサイズを変更しています...",
-    "label.action.resource.limits": "リソース制限",
-    "label.action.restore.instance": "インスタンスの復元",
-    "label.action.restore.instance.processing": "インスタンスを復元しています...",
-    "label.action.revert.snapshot": "スナップショットに戻す",
-    "label.action.revert.snapshot.processing": "スナップショットに戻しています...",
-    "label.action.start.instance": "インスタンスの起動",
-    "label.action.start.instance.processing": "インスタンスを起動しています...",
-    "label.action.start.router": "ルーターの起動",
-    "label.action.start.router.processing": "ルーターを起動しています...",
-    "label.action.start.systemvm": "システム VM の起動",
-    "label.action.start.systemvm.processing": "システム VM を起動しています...",
-    "label.action.stop.instance": "インスタンスの停止",
-    "label.action.stop.instance.processing": "インスタンスを停止しています...",
-    "label.action.stop.router": "ルーターの停止",
-    "label.action.stop.router.processing": "ルーターを停止しています...",
-    "label.action.stop.systemvm": "システム VM の停止",
-    "label.action.stop.systemvm.processing": "システム VM を停止しています...",
-    "label.action.take.snapshot": "スナップショットの作成",
-    "label.action.take.snapshot.processing": "スナップショットを作成しています....",
-    "label.action.unmanage.cluster": "クラスターの非管理対象化",
-    "label.action.unmanage.cluster.processing": "クラスターを非管理対象にしています...",
-    "label.action.update.OS.preference": "OS 基本設定の更新",
-    "label.action.update.OS.preference.processing": "OS 基本設定を更新しています...",
-    "label.action.update.resource.count": "リソース数の更新",
-    "label.action.update.resource.count.processing": "リソース数を更新しています...",
-    "label.action.vmsnapshot.create": "VM スナップショットの作成",
-    "label.action.vmsnapshot.delete": "VM スナップショットの削除",
-    "label.action.vmsnapshot.revert": "VM スナップショットに戻す",
-    "label.actions": "操作",
-    "label.activate.project": "プロジェクトのアクティブ化",
-    "label.active.sessions": "アクティブなセッション",
-    "label.add": "追加",
-    "label.add.ACL": "ACL の追加",
-    "label.add.BigSwitchBcf.device": "BigSwitch BCF コントローラの追加",
-    "label.add.BrocadeVcs.device": "Brocade VCS スイッチの追加",
-    "label.add.F5.device": "F5 デバイスの追加",
-    "label.add.LDAP.account": "LDAP アカウントの追加",
-    "label.add.NiciraNvp.device": "NVP Controller の追加",
-    "label.add.OpenDaylight.device": "OpenDaylight コントローラーの追加",
-    "label.add.PA.device": "Palo Alto デバイスの追加",
-    "label.add.SRX.device": "SRX デバイスの追加",
-    "label.add.VM.to.tier": "階層への VM の追加",
-    "label.add.VPN.gateway": "VPN ゲートウェイの追加",
-    "label.add.account": "アカウントの追加",
-    "label.add.account.to.project": "プロジェクトへのアカウントの追加",
-    "label.add.accounts": "アカウントの追加",
-    "label.add.accounts.to": "アカウントの追加先:",
-    "label.add.acl.list": "ACL 一覧の追加",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "新しいアフィニティ グループの追加",
-    "label.add.baremetal.dhcp.device": "ベアメタル DHCP デバイスの追加",
-    "label.add.baremetal.rack.configuration": "ベアメタルラック設定の追加",
-    "label.add.by": "追加単位",
-    "label.add.by.cidr": "CIDR で追加",
-    "label.add.by.group": "グループで追加",
-    "label.add.ciscoASA1000v": "Cisco ASA 1000V リソースの追加",
-    "label.add.cluster": "クラスターの追加",
-    "label.add.compute.offering": "コンピューティング オファリングの追加",
-    "label.add.direct.iprange": "直接 IP アドレスの範囲の追加",
-    "label.add.disk.offering": "ディスク オファリングの追加",
-    "label.add.domain": "ドメインの追加",
-    "label.add.egress.rule": "送信規則の追加",
-    "label.add.firewall": "ファイアウォール規則の追加",
-    "label.add.globo.dns": "GloboDNS の追加",
-    "label.add.gslb": "GSLB の追加",
-    "label.add.guest.network": "ゲスト ネットワークの追加",
-    "label.add.host": "ホストの追加",
-    "label.add.ingress.rule": "受信規則の追加",
-    "label.add.intermediate.certificate": "中間証明書の追加",
-    "label.add.internal.lb": "内部 LB の追加",
-    "label.add.ip.range": "IP アドレスの範囲の追加",
-    "label.add.isolated.guest.network": "分離ゲストネットワークの追加",
-    "label.add.isolated.guest.network.with.sourcenat": "分離ゲストネットワーク(送信元NAT)の追加",
-    "label.add.isolated.network": "分離されたネットワークの追加",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "LDAP アカウントの追加",
-    "label.add.list.name": "ACL 一覧名",
-    "label.add.load.balancer": "ロード バランサーの追加",
-    "label.add.more": "そのほかの項目の追加",
-    "label.add.netScaler.device": "NetScaler デバイスの追加",
-    "label.add.network": "ネットワークの追加",
-    "label.add.network.ACL": "ネットワーク ACL の追加",
-    "label.add.network.acl.list": "ネットワーク ACL 一覧の追加",
-    "label.add.network.device": "ネットワーク デバイスの追加",
-    "label.add.network.offering": "ネットワーク オファリングの追加",
-    "label.add.new.F5": "新しい F5 の追加",
-    "label.add.new.NetScaler": "新しい NetScaler の追加",
-    "label.add.new.PA": "新しい Palo Alto の追加",
-    "label.add.new.SRX": "新しい SRX の追加",
-    "label.add.new.gateway": "新しいゲートウェイの追加",
-    "label.add.new.tier": "新しい階層の追加",
-    "label.add.nfs.secondary.staging.store": "NFS セカンダリ ステージング ストアの追加",
-    "label.add.physical.network": "物理ネットワークの追加",
-    "label.add.pod": "ポッドの追加",
-    "label.add.port.forwarding.rule": "ポート転送規則の追加",
-    "label.add.portable.ip.range": "ポータブル IP アドレスの範囲の追加",
-    "label.add.primary.storage": "プライマリ ストレージの追加",
-    "label.add.private.gateway": "プライベートゲートウェイの追加",
-    "label.add.region": "リージョンの追加",
-    "label.add.resources": "リソースの追加",
-    "label.add.role": "Add Role",
-    "label.add.route": "ルートの追加",
-    "label.add.rule": "規則の追加",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "セカンダリ ストレージの追加",
-    "label.add.security.group": "セキュリティ グループの追加",
-    "label.add.service.offering": "サービス オファリングの追加",
-    "label.add.static.nat.rule": "静的 NAT 規則の追加",
-    "label.add.static.route": "静的ルートの追加",
-    "label.add.system.service.offering": "システム サービス オファリングの追加",
-    "label.add.template": "テンプレートの追加",
-    "label.add.to.group": "追加先グループ",
-    "label.add.ucs.manager": "UCS Manager の追加",
-    "label.add.user": "ユーザーの追加",
-    "label.add.userdata": "ユーザーデータ",
-    "label.add.vlan": "VLAN の追加",
-    "label.add.vm": "VM の追加",
-    "label.add.vms": "VM の追加",
-    "label.add.vms.to.lb": "ロード バランサー規則への VM の追加",
-    "label.add.vmware.datacenter": "VMware データセンターの追加",
-    "label.add.vnmc.device": "VNMC デバイスの追加",
-    "label.add.vnmc.provider": "VNMC プロバイダーの追加",
-    "label.add.volume": "ボリュームの追加",
-    "label.add.vpc": "VPC の追加",
-    "label.add.vpc.offering": "VPC オファリングの追加",
-    "label.add.vpn.customer.gateway": "VPN カスタマー ゲートウェイの追加",
-    "label.add.vpn.user": "VPN ユーザーの追加",
-    "label.add.vxlan": "VXLAN の追加",
-    "label.add.zone": "ゾーンの追加",
-    "label.added.brocade.vcs.switch": "新しい Brocade VCS スイッチを追加しました",
-    "label.added.network.offering": "ネットワーク オファリングを追加しました",
-    "label.added.new.bigswitch.bcf.controller": "新しい BigSwitch BCF コントローラを追加しました",
-    "label.added.nicira.nvp.controller": "新しい Nicira NVP Controller を追加しました",
-    "label.addes.new.f5": "新しい F5 を追加しました",
-    "label.adding": "追加しています",
-    "label.adding.cluster": "クラスターを追加しています",
-    "label.adding.failed": "追加できませんでした",
-    "label.adding.pod": "ポッドを追加しています",
-    "label.adding.processing": "追加しています...",
-    "label.adding.succeeded": "追加しました",
-    "label.adding.user": "ユーザーを追加しています",
-    "label.adding.zone": "ゾーンを追加しています",
-    "label.additional.networks": "追加のネットワーク",
-    "label.admin": "管理者",
-    "label.admin.accounts": "管理者アカウント",
-    "label.advanced": "拡張",
-    "label.advanced.mode": "拡張モード",
-    "label.advanced.search": "高度な検索",
-    "label.affinity": "アフィニティ",
-    "label.affinity.group": "アフィニティ グループ",
-    "label.affinity.groups": "アフィニティ グループ",
-    "label.agent.password": "エージェント パスワード",
-    "label.agent.port": "エージェントポート",
-    "label.agent.state": "エージェントの状態",
-    "label.agent.username": "エージェント ユーザー名",
-    "label.agree": "同意する",
-    "label.alert": "アラート",
-    "label.alert.archived": "アラートがアーカイブされました",
-    "label.alert.deleted": "アラートが削除されました",
-    "label.alert.details": "アラートの詳細",
-    "label.algorithm": "アルゴリズム",
-    "label.allocated": "割り当て済み",
-    "label.allocation.state": "割り当て状態",
-    "label.allow": "許可",
-    "label.anti.affinity": "アンチアフィニティ",
-    "label.anti.affinity.group": "アンチアフィニティ グループ",
-    "label.anti.affinity.groups": "アンチアフィニティ グループ",
-    "label.api.key": "API キー",
-    "label.api.version": "API バージョン",
-    "label.app.name": "CloudStack",
-    "label.apply": "適用",
-    "label.archive": "アーカイブ",
-    "label.archive.alerts": "アラートのアーカイブ",
-    "label.archive.events": "イベントのアーカイブ",
-    "label.assign": "割り当て",
-    "label.assign.instance.another": "ほかのアカウントへのインスタンスの割り当て",
-    "label.assign.to.load.balancer": "ロード バランサーにインスタンスを割り当てています",
-    "label.assign.vms": "仮想マシンの割り当て",
-    "label.assigned.vms": "割り当て済み VM",
-    "label.associate.public.ip": "パブリック IP アドレスの関連付け",
-    "label.associated.network": "関連付けられたネットワーク",
-    "label.associated.network.id": "関連付けられたネットワーク ID",
-    "label.associated.profile": "関連付けられたプロファイル",
-    "label.attached.iso": "アタッチされた ISO",
-    "label.author.email": "作成者の電子メール",
-    "label.author.name": "作成者の名前",
-    "label.autoscale": "自動サイズ設定",
-    "label.autoscale.configuration.wizard": "オートスケール設定ウィザード",
-    "label.availability": "可用性",
-    "label.availability.zone": "アベイラビリティ ゾーン",
-    "label.availabilityZone": "アベイラビリティゾーン",
-    "label.available": "使用可能",
-    "label.available.public.ips": "使用できるパブリック IP アドレス",
-    "label.back": "戻る",
-    "label.bandwidth": "帯域幅",
-    "label.baremetal.dhcp.devices": "ベアメタル DHCP デバイス",
-    "label.baremetal.dhcp.provider": "ベアメタル DHCP プロバイダー",
-    "label.baremetal.pxe.device": "ベアメタル PXE デバイスの追加",
-    "label.baremetal.pxe.devices": "ベアメタル PXE デバイス",
-    "label.baremetal.pxe.provider": "ベアメタル PXE プロバイダー",
-    "label.baremetal.rack.configuration": "ベアメタルラック設定",
-    "label.basic": "基本",
-    "label.basic.mode": "基本モード",
-    "label.bigswitch.bcf.details": "BigSwitch BCF の詳細",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF の NAT を有効化しました",
-    "label.bigswitch.controller.address": "BigSwitch BCF コントローラのアドレス",
-    "label.blade.id": "ブレード ID",
-    "label.blades": "ブレード",
-    "label.bootable": "起動可能",
-    "label.broadcast.domain.range": "ブロードキャスト ドメインの範囲",
-    "label.broadcast.domain.type": "ブロードキャスト ドメインの種類",
-    "label.broadcast.uri": "ブロードキャスト URI",
-    "label.broadcasturi": "ブロードキャスト URI",
-    "label.broadcat.uri": "ブロードキャスト URI",
-    "label.brocade.vcs.address": "VCS スイッチ アドレス",
-    "label.brocade.vcs.details": "Brocade VCS スイッチの詳細",
-    "label.by.account": "アカウント",
-    "label.by.alert.type": "アラートの種類",
-    "label.by.availability": "可用性",
-    "label.by.date.end": "日付 (終了)",
-    "label.by.date.start": "日付 (開始)",
-    "label.by.domain": "ドメイン",
-    "label.by.end.date": "終了日",
-    "label.by.event.type": "イベントの種類",
-    "label.by.level": "レベル",
-    "label.by.pod": "ポッド",
-    "label.by.role": "役割",
-    "label.by.start.date": "開始日",
-    "label.by.state": "状態",
-    "label.by.traffic.type": "トラフィックの種類",
-    "label.by.type": "種類",
-    "label.by.type.id": "種類 ID",
-    "label.by.zone": "ゾーン",
-    "label.bytes.received": "受信バイト",
-    "label.bytes.sent": "送信バイト",
-    "label.cache.mode": "書き込みキャッシュの種類",
-    "label.cancel": "キャンセル",
-    "label.capacity": "処理能力",
-    "label.capacity.bytes": "処理能力 (バイト)",
-    "label.capacity.iops": "処理能力 (IOPS)",
-    "label.certificate": "サーバー証明書",
-    "label.change.affinity": "アフィニティの変更",
-    "label.change.ipaddress": "NIC の IP アドレスを変更",
-    "label.change.service.offering": "サービス オファリングの変更",
-    "label.change.value": "値の変更",
-    "label.character": "文字",
-    "label.chassis": "シャーシ",
-    "label.checksum": "チェックサム",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR またはアカウント/セキュリティ グループ",
-    "label.cidr.list": "送信元 CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000V の IP アドレス",
-    "label.cisco.nexus1000v.password": "Nexus 1000V のパスワード",
-    "label.cisco.nexus1000v.username": "Nexus 1000V のユーザー名",
-    "label.ciscovnmc.resource.details": "Cisco VNMC リソースの詳細",
-    "label.clean.up": "クリーン アップする",
-    "label.clear.list": "一覧の消去",
-    "label.close": "閉じる",
-    "label.cloud.console": "クラウド管理コンソール",
-    "label.cloud.managed": "Cloud.com による管理",
-    "label.cluster": "クラスター",
-    "label.cluster.name": "クラスター名",
-    "label.cluster.type": "クラスターの種類",
-    "label.clusters": "クラスター",
-    "label.clvm": "CLVM",
-    "label.code": "コード",
-    "label.community": "コミュニティ",
-    "label.compute": "コンピューティング",
-    "label.compute.and.storage": "コンピューティングとストレージ",
-    "label.compute.offering": "コンピューティング オファリング",
-    "label.compute.offerings": "コンピューティング オファリング",
-    "label.configuration": "構成",
-    "label.configure": "構成",
-    "label.configure.ldap": "LDAP の構成",
-    "label.configure.network.ACLs": "ネットワーク ACL の構成",
-    "label.configure.sticky.policy": "スティッキーポリシーの設定",
-    "label.configure.vpc": "VPC の構成",
-    "label.confirm.password": "パスワードの確認入力",
-    "label.confirmation": "確認",
-    "label.congratulations": "セットアップはこれで完了です。",
-    "label.conserve.mode": "節約モード",
-    "label.console.proxy": "コンソール プロキシ",
-    "label.console.proxy.vm": "コンソール プロキシ VM",
-    "label.continue": "続行",
-    "label.continue.basic.install": "基本インストールを続行する",
-    "label.copying.iso": "ISO をコピーしています",
-    "label.corrections.saved": "接続が保存されました",
-    "label.counter": "カウンター",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "割り当て済みの CPU",
-    "label.cpu.allocated.for.VMs": "VM に割り当て済みの CPU",
-    "label.cpu.limits": "CPU 制限",
-    "label.cpu.mhz": "CPU (MHz)",
-    "label.cpu.utilized": "CPU 使用率",
-    "label.create.VPN.connection": "VPN 接続の作成",
-    "label.create.nfs.secondary.staging.storage": "NFS セカンダリ ステージング ストアを作成する",
-    "label.create.nfs.secondary.staging.store": "NFS セカンダリ ステージング ストアを作成する",
-    "label.create.project": "プロジェクトの作成",
-    "label.create.ssh.key.pair": "SSH のキーペアを作成",
-    "label.create.template": "テンプレートの作成",
-    "label.created": "作成日時",
-    "label.created.by.system": "システム作成",
-    "label.cross.zones": "クロス ゾーン",
-    "label.custom": "カスタム",
-    "label.custom.disk.iops": "カスタム IOPS",
-    "label.custom.disk.offering": "カスタムディスクオファリング",
-    "label.custom.disk.size": "カスタム ディスク サイズ",
-    "label.daily": "毎日",
-    "label.data.disk.offering": "データ ディスク オファリング",
-    "label.date": "日時",
-    "label.day": "日",
-    "label.day.of.month": "毎月指定日",
-    "label.day.of.week": "毎週指定日",
-    "label.dc.name": "DC 名",
-    "label.dead.peer.detection": "停止ピアを検出する",
-    "label.decline.invitation": "招待の辞退",
-    "label.dedicate": "専用に設定",
-    "label.dedicate.cluster": "クラスターを専用に設定",
-    "label.dedicate.host": "ホストを専用に設定",
-    "label.dedicate.pod": "ポッドを専用に設定",
-    "label.dedicate.vlan.vni.range": "VLAN/VNI の範囲を専用に設定",
-    "label.dedicate.zone": "ゾーンを専用に設定",
-    "label.dedicated": "専用",
-    "label.dedicated.vlan.vni.ranges": "専用 VLAN/VNI の範囲",
-    "label.default": "デフォルト",
-    "label.default.egress.policy": "デフォルトの送信ポリシー",
-    "label.default.use": "デフォルト使用",
-    "label.default.view": "デフォルト ビュー",
-    "label.delete": "削除",
-    "label.delete.BigSwitchBcf": "BigSwitch BCF コントローラの削除",
-    "label.delete.BrocadeVcs": "Brocade VCS スイッチの削除",
-    "label.delete.F5": "F5 の削除",
-    "label.delete.NetScaler": "NetScaler の削除",
-    "label.delete.NiciraNvp": "NVP Controller の削除",
-    "label.delete.OpenDaylight.device": "OpenDaylight コントローラーの削除",
-    "label.delete.PA": "Palo Alto の削除",
-    "label.delete.SRX": "SRX の削除",
-    "label.delete.VPN.connection": "VPN 接続の削除",
-    "label.delete.VPN.customer.gateway": "VPN カスタマー ゲートウェイの削除",
-    "label.delete.VPN.gateway": "VPN ゲートウェイの削除",
-    "label.delete.acl.list": "ACL 一覧の削除",
-    "label.delete.affinity.group": "アフィニティ グループの削除",
-    "label.delete.alerts": "アラートの削除",
-    "label.delete.baremetal.rack.configuration": "ベアメタルラック設定の削除",
-    "label.delete.ciscoASA1000v": "Cisco ASA 1000V リソースの削除",
-    "label.delete.ciscovnmc.resource": "Cisco VNMC リソースの削除",
-    "label.delete.events": "イベントの削除",
-    "label.delete.gateway": "ゲートウェイの削除",
-    "label.delete.internal.lb": "内部 LB の削除",
-    "label.delete.portable.ip.range": "ポータブル IP アドレスの範囲の削除",
-    "label.delete.profile": "プロファイルの削除",
-    "label.delete.project": "プロジェクトの削除",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "セカンダリ ステージング ストアの削除",
-    "label.delete.ucs.manager": "UCS Manager の削除",
-    "label.delete.vpn.user": "VPN ユーザーの削除",
-    "label.deleting.failed": "削除できませんでした",
-    "label.deleting.processing": "削除しています...",
-    "label.deny": "拒否",
-    "label.deployment.planner": "展開プランナー",
-    "label.description": "説明",
-    "label.destination.physical.network.id": "ブリッジ先物理ネットワーク ID",
-    "label.destination.zone": "コピー先ゾーン",
-    "label.destroy": "破棄",
-    "label.destroy.router": "ルーターの破棄",
-    "label.destroy.vm.graceperiod": "VM 破棄の猶予期間",
-    "label.detaching.disk": "ディスクをデタッチしています",
-    "label.details": "詳細",
-    "label.device.id": "デバイス ID",
-    "label.devices": "デバイス",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "直接アタッチされているパブリック IP アドレス",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "共有ネットワークの IP アドレス",
-    "label.disable.autoscale": "自動サイズ設定の無効化",
-    "label.disable.host": "ホストの無効化",
-    "label.disable.network.offering": "ネットワーク オファリングの無効化",
-    "label.disable.provider": "プロバイダーの無効化",
-    "label.disable.vnmc.provider": "VNMC プロバイダーの無効化",
-    "label.disable.vpc.offering": "VPC オファリングの無効化",
-    "label.disable.vpn": "リモート アクセス VPN の無効化",
-    "label.disabled": "無効",
-    "label.disabling.vpn.access": "VPN アクセスを無効にしています",
-    "label.disassociate.profile.blade": "プロファイルとブレードの関連付けの解除",
-    "label.disbale.vnmc.device": "VNMC デバイスの無効化",
-    "label.disk.allocated": "割り当て済みのディスク",
-    "label.disk.bytes.read.rate": "ディスク読み取り速度 (BPS)",
-    "label.disk.bytes.write.rate": "ディスク書き込み速度 (BPS)",
-    "label.disk.iops.max": "最大 IOPS",
-    "label.disk.iops.min": "最小 IOPS",
-    "label.disk.iops.read.rate": "ディスク読み取り速度 (IOPS)",
-    "label.disk.iops.total": "IOPS 合計",
-    "label.disk.iops.write.rate": "ディスク書き込み速度 (IOPS)",
-    "label.disk.offering": "ディスク オファリング",
-    "label.disk.offering.details": "ディスクオファリングの詳細",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "プロビジョニングの種類",
-    "label.disk.read.bytes": "ディスク読み取り (バイト)",
-    "label.disk.read.io": "ディスク読み取り (IO)",
-    "label.disk.size": "ディスク サイズ",
-    "label.disk.size.gb": "ディスク サイズ (GB)",
-    "label.disk.total": "ディスク合計",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "ディスク ボリューム",
-    "label.disk.write.bytes": "ディスク書き込み (バイト)",
-    "label.disk.write.io": "ディスク書き込み (IO)",
-    "label.diskoffering": "ディスクオファリング",
-    "label.display.name": "表示名",
-    "label.display.text": "表示テキスト",
-    "label.distributedrouter": "分散ルーター",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "ドメイン",
-    "label.domain.admin": "ドメイン管理者",
-    "label.domain.details": "ドメインの詳細",
-    "label.domain.id": "ドメイン ID",
-    "label.domain.lower": "ドメイン",
-    "label.domain.name": "ドメイン名",
-    "label.domain.router": "ドメイン ルーター",
-    "label.domain.suffix": "DNS ドメイン サフィックス (例: xyz.com)",
-    "label.done": "完了",
-    "label.double.quotes.are.not.allowed": "二重引用符は使用できません",
-    "label.download.progress": "ダウンロードの進捗状況",
-    "label.drag.new.position": "新しい位置にドラッグ",
-    "label.duration.in.sec": "持続時間(秒)",
-    "label.dynamically.scalable": "動的にサイズ設定する",
-    "label.edit": "編集",
-    "label.edit.acl.rule": "ACL 規則の編集",
-    "label.edit.affinity.group": "アフィニティ グループの編集",
-    "label.edit.lb.rule": "LB 規則の編集",
-    "label.edit.network.details": "ネットワークの詳細の編集",
-    "label.edit.project.details": "プロジェクトの詳細の編集",
-    "label.edit.region": "リージョンの編集",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "ルールの編集",
-    "label.edit.secondary.ips": "セカンダリ IP の編集",
-    "label.edit.tags": "タグの編集",
-    "label.edit.traffic.type": "トラフィックの種類の編集",
-    "label.edit.vpc": "VPC の編集",
-    "label.egress.default.policy": "送信のデフォルト ポリシー",
-    "label.egress.rule": "送信規則",
-    "label.egress.rules": "送信規則",
-    "label.elastic": "エラスティック",
-    "label.elastic.IP": "エラスティック IP アドレス",
-    "label.elastic.LB": "エラスティック LB",
-    "label.email": "電子メール",
-    "label.email.lower": "電子メール",
-    "label.enable.autoscale": "自動サイズ設定の有効化",
-    "label.enable.host": "ホストの有効化",
-    "label.enable.network.offering": "ネットワーク オファリングの有効化",
-    "label.enable.provider": "プロバイダーの有効化",
-    "label.enable.s3": "S3 ベースのセカンダリ ストレージの有効化",
-    "label.enable.swift": "Swift の有効化",
-    "label.enable.vnmc.device": "VNMC デバイスの有効化",
-    "label.enable.vnmc.provider": "VNMC プロバイダーの有効化",
-    "label.enable.vpc.offering": "VPC オファリングの有効化",
-    "label.enable.vpn": "リモート アクセス VPN の有効化",
-    "label.enabling.vpn": "VPN を有効にしています",
-    "label.enabling.vpn.access": "VPN アクセスを有効にしています",
-    "label.end.IP": "終了 IP アドレス",
-    "label.end.port": "終了ポート",
-    "label.end.reserved.system.IP": "予約済み終了システム IP アドレス",
-    "label.end.vlan": "終了 VLAN",
-    "label.end.vxlan": "終了 VXLAN",
-    "label.endpoint": "エンドポイント",
-    "label.endpoint.or.operation": "エンドポイントまたは操作",
-    "label.enter.token": "トークンの入力",
-    "label.error": "エラー",
-    "label.error.code": "エラー コード",
-    "label.error.upper": "エラー",
-    "label.esx.host": "ESX/ESXi ホスト",
-    "label.event": "イベント",
-    "label.event.archived": "イベントがアーカイブされました",
-    "label.event.deleted": "イベントが削除されました",
-    "label.every": "毎",
-    "label.example": "例",
-    "label.expunge": "抹消",
-    "label.external.link": "外部リンク",
-    "label.extractable": "抽出可能",
-    "label.extractable.lower": "展開",
-    "label.f5": "F5",
-    "label.f5.details": "F5 の詳細",
-    "label.failed": "失敗",
-    "label.featured": "おすすめ",
-    "label.fetch.latest": "最新情報の取得",
-    "label.filterBy": "フィルター",
-    "label.fingerprint": "フィンガープリント",
-    "label.firewall": "ファイアウォール",
-    "label.first.name": "名",
-    "label.firstname.lower": "名",
-    "label.format": "形式",
-    "label.format.lower": "フォーマット",
-    "label.friday": "金曜日",
-    "label.full": "完全",
-    "label.full.path": "フル パス",
-    "label.gateway": "ゲートウェイ",
-    "label.general.alerts": "一般アラート",
-    "label.generating.url": "URL を生成しています",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS の設定",
-    "label.gluster.volume": "ボリューム",
-    "label.go.step.2": "手順 2 に進む",
-    "label.go.step.3": "手順 3 に進む",
-    "label.go.step.4": "手順 4 に進む",
-    "label.go.step.5": "手順 5 に進む",
-    "label.gpu": "GPU",
-    "label.group": "グループ",
-    "label.group.by.account": "アカウント別グループ",
-    "label.group.by.cluster": "クラスター別グループ",
-    "label.group.by.pod": "ポッド別グループ",
-    "label.group.by.zone": "ゾーン別グループ",
-    "label.group.optional": "グループ (オプション)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "割り当て済み負荷分散",
-    "label.gslb.assigned.lb.more": "負荷分散の追加割り当て",
-    "label.gslb.delete": "GSLB の削除",
-    "label.gslb.details": "GSLB の詳細",
-    "label.gslb.domain.name": "GSLB ドメイン名",
-    "label.gslb.lb.details": "負荷分散の詳細",
-    "label.gslb.lb.remove": "この GSLB から負荷分散を削除",
-    "label.gslb.lb.rule": "負荷分散規則",
-    "label.gslb.service": "GSLB サービス",
-    "label.gslb.service.private.ip": "GSLB サービスのプライベート IP アドレス",
-    "label.gslb.service.public.ip": "GSLB サービスのパブリック IP アドレス",
-    "label.gslb.servicetype": "サービスの種類",
-    "label.guest": "ゲスト",
-    "label.guest.cidr": "ゲスト CIDR",
-    "label.guest.end.ip": "ゲストの終了 IP アドレス",
-    "label.guest.gateway": "ゲスト ゲートウェイ",
-    "label.guest.ip": "ゲスト IP アドレス",
-    "label.guest.ip.range": "ゲスト IP アドレスの範囲",
-    "label.guest.netmask": "ゲスト ネットマスク",
-    "label.guest.network.details": "ゲスト ネットワークの詳細",
-    "label.guest.networks": "ゲスト ネットワーク",
-    "label.guest.start.ip": "ゲストの開始 IP アドレス",
-    "label.guest.traffic": "ゲスト トラフィック",
-    "label.guest.traffic.vswitch.name": "ゲスト トラフィックの vSwitch 名",
-    "label.guest.traffic.vswitch.type": "ゲスト トラフィックの vSwitch の種類",
-    "label.guest.type": "ゲストの種類",
-    "label.ha.enabled": "高可用性有効",
-    "label.health.check": "ヘルス チェック",
-    "label.health.check.advanced.options": "拡張オプション:",
-    "label.health.check.configurations.options": "設定オプション:",
-    "label.health.check.interval.in.sec": "ヘルス チェック間隔 (秒)",
-    "label.health.check.message.desc": "ロードバランサーは自動的にインスタンスのヘルスチェックを行い、インスタンスへのトラフィックはヘルスチェックがされません",
-    "label.health.check.wizard": "ヘルスチェック ウィザード",
-    "label.healthy.threshold": "正常しきい値",
-    "label.help": "ヘルプ",
-    "label.hide.ingress.rule": "受信規則を隠す",
-    "label.hints": "ヒント",
-    "label.home": "ホーム",
-    "label.host": "ホスト",
-    "label.host.MAC": "ホストの MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "ホスト名",
-    "label.host.tag": "ホストタグ",
-    "label.host.tags": "ホスト タグ",
-    "label.hosts": "ホスト",
-    "label.hourly": "毎時",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "Hyper-V のトラフィック ラベル",
-    "label.hypervisor": "ハイパーバイザー",
-    "label.hypervisor.capabilities": "ハイパーバイザーの機能",
-    "label.hypervisor.snapshot.reserve": "ハイパーバイザー スナップショット予約",
-    "label.hypervisor.type": "ハイパーバイザーの種類",
-    "label.hypervisor.version": "ハイパーバイザーのバージョン",
-    "label.hypervisors": "ハイパーバイザー",
-    "label.id": "ID",
-    "label.info": "情報",
-    "label.info.upper": "情報",
-    "label.ingress.rule": "受信規則",
-    "label.initiated.by": "開始ユーザー",
-    "label.inside.port.profile": "内部ポート プロファイル",
-    "label.installWizard.addClusterIntro.subtitle": "クラスターについて",
-    "label.installWizard.addClusterIntro.title": "クラスターを追加しましょう",
-    "label.installWizard.addHostIntro.subtitle": "ホストについて",
-    "label.installWizard.addHostIntro.title": "ホストを追加しましょう",
-    "label.installWizard.addPodIntro.subtitle": "ポッドについて",
-    "label.installWizard.addPodIntro.title": "ポッドを追加しましょう",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "プライマリ ストレージについて",
-    "label.installWizard.addPrimaryStorageIntro.title": "プライマリ ストレージを追加しましょう",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "セカンダリ ストレージについて",
-    "label.installWizard.addSecondaryStorageIntro.title": "セカンダリ ストレージを追加しましょう",
-    "label.installWizard.addZone.title": "ゾーンの追加",
-    "label.installWizard.addZoneIntro.subtitle": "ゾーンについて",
-    "label.installWizard.addZoneIntro.title": "ゾーンを追加しましょう",
-    "label.installWizard.click.launch": "[起動] をクリックしてください。",
-    "label.installWizard.subtitle": "このガイド ツアーは CloudStack&#8482; 環境のセットアップに役立ちます",
-    "label.installWizard.title": "CloudStack&#8482; へようこそ",
-    "label.instance": "インスタンス",
-    "label.instance.limits": "インスタンス制限",
-    "label.instance.name": "インスタンス名",
-    "label.instance.port": "インスタンス ポート",
-    "label.instance.scaled.up": "インスタンスを選択したオファリングにスケールする",
-    "label.instances": "インスタンス",
-    "label.instanciate.template.associate.profile.blade": "テンプレートのインスタンス作成およびプロファイルとブレードの関連付け",
-    "label.intermediate.certificate": "中間証明書 {0}",
-    "label.internal.dns.1": "内部 DNS 1",
-    "label.internal.dns.2": "内部 DNS 2",
-    "label.internal.lb": "内部 LB",
-    "label.internal.lb.details": "内部 LB の詳細",
-    "label.internal.name": "内部名",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "間隔の種類",
-    "label.introduction.to.cloudstack": "CloudStack&#8482; の紹介",
-    "label.invalid.integer": "無効な整数",
-    "label.invalid.number": "無効な数",
-    "label.invitations": "招待状",
-    "label.invite": "招待",
-    "label.invite.to": "招待するプロジェクト:",
-    "label.invited.accounts": "招待済みアカウント",
-    "label.ip": "IP",
-    "label.ip.address": "IP アドレス",
-    "label.ip.allocations": "IP アドレスの割り当て",
-    "label.ip.limits": "パブリック IP アドレスの制限",
-    "label.ip.or.fqdn": "IP アドレスまたは FQDN",
-    "label.ip.range": "IP アドレスの範囲",
-    "label.ip.ranges": "IP アドレスの範囲",
-    "label.ipaddress": "IP アドレス",
-    "label.ips": "IP アドレス",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 終了 IP アドレス",
-    "label.ipv4.gateway": "IPv4 ゲートウェイ",
-    "label.ipv4.netmask": "IPv4 ネットマスク",
-    "label.ipv4.start.ip": "IPv4 開始 IP アドレス",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP アドレス",
-    "label.ipv6.dns1": "IPv6 DNS 1",
-    "label.ipv6.dns2": "IPv6 DNS 2",
-    "label.ipv6.end.ip": "IPv6 終了 IP アドレス",
-    "label.ipv6.gateway": "IPv6 ゲートウェイ",
-    "label.ipv6.start.ip": "IPv6 開始 IP アドレス",
-    "label.is.default": "デフォルト",
-    "label.is.redundant.router": "冗長",
-    "label.is.shared": "共有",
-    "label.is.system": "システム",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO 起動",
-    "label.isolated.networks": "分離されたネットワーク",
-    "label.isolation.method": "分離方法",
-    "label.isolation.mode": "分離モード",
-    "label.isolation.uri": "分離 URI",
-    "label.item.listing": "項目一覧",
-    "label.japanese.keyboard": "日本語キーボード",
-    "label.keep": "保持",
-    "label.keep.colon": "保持:",
-    "label.key": "キー",
-    "label.keyboard.language": "キーボードの言語",
-    "label.keyboard.type": "キーボードの種類",
-    "label.kvm.traffic.label": "KVM のトラフィック ラベル",
-    "label.label": "ラベル",
-    "label.lang.arabic": "アラビア語",
-    "label.lang.brportugese": "ポルトガル語 (ブラジル)",
-    "label.lang.catalan": "カタルニア語",
-    "label.lang.chinese": "簡体字中国語",
-    "label.lang.dutch": "オランダ語 (オランダ)",
-    "label.lang.english": "英語",
-    "label.lang.french": "フランス語",
-    "label.lang.german": "ドイツ語",
-    "label.lang.hungarian": "ハンガリー語",
-    "label.lang.italian": "イタリア語",
-    "label.lang.japanese": "日本語",
-    "label.lang.korean": "韓国語",
-    "label.lang.norwegian": "ノルウェー語",
-    "label.lang.polish": "ポーランド語",
-    "label.lang.russian": "ロシア語",
-    "label.lang.spanish": "スペイン語",
-    "label.last.disconnected": "最終切断日時",
-    "label.last.name": "姓",
-    "label.lastname.lower": "姓",
-    "label.latest.events": "最新イベント",
-    "label.launch": "起動",
-    "label.launch.vm": "VM の起動",
-    "label.launch.zone": "ゾーンの起動",
-    "label.lb.algorithm.leastconn": "最小接続",
-    "label.lb.algorithm.roundrobin": "ラウンドロビン",
-    "label.lb.algorithm.source": "送信元",
-    "label.ldap.configuration": "LDAP 構成",
-    "label.ldap.group.name": "LDAP グループ",
-    "label.ldap.link.type": "種類",
-    "label.ldap.port": "LDAP ポート",
-    "label.level": "レベル",
-    "label.link.domain.to.ldap": "ドメインを LDAP にリンクする",
-    "label.linklocal.ip": "リンク ローカル IP アドレス",
-    "label.load.balancer": "ロード バランサー",
-    "label.load.balancer.type": "ロード バランサーの種類",
-    "label.load.balancing": "負荷分散",
-    "label.load.balancing.policies": "負荷分散ポリシー",
-    "label.loading": "ロードしています",
-    "label.local": "ローカル",
-    "label.local.file": "ローカルファイル",
-    "label.local.storage": "ローカル ストレージ",
-    "label.local.storage.enabled": "ユーザー VM に対しローカルストレージを有効化する",
-    "label.local.storage.enabled.system.vms": "システム VM に対しローカルストレージを有効化する",
-    "label.login": "ログオン",
-    "label.logout": "ログオフ",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC のトラフィック ラベル",
-    "label.make.project.owner": "アカウントのプロジェクト所有者化",
-    "label.make.redundant": "冗長化構成をとる",
-    "label.manage": "管理",
-    "label.manage.resources": "リソースの管理",
-    "label.managed": "管理対象",
-    "label.management": "管理",
-    "label.management.ips": "管理 IP アドレス",
-    "label.management.server": "管理サーバー",
-    "label.max.cpus": "最大 CPU コア数",
-    "label.max.guest.limit": "最大ゲスト制限",
-    "label.max.instances": "最大インスタンス数",
-    "label.max.memory": "最大メモリ (MiB)",
-    "label.max.networks": "最大ネットワーク数",
-    "label.max.primary.storage": "最大プライマリ (GiB)",
-    "label.max.public.ips": "最大パブリック IP アドレス数",
-    "label.max.secondary.storage": "最大セカンダリ (GiB)",
-    "label.max.snapshots": "最大スナップショット数",
-    "label.max.templates": "最大テンプレート数",
-    "label.max.vms": "最大ユーザー VM 数",
-    "label.max.volumes": "最大ボリューム数",
-    "label.max.vpcs": "最大 VPC 数",
-    "label.maximum": "最大",
-    "label.may.continue": "続行できます。",
-    "label.md5.checksum": "MD5 チェックサム",
-    "label.memory": "メモリ",
-    "label.memory.allocated": "割り当て済みのメモリ",
-    "label.memory.limits": "メモリ制限 (MiB)",
-    "label.memory.mb": "メモリ (MB)",
-    "label.memory.total": "メモリ合計",
-    "label.memory.used": "メモリ使用量",
-    "label.menu.accounts": "アカウント",
-    "label.menu.alerts": "アラート",
-    "label.menu.all.accounts": "すべてのアカウント",
-    "label.menu.all.instances": "すべてのインスタンス",
-    "label.menu.community.isos": "コミュニティ ISO",
-    "label.menu.community.templates": "コミュニティ テンプレート",
-    "label.menu.configuration": "構成",
-    "label.menu.dashboard": "ダッシュボード",
-    "label.menu.destroyed.instances": "破棄されたインスタンス",
-    "label.menu.disk.offerings": "ディスク オファリング",
-    "label.menu.domains": "ドメイン",
-    "label.menu.events": "イベント",
-    "label.menu.featured.isos": "おすすめの ISO",
-    "label.menu.featured.templates": "おすすめのテンプレート",
-    "label.menu.global.settings": "グローバル設定",
-    "label.menu.infrastructure": "インフラストラクチャ",
-    "label.menu.instances": "インスタンス",
-    "label.menu.ipaddresses": "IP アドレス",
-    "label.menu.isos": "ISO",
-    "label.menu.my.accounts": "マイ アカウント",
-    "label.menu.my.instances": "マイ インスタンス",
-    "label.menu.my.isos": "マイ ISO",
-    "label.menu.my.templates": "マイ テンプレート",
-    "label.menu.network": "ネットワーク",
-    "label.menu.network.offerings": "ネットワーク オファリング",
-    "label.menu.physical.resources": "物理リソース",
-    "label.menu.regions": "リージョン",
-    "label.menu.running.instances": "実行中のインスタンス",
-    "label.menu.security.groups": "セキュリティ グループ",
-    "label.menu.service.offerings": "サービス オファリング",
-    "label.menu.snapshots": "スナップショット",
-    "label.menu.sshkeypair": "SSH キーペア",
-    "label.menu.stopped.instances": "停止されたインスタンス",
-    "label.menu.storage": "ストレージ",
-    "label.menu.system": "システム",
-    "label.menu.system.service.offerings": "システム オファリング",
-    "label.menu.system.vms": "システム VM",
-    "label.menu.templates": "テンプレート",
-    "label.menu.virtual.appliances": "仮想アプライアンス",
-    "label.menu.virtual.resources": "仮想リソース",
-    "label.menu.volumes": "ボリューム",
-    "label.menu.vpc.offerings": "VPC オファリング",
-    "label.metrics": "メトリックス",
-    "label.metrics.allocated": "割り当て済み",
-    "label.metrics.clusters": "クラスター",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "使用中",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "割り当て済み",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "サイズ",
-    "label.metrics.disk.storagetype": "種類",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "使用中",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "ホスト",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "使用中",
-    "label.metrics.name": "名前",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "スコープ",
-    "label.metrics.state": "状態",
-    "label.metrics.storagepool": "ストレージ プール",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "インスタンスの移行先:",
-    "label.migrate.instance.to.host": "別のホストへのインスタンスの移行",
-    "label.migrate.instance.to.ps": "別のプライマリ ストレージへのインスタンスの移行",
-    "label.migrate.lb.vm": "LB VM の移行",
-    "label.migrate.router.to": "ルーターの移行先:",
-    "label.migrate.systemvm.to": "システム VM の移行先:",
-    "label.migrate.to.host": "ホストへ移行",
-    "label.migrate.to.storage": "ストレージへ移行",
-    "label.migrate.volume": "ボリュームの移行",
-    "label.migrate.volume.to.primary.storage": "別のプライマリ ストレージへのボリュームの移行",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "最小インスタンス数",
-    "label.min.past.the.hr": "分(毎時)",
-    "label.minimum": "最小",
-    "label.minute.past.hour": "分(毎時)",
-    "label.minutes.past.hour": "分(毎時)",
-    "label.mode": "モード",
-    "label.monday": "月曜日",
-    "label.monthly": "毎月",
-    "label.more.templates": "そのほかのテンプレート",
-    "label.move.down.row": "1 行下に移動",
-    "label.move.to.bottom": "最下位に移動",
-    "label.move.to.top": "最上位に移動",
-    "label.move.up.row": "1 行上に移動",
-    "label.my.account": "マイ アカウント",
-    "label.my.network": "マイ ネットワーク",
-    "label.my.templates": "マイ テンプレート",
-    "label.na": "利用不可",
-    "label.name": "名前",
-    "label.name.lower": "名前",
-    "label.name.optional": "名前 (オプション)",
-    "label.nat.port.range": "NAT ポートの範囲",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "ネットマスク",
-    "label.netscaler.details": "NetScaler の詳細",
-    "label.network": "ネットワーク",
-    "label.network.ACL": "ネットワーク ACL",
-    "label.network.ACL.total": "ネットワーク ACL 合計",
-    "label.network.ACLs": "ネットワーク ACL",
-    "label.network.addVM": "VM へのネットワークの追加",
-    "label.network.cidr": "ネットワーク CIDR",
-    "label.network.desc": "ネットワークの説明",
-    "label.network.details": "ネットワークの詳細",
-    "label.network.device": "ネットワーク デバイス",
-    "label.network.device.type": "ネットワーク デバイスの種類",
-    "label.network.domain": "ネットワーク ドメイン",
-    "label.network.domain.text": "ネットワーク ドメイン",
-    "label.network.id": "ネットワーク ID",
-    "label.network.label.display.for.blank.value": "デフォルト ゲートウェイを使用",
-    "label.network.limits": "ネットワーク制限",
-    "label.network.name": "ネットワーク名",
-    "label.network.offering": "ネットワーク オファリング",
-    "label.network.offering.details": "ネットワークオファリングの詳細",
-    "label.network.offering.display.text": "ネットワーク オファリング表示テキスト",
-    "label.network.offering.id": "ネットワーク オファリング ID",
-    "label.network.offering.name": "ネットワーク オファリング名",
-    "label.network.rate": "ネットワーク速度 (MB/秒)",
-    "label.network.rate.megabytes": "ネットワーク速度 (MB/秒)",
-    "label.network.read": "ネットワーク読み取り",
-    "label.network.service.providers": "ネットワーク サービス プロバイダー",
-    "label.network.type": "ネットワークの種類",
-    "label.network.write": "ネットワーク書き込み",
-    "label.networking.and.security": "ネットワークとセキュリティ",
-    "label.networks": "ネットワーク",
-    "label.new": "新規",
-    "label.new.password": "新しいパスワード",
-    "label.current.password": "Current Password",
-    "label.new.project": "新しいプロジェクト",
-    "label.new.ssh.key.pair": "新しい SSH キーペア",
-    "label.new.vm": "新しい VM",
-    "label.next": "次へ",
-    "label.nexusVswitch": "Nexus 1000V",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS サーバー",
-    "label.nfs.storage": "NFS ストレージ",
-    "label.nic.adapter.type": "NIC アダプターの種類",
-    "label.nicira.controller.address": "コントローラー アドレス",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 ゲートウェイ サービスの UUID",
-    "label.nicira.nvp.details": "Nicira NVP の詳細",
-    "label.nicira.transportzoneuuid": "トランスポート ゾーンの UUID",
-    "label.nics": "NIC",
-    "label.no": "いいえ",
-    "label.no.actions": "実行できる操作はありません",
-    "label.no.alerts": "最近のアラートはありません",
-    "label.no.data": "表示するデータがありません",
-    "label.no.errors": "最近のエラーはありません",
-    "label.no.grouping": "(グループなし)",
-    "label.no.isos": "使用できる ISO はありません",
-    "label.no.items": "使用できる項目はありません",
-    "label.no.security.groups": "使用できるセキュリティ グループはありません",
-    "label.no.thanks": "設定しない",
-    "label.none": "なし",
-    "label.not.found": "見つかりません",
-    "label.notifications": "通知",
-    "label.num.cpu.cores": "CPU コア数",
-    "label.number.of.clusters": "クラスター数",
-    "label.number.of.cpu.sockets": "CPU ソケット数",
-    "label.number.of.hosts": "ホスト数",
-    "label.number.of.pods": "ポッド数",
-    "label.number.of.system.vms": "システム VM 数",
-    "label.number.of.virtual.routers": "仮想ルーター数",
-    "label.number.of.zones": "ゾーン数",
-    "label.numretries": "再試行回数",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "月毎",
-    "label.offer.ha": "高可用性を提供する",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight コントローラー",
-    "label.opendaylight.controllerdetail": "OpenDaylight コントローラーの詳細",
-    "label.opendaylight.controllers": "OpenDaylight コントローラー",
-    "label.operator": "演算子",
-    "label.optional": "オプション",
-    "label.order": "順序",
-    "label.os.preference": "OS 基本設定",
-    "label.os.type": "OS の種類",
-    "label.other": "そのほか",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "操作",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "パスワード",
-    "label.outofbandmanagement.port": "ポート",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "ユーザー名",
-    "label.override.guest.traffic": "ゲスト トラフィックをオーバーライドする",
-    "label.override.public.traffic": "パブリック トラフィックをオーバーライドする",
-    "label.ovm.traffic.label": "OVM のトラフィック ラベル",
-    "label.ovm3.cluster": "ネイティブクラスター",
-    "label.ovm3.pool": "ネイティブプール",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "マスター VIP IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "所有するパブリック IP アドレス",
-    "label.owner.account": "所有者アカウント",
-    "label.owner.domain": "所有者ドメイン",
-    "label.palo.alto.details": "Palo Alto の詳細",
-    "label.parent.domain": "親ドメイン",
-    "label.passive": "パッシブ",
-    "label.password": "パスワード",
-    "label.password.enabled": "パスワード管理有効",
-    "label.password.lower": "パスワード",
-    "label.password.reset.confirm": "次のパスワードにリセットされました:",
-    "label.path": "パス",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "永続",
-    "label.physical.network": "物理ネットワーク",
-    "label.physical.network.ID": "物理ネットワーク ID",
-    "label.physical.network.name": "物理ネットワーク名",
-    "label.ping.path": "Ping パス",
-    "label.planner.mode": "プランナー モード",
-    "label.please.complete.the.following.fields": "下記項目を入力してください",
-    "label.please.specify.netscaler.info": "NetScaler 情報を指定してください",
-    "label.please.wait": "お待ちください",
-    "label.plugin.details": "プラグインの詳細",
-    "label.plugins": "プラグイン",
-    "label.pod": "ポッド",
-    "label.pod.dedicated": "ポッドを専用に設定しました",
-    "label.pod.name": "ポッド名",
-    "label.pods": "ポッド",
-    "label.polling.interval.sec": "ポーリング間隔 (秒)",
-    "label.port": "ポート",
-    "label.port.forwarding": "ポート転送",
-    "label.port.forwarding.policies": "ポート転送ポリシー",
-    "label.port.range": "ポートの範囲",
-    "label.portable.ip": "ポータブル IP アドレス",
-    "label.portable.ip.range.details": "ポータブル IP アドレスの範囲の詳細",
-    "label.portable.ip.ranges": "ポータブル IP アドレスの範囲",
-    "label.portable.ips": "ポータブル IP アドレス",
-    "label.powerstate": "Power State",
-    "label.prev": "戻る",
-    "label.previous": "戻る",
-    "label.primary.allocated": "割り当て済みのプライマリ ストレージ",
-    "label.primary.network": "プライマリ ネットワーク",
-    "label.primary.storage": "プライマリ ストレージ",
-    "label.primary.storage.count": "プライマリ ストレージ プール",
-    "label.primary.storage.limits": "プライマリ ストレージ制限 (GiB)",
-    "label.primary.used": "プライマリ ストレージ使用量",
-    "label.private.Gateway": "プライベート ゲートウェイ",
-    "label.private.interface": "プライベート インターフェイス",
-    "label.private.ip": "プライベート IP アドレス",
-    "label.private.ip.range": "プライベート IP アドレスの範囲",
-    "label.private.ips": "プライベート IP アドレス",
-    "label.private.key": "プライベートキー",
-    "label.private.network": "プライベート ネットワーク",
-    "label.private.port": "プライベート ポート",
-    "label.private.zone": "プライベート ゾーン",
-    "label.privatekey": "PKCS#8 秘密キー",
-    "label.profile": "プロファイル",
-    "label.project": "プロジェクト",
-    "label.project.dashboard": "プロジェクト ダッシュボード",
-    "label.project.id": "プロジェクト ID",
-    "label.project.invite": "プロジェクトへの招待",
-    "label.project.name": "プロジェクト名",
-    "label.project.view": "プロジェクト ビュー",
-    "label.projects": "プロジェクト",
-    "label.protocol": "プロトコル",
-    "label.protocol.number": "プロトコル番号",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "プロバイダー",
-    "label.providers": "プロバイダー",
-    "label.public": "パブリック",
-    "label.public.interface": "パブリック インターフェイス",
-    "label.public.ip": "パブリック IP アドレス",
-    "label.public.ips": "パブリック IP アドレス",
-    "label.public.key": "公開鍵",
-    "label.public.lb": "パブリック LB",
-    "label.public.load.balancer.provider": "パブリック ロード バランサー プロバイダー",
-    "label.public.network": "パブリック ネットワーク",
-    "label.public.port": "パブリック ポート",
-    "label.public.traffic": "パブリック トラフィック",
-    "label.public.traffic.vswitch.name": "パブリック トラフィックの vSwitch 名",
-    "label.public.traffic.vswitch.type": "パブリック トラフィックの vSwitch の種類",
-    "label.public.zone": "パブリック ゾーン",
-    "label.purpose": "目的",
-    "label.qos.type": "QoS の種類",
-    "label.quickview": "クイックビュー",
-    "label.quiesce.vm": "VM を休止する",
-    "label.quiet.time.sec": "待ち時間 (秒)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "日時",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "すべてのアカウント",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "状態",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx ユーザー",
-    "label.rbd.monitor": "Ceph モニター",
-    "label.rbd.pool": "Ceph プール",
-    "label.rbd.secret": "Cephx シークレット",
-    "label.reboot": "再起動",
-    "label.recent.errors": "最近のエラー",
-    "label.recover.vm": "VM の復元",
-    "label.redundant.router": "冗長ルーター",
-    "label.redundant.router.capability": "冗長ルーター機能",
-    "label.redundant.state": "冗長状態",
-    "label.redundant.vpc": "冗長 VPC",
-    "label.refresh": "更新",
-    "label.refresh.blades": "ブレードの更新",
-    "label.region": "リージョン",
-    "label.region.details": "リージョンの詳細",
-    "label.regionlevelvpc": "リージョンレベルの VPC",
-    "label.reinstall.vm": "VM の再インストール",
-    "label.related": "関連",
-    "label.release.account": "アカウントから解放",
-    "label.release.account.lowercase": "アカウントから解放",
-    "label.release.dedicated.cluster": "専用クラスターの解放",
-    "label.release.dedicated.host": "専用ホストの解放",
-    "label.release.dedicated.pod": "専用ポッドの解放",
-    "label.release.dedicated.vlan.range": "専用 VLAN の範囲の解放",
-    "label.release.dedicated.zone": "専用ゾーンの解放",
-    "label.remind.later": "アラームを表示する",
-    "label.remove.ACL": "ACL の削除",
-    "label.remove.egress.rule": "送信規則の削除",
-    "label.remove.from.load.balancer": "ロード バランサーからインスタンスを削除しています",
-    "label.remove.ingress.rule": "受信規則の削除",
-    "label.remove.ip.range": "IP アドレスの範囲の削除",
-    "label.remove.ldap": "LDAP の削除",
-    "label.remove.network.offering": "ネットワーク オファリングの削除",
-    "label.remove.pf": "ポート転送規則の削除",
-    "label.remove.project.account": "プロジェクトからのアカウントの削除",
-    "label.remove.region": "リージョンの削除",
-    "label.remove.rule": "規則の削除",
-    "label.remove.ssh.key.pair": "SSH キーペアの削除",
-    "label.remove.static.nat.rule": "静的 NAT 規則の削除",
-    "label.remove.static.route": "静的ルートの削除",
-    "label.remove.this.physical.network": "この物理ネットワークを削除する",
-    "label.remove.tier": "階層の削除",
-    "label.remove.vm.from.lb": "ロード バランサー規則からの VM の削除",
-    "label.remove.vm.load.balancer": "ロード バランサーからの VM の削除",
-    "label.remove.vmware.datacenter": "VMware データセンターの削除",
-    "label.remove.vpc": "VPC の削除",
-    "label.remove.vpc.offering": "VPC オファリングの削除",
-    "label.removing": "削除しています",
-    "label.removing.user": "ユーザーを削除しています",
-    "label.reource.id": "リソース ID",
-    "label.replace.acl": "ACL の置き換え",
-    "label.replace.acl.list": "ACL 一覧の置き換え",
-    "label.required": "必須です",
-    "label.requires.upgrade": "アップグレードが必要",
-    "label.reserved.ip.range": "予約済み IP アドレスの範囲",
-    "label.reserved.system.gateway": "予約済みシステム ゲートウェイ",
-    "label.reserved.system.ip": "予約済みシステム IP アドレス",
-    "label.reserved.system.netmask": "予約済みシステム ネットマスク",
-    "label.reset.VPN.connection": "VPN 接続のリセット",
-    "label.reset.ssh.key.pair": "SSH キーペアのリセット",
-    "label.reset.ssh.key.pair.on.vm": "VM 上の SSH キーペアをリセット",
-    "label.resetVM": "VM のリセット",
-    "label.resize.new.offering.id": "新しいオファリング",
-    "label.resize.new.size": "新しいサイズ(GB)",
-    "label.resize.shrink.ok": "縮小可能にする",
-    "label.resource": "リソース",
-    "label.resource.limit.exceeded": "リソース制限を超過しました",
-    "label.resource.limits": "リソース制限",
-    "label.resource.name": "リソース名",
-    "label.resource.state": "リソースの状態",
-    "label.resources": "リソース",
-    "label.response.timeout.in.sec": "応答タイムアウト (秒)",
-    "label.restart.network": "ネットワークの再起動",
-    "label.restart.required": "再起動が必要",
-    "label.restart.vpc": "VPC の再起動",
-    "label.restore": "復元",
-    "label.retry.interval": "再試行間隔",
-    "label.review": "確認",
-    "label.revoke.project.invite": "招待の取り消し",
-    "label.role": "役割",
-    "label.roles": "ロール",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "ルート証明書",
-    "label.root.disk.controller": "ルート ディスク コントローラー",
-    "label.root.disk.offering": "ルート ディスク オファリング",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "ルーター VM のサイズが拡大されました",
-    "label.routing": "ルーティング",
-    "label.routing.host": "ルーティング ホスト",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "規則番号",
-    "label.rules": "規則",
-    "label.running.vms": "実行中の VM",
-    "label.s3.access_key": "アクセス キー",
-    "label.s3.bucket": "バケット",
-    "label.s3.connection_timeout": "接続タイムアウト",
-    "label.s3.endpoint": "エンドポイント",
-    "label.s3.max_error_retry": "最大エラー再試行数",
-    "label.s3.nfs.path": "S3 NFS パス",
-    "label.s3.nfs.server": "S3 NFS サーバー",
-    "label.s3.secret_key": "秘密キー",
-    "label.s3.socket_timeout": "ソケット タイムアウト",
-    "label.s3.use_https": "HTTPS を使用する",
-    "label.saml.enable": "SAML SSO 認証",
-    "label.saml.entity": "認証プロバイダー",
-    "label.saturday": "土曜日",
-    "label.save": "保存",
-    "label.save.and.continue": "保存して続行",
-    "label.save.changes": "変更を保存する",
-    "label.saving.processing": "保存しています...",
-    "label.scale.up.policy": "サイズ拡大ポリシー",
-    "label.scaledown.policy": "スケールダウン ポリシー",
-    "label.scaleup.policy": "スケールアップ ポリシー",
-    "label.scope": "スコープ",
-    "label.search": "検索",
-    "label.secondary.ips": "セカンダリ IP",
-    "label.secondary.isolated.vlan.id": "分離されたセカンダリ VLAN ID",
-    "label.secondary.staging.store": "セカンダリ ステージング ストア",
-    "label.secondary.staging.store.details": "セカンダリ ステージング ストアの詳細",
-    "label.secondary.storage": "セカンダリ ストレージ",
-    "label.secondary.storage.count": "セカンダリ ストレージ プール",
-    "label.secondary.storage.details": "セカンダリ ストレージの詳細",
-    "label.secondary.storage.limits": "セカンダリ ストレージ制限 (GiB)",
-    "label.secondary.storage.vm": "セカンダリ ストレージ VM",
-    "label.secondary.used": "セカンダリ ストレージ使用量",
-    "label.secret.key": "秘密キー",
-    "label.security.group": "セキュリティ グループ",
-    "label.security.group.name": "セキュリティ グループ名",
-    "label.security.groups": "セキュリティ グループ",
-    "label.security.groups.enabled": "セキュリティ グループ有効",
-    "label.select": "選択",
-    "label.select-view": "ビューの選択",
-    "label.select.a.template": "テンプレートの選択",
-    "label.select.a.zone": "ゾーンの選択",
-    "label.select.instance": "インスタンスの選択",
-    "label.select.instance.to.attach.volume.to": "ボリュームをアタッチするインスタンスを選択してください",
-    "label.select.host":"ホストの選択",
-    "label.select.iso.or.template": "ISO またはテンプレートの選択",
-    "label.select.offering": "オファリングの選択",
-    "label.select.project": "プロジェクトの選択",
-    "label.select.region": "リージョンの選択",
-    "label.select.template": "テンプレートの選択",
-    "label.select.tier": "階層の選択",
-    "label.select.vm.for.static.nat": "静的 NAT 用 VM の選択",
-    "label.sent": "送信済み",
-    "label.server": "サーバー",
-    "label.service.capabilities": "サービスの機能",
-    "label.service.offering": "サービス オファリング",
-    "label.service.offering.details": "サービスオファリングの詳細",
-    "label.service.state": "サービスの状態",
-    "label.services": "サービス",
-    "label.session.expired": "セッションの有効期限が切れました",
-    "label.set.default.NIC": "デフォルト NIC の設定",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "ゾーンの種類のセットアップ",
-    "label.settings": "設定",
-    "label.setup": "セットアップ",
-    "label.setup.network": "ネットワークを設定する",
-    "label.setup.zone": "ゾーンを設定する",
-    "label.shared": "共有",
-    "label.show.advanced.settings": "詳細設定の表示",
-    "label.show.ingress.rule": "受信規則の表示",
-    "label.shutdown.provider": "プロバイダーのシャットダウン",
-    "label.simplified.chinese.keyboard": "簡易中国語キーボード",
-    "label.site.to.site.VPN": "サイト間 VPN",
-    "label.size": "サイズ",
-    "label.skip.guide": "CloudStack を使用したことがあるので、このガイドをスキップする",
-    "label.smb.domain": "SMB ドメイン",
-    "label.smb.password": "SMB パスワード",
-    "label.smb.username": "SMB ユーザー名",
-    "label.snapshot": "スナップショット",
-    "label.snapshot.limits": "スナップショット制限",
-    "label.snapshot.name": "スナップショット名",
-    "label.snapshot.s": "スナップショット",
-    "label.snapshot.schedule": "連続したスナップショットを設定する",
-    "label.snapshots": "スナップショット",
-    "label.sockets": "CPU ソケット",
-    "label.source.ip.address": "送信元 IP アドレス",
-    "label.source.nat": "送信元 NAT",
-    "label.source.nat.supported": "サポートされる送信元 NAT",
-    "label.source.port": "送信元ポート",
-    "label.specify.IP.ranges": "IP アドレスの範囲の指定",
-    "label.specify.vlan": "VLAN を指定する",
-    "label.specify.vxlan": "VXLAN を指定する",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX の詳細",
-    "label.ssh.key.pair": "SSH キーペア",
-    "label.ssh.key.pair.details": "SSH キーペアの詳細",
-    "label.ssh.key.pairs": "SSH キーペア",
-    "label.standard.us.keyboard": "標準(US) キーボード",
-    "label.start.IP": "開始 IP アドレス",
-    "label.start.lb.vm": "LB VM の起動",
-    "label.start.port": "開始ポート",
-    "label.start.reserved.system.IP": "予約済み開始システム IP アドレス",
-    "label.start.vlan": "開始 VLAN",
-    "label.start.vxlan": "開始 VXLAN",
-    "label.state": "状態",
-    "label.suitability": "適合",
-    "label.static.nat": "静的 NAT",
-    "label.static.nat.enabled": "静的 NAT 有効",
-    "label.static.nat.to": "静的 NAT の設定先:",
-    "label.static.nat.vm.details": "静的 NAT VM の詳細",
-    "label.static.routes": "静的ルート",
-    "label.statistics": "統計",
-    "label.status": "状況",
-    "label.step.1": "手順 1",
-    "label.step.1.title": "手順 1: <strong>テンプレートの選択</strong>",
-    "label.step.2": "手順 2",
-    "label.step.2.title": "手順 2: <strong>サービス オファリング</strong>",
-    "label.step.3": "手順 3",
-    "label.step.3.title": "手順 3: <strong id=\"step3_label\">ディスク オファリングの選択</strong>",
-    "label.step.4": "手順 4",
-    "label.step.4.title": "手順 4: <strong>ネットワーク</strong>",
-    "label.step.5": "手順 5",
-    "label.step.5.title": "手順 5: <strong>確認</strong>",
-    "label.stickiness": "持続性",
-    "label.stickiness.method": "持続性方法",
-    "label.sticky.cookie-name": "Cookie 名",
-    "label.sticky.domain": "ドメイン",
-    "label.sticky.expire": "失効",
-    "label.sticky.holdtime": "保持時間",
-    "label.sticky.indirect": "間接",
-    "label.sticky.length": "長さ",
-    "label.sticky.mode": "モード",
-    "label.sticky.name": "スティッキー名",
-    "label.sticky.nocache": "キャッシュなし",
-    "label.sticky.postonly": "ポストのみ",
-    "label.sticky.prefix": "プレフィックス",
-    "label.sticky.request-learn": "ラーニングの要求",
-    "label.sticky.tablesize": "テーブル サイズ",
-    "label.stop": "停止",
-    "label.stop.lb.vm": "LB VM の停止",
-    "label.stopped.vms": "停止中の VM",
-    "label.storage": "ストレージ",
-    "label.storage.pool": "ストレージ プール",
-    "label.storage.tags": "ストレージ タグ",
-    "label.storage.traffic": "ストレージ トラフィック",
-    "label.storage.type": "ストレージの種類",
-    "label.subdomain.access": "サブドメイン アクセス",
-    "label.submit": "送信",
-    "label.submitted.by": "[送信ユーザー: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "成功",
-    "label.sunday": "日曜日",
-    "label.super.cidr.for.guest.networks": "ゲスト ネットワークのスーパー CIDR",
-    "label.supported.services": "サポートされるサービス",
-    "label.supported.source.NAT.type": "サポートされる送信元 NAT の種類",
-    "label.supportsstrechedl2subnet": "ストレッチ L2 サブネットをサポートする",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "プロジェクトの一時停止",
-    "label.switch.type": "スイッチの種類",
-    "label.system.capacity": "システムの処理能力",
-    "label.system.offering": "システム オファリング",
-    "label.system.offering.for.router": "ルーター用システム オファリング",
-    "label.system.service.offering": "システム サービス オファリング",
-    "label.system.service.offering.details": "システムサービスオファリングの詳細",
-    "label.system.vm": "システム VM",
-    "label.system.vm.details": "システム VM の詳細",
-    "label.system.vm.scaled.up": "システム VM のサイズが拡大されました",
-    "label.system.vm.type": "システム VM の種類",
-    "label.system.vms": "システム VM",
-    "label.system.wide.capacity": "システム全体の処理能力",
-    "label.tag.key": "タグ キー",
-    "label.tag.value": "タグ値",
-    "label.tagged": "タグあり",
-    "label.tags": "タグ",
-    "label.target.iqn": "ターゲット IQN",
-    "label.task.completed": "タスクが完了しました",
-    "label.template": "テンプレート",
-    "label.template.limits": "テンプレート制限",
-    "label.tftp.root.directory": "TFTP ルート ディレクトリ",
-    "label.theme.default": "デフォルト テーマ",
-    "label.theme.grey": "カスタム - グレー",
-    "label.theme.lightblue": "カスタム - ライト ブルー",
-    "label.threshold": "しきい値",
-    "label.thursday": "木曜日",
-    "label.tier": "階層",
-    "label.tier.details": "階層の詳細",
-    "label.time": "時間",
-    "label.time.colon": "時間:",
-    "label.time.zone": "タイムゾーン",
-    "label.timeout": "タイムアウト",
-    "label.timeout.in.second ": " タイムアウト値(秒)",
-    "label.timezone": "タイムゾーン",
-    "label.timezone.colon": "タイムゾーン:",
-    "label.token": "トークン",
-    "label.total.CPU": "CPU 合計",
-    "label.total.cpu": "CPU 合計",
-    "label.total.hosts": "ホスト合計",
-    "label.total.memory": "メモリ合計",
-    "label.total.of.ip": "全 IP アドレス数",
-    "label.total.of.vm": "VM 合計",
-    "label.total.storage": "ストレージ合計",
-    "label.total.virtual.routers": "仮想ルーター合計",
-    "label.total.virtual.routers.upgrade": "アップグレードが必要な仮想ルーター合計",
-    "label.total.vms": "VM 合計",
-    "label.traffic.label": "トラフィック ラベル",
-    "label.traffic.type": "トラフィックの種類",
-    "label.traffic.types": "トラフィックの種類",
-    "label.tuesday": "火曜日",
-    "label.type": "種類",
-    "label.type.id": "種類 ID",
-    "label.type.lower": "種類",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK キーボード",
-    "label.unavailable": "使用不能",
-    "label.unhealthy.threshold": "異常しきい値",
-    "label.unlimited": "無制限",
-    "label.untagged": "タグなし",
-    "label.update.project.resources": "プロジェクト リソースの更新",
-    "label.update.ssl": " SSL 証明書",
-    "label.update.ssl.cert": " SSL 証明書",
-    "label.updating": "更新しています",
-    "label.upgrade.required": "アップグレードが必要です",
-    "label.upgrade.router.newer.template": "ルーターをアップグレードして新しいテンプレートを使用する",
-    "label.upload": "アップロード",
-    "label.upload.from.local": "ローカルからのアップロード",
-    "label.upload.template.from.local": "ローカルからのテンプレートのアップロード",
-    "label.upload.volume": "ボリュームのアップロード",
-    "label.upload.volume.from.local": "ローカルからのボリュームのアップロード",
-    "label.upload.volume.from.url": "URL からのボリュームのアップロード",
-    "label.url": "URL",
-    "label.usage.interface": "使用状況測定インターフェイス",
-    "label.usage.sanity.result": "使用状況サニティ結果",
-    "label.usage.server": "使用状況測定サーバー",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "次の VM IP アドレスを使用:",
-    "label.use.vm.ips": "次の VM IP アドレスを使用",
-    "label.used": "使用中",
-    "label.user": "ユーザー",
-    "label.user.data": "ユーザー データ",
-    "label.user.details": "ユーザーの詳細",
-    "label.user.vm": "ユーザー VM",
-    "label.username": "ユーザー名",
-    "label.username.lower": "ユーザー名",
-    "label.users": "ユーザー",
-    "label.vSwitch.type": "vSwitch の種類",
-    "label.value": "値",
-    "label.vcdcname": "vCenter DC 名",
-    "label.vcenter": "vCenter",
-    "label.vcenter.cluster": "vCenter クラスター",
-    "label.vcenter.datacenter": "vCenter データセンター",
-    "label.vcenter.datastore": "vCenter データストア",
-    "label.vcenter.host": "vCenter ホスト",
-    "label.vcenter.password": "vCenter パスワード",
-    "label.vcenter.username": "vCenter ユーザー名",
-    "label.vcipaddress": "vCenter IP アドレス",
-    "label.version": "バージョン",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "最大解像度",
-    "label.vgpu.max.vgpu.per.gpu": "GPU あたりの vGPU 数",
-    "label.vgpu.remaining.capacity": "残存処理能力",
-    "label.vgpu.type": "vGPU の種類",
-    "label.vgpu.video.ram": "ビデオ RAM",
-    "label.view": "表示 -",
-    "label.view.all": "すべて表示",
-    "label.view.console": "コンソールの表示",
-    "label.view.more": "詳細表示",
-    "label.view.secondary.ips": "セカンダリ IP アドレスの表示",
-    "label.viewing": "表示項目:",
-    "label.virtual.appliance": "仮想アプライアンス",
-    "label.virtual.appliance.details": "仮想アプライアンスの詳細",
-    "label.virtual.appliances": "仮想アプライアンス",
-    "label.virtual.machine": "仮想マシン",
-    "label.virtual.machines": "仮想マシン",
-    "label.virtual.network": "仮想ネットワーク",
-    "label.virtual.networking": "仮想ネットワーク",
-    "label.virtual.router": "仮想ルーター",
-    "label.virtual.routers": "仮想ルーター",
-    "label.virtual.routers.group.account": "アカウント別の仮想ルーター グループ",
-    "label.virtual.routers.group.cluster": "クラスター別の仮想ルーター グループ",
-    "label.virtual.routers.group.pod": "ポッド別の仮想ルーター グループ",
-    "label.virtual.routers.group.zone": "ゾーン別の仮想ルーター グループ",
-    "label.vlan": "VLAN",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI の範囲",
-    "label.vlan.range.details": "VLAN の範囲の詳細",
-    "label.vlan.ranges": "VLAN の範囲",
-    "label.vlan.vni.range": "VLAN/VNI の範囲",
-    "label.vlan.vni.ranges": "VLAN/VNI の範囲",
-    "label.vm.add": "インスタンスの追加",
-    "label.vm.destroy": "破棄",
-    "label.vm.display.name": "VM 表示名",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP アドレス",
-    "label.vm.name": "VM 名",
-    "label.vm.password": "VM のパスワード:",
-    "label.vm.reboot": "再起動",
-    "label.vm.start": "起動",
-    "label.vm.state": "VM の状態",
-    "label.vm.stop": "停止",
-    "label.vmfs": "VMFS",
-    "label.vms": "VM",
-    "label.vmsnapshot": "VM スナップショット",
-    "label.vmsnapshot.current": "使用中",
-    "label.vmsnapshot.memory": "メモリも含める",
-    "label.vmsnapshot.parentname": "親",
-    "label.vmsnapshot.type": "種類",
-    "label.vmware.datacenter.id": "VMware データセンター ID",
-    "label.vmware.datacenter.name": "VMware データセンター名",
-    "label.vmware.datacenter.vcenter": "VMware データセンターの vCenter",
-    "label.vmware.traffic.label": "VMware のトラフィック ラベル",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC デバイス",
-    "label.volatile": "揮発性",
-    "label.volgroup": "ボリューム グループ",
-    "label.volume": "ボリューム",
-    "label.volume.details": "ボリュームの詳細",
-    "label.volume.limits": "ボリューム制限",
-    "label.volume.migrated": "ボリュームが移行されました",
-    "label.volume.name": "ボリューム名",
-    "label.volumes": "ボリューム",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "分散 VPC ルーター",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC オファリング",
-    "label.vpc.offering.details": "VPC オファリングの詳細",
-    "label.vpc.router.details": "VPC ルーターの詳細",
-    "label.vpc.supportsregionlevelvpc": "リージョンレベルの VPC をサポートする",
-    "label.vpc.virtual.router": "VPC 仮想ルーター",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN カスタマー ゲートウェイ",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "コントロール VLAN ID",
-    "label.vsmpktvlanid": "パケット VLAN ID",
-    "label.vsmstoragevlanid": "ストレージ VLAN ID",
-    "label.vsphere.managed": "vSphere による管理",
-    "label.vswitch.name": "vSwitch 名",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN の範囲",
-    "label.waiting": "待機しています",
-    "label.warn": "警告",
-    "label.warn.upper": "警告",
-    "label.warning": "注意",
-    "label.wednesday": "水曜日",
-    "label.weekly": "毎週",
-    "label.welcome": "ようこそ",
-    "label.welcome.cloud.console": "管理コンソールへようこそ",
-    "label.what.is.cloudstack": "CloudStack&#8482; について",
-    "label.xenserver.tools.version.61.plus": "元の XS バージョンは 6.1 以降",
-    "label.xenserver.traffic.label": "XenServer のトラフィック ラベル",
-    "label.yes": "はい",
-    "label.zone": "ゾーン",
-    "label.zone.dedicated": "専用ゾーン",
-    "label.zone.details": "ゾーンの詳細",
-    "label.zone.id": "ゾーン ID",
-    "label.zone.lower": "ゾーン",
-    "label.zone.name": "ゾーン名",
-    "label.zone.step.1.title": "手順 1: <strong>ネットワークの選択</strong>",
-    "label.zone.step.2.title": "手順 2: <strong>ゾーンの追加</strong>",
-    "label.zone.step.3.title": "手順 3: <strong>ポッドの追加</strong>",
-    "label.zone.step.4.title": "手順 4: <strong>IP アドレス範囲の追加</strong>",
-    "label.zone.type": "ゾーンの種類",
-    "label.zone.wide": "ゾーン全体",
-    "label.zoneWizard.trafficType.guest": "ゲスト: エンド ユーザーの仮想マシンの間のトラフィックです。",
-    "label.zoneWizard.trafficType.management": "管理: ホストや CloudStack システム VM  など、管理サーバーと通信する CloudStack の内部リソース間のトラフィックです。",
-    "label.zoneWizard.trafficType.public": "パブリック: インターネットとクラウド内の仮想マシンの間のトラフィックです。",
-    "label.zoneWizard.trafficType.storage": "ストレージ: VM テンプレートやスナップショットなど、プライマリおよびセカンダリ ストレージ サーバー間のトラフィックです。",
-    "label.zones": "ゾーン",
-    "managed.state": "管理対象状態",
-    "message.XSTools61plus.update.failed": "[元の XS バージョンは 6.1 以降] フィールドを更新できませんでした。エラー:",
-    "message.Zone.creation.complete": "ゾーンが作成されました",
-    "message.acquire.ip.nic": "この NIC のために新しいセカンダリ IP アドレスを取得してもよろしいですか?<br/>注: 新しく取得したセカンダリ IP アドレスは仮想マシン内で手動で構成する必要があります。",
-    "message.acquire.new.ip": "このネットワークの新しい IP アドレスを取得してもよろしいですか?",
-    "message.acquire.new.ip.vpc": "この VPC の新しい IP アドレスを取得してもよろしいですか?",
-    "message.acquire.public.ip": "新しい IP アドレスを取得するゾーンを選択してください。",
-    "message.action.cancel.maintenance": "ホストの保守は正常にキャンセルされました。この処理には数分かかる可能性があります。",
-    "message.action.cancel.maintenance.mode": "この保守をキャンセルしてもよろしいですか?",
-    "message.action.change.service.warning.for.instance": "現在のサービス オファリングを変更する前にインスタンスを停止する必要があります。",
-    "message.action.change.service.warning.for.router": "現在のサービス オファリングを変更する前にルーターを停止する必要があります。",
-    "message.action.delete.ISO": "この ISO を削除してもよろしいですか?",
-    "message.action.delete.ISO.for.all.zones": "その ISO はすべてのゾーンで使用されています。すべてのゾーンから削除してもよろしいですか?",
-    "message.action.delete.cluster": "このクラスターを削除してもよろしいですか?",
-    "message.action.delete.disk.offering": "このディスク オファリングを削除してもよろしいですか?",
-    "message.action.delete.domain": "このドメインを削除してもよろしいですか?",
-    "message.action.delete.external.firewall": "この外部ファイアウォールを削除してもよろしいですか? 警告: 同じ外部ファイアウォールを再度追加する予定である場合は、デバイスの使用状況データをリセットする必要があります。",
-    "message.action.delete.external.load.balancer": "この外部ロード バランサーを削除してもよろしいですか? 警告: 同じ外部ロード バランサーを再度追加する予定である場合は、デバイスの使用状況データをリセットする必要があります。",
-    "message.action.delete.ingress.rule": "この受信規則を削除してもよろしいですか?",
-    "message.action.delete.network": "このネットワークを削除してもよろしいですか?",
-    "message.action.delete.nexusVswitch": "この Nexus 1000V を削除してもよろしいですか?",
-    "message.action.delete.nic": "この NIC を削除してもよろしいですか? 関連付けられたネットワークも VM から削除されます。",
-    "message.action.delete.physical.network": "この物理ネットワークを削除してもよろしいですか?",
-    "message.action.delete.pod": "このポッドを削除してもよろしいですか?",
-    "message.action.delete.primary.storage": "このプライマリ ストレージを削除してもよろしいですか?",
-    "message.action.delete.secondary.storage": "このセカンダリ ストレージを削除してもよろしいですか?",
-    "message.action.delete.security.group": "このセキュリティ グループを削除してもよろしいですか?",
-    "message.action.delete.service.offering": "このサービス オファリングを削除してもよろしいですか?",
-    "message.action.delete.snapshot": "このスナップショットを削除してもよろしいですか?",
-    "message.action.delete.system.service.offering": "このシステム サービス オファリングを削除してもよろしいですか?",
-    "message.action.delete.template": "このテンプレートを削除してもよろしいですか?",
-    "message.action.delete.template.for.all.zones": "そのテンプレートはすべてのゾーンで使用されています。すべてのゾーンから削除してもよろしいですか?",
-    "message.action.delete.volume": "このボリュームを削除してもよろしいですか?",
-    "message.action.delete.zone": "このゾーンを削除してもよろしいですか?",
-    "message.action.destroy.instance": "このインスタンスを破棄してもよろしいですか?",
-    "message.action.destroy.systemvm": "このシステム VM を破棄してもよろしいですか?",
-    "message.action.destroy.volume":"このボリュームを破棄してもよろしいですか?",
-    "message.action.disable.cluster": "このクラスターを無効にしてもよろしいですか?",
-    "message.action.disable.nexusVswitch": "この Nexus 1000V を無効にしてもよろしいですか?",
-    "message.action.disable.physical.network": "この物理ネットワークを無効にしてもよろしいですか?",
-    "message.action.disable.pod": "このポッドを無効にしてもよろしいですか?",
-    "message.action.disable.static.NAT": "静的 NAT を無効にしてもよろしいですか?",
-    "message.action.disable.zone": "このゾーンを無効にしてもよろしいですか?",
-    "message.action.download.iso": "この ISO をダウンロードしてもよろしいですか?",
-    "message.action.download.template": "このテンプレートをダウンロードしてもよろしいですか?",
-    "message.action.downloading.template": "テンプレートをダウンロードしています。",
-    "message.action.enable.cluster": "このクラスターを有効にしてもよろしいですか?",
-    "message.action.enable.maintenance": "ホストを保守する準備ができました。このホスト上の VM 数によっては、この処理には数分以上かかる可能性があります。",
-    "message.action.enable.nexusVswitch": "この Nexus 1000V を有効にしてもよろしいですか?",
-    "message.action.enable.physical.network": "この物理ネットワークを有効にしてもよろしいですか?",
-    "message.action.enable.pod": "このポッドを有効にしてもよろしいですか?",
-    "message.action.enable.zone": "このゾーンを有効にしてもよろしいですか?",
-    "message.action.expunge.instance": "このインスタンスを抹消してもよろしいですか?",
-    "message.action.force.reconnect": "ホストは強制的に再接続しました。この処理には数分かかる可能性があります。",
-    "message.action.host.enable.maintenance.mode": "保守モードを有効にすると、このホストで実行中のすべてのインスタンスがほかの使用できるホストにライブ マイグレーションされます。",
-    "message.action.instance.reset.password": "この仮想マシンのルート パスワードを変更してもよろしいですか?",
-    "message.action.manage.cluster": "クラスターを管理対象にしてもよろしいですか?",
-    "message.action.primarystorage.enable.maintenance.mode": "警告: プライマリ ストレージを保守モードにすると、そのストレージ上のボリュームを使用するすべての VM が停止します。続行してもよろしいですか?",
-    "message.action.reboot.instance": "このインスタンスを再起動してもよろしいですか?",
-    "message.action.reboot.router": "この仮想ルーターで提供するすべてのサービスが中断されます。このルーターを再起動してもよろしいですか?",
-    "message.action.reboot.systemvm": "このシステム VM を再起動してもよろしいですか?",
-    "message.action.recover.volume":"このボリュームを復元してもよろしいですか?",
-    "message.action.release.ip": "この IP アドレスを解放してもよろしいですか?",
-    "message.action.remove.host": "このホストを削除してもよろしいですか?",
-    "message.action.reset.password.off": "インスタンスは現在この機能をサポートしていません。",
-    "message.action.reset.password.warning": "現在のパスワードを変更する前にインスタンスを停止する必要があります。",
-    "message.action.restore.instance": "このインスタンスを復元してもよろしいですか?",
-    "message.action.revert.snapshot": "所有ボリュームをこのスナップショットに戻してもよろしいですか?",
-    "message.action.start.instance": "このインスタンスを起動してもよろしいですか?",
-    "message.action.start.router": "このルーターを起動してもよろしいですか?",
-    "message.action.start.systemvm": "このシステム VM を起動してもよろしいですか?",
-    "message.action.stop.instance": "このインスタンスを停止してもよろしいですか?",
-    "message.action.stop.router": "この仮想ルーターで提供するすべてのサービスが中断されます。このルーターを停止してもよろしいですか?",
-    "message.action.stop.systemvm": "このシステム VM を停止してもよろしいですか?",
-    "message.action.take.snapshot": "このボリュームのスナップショットを作成してもよろしいですか?",
-    "message.action.snapshot.fromsnapshot":"このVMスナップショットのスナップショットを作成してもよろしいですか?",
-    "message.action.unmanage.cluster": "クラスターを非管理対象にしてもよろしいですか?",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "この VM スナップショットを削除してもよろしいですか?",
-    "message.action.vmsnapshot.revert": "VM スナップショットを元に戻す",
-    "message.activate.project": "このプロジェクトをアクティブにしてもよろしいですか?",
-    "message.add.VPN.gateway": "VPN ゲートウェイを追加してもよろしいですか?",
-    "message.add.cluster": "ゾーン <b><span id=\"zone_name\"></span></b> のポッド <b><span id=\"pod_name\"></span></b> にハイパーバイザーで管理されるクラスターを追加します",
-    "message.add.cluster.zone": "ゾーン <b><span id=\"zone_name\"></span></b> にハイパーバイザーで管理されるクラスターを追加します",
-    "message.add.disk.offering": "新しいディスク オファリングを追加するために、次のパラメーターを指定してください。",
-    "message.add.domain": "このドメインに作成するサブドメインを指定してください。",
-    "message.add.firewall": "ゾーンにファイアウォールを追加します",
-    "message.add.guest.network": "ゲスト ネットワークを追加してもよろしいですか?",
-    "message.add.host": "新しいホストを追加するために、次のパラメーターを指定してください。",
-    "message.add.ip.range": "ゾーンのパブリック ネットワークに IP アドレスの範囲を追加します",
-    "message.add.ip.range.direct.network": "ゾーン <b><span id=\"zone_name\"></span></b> の直接ネットワーク <b><span id=\"directnetwork_name\"></span></b> に IP アドレスの範囲を追加します",
-    "message.add.ip.range.to.pod": "<p>ポッド <b><span id=\"pod_name_label\"></span></b> に IP アドレスの範囲を追加します</p>",
-    "message.add.load.balancer": "ゾーンにロード バランサーを追加します",
-    "message.add.load.balancer.under.ip": "ロード バランサー規則が次の IP アドレスに対して追加されました:",
-    "message.add.network": "ゾーン <b><span id=\"zone_name\"></span></b> に新しいネットワークを追加します",
-    "message.add.new.gateway.to.vpc": "この VPC に新しいゲートウェイを追加するための情報を指定してください。",
-    "message.add.pod": "ゾーン <b><span id=\"add_pod_zone_name\"></span></b> に新しいポッドを追加します",
-    "message.add.pod.during.zone.creation": "各ゾーンには 1 つ以上のポッドが必要です。今ここで最初のポッドを追加します。ポッドはホストとプライマリ ストレージ サーバーから構成されますが、これらは後の手順で追加します。最初に、CloudStack の内部管理トラフィックのために IP アドレスの範囲を予約します。IP アドレスの範囲は、クラウド内の各ゾーンで重複しないように予約する必要があります。",
-    "message.add.primary": "新しいプライマリ ストレージを追加するために、次のパラメーターを指定してください。",
-    "message.add.primary.storage": "ゾーン <b><span id=\"zone_name\"></span></b> のポッド <b><span id=\"pod_name\"></span></b> に新しいプライマリ ストレージを追加します",
-    "message.add.region": "新しいリージョンを追加するために必要な情報を指定してください。",
-    "message.add.secondary.storage": "ゾーン <b><span id=\"zone_name\"></span></b> に新しいストレージを追加します",
-    "message.add.service.offering": "新しいコンピューティング オファリングを追加するために、次のデータを入力してください。",
-    "message.add.system.service.offering": "新しいシステム サービス オファリングを追加するために、次のデータを入力してください。",
-    "message.add.template": "新しいテンプレートを作成するために、次のデータを入力してください。",
-    "message.add.volume": "新しいボリュームを追加するために、次のデータを入力してください。",
-    "message.added.vpc.offering": "VPC オファリングを追加しました",
-    "message.adding.Netscaler.device": "NetScaler デバイスを追加しています",
-    "message.adding.Netscaler.provider": "NetScaler プロバイダーを追加しています",
-    "message.adding.host": "ホストを追加しています",
-    "message.additional.networks.desc": "仮想インスタンスが接続する追加のネットワークを選択してください。",
-    "message.admin.guide.read": "VMware ベースの VM については、サイズ変更の前に管理者ガイドの動的なサイズ変更のセクションをお読みください。続行してもよろしいですか?,",
-    "message.advanced.mode.desc": "VLAN サポートを有効にする場合は、このネットワーク モデルを選択してください。このモデルでは最も柔軟にカスタム ネットワーク オファリングを提供でき、ファイアウォール、VPN、ロード バランサーのサポートのほかに、直接ネットワークと仮想ネットワークも有効にすることができます。",
-    "message.advanced.security.group": "ゲスト VM を分離するためにセキュリティ グループを使用する場合は、このオプションを選択してください。",
-    "message.advanced.virtual": "ゲスト VM を分離するためにゾーン全体の VLAN を使用する場合は、このオプションを選択してください。",
-    "message.after.enable.s3": "S3 ベースのセカンダリ ストレージが構成されました。注: このページを閉じると、S3 を再構成することはできません。",
-    "message.after.enable.swift": "Swift が構成されました。注: このページを閉じると、Swift を再構成することはできません。",
-    "message.alert.state.detected": "アラート状態が検出されました",
-    "message.allow.vpn.access": "VPN アクセスを許可するユーザーのユーザー名とパスワードを入力してください。",
-    "message.apply.snapshot.policy": "現在のスナップショット ポリシーを更新しました。",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "この仮想インスタンスに ISO ファイルをアタッチしてもよろしいですか?",
-    "message.attach.volume": "新しいボリュームをアタッチするために、次のデータを入力してください。Windows ベースの仮想マシンにディスク ボリュームをアタッチする場合は、アタッチしたディスクを認識するためにインスタンスを再起動する必要があります。",
-    "message.basic.mode.desc": "VLAN サポートが<b><u>不要である</u></b>場合は、このネットワーク モデルを選択してください。このネットワーク モデルで作成されるすべての仮想インスタンスにネットワークから直接 IP アドレスが割り当てられ、セキュリティ グループを使用してセキュリティと分離が提供されます。",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "この仮想インスタンスのサービス オファリングを変更してもよろしいですか?",
-    "message.change.password": "パスワードを変更してください。",
-    "message.cluster.dedicated": "クラスターを専用に設定しました",
-    "message.cluster.dedication.released": "専用クラスターが解放されました",
-    "message.configure.all.traffic.types": "複数の物理ネットワークがあります。[編集] をクリックしてトラフィックの種類ごとにラベルを構成してください。",
-    "message.configure.firewall.rules.allow.traffic": "トラフィックを許可するようルールを設定する",
-    "message.configure.firewall.rules.block.traffic": "トラフィックをブロックするようルールを設定する",
-    "message.configure.ldap": "LDAP を構成してもよろしいですか?",
-    "message.configuring.guest.traffic": "ゲスト トラフィックを構成しています",
-    "message.configuring.physical.networks": "物理ネットワークを構成しています",
-    "message.configuring.public.traffic": "パブリック トラフィックを構成しています",
-    "message.configuring.storage.traffic": "ストレージ トラフィックを構成しています",
-    "message.confirm.action.force.reconnect": "このホストを強制再接続してもよろしいですか?",
-    "message.confirm.add.vnmc.provider": "VNMC プロバイダーを追加してもよろしいですか?",
-    "message.confirm.archive.alert": "このアラートをアーカイブしてもよろしいですか?",
-    "message.confirm.archive.event": "このイベントをアーカイブしてもよろしいですか?",
-    "message.confirm.archive.selected.alerts": "選択したアラートをアーカイブしてもよろしいですか?",
-    "message.confirm.archive.selected.events": "選択したイベントをアーカイブしてもよろしいですか?",
-    "message.confirm.attach.disk": "ディスクをアタッチしてもよろしいですか?",
-    "message.confirm.create.volume": "ボリュームを作成してもよろしいですか?",
-    "message.confirm.current.guest.CIDR.unchanged": "現在のゲスト ネットワークの CIDR を変更せずに維持してもよろしいですか?",
-    "message.confirm.dedicate.cluster.domain.account": "このクラスターをドメイン/アカウント専用に設定してもよろしいですか?",
-    "message.confirm.dedicate.host.domain.account": "このホストをドメイン/アカウント専用に設定してもよろしいですか?",
-    "message.confirm.dedicate.pod.domain.account": "このポッドをドメイン/アカウント専用に設定してもよろしいですか?",
-    "message.confirm.dedicate.zone": "このゾーンをドメイン/アカウント専用に設定してもよろしいですか?",
-    "message.confirm.delete.BigSwitchBcf": "この BigSwitch BCF コントローラーを削除してもよろしいですか?",
-    "message.confirm.delete.BrocadeVcs": "Brocade VCS スイッチを削除してもよろしいですか?",
-    "message.confirm.delete.F5": "F5 を削除してもよろしいですか?",
-    "message.confirm.delete.NetScaler": "NetScaler を削除してもよろしいですか?",
-    "message.confirm.delete.PA": "Palo Alto を削除してもよろしいですか?",
-    "message.confirm.delete.SRX": "SRX を削除してもよろしいですか?",
-    "message.confirm.delete.acl.list": "この ACL 一覧を削除してもよろしいですか?",
-    "message.confirm.delete.alert": "このアラートを削除してもよろしいですか?",
-    "message.confirm.delete.baremetal.rack.configuration": "ベアメタルラック設定を削除してもよろしいですか?",
-    "message.confirm.delete.ciscoASA1000v": "Cisco ASA 1000V を削除してもよろしいですか?",
-    "message.confirm.delete.ciscovnmc.resource": "Cisco VNMC リソースを削除してもよろしいですか?",
-    "message.confirm.delete.internal.lb": "内部 LB を削除してもよろしいですか?",
-    "message.confirm.delete.secondary.staging.store": "セカンダリ ステージング ストアを削除してもよろしいですか?",
-    "message.confirm.delete.ucs.manager": "UCS Manager を削除してもよろしいですか?",
-    "message.confirm.destroy.router": "このルーターを破棄してもよろしいですか?",
-    "message.confirm.disable.host": "ホストを無効にしてもよろしいですか?",
-    "message.confirm.disable.network.offering": "このネットワーク オファリングを無効にしてもよろしいですか?",
-    "message.confirm.disable.provider": "このプロバイダーを無効にしてもよろしいですか?",
-    "message.confirm.disable.vnmc.provider": "VNMC プロバイダーを無効にしてもよろしいですか?",
-    "message.confirm.disable.vpc.offering": "この VPC オファリングを無効にしてもよろしいですか?",
-    "message.confirm.enable.host": "ホストを有効にしてもよろしいですか?",
-    "message.confirm.enable.network.offering": "このネットワーク オファリングを有効にしてもよろしいですか?",
-    "message.confirm.enable.provider": "このプロバイダーを有効にしてもよろしいですか?",
-    "message.confirm.enable.vnmc.provider": "VNMC プロバイダーを有効にしてもよろしいですか?",
-    "message.confirm.enable.vpc.offering": "この VPC オファリングを有効にしてもよろしいですか?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "このプロジェクトに参加してもよろしいですか?",
-    "message.confirm.migrate.volume": "このボリュームを移行してもよろしいですか?",
-    "message.confirm.refresh.blades": "ブレードを更新してもよろしいですか?",
-    "message.confirm.release.dedicate.vlan.range": "専用 VLAN の範囲を解放してもよろしいですか?",
-    "message.confirm.release.dedicated.cluster": "この専用クラスターを解放してもよろしいですか?",
-    "message.confirm.release.dedicated.host": "この専用ホストを解放してもよろしいですか?",
-    "message.confirm.release.dedicated.pod": "この専用ポッドを解放してもよろしいですか?",
-    "message.confirm.release.dedicated.zone": "この専用ゾーンを解放してもよろしいですか?",
-    "message.confirm.remove.IP.range": "この IP アドレスの範囲を削除してもよろしいですか?",
-    "message.confirm.remove.event": "このイベントを削除してもよろしいですか?",
-    "message.confirm.remove.load.balancer": "ロード バランサーから VM を削除してもよろしいですか?",
-    "message.confirm.remove.network.offering": "このネットワーク オファリングを削除してもよろしいですか?",
-    "message.confirm.remove.selected.alerts": "選択したアラートを削除してもよろしいですか?",
-    "message.confirm.remove.selected.events": "選択したイベントを削除してもよろしいですか?",
-    "message.confirm.remove.vmware.datacenter": "VMware データセンターを削除してもよろしいですか?",
-    "message.confirm.remove.vpc.offering": "この VPC オファリングを削除してもよろしいですか?",
-    "message.confirm.replace.acl.new.one": "ACL を新しいものと置き換えてもよろしいですか?",
-    "message.confirm.scale.up.router.vm": "ルーター VM のサイズを拡大してもよろしいですか?",
-    "message.confirm.scale.up.system.vm": "システム VM のサイズを拡大してもよろしいですか?",
-    "message.confirm.shutdown.provider": "このプロバイダーをシャットダウンしてもよろしいですか?",
-    "message.confirm.start.lb.vm": "LB VM を起動してもよろしいですか?",
-    "message.confirm.stop.lb.vm": "LB VM を停止してもよろしいですか?",
-    "message.confirm.upgrade.router.newer.template": "ルーターをアップグレードして新しいテンプレートを使用してもよろしいですか?",
-    "message.confirm.upgrade.routers.account.newtemplate": "このアカウントのすべてのルーターをアップグレードして新しいテンプレートを使用してもよろしいですか?",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "このクラスターのすべてのルーターをアップグレードして新しいテンプレートを使用してもよろしいですか?",
-    "message.confirm.upgrade.routers.newtemplate": "このゾーンのすべてのルーターをアップグレードして新しいテンプレートを使用してもよろしいですか?",
-    "message.confirm.upgrade.routers.pod.newtemplate": "このポッドのすべてのルーターをアップグレードして新しいテンプレートを使用してもよろしいですか?",
-    "message.copy.iso.confirm": "ISO を次の場所にコピーしてもよろしいですか?",
-    "message.copy.template": "ゾーン <b id=\"copy_template_source_zone_text\"></b> からテンプレート <b id=\"copy_template_name_text\">XXX</b> を次の場所にコピーします:",
-    "message.copy.template.confirm": "テンプレートをコピーしてもよろしいですか?",
-    "message.create.template": "テンプレートを作成してもよろしいですか?",
-    "message.create.template.vm": "テンプレート <b id=\"p_name\"></b> から VM を作成します",
-    "message.create.template.volume": "ディスク ボリューム <b><span id=\"volume_name\"></span></b> のテンプレートを作成する前に、次の情報を指定してください。ボリューム サイズによっては、テンプレートの作成には数分以上かかる可能性があります。",
-    "message.creating.cluster": "クラスターを作成しています",
-    "message.creating.guest.network": "ゲスト ネットワークを作成しています",
-    "message.creating.physical.networks": "物理ネットワークを作成しています",
-    "message.creating.pod": "ポッドを作成しています",
-    "message.creating.primary.storage": "プライマリ ストレージを作成しています",
-    "message.creating.secondary.storage": "セカンダリ ストレージを作成しています",
-    "message.creating.systemVM": "システム VM を作成しています (しばらくお待ちください)",
-    "message.creating.zone": "ゾーンを作成しています",
-    "message.decline.invitation": "このプロジェクトへの招待を辞退してもよろしいですか?",
-    "message.dedicate.zone": "ゾーンを専用に設定しています",
-    "message.dedicated.zone.released": "専用ゾーンが解放されました",
-    "message.delete.VPN.connection": "VPN 接続を削除してもよろしいですか?",
-    "message.delete.VPN.customer.gateway": "この VPN カスタマー ゲートウェイを削除してもよろしいですか?",
-    "message.delete.VPN.gateway": "この VPN ゲートウェイを削除してもよろしいですか?",
-    "message.delete.account": "このアカウントを削除してもよろしいですか?",
-    "message.delete.affinity.group": "このアフィニティ グループを削除してもよろしいですか?",
-    "message.delete.gateway": "このゲートウェイを削除してもよろしいですか?",
-    "message.delete.project": "このプロジェクトを削除してもよろしいですか?",
-    "message.delete.user": "このユーザーを削除してもよろしいですか?",
-    "message.desc.add.new.lb.sticky.rule": "新しい LB スティッキールールを追加",
-    "message.desc.advanced.zone": "より洗練されたネットワーク技術をサポートします。このネットワーク モデルを選択すると、より柔軟にゲストのネットワークを定義し、ファイアウォール、VPN、ロード バランサーのサポートのようなカスタマイズしたネットワーク オファリングを提供できます。",
-    "message.desc.basic.zone": "各 VM インスタンスに IP アドレスがネットワークから直接割り当てられる、単一のネットワークを提供します。セキュリティ グループ (送信元 IP アドレスのフィルター) のようなレイヤー 3 レベルの方法でゲストを分離できます。",
-    "message.desc.cluster": "各ポッドには 1 つ以上のクラスターが必要です。今ここで最初のクラスターを追加します。クラスターはホストをグループ化する方法です。1 つのクラスター内のホストはすべて同一のハードウェアから構成され、同じハイパーバイザーを実行し、同じサブネット上にあり、同じ共有ストレージにアクセスします。各クラスターは 1 つ以上のホストと 1 つ以上のプライマリ ストレージ サーバーから構成されます。",
-    "message.desc.create.ssh.key.pair": "SSH キーペアの生成および登録のために以下のデータを入力してください<br><br>(1) 公開鍵が設定されている場合、CloudStack ではその公開鍵を登録し、対応するプライベートキーを使ってアクセスします<br><br>(2) 公開鍵が設定されていない場合、CloudStack では新しい SSH キーペア を生成します、その時 CloudStack では秘密鍵を保持しないためユーザーでコピーおよび保存してください<br>",
-    "message.desc.created.ssh.key.pair": "作成された SSH キーペア",
-    "message.desc.host": "各クラスターには少なくとも 1 つ、ゲスト VM を実行するためのホスト (コンピューター) が必要です。今ここで最初のホストを追加します。CloudStack でホストを機能させるには、ホストにハイパーバイザーをインストールして IP アドレスを割り当て、ホストが CloudStack 管理サーバーに接続していることを確認します。<br/><br/>ホストの DNS 名または IP アドレス、ユーザー名 (通常は root) とパスワード、およびホストの分類に使用するラベルを入力してください。",
-    "message.desc.primary.storage": "各クラスターには少なくとも 1 つ、プライマリ ストレージ サーバーが必要です。今ここで最初のサーバーを追加します。プライマリ ストレージは、クラスター内のホスト上で動作するすべての VM のディスク ボリュームを格納します。基礎となるハイパーバイザーでサポートされる、標準に準拠したプロトコルを使用してください。",
-    "message.desc.reset.ssh.key.pair": "この VM に追加する SSH キーペアを指定してください、パスワードが有効になっている場合 root のパスワードは変更される点に注意してください",
-    "message.desc.secondary.storage": "各ゾーンには少なくとも 1 つ、NFS つまりセカンダリ ストレージ サーバーが必要です。今ここで最初のサーバーを追加します。セカンダリ ストレージは VM テンプレート、ISO イメージ、およびVM ディスク ボリュームのスナップショットを格納します。このサーバーはゾーン内のすべてのホストで使用できる必要があります。<br/><br/>IP アドレスとエクスポートされたパスを入力してください。",
-    "message.desc.zone": "ゾーンは CloudStack 環境内の最大の組織単位で、通常、単一のデータセンターに相当します。ゾーンによって物理的な分離と冗長性が提供されます。ゾーンは 1 つ以上のポッド (各ポッドはホストとプライマリ ストレージ サーバーから構成されます) と、ゾーン内のすべてのポッドで共有されるセカンダリ ストレージ サーバーから構成されます。",
-    "message.detach.disk": "このディスクをデタッチしてもよろしいですか?",
-    "message.detach.iso.confirm": "この仮想インスタンスから ISO ファイルをデタッチしてもよろしいですか?",
-    "message.disable.account": "このアカウントを無効にしてもよろしいですか? このアカウントのすべてのユーザーがクラウド リソースにアクセスできなくなります。実行中のすべての仮想マシンが今すぐにシャットダウンされます。",
-    "message.disable.snapshot.policy": "現在のスナップショット ポリシーを無効にしました。",
-    "message.disable.user": "このユーザーを無効にしてもよろしいですか?",
-    "message.disable.vpn": "VPN を無効にしてもよろしいですか?",
-    "message.disable.vpn.access": "リモート アクセス VPN を無効にしてもよろしいですか?",
-    "message.disabling.network.offering": "ネットワーク オファリングを無効にしています",
-    "message.disabling.vpc.offering": "VPC オファリングを無効にしています",
-    "message.disallowed.characters": "許可されない文字: <,>",
-    "message.download.ISO": "ISO をダウンロードするには <a href=\"#\">00000</a> をクリックします",
-    "message.download.template": "テンプレートをダウンロードするには <a href=\"#\">00000</a> をクリックします",
-    "message.download.volume": "ボリュームをダウンロードするには <a href=\"#\">00000</a> をクリックします",
-    "message.download.volume.confirm": "このボリュームをダウンロードしてもよろしいですか?",
-    "message.edit.account": "編集 (「-1」は、リソース作成の量に制限がないことを示します)",
-    "message.edit.confirm": "保存する前に変更内容を確認してください",
-    "message.edit.limits": "次のリソースに制限を指定してください。「-1」は、リソース作成に制限がないことを示します。",
-    "message.edit.traffic.type": "このトラフィックの種類に関連付けるトラフィック ラベルを指定してください。",
-    "message.enable.account": "このアカウントを有効にしてもよろしいですか?",
-    "message.enable.user": "このユーザーを有効にしてもよろしいですか?",
-    "message.enable.vpn": "この IP アドレスに対するリモート アクセス VPN を有効にしてもよろしいですか?",
-    "message.enable.vpn.access": "現在この IP アドレスに対する VPN は無効です。VPN アクセスを有効にしてもよろしいですか?",
-    "message.enabled.vpn": "現在、リモート アクセス VPN が有効になっています。次の IP アドレス経由でアクセスできます。",
-    "message.enabled.vpn.ip.sec": "IPSec 事前共有キー:",
-    "message.enabling.network.offering": "ネットワーク オファリングを有効にしています",
-    "message.enabling.security.group.provider": "セキュリティ グループ プロバイダーを有効にしています",
-    "message.enabling.vpc.offering": "VPC オファリングを有効にしています",
-    "message.enabling.zone": "ゾーンを有効にしています",
-    "message.enabling.zone.dots": "ゾーンを有効にしています...",
-    "message.enter.seperated.list.multiple.cidrs": "CIDR が複数ある場合は、コンマ区切りの一覧を入力してください",
-    "message.enter.token": "電子メールの招待状に記載されているトークンを入力してください。",
-    "message.generate.keys": "このユーザーに新しいキーを生成してもよろしいですか?",
-    "message.gslb.delete.confirm": "この GSLB を削除してもよろしいですか?",
-    "message.gslb.lb.remove.confirm": "GSLB から負荷分散を削除してもよろしいですか?",
-    "message.guest.traffic.in.advanced.zone": "ゲスト ネットワーク トラフィックは、エンド ユーザーの仮想マシン間の通信です。各物理ネットワークのゲスト トラフィックを通信するための VLAN ID の範囲を指定してください。",
-    "message.guest.traffic.in.basic.zone": "ゲスト ネットワーク トラフィックは、エンド ユーザーの仮想マシン間の通信です。CloudStack でゲスト VM に割り当てられる IP アドレスの範囲を指定してください。この範囲が予約済みのシステム IP アドレスの範囲と重複しないように注意してください。",
-    "message.host.dedicated": "ホストを専用に設定しました",
-    "message.host.dedication.released": "専用ホストが解放されました",
-    "message.installWizard.click.retry": "起動を再試行するにはボタンをクリックしてください。",
-    "message.installWizard.copy.whatIsACluster": "クラスターはホストをグループ化する方法です。1 つのクラスター内のホストはすべて同一のハードウェアから構成され、同じハイパーバイザーを実行し、同じサブネット上にあり、同じ共有ストレージにアクセスします。同じクラスター内のホスト間では、ユーザーへのサービスを中断せずに、仮想マシン インスタンスをライブ マイグレーションすることができます。クラスターは CloudStack&#8482; 環境内の 3 番目に大きな組織単位です。クラスターはポッドに含まれ、ポッドはゾーンに含まれます。 <br/><br/>CloudStack&#8482; では 1 つのクラウド環境に複数のクラスターを設定できますが、基本インストールではクラスターは 1 つです。",
-    "message.installWizard.copy.whatIsAHost": "ホストは単一のコンピューターで、ゲスト仮想マシンを実行するコンピューティング リソースを提供します。ベア メタル ホストを除いて、各ホストにはゲスト仮想マシンを管理するためのハイパーバイザー ソフトウェアをインストールします。ベア メタル ホストについては、『インストールガイド上級編』で特殊例として説明します。たとえば、KVM が有効な Linux サーバー、Citrix XenServer が動作するサーバー、および ESXi サーバーがホストです。基本インストールでは、XenServer または KVM を実行する単一のホストを使用します。<br/><br/>ホストは CloudStack&#8482; 環境内の最小の組織単位です。ホストはクラスターに含まれ、クラスターはポッドに含まれ、ポッドはゾーンに含まれます。",
-    "message.installWizard.copy.whatIsAPod": "通常、1 つのポッドは単一のラックを表します。同じポッド内のホストは同じサブネットに含まれます。 <br/><br/>ポッドは CloudStack&#8482; 環境内の 2 番目に大きな組織単位です。ポッドはゾーンに含まれます。各ゾーンは 1 つ以上のポッドを含むことができます。基本インストールでは、ゾーン内のポッドは 1 つです。",
-    "message.installWizard.copy.whatIsAZone": "ゾーンは CloudStack&#8482; 環境内の最大の組織単位です。1 つのデータセンター内に複数のゾーンを設定できますが、通常、ゾーンは単一のデータセンターに相当します。インフラストラクチャをゾーンに組織化すると、ゾーンを物理的に分離して冗長化することができます。たとえば、各ゾーンに電源とネットワーク アップリンクを配備します。必須ではありませんが、ゾーンは遠隔地に分散することができます。",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482; はコンピューティング リソースをプールするソフトウェア プラットフォームで、パブリック、プライベート、およびハイブリッドの Infrastructure as a Service (IaaS) クラウドを構築することができます。CloudStack&#8482; を使用して、クラウド インフラストラクチャを構成するネットワーク、ストレージ、およびコンピューティング ノードを管理し、クラウド コンピューティング環境を展開、管理、および構成します。<br/><br/>CloudStack&#8482; はコモディティ化したハードウェア上で動作する個別の仮想マシン イメージを超えて拡張することができ、簡単な設定で動作するクラウド インフラストラクチャのソフトウェア スタックによって、仮想データセンターつまり多層型のマルチテナント クラウド アプリケーションをサービスとして構築し、展開し、管理するために不可欠なコンポーネントがすべて提供されます。オープン ソース バージョンとプレミアム バージョンの両方が提供されますが、オープン ソース バージョンでもほとんどの機能を使用できます。",
-    "message.installWizard.copy.whatIsPrimaryStorage": "CloudStack&#8482; のクラウド インフラストラクチャでは、プライマリ ストレージとセカンダリ ストレージの 2 種類のストレージを使用します。どちらのストレージにも、iSCSI、NFS サーバー、またはローカル ディスクを使用できます。<br/><br/><strong>プライマリ ストレージ</strong>はクラスターに関連付けられ、そのクラスター内のホストで動作するすべての VM の各ゲスト VM のディスク ボリュームを格納します。通常、プライマリ ストレージ サーバーはホストの近くに設置します。",
-    "message.installWizard.copy.whatIsSecondaryStorage": "セカンダリ ストレージはゾーンと関連付けられ、次の項目を格納します。<ul><li>テンプレート - VM の起動に使用できる OS イメージで、アプリケーションのインストールなど追加の構成を含めることができます。</li><li>ISO イメージ - 起動可能または起動不可の OS イメージです。</li><li>ディスク ボリュームのスナップショット - VM データの保存コピーです。データの復元または新しいテンプレートの作成に使用できます。</ul>",
-    "message.installWizard.now.building": "クラウドを構築しています...",
-    "message.installWizard.tooltip.addCluster.name": "クラスターの名前です。CloudStack で使用されていない、任意のテキストを指定できます。",
-    "message.installWizard.tooltip.addHost.hostname": "ホストの DNS 名または IP アドレスです。",
-    "message.installWizard.tooltip.addHost.password": "XenServer 側で指定した、上のユーザー名に対するパスワードです。",
-    "message.installWizard.tooltip.addHost.username": "通常は root です。",
-    "message.installWizard.tooltip.addPod.name": "ポッドの名前です。",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "これは、セカンダリ ストレージ VM およびコンソール プロキシ VM を管理するために CloudStack で使用する、プライベート ネットワーク内の IP アドレスの範囲です。これらの IP アドレスはコンピューティング サーバーと同じサブネットから割り当てます。",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "このポッド内のホストのゲートウェイです。",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "ゲストの使用するサブネット上で使用されるネットマスクです。",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "これは、セカンダリ ストレージ VM およびコンソール プロキシ VM を管理するために CloudStack で使用する、プライベート ネットワーク内の IP アドレスの範囲です。これらの IP アドレスはコンピューティング サーバーと同じサブネットから割り当てます。",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "ストレージ デバイスの名前です。",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(NFS の場合) サーバーからエクスポートされたパスです。(SharedMountPoint の場合) パスです。KVM ではこのプライマリ ストレージがマウントされる各ホスト上のパスです。たとえば、/mnt/primary です。",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(NFS、iSCSI、または PreSetup の場合) ストレージ デバイスの IP アドレスまたは DNS 名です。",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "セカンダリ ストレージをホストする NFS サーバーの IP アドレスです。",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "上に指定したサーバーに存在する、エクスポートされたパスです。",
-    "message.installWizard.tooltip.addZone.dns1": "ゾーン内のゲスト VM で使用する DNS サーバーです。これらの DNS サーバーには、後で追加するパブリック ネットワーク経由でアクセスします。ゾーンのパブリック IP アドレスから、ここで指定するパブリック DNS サーバーに通信できる必要があります。",
-    "message.installWizard.tooltip.addZone.dns2": "ゾーン内のゲスト VM で使用する DNS サーバーです。これらの DNS サーバーには、後で追加するパブリック ネットワーク経由でアクセスします。ゾーンのパブリック IP アドレスから、ここで指定するパブリック DNS サーバーに通信できる必要があります。",
-    "message.installWizard.tooltip.addZone.internaldns1": "ゾーン内のシステム VM で使用する DNS サーバーです。これらの DNS サーバーは、システム VM のプライベート ネットワーク インターフェイスを介してアクセスされます。ポッドのプライベート IP アドレスから、ここで指定する DNS サーバーに通信できる必要があります。",
-    "message.installWizard.tooltip.addZone.internaldns2": "ゾーン内のシステム VM で使用する DNS サーバーです。これらの DNS サーバーは、システム VM のプライベート ネットワーク インターフェイスを介してアクセスされます。ポッドのプライベート IP アドレスから、ここで指定する DNS サーバーに通信できる必要があります。",
-    "message.installWizard.tooltip.addZone.name": "ゾーンの名前です。",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "ネットワークの説明です。",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "このゾーンのゲストに割り当てることができる IP アドレスの範囲です。使用する NIC が 1 つの場合は、これらの IP アドレスはポッドの CIDR と同じ CIDR に含まれている必要があります。",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "ゲストの使用するゲートウェイです。",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "ゲストの使用するサブネット上で使用されるネットマスクです。",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "このゾーンのゲストに割り当てることができる IP アドレスの範囲です。使用する NIC が 1 つの場合は、これらの IP アドレスはポッドの CIDR と同じ CIDR に含まれている必要があります。",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "ネットワークの名前です。",
-    "message.instance.scaled.up.confirm": "インスタンスのサイズを拡大してもよろしいですか?",
-    "message.instanceWizard.noTemplates": "使用可能なテンプレートがありません。互換性のあるテンプレートを追加して、インスタンス ウィザードを再起動してください。",
-    "message.ip.address.changed": "お使いの IP アドレスが変更されている可能性があります。一覧を更新しますか? その場合は、詳細ペインが閉じることに注意してください。",
-    "message.iso.desc": "データまたは OS 起動可能メディアを含むディスク イメージ",
-    "message.join.project": "これで、プロジェクトに参加しました。プロジェクトを参照するにはプロジェクト ビューに切り替えてください。",
-    "message.launch.vm.on.private.network": "プライベートな専用ネットワークでインスタンスを起動しますか?",
-    "message.launch.zone": "ゾーンを起動する準備ができました。次の手順に進んでください。",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "このドメインと LDAP の自動同期を有効化する",
-    "message.listView.subselect.multi": "(Ctrl/Cmd キーを押しながらクリック)",
-    "message.lock.account": "このアカウントをロックしてもよろしいですか? このアカウントのすべてのユーザーがクラウド リソースを管理できなくなります。その後も既存のリソースにはアクセスできます。",
-    "message.migrate.instance.confirm": "仮想インスタンスの移行先は次のホストでよろしいですか?",
-    "message.migrate.instance.to.host": "別のホストにインスタンスを移行してもよろしいですか?",
-    "message.migrate.instance.select.host": "マイグレーション行うホストを選択。",
-    "message.migrate.instance.to.ps": "別のプライマリ ストレージにインスタンスを移行してもよろしいですか?",
-    "message.migrate.router.confirm": "ルーターの移行先は次のホストでよろしいですか?",
-    "message.migrate.systemvm.confirm": "システム VM の移行先は次のホストでよろしいですか?",
-    "message.migrate.volume": "別のプライマリ ストレージにボリュームを移行してもよろしいですか?",
-    "message.network.addVM.desc": "この VM を追加するネットワークを指定してください。このネットワークのための新しい NIC が追加されます。",
-    "message.network.addVMNIC": "このネットワークの新しい VM NIC を追加してもよろしいですか?",
-    "message.network.remote.access.vpn.configuration": "リモートアクセス VPN の設定は生成されましたが適用に失敗しました、ネットワークの接続性を確認しもう一度試してください",
-    "message.new.user": "アカウントに新しいユーザーを追加するために、次の情報を指定してください。",
-    "message.no.affinity.groups": "アフィニティ グループがありません。次の手順に進んでください。",
-    "message.no.host.available": "移行に使用できるホストはありません",
-    "message.no.more.hosts.available": "マイグレーション可能なホストがありません。",
-    "message.no.network.support": "ハイパーバイザーとして vSphere を選択しましたが、このハイパーバイザーに追加のネットワーク機能はありません。手順 5. に進んでください。",
-    "message.no.network.support.configuration.not.true": "セキュリティ グループが有効なゾーンが無いため、追加のネットワーク機能はありません。手順 5. に進んでください。",
-    "message.no.projects": "プロジェクトがありません。<br/>プロジェクト セクションから新しいプロジェクトを作成してください。",
-    "message.no.projects.adminOnly": "プロジェクトがありません。<br/>管理者に新しいプロジェクトの作成を依頼してください。",
-    "message.number.clusters": "<h2>クラスター<span>数</span></h2>",
-    "message.number.hosts": "<h2>ホスト<span>数</span></h2>",
-    "message.number.pods": "<h2>ポッド<span>数</span></h2>",
-    "message.number.storage": "<h2>プライマリ ストレージ ボリューム<span>数</span></h2>",
-    "message.number.zones": "<h2>ゾーン<span>数</span></h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "次のパスワードにリセットされました:",
-    "message.password.of.the.vm.has.been.reset.to": "VM のパスワードは次のようにリセットされました:",
-    "message.pending.projects.1": "保留中のプロジェクト招待状があります。",
-    "message.pending.projects.2": "表示するにはプロジェクト セクションに移動して、一覧から招待状を選択します。",
-    "message.please.add.at.lease.one.traffic.range": "少なくとも 1 つトラフィックの範囲を追加してください。",
-    "message.please.confirm.remove.ssh.key.pair": "この SSH キーペアを削除してもよろしいですか?",
-    "message.please.proceed": "次の手順に進んでください。",
-    "message.please.select.a.configuration.for.your.zone": "ゾーンの構成を選択してください。",
-    "message.please.select.a.different.public.and.management.network.before.removing": "削除の前に異なるパブリックおよび管理ネットワークを選択してください。",
-    "message.please.select.networks": "仮想マシンのネットワークを選択してください。",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "この VM に使用する SSH キーペアを選択してください",
-    "message.please.wait.while.zone.is.being.created": "ゾーンが作成されるまでしばらくお待ちください...",
-    "message.pod.dedication.released": "専用ポッドが解放されました",
-    "message.portable.ip.delete.confirm": "このポータブル IP アドレスの範囲を削除してもよろしいですか?",
-    "message.project.invite.sent": "ユーザーに招待状が送信されました。ユーザーが招待を承諾すると、プロジェクトに追加されます。",
-    "message.public.traffic.in.advanced.zone": "クラウド内の VM がインターネットにアクセスすると、パブリック トラフィックが生成されます。このために、一般にアクセス可能な IP アドレスを割り当てる必要があります。エンド ユーザーは CloudStack のユーザー インターフェイスを使用してこれらの IP アドレスを取得し、ゲスト ネットワークとパブリック ネットワークの間に NAT を実装することができます。<br/><br/>インターネット トラフィックのために、少なくとも 1 つ IP アドレスの範囲を入力してください。",
-    "message.public.traffic.in.basic.zone": "クラウド内の VM がインターネットにアクセスするかインターネット経由でクライアントにサービスを提供すると、パブリック トラフィックが生成されます。このために、一般にアクセス可能な IP アドレスを割り当てる必要があります。インスタンスを作成すると、ゲスト IP アドレスのほかにこのパブリック IP アドレスの範囲からアドレスが 1 つインスタンスに割り当てられます。パブリック IP アドレスとゲスト IP アドレスの間に、静的な 1 対 1 の NAT が自動的にセットアップされます。エンド ユーザーは CloudStack のユーザー インターフェイスを使用して追加の IP アドレスを取得し、インスタンスとパブリック IP アドレスの間に静的 NAT を実装することもできます。",
-    "message.question.are.you.sure.you.want.to.add": "追加してもよろしいですか?",
-    "message.read.admin.guide.scaling.up": "サイズを拡大する前に管理者ガイドの動的なサイズ変更のセクションをお読みください。",
-    "message.recover.vm": "この VM を復元してもよろしいですか?",
-    "message.redirecting.region": "リージョンにリダイレクトしています...",
-    "message.reinstall.vm": "注: 注意して続行してください。これにより VM がテンプレートから再インストールされます。ルート ディスク上のデータは失われます。追加のデータ ボリュームがある場合は、そのボリュームに影響はありません。",
-    "message.remove.ldap": "LDAP 構成を削除してもよろしいですか?",
-    "message.remove.region": "この管理サーバーからこのリージョンを削除してもよろしいですか?",
-    "message.remove.vpc": "VPC を削除してもよろしいですか?",
-    "message.remove.vpn.access": "次のユーザーから VPN アクセスを削除してもよろしいですか?",
-    "message.removed.ssh.key.pair": "削除された SSH キーペア",
-    "message.reset.VPN.connection": "VPN 接続をリセットしてもよろしいですか?",
-    "message.reset.password.warning.notPasswordEnabled": "このインスタンスのテンプレートは、パスワード管理を有効にせずに作成されました。",
-    "message.reset.password.warning.notStopped": "現在のパスワードを変更する前にインスタンスを停止する必要があります。",
-    "message.restart.mgmt.server": "新しい設定を有効にするために、管理サーバーを再起動してください。",
-    "message.restart.mgmt.usage.server": "新しい設定を有効にするために、管理サーバーと使用状況測定サーバーを再起動してください。",
-    "message.restart.network": "このネットワークで提供するすべてのサービスが中断されます。このネットワークを再起動してもよろしいですか?",
-    "message.restart.vpc": "VPC を再起動してもよろしいですか?",
-    "message.restart.vpc.remark": "VPC を再起動してもよろしいですか? <p><small><i>注意: 非冗長 VPC の冗長化は強制的にクリーンアップされます.  また、ネットワークは数分間利用出来なくなります</i>.</small></p>",
-    "message.restoreVM": "VM を復元してもよろしいですか?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(該当するセキュリティ グループをすべて選択するには、<strong>Ctrl キーを押しながらクリック</strong>してください)",
-    "message.select.a.zone": "ゾーンは通常、単一のデータセンターに相当します。複数のゾーンを設定し、物理的に分離して冗長性を持たせることにより、クラウドの信頼性を高めます。",
-    "message.select.affinity.groups": "この VM を追加するアフィニティ グループを選択してください。",
-    "message.select.instance": "インスタンスを選択してください。",
-    "message.select.iso": "新しい仮想インスタンスの ISO を選択してください。",
-    "message.select.item": "項目を選択してください。",
-    "message.select.security.groups": "新しい仮想マシンのセキュリティ グループを選択してください。",
-    "message.select.template": "新しい仮想インスタンスのテンプレートを選択してください。",
-    "message.select.tier": "階層を選択してください。",
-    "message.set.default.NIC": "この NIC をこの VM のデフォルトに設定してもよろしいですか?",
-    "message.set.default.NIC.manual": "今すぐにこの VM のデフォルト NIC を手動で更新してください。",
-    "message.setup.physical.network.during.zone.creation": "拡張ゾーンを追加するときは、1 つ以上の物理ネットワークをセットアップする必要があります。各ネットワークはハイパーバイザー上の 1 つの NIC に対応します。各物理ネットワークでは、組み合わせに制限がありますが、1 つ以上の種類のトラフィックを通信できます。<br/><br/>各物理ネットワークに対して<strong>トラフィックの種類をドラッグ アンド ドロップ</strong>してください。",
-    "message.setup.physical.network.during.zone.creation.basic": "基本ゾーンを追加するときは、ハイパーバイザー上の NIC に対応する 1 つの物理ネットワークをセットアップできます。ネットワークはいくつかの種類のトラフィックを伝送します。<br/><br/>物理ネットワークにほかのトラフィックの種類を<strong>ドラッグ アンド ドロップ</strong>することもできます。",
-    "message.setup.successful": "クラウドがセットアップされました。",
-    "message.snapshot.schedule": "以下の利用可能なオプションを選択しポリシー参照を適用することでスケジューリングによる連続したスナップショットを設定できます",
-    "message.specifiy.tag.key.value": "タグ キーおよび値を指定してください",
-    "message.specify.url": "URL を指定してください",
-    "message.step.1.continue": "続行するにはテンプレートまたは ISO を選択してください",
-    "message.step.1.desc": "新しい仮想インスタンス用のテンプレートを選択してください。ISO をインストールできる空白のテンプレートを選択することもできます。",
-    "message.step.2.continue": "続行するにはサービス オファリングを選択してください",
-    "message.step.3.continue": "続行するにはディスク オファリングを選択してください",
-    "message.step.4.continue": "続行するには少なくとも 1 つネットワークを選択してください",
-    "message.step.4.desc": "仮想インスタンスが接続するプライマリ ネットワークを選択してください。",
-    "message.storage.traffic": "ホストや CloudStack システム VM  など、管理サーバーと通信する CloudStack の内部リソース間のトラフィックです。ここでストレージ トラフィックを構成してください。",
-    "message.suspend.project": "このプロジェクトを一時停止してもよろしいですか?",
-    "message.systems.vms.ready": "システム VM の準備ができました。",
-    "message.template.copying": "テンプレートをコピーしています。",
-    "message.template.desc": "VM の起動に使用できる OS イメージ",
-    "message.tier.required": "階層は必須です",
-    "message.tooltip.dns.1": "ゾーン内の VM で使用する DNS サーバーの名前です。ゾーンのパブリック IP アドレスから、このサーバーに通信できる必要があります。",
-    "message.tooltip.dns.2": "ゾーン内の VM で使用する 2 番目の DNS サーバーの名前です。ゾーンのパブリック IP アドレスから、このサーバーに通信できる必要があります。",
-    "message.tooltip.internal.dns.1": "ゾーン内の CloudStack 内部システム VM で使用する DNS サーバーの名前です。ポッドのプライベート IP アドレスから、このサーバーに通信できる必要があります。",
-    "message.tooltip.internal.dns.2": "ゾーン内の CloudStack 内部システム VM で使用する DNS サーバーの名前です。ポッドのプライベート IP アドレスから、このサーバーに通信できる必要があります。",
-    "message.tooltip.network.domain": "DNS サフィックスです。このサフィックスからゲスト VM でアクセスするネットワークのカスタム ドメイン名が作成されます。",
-    "message.tooltip.pod.name": "このポッドの名前です。",
-    "message.tooltip.reserved.system.gateway": "ポッド内のホストのゲートウェイです。",
-    "message.tooltip.reserved.system.netmask": "ポッドのサブネットを定義するネットワーク プレフィックスです。CIDR 表記を使用します。",
-    "message.tooltip.zone.name": "ゾーンの名前です。",
-    "message.update.os.preference": "このホストの OS 基本設定を選択してください。同様の基本設定を持つすべての仮想インスタンスは、別のホストを選択する前にまずこのホストに割り当てられます。",
-    "message.update.resource.count": "このアカウントのリソース数を更新してもよろしいですか?",
-    "message.update.ssl": "各コンソール プロキシおよびセカンダリ ストレージの仮想インスタンスで更新する、X.509 準拠の新しい SSL 証明書を送信してください:",
-    "message.update.ssl.failed": "SSL 証明書の更新に失敗しました。",
-    "message.update.ssl.succeeded": "SSL 証明書の更新に成功しました",
-    "message.validate.URL": "URL を正しく入力してください。",
-    "message.validate.accept": "有効な拡張子を持つ値を入力してください。",
-    "message.validate.creditcard": "クレジット カード番号を正しく入力してください。",
-    "message.validate.date": "日付を正しく入力してください。",
-    "message.validate.date.ISO": "日付を正しく入力してください (ISO)。",
-    "message.validate.digits": "数字のみを入力してください。",
-    "message.validate.email.address": "メール アドレスを正しく入力してください。",
-    "message.validate.equalto": "同じ値を再入力してください。",
-    "message.validate.fieldrequired": "これは必須のフィールドです。",
-    "message.validate.fixfield": "このフィールドを修正してください。",
-    "message.validate.instance.name": "インスタンス名は 63 文字以内で指定してください。ASCII 文字の a~z、A~Z、数字の 0~9、およびハイフンのみを使用できます。文字で始まり、文字または数字で終わる必要があります。",
-    "message.validate.invalid.characters": "無効な文字が見つかりました。修整してください。",
-    "message.validate.max": "{0} 以下の値を入力してください。",
-    "message.validate.maxlength": "{0} 文字以下で入力してください。",
-    "message.validate.minlength": "{0} 文字以上で入力してください。",
-    "message.validate.number": "数値を正しく入力してください。",
-    "message.validate.range": "{0} ~ {1} の値を入力してください。",
-    "message.validate.range.length": "{0} ~ {1} 文字で入力してください。",
-    "message.virtual.network.desc": "アカウントの専用仮想ネットワークです。ブロードキャスト ドメインは VLAN 内に配置され、パブリック ネットワークへのアクセスはすべて仮想ルーターによってルーティングされます。",
-    "message.vm.create.template.confirm": "テンプレートを作成すると VM が自動的に再起動されます。",
-    "message.vm.review.launch": "次の情報を参照して、仮想インスタンスを正しく設定したことを確認してから起動してください。",
-    "message.vnmc.available.list": "プロバイダー一覧で VNMC を利用できません。",
-    "message.vnmc.not.available.list": "プロバイダー一覧で VNMC を利用できません。",
-    "message.volume.create.template.confirm": "このディスク ボリュームのテンプレートを作成してもよろしいですか? ボリューム サイズによっては、テンプレートの作成には数分以上かかる可能性があります。",
-    "message.waiting.for.builtin.templates.to.load": "組み込みテンプレートのロードを待機しています...",
-    "message.you.must.have.at.least.one.physical.network": "少なくとも 1 つ物理ネットワークが必要です",
-    "message.your.cloudstack.is.ready": "CloudStack の準備ができました!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "ゾーンが作成されました。このゾーンを有効にしてもよろしいですか?",
-    "message.zone.no.network.selection": "選択したゾーンでは、ネットワークを選択できません。",
-    "message.zone.step.1.desc": "ゾーンのネットワーク モデルを選択してください。",
-    "message.zone.step.2.desc": "新しいゾーンを追加するために、次の情報を入力してください。",
-    "message.zone.step.3.desc": "新しいポッドを追加するために、次の情報を入力してください。",
-    "message.zoneWizard.enable.local.storage": "警告: このゾーンのローカル ストレージを有効にする場合は、システム VM の起動場所に応じて次の操作が必要です。<br/><br/>1. システム VM を共有プライマリ ストレージで起動する必要がある場合は、共有プライマリ ストレージを作成した後でゾーンに追加する必要があります。ゾーンを無効状態から開始する必要もあります。<br/><br/>2. システム VM をローカル プライマリ ストレージで起動する必要がある場合は、ゾーンを有効にする前に system.vm.use.local.storage を true に設定する必要があります。<br/><br/><br/>続行してもよろしいですか?",
-    "messgae.validate.min": "{0} 以上の値を入力してください。",
-    "mode": "モード",
-    "network.rate": "ネットワーク速度",
-    "notification.reboot.instance": "インスタンスの再起動",
-    "notification.start.instance": "インスタンスの起動",
-    "notification.stop.instance": "インスタンスの停止",
-    "side.by.side": "並列",
-    "state.Accepted": "承諾済み",
-    "state.Active": "アクティブ",
-    "state.Allocated": "割り当て済み",
-    "state.Allocating": "割り当て中",
-    "state.BackedUp": "バックアップ済み",
-    "state.BackingUp": "バックアップ中",
-    "state.Completed": "完了",
-    "state.Creating": "作成中",
-    "state.Declined": "辞退",
-    "state.Destroyed": "破棄済み",
-    "state.Disabled": "無効",
-    "state.Enabled": "有効",
-    "state.Error": "エラー",
-    "state.Expunging": "抹消中",
-    "state.Migrating": "移行中",
-    "state.Pending": "保留",
-    "state.Ready": "準備完了",
-    "state.Running": "実行中",
-    "state.Starting": "開始中",
-    "state.Stopped": "停止済み",
-    "state.Stopping": "停止しています",
-    "state.Suspended": "一時停止",
-    "state.detached": "デタッチ済み",
-    "title.upload.volume": "ボリュームのアップロード",
-    "ui.listView.filters.all": "すべて",
-    "ui.listView.filters.mine": "自分のもの"
-};
diff --git a/ui/legacy/l10n/ko_KR.js b/ui/legacy/l10n/ko_KR.js
deleted file mode 100644
index e2f66c6..0000000
--- a/ui/legacy/l10n/ko_KR.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP 코드",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP 종류",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "항목 속성 변경",
-    "confirm.enable.s3": "S3 기반 2차 저장소 지원을 하려면 아래 정보를 입력해 주십시오.",
-    "confirm.enable.swift": "Swift 기술 지원를 사용 하려면 다음 정보를 입력해 주십시오.",
-    "error.could.not.change.your.password.because.non.native.user": "LDAP 기능이 활성화 되어 있기 때문에 패스워드 변경을 실패하였습니다.",
-    "error.could.not.enable.zone": "Zone을 사용 할 수 없습니다.",
-    "error.installWizard.message": "문제가 발생했습니다. 다시 오류를 수정할 수 있습니다.",
-    "error.invalid.username.password": "유효하지 않은 사용자명 또는 암호",
-    "error.login": "사용자명/암호가 기록과 일치하지 않습니다.",
-    "error.menu.select": "항목이 선택되어 있지 않기 때문에 작업을 실행할 수 없습니다.",
-    "error.mgmt.server.inaccessible": "관리 서버에 접근 할 수 없습니다. 다음에 재실행해 주십시오.",
-    "error.password.not.match": "암호가 일치하지 않음",
-    "error.please.specify.physical.network.tags": "현재 물리 네트워크 태그를 지정하지 않으면, 네트워크 제공은 사용할 수 없습니다.",
-    "error.session.expired": "세션 유효기간이 끊어졌습니다.",
-    "error.something.went.wrong.please.correct.the.following": "문제가 발생했습니다. 다음 내용을 수정해 주십시오",
-    "error.unable.to.reach.management.server": "관리 서버와 통신할 수 없습니다.",
-    "error.unresolved.internet.name": "인터넷 주소를 알수 없습니다.",
-    "force.delete": "강제 삭제",
-    "force.delete.domain.warning": "경고:이 옵션을 선택하면, 모든 내부 도메인 및 관련하는 모든 계정 정보와 그 자원이 삭제됩니다.",
-    "force.remove": "강제 해제",
-    "force.remove.host.warning": "경고:이 옵션을 선택하면, 실행중 모든 가상 머신이 강제적으로 정지되어 클러스터에서 호스트가 강제적으로 해제됩니다.",
-    "force.stop": "강제 정지",
-    "force.stop.instance.warning": "경고: 인스턴스 강제 정지는 최종 수단으로 해 주십시오. 데이터가 손실될 뿐만 아니라 가상 머신 동작이 일관하지 않게 될 가능성이 있습니다.",
-    "hint.no.host.tags": "No host tags found",
-    "hint.no.storage.tags": "No storage tags found",
-    "hint.type.part.host.tag": "Type in part of a host tag",
-    "hint.type.part.storage.tag": "Type in part of a storage tag",
-    "image.directory": "이미지 디렉토리",
-    "inline": "직렬",
-    "instances.actions.reboot.label": "인스턴스 재시작",
-    "label.CIDR.list": "CIDR 목록",
-    "label.CIDR.of.destination.network": "대상 네트워크 CIDR",
-    "label.CPU.cap": "CPU 제한",
-    "label.DHCP.server.type": "DHCP 서버 종류",
-    "label.DNS.domain.for.guest.networks": "손님 네트워크 DNS 도메인",
-    "label.ESP.encryption": "ESP 암호화",
-    "label.ESP.hash": "ESP 해시",
-    "label.ESP.lifetime": "ESP 유효기간(초)",
-    "label.ESP.policy": "ESP 정책",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE 암호화",
-    "label.IKE.hash": "IKE 해시",
-    "label.IKE.lifetime": "IKE 유효기간(초)",
-    "label.IKE.policy": "IKE 정책",
-    "label.IPsec.preshared.key": "IPsec 사전 공유 키",
-    "label.LB.isolation": "네트워크 로드 공유 분리",
-    "label.LUN.number": "LUN 번호",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto Log Profile",
-    "label.PA.threat.profile": "Palo Alto Threat Profile",
-    "label.PING.CIFS.password": "PING CIFS 암호",
-    "label.PING.CIFS.username": "PING CIFS 사용자명",
-    "label.PING.dir": "PING 디렉토리",
-    "label.PING.storage.IP": "PING 대상 스토리지 IP 주소",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "PXE 서버 종류",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Port",
-    "label.SR.name": "SR 명 라벨",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP 디렉토리",
-    "label.VMFS.datastore": "VMFS 데이터 스토어",
-    "label.VMs.in.tier": "계층 내부 가상머신",
-    "label.VPC.limits": "VPC limits",
-    "label.VPC.router.details": "VPC 라우터 상세",
-    "label.VPN.connection": "VPN 접속",
-    "label.VPN.customer.gateway": "VPN 고객 게이트웨이",
-    "label.VPN.gateway": "VPN 게이트웨이",
-    "label.Xenserver.Tools.Version61plus": "Original XS Version is 6.1+",
-    "label.about": "소개",
-    "label.about.app": "CloudStack 소개",
-    "label.accept.project.invitation": "프로젝트 초대 승인",
-    "label.account": "계정 정보",
-    "label.account.and.security.group": "계정 정보, 보안 그룹",
-    "label.account.details": "Account details",
-    "label.account.id": "계정 정보 ID",
-    "label.account.lower": "account",
-    "label.account.name": "계정 정보명",
-    "label.account.specific": "계정 정보 고유",
-    "label.account.type": "Account Type",
-    "label.accounts": "계정 정보",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL List Rules",
-    "label.acl.name": "ACL Name",
-    "label.acl.replaced": "ACL replaced",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "새로운 IP 주소 취득",
-    "label.acquire.new.secondary.ip": "새로운 두번째 IP 주소 취득",
-    "label.action": "Action",
-    "label.action.attach.disk": "디스크 연결",
-    "label.action.attach.disk.processing": "디스크를 연결하는 중...",
-    "label.action.attach.iso": "ISO 연결",
-    "label.action.attach.iso.processing": "ISO를 연결하는 중...",
-    "label.action.cancel.maintenance.mode": "유지 보수 모드 취소",
-    "label.action.cancel.maintenance.mode.processing": "유지 보수 모드를 취소하는 중...",
-    "label.action.change.password": "암호 변경",
-    "label.action.change.service": "서비스 변경",
-    "label.action.change.service.processing": "서비스를 변경하는 중...",
-    "label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
-    "label.action.copy.ISO": "ISO 복사",
-    "label.action.copy.ISO.processing": "Copying ISO....",
-    "label.action.copy.template": "템플릿 복사",
-    "label.action.copy.template.processing": "Copying Template....",
-    "label.action.create.template": "템플릿 만들기",
-    "label.action.create.template.from.vm": "VM에서 템플릿 만들기",
-    "label.action.create.template.from.volume": "볼륨에서 템플릿 만들기",
-    "label.action.create.template.processing": "템플릿을 만드는 중...",
-    "label.action.create.vm": "VM 만들기",
-    "label.action.create.vm.processing": "VM를 만드는 중...",
-    "label.action.create.volume": "볼륨 만들기",
-    "label.action.create.volume.processing": "볼륨을 만드는 중...",
-    "label.action.delete.IP.range": "IP 주소 범위 삭제",
-    "label.action.delete.IP.range.processing": "IP 주소 범위를 삭제하는 중...",
-    "label.action.delete.ISO": "ISO 삭제",
-    "label.action.delete.ISO.processing": "ISO를 삭제하는 중...",
-    "label.action.delete.account": "계정 정보 삭제",
-    "label.action.delete.account.processing": "계정 정보를 삭제하는 중...",
-    "label.action.delete.cluster": "클러스터 삭제",
-    "label.action.delete.cluster.processing": "클러스터를 삭제하는 중...",
-    "label.action.delete.disk.offering": "디스크 제공 삭제",
-    "label.action.delete.disk.offering.processing": "디스크 제공을 삭제하는 중...",
-    "label.action.delete.domain": "도메인 삭제",
-    "label.action.delete.domain.processing": "도메인을 삭제하는 중...",
-    "label.action.delete.firewall": "방화벽(fire wall) 규칙 삭제",
-    "label.action.delete.firewall.processing": "방화벽(fire wall)를 삭제하는 중...",
-    "label.action.delete.ingress.rule": "수신 규칙 삭제",
-    "label.action.delete.ingress.rule.processing": "수신 규칙을 삭제하는 중...",
-    "label.action.delete.load.balancer": "네트워크 로드 공유 규칙 삭제",
-    "label.action.delete.load.balancer.processing": "네트워크 로드 공유 장치를 삭제하는 중...",
-    "label.action.delete.network": "네트워크 삭제",
-    "label.action.delete.network.processing": "네트워크를 삭제하는 중...",
-    "label.action.delete.nexusVswitch": "Nexus 1000V 삭제",
-    "label.action.delete.nic": "Remove NIC",
-    "label.action.delete.physical.network": "물리 네트워크 삭제",
-    "label.action.delete.pod": "Pod 삭제",
-    "label.action.delete.pod.processing": "Pod를 삭제하는 중...",
-    "label.action.delete.primary.storage": "기본 스토리지 삭제",
-    "label.action.delete.primary.storage.processing": "기본 스토리지를 삭제하는 중...",
-    "label.action.delete.secondary.storage": "2차 스토리지 삭제",
-    "label.action.delete.secondary.storage.processing": "2차 스토리지를 삭제하는 중...",
-    "label.action.delete.security.group": "보안 그룹 삭제",
-    "label.action.delete.security.group.processing": "보안 그룹을 삭제하는 중...",
-    "label.action.delete.service.offering": "서비스제공 삭제",
-    "label.action.delete.service.offering.processing": "서비스제공을 삭제하는 중...",
-    "label.action.delete.snapshot": "스냅샷 삭제",
-    "label.action.delete.snapshot.processing": "스냅샷을 삭제하는 중...",
-    "label.action.delete.system.service.offering": "시스템 서비스 제공 삭제",
-    "label.action.delete.template": "템플릿 삭제",
-    "label.action.delete.template.processing": "템플릿을 삭제하는 중...",
-    "label.action.delete.user": "사용자 삭제",
-    "label.action.delete.user.processing": "사용자를 삭제하는 중...",
-    "label.action.delete.volume": "볼륨 삭제",
-    "label.action.delete.volume.processing": "볼륨을 삭제하는 중...",
-    "label.action.delete.zone": "Zone 삭제",
-    "label.action.delete.zone.processing": "Zone을 삭제하는 중...",
-    "label.action.destroy.instance": "인스턴스 파기",
-    "label.action.destroy.instance.processing": "인스턴스를 파기하는 중...",
-    "label.action.destroy.systemvm": "시스템 VM 파기",
-    "label.action.destroy.systemvm.processing": "시스템 VM를 파기하는 중...",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "디스크 분리",
-    "label.action.detach.disk.processing": "디스크를 분리 하는 중...",
-    "label.action.detach.iso": "ISO 분리",
-    "label.action.detach.iso.processing": "ISO를 분리 하는 중...",
-    "label.action.disable.account": "계정 정보 중지",
-    "label.action.disable.account.processing": "계정 정보를 중지하는 중...",
-    "label.action.disable.cluster": "클러스터 사용 안 함",
-    "label.action.disable.cluster.processing": "클러스터를 사용 안 함으로 설정 중...",
-    "label.action.disable.nexusVswitch": "Nexus 1000V 사용 안 함",
-    "label.action.disable.physical.network": "물리 네트워크 사용 안 함",
-    "label.action.disable.pod": "Pod 사용 안 함",
-    "label.action.disable.pod.processing": "Pod를 사용 안 함으로 설정 중...",
-    "label.action.disable.static.NAT": "정적 NAT 사용 안 함",
-    "label.action.disable.static.NAT.processing": "정적 NAT를 중지하는 중...",
-    "label.action.disable.user": "사용자 중지",
-    "label.action.disable.user.processing": "사용자를 중지하는 중...",
-    "label.action.disable.zone": "Zone 사용 안 함",
-    "label.action.disable.zone.processing": "Zone을 사용 안 함으로 설정 중...",
-    "label.action.download.ISO": "ISO 다운로드",
-    "label.action.download.template": "템플릿 다운로드",
-    "label.action.download.volume": "볼륨 다운로드",
-    "label.action.download.volume.processing": "볼륨을 다운로드하는 중...",
-    "label.action.edit.ISO": "ISO 편집",
-    "label.action.edit.account": "계정 정보 편집",
-    "label.action.edit.disk.offering": "디스크 제공 편집",
-    "label.action.edit.domain": "도메인 편집",
-    "label.action.edit.global.setting": "글로벌 설정 편집",
-    "label.action.edit.host": "호스트 편집",
-    "label.action.edit.instance": "인스턴스 편집",
-    "label.action.edit.network": "네트워크 편집",
-    "label.action.edit.network.offering": "네트워크 제공 편집",
-    "label.action.edit.network.processing": "네트워크를 편집하는 중...",
-    "label.action.edit.pod": "Pod 편집",
-    "label.action.edit.primary.storage": "기본 스토리지 편집",
-    "label.action.edit.resource.limits": "자원 제한 편집",
-    "label.action.edit.service.offering": "서비스 제공 편집",
-    "label.action.edit.template": "템플릿 편집",
-    "label.action.edit.user": "사용자 편집",
-    "label.action.edit.zone": "Zone 편집",
-    "label.action.enable.account": "계정 정보 사용함",
-    "label.action.enable.account.processing": "계정 정보를 사용 설정 중...",
-    "label.action.enable.cluster": "클러스터 사용함",
-    "label.action.enable.cluster.processing": "클러스터를 사용 설정 중...",
-    "label.action.enable.maintenance.mode": "유지 보수 모드 사용함",
-    "label.action.enable.maintenance.mode.processing": "유지 보수 모드를 사용 설정 중...",
-    "label.action.enable.nexusVswitch": "Nexus 1000V 사용함",
-    "label.action.enable.physical.network": "물리 네트워크 사용함",
-    "label.action.enable.pod": "Pod 사용함",
-    "label.action.enable.pod.processing": "Pod를 사용 설정 중...",
-    "label.action.enable.static.NAT": "정적 NAT 사용함",
-    "label.action.enable.static.NAT.processing": "정적 NAT를 사용 설정 중...",
-    "label.action.enable.user": "사용자 사용함",
-    "label.action.enable.user.processing": "사용자를 사용 설정 중...",
-    "label.action.enable.zone": "Zone 사용함",
-    "label.action.enable.zone.processing": "Zone을 사용 설정 중...",
-    "label.action.expunge.instance": "Expunge Instance",
-    "label.action.expunge.instance.processing": "Expunging Instance....",
-    "label.action.force.reconnect": "강제재접속",
-    "label.action.force.reconnect.processing": "재접속하는 중...",
-    "label.action.generate.keys": "키 생성",
-    "label.action.generate.keys.processing": "키를 생성하는 중...",
-    "label.action.list.nexusVswitch": "Nexus 1000V 목록 표시",
-    "label.action.lock.account": "계정 정보 잠금",
-    "label.action.lock.account.processing": "계정 정보를 잠그는 중...",
-    "label.action.manage.cluster": "클러스터 관리 동작",
-    "label.action.manage.cluster.processing": "클러스터를 관리 대상으로 하는 중...",
-    "label.action.migrate.instance": "인스턴스 이전",
-    "label.action.migrate.instance.processing": "인스턴스를 이전하는 중...",
-    "label.action.migrate.router": "라우터 이전",
-    "label.action.migrate.router.processing": "라우터를 이전하는 중...",
-    "label.action.migrate.systemvm": "시스템 VM 이전",
-    "label.action.migrate.systemvm.processing": "시스템 VM를 이전하는 중",
-    "label.action.reboot.instance": "인스턴스 재시작",
-    "label.action.reboot.instance.processing": "인스턴스를 재시작하는 중...",
-    "label.action.reboot.router": "라우터 재시작",
-    "label.action.reboot.router.processing": "라우터를 재시작하는 중...",
-    "label.action.reboot.systemvm": "시스템 VM 재시작",
-    "label.action.reboot.systemvm.processing": "시스템 VM를 재시작하는 중...",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "정기 스냅샷",
-    "label.action.register.iso": "ISO 등록",
-    "label.action.register.template": "Register Template from URL",
-    "label.action.release.ip": "IP 주소 해제",
-    "label.action.release.ip.processing": "IP 주소를 해제하는 중...",
-    "label.action.remove.host": "호스트 삭제",
-    "label.action.remove.host.processing": "호스트를 삭제하는 중...",
-    "label.action.reset.password": "암호 재설정",
-    "label.action.reset.password.processing": "암호를 재설정 하는 중...",
-    "label.action.resize.volume": "볼륨 크기 변경",
-    "label.action.resize.volume.processing": "볼륨 크기 변경 중...",
-    "label.action.resource.limits": "자원 제한",
-    "label.action.restore.instance": "인스턴스 복원",
-    "label.action.restore.instance.processing": "인스턴스를 복원하는 중...",
-    "label.action.revert.snapshot": "Revert to Snapshot",
-    "label.action.revert.snapshot.processing": "Reverting to Snapshot...",
-    "label.action.start.instance": "인스턴스 시작",
-    "label.action.start.instance.processing": "인스턴스를 시작하는 중...",
-    "label.action.start.router": "라우터 시작",
-    "label.action.start.router.processing": "라우터를 시작하는 중...",
-    "label.action.start.systemvm": "시스템 VM 시작",
-    "label.action.start.systemvm.processing": "시스템 VM를 시작하는 중...",
-    "label.action.stop.instance": "인스턴스 정지",
-    "label.action.stop.instance.processing": "인스턴스를 정지하는 중...",
-    "label.action.stop.router": "라우터 정지",
-    "label.action.stop.router.processing": "라우터를 정지하는 중...",
-    "label.action.stop.systemvm": "시스템 VM 정지",
-    "label.action.stop.systemvm.processing": "시스템 VM를 정지하는 중...",
-    "label.action.take.snapshot": "스냅샷 만들기",
-    "label.action.take.snapshot.processing": "스냅샷을 만드는 중....",
-    "label.action.unmanage.cluster": "클러스터 비관리 동작",
-    "label.action.unmanage.cluster.processing": "클러스터를 비관리 대상으로 하는 중...",
-    "label.action.update.OS.preference": "OS 기본 설정 업데이트",
-    "label.action.update.OS.preference.processing": "OS 기본 설정을 업데이트하는 중...",
-    "label.action.update.resource.count": "자원 수 업데이트",
-    "label.action.update.resource.count.processing": "자원 수를 업데이트하는 중...",
-    "label.action.vmsnapshot.create": "VM 스",
-    "label.action.vmsnapshot.delete": "VM",
-    "label.action.vmsnapshot.revert": "VM 스냅샷",
-    "label.actions": "작업",
-    "label.activate.project": "프로젝트 활성화",
-    "label.active.sessions": "활성 세션",
-    "label.add": "추가",
-    "label.add.ACL": "권한 관리(ACL) 추가",
-    "label.add.BigSwitchBcf.device": "Add BigSwitch BCF Controller",
-    "label.add.BrocadeVcs.device": "Add Brocade Vcs Switch",
-    "label.add.F5.device": "F5 기기 추가",
-    "label.add.LDAP.account": "Add LDAP Account",
-    "label.add.NiciraNvp.device": "Nvp 콘트롤러",
-    "label.add.OpenDaylight.device": "Add OpenDaylight Controller",
-    "label.add.PA.device": "Add Palo Alto device",
-    "label.add.SRX.device": "SRX 기기 추가",
-    "label.add.VM.to.tier": "계층에 VM 추가",
-    "label.add.VPN.gateway": "VPN 게이트웨이 추가",
-    "label.add.account": "계정 정보 추가",
-    "label.add.account.to.project": "계정 정보 프로젝트에 추가",
-    "label.add.accounts": "계정 정보 추가",
-    "label.add.accounts.to": "계정 정보 추가:",
-    "label.add.acl.list": "Add ACL List",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Add new affinity group",
-    "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
-    "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
-    "label.add.by": "추가 단위",
-    "label.add.by.cidr": "CIDR 로 추가",
-    "label.add.by.group": "그룹에서 추가",
-    "label.add.ciscoASA1000v": "Add CiscoASA1000v Resource",
-    "label.add.cluster": "클러스터 추가",
-    "label.add.compute.offering": "컴퓨팅 자원 추가",
-    "label.add.direct.iprange": "직접 IP 주소 범위 추가",
-    "label.add.disk.offering": "디스크 제공 추가",
-    "label.add.domain": "도메인 추가",
-    "label.add.egress.rule": "전송 규칙 추가",
-    "label.add.firewall": "방화벽(fire wall) 규칙 추가",
-    "label.add.globo.dns": "Add GloboDNS",
-    "label.add.gslb": "Add GSLB",
-    "label.add.guest.network": "손님 네트워크 추가",
-    "label.add.host": "호스트 추가",
-    "label.add.ingress.rule": "수신 규칙 추가",
-    "label.add.intermediate.certificate": "Add intermediate certificate",
-    "label.add.internal.lb": "Add Internal LB",
-    "label.add.ip.range": "IP 주소 범위 추가",
-    "label.add.isolated.guest.network": "Add Isolated Guest Network",
-    "label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
-    "label.add.isolated.network": "Add Isolated Network",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Add LDAP account",
-    "label.add.list.name": "ACL List Name",
-    "label.add.load.balancer": "네트워크 로드 공유 장치 추가",
-    "label.add.more": "다른 항목 추가",
-    "label.add.netScaler.device": "Netscaler 기기 추가",
-    "label.add.network": "네트워크 추가",
-    "label.add.network.ACL": "네트워크 권한 관리(ACL) 추가",
-    "label.add.network.acl.list": "Add Network ACL List",
-    "label.add.network.device": "네트워크 기기 추가",
-    "label.add.network.offering": "네트워크 제공 추가",
-    "label.add.new.F5": "새로운 F5 추가",
-    "label.add.new.NetScaler": "새로운 NetScaler 추가",
-    "label.add.new.PA": "Add new Palo Alto",
-    "label.add.new.SRX": "새로운 SRX 추가",
-    "label.add.new.gateway": "새 게이트웨이 추가하기",
-    "label.add.new.tier": "새 계층 추가",
-    "label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
-    "label.add.physical.network": "물리 네트워크 추가",
-    "label.add.pod": "Pod 추가",
-    "label.add.port.forwarding.rule": "포토 전송 규칙의 추가",
-    "label.add.portable.ip.range": "Add Portable IP Range",
-    "label.add.primary.storage": "기본 스토리지 추가",
-    "label.add.private.gateway": "Add Private Gateway",
-    "label.add.region": "지역",
-    "label.add.resources": "자원 추가",
-    "label.add.role": "Add Role",
-    "label.add.route": "라우트 추가",
-    "label.add.rule": "규칙 추가",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "2차 스토리지 추가",
-    "label.add.security.group": "보안 그룹 추가",
-    "label.add.service.offering": "서비스제공 추가",
-    "label.add.static.nat.rule": "정적 NAT 규칙 추가",
-    "label.add.static.route": "정적 라우트 추가",
-    "label.add.system.service.offering": "시스템 서비스 제공 추가",
-    "label.add.template": "템플릿 추가",
-    "label.add.to.group": "그룹에 추가",
-    "label.add.ucs.manager": "Add UCS Manager",
-    "label.add.user": "사용자 추가",
-    "label.add.userdata": "Userdata",
-    "label.add.vlan": "VLAN 추가",
-    "label.add.vm": "VM 추가",
-    "label.add.vms": "VM 추가",
-    "label.add.vms.to.lb": "네트워크 로드 공유 규칙에 VM 추가",
-    "label.add.vmware.datacenter": "Add VMware datacenter",
-    "label.add.vnmc.device": "Add VNMC device",
-    "label.add.vnmc.provider": "Add VNMC provider",
-    "label.add.volume": "볼륨 추가",
-    "label.add.vpc": "VPC 추가",
-    "label.add.vpc.offering": "Add VPC Offering",
-    "label.add.vpn.customer.gateway": "VPN 고객 게이트웨이 추가",
-    "label.add.vpn.user": "VPN 사용자 추가",
-    "label.add.vxlan": "VXLAN 추가",
-    "label.add.zone": "Zone 추가",
-    "label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
-    "label.added.network.offering": "Added network offering",
-    "label.added.new.bigswitch.bcf.controller": "Added new BigSwitch BCF Controller",
-    "label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
-    "label.addes.new.f5": "Added new F5",
-    "label.adding": "정보 추가",
-    "label.adding.cluster": "클러스터를 추가중...",
-    "label.adding.failed": "추가할 수 없음",
-    "label.adding.pod": "Pod를 추가 가능",
-    "label.adding.processing": "추가하는 중...",
-    "label.adding.succeeded": "추가 완료",
-    "label.adding.user": "사용자 추가",
-    "label.adding.zone": "Zone 추가",
-    "label.additional.networks": "추가 네트워크",
-    "label.admin": "관리자",
-    "label.admin.accounts": "관리자 계정 정보",
-    "label.advanced": "확장",
-    "label.advanced.mode": "확장 모드",
-    "label.advanced.search": "고도 검색",
-    "label.affinity": "Affinity",
-    "label.affinity.group": "Affinity Group",
-    "label.affinity.groups": "Affinity Groups",
-    "label.agent.password": "에이전트 암호",
-    "label.agent.port": "Agent Port",
-    "label.agent.state": "Agent State",
-    "label.agent.username": "에이전트 사용자명",
-    "label.agree": "동의",
-    "label.alert": "알림 체제",
-    "label.alert.archived": "Alert Archived",
-    "label.alert.deleted": "Alert Deleted",
-    "label.alert.details": "Alert details",
-    "label.algorithm": "알고리즘",
-    "label.allocated": "할당 완료 상태",
-    "label.allocation.state": "할당 상태",
-    "label.allow": "Allow",
-    "label.anti.affinity": "Anti-affinity",
-    "label.anti.affinity.group": "Anti-affinity Group",
-    "label.anti.affinity.groups": "Anti-affinity Groups",
-    "label.api.key": "API 키",
-    "label.api.version": "API Version",
-    "label.app.name": "CloudStack",
-    "label.apply": "적용",
-    "label.archive": "Archive",
-    "label.archive.alerts": "알림",
-    "label.archive.events": "이벤트",
-    "label.assign": "할당",
-    "label.assign.instance.another": "Assign Instance to Another Account",
-    "label.assign.to.load.balancer": "네트워크 로드 공유 장치에 인스턴스를 할당",
-    "label.assign.vms": "Assign VMs",
-    "label.assigned.vms": "Assigned VMs",
-    "label.associate.public.ip": "Associate Public IP",
-    "label.associated.network": "관련 네트워크",
-    "label.associated.network.id": "관련 네트워크 ID",
-    "label.associated.profile": "Associated Profile",
-    "label.attached.iso": "연결 ISO",
-    "label.author.email": "제작자",
-    "label.author.name": "Author name",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
-    "label.availability": "가용성",
-    "label.availability.zone": "이용 가능 Zone",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "사용 가능",
-    "label.available.public.ips": "사용 가능 공개 IP 주소",
-    "label.back": "뒤로",
-    "label.bandwidth": "대역폭",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP Devices",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP Provider",
-    "label.baremetal.pxe.device": "Add Baremetal PXE Device",
-    "label.baremetal.pxe.devices": "Baremetal PXE Devices",
-    "label.baremetal.pxe.provider": "Baremetal PXE Provider",
-    "label.baremetal.rack.configuration": "Baremetal Rack Configuration",
-    "label.basic": "기본",
-    "label.basic.mode": "기본 모드",
-    "label.bigswitch.bcf.details": "BigSwitch BCF details",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT Enabled",
-    "label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "부팅 가능",
-    "label.broadcast.domain.range": "브로드캐스트 도메인 범위",
-    "label.broadcast.domain.type": "브로드캐스트 도메인 종류",
-    "label.broadcast.uri": "Broadcast URI",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "Broadcast URI",
-    "label.brocade.vcs.address": "Vcs Switch Address",
-    "label.brocade.vcs.details": "Brocade Vcs Switch details",
-    "label.by.account": "계정 정보",
-    "label.by.alert.type": "알림",
-    "label.by.availability": "가용성",
-    "label.by.date.end": "날짜(종료일)",
-    "label.by.date.start": "날짜(시작일)",
-    "label.by.domain": "도메인",
-    "label.by.end.date": "종료일",
-    "label.by.event.type": "이벤트",
-    "label.by.level": "레벨",
-    "label.by.pod": "Pod",
-    "label.by.role": "역할",
-    "label.by.start.date": "시작일",
-    "label.by.state": "상태",
-    "label.by.traffic.type": "트래픽 종류",
-    "label.by.type": "종류",
-    "label.by.type.id": "종류 ID",
-    "label.by.zone": "Zone",
-    "label.bytes.received": "수신 바이트",
-    "label.bytes.sent": "전송 바이트",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "취소",
-    "label.capacity": "처리 능력",
-    "label.capacity.bytes": "Capacity Bytes",
-    "label.capacity.iops": "Capacity IOPS",
-    "label.certificate": "인증서",
-    "label.change.affinity": "Change Affinity",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "서비스 제공 변경",
-    "label.change.value": "값 변경",
-    "label.character": "문자",
-    "label.chassis": "Chassis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR 또는 계정 정보/보안 그룹",
-    "label.cidr.list": "전송원 CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Address",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Password",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Username",
-    "label.ciscovnmc.resource.details": "CiscoVNMC resource details",
-    "label.clean.up": "삭제하기",
-    "label.clear.list": "목록 삭제",
-    "label.close": "닫기",
-    "label.cloud.console": "클라우드 관리 콘솔",
-    "label.cloud.managed": "Cloud.com 관리",
-    "label.cluster": "클러스터",
-    "label.cluster.name": "클러스터명",
-    "label.cluster.type": "클러스터 종류",
-    "label.clusters": "클러스터",
-    "label.clvm": "CLVM",
-    "label.code": "코드",
-    "label.community": "커뮤니티",
-    "label.compute": "컴퓨팅",
-    "label.compute.and.storage": "컴퓨팅과 스토리지",
-    "label.compute.offering": "컴퓨팅 자원 제공",
-    "label.compute.offerings": "Compute Offerings",
-    "label.configuration": "구성",
-    "label.configure": "구성",
-    "label.configure.ldap": "Configure LDAP",
-    "label.configure.network.ACLs": "네트워크 권한 관리(ACL) 구성",
-    "label.configure.sticky.policy": "Configure Sticky Policy",
-    "label.configure.vpc": "VPC 구성",
-    "label.confirm.password": "암호 확인 입력",
-    "label.confirmation": "확인",
-    "label.congratulations": "설정이 곧 완료입니다.",
-    "label.conserve.mode": "절약 모드",
-    "label.console.proxy": "콘솔 프록시",
-    "label.console.proxy.vm": "Console Proxy VM",
-    "label.continue": "실행",
-    "label.continue.basic.install": "기본 설치 실행",
-    "label.copying.iso": "Copying ISO",
-    "label.corrections.saved": "접속 정보 저장",
-    "label.counter": "Counter",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "할당 완료 CPU",
-    "label.cpu.allocated.for.VMs": "VM에 할당 완료 CPU",
-    "label.cpu.limits": "CPU limits",
-    "label.cpu.mhz": "CPU (MHz)",
-    "label.cpu.utilized": "CPU 사용율",
-    "label.create.VPN.connection": "VPN 접속 만들기",
-    "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
-    "label.create.nfs.secondary.staging.store": "Create NFS secondary staging store",
-    "label.create.project": "프로젝트 만들기",
-    "label.create.ssh.key.pair": "Create a SSH Key Pair",
-    "label.create.template": "템플릿 만들기",
-    "label.created": "일시 만들기",
-    "label.created.by.system": "시스템 만들기",
-    "label.cross.zones": "크로스 존",
-    "label.custom": "Custom",
-    "label.custom.disk.iops": "Custom IOPS",
-    "label.custom.disk.offering": "Custom Disk Offering",
-    "label.custom.disk.size": "맞춤 디스크 크기",
-    "label.daily": "매일",
-    "label.data.disk.offering": "데이타 디스크 제공",
-    "label.date": "날짜",
-    "label.day": "Day",
-    "label.day.of.month": "매월 지정일",
-    "label.day.of.week": "매주 지정일",
-    "label.dc.name": "DC Name",
-    "label.dead.peer.detection": "정지 피어 감지",
-    "label.decline.invitation": "초대 거절",
-    "label.dedicate": "Dedicate",
-    "label.dedicate.cluster": "Dedicate Cluster",
-    "label.dedicate.host": "Dedicate Host",
-    "label.dedicate.pod": "Dedicate Pod",
-    "label.dedicate.vlan.vni.range": "Dedicate VLAN/VNI Range",
-    "label.dedicate.zone": "Dedicate Zone",
-    "label.dedicated": "전용",
-    "label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
-    "label.default": "기본",
-    "label.default.egress.policy": "Default egress policy",
-    "label.default.use": "기본 사용",
-    "label.default.view": "기본 보기",
-    "label.delete": "삭제",
-    "label.delete.BigSwitchBcf": "Remove BigSwitch BCF Controller",
-    "label.delete.BrocadeVcs": "Remove Brocade Vcs Switch",
-    "label.delete.F5": "F5 삭제",
-    "label.delete.NetScaler": "NetScaler 삭제",
-    "label.delete.NiciraNvp": "Remove Nvp Controller",
-    "label.delete.OpenDaylight.device": "Delete OpenDaylight Controller",
-    "label.delete.PA": "Delete Palo Alto",
-    "label.delete.SRX": "SRX 삭제",
-    "label.delete.VPN.connection": "VPN 접속 삭제",
-    "label.delete.VPN.customer.gateway": "VPN 고객 게이트웨이 삭제",
-    "label.delete.VPN.gateway": "VPN 게이트웨이삭제",
-    "label.delete.acl.list": "Delete ACL List",
-    "label.delete.affinity.group": "Delete Affinity Group",
-    "label.delete.alerts": "알림",
-    "label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
-    "label.delete.ciscoASA1000v": "Delete CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
-    "label.delete.events": "이벤트",
-    "label.delete.gateway": "게이트웨이 삭제",
-    "label.delete.internal.lb": "Delete Internal LB",
-    "label.delete.portable.ip.range": "Delete Portable IP Range",
-    "label.delete.profile": "Delete Profile",
-    "label.delete.project": "프로젝트 삭제",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Delete Secondary Staging Store",
-    "label.delete.ucs.manager": "Delete UCS Manager",
-    "label.delete.vpn.user": "VPN 사용자 삭제",
-    "label.deleting.failed": "삭제할 수 없음",
-    "label.deleting.processing": "삭제하는 중...",
-    "label.deny": "Deny",
-    "label.deployment.planner": "Deployment planner",
-    "label.description": "설명",
-    "label.destination.physical.network.id": "목적 물리 네트워크 ID",
-    "label.destination.zone": "복사할 Zone",
-    "label.destroy": "파기",
-    "label.destroy.router": "라우터 파기",
-    "label.destroy.vm.graceperiod": "Destroy VM Grace Period",
-    "label.detaching.disk": "디스크를 분리함",
-    "label.details": "상세",
-    "label.device.id": "기기 ID",
-    "label.devices": "기기",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direct Attached Public IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "직접 IP 주소",
-    "label.disable.autoscale": "Disable Autoscale",
-    "label.disable.host": "Disable Host",
-    "label.disable.network.offering": "Disable network offering",
-    "label.disable.provider": "제공자 사용 안 함",
-    "label.disable.vnmc.provider": "Disable VNMC provider",
-    "label.disable.vpc.offering": "Disable VPC offering",
-    "label.disable.vpn": "VPN 사용 안 함",
-    "label.disabled": "사용 안함",
-    "label.disabling.vpn.access": "VPN 접근를 사용 안 함으로 설정 중",
-    "label.disassociate.profile.blade": "Disassociate Profile from Blade",
-    "label.disbale.vnmc.device": "Disable VNMC device",
-    "label.disk.allocated": "할당 완료 디스크",
-    "label.disk.bytes.read.rate": "Disk Read Rate (BPS)",
-    "label.disk.bytes.write.rate": "Disk Write Rate (BPS)",
-    "label.disk.iops.max": "Max IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Disk Read Rate (IOPS)",
-    "label.disk.iops.total": "IOPS Total",
-    "label.disk.iops.write.rate": "Disk Write Rate (IOPS)",
-    "label.disk.offering": "디스크 제공",
-    "label.disk.offering.details": "Disk offering details",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisioning Type",
-    "label.disk.read.bytes": "Disk Read (Bytes)",
-    "label.disk.read.io": "Disk Read (IO)",
-    "label.disk.size": "디스크 크기",
-    "label.disk.size.gb": "디스크 크기(GB 단위)",
-    "label.disk.total": "디스크 합계",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "디스크 볼륨",
-    "label.disk.write.bytes": "Disk Write (Bytes)",
-    "label.disk.write.io": "Disk Write (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Display Name",
-    "label.display.text": "표시 텍스트",
-    "label.distributedrouter": "Distributed Router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "도메인",
-    "label.domain.admin": "도메인 관리자",
-    "label.domain.details": "Domain details",
-    "label.domain.id": "도메인 ID",
-    "label.domain.lower": "domain",
-    "label.domain.name": "도메인명",
-    "label.domain.router": "도메인 라우터",
-    "label.domain.suffix": "DNS 도메인 (예: xyz.com)",
-    "label.done": "완료",
-    "label.double.quotes.are.not.allowed": "큰 따옴표 사용할 수 없음",
-    "label.download.progress": "다운로드 진행 사항",
-    "label.drag.new.position": "새로운 위치에 끌어오기",
-    "label.duration.in.sec": "Duration (in sec)",
-    "label.dynamically.scalable": "Dynamically Scalable",
-    "label.edit": "편집",
-    "label.edit.acl.rule": "Edit ACL rule",
-    "label.edit.affinity.group": "Edit Affinity Group",
-    "label.edit.lb.rule": "네트워크 로드 공유 규칙 편집",
-    "label.edit.network.details": "네트워크 상세한 편집",
-    "label.edit.project.details": "프로젝트 상세 편집",
-    "label.edit.region": "Edit Region",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Edit rule",
-    "label.edit.secondary.ips": "Edit secondary IPs",
-    "label.edit.tags": "태그 편집",
-    "label.edit.traffic.type": "트래픽 종류 편집",
-    "label.edit.vpc": "VPC 편집",
-    "label.egress.default.policy": "Egress 기본",
-    "label.egress.rule": "전송 규칙",
-    "label.egress.rules": "Egress rules",
-    "label.elastic": "오류 스틱",
-    "label.elastic.IP": "탄력적 IP 주소",
-    "label.elastic.LB": "탄력적 네트워크 로드 공유",
-    "label.email": "전자 메일",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Enable Autoscale",
-    "label.enable.host": "Enable Host",
-    "label.enable.network.offering": "Enable network offering",
-    "label.enable.provider": "제공자 사용함",
-    "label.enable.s3": "Enable S3-backed Secondary Storage",
-    "label.enable.swift": "Swift 사용함",
-    "label.enable.vnmc.device": "Enable VNMC device",
-    "label.enable.vnmc.provider": "Enable VNMC provider",
-    "label.enable.vpc.offering": "Enable VPC offering",
-    "label.enable.vpn": "VPN 사용함",
-    "label.enabling.vpn": "VPN를 사용 하고 있음",
-    "label.enabling.vpn.access": "VPN 접근를 사용 하고 있음",
-    "label.end.IP": "종료 IP 주소",
-    "label.end.port": "종료 포토",
-    "label.end.reserved.system.IP": "예약된 종료 시스템 IP 주소",
-    "label.end.vlan": "End VLAN",
-    "label.end.vxlan": "End VXLAN",
-    "label.endpoint": "Endpoint",
-    "label.endpoint.or.operation": "엔드 포인트 또는 작업",
-    "label.enter.token": "토큰 입력",
-    "label.error": "오류",
-    "label.error.code": "오류 코드",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX/ESXi 호스트",
-    "label.event": "Event",
-    "label.event.archived": "Event Archived",
-    "label.event.deleted": "Event Deleted",
-    "label.every": "Every",
-    "label.example": "예",
-    "label.expunge": "Expunge",
-    "label.external.link": "External link",
-    "label.extractable": "추출 가능",
-    "label.extractable.lower": "extractable",
-    "label.f5": "F5",
-    "label.f5.details": "F5 details",
-    "label.failed": "실패",
-    "label.featured": "추천",
-    "label.fetch.latest": "최신 정보 취득",
-    "label.filterBy": "필터",
-    "label.fingerprint": "FingerPrint",
-    "label.firewall": "방화벽(fire wall)",
-    "label.first.name": "이름",
-    "label.firstname.lower": "firstname",
-    "label.format": "형식",
-    "label.format.lower": "format",
-    "label.friday": "금요일",
-    "label.full": "전체",
-    "label.full.path": "전체 경로",
-    "label.gateway": "게이트웨이",
-    "label.general.alerts": "일반 알림 체제",
-    "label.generating.url": "URL를 생성하고 있음",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS Configuration",
-    "label.gluster.volume": "볼륨",
-    "label.go.step.2": "단계 2으로",
-    "label.go.step.3": "단계 3으로",
-    "label.go.step.4": "단계 4으로",
-    "label.go.step.5": "단계 5으로",
-    "label.gpu": "GPU",
-    "label.group": "그룹",
-    "label.group.by.account": "Group by account",
-    "label.group.by.cluster": "Group by cluster",
-    "label.group.by.pod": "Group by pod",
-    "label.group.by.zone": "Group by zone",
-    "label.group.optional": "그룹(옵션)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Assigned load balancing",
-    "label.gslb.assigned.lb.more": "Assign more load balancing",
-    "label.gslb.delete": "Delete GSLB",
-    "label.gslb.details": "GSLB details",
-    "label.gslb.domain.name": "GSLB Domain Name",
-    "label.gslb.lb.details": "Load balancing details",
-    "label.gslb.lb.remove": "Remove load balancing from this GSLB",
-    "label.gslb.lb.rule": "Load balancing rule",
-    "label.gslb.service": "GSLB service",
-    "label.gslb.service.private.ip": "GSLB service Private IP",
-    "label.gslb.service.public.ip": "GSLB service Public IP",
-    "label.gslb.servicetype": "Service Type",
-    "label.guest": "게스트",
-    "label.guest.cidr": "게스트 CIDR",
-    "label.guest.end.ip": "게스트 종료 IP 주소",
-    "label.guest.gateway": "게스트 게이트웨이",
-    "label.guest.ip": "게스트 IP 주소",
-    "label.guest.ip.range": "게스트 IP 주소 범위",
-    "label.guest.netmask": "게스트 넷 마스크",
-    "label.guest.network.details": "Guest network details",
-    "label.guest.networks": "손님 네트워크",
-    "label.guest.start.ip": "게스트 시작 IP 주소",
-    "label.guest.traffic": "게스트 트래픽",
-    "label.guest.traffic.vswitch.name": "Guest Traffic vSwitch Name",
-    "label.guest.traffic.vswitch.type": "Guest Traffic vSwitch Type",
-    "label.guest.type": "게스트 종류",
-    "label.ha.enabled": "고가용성 사용함",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "Advanced Options:",
-    "label.health.check.configurations.options": "Configuration Options:",
-    "label.health.check.interval.in.sec": "Health Check Interval (in sec)",
-    "label.health.check.message.desc": "Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check",
-    "label.health.check.wizard": "Health Check Wizard",
-    "label.healthy.threshold": "Healthy Threshold",
-    "label.help": "도움말",
-    "label.hide.ingress.rule": "수신 규칙을 숨기기",
-    "label.hints": "정보",
-    "label.home": "Home",
-    "label.host": "호스트",
-    "label.host.MAC": "호스트 MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "호스트명",
-    "label.host.tag": "Host Tag",
-    "label.host.tags": "호스트 태그",
-    "label.hosts": "호스트",
-    "label.hourly": "매시간",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Traffic Label",
-    "label.hypervisor": "하이퍼 바이저",
-    "label.hypervisor.capabilities": "하이퍼 바이저 기능",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Snapshot Reserve",
-    "label.hypervisor.type": "하이퍼 바이저 종류",
-    "label.hypervisor.version": "하이퍼 바이저 버전",
-    "label.hypervisors": "하이퍼바이저",
-    "label.id": "ID",
-    "label.info": "정보",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "수신 규칙",
-    "label.initiated.by": "시작 사용자",
-    "label.inside.port.profile": "Inside Port Profile",
-    "label.installWizard.addClusterIntro.subtitle": "클러스터 대한 정보",
-    "label.installWizard.addClusterIntro.title": "클러스터 추가",
-    "label.installWizard.addHostIntro.subtitle": "호스트에 대해",
-    "label.installWizard.addHostIntro.title": "호스트 추가",
-    "label.installWizard.addPodIntro.subtitle": "Pod에 대한 정보",
-    "label.installWizard.addPodIntro.title": "Pod 추가",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "기본 스토리지에 대해",
-    "label.installWizard.addPrimaryStorageIntro.title": "기본 스토리지 추가",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "2차 스토리지에 대해",
-    "label.installWizard.addSecondaryStorageIntro.title": "2차 스토리지 추가",
-    "label.installWizard.addZone.title": "Zone 추가",
-    "label.installWizard.addZoneIntro.subtitle": "Zone에 대한 정보",
-    "label.installWizard.addZoneIntro.title": "Zone 추가",
-    "label.installWizard.click.launch": "[시작]을 클릭해 주십시오.",
-    "label.installWizard.subtitle": "현재 가이드 투어는 CloudStack™ 환경 설정에 도움이 됩니다",
-    "label.installWizard.title": "CloudStack™ 마법사",
-    "label.instance": "인스턴스",
-    "label.instance.limits": "인스턴스 제한",
-    "label.instance.name": "인스턴스명",
-    "label.instance.port": "Instance Port",
-    "label.instance.scaled.up": "Instance scaled to the requested offering",
-    "label.instances": "인스턴스",
-    "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-    "label.intermediate.certificate": "Intermediate certificate {0}",
-    "label.internal.dns.1": "내부 DNS 1",
-    "label.internal.dns.2": "내부 DNS 2",
-    "label.internal.lb": "Internal LB",
-    "label.internal.lb.details": "Internal LB details",
-    "label.internal.name": "내부명",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "간격 종류",
-    "label.introduction.to.cloudstack": "CloudStack™ 소개",
-    "label.invalid.integer": "유효하지 않은 정수값",
-    "label.invalid.number": "유효하지 않은 숫자값",
-    "label.invitations": "초대장",
-    "label.invite": "초대",
-    "label.invite.to": "초대 프로젝트:",
-    "label.invited.accounts": "초대가 끝난 계정 정보",
-    "label.ip": "IP",
-    "label.ip.address": "IP 주소",
-    "label.ip.allocations": "IP 주소 할당",
-    "label.ip.limits": "공개 IP 주소 제한",
-    "label.ip.or.fqdn": "IP 주소 또는 FQDN",
-    "label.ip.range": "IP 주소 범위",
-    "label.ip.ranges": "IP 주소 범위",
-    "label.ipaddress": "IP 주소",
-    "label.ips": "IP",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 End IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 Netmask",
-    "label.ipv4.start.ip": "IPv4 Start IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Address",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 End IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Start IP",
-    "label.is.default": "기본",
-    "label.is.redundant.router": "중복",
-    "label.is.shared": "공유",
-    "label.is.system": "시스템",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO 시작",
-    "label.isolated.networks": "분리 네트워크",
-    "label.isolation.method": "분리 방법",
-    "label.isolation.mode": "분리 모드",
-    "label.isolation.uri": "Isolation URI",
-    "label.item.listing": "항목 목록",
-    "label.japanese.keyboard": "Japanese keyboard",
-    "label.keep": "유지",
-    "label.keep.colon": "Keep:",
-    "label.key": "키",
-    "label.keyboard.language": "Keyboard language",
-    "label.keyboard.type": "키보드 종류",
-    "label.kvm.traffic.label": "KVM 트래픽 라벨",
-    "label.label": "라벨",
-    "label.lang.arabic": "Arabic",
-    "label.lang.brportugese": "Brazilian Portugese",
-    "label.lang.catalan": "Catalan",
-    "label.lang.chinese": "중국어(간체)",
-    "label.lang.dutch": "Dutch (Netherlands)",
-    "label.lang.english": "영어",
-    "label.lang.french": "French",
-    "label.lang.german": "German",
-    "label.lang.hungarian": "Hungarian",
-    "label.lang.italian": "Italian",
-    "label.lang.japanese": "일본어",
-    "label.lang.korean": "한국어",
-    "label.lang.norwegian": "Norwegian",
-    "label.lang.polish": "Polish",
-    "label.lang.russian": "Russian",
-    "label.lang.spanish": "스페인어",
-    "label.last.disconnected": "마지막 종료 시점",
-    "label.last.name": "성",
-    "label.lastname.lower": "lastname",
-    "label.latest.events": "최신 이벤트",
-    "label.launch": "시작",
-    "label.launch.vm": "VM 시작",
-    "label.launch.zone": "Zone 시작",
-    "label.lb.algorithm.leastconn": "최소 접속",
-    "label.lb.algorithm.roundrobin": "라운드 로빈",
-    "label.lb.algorithm.source": "시작 위치",
-    "label.ldap.configuration": "LDAP Configuration",
-    "label.ldap.group.name": "LDAP Group",
-    "label.ldap.link.type": "종류",
-    "label.ldap.port": "LDAP port",
-    "label.level": "레벨",
-    "label.link.domain.to.ldap": "Link Domain to LDAP",
-    "label.linklocal.ip": "Link Local IP Address",
-    "label.load.balancer": "네트워크 로드 공유 장치",
-    "label.load.balancer.type": "Load Balancer Type",
-    "label.load.balancing": "네트워크 로드 공유",
-    "label.load.balancing.policies": "네트워크 로드 공유 정책",
-    "label.loading": "로드 하는 중",
-    "label.local": "로컬",
-    "label.local.file": "Local file",
-    "label.local.storage": "로컬 스토리지",
-    "label.local.storage.enabled": "Enable local storage for User VMs",
-    "label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
-    "label.login": "로그인",
-    "label.logout": "로그아웃",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Traffic Label",
-    "label.make.project.owner": "계정 정보 프로젝트 소유자",
-    "label.make.redundant": "Make redundant",
-    "label.manage": "관리",
-    "label.manage.resources": "자원 관리",
-    "label.managed": "Managed",
-    "label.management": "관리",
-    "label.management.ips": "관리 IP 주소",
-    "label.management.server": "Management Server",
-    "label.max.cpus": "Max. CPU cores",
-    "label.max.guest.limit": "최대 게스트 제한",
-    "label.max.instances": "Max Instances",
-    "label.max.memory": "Max. memory (MiB)",
-    "label.max.networks": "최대 네트워크수",
-    "label.max.primary.storage": "Max. primary (GiB)",
-    "label.max.public.ips": "최대 공개 IP 주소수",
-    "label.max.secondary.storage": "Max. secondary (GiB)",
-    "label.max.snapshots": "최대 스냅샷수",
-    "label.max.templates": "최대 템플릿수",
-    "label.max.vms": "최대 사용자 VM수",
-    "label.max.volumes": "최대 볼륨수",
-    "label.max.vpcs": "Max. VPCs",
-    "label.maximum": "최대",
-    "label.may.continue": "실행 할 수 있음",
-    "label.md5.checksum": "MD5 체크섬",
-    "label.memory": "메모리",
-    "label.memory.allocated": "할당완료 메모리",
-    "label.memory.limits": "Memory limits (MiB)",
-    "label.memory.mb": "메모리 (MB)",
-    "label.memory.total": "메모리 합계",
-    "label.memory.used": "메모리 사용량",
-    "label.menu.accounts": "계정 정보",
-    "label.menu.alerts": "알림 체계",
-    "label.menu.all.accounts": "모든 계정 정보",
-    "label.menu.all.instances": "모든 인스턴스",
-    "label.menu.community.isos": "커뮤니티 ISO",
-    "label.menu.community.templates": "커뮤니티 템플릿",
-    "label.menu.configuration": "구성",
-    "label.menu.dashboard": "대시 보드",
-    "label.menu.destroyed.instances": "파기된 인스턴스",
-    "label.menu.disk.offerings": "디스크제공",
-    "label.menu.domains": "도메인",
-    "label.menu.events": "이벤트",
-    "label.menu.featured.isos": "추천 ISO",
-    "label.menu.featured.templates": "추천 템플릿",
-    "label.menu.global.settings": "글로벌 설정",
-    "label.menu.infrastructure": "인프라스트럭쳐",
-    "label.menu.instances": "인스턴스",
-    "label.menu.ipaddresses": "IP 주소",
-    "label.menu.isos": "ISO",
-    "label.menu.my.accounts": "나의 계정 정보",
-    "label.menu.my.instances": "나의 인스턴스",
-    "label.menu.my.isos": "나의 ISO",
-    "label.menu.my.templates": "나의 템플릿",
-    "label.menu.network": "네트워크",
-    "label.menu.network.offerings": "네트워크 제공",
-    "label.menu.physical.resources": "물리 자원",
-    "label.menu.regions": "Regions",
-    "label.menu.running.instances": "실행 중 인스턴스",
-    "label.menu.security.groups": "보안 그룹",
-    "label.menu.service.offerings": "서비스제공",
-    "label.menu.snapshots": "스냅샷",
-    "label.menu.sshkeypair": "SSH KeyPair",
-    "label.menu.stopped.instances": "정지된 인스턴스",
-    "label.menu.storage": "스토리지",
-    "label.menu.system": "시스템",
-    "label.menu.system.service.offerings": "시스템 제공",
-    "label.menu.system.vms": "시스템 VM",
-    "label.menu.templates": "템플릿",
-    "label.menu.virtual.appliances": "가상 아프라이안스",
-    "label.menu.virtual.resources": "가상 자원",
-    "label.menu.volumes": "볼륨",
-    "label.menu.vpc.offerings": "VPC Offerings",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "할당 완료 상태",
-    "label.metrics.clusters": "클러스터",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "사용 중",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "할당 완료 상태",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "크기",
-    "label.metrics.disk.storagetype": "종류",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "사용 중",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "호스트",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "사용 중",
-    "label.metrics.name": "이름",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "범위",
-    "label.metrics.state": "상태",
-    "label.metrics.storagepool": "Storage Pool",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "인스턴스 이전 위치:",
-    "label.migrate.instance.to.host": "다른 호스트에게 인스턴스 이전",
-    "label.migrate.instance.to.ps": "다른 기본 스토리지에 인스턴스 이전",
-    "label.migrate.lb.vm": "Migrate LB VM",
-    "label.migrate.router.to": "라우터 이전 위치:",
-    "label.migrate.systemvm.to": "시스템 VM 이전 위치:",
-    "label.migrate.to.host": "Migrate to host",
-    "label.migrate.to.storage": "Migrate to storage",
-    "label.migrate.volume": "Migrate Volume",
-    "label.migrate.volume.to.primary.storage": "다른 기본 스토리지에 볼륨 이전",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instances",
-    "label.min.past.the.hr": "min past the hr",
-    "label.minimum": "최소",
-    "label.minute.past.hour": "minute(s) past the hour",
-    "label.minutes.past.hour": "minutes(s) past the hour",
-    "label.mode": "모드",
-    "label.monday": "월요일",
-    "label.monthly": "매월",
-    "label.more.templates": "다른 템플릿",
-    "label.move.down.row": "아래로 이동",
-    "label.move.to.bottom": "마지막으로 이동",
-    "label.move.to.top": "처음으로 이동",
-    "label.move.up.row": "위로 이동",
-    "label.my.account": "나의 계정 정보",
-    "label.my.network": "내 네트워크",
-    "label.my.templates": "나의 템플릿",
-    "label.na": "N/A",
-    "label.name": "이름",
-    "label.name.lower": "이름",
-    "label.name.optional": "이름(옵션)",
-    "label.nat.port.range": "NAT 포토 범위",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "넷 마스크",
-    "label.netscaler.details": "NetScaler details",
-    "label.network": "네트워크",
-    "label.network.ACL": "네트워크 권한 관리(ACL)",
-    "label.network.ACL.total": "네트워크 권한 관리(ACL) 합계",
-    "label.network.ACLs": "네트워크 권한 관리(ACL)",
-    "label.network.addVM": "Add network to VM",
-    "label.network.cidr": "Network CIDR",
-    "label.network.desc": "네트워크 설명",
-    "label.network.details": "Network Details",
-    "label.network.device": "네트워크 기기",
-    "label.network.device.type": "네트워크 기기 종류",
-    "label.network.domain": "네트워크 도메인",
-    "label.network.domain.text": "네트워크 도메인",
-    "label.network.id": "네트워크 ID",
-    "label.network.label.display.for.blank.value": "기본 게이트웨이를 사용",
-    "label.network.limits": "Network limits",
-    "label.network.name": "네트워크명",
-    "label.network.offering": "네트워크 제공",
-    "label.network.offering.details": "Network offering details",
-    "label.network.offering.display.text": "네트워크 제공 표시 텍스트",
-    "label.network.offering.id": "네트워크 제공 ID",
-    "label.network.offering.name": "네트워크 제공명",
-    "label.network.rate": "네트워크 속도",
-    "label.network.rate.megabytes": "네트워크 속도 (MB/초)",
-    "label.network.read": "네트워크 읽기",
-    "label.network.service.providers": "네트워크 서비스 제공자",
-    "label.network.type": "네트워크 종류",
-    "label.network.write": "네트워크 기입",
-    "label.networking.and.security": "네트워크와 보안",
-    "label.networks": "네트워크",
-    "label.new": "신규",
-    "label.new.password": "새로운 암호",
-    "label.current.password": "Current Password",
-    "label.new.project": "새 프로젝트",
-    "label.new.ssh.key.pair": "New SSH Key Pair",
-    "label.new.vm": "새 VM",
-    "label.next": "다음",
-    "label.nexusVswitch": "Nexus 1000V",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS 서버",
-    "label.nfs.storage": "NFS 스토리지",
-    "label.nic.adapter.type": "NIC 아답터 종류",
-    "label.nicira.controller.address": "Controller Address",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP details",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "NIC",
-    "label.no": "아니오",
-    "label.no.actions": "실행할 수 있는 작업 없음",
-    "label.no.alerts": "최근 알림 체계 없음",
-    "label.no.data": "표시할 데이터가 없음",
-    "label.no.errors": "최근 오류는 없음",
-    "label.no.grouping": "(no grouping)",
-    "label.no.isos": "사용할 수 있는 ISO 없음",
-    "label.no.items": "사용할 수 있는 항목 없음",
-    "label.no.security.groups": "사용할 수 있는 보안 그룹 없음",
-    "label.no.thanks": "설정 안함",
-    "label.none": "없음",
-    "label.not.found": "검색 결과 없음",
-    "label.notifications": "알림",
-    "label.num.cpu.cores": "CPU 코어수",
-    "label.number.of.clusters": "클러스터수",
-    "label.number.of.cpu.sockets": "The Number of CPU Sockets",
-    "label.number.of.hosts": "호스트수",
-    "label.number.of.pods": "Pod수",
-    "label.number.of.system.vms": "시스템 VM 수",
-    "label.number.of.virtual.routers": "가상 라우터수",
-    "label.number.of.zones": "Zone수",
-    "label.numretries": "재시행 회수",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "of month",
-    "label.offer.ha": "고가용성 제공",
-    "label.ok": "확인",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controllers",
-    "label.operator": "Operator",
-    "label.optional": "옵션",
-    "label.order": "순서",
-    "label.os.preference": "OS 기본 설정",
-    "label.os.type": "OS 종류",
-    "label.other": "Other",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Action",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "암호",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "사용자명",
-    "label.override.guest.traffic": "Override Guest-Traffic",
-    "label.override.public.traffic": "Override Public-Traffic",
-    "label.ovm.traffic.label": "OVM traffic label",
-    "label.ovm3.cluster": "Native Clustering",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "소유 공개 IP 주소",
-    "label.owner.account": "소유자 계정 정보",
-    "label.owner.domain": "소유자 도메인",
-    "label.palo.alto.details": "Palo Alto details",
-    "label.parent.domain": "부모 도메인",
-    "label.passive": "Passive",
-    "label.password": "암호",
-    "label.password.enabled": "암호 관리 사용",
-    "label.password.lower": "password",
-    "label.password.reset.confirm": "Password has been reset to ",
-    "label.path": "경로",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Persistent ",
-    "label.physical.network": "물리 네트워크",
-    "label.physical.network.ID": "물리 네트워크 ID",
-    "label.physical.network.name": "Physical network name",
-    "label.ping.path": "Ping Path",
-    "label.planner.mode": "Planner mode",
-    "label.please.complete.the.following.fields": "Please complete the following fields",
-    "label.please.specify.netscaler.info": "Netscaler 정보를 지정해 주십시오",
-    "label.please.wait": "기다려 주십시오...",
-    "label.plugin.details": "Plugin details",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dedicated",
-    "label.pod.name": "Pod명",
-    "label.pods": "Pod",
-    "label.polling.interval.sec": "Polling Interval (in sec)",
-    "label.port": "Port",
-    "label.port.forwarding": "포토 전송",
-    "label.port.forwarding.policies": "포토 전송 정책",
-    "label.port.range": "포토 범위",
-    "label.portable.ip": "Portable IP",
-    "label.portable.ip.range.details": "Portable IP Range details",
-    "label.portable.ip.ranges": "Portable IP Ranges",
-    "label.portable.ips": "Portable IPs",
-    "label.powerstate": "Power State",
-    "label.prev": "뒤로",
-    "label.previous": "뒤로",
-    "label.primary.allocated": "할당 완료 기본 스토리지",
-    "label.primary.network": "기본 네트워크",
-    "label.primary.storage": "기본 스토리지",
-    "label.primary.storage.count": "기본 스토리지 그룹",
-    "label.primary.storage.limits": "Primary Storage limits (GiB)",
-    "label.primary.used": "기본 스토리지 사용량",
-    "label.private.Gateway": "사설 게이트웨이",
-    "label.private.interface": "사설 인터페이스",
-    "label.private.ip": "사설 IP 주소",
-    "label.private.ip.range": "사설 IP 주소 범위",
-    "label.private.ips": "사설 IP 주소",
-    "label.private.key": "Private Key",
-    "label.private.network": "사설 네트워크",
-    "label.private.port": "사설 포트",
-    "label.private.zone": "사설 Zone",
-    "label.privatekey": "PKC#8 비밀 키",
-    "label.profile": "Profile",
-    "label.project": "프로젝트",
-    "label.project.dashboard": "프로젝트 대시 보드",
-    "label.project.id": "프로젝트 ID",
-    "label.project.invite": "프로젝트에 초대",
-    "label.project.name": "프로젝트명",
-    "label.project.view": "프로젝트 보기",
-    "label.projects": "프로젝트",
-    "label.protocol": "프로토콜",
-    "label.protocol.number": "Protocol Number",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Provider",
-    "label.providers": "제공자",
-    "label.public": "공개",
-    "label.public.interface": "공개 인터페이스",
-    "label.public.ip": "공개 IP 주소",
-    "label.public.ips": "공개 IP 주소",
-    "label.public.key": "Public Key",
-    "label.public.lb": "Public LB",
-    "label.public.load.balancer.provider": "Public Load Balancer Provider",
-    "label.public.network": "공개 네트워크",
-    "label.public.port": "공개 포트",
-    "label.public.traffic": "공개 트래픽",
-    "label.public.traffic.vswitch.name": "Public Traffic vSwitch Name",
-    "label.public.traffic.vswitch.type": "Public Traffic vSwitch Type",
-    "label.public.zone": "공개 Zone",
-    "label.purpose": "목적",
-    "label.qos.type": "QoS Type",
-    "label.quickview": "Quickview",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Time (in sec)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "날짜",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "모든 계정 정보",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "상태",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx user",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "재시작",
-    "label.recent.errors": "최근 오류",
-    "label.recover.vm": "VM 복구",
-    "label.redundant.router": "중복 라우터",
-    "label.redundant.router.capability": "중복 라우터 기능",
-    "label.redundant.state": "중복 상태",
-    "label.redundant.vpc": "Redundant VPC",
-    "label.refresh": "업데이트",
-    "label.refresh.blades": "Refresh Blades",
-    "label.region": "Region",
-    "label.region.details": "Region details",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "VM 재설치",
-    "label.related": "관련",
-    "label.release.account": "Release from Account",
-    "label.release.account.lowercase": "Release from account",
-    "label.release.dedicated.cluster": "Release Dedicated Cluster",
-    "label.release.dedicated.host": "Release Dedicated Host",
-    "label.release.dedicated.pod": "Release Dedicated Pod",
-    "label.release.dedicated.vlan.range": "Release dedicated VLAN range",
-    "label.release.dedicated.zone": "Release Dedicated Zone",
-    "label.remind.later": "알림 표시",
-    "label.remove.ACL": "권한 관리(ACL) 삭제",
-    "label.remove.egress.rule": "전송 규칙 삭제",
-    "label.remove.from.load.balancer": "네트워크 로드 공유 장치에서 인스턴스를 삭제하는 중",
-    "label.remove.ingress.rule": "수신 규칙 삭제",
-    "label.remove.ip.range": "IP 주소 범위 삭제",
-    "label.remove.ldap": "Remove LDAP",
-    "label.remove.network.offering": "Remove network offering",
-    "label.remove.pf": "포토 전송 규칙 삭제",
-    "label.remove.project.account": "프로젝트 계정 정보 삭제",
-    "label.remove.region": "Remove Region",
-    "label.remove.rule": "규칙 삭제",
-    "label.remove.ssh.key.pair": "Remove SSH Key Pair",
-    "label.remove.static.nat.rule": "정적 NAT 규칙 삭제",
-    "label.remove.static.route": "정적 라우트 삭제",
-    "label.remove.this.physical.network": "Remove this physical network",
-    "label.remove.tier": "계층 삭제",
-    "label.remove.vm.from.lb": "네트워크 로드 공유 규칙에 VM 삭제",
-    "label.remove.vm.load.balancer": "Remove VM from load balancer",
-    "label.remove.vmware.datacenter": "Remove VMware datacenter",
-    "label.remove.vpc": "VPC 삭제",
-    "label.remove.vpc.offering": "Remove VPC offering",
-    "label.removing": "삭제하는 중",
-    "label.removing.user": "사용자를 삭제하는 중",
-    "label.reource.id": "Resource ID",
-    "label.replace.acl": "Replace ACL",
-    "label.replace.acl.list": "Replace ACL List",
-    "label.required": "필수 사항",
-    "label.requires.upgrade": "Requires Upgrade",
-    "label.reserved.ip.range": "Reserved IP Range",
-    "label.reserved.system.gateway": "예약된 시스템 게이트웨이",
-    "label.reserved.system.ip": "예약된 시스템 IP 주소",
-    "label.reserved.system.netmask": "예약된 시스템 넷 마스크",
-    "label.reset.VPN.connection": "VPN 접속 재설정",
-    "label.reset.ssh.key.pair": "Reset SSH Key Pair",
-    "label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
-    "label.resetVM": "Reset VM",
-    "label.resize.new.offering.id": "새로 제공",
-    "label.resize.new.size": "New Size (GB)",
-    "label.resize.shrink.ok": "변경 완료",
-    "label.resource": "자원",
-    "label.resource.limit.exceeded": "Resource Limit Exceeded",
-    "label.resource.limits": "자원 제한",
-    "label.resource.name": "Resource Name",
-    "label.resource.state": "자원 상태",
-    "label.resources": "자원",
-    "label.response.timeout.in.sec": "Response Timeout (in sec)",
-    "label.restart.network": "네트워크 재시작",
-    "label.restart.required": "재시작 필요",
-    "label.restart.vpc": "VPC 재시작",
-    "label.restore": "Restore",
-    "label.retry.interval": "Retry Interval",
-    "label.review": "확인",
-    "label.revoke.project.invite": "초대 취소",
-    "label.role": "역할",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Root certificate",
-    "label.root.disk.controller": "루트 디스크 콘트롤러",
-    "label.root.disk.offering": "루트 디스크제공",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Scaled Up",
-    "label.routing": "라우팅",
-    "label.routing.host": "Routing Host",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Rule Number",
-    "label.rules": "규칙",
-    "label.running.vms": "실행중 VM",
-    "label.s3.access_key": "Access Key",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Connection Timeout",
-    "label.s3.endpoint": "Endpoint",
-    "label.s3.max_error_retry": "Max Error Retry",
-    "label.s3.nfs.path": "S3 NFS",
-    "label.s3.nfs.server": "S3 NFS",
-    "label.s3.secret_key": "비밀 키",
-    "label.s3.socket_timeout": "Socket Timeout",
-    "label.s3.use_https": "Use HTTPS",
-    "label.saml.enable": "Authorize SAML SSO",
-    "label.saml.entity": "Identity Provider",
-    "label.saturday": "토요일",
-    "label.save": "저장",
-    "label.save.and.continue": "저장하기",
-    "label.save.changes": "Save changes",
-    "label.saving.processing": "저장하는 중...",
-    "label.scale.up.policy": "SCALE UP POLICY",
-    "label.scaledown.policy": "ScaleDown Policy",
-    "label.scaleup.policy": "ScaleUp Policy",
-    "label.scope": "범위",
-    "label.search": "검색",
-    "label.secondary.ips": "Secondary IPs",
-    "label.secondary.isolated.vlan.id": "Secondary Isolated VLAN ID",
-    "label.secondary.staging.store": "Secondary Staging Store",
-    "label.secondary.staging.store.details": "Secondary Staging Store details",
-    "label.secondary.storage": "2차 스토리지",
-    "label.secondary.storage.count": "2차 스토리지 그룹",
-    "label.secondary.storage.details": "Secondary storage details",
-    "label.secondary.storage.limits": "Secondary Storage limits (GiB)",
-    "label.secondary.storage.vm": "2차 스토리지 VM",
-    "label.secondary.used": "2차 스토리지 사용량",
-    "label.secret.key": "비밀 키",
-    "label.security.group": "보안 그룹",
-    "label.security.group.name": "보안 그룹명",
-    "label.security.groups": "보안 그룹",
-    "label.security.groups.enabled": "보안 그룹 유효",
-    "label.select": "선택",
-    "label.select-view": "표시 방법 선택",
-    "label.select.a.template": "템플릿 선택",
-    "label.select.a.zone": "Zone 선택",
-    "label.select.instance": "인스턴스 선택",
-    "label.select.instance.to.attach.volume.to": "볼륨을 연결하는 인스턴스를 선택해 주십시오",
-    "label.select.iso.or.template": "ISO 또는 템플릿 선택",
-    "label.select.offering": "제공 선택",
-    "label.select.project": "프로젝트 선택",
-    "label.select.region": "Select region",
-    "label.select.template": "Select Template",
-    "label.select.tier": "계층 선택",
-    "label.select.vm.for.static.nat": "정적 NAT용 VM 선택",
-    "label.sent": "전송된 상태",
-    "label.server": "서버",
-    "label.service.capabilities": "서비스 기능",
-    "label.service.offering": "서비스제공",
-    "label.service.offering.details": "Service offering details",
-    "label.service.state": "서비스",
-    "label.services": "Services",
-    "label.session.expired": "세션 유효기간이 끊어짐",
-    "label.set.default.NIC": "Set default NIC",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Zone 종류 설정",
-    "label.settings": "Settings",
-    "label.setup": "설정",
-    "label.setup.network": "Set up Network",
-    "label.setup.zone": "Set up Zone",
-    "label.shared": "공유",
-    "label.show.advanced.settings": "Show advanced settings",
-    "label.show.ingress.rule": "수신 규칙 표시",
-    "label.shutdown.provider": "제공자 종료",
-    "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
-    "label.site.to.site.VPN": "사이트간 사설네트워크(VPN)",
-    "label.size": "크기",
-    "label.skip.guide": "CloudStack 사용 가이드 건너뛰기",
-    "label.smb.domain": "SMB Domain",
-    "label.smb.password": "SMB Password",
-    "label.smb.username": "SMB Username",
-    "label.snapshot": "스냅샷",
-    "label.snapshot.limits": "스냅샷 제한",
-    "label.snapshot.name": "스냅샷 이름",
-    "label.snapshot.s": "스냅샷",
-    "label.snapshot.schedule": "Set up Recurring Snapshot",
-    "label.snapshots": "스냅샷",
-    "label.sockets": "CPU Sockets",
-    "label.source.ip.address": "Source IP Address",
-    "label.source.nat": "전송원 NAT",
-    "label.source.nat.supported": "SourceNAT Supported",
-    "label.source.port": "Source Port",
-    "label.specify.IP.ranges": "IP 주소 범위 지정",
-    "label.specify.vlan": "VLAN 지정",
-    "label.specify.vxlan": "VXLAN 지정",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX details",
-    "label.ssh.key.pair": "SSH Key Pair",
-    "label.ssh.key.pair.details": "SSH Key Pair Details",
-    "label.ssh.key.pairs": "SSH Key Pairs",
-    "label.standard.us.keyboard": "Standard (US) keyboard",
-    "label.start.IP": "시작 IP 주소",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "시작 포토",
-    "label.start.reserved.system.IP": "예약된 시작 시스템 IP 주소",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "Start VXLAN",
-    "label.state": "상태",
-    "label.static.nat": "정적 NAT",
-    "label.static.nat.enabled": "정적 NAT 유효",
-    "label.static.nat.to": "정적 NAT 설정 위치:",
-    "label.static.nat.vm.details": "정적 NAT VM 상세 정보",
-    "label.static.routes": "Static Routes",
-    "label.statistics": "통계",
-    "label.status": "상태",
-    "label.step.1": "단계 1",
-    "label.step.1.title": "단계 1. <strong>템플릿 선택</strong>",
-    "label.step.2": "단계 2",
-    "label.step.2.title": "단계 2. <strong>서비스 제공</strong>",
-    "label.step.3": "단계 3",
-    "label.step.3.title": "단계 3. <strong id=\"step3_label\">디스크 제공 선택</strong>",
-    "label.step.4": "단계 4",
-    "label.step.4.title": "단계 4. <strong>네트워크</strong>",
-    "label.step.5": "단계 5",
-    "label.step.5.title": "단계 5. <strong>최종 확인</strong>",
-    "label.stickiness": "지속성",
-    "label.stickiness.method": "Stickiness method",
-    "label.sticky.cookie-name": "Cookie 명",
-    "label.sticky.domain": "도메인",
-    "label.sticky.expire": "만료시간",
-    "label.sticky.holdtime": "보관 유지 시간",
-    "label.sticky.indirect": "간접",
-    "label.sticky.length": "길이",
-    "label.sticky.mode": "모드",
-    "label.sticky.name": "Sticky Name",
-    "label.sticky.nocache": "캐시 없음",
-    "label.sticky.postonly": "포스트만",
-    "label.sticky.prefix": "프레픽스",
-    "label.sticky.request-learn": "러닝 요구",
-    "label.sticky.tablesize": "테이블 크기",
-    "label.stop": "정지",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "정지 중 VM",
-    "label.storage": "스토리지",
-    "label.storage.pool": "Storage Pool",
-    "label.storage.tags": "스토리지 태그",
-    "label.storage.traffic": "스토리지 트래픽",
-    "label.storage.type": "스토리지 종류",
-    "label.subdomain.access": "서브 도메인 접근",
-    "label.submit": "보내기",
-    "label.submitted.by": "[사용자: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "완료",
-    "label.sunday": "일요일",
-    "label.super.cidr.for.guest.networks": "손님 네트워크 슈퍼 CIDR",
-    "label.supported.services": "기술 지원되는 서비스",
-    "label.supported.source.NAT.type": "기술 지원되는 전송 NAT 종류",
-    "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "프로젝트 일시정지",
-    "label.switch.type": "형식",
-    "label.system.capacity": "시스템 처리 능력",
-    "label.system.offering": "시스템 제공",
-    "label.system.offering.for.router": "System Offering for Router",
-    "label.system.service.offering": "시스템 서비스 제공",
-    "label.system.service.offering.details": "System service offering details",
-    "label.system.vm": "시스템 VM",
-    "label.system.vm.details": "System VM details",
-    "label.system.vm.scaled.up": "System VM Scaled Up",
-    "label.system.vm.type": "시스템 VM 종류",
-    "label.system.vms": "시스템 VM",
-    "label.system.wide.capacity": "시스템 전체 처리 능력",
-    "label.tag.key": "Tag Key",
-    "label.tag.value": "Tag Value",
-    "label.tagged": "태그",
-    "label.tags": "태그",
-    "label.target.iqn": "타겟 IQN",
-    "label.task.completed": "작업 완료",
-    "label.template": "템플릿",
-    "label.template.limits": "템플릿 제한",
-    "label.tftp.root.directory": "Tftp root directory",
-    "label.theme.default": "기본 테마",
-    "label.theme.grey": "맞춤- 회색조",
-    "label.theme.lightblue": "맞춤 - 라이트 블루",
-    "label.threshold": "Threshold",
-    "label.thursday": "목요일",
-    "label.tier": "계층",
-    "label.tier.details": "계층 상세 장버",
-    "label.time": "시각",
-    "label.time.colon": "Time:",
-    "label.time.zone": "시간대",
-    "label.timeout": "시간 초과",
-    "label.timeout.in.second ": " Timeout (seconds)",
-    "label.timezone": "시간대",
-    "label.timezone.colon": "Timezone:",
-    "label.token": "토큰",
-    "label.total.CPU": "CPU 합계",
-    "label.total.cpu": "CPU 합계",
-    "label.total.hosts": "호스트 합계",
-    "label.total.memory": "메모리 합계",
-    "label.total.of.ip": "Total of IP Addresses",
-    "label.total.of.vm": "VM 합계",
-    "label.total.storage": "스토리지 합계",
-    "label.total.virtual.routers": "Total of Virtual Routers",
-    "label.total.virtual.routers.upgrade": "Total of Virtual Routers that require upgrade",
-    "label.total.vms": "VM 합계",
-    "label.traffic.label": "트래픽 라벨",
-    "label.traffic.type": "트래픽 종류",
-    "label.traffic.types": "트래픽 종류",
-    "label.tuesday": "화요일",
-    "label.type": "종류",
-    "label.type.id": "종류 ID",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK keyboard",
-    "label.unavailable": "사용 불가",
-    "label.unhealthy.threshold": "Unhealthy Threshold",
-    "label.unlimited": "무제한",
-    "label.untagged": "태그 없음",
-    "label.update.project.resources": "프로젝트 자원 업데이트",
-    "label.update.ssl": " SSL 인증서 업데이트",
-    "label.update.ssl.cert": " SSL 인증서 업데이트",
-    "label.updating": "업데이트하고 있는 중",
-    "label.upgrade.required": "Upgrade is required",
-    "label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
-    "label.upload": "업로드",
-    "label.upload.from.local": "Upload from Local",
-    "label.upload.template.from.local": "Upload Template from Local",
-    "label.upload.volume": "볼륨의 업로드",
-    "label.upload.volume.from.local": "Upload Volume from Local",
-    "label.upload.volume.from.url": "Upload volume from URL",
-    "label.url": "URL",
-    "label.usage.interface": "사용 상황 측정 인터페이스",
-    "label.usage.sanity.result": "Usage Sanity Result",
-    "label.usage.server": "Usage Server",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "Use VM IP:",
-    "label.use.vm.ips": "Use VM IPs",
-    "label.used": "사용 중",
-    "label.user": "사용자",
-    "label.user.data": "User Data",
-    "label.user.details": "User details",
-    "label.user.vm": "User VM",
-    "label.username": "사용자명",
-    "label.username.lower": "username",
-    "label.users": "사용자",
-    "label.vSwitch.type": "vSwitch Type",
-    "label.value": "값",
-    "label.vcdcname": "vCenter DC 명",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter 클러스터",
-    "label.vcenter.datacenter": "vCenter 데이터 센터",
-    "label.vcenter.datastore": "vCenter 데이터 스토어",
-    "label.vcenter.host": "vCenter 호스트",
-    "label.vcenter.password": "vCenter 암호",
-    "label.vcenter.username": "vCenter 사용자명",
-    "label.vcipaddress": "vCenter IP 주소",
-    "label.version": "버전",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Max resolution",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Remaining capacity",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "표시 -",
-    "label.view.all": "모두 표시",
-    "label.view.console": "콘솔 표시",
-    "label.view.more": "상세 표시",
-    "label.view.secondary.ips": "View secondary IPs",
-    "label.viewing": "표시 항목:",
-    "label.virtual.appliance": "가상 어플라이언스",
-    "label.virtual.appliance.details": "Virtual applicance details",
-    "label.virtual.appliances": "가상 어플라이언스",
-    "label.virtual.machine": "Virtual Machine",
-    "label.virtual.machines": "Virtual Machines",
-    "label.virtual.network": "가상 네트워크",
-    "label.virtual.networking": "Virtual Networking",
-    "label.virtual.router": "가상 라우터",
-    "label.virtual.routers": "가상 라우터",
-    "label.virtual.routers.group.account": "Virtual Routers group by account",
-    "label.virtual.routers.group.cluster": "Virtual Routers group by cluster",
-    "label.virtual.routers.group.pod": "Virtual Routers group by pod",
-    "label.virtual.routers.group.zone": "Virtual Routers group by zone",
-    "label.vlan": "가상 네트워크(VLAN)",
-    "label.vlan.id": "VLAN ID",
-    "label.vlan.only": "가상 네트워크(VLAN)",
-    "label.vlan.range": "VLAN 범위",
-    "label.vlan.range.details": "VLAN Range details",
-    "label.vlan.ranges": "VLAN Range(s)",
-    "label.vlan.vni.range": "VLAN 범위",
-    "label.vlan.vni.ranges": "VLAN/VNI Range(s)",
-    "label.vm.add": "인스턴스 추가",
-    "label.vm.destroy": "파기",
-    "label.vm.display.name": "VM 표시명",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP Address",
-    "label.vm.name": "VM 명",
-    "label.vm.password": "Password of the VM is",
-    "label.vm.reboot": "재시작",
-    "label.vm.start": "시작",
-    "label.vm.state": "VM 상태",
-    "label.vm.stop": "정지",
-    "label.vmfs": "VMFS",
-    "label.vms": "VM",
-    "label.vmsnapshot": "VM Snapshots",
-    "label.vmsnapshot.current": "isCurrent",
-    "label.vmsnapshot.memory": "Snapshot memory",
-    "label.vmsnapshot.parentname": "Parent",
-    "label.vmsnapshot.type": "종류",
-    "label.vmware.datacenter.id": "VMware datacenter ID",
-    "label.vmware.datacenter.name": "VMware datacenter Name",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "VMware 트래픽 라벨",
-    "label.vnet": "가상 네트워크(VLAN)",
-    "label.vnet.id": "VLAN ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC Devices",
-    "label.volatile": "Volatile",
-    "label.volgroup": "볼륨 그룹",
-    "label.volume": "볼륨",
-    "label.volume.details": "Volume details",
-    "label.volume.limits": "볼륨 제한",
-    "label.volume.migrated": "Volume migrated",
-    "label.volume.name": "볼륨명",
-    "label.volumes": "볼륨",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Distributed VPC Router",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC Offering",
-    "label.vpc.offering.details": "VPC offering details",
-    "label.vpc.router.details": "VPC Router Details",
-    "label.vpc.supportsregionlevelvpc": "Supports Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtual Router",
-    "label.vpn": "가상 사설망(VPN)",
-    "label.vpn.customer.gateway": "VPN 고객 게이트웨이",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "제어 VLAN ID",
-    "label.vsmpktvlanid": "패킷 VLAN ID",
-    "label.vsmstoragevlanid": "스토리지 VLAN ID",
-    "label.vsphere.managed": "vSphere 관리",
-    "label.vswitch.name": "vSwitch Name",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN 범위",
-    "label.waiting": "대기하는 중",
-    "label.warn": "경고",
-    "label.warn.upper": "WARN",
-    "label.warning": "Warning",
-    "label.wednesday": "수요일",
-    "label.weekly": "매주",
-    "label.welcome": "어서 오십시오",
-    "label.welcome.cloud.console": "관리 콘솔에 오신것을 환영합니다!",
-    "label.what.is.cloudstack": "CloudStack™ 정보",
-    "label.xenserver.tools.version.61.plus": "Original XS Version is 6.1+",
-    "label.xenserver.traffic.label": "XenServer 트래픽 라벨",
-    "label.yes": "예",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone Dedicated",
-    "label.zone.details": "Zone 상세",
-    "label.zone.id": "Zone ID",
-    "label.zone.lower": "Zone",
-    "label.zone.name": "Zone Name",
-    "label.zone.step.1.title": "단계 1. <strong>네트워크 선택</strong>",
-    "label.zone.step.2.title": "단계 2. <strong>Zone 추가</strong>",
-    "label.zone.step.3.title": "단계 3. <strong>Pod 추가</strong>",
-    "label.zone.step.4.title": "단계 4. <strong>IP 주소 범위 추가</strong>",
-    "label.zone.type": "Zone 종류",
-    "label.zone.wide": "Zone 전체",
-    "label.zoneWizard.trafficType.guest": "Guest: Traffic between end-user virtual machines",
-    "label.zoneWizard.trafficType.management": "Management: Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs",
-    "label.zoneWizard.trafficType.public": "Public: Traffic between the internet and virtual machines in the cloud.",
-    "label.zoneWizard.trafficType.storage": "Storage: Traffic between primary and secondary storage servers, such as VM templates and snapshots",
-    "label.zones": "Zone",
-    "managed.state": "관리 대상 상태",
-    "message.XSTools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
-    "message.Zone.creation.complete": "Zone을 만들었습니다.",
-    "message.acquire.ip.nic": "Please confirm that you would like to acquire a new secondary IP for this NIC.<br/>NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine.",
-    "message.acquire.new.ip": "현재 네트워크가 새로운 IP 주소를 취득하시겠습니까?",
-    "message.acquire.new.ip.vpc": "Please confirm that you would like to acquire a new IP for this VPC.",
-    "message.acquire.public.ip": "새로운 IP 주소를 취득하는 Zone을 선택해 주십시오.",
-    "message.action.cancel.maintenance": "호스트 유지 보수는 정상적으로 취소되었습니다. 처리에는 몇 분 정도 걸릴 수 있습니다.",
-    "message.action.cancel.maintenance.mode": "현재 유지 보수를 취소하시겠습니까?",
-    "message.action.change.service.warning.for.instance": "현재 서비스 제공을 변경하기 전에 인스턴스를 정지해야 합니다.",
-    "message.action.change.service.warning.for.router": "현재 서비스 제공을 변경하기 전에 라우터를 정지해야 합니다.",
-    "message.action.delete.ISO": "현재 ISO를 삭제하시겠습니까?",
-    "message.action.delete.ISO.for.all.zones": "이 ISO는 모든 Zone에서 사용하고 있습니다. 모든 Zone에서 삭제하시겠습니까?",
-    "message.action.delete.cluster": "현재 클러스터를 삭제하시겠습니까?",
-    "message.action.delete.disk.offering": "현재 디스크제공을 삭제하시겠습니까?",
-    "message.action.delete.domain": "현재 도메인을 삭제하시겠습니까?",
-    "message.action.delete.external.firewall": "현재 외부 방화벽(fire wall)를 삭제하시겠습니까? 경고: 같은 외부 방화벽(fire wall)를 다시 추가할 경우는 기기 사용 상황 데이터를 재설정해야 합니다.",
-    "message.action.delete.external.load.balancer": "현재 외부 네트워크 로드 공유 장치를 삭제하시겠습니까? 경고: 같은 외부 네트워크 로드 공유 장치를 다시 추가할 경우는 기기 사용 상황 데이터를 재설정해야 합니다.",
-    "message.action.delete.ingress.rule": "현재 수신 규칙을 삭제하시겠습니까?",
-    "message.action.delete.network": "현재 네트워크를 삭제하시겠습니까?",
-    "message.action.delete.nexusVswitch": "현재 Nexus 1000V를 삭제하시겠습니까?",
-    "message.action.delete.nic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
-    "message.action.delete.physical.network": "현재 물리 네트워크를 삭제하시겠습니까?",
-    "message.action.delete.pod": "현재 Pod를 삭제하시겠습니까?",
-    "message.action.delete.primary.storage": "현재 기본 스토리지를 삭제하시겠습니까?",
-    "message.action.delete.secondary.storage": "현재 2차 스토리지를 삭제하시겠습니까?",
-    "message.action.delete.security.group": "현재 보안 그룹을 삭제하시겠습니까?",
-    "message.action.delete.service.offering": "현재 서비스제공을 삭제하시겠습니까?",
-    "message.action.delete.snapshot": "현재 스냅샷을 삭제하시겠습니까?",
-    "message.action.delete.system.service.offering": "현재 시스템 서비스 제공을 삭제하시겠습니까?",
-    "message.action.delete.template": "현재 템플릿을 삭제하시겠습니까?",
-    "message.action.delete.template.for.all.zones": "그 템플릿은 모든 Zone에서 사용되어 있습니다. 모든 Zone에서 삭제하시겠습니까?",
-    "message.action.delete.volume": "현재 볼륨을 삭제하시겠습니까?",
-    "message.action.delete.zone": "현재 Zone을 삭제하시겠습니까?",
-    "message.action.destroy.instance": "현재 인스턴스를 파기하시겠습니까?",
-    "message.action.destroy.systemvm": "현재 시스템 VM를 파기하시겠습니까?",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "현재 클러스터를 사용 안 함으로 하시겠습니까?",
-    "message.action.disable.nexusVswitch": "현재 Nexus 1000V를 사용 안 함으로 하시겠습니까?",
-    "message.action.disable.physical.network": "현재 물리 네트워크를 사용 안 함으로 하시겠습니까?",
-    "message.action.disable.pod": "현재 Pod를 사용 안 함으로 하시겠습니까?",
-    "message.action.disable.static.NAT": "정적 NAT를 사용 안 함으로 설정하시겠습니까?",
-    "message.action.disable.zone": "현재 Zone을 사용 안 함으로 하시겠습니까?",
-    "message.action.download.iso": "현재 ISO를 다운로드하시겠습니까?",
-    "message.action.download.template": "현재 템플릿을 다운로드하시겠습니까?",
-    "message.action.downloading.template": "Downloading template.",
-    "message.action.enable.cluster": "현재 클러스터를 사용 하시겠습니까?",
-    "message.action.enable.maintenance": "호스트를 유지 보수할 준비를 할 수 있었습니다. 이 호스트상 VM 수에 따라서 처리에 몇 분 이상 걸릴 가능성이 있습니다.",
-    "message.action.enable.nexusVswitch": "현재 Nexus 1000V를 사용 하시겠습니까?",
-    "message.action.enable.physical.network": "현재 물리 네트워크를 사용하시겠습니까?",
-    "message.action.enable.pod": "현재 Pod를 사용 하시겠습니까?",
-    "message.action.enable.zone": "현재 Zone을 사용 하시겠습니까?",
-    "message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
-    "message.action.force.reconnect": "호스트는 강제적으로 재접속했습니다. 이 처리에는 몇 분 이상 걸릴 가능성이 있습니다",
-    "message.action.host.enable.maintenance.mode": "유지 보수 모드를 사용 하면, 이 호스트로 실행 중인 모든 인스턴스를 다른 사용가능 호스트에게 실시간 이전됩니다.",
-    "message.action.instance.reset.password": "현재 가상 머신 루트 암호를 변경하시겠습니까?",
-    "message.action.manage.cluster": "클러스터를 관리 대상으로 하시겠습니까?",
-    "message.action.primarystorage.enable.maintenance.mode": "경고: 기본 스토리지를 유지 보수 모드로 하면  그 스토리지상 볼륨을 사용하는 모든 VM가 정지합니다. 실행하시겠습니까?",
-    "message.action.reboot.instance": "현재 인스턴스를 재시작하시겠습니까?",
-    "message.action.reboot.router": "현재 가상 라우터로 제공하는 모든 서비스가 중단됩니다. 이 라우터를 재시작하시겠습니까?",
-    "message.action.reboot.systemvm": "현재 시스템 VM을 재시작하시겠습니까?",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "현재 IP 주소를 해제하시겠습니까?",
-    "message.action.remove.host": "현재 호스트를 삭제하시겠습니까?",
-    "message.action.reset.password.off": "인스턴스는 현재 기능을 지원 하지 않습니다.",
-    "message.action.reset.password.warning": "현재 암호를 변경하기 전에 인스턴스를 정지해야 합니다.",
-    "message.action.restore.instance": "현재 인스턴스를 복원하시겠습니까?",
-    "message.action.revert.snapshot": "Please confirm that you want to revert the owning volume to this snapshot.",
-    "message.action.start.instance": "현재 인스턴스를 시작하시겠습니까?",
-    "message.action.start.router": "현재 라우터를 시작하시겠습니까?",
-    "message.action.start.systemvm": "현재 시스템 VM을 시작하시겠습니까?",
-    "message.action.stop.instance": "현재 인스턴스를 정지하시겠습니까?",
-    "message.action.stop.router": "현재 가상 라우터로 제공하는 모든 서비스가 중단됩니다. 이 라우터를 정지하시겠습니까?",
-    "message.action.stop.systemvm": "현재 시스템 VM을 정지하시겠습니까?",
-    "message.action.take.snapshot": "현재 볼륨 스냅샷을 만드시겠습니까?",
-    "message.action.snapshot.fromsnapshot":"이 VM 스냅 샷의 스냅 샷을 만들려는지 확인하십시오.",
-    "message.action.unmanage.cluster": "클러스터를 비관리 대상으로 하시겠습니까?",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Please confirm that you want to delete this VM snapshot.",
-    "message.action.vmsnapshot.revert": "Revert VM snapshot",
-    "message.activate.project": "현재 프로젝트를 활성화 하시겠습니까?",
-    "message.add.VPN.gateway": "VPN 게이트웨이를 추가하시겠습니까?",
-    "message.add.cluster": "Zone <b><span id=\"zone_name\"></span></b> Pod <b><span id=\"pod_name\"></span></b>에 하이퍼 바이저로 관리되는 클러스터를 추가합니다.",
-    "message.add.cluster.zone": "Zone <b><span id=\"zone_name\"></span></b>에 하이퍼 바이저로 관리되는 클러스터를 추가합니다.",
-    "message.add.disk.offering": "새로운 디스크 제공을 추가하기 위해 다음 파라미터를 지정해 주십시오.",
-    "message.add.domain": "현재 도메인에 만들고자 하는 서브 도메인을 지정해 주십시오.",
-    "message.add.firewall": "Zone에 방화벽(fire wall)을 추가합니다.",
-    "message.add.guest.network": "손님 네트워크를 추가하시겠습니까?",
-    "message.add.host": "새로운 호스트를 추가하기 위해 아래 파라미터를 지정해 주십시오.",
-    "message.add.ip.range": "Zone 공개 네트워크에 IP 주소 범위를 추가합니다.",
-    "message.add.ip.range.direct.network": "Zone <b><span id=\"zone_name\"></span></b> 직접 네트워크 <b><span id=\"directnetwork_name\"></span></b>에 IP 주소 범위를 추가합니다",
-    "message.add.ip.range.to.pod": "<p>Pod <b><span id=\"pod_name_label\"></span></b>에 IP 주소 범위를 추가합니다.</p>",
-    "message.add.load.balancer": "Zone에 네트워크 로드 공유 장치를 추가합니다.",
-    "message.add.load.balancer.under.ip": "다음 IP 주소에 대해서 네트워크 로드 공유 규칙을  추가합니다:",
-    "message.add.network": "Zone <b><span id=\"zone_name\"></span></b>에 새로운 네트워크를 추가합니다.",
-    "message.add.new.gateway.to.vpc": "현재 VPC에 새로운 게이트웨이를 추가하기 위한 정보를 지정해 주십시오.",
-    "message.add.pod": "Zone <b><span id=\"add_pod_zone_name\"></span></b>에 새로운 Pod를 추가합니다.",
-    "message.add.pod.during.zone.creation": "각 Zone에는 한 개 이상 Pod가 필요합니다. 지금 여기서 첫번째 Pod를 추가합니다. Pod는 호스트와 기본 스토리지 서버에서 구성합니다만  이는 다음 순서로 추가합니다. 맨 처음 CloudStack 내부 관리 트래픽을 위해서 IP 주소 범위를 예약합니다. IP 주소 범위는 클라우드 내부 각 Zone에서 중복 하지 않게 예약할 필요가 있습니다.",
-    "message.add.primary": "새로운 기본 스토리지를 추가하기 위해 아래 파라미터를 지정해 주십시오.",
-    "message.add.primary.storage": "Zone <b><span id=\"zone_name\"></span></b> Pod <b><span id=\"pod_name\"></span></b>에 새로운 기본 스토리지를 추가합니다.",
-    "message.add.region": "Please specify the required information to add a new region.",
-    "message.add.secondary.storage": "Zone <b><span id=\"zone_name\"></span></b>에 새로운 스토리지를 추가합니다",
-    "message.add.service.offering": "새로운 컴퓨팅 자원 제공을 추가하기 위해서, 다음 데이터를 입력해 주십시오.",
-    "message.add.system.service.offering": "새로운 시스템 서비스 제공을 추가하기 위해 다음 데이터를 입력해 주십시오.",
-    "message.add.template": "새로운 템플릿을 만들기하기 위해 아래 데이터를 입력해 주십시오.",
-    "message.add.volume": "새로운 볼륨을 추가하기 위해 아래 데이터를 입력해 주십시오.",
-    "message.added.vpc.offering": "Added VPC offering",
-    "message.adding.Netscaler.device": "Netscaler 기기를 추가하고 있습니다",
-    "message.adding.Netscaler.provider": "Netscaler 제공자를 추가하고 있습니다.",
-    "message.adding.host": "호스트를 추가하고 있습니다",
-    "message.additional.networks.desc": "가상 인스턴스가 접속하는 추가 네트워크를 선택해 주십시오.",
-    "message.admin.guide.read": "For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?,",
-    "message.advanced.mode.desc": "VLAN 기술 지원를 사용 하는 경우는 이 네트워크 모델을 선택해 주십시오.이 모델에서는 가장 유연하게 카스탐네트워크 제공을 제공할 수 있어 방화벽(fire wall), VPN, 네트워크 로드 공유 장치 기술 지원 외에, 직접 네트워크와 가상 네트워크도 사용 할 수 있습니다.",
-    "message.advanced.security.group": "게스트 VM를 분리하기 위해서 보안 그룹을 사용하는 경우는 이 옵션을 선택해 주십시오.",
-    "message.advanced.virtual": "게스트 VM를 분리하기 위해서 존 전체 VLAN를 사용하는 경우는 이 옵션을 선택해 주십시오.",
-    "message.after.enable.s3": "S3-backed Secondary Storage configured. Note: When you leave this page, you will not be able to re-configure S3 again.",
-    "message.after.enable.swift": "Swift가 구성되었습니다. 주의:이 페이지를 닫으면 Swift를 재구성할 수 없습니다.",
-    "message.alert.state.detected": "경계체제 상태가 감지되었습니다",
-    "message.allow.vpn.access": "VPN 접근를 허가하는 사용자 사용자명과 암호를 입력해 주십시오.",
-    "message.apply.snapshot.policy": "현재 스냅샷 정책를 업데이트했습니다.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "현재 가상 인스턴스에 ISO 파일을 연결 하시겠습니까?",
-    "message.attach.volume": "새로운 볼륨을 연결 하기 위해 아래 데이터를 입력해 주십시오.Windows 베이스 가상 머신에 디스크 볼륨을 연결 하는 경우는 연결 한 디스크를 인식하기 위해서 인스턴스를 재시작할 필요가 있습니다.",
-    "message.basic.mode.desc": "VLAN 기술 지원가<b><u>불필요한</u></b>경우는 이 네트워크 모델을 선택해 주십시오.이 네트워크 모델로 만들기되는 모든 가상 인스턴스에 네트워크에서 직접 IP 주소를 할당할 수 있어 보안 그룹을 사용해 보안와 분리가 제공됩니다.",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "현재 가상 인스턴스 서비스제공을 변경하시겠습니까?",
-    "message.change.password": "암호를 변경해 주십시오.",
-    "message.cluster.dedicated": "Cluster Dedicated",
-    "message.cluster.dedication.released": "Cluster dedication released",
-    "message.configure.all.traffic.types": "복수의 물리 네트워크가 있습니다. [편집]을 클릭해 트래픽의 종류 마다 라벨을 구성해 주십시오.",
-    "message.configure.firewall.rules.allow.traffic": "Configure the rules to allow Traffic",
-    "message.configure.firewall.rules.block.traffic": "Configure the rules to block Traffic",
-    "message.configure.ldap": "Please confirm you would like to configure LDAP.",
-    "message.configuring.guest.traffic": "게스트 트래픽을 구성해 있습니다",
-    "message.configuring.physical.networks": "물리 네트워크를 구성해 있습니다",
-    "message.configuring.public.traffic": "공개 트래픽을 구성해 있습니다",
-    "message.configuring.storage.traffic": "스토리지 트래픽을 구성해 있습니다",
-    "message.confirm.action.force.reconnect": "현재 호스트를 강제 재접속하시겠습니까?",
-    "message.confirm.add.vnmc.provider": "Please confirm you would like to add the VNMC provider.",
-    "message.confirm.archive.alert": "Please confirm that you want to archive this alert.",
-    "message.confirm.archive.event": "Please confirm that you want to archive this event.",
-    "message.confirm.archive.selected.alerts": "Please confirm you would like to archive the selected alerts",
-    "message.confirm.archive.selected.events": "Please confirm you would like to archive the selected events",
-    "message.confirm.attach.disk": "Are you sure you want to attach disk?",
-    "message.confirm.create.volume": "Are you sure you want to create volume?",
-    "message.confirm.current.guest.CIDR.unchanged": "Do you want to keep the current guest network CIDR unchanged?",
-    "message.confirm.dedicate.cluster.domain.account": "Do you really want to dedicate this cluster to a domain/account? ",
-    "message.confirm.dedicate.host.domain.account": "Do you really want to dedicate this host to a domain/account? ",
-    "message.confirm.dedicate.pod.domain.account": "Do you really want to dedicate this pod to a domain/account? ",
-    "message.confirm.dedicate.zone": "Do you really want to dedicate this zone to a domain/account?",
-    "message.confirm.delete.BigSwitchBcf": "Please confirm that you would like to delete this BigSwitch BCF Controller",
-    "message.confirm.delete.BrocadeVcs": "Please confirm that you would like to delete Brocade Vcs Switch",
-    "message.confirm.delete.F5": "F5를 삭제하시겠습니까?",
-    "message.confirm.delete.NetScaler": "NetScaler를 삭제하시겠습니까?",
-    "message.confirm.delete.PA": "Please confirm that you would like to delete Palo Alto",
-    "message.confirm.delete.SRX": "SRX를 삭제하시겠습니까?",
-    "message.confirm.delete.acl.list": "Are you sure you want to delete this ACL list?",
-    "message.confirm.delete.alert": "Are you sure you want to delete this alert ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Please confirm that you want to delete Baremetal Rack Configuration.",
-    "message.confirm.delete.ciscoASA1000v": "Please confirm you want to delete CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
-    "message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
-    "message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
-    "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
-    "message.confirm.destroy.router": "현재 라우터를 파기하시겠습니까?",
-    "message.confirm.disable.host": "Please confirm that you want to disable the host",
-    "message.confirm.disable.network.offering": "Are you sure you want to disable this network offering?",
-    "message.confirm.disable.provider": "현재 제공자를 사용 안 함으로 하시겠습니까?",
-    "message.confirm.disable.vnmc.provider": "Please confirm you would like to disable the VNMC provider.",
-    "message.confirm.disable.vpc.offering": "Are you sure you want to disable this VPC offering?",
-    "message.confirm.enable.host": "Please confirm that you want to enable the host",
-    "message.confirm.enable.network.offering": "Are you sure you want to enable this network offering?",
-    "message.confirm.enable.provider": "현재 제공자를 사용하시겠습니까?",
-    "message.confirm.enable.vnmc.provider": "Please confirm you would like to enable the VNMC provider.",
-    "message.confirm.enable.vpc.offering": "Are you sure you want to enable this VPC offering?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "현재 프로젝트에 참여하시겠습니까?",
-    "message.confirm.migrate.volume": "Do you want to migrate this volume?",
-    "message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
-    "message.confirm.release.dedicate.vlan.range": "Please confirm you want to release dedicated VLAN range",
-    "message.confirm.release.dedicated.cluster": "Do you want to release this dedicated cluster ?",
-    "message.confirm.release.dedicated.host": "Do you want to release this dedicated host ?",
-    "message.confirm.release.dedicated.pod": "Do you want to release this dedicated pod ?",
-    "message.confirm.release.dedicated.zone": "Do you want to release this dedicated zone ? ",
-    "message.confirm.remove.IP.range": "현재 IP 주소 범위를 삭제하시겠습니까?",
-    "message.confirm.remove.event": "Are you sure you want to remove this event?",
-    "message.confirm.remove.load.balancer": "Please confirm you want to remove VM from load balancer",
-    "message.confirm.remove.network.offering": "Are you sure you want to remove this network offering?",
-    "message.confirm.remove.selected.alerts": "Please confirm you would like to remove the selected alerts",
-    "message.confirm.remove.selected.events": "Please confirm you would like to remove the selected events",
-    "message.confirm.remove.vmware.datacenter": "Please confirm you want to remove VMware datacenter",
-    "message.confirm.remove.vpc.offering": "Are you sure you want to remove this VPC offering?",
-    "message.confirm.replace.acl.new.one": "Do you want to replace the ACL with a new one?",
-    "message.confirm.scale.up.router.vm": "Do you really want to scale up the Router VM ?",
-    "message.confirm.scale.up.system.vm": "Do you really want to scale up the system VM ?",
-    "message.confirm.shutdown.provider": "현재 제공자를 종료하시겠습니까?",
-    "message.confirm.start.lb.vm": "Please confirm you want to start LB VM",
-    "message.confirm.stop.lb.vm": "Please confirm you want to stop LB VM",
-    "message.confirm.upgrade.router.newer.template": "Please confirm that you want to upgrade router to use newer template",
-    "message.confirm.upgrade.routers.account.newtemplate": "Please confirm that you want to upgrade all routers in this account to use newer template",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Please confirm that you want to upgrade all routers in this cluster to use newer template",
-    "message.confirm.upgrade.routers.newtemplate": "Please confirm that you want to upgrade all routers in this zone to use newer template",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Please confirm that you want to upgrade all routers in this pod to use newer template",
-    "message.copy.iso.confirm": "ISO를 다음 장소에 복사하시겠습니까?",
-    "message.copy.template": "존 <b id=\"copy_template_source_zone_text\"></b> 으에서 템플릿 <b id=\"copy_template_name_text\">XXX</b>를 다음 장소에 복사합니다:",
-    "message.copy.template.confirm": "Are you sure you want to copy template?",
-    "message.create.template": "템플릿을 만들기하시겠습니까?",
-    "message.create.template.vm": "템플릿 <b id=\"p_name\"></b> 으에서 VM를 만들었습니다.",
-    "message.create.template.volume": "디스크 볼륨 <b><span id=\"volume_name\"></span></b> 템플릿을 만들기하기 전에, 다음 정보를 지정해 주십시오.볼륨 크기에 따라서는 템플릿 만들기에는 몇분 이상 걸릴 가능성이 있습니다.",
-    "message.creating.cluster": "클러스터를 만들었습니다.",
-    "message.creating.guest.network": "손님 네트워크를 만듭니다.",
-    "message.creating.physical.networks": "물리 네트워크를 만들었습니다.",
-    "message.creating.pod": "Pod를 만들었습니다.",
-    "message.creating.primary.storage": "기본 스토리지를 만들었습니다.",
-    "message.creating.secondary.storage": "2차 스토리지를 만들었습니다.",
-    "message.creating.systemVM": "Creating system VMs (this may take a while)",
-    "message.creating.zone": "Zone을 만들었습니다.",
-    "message.decline.invitation": "현재 프로젝트에 초대를 거절하시겠습니까?",
-    "message.dedicate.zone": "Dedicating zone",
-    "message.dedicated.zone.released": "Zone dedication released",
-    "message.delete.VPN.connection": "VPN 접속을 삭제하시겠습니까?",
-    "message.delete.VPN.customer.gateway": "현재 VPN 고객 게이트웨이를 삭제하시겠습니까?",
-    "message.delete.VPN.gateway": "현재 VPN 게이트웨이를 삭제하시겠습니까?",
-    "message.delete.account": "현재 계정 정보를 삭제하시겠습니까?",
-    "message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
-    "message.delete.gateway": "현재 게이트웨이를 삭제하시겠습니까?",
-    "message.delete.project": "현재 프로젝트를 삭제하시겠습니까?",
-    "message.delete.user": "현재 사용자를 삭제하시겠습니까?",
-    "message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
-    "message.desc.advanced.zone": "보다 세련된 네트워크 기술을 지원합니다. 이 네트워크 모델을 선택하면, 보다 유연하게 게스트 네트워크를 정하고 방화벽(fire wall), VPN, 네트워크 로드 공유 장치 기술 지원와 같은 사용자 지정 한 네트워크 제공을 제공할 수 있습니다.",
-    "message.desc.basic.zone": "각 VM 인스턴스에 IP 주소가 네트워크에서 직접 할당할 수 있는 단일 네트워크를 제공합니다. 보안 그룹 (전송원 IP 주소 필터)과 같은 층 세 가지 레벨 방법으로 게스트를 분리할 수 있습니다.",
-    "message.desc.cluster": "각 Pod에는 한 개 이상 클러스터가 필요합니다. 지금 여기서 최초 클러스터를 추가합니다. 클러스터는 호스트를 그룹화 하는 방법입니다. 한 클러스터 내부 호스트는 모두 동일한 하드웨어에서 구성되어 같은 하이퍼 바이저를 실행하고 같은 서브 네트워크상에 있어 같은 공유 스토리지에 접근 합니다. 각 클러스터는 한 개 이상 호스트와 한 개 이상 기본 스토리지 서버에서 구성됩니다.",
-    "message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.<br><br>(1) If public key is set, CloudStack will register the public key. You can use it through your private key.<br><br>(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.<br>",
-    "message.desc.created.ssh.key.pair": "Created a SSH Key Pair.",
-    "message.desc.host": "각 클러스터에는 적어도 한 개 이상 게스트 VM를 실행하기 위한 호스트 (컴퓨터)가 필요합니다. 지금 여기서 첫번째 호스트를 추가합니다. CloudStack으로 호스트를 동작하려면 호스트에게 하이퍼 바이저를 설치하고 IP 주소를 할당해 호스트가 CloudStack 관리 서버에 접속하도록 합니다. <br/><br/>호스트 DNS 명 또는 IP 주소, 사용자명(원래 root)과 암호 및 호스트 분류에 사용하는 라벨을 입력해 주십시오.",
-    "message.desc.primary.storage": "각 클러스터에는 적어도 한 개 이상의 기본 스토리지 서버가 필요합니다. 지금 여기서 첫번째 서버를 추가합니다. 기본 스토리지는 클러스터 내 부 호스트상에서 동작하는 모든 VM 디스크 볼륨을 포함합니다. 기본적으로 하이퍼 바이저에서 기술 지원되는 표준에 준거한 프로토콜을 사용해 주십시오.",
-    "message.desc.reset.ssh.key.pair": "Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled.",
-    "message.desc.secondary.storage": "각 Zone에는 적어도 한 개 이상의 NFS 즉 2차 스토리지 서버가 필요합니다. 지금 여기서 첫번째 서버를 추가합니다. 2차 스토리지는 VM 템플릿, ISO 이미지 및 VM 디스크 볼륨 스냅샷을 포함합니다. 이 서버는 Zone내 모든 호스트에서  사용할 수 있어야 합니다. <br/><br/>IP 주소와 내보내낼 경로를 입력해 주십시오.",
-    "message.desc.zone": "Zone은 CloudStack 환경내 최대 조직 단위로 원래 단일 데이터 센터에 해당합니다. Zone에 해서 물리적인 분리와 중복성이 제공됩니다. Zone은 한 개 이상 Pod( 각 Pod는 호스트와 기본 스토리지 서버에서 구성)와 Zone내 모든 Pod로 공유되는 2차 스토리지 서버로 구성됩니다.",
-    "message.detach.disk": "현재 디스크를 분리 하시겠습니까?",
-    "message.detach.iso.confirm": "현재 가상 인스턴스에서 ISO 파일을 분리 하시겠습니까?",
-    "message.disable.account": "현재 계정 정보를 사용 안 함으로 하시겠습니까?이 계정 정보 모든 사용자가 클라우드 자원에 접근 할 수 없게 됩니다. 실행중 모든 가상 머신은 금방에 종료 됩니다.",
-    "message.disable.snapshot.policy": "현재 스냅샷 정책를 사용 안 함으로 설정했습니다.",
-    "message.disable.user": "현재 사용자를 사용 안 함으로 하시겠습니까?",
-    "message.disable.vpn": "VPN를 사용 안 함으로 하시겠습니까?",
-    "message.disable.vpn.access": "VPN 접근를 사용 안 함으로 하시겠습니까?",
-    "message.disabling.network.offering": "Disabling network offering",
-    "message.disabling.vpc.offering": "Disabling VPC offering",
-    "message.disallowed.characters": "Disallowed characters: <,>",
-    "message.download.ISO": "ISO를 다운로드하려면 <a href=\"#\">00000</a>을 클릭합니다.",
-    "message.download.template": "템플릿을 다운로드하려면 <a href=\"#\">00000</a>을 클릭합니다.",
-    "message.download.volume": "볼륨을 다운로드하려면 <a href=\"#\">00000</a>을 클릭합니다.",
-    "message.download.volume.confirm": "Please confirm that you want to download this volume.",
-    "message.edit.account": "편집 (\"-1\"는 자원 만들기 숫자에 제한이 없는 값입니다.)",
-    "message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
-    "message.edit.limits": "다음 자원에 제한을 지정해 주십시오.「-1」은 자원 만들기에 제한이 없다는 의미입니다.",
-    "message.edit.traffic.type": "현재 트래픽의 종류에 관련 트래픽 라벨을 지정해 주십시오.",
-    "message.enable.account": "현재 계정 정보를 사용 하시겠습니까?",
-    "message.enable.user": "현재 사용자를 사용 하시겠습니까?",
-    "message.enable.vpn": "현재 IP 주소에 대한 VPN 접근를 사용 하시겠습니까?",
-    "message.enable.vpn.access": "현재이 IP 주소에 대한 VPN는 유효하지 않은입니다. VPN 접근를 사용 하시겠습니까?",
-    "message.enabled.vpn": "현재 VPN 접근 사용 설정되어 있습니다. 다음 IP 주소 경유로 접근 할 수 있습니다.",
-    "message.enabled.vpn.ip.sec": "IPSec 사전 공유 키:",
-    "message.enabling.network.offering": "Enabling network offering",
-    "message.enabling.security.group.provider": "보안 그룹 제공자를 사용 하고 있습니다.",
-    "message.enabling.vpc.offering": "Enabling VPC offering",
-    "message.enabling.zone": "Zone을 사용하고 있습니다",
-    "message.enabling.zone.dots": "Enabling zone...",
-    "message.enter.seperated.list.multiple.cidrs": "Please enter a comma separated list of CIDRs if more than one",
-    "message.enter.token": "전자 메일 초대장에 설명되어 있는 토큰을 입력해 주십시오.",
-    "message.generate.keys": "현재 사용자에게 새로운 키를 생성하시겠습니까?",
-    "message.gslb.delete.confirm": "Please confirm you want to delete this GSLB",
-    "message.gslb.lb.remove.confirm": "Please confirm you want to remove load balancing from GSLB",
-    "message.guest.traffic.in.advanced.zone": "손님 네트워크 트래픽은 최종 사용자 가상 머신간 통신입니다. 각 물리 네트워크 게스트 트래픽을 통신하기 위한 VLAN ID 범위를 지정해 주십시오.",
-    "message.guest.traffic.in.basic.zone": "손님 네트워크 트래픽은 최종 사용자의 가상 머신간 통신입니다. CloudStack에 게스트 VM에 할당할 수 있는 IP 주소 범위를 지정해 주십시오.이 범위가 예약 끝난 시스템 IP 주소 범위와 중복 하지 않게 주의해 주십시오.",
-    "message.host.dedicated": "Host Dedicated",
-    "message.host.dedication.released": "Host dedication released",
-    "message.installWizard.click.retry": "시작을 재시행하려면 버튼을 클릭해 주십시오.",
-    "message.installWizard.copy.whatIsACluster": "클러스터는 호스트를 그룹화 하는 방법입니다. 한 가지 클러스터내 호스트는 모두 동일한 하드웨어에서 구성되어 같은 하이퍼 바이저를 실행하고 같은 서브 네트워크상에 있어서 같은 공유 스토리지에 접근 합니다. 같은 클러스터내의 호스트 사이에서는 사용자에게 서비스를 중단하지 않고 가상 머신 인스턴스를 실시간 이전 할 수 있습니다. 클러스터는 CloudStack™ 환경내의 세 번째로 큰 조직 단위입니다. 클러스터는 Pod에 포함되어 Pod는 Zone에 포함됩니다. <br/><br/>CloudStack™ 에서는 한 가지 클라우드 환경에 복수 클러스터를 설정할 수 있으나 기본 설치에서는 클러스터는 한 개입니다.",
-    "message.installWizard.copy.whatIsAHost": "호스트는 단일 컴퓨터로 손님 가상 머신을 실행하는 컴퓨팅 자원을 제공합니다. 베어 메탈 호스트를 제외하고, 각 호스트는 게스트 가상 머신을 관리하기 위한 하이퍼 바이저 소프트웨어를 설치합니다. 베어 메탈 호스트에 대해서는 설치 가이드 고급편 특수 사례로서 설명합니다. 예를 들어, KVM은 유효한 Linux 서버, Citrix XenServer가 동작하는 서버 및 ESXi 서버가 호스트입니다. 기본 설치에서는 XenServer 또는 KVM를 실행하는 단일 호스트를 사용합니다. <br/><br/>호스트는 CloudStack™ 환경내의 최소의 조직 단위입니다. 호스트는 클러스터에 포함되어 클러스터는 Pod에 포함되어 Pod는 Zone에 포함됩니다.",
-    "message.installWizard.copy.whatIsAPod": "원래 한 가지 Pod는 단일 잠금을 나타냅니다. 같은 Pod내 호스트는 같은 서브 네트워크에 포함됩니다. <br/><br/>Pod는 CloudStack™ 환경내의 두 번째로 큰 조직 단위입니다. Pod는 Zone에 포함됩니다. 각 Zone은 한 개 이상의 Pod를 포함할 수 있습니다. 기본 설치에서는 Zone내 Pod는 한 개입니다.",
-    "message.installWizard.copy.whatIsAZone": "Zone은 CloudStack™ 환경내 최대 조직 단위입니다. 한 가지 데이터 센터내에 복수 Zone을 설정할 수 있으나 원래 Zone은 단일의 데이터 센터에 할당합니다. 인프라스트럭쳐를 Zone에 조직화하면, Zone을 물리적우로 분리해 설정할 수 있습니다. 예를 들어, 각 Zone에 전원과 네트워크 업링크를 배치합니다. 필수가 아니지만 원격지에 분산할 수 있습니다.",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack™는 컴퓨팅 자원을 포함하는 소프트웨어 플랫웹 양식에서 공개, 사설, 및 하이브리드의 Infrastructure as a Service (IaaS) 클라우드를 구축할 수 있습니다. CloudStack™를 사용하고, 클라우드 인프라스트럭쳐를 구성하는 네트워크, 스토리지 및 컴퓨팅 노드를 관리하고 클라우드 컴퓨팅 환경을 설정, 관리 및 구성합니다. <br/><br/>CloudStack™은 하드웨어상에서 동작하는 개별 가상 머신 이미지를 넘어 확장할 수 있기 때문에 간단한 설정으로 동작하는 클라우드 인프라스트럭쳐 소프트웨어 스택에 의해 가상 데이터 센터 즉 여러 층형 멀티 세입자 클라우드 애플리케이션을 서비스로서 구축하고 설정하고 관리하기 위해서 불가결한 항목을 모두 제공합니다. 오픈 소스 버전과 프리미엄 버전 양쪽 모두에 제공하며 오픈 소스 버전에서도 대부분 기능을 사용할 수 있습니다.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "CloudStack™ 클라우드 인프라스트럭쳐에서는 기본 스토리지와 2차 스토리지 두 종류의 스토리지를 사용합니다. 양쪽 스토리지에서 iSCSI, NFS 서버, 또는 로컬 디스크를 사용할 수 있습니다. <br/><br/><strong>기본 스토리지</strong>는 클러스터에 관련되어그 클러스터내의 호스트로 동작하는 모든 VM 중 각 게스트 VM의 디스크 볼륨을 포함합니다. 원래, 기본 스토리지 서버는 호스트 근처에 설치합니다.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "2차 스토리지는 Zone과 관련돤 아래의 항목을 포함합니다. <ul><li>템플릿 - VM 시작 시 사용할 수 있는 OS 이미지로 애플리케이션의 설치 등 추가 구성을 포함할 수 있습니다. </li><li>ISO 이미지 - 바로 시작 가능 또는 시작 불가의 OS 이미지입니다. </li><li>디스크 볼륨 스냅샷 - VM 데이터 저장 복사본입니다. 데이터의 복원 또는 새로운 템플릿 만들기에 사용할 수 있습니다. </ul>",
-    "message.installWizard.now.building": "클라우드를 구축하고 있는 중...",
-    "message.installWizard.tooltip.addCluster.name": "클러스터 이름입니다. CloudStack에서 예약하지 않은 임의 텍스트를 지정할 수 있습니다.",
-    "message.installWizard.tooltip.addHost.hostname": "호스트 DNS 명 또는 IP 주소입니다.",
-    "message.installWizard.tooltip.addHost.password": "XenServer 측에서 지정한 위의 사용자명에 대한 암호입니다.",
-    "message.installWizard.tooltip.addHost.username": "원래 root 입니다.",
-    "message.installWizard.tooltip.addPod.name": "Pod 이름입니다.",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "이것은 2차 스토리지 VM 및 콘솔 프록시 VM를 관리하기 위해서 CloudStack에서 사용하는 사설 네트워크내 IP 주소 범위입니다. 이러한 IP 주소는 컴퓨팅 서버와 같은 서브네트워크에서 할당합니다.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "현재 Pod내 호스트 게이트웨이입니다.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "게스트가 사용하는 서브네트워크상에서 지정한 넷 마스크입니다.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "이것은 2차 스토리지 VM 및 콘솔 프록시 VM를 관리하기 위해서 CloudStack에서 사용하는 사설 네트워크내의 IP 주소 범위입니다. 이러한 IP 주소는 컴퓨팅 서버와 같은 서브네트워크에서 할당합니다.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "스토리지 기기의 이름입니다.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(NFS의 경우) 서버에서 내보내기 경로입니다. (SharedMountPoint의 경우) 일반 경로입니다. KVM에서는 기본 스토리지가 마운트되는 각 호스트상의 경로입니다. 예를 들어, /mnt/primary 입니다.",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(NFS, iSCSI 또는 PreSetup의 경우) 스토리지 기기의 IP 주소 또는 DNS 명입니다.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "2차 스토리지를 호스트 하는 NFS 서버 IP 주소입니다.",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "위에서 지정한 서버에 존재하는 내보내기 경로입니다.",
-    "message.installWizard.tooltip.addZone.dns1": "Zone내의 게스트 VM으로 사용하는 DNS 서버입니다. 이러한 DNS 서버에는 다음에 추가하는 공개 네트워크 경유로 접근 합니다. Zone의 공개 IP 주소에서 여기서 지정하는 공개 DNS 서버에 통신할 수 있어야 합니다.",
-    "message.installWizard.tooltip.addZone.dns2": "Zone내 게스트 VM 로 사용하는 DNS 서버입니다. 현재 DNS 서버에는 다음에 추가하는 공개 네트워크 경유로 접근합니다. Zone의 공개 IP 주소에서 여기서 지정하는 공개 DNS 서버에 통신할 수 있어야 합니다.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Zone내의 시스템 VM 로 사용하는 DNS 서버입니다. 현재 DNS 서버는 시스템 VM의 사설 네트워크 인터페이스를 개입시켜 접근합니다. Pod의 사설 IP 주소에서 여기서 지정하는 DNS 서버에 통신할 수 있어야 합니다.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Zone내 시스템 VM으로 사용하는 DNS 서버입니다. 현재 DNS 서버는 시스템 VM의 사설 네트워크 인터페이스를 개입시켜 접근합니다. Pod의 사설 IP 주소에서 여기서 지정하는 DNS 서버에 통신할 수 있어야 합니다.",
-    "message.installWizard.tooltip.addZone.name": "Zone의 이름입니다.",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "네트워크 설명입니다.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "현재 Zone의 게스트에게 할당할 수 있는 IP 주소 범위입니다. 사용하는 NIC가 한 가지인 경우는 이러한 IP 주소는 Pod의 CIDR와 같은 CIDR에 포함되어 있어야 합니다.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "게스트에서 사용하는 게이트웨이입니다.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "게스트에서 사용하는 서브네트워크상에서 사용되는 넷 마스크입니다.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "현재 Zone의 게스트에게 할당할 수 있는 IP 주소 범위입니다. 사용하는 NIC가 한 가지 경우는 이러한 IP 주소는 Pod의 CIDR와 같은 CIDR에 포함되어 있어야 합니다.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "네트워크 이름입니다.",
-    "message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
-    "message.instanceWizard.noTemplates": "사용 가능한 템플릿이 없습니다. 호환성이 있는 템플릿을 추가하고, 인스턴스 위저드를 재시작해 주십시오.",
-    "message.ip.address.changed": "사용 IP 주소가 변경된 가능성이 있습니다. 목록을 업데이트합니까? 그 경우는 상세 설정창이 닫는 것에 주의해 주십시오.",
-    "message.iso.desc": "데이터 또는 OS 시작 가능 미디어를 포함한 디스크 이미지",
-    "message.join.project": "이것으로, 프로젝트에 참여했습니다. 프로젝트를 참조하려면 프로젝트 보기로 전환해 주십시오.",
-    "message.launch.vm.on.private.network": "사적 전용 네트워크로 인스턴스를 시작합니까?",
-    "message.launch.zone": "Zone을 시작할 준비가 되었습니다. 다음 순서에 따라 진행해 주십시오.",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "현재 계정 정보를 잠그어도 좋습니까? 이 계정 정보 모든 사용자가 클라우드 자원을 관리할 수 없게 됩니다. 그 후도 기존 Zone 자원에는 접근 할 수 있습니다.",
-    "message.migrate.instance.confirm": "가상 인스턴스 이전 위치는 다음 호스트로 하시겠습니까?",
-    "message.migrate.instance.to.host": "다른 호스트에게 인스턴스를 이전하시겠습니까?",
-    "message.migrate.instance.to.ps": "다른 기본 스토리지에 인스턴스를 이전하시겠습니까?",
-    "message.migrate.router.confirm": "라우터 이전 위치로 호스트를 선택십시오.",
-    "message.migrate.systemvm.confirm": "시스템 VM 이전 이전 위치로 호스트를 선택십시오.",
-    "message.migrate.volume": "다른 기본 스토리지에 볼륨을 이전하시겠습니까?",
-    "message.network.addVM.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-    "message.network.addVMNIC": "Please confirm that you would like to add a new VM NIC for this network.",
-    "message.network.remote.access.vpn.configuration": "Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-    "message.new.user": "계정 정보에 새로운 사용자를 추가하기 위해 아래 정보를 지정해 주십시오.",
-    "message.no.affinity.groups": "You do not have any affinity groups. Please continue to the next step.",
-    "message.no.host.available": "No Hosts are available for Migration",
-    "message.no.network.support": "하이퍼 바이저로서 vSphere를 선택했으나 이 하이퍼 바이저에 추가 네트워크 기능은 없습니다. 단계 5로 진행해 주십시오.",
-    "message.no.network.support.configuration.not.true": "보안 그룹이 유효한 Zone이 없기 때문에 추가 네트워크 기능은 없습니다. 단계 5로 진행해 주십시오.",
-    "message.no.projects": "프로젝트가 없습니다. <br/>프로젝트 섹션에서 새로운 프로젝트를 만들어 주십시오.",
-    "message.no.projects.adminOnly": "프로젝트가 없습니다. <br/>관리자에게 새로운 프로젝트 생성을 의뢰하십시오.",
-    "message.number.clusters": "<h2>클러스터<span>수</span></h2>",
-    "message.number.hosts": "<h2>호스트<span>수</span></h2>",
-    "message.number.pods": "<h2>Pod<span>수</span></h2>",
-    "message.number.storage": "<h2>기본 스토리지 볼륨<span>수</span></h2>",
-    "message.number.zones": "<h2>Zone<span>수</span></h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Password has been reset to",
-    "message.password.of.the.vm.has.been.reset.to": "Password of the VM has been reset to",
-    "message.pending.projects.1": "보류중인 프로젝트 초대장이 있습니다.",
-    "message.pending.projects.2": "표시하려면 프로젝트 섹션으로 이동하고 목록에서 초대장을 선택합니다.",
-    "message.please.add.at.lease.one.traffic.range": "적어도 한 개 이상 트래픽 범위를 추가해 주십시오.",
-    "message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
-    "message.please.proceed": "다음의 순서에 진행해 주십시오.",
-    "message.please.select.a.configuration.for.your.zone": "Zone 구성을 선택해 주십시오.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "삭제 전에 다른 공개 및 관리 네트워크를 선택해 주십시오.",
-    "message.please.select.networks": "가상 머신 네트워크를 선택해 주십시오.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Please select a ssh key pair you want this VM to use:",
-    "message.please.wait.while.zone.is.being.created": "Zone이 만들기될 때까지 잠깐 기다려 주십시오...",
-    "message.pod.dedication.released": "Pod dedication released",
-    "message.portable.ip.delete.confirm": "Please confirm you want to delete Portable IP Range",
-    "message.project.invite.sent": "사용자에게 초대장이 전송되었습니다. 사용자가 초대를 승인하면, 프로젝트에 추가됩니다.",
-    "message.public.traffic.in.advanced.zone": "클라우드 내부 VM이 인터넷에 접근 하면, 공개 트래픽이 생성됩니다. 이 때문에 일반적으로 접근 가능한 IP 주소를 할당할 필요가 있습니다. 최종 사용자는 CloudStack 사용자 인터페이스를 사용해 이러한 IP 주소를 취득하고 손님 네트워크와 공개 네트워크 사이에 NAT를 구현할 수 있습니다. <br/><br/>인터넷 트래픽을 위해 적어도 한 개 이상 IP 주소 범위를 입력해 주십시오.",
-    "message.public.traffic.in.basic.zone": "클라우드 내부 VM이 인터넷에 접근 할 때 인터넷 경유로 클라이언트에 서비스를 제공하면, 공개 트래픽이 생성됩니다. 이 때문에  일반적으로 접근 가능한 IP 주소를 할당할 필요가 있습니다. 인스턴스를 만들기하면, 게스트 IP 주소 외에이 공개 IP 주소 범위에서 주소가 하나의 인스턴스에 할당할 수 있습니다. 공개 IP 주소와 게스트 IP 주소 사이에 정적인 1대 1 NAT가 자동으로 설정 됩니다. 최종 사용자는 CloudStack 사용자 인터페이스를 사용해 추가 IP 주소를 취득하고 인스턴스와 공개 IP 주소 사이에 정적 NAT를 구현할 수도 있습니다.",
-    "message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
-    "message.read.admin.guide.scaling.up": "Please read the dynamic scaling section in the admin guide before scaling up.",
-    "message.recover.vm": "Please confirm that you would like to recover this VM.",
-    "message.redirecting.region": "Redirecting to region...",
-    "message.reinstall.vm": "NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched.",
-    "message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
-    "message.remove.region": "Are you sure you want to remove this region from this management server?",
-    "message.remove.vpc": "VPC를 삭제하시겠습니까?",
-    "message.remove.vpn.access": "다음 사용자에서 VPN 접근를 삭제하시겠습니까?",
-    "message.removed.ssh.key.pair": "Removed a SSH Key Pair",
-    "message.reset.VPN.connection": "VPN 접속을 재설정 하시겠습니까?",
-    "message.reset.password.warning.notPasswordEnabled": "현재 인스턴스 템플릿은 암호 관리를 사용 하지 않고 생성되었습니다.",
-    "message.reset.password.warning.notStopped": "현재 암호를 변경하기 전에 인스턴스를 정지해야 합니다.",
-    "message.restart.mgmt.server": "새로운 설정을 사용 하기 위해 관리 서버를 재시작해 주십시오.",
-    "message.restart.mgmt.usage.server": "새로운 설정을 사용 하기 위해 관리 서버와 사용 상황 측정 서버를 재시작해 주십시오.",
-    "message.restart.network": "현재 네트워크로 제공하는 모든 서비스가 중단됩니다. 이 네트워크를 재시작하시겠습니까?",
-    "message.restart.vpc": "VPC를 재시작하시겠습니까?",
-    "message.restart.vpc.remark": "Please confirm that you want to restart the VPC <p><small><i>Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes</i>.</small></p>",
-    "message.restoreVM": "Do you want to restore the VM ?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(해당하는 보안 그룹을 모두 선택하려면 <strong>Ctrl 키를 누르면서 클릭</strong>해 주십시오)",
-    "message.select.a.zone": "Zone은 원래 단일 데이터 센터에 해당합니다. 복수 Zone을 설정하고 물리적으로 분리하는 방법으로 클라우드의 신뢰성을 높일 수 있습니다.",
-    "message.select.affinity.groups": "Please select any affinity groups you want this VM to belong to:",
-    "message.select.instance": "인스턴스를 선택해 주십시오.",
-    "message.select.iso": "새로운 가상 인스턴스 ISO를 선택해 주십시오.",
-    "message.select.item": "항목을 선택해 주십시오.",
-    "message.select.security.groups": "새로운 가상 머신 보안 그룹을 선택해 주십시오.",
-    "message.select.template": "새로운 가상 인스턴스 템플릿을 선택해 주십시오.",
-    "message.select.tier": "Please select a tier",
-    "message.set.default.NIC": "Please confirm that you would like to make this NIC the default for this VM.",
-    "message.set.default.NIC.manual": "Please manually update the default NIC on the VM now.",
-    "message.setup.physical.network.during.zone.creation": "확장 Zone을 추가할 때는 한 개 이상 물리 네트워크를 설정해야 합니다. 각 네트워크는 하이퍼 바이저상 한 가지 네트워크 카드(NIC)에 대응합니다. 각 물리 네트워크에서는 구성에 제한이 있으나, 한 가지 종류 이상 트래픽을 통신할 수 있습니다. <br/><br/>각 물리 네트워크에 대해서<strong>트래픽 종류를 드래그 앤 드롭</strong>해 주십시오.",
-    "message.setup.physical.network.during.zone.creation.basic": "기본 Zone을 추가할 때는 하이퍼 바이저상의 네트웍카드(NIC)에 대응하는 한 가지 물리 네트워크를 설정 할 수 있습니다. 네트워크는 몇 가지 종류의 트래픽을 전송합니다. <br/><br/>물리 네트워크에 다른 트래픽의 종류를<strong>드래그 앤 드롭</strong> 할 수도 있습니다.",
-    "message.setup.successful": "클라우드가 설정 되었습니다.",
-    "message.snapshot.schedule": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-    "message.specifiy.tag.key.value": "Please specify a tag key and value",
-    "message.specify.url": "URL를 지정해 주십시오",
-    "message.step.1.continue": "실행하려면 템플릿 또는 ISO를 선택해 주십시오.",
-    "message.step.1.desc": "새로운 가상 인스턴스용 템플릿을 선택해 주십시오.ISO를 설치 할 수 있는 공백 템플릿을 선택할 수도 있습니다.",
-    "message.step.2.continue": "실행하려면 서비스제공을 선택해 주십시오.",
-    "message.step.3.continue": "실행하려면 디스크제공을 선택해 주십시오.",
-    "message.step.4.continue": "실행하려면 네트워크를 적어도 한 개 이상 선택해 주십시오.",
-    "message.step.4.desc": "가상 인스턴스가 접속하는 기본 네트워크를 선택해 주십시오.",
-    "message.storage.traffic": "호스트나 CloudStack 시스템 VM 등 관리 서버와 통신하는 CloudStack 내부 자원간 트래픽입니다. 여기서 스토리지 트래픽을 구성해 주십시오.",
-    "message.suspend.project": "현재 프로젝트를 일시정지하시겠습니까?",
-    "message.systems.vms.ready": "System VMs ready.",
-    "message.template.copying": "Template is being copied.",
-    "message.template.desc": "VM의 시작에 사용할 수 있는 OS 이미지",
-    "message.tier.required": "Tier is required",
-    "message.tooltip.dns.1": "Zone내 VM 로 사용하는 DNS 서버 이름입니다. Zone 공개 IP 주소에서 이 서버에 통신할 수 있어야 합니다.",
-    "message.tooltip.dns.2": "Zone내 VM 로 사용하는 두번째 DNS 서버 이름입니다. Zone 공개 IP 주소에서 이 서버에 통신할 수 있어야 합니다.",
-    "message.tooltip.internal.dns.1": "Zone내 CloudStack 내부 시스템 VM 로 사용하는 DNS 서버 이름입니다. Pod 사설 IP 주소에서 이 서버에 통신할 수 있어야 합니다.",
-    "message.tooltip.internal.dns.2": "Zone내 CloudStack 내부 시스템 VM 로 사용하는 DNS 서버 이름입니다. Pod 사설 IP 주소에서 이 서버에 통신할 수 있어야 합니다.",
-    "message.tooltip.network.domain": "DNS 서픽스입니다. 이 서픽스에서 게스트 VM 로 접근 하는 네트워크 맞춤형 도메인명을 만듭니다.",
-    "message.tooltip.pod.name": "현재 Pod 이름입니다.",
-    "message.tooltip.reserved.system.gateway": "Pod내 호스트 게이트웨이입니다.",
-    "message.tooltip.reserved.system.netmask": "Pod 서브네트워크를 정하는 네트워크 프레픽스입니다. CIDR 표기를 사용합니다.",
-    "message.tooltip.zone.name": "Zone 이름입니다.",
-    "message.update.os.preference": "현재 호스트 OS 기본 설정을 선택해 주십시오.같은 기본 설정을 가지는 모든 가상 인스턴스는 다른 호스트를 선택하기 전에 우선이 호스트가 할당할 수 있습니다.",
-    "message.update.resource.count": "현재 계정 정보 자원수를 업데이트하시겠습니까?",
-    "message.update.ssl": "각 콘솔 프록시 가상 인스턴스로 업데이트하는 X.509 기반 새 SSL 인증서를 전송해 주십시오:",
-    "message.update.ssl.failed": "Failed to update SSL Certificate.",
-    "message.update.ssl.succeeded": "Update SSL Certificates succeeded",
-    "message.validate.URL": "Please enter a valid URL.",
-    "message.validate.accept": "Please enter a value with a valid extension.",
-    "message.validate.creditcard": "Please enter a valid credit card number.",
-    "message.validate.date": "Please enter a valid date.",
-    "message.validate.date.ISO": "Please enter a valid date (ISO).",
-    "message.validate.digits": "Please enter only digits.",
-    "message.validate.email.address": "Please enter a valid email address.",
-    "message.validate.equalto": "Please enter the same value again.",
-    "message.validate.fieldrequired": "This field is required.",
-    "message.validate.fixfield": "Please fix this field.",
-    "message.validate.instance.name": "인스턴스명은 63 문자 이내에서 지정해 주십시오. ASCII 문자의 a-z, A-Z, 숫자의 0-9 및 하이픈만을 사용할 수 있습니다. 문자로 시작하여 문자 또는 숫자로 끝내야 합니다.",
-    "message.validate.invalid.characters": "Invalid characters found; please correct.",
-    "message.validate.max": "Please enter a value less than or equal to {0}.",
-    "message.validate.maxlength": "Please enter no more than {0} characters.",
-    "message.validate.minlength": "Please enter at least {0} characters.",
-    "message.validate.number": "Please enter a valid number.",
-    "message.validate.range": "Please enter a value between {0} and {1}.",
-    "message.validate.range.length": "Please enter a value between {0} and {1} characters long.",
-    "message.virtual.network.desc": "계정 정보 전용 가상 네트워크입니다. 브로드캐스트 도메인은 VLAN 내에 배치되어 공개 네트워크에 접근는 모두 가상 라우터에 해서 루팅 됩니다.",
-    "message.vm.create.template.confirm": "템플릿 만들기하면 VM이 자동으로 재시작됩니다.",
-    "message.vm.review.launch": "다음의 정보를 참조하고 가상 인스턴스를 올바르게 설정한 것을 확인하고 나서 시작해 주십시오.",
-    "message.vnmc.available.list": "VNMC is not available from provider list.",
-    "message.vnmc.not.available.list": "VNMC is not available from provider list.",
-    "message.volume.create.template.confirm": "현재 디스크 볼륨 템플릿을 만드시겠습니까? 볼륨 크기에 따라 템플릿 만들기에 몇 분 이상 걸릴 가능성이 있습니다.",
-    "message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
-    "message.you.must.have.at.least.one.physical.network": "적어도 한 개 이상 물리 네트워크가 필요합니다",
-    "message.your.cloudstack.is.ready": "Your CloudStack is ready!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Zone을 만들었습니다. 이 Zone을 사용 하시겠습니까?",
-    "message.zone.no.network.selection": "선택한 Zone에서는 네트워크를 선택할 수 없습니다.",
-    "message.zone.step.1.desc": "Zone 네트워크 모델을 선택해 주십시오.",
-    "message.zone.step.2.desc": "새 Zone을 추가하기 위해 아래 정보를 입력해 주십시오.",
-    "message.zone.step.3.desc": "새 Pod를 추가하기 위해 아래 정보를 입력해 주십시오.",
-    "message.zoneWizard.enable.local.storage": "WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:<br/><br/>1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.<br/><br/>2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.<br/><br/><br/>Would you like to continue?",
-    "messgae.validate.min": "Please enter a value greater than or equal to {0}.",
-    "mode": "모드",
-    "network.rate": "네트워크 속도",
-    "notification.reboot.instance": "인스턴스 재시작",
-    "notification.start.instance": "인스턴스 시작",
-    "notification.stop.instance": "인스턴스 정지",
-    "side.by.side": "병렬",
-    "state.Accepted": "승인 완료",
-    "state.Active": "활성",
-    "state.Allocated": "할당 끝난 상태",
-    "state.Allocating": "할당 중",
-    "state.BackedUp": "백업 완료",
-    "state.BackingUp": "백업 중",
-    "state.Completed": "완료",
-    "state.Creating": "생성 중",
-    "state.Declined": "거절",
-    "state.Destroyed": "파기된 상태",
-    "state.Disabled": "유효하지 않은",
-    "state.Enabled": "사용함",
-    "state.Error": "오류",
-    "state.Expunging": "제거 중",
-    "state.Migrating": "이전 중",
-    "state.Pending": "보류",
-    "state.Ready": "준비 완료",
-    "state.Running": "실행 중",
-    "state.Starting": "시작 중",
-    "state.Stopped": "정지된 상태",
-    "state.Stopping": "정지하고 있는 중",
-    "state.Suspended": "일시정지",
-    "state.detached": "Detached",
-    "title.upload.volume": "Upload Volume",
-    "ui.listView.filters.all": "모두",
-    "ui.listView.filters.mine": "내 정보만"
-};
diff --git a/ui/legacy/l10n/nb_NO.js b/ui/legacy/l10n/nb_NO.js
deleted file mode 100644
index ce3a257..0000000
--- a/ui/legacy/l10n/nb_NO.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP-kode",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP-type",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Endrede egenskaper",
-    "confirm.enable.s3": "Vennligst fyll inn følgende informasjon for å aktivere støtte for S3-støttet sekundærlagring",
-    "confirm.enable.swift": "Vennligst fyll inn følgende informasjon for å aktivere støtte for Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Feil kunne ikke bytte ditt passord fordi LDAP er aktivert.",
-    "error.could.not.enable.zone": "Kunne ikke aktivere sonen",
-    "error.installWizard.message": "Noe gikk galt. Gå tilbake og korriger feilene.",
-    "error.invalid.username.password": "Ugyldig brukernavn eller passord",
-    "error.login": "Ditt brukernavn/passord stemmer ikke overens med våre opplysninger.",
-    "error.menu.select": "Kan ikke utføre handlingen grunnet ingen valgte elementer.",
-    "error.mgmt.server.inaccessible": "Administrasjonsserver er utilgjengelig. Vennligst prøv igjen senere.",
-    "error.password.not.match": "Passordfeltene sammensvarer ikke",
-    "error.please.specify.physical.network.tags": "Nettverkstilbud er ikke tilgjengelig før du spesifiserer knagger for dette fysiske nettverket.",
-    "error.session.expired": "Din sesjon har utløpt.",
-    "error.something.went.wrong.please.correct.the.following": "Noe gikk galt. Vennligst korrigér følgende",
-    "error.unable.to.reach.management.server": "Kan ikke oppnå kontakt med administrasjonsserveren",
-    "error.unresolved.internet.name": "Ditt internettnavn kan ikke løses.",
-    "force.delete": "Tving sletting",
-    "force.delete.domain.warning": "Advarsel: dette alternativet vil medføre at alle underdomener og alle assosierte kontoer og dere resurser blir slettet.",
-    "force.remove": "Tving fjerning",
-    "force.remove.host.warning": "Advarsel: ved valg av dette alternativet vil CloudStack stoppe alle kjørende virtuelle maskiner, før verten blir fjernet fra klyngen.",
-    "force.stop": "Tving stopp",
-    "force.stop.instance.warning": "Advarsel: Å tvinge en stopp av denne instansen bør være siste utvei. Det kan føre til tap av data og ukonsistent oppførsel av virtuell maskinstatus.",
-    "hint.no.host.tags": "Ingen hosttagger funnet",
-    "hint.no.storage.tags": "Ingen lagringstagger funnet",
-    "hint.type.part.host.tag": "Skriv inn deler av hosttagg",
-    "hint.type.part.storage.tag": "Skriv inn deler av lagringstagg",
-    "image.directory": "Bilde-katalog",
-    "inline": "I Rekke",
-    "instances.actions.reboot.label": "Omstart av instans",
-    "label.CIDR.list": "CIDR liste",
-    "label.CIDR.of.destination.network": "CIDR for destinasjonsnettverk",
-    "label.CPU.cap": "CPU begrensning",
-    "label.DHCP.server.type": "DHCP servertype",
-    "label.DNS.domain.for.guest.networks": "DNS domene for gjestenettverk",
-    "label.ESP.encryption": "ESP kryptering",
-    "label.ESP.hash": "ESP hash",
-    "label.ESP.lifetime": "ESP levetid (sekund)",
-    "label.ESP.policy": "ESP policy",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE kryptering",
-    "label.IKE.hash": "IKE Hash",
-    "label.IKE.lifetime": "IKE livstid (sekunder)",
-    "label.IKE.policy": "IKE policy",
-    "label.IPsec.preshared.key": "IPSec Delt Nøkkel",
-    "label.LB.isolation": "LB-isolering",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto logg profil",
-    "label.PA.threat.profile": "Palo Alto trussel profil",
-    "label.PING.CIFS.password": "PING CIFS passord",
-    "label.PING.CIFS.username": "PING CIFS brukernavn",
-    "label.PING.dir": "PING-mappe",
-    "label.PING.storage.IP": "PING lagrings-IP",
-    "label.PreSetup": "Forberedt Konfigurasjon",
-    "label.Pxe.server.type": "PXE Servertype",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNM Port",
-    "label.SR.name": "SR navnelapp",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP-mappe",
-    "label.VMFS.datastore": "VMFS lagringsområde",
-    "label.VMs.in.tier": "VMer i VPC-gren",
-    "label.VPC.limits": "VPC begrensninger",
-    "label.VPC.router.details": "VPC ruterdetaljer",
-    "label.VPN.connection": "VPN-tilkobling",
-    "label.VPN.customer.gateway": "VPN Kundegateway",
-    "label.VPN.gateway": "VPN Gateway",
-    "label.Xenserver.Tools.Version61plus": "Original XS versjon er 6.1+",
-    "label.about": "Om",
-    "label.about.app": "Om CloudStack",
-    "label.accept.project.invitation": "Aksepter prosjektinvitasjon",
-    "label.account": "Konto",
-    "label.account.and.security.group": "Konto, Sikkerhetsgruppe",
-    "label.account.details": "Kontodetaljer",
-    "label.account.id": "Konto ID",
-    "label.account.lower": "konto",
-    "label.account.name": "Kontonavn",
-    "label.account.specific": "Kontospesifikk",
-    "label.account.type": "Kontotype",
-    "label.accounts": "Kontoer",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL Liste Regler",
-    "label.acl.name": "ACL Navn",
-    "label.acl.replaced": "ACL erstattet",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Tilegne ny IP",
-    "label.acquire.new.secondary.ip": "Tilegne ny sekundær IP",
-    "label.action": "Handling",
-    "label.action.attach.disk": "Tilknytt Disk",
-    "label.action.attach.disk.processing": "Tilknytter Disk....",
-    "label.action.attach.iso": "Tilknytt ISO",
-    "label.action.attach.iso.processing": "Tilknytter ISO....",
-    "label.action.cancel.maintenance.mode": "Avbryt vedlikeholdsmodus",
-    "label.action.cancel.maintenance.mode.processing": "Avbryter vedlikeholdsmodus....",
-    "label.action.change.password": "Endre passord",
-    "label.action.change.service": "Endre Tjeneste",
-    "label.action.change.service.processing": "Endrer Tjeneste....",
-    "label.action.configure.samlauthorization": "Konfigurer SAML SSO-autorisering",
-    "label.action.copy.ISO": "Kopier ISO",
-    "label.action.copy.ISO.processing": "Kopierer ISO....",
-    "label.action.copy.template": "Kopier mal",
-    "label.action.copy.template.processing": "Kopierer øyeblikksbilde....",
-    "label.action.create.template": "Opprett mal",
-    "label.action.create.template.from.vm": "Lag Mal fra VM",
-    "label.action.create.template.from.volume": "Lag Mal fra Volum",
-    "label.action.create.template.processing": "Oppretter mal....",
-    "label.action.create.vm": "Opprett VM",
-    "label.action.create.vm.processing": "Oppretter VM....",
-    "label.action.create.volume": "Opprett volum",
-    "label.action.create.volume.processing": "Oppretter volum....",
-    "label.action.delete.IP.range": "Slett IP-rekke",
-    "label.action.delete.IP.range.processing": "Sletter IP-rekke....",
-    "label.action.delete.ISO": "Slett ISO",
-    "label.action.delete.ISO.processing": "Sletter ISO....",
-    "label.action.delete.account": "Slett konto",
-    "label.action.delete.account.processing": "Sletter konto....",
-    "label.action.delete.cluster": "Slett klynge",
-    "label.action.delete.cluster.processing": "Sletter klynge....",
-    "label.action.delete.disk.offering": "Slett disktilbud",
-    "label.action.delete.disk.offering.processing": "Sletter disktilbud....",
-    "label.action.delete.domain": "Slett domene",
-    "label.action.delete.domain.processing": "Sletter domene....",
-    "label.action.delete.firewall": "Slett brannmurregel",
-    "label.action.delete.firewall.processing": "Sletter brannmur....",
-    "label.action.delete.ingress.rule": "Slett inngående regel",
-    "label.action.delete.ingress.rule.processing": "Sletter inngående regel....",
-    "label.action.delete.load.balancer": "Slett lastbalanseringsregel",
-    "label.action.delete.load.balancer.processing": "Sletter Lastbalanserer",
-    "label.action.delete.network": "Slett nettverk",
-    "label.action.delete.network.processing": "Sletter nettverk....",
-    "label.action.delete.nexusVswitch": "Slett Nexus 1000v",
-    "label.action.delete.nic": "Fjern NIC",
-    "label.action.delete.physical.network": "Slett fysisk nettverk",
-    "label.action.delete.pod": "Slett pod",
-    "label.action.delete.pod.processing": "Sletter pod....",
-    "label.action.delete.primary.storage": "Slett primærlagring",
-    "label.action.delete.primary.storage.processing": "Sletter primærlagring....",
-    "label.action.delete.secondary.storage": "Slett sekundærlagring",
-    "label.action.delete.secondary.storage.processing": "Sletter sekundærlagring....",
-    "label.action.delete.security.group": "Slett Sikkerhetsgruppe",
-    "label.action.delete.security.group.processing": "Slett Sikkerhetsgruppe....",
-    "label.action.delete.service.offering": "Slett tjenestetilbud",
-    "label.action.delete.service.offering.processing": "Sletter tjenestetilbud....",
-    "label.action.delete.snapshot": "Slett øyeblikksbilde",
-    "label.action.delete.snapshot.processing": "Sletter øyeblikksbilde....",
-    "label.action.delete.system.service.offering": "Slett system-tjenestetilbud",
-    "label.action.delete.template": "Slett mal",
-    "label.action.delete.template.processing": "Sletter mal....",
-    "label.action.delete.user": "Slett bruker",
-    "label.action.delete.user.processing": "Sletter bruker....",
-    "label.action.delete.volume": "Slett volum",
-    "label.action.delete.volume.processing": "Sletter volum....",
-    "label.action.delete.zone": "Slett sone",
-    "label.action.delete.zone.processing": "Sletter sone....",
-    "label.action.destroy.instance": "Ødelegg Instans",
-    "label.action.destroy.instance.processing": "Ødelegger instans....",
-    "label.action.destroy.systemvm": "Slett system VM",
-    "label.action.destroy.systemvm.processing": "Sletter system VM....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Frakoble disk",
-    "label.action.detach.disk.processing": "Kobler fra disk....",
-    "label.action.detach.iso": "Frakoble ISO",
-    "label.action.detach.iso.processing": "Frakobler ISO....",
-    "label.action.disable.account": "Deaktiver konto",
-    "label.action.disable.account.processing": "Deaktiverer konto....",
-    "label.action.disable.cluster": "Deaktiver klyngen",
-    "label.action.disable.cluster.processing": "Deaktiverer klyngen...",
-    "label.action.disable.nexusVswitch": "Deaktiver Nexus 1000v",
-    "label.action.disable.physical.network": "Deaktiver fysisk nettverk",
-    "label.action.disable.pod": "Deaktiver pod",
-    "label.action.disable.pod.processing": "Deaktiverer pod...",
-    "label.action.disable.static.NAT": "Deaktiver statisk NAT",
-    "label.action.disable.static.NAT.processing": "Deaktiverer statisk NAT....",
-    "label.action.disable.user": "Deaktivert bruker",
-    "label.action.disable.user.processing": "Deaktiverer bruker....",
-    "label.action.disable.zone": "Deaktiver sonen",
-    "label.action.disable.zone.processing": "Deaktiverer sonen...",
-    "label.action.download.ISO": "Last ned ISO",
-    "label.action.download.template": "Laster ned mal",
-    "label.action.download.volume": "Last ned volum",
-    "label.action.download.volume.processing": "Laster ned volum....",
-    "label.action.edit.ISO": "Rediger ISO",
-    "label.action.edit.account": "Rediger konto",
-    "label.action.edit.disk.offering": "Editer disktilbud",
-    "label.action.edit.domain": "Editer domene",
-    "label.action.edit.global.setting": "Editer global innstilling",
-    "label.action.edit.host": "Editer vert",
-    "label.action.edit.instance": "Rediger instans",
-    "label.action.edit.network": "Editer Nettverk",
-    "label.action.edit.network.offering": "Editer nettverkstilbud",
-    "label.action.edit.network.processing": "Editerer Nettverk....",
-    "label.action.edit.pod": "Editer Pod",
-    "label.action.edit.primary.storage": "Editer Primærlagring",
-    "label.action.edit.resource.limits": "Rediger ressursbegrensninger",
-    "label.action.edit.service.offering": "Editer tjenestetilbud",
-    "label.action.edit.template": "Editer mal",
-    "label.action.edit.user": "Rediger bruker",
-    "label.action.edit.zone": "Rediger Sone",
-    "label.action.enable.account": "Aktiver konto",
-    "label.action.enable.account.processing": "Aktiverer konto....",
-    "label.action.enable.cluster": "Aktiver klynge",
-    "label.action.enable.cluster.processing": "Aktiverer klyngen...",
-    "label.action.enable.maintenance.mode": "Aktiver vedlikeholdsmodus",
-    "label.action.enable.maintenance.mode.processing": "Aktiver vedlikeholdsmodus...",
-    "label.action.enable.nexusVswitch": "Aktiver Nexus 1000v",
-    "label.action.enable.physical.network": "Aktiver fysisk nettverk",
-    "label.action.enable.pod": "Aktiver pod",
-    "label.action.enable.pod.processing": "Aktiverer pod...",
-    "label.action.enable.static.NAT": "Aktiver statisk NAT",
-    "label.action.enable.static.NAT.processing": "Aktiverer statisk NAT....",
-    "label.action.enable.user": "Aktiver Bruker",
-    "label.action.enable.user.processing": "Aktiverer Bruker....",
-    "label.action.enable.zone": "Aktiver sone",
-    "label.action.enable.zone.processing": "Aktiverer sone...",
-    "label.action.expunge.instance": "Slett Instans Permanent",
-    "label.action.expunge.instance.processing": "Sletter instans....",
-    "label.action.force.reconnect": "Tving ny tilkobling",
-    "label.action.force.reconnect.processing": "Kobler til på nytt....",
-    "label.action.generate.keys": "Generer nøkler",
-    "label.action.generate.keys.processing": "Genererer nøkler....",
-    "label.action.list.nexusVswitch": "Liste Nexus 1000v",
-    "label.action.lock.account": "Lås konto",
-    "label.action.lock.account.processing": "Låser konto....",
-    "label.action.manage.cluster": "Administrer klynge",
-    "label.action.manage.cluster.processing": "Administrerer klynge....",
-    "label.action.migrate.instance": "Migrer Instans",
-    "label.action.migrate.instance.processing": "Migrerer Instans....",
-    "label.action.migrate.router": "Migrer ruter",
-    "label.action.migrate.router.processing": "Migrerer Ruter....",
-    "label.action.migrate.systemvm": "Migrer System VM",
-    "label.action.migrate.systemvm.processing": "Migrerer System VM....",
-    "label.action.reboot.instance": "Omstart Instans",
-    "label.action.reboot.instance.processing": "Starter om Instans....",
-    "label.action.reboot.router": "Omstart Ruter",
-    "label.action.reboot.router.processing": "Omstaer Instans....",
-    "label.action.reboot.systemvm": "Omstart System VM",
-    "label.action.reboot.systemvm.processing": "Omstarter System VM",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Gjentagende øyeblikksbilder",
-    "label.action.register.iso": "Registrer ISO",
-    "label.action.register.template": "Registrer mal fra en URL",
-    "label.action.release.ip": "Frigjør IP",
-    "label.action.release.ip.processing": "Frigjør IP-adresse....",
-    "label.action.remove.host": "Fjern Vert",
-    "label.action.remove.host.processing": "Fjerner Vert....",
-    "label.action.reset.password": "Tilbakestill passord",
-    "label.action.reset.password.processing": "Tilbakestiller passord....",
-    "label.action.resize.volume": "Endre størrelse på volum",
-    "label.action.resize.volume.processing": "Endrer størrelse på volum....",
-    "label.action.resource.limits": "Ressursbegrensninger",
-    "label.action.restore.instance": "Gjenopprett Instans",
-    "label.action.restore.instance.processing": "Gjenoppretter Instans....",
-    "label.action.revert.snapshot": "Tilbakestill til øyeblikksbilde",
-    "label.action.revert.snapshot.processing": "Tilbakestiller til øyeblikksbilde....",
-    "label.action.start.instance": "Start instans",
-    "label.action.start.instance.processing": "Starter instans....",
-    "label.action.start.router": "Start ruter",
-    "label.action.start.router.processing": "Stopper ruter",
-    "label.action.start.systemvm": "Start System VM",
-    "label.action.start.systemvm.processing": "Starter System VM....",
-    "label.action.stop.instance": "Stopp instans",
-    "label.action.stop.instance.processing": "Stopper instans....",
-    "label.action.stop.router": "Stopp ruter",
-    "label.action.stop.router.processing": "Stopper ruter....",
-    "label.action.stop.systemvm": "Stopp System VM",
-    "label.action.stop.systemvm.processing": "Stopper System VM....",
-    "label.action.take.snapshot": "Ta øyeblikksbilde",
-    "label.action.take.snapshot.processing": "Tar øyeblikksbilde....",
-    "label.action.unmanage.cluster": "Fjern administrasjon av klynge",
-    "label.action.unmanage.cluster.processing": "Fjerner administrasjon av klynge...",
-    "label.action.update.OS.preference": "Oppdater OS-preferanser",
-    "label.action.update.OS.preference.processing": "Oppdaterer OS-preferanser.....",
-    "label.action.update.resource.count": "Oppdater resurs oversikt",
-    "label.action.update.resource.count.processing": "Oppdaterer resurs oversikt",
-    "label.action.vmsnapshot.create": "Ta VM øyeblikksbilde",
-    "label.action.vmsnapshot.delete": "Slett VM øyeblikksbilde",
-    "label.action.vmsnapshot.revert": "Tilbakestill til maskinøyeblikksbilde",
-    "label.actions": "Handlinger",
-    "label.activate.project": "Aktiver prosjekt",
-    "label.active.sessions": "Aktive sesjoner",
-    "label.add": "Legg til",
-    "label.add.ACL": "Legg til ACL",
-    "label.add.BigSwitchBcf.device": "Legg til BigSwitch BCF kontroller",
-    "label.add.BrocadeVcs.device": "Legg til Brocade VCS Svitsj",
-    "label.add.F5.device": "Legg til F5 enhet",
-    "label.add.LDAP.account": "Legg til LDAP-konto",
-    "label.add.NiciraNvp.device": "Legg til Nvp kontroller",
-    "label.add.OpenDaylight.device": "Legg til OpenDayLight kontroller",
-    "label.add.PA.device": "Legg til Palo Alto enhet",
-    "label.add.SRX.device": "Legg til SRX enhet",
-    "label.add.VM.to.tier": "Legg VM til VPC-gren",
-    "label.add.VPN.gateway": "Legg til VPN Gateway",
-    "label.add.account": "Legg til konto",
-    "label.add.account.to.project": "Legg kontoen til prosjektet",
-    "label.add.accounts": "Legg til kontoer",
-    "label.add.accounts.to": "Legg kontoer til",
-    "label.add.acl.list": "Legg til ACL liste",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Legg til affinitetsgruppe",
-    "label.add.baremetal.dhcp.device": "Legg Til Barmetall DHCP Enhet",
-    "label.add.baremetal.rack.configuration": "Legg Til Barmetall Rack Konfigurering",
-    "label.add.by": "Legg til ved",
-    "label.add.by.cidr": "Legg til med CIDR",
-    "label.add.by.group": "Legg til med gruppe",
-    "label.add.ciscoASA1000v": "Legg til CiscoASA1000v Resurs",
-    "label.add.cluster": "Legg til klynge",
-    "label.add.compute.offering": "Legg til systemtilbud",
-    "label.add.direct.iprange": "Legg til direkte IP-rekke",
-    "label.add.disk.offering": "Legg til disktilbud",
-    "label.add.domain": "Legg til domene",
-    "label.add.egress.rule": "Legg til egress regel",
-    "label.add.firewall": "Legg til brannmurregel",
-    "label.add.globo.dns": "legg til GloboDNS",
-    "label.add.gslb": "Legg til GSLB",
-    "label.add.guest.network": "Legg til gjestenettverk",
-    "label.add.host": "Legg til vert",
-    "label.add.ingress.rule": "Legg til ingressregel",
-    "label.add.intermediate.certificate": "Legg til intermediate sertifikat",
-    "label.add.internal.lb": "Legg til intern LB",
-    "label.add.ip.range": "Legg til IP-rekke",
-    "label.add.isolated.guest.network": "Legg til Isolert gjestenettverk",
-    "label.add.isolated.guest.network.with.sourcenat": "Legg til isolert gjestenettverk med kilde-NAT",
-    "label.add.isolated.network": "Legg Til Isolert Nettverk",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Legg til LDAP-konto",
-    "label.add.list.name": "ACL listenavn",
-    "label.add.load.balancer": "Legg til lastbalanserer",
-    "label.add.more": "Legg til mer",
-    "label.add.netScaler.device": "Legg til Netscaler enhet",
-    "label.add.network": "Legg til nettverk",
-    "label.add.network.ACL": "Legg til nettverk ACL",
-    "label.add.network.acl.list": "Legg til nettverk ACL liste",
-    "label.add.network.device": "Legg til nettverksenhet",
-    "label.add.network.offering": "Legg til nettverkstilbud",
-    "label.add.new.F5": "Legg til ny F5",
-    "label.add.new.NetScaler": "Legg til ny NetScaler",
-    "label.add.new.PA": "Legg til ny Palo Alto",
-    "label.add.new.SRX": "Legg til ny SRX",
-    "label.add.new.gateway": "Legg til ny gateway",
-    "label.add.new.tier": "Legg til ny gren",
-    "label.add.nfs.secondary.staging.store": "Legg Til NFS sekundærmellomlagringsområde",
-    "label.add.physical.network": "Legg til fysisk nettverk",
-    "label.add.pod": "Legg til pod",
-    "label.add.port.forwarding.rule": "Legg til portvideresendingsregel",
-    "label.add.portable.ip.range": "Legg til portabel IP-rekke",
-    "label.add.primary.storage": "Legg til primærlagring",
-    "label.add.private.gateway": "Legg til privat gateway",
-    "label.add.region": "Legg til region",
-    "label.add.resources": "Legg til ressurser",
-    "label.add.role": "Add Role",
-    "label.add.route": "Legg til rute",
-    "label.add.rule": "Legg til regel",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Legg til sekundærlagring",
-    "label.add.security.group": "Legg til sikkerhetsgruppe",
-    "label.add.service.offering": "Legg til tjenestetilbud",
-    "label.add.static.nat.rule": "Legg til statisk NAT-regel",
-    "label.add.static.route": "Legg til statisk rute",
-    "label.add.system.service.offering": "Legg til et systemtilbud",
-    "label.add.template": "Legg til mal",
-    "label.add.to.group": "Legg til gruppe",
-    "label.add.ucs.manager": "Legg Til UCS Manager",
-    "label.add.user": "Legg til bruker",
-    "label.add.userdata": "Brukerdata",
-    "label.add.vlan": "Legg til VLAN",
-    "label.add.vm": "Legg til VM",
-    "label.add.vms": "Legg til VMer",
-    "label.add.vms.to.lb": "Legg til VM(er) til lastbalanseringsregel",
-    "label.add.vmware.datacenter": "Legg til VMware datasenter",
-    "label.add.vnmc.device": "Legg til VNMC enhet",
-    "label.add.vnmc.provider": "Legg til VNMC tilbyder",
-    "label.add.volume": "Legg til volum",
-    "label.add.vpc": "Legg til VPC",
-    "label.add.vpc.offering": "Legg til VPC tilbud",
-    "label.add.vpn.customer.gateway": "Legg til VPN Kundegateway",
-    "label.add.vpn.user": "Legg til VPN-bruker",
-    "label.add.vxlan": "Legg til VXLAN",
-    "label.add.zone": "Legg til sone",
-    "label.added.brocade.vcs.switch": "Ny Brocade Vcs svitsj lagt til",
-    "label.added.network.offering": "La til nettverkstilbud",
-    "label.added.new.bigswitch.bcf.controller": "La til ny BigSwitch BCF kontroller",
-    "label.added.nicira.nvp.controller": "La til ny Nicira NVP-kontroller",
-    "label.addes.new.f5": "La til ny F5",
-    "label.adding": "Tillegger",
-    "label.adding.cluster": "Legger til klynge",
-    "label.adding.failed": "Tillegging feilet",
-    "label.adding.pod": "Legger til pod",
-    "label.adding.processing": "Legger til",
-    "label.adding.succeeded": "Tillegging vellykket",
-    "label.adding.user": "Legger til bruker",
-    "label.adding.zone": "Legger til sone",
-    "label.additional.networks": "Ekstra nettverk",
-    "label.admin": "Admin",
-    "label.admin.accounts": "Adminkontoer",
-    "label.advanced": "Avansert",
-    "label.advanced.mode": "Avansermodus",
-    "label.advanced.search": "Avansert søk",
-    "label.affinity": "Affinitet",
-    "label.affinity.group": "Affinitetsgruppe",
-    "label.affinity.groups": "Affinitetsgrupper",
-    "label.agent.password": "Agentpassord",
-    "label.agent.port": "Agentport",
-    "label.agent.state": "Agentstatus",
-    "label.agent.username": "Agentbrukernavn",
-    "label.agree": "Godtar",
-    "label.alert": "Varsel",
-    "label.alert.archived": "Varsel arkivert",
-    "label.alert.deleted": "Varsel slettet",
-    "label.alert.details": "Varseldetaljer",
-    "label.algorithm": "Algoritme",
-    "label.allocated": "Allokert",
-    "label.allocation.state": "Allokeringsstatus",
-    "label.allow": "Tillat",
-    "label.anti.affinity": "Anti-affinitet",
-    "label.anti.affinity.group": "Anti-affinitetsgruppe",
-    "label.anti.affinity.groups": "Anti-affinitetsgrupper",
-    "label.api.key": "API-nøkkel",
-    "label.api.version": "API Versjon",
-    "label.app.name": "CloudStack",
-    "label.apply": "Bruk",
-    "label.archive": "Arkiv",
-    "label.archive.alerts": "Arkiver varsler",
-    "label.archive.events": "Arkiver hendelser",
-    "label.assign": "Tildel",
-    "label.assign.instance.another": "Tildel instans til en annen konto",
-    "label.assign.to.load.balancer": "Legg til instans til lastbalanserer",
-    "label.assign.vms": "Tildel VMer",
-    "label.assigned.vms": "Tildelte VMer",
-    "label.associate.public.ip": "Assosiert Offentlig IP-adresse",
-    "label.associated.network": "Assosiert nettverk",
-    "label.associated.network.id": "Assosiert nettverksid",
-    "label.associated.profile": "Assosiert Profil",
-    "label.attached.iso": "Tilknyttet ISO",
-    "label.author.email": "Forfatter e-post",
-    "label.author.name": "Forfatternavn",
-    "label.autoscale": "Autoskaler",
-    "label.autoscale.configuration.wizard": "Autoskalering konfigurasjonsveiviser",
-    "label.availability": "Tilgjengelighet",
-    "label.availability.zone": "Tilgjengelighetssone",
-    "label.availabilityZone": "tilgjengelighetssone",
-    "label.available": "Tilgjengelig",
-    "label.available.public.ips": "Tilgjengelig offentlige IP-adresser",
-    "label.back": "Tilbake",
-    "label.bandwidth": "Båndbredde",
-    "label.baremetal.dhcp.devices": "Barmetall DHCP Enheter",
-    "label.baremetal.dhcp.provider": "Barmetall DHCP Tilbyder",
-    "label.baremetal.pxe.device": "Legg Til Barmetall PXE Enhet",
-    "label.baremetal.pxe.devices": "Barmetall PXE Enheter",
-    "label.baremetal.pxe.provider": "Barmetall PXE Tilbyder",
-    "label.baremetal.rack.configuration": "Barmetall Rack Konfigurering",
-    "label.basic": "Basis",
-    "label.basic.mode": "Basismodus",
-    "label.bigswitch.bcf.details": "BigSwitch BCF detaljer",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT aktivert",
-    "label.bigswitch.controller.address": "BigSwitch BCF kontrolleradresse",
-    "label.blade.id": "Blad-ID",
-    "label.blades": "Blad",
-    "label.bootable": "Botbar",
-    "label.broadcast.domain.range": "Kringkastings domene rekke",
-    "label.broadcast.domain.type": "Kringkastings Domene Type",
-    "label.broadcast.uri": "Kringkastings URI",
-    "label.broadcasturi": "kringkastinguri",
-    "label.broadcat.uri": "Kringkastings URI",
-    "label.brocade.vcs.address": "Vcs Switch Addresse",
-    "label.brocade.vcs.details": "Brocade Vcs svitsj detaljer",
-    "label.by.account": "Etter Konto",
-    "label.by.alert.type": "Etter varseltype",
-    "label.by.availability": "Etter Tilgjengelighet",
-    "label.by.date.end": "Etter dato (slutt)",
-    "label.by.date.start": "Etter dato (start)",
-    "label.by.domain": "Etter Domene",
-    "label.by.end.date": "Etter sluttdato",
-    "label.by.event.type": "Etter hendelsestype",
-    "label.by.level": "Etter nivå",
-    "label.by.pod": "Etter Pod",
-    "label.by.role": "Etter Rolle",
-    "label.by.start.date": "Etter Startdato",
-    "label.by.state": "Etter tilstand",
-    "label.by.traffic.type": "Etter Trafikktype",
-    "label.by.type": "Etter Type",
-    "label.by.type.id": "Etter Type ID",
-    "label.by.zone": "Etter Sone",
-    "label.bytes.received": "Bytes Mottatt",
-    "label.bytes.sent": "Bytes sendt",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "Avbryt",
-    "label.capacity": "Kapasitet",
-    "label.capacity.bytes": "Kapasitet Bytes",
-    "label.capacity.iops": "Kapasitet IOPS",
-    "label.certificate": "Sertifikat",
-    "label.change.affinity": "Endre affinitet",
-    "label.change.ipaddress": "Endre IP-adresse for nettverkskort",
-    "label.change.service.offering": "Endre tjenestetilbud",
-    "label.change.value": "Endre verdi",
-    "label.character": "Karakter",
-    "label.chassis": "Kasse",
-    "label.checksum": "sjekksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR eller konto/sikkerhetsgruppe",
-    "label.cidr.list": "Kilde-CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Addresse",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Passord",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Brukernavn",
-    "label.ciscovnmc.resource.details": "CiscoVNMC ressursdetaljer",
-    "label.clean.up": "Rydd opp",
-    "label.clear.list": "Tøm liste",
-    "label.close": "Lukk",
-    "label.cloud.console": "Cloud",
-    "label.cloud.managed": "Forvaltet Av Cloud.com",
-    "label.cluster": "Klynge",
-    "label.cluster.name": "Klyngenavn",
-    "label.cluster.type": "Klyngetype",
-    "label.clusters": "Klynger",
-    "label.clvm": "CLVM",
-    "label.code": "Kode",
-    "label.community": "Fellesskap",
-    "label.compute": "Beregne",
-    "label.compute.and.storage": "Regnekraft og lagring",
-    "label.compute.offering": "Regnekraftstilbud",
-    "label.compute.offerings": "Regnekraftstilbud",
-    "label.configuration": "Konfigurering",
-    "label.configure": "Konfigurer",
-    "label.configure.ldap": "Konfigurer LDAP",
-    "label.configure.network.ACLs": "Konfigurer Nettverksaksesslister",
-    "label.configure.sticky.policy": "Konfigurer Sticky Policy",
-    "label.configure.vpc": "Konfigurer VPC",
-    "label.confirm.password": "Bekreft passord",
-    "label.confirmation": "Bekreftelse",
-    "label.congratulations": "Gratulerer!",
-    "label.conserve.mode": "Konserveringsmodus",
-    "label.console.proxy": "Konsollproxy",
-    "label.console.proxy.vm": "Konsollproxy VM",
-    "label.continue": "Fortsett",
-    "label.continue.basic.install": "Fortsett med enkelt oppsett",
-    "label.copying.iso": "Kopierer ISO",
-    "label.corrections.saved": "Endringer lagret",
-    "label.counter": "Teller",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU allokert",
-    "label.cpu.allocated.for.VMs": "CPU Allokert for VMer",
-    "label.cpu.limits": "CPU-begrensninger",
-    "label.cpu.mhz": "CPU (i MHz)",
-    "label.cpu.utilized": "CPU-utnyttelse",
-    "label.create.VPN.connection": "Opprett VPN-tilkobling",
-    "label.create.nfs.secondary.staging.storage": "Legg Til NFS sekundærmellomlagringsområde",
-    "label.create.nfs.secondary.staging.store": "Opprett NFS sekundærmellomlagringsområde",
-    "label.create.project": "Opprett prosjekt",
-    "label.create.ssh.key.pair": "Lag SSH-nøkkelpar",
-    "label.create.template": "Opprett mal",
-    "label.created": "Opprettet",
-    "label.created.by.system": "Opprettet av systemet",
-    "label.cross.zones": "Kryssoner",
-    "label.custom": "Tilpasset",
-    "label.custom.disk.iops": "Tilpasset IOPS",
-    "label.custom.disk.offering": "Brukertilpasset disktilbud",
-    "label.custom.disk.size": "Tilpasset Diskstørrelse",
-    "label.daily": "Daglig",
-    "label.data.disk.offering": "Datadisktilbud",
-    "label.date": "Dato",
-    "label.day": "Dag",
-    "label.day.of.month": "Dag i måned",
-    "label.day.of.week": "Dag i uke",
-    "label.dc.name": "Datasenter Navn",
-    "label.dead.peer.detection": "Død endepunkt-deteksjon",
-    "label.decline.invitation": "Avvis invitasjon",
-    "label.dedicate": "Dediker",
-    "label.dedicate.cluster": "Dediker kluster",
-    "label.dedicate.host": "Dediker host",
-    "label.dedicate.pod": "Dedikert pod",
-    "label.dedicate.vlan.vni.range": "Dedikert VLAN/VNI Rekke",
-    "label.dedicate.zone": "Dediker sone",
-    "label.dedicated": "Dedikert",
-    "label.dedicated.vlan.vni.ranges": "Dedikerte VLAN/VNI Rekker",
-    "label.default": "Standardverdi",
-    "label.default.egress.policy": "Egress standard policy",
-    "label.default.use": "Standard bruk",
-    "label.default.view": "Standardvisning",
-    "label.delete": "Slett",
-    "label.delete.BigSwitchBcf": "Fjern BigSwitch BCF-kontroller",
-    "label.delete.BrocadeVcs": "Fjern Brocade VCS-svitsj",
-    "label.delete.F5": "Slett F5",
-    "label.delete.NetScaler": "Slett Netscaler",
-    "label.delete.NiciraNvp": "Fjern Nvp-kontroller",
-    "label.delete.OpenDaylight.device": "Fjern OpenDaylight kontroller",
-    "label.delete.PA": "Slett Palo Alto",
-    "label.delete.SRX": "Slett SRX",
-    "label.delete.VPN.connection": "Slett VPN-tilkobling",
-    "label.delete.VPN.customer.gateway": "Slett VPN-kundegateway",
-    "label.delete.VPN.gateway": "Slett VPN-gateway",
-    "label.delete.acl.list": "Slett ACL liste",
-    "label.delete.affinity.group": "Slett affinitetsgruppe",
-    "label.delete.alerts": "Slette varsler",
-    "label.delete.baremetal.rack.configuration": "Slett Barmetall Rack Konfigurering",
-    "label.delete.ciscoASA1000v": "Slett CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Slett CiscoVNMC ressurs",
-    "label.delete.events": "Slett hendelser",
-    "label.delete.gateway": "slett gateway",
-    "label.delete.internal.lb": "Slett intern LB",
-    "label.delete.portable.ip.range": "Slett portabel IP-rekke",
-    "label.delete.profile": "Slett Profil",
-    "label.delete.project": "Slett prosjekt",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Slett NFS sekundærmellomlagringsområde",
-    "label.delete.ucs.manager": "Slett UCS Manager",
-    "label.delete.vpn.user": "Slett VPN-bruker",
-    "label.deleting.failed": "Sletting feilet",
-    "label.deleting.processing": "Sletter....",
-    "label.deny": "Nekt",
-    "label.deployment.planner": "utbyggings planlegger",
-    "label.description": "Beskrivelse",
-    "label.destination.physical.network.id": "Fysisk nettverksid-destinasjon",
-    "label.destination.zone": "Destinasjonssone",
-    "label.destroy": "Destruer",
-    "label.destroy.router": "Slett ruter",
-    "label.destroy.vm.graceperiod": "Ødelegg VM ventetid",
-    "label.detaching.disk": "Kobler fra disk",
-    "label.details": "Detaljer",
-    "label.device.id": "Enhets ID",
-    "label.devices": "Enheter",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direkte Tilknyttet Offentlig IP-adresse",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Deltnettverk-IPadresser",
-    "label.disable.autoscale": "Deaktiver autoskalering",
-    "label.disable.host": "Deaktiver host",
-    "label.disable.network.offering": "Deaktiver nettverkstilbud",
-    "label.disable.provider": "Deaktiver tilbyder",
-    "label.disable.vnmc.provider": "Deatkivert VNMC tilbyder",
-    "label.disable.vpc.offering": "Deaktivert VPC tilbud",
-    "label.disable.vpn": "Dekativer VPN",
-    "label.disabled": "Inaktiv",
-    "label.disabling.vpn.access": "Deaktiverer VPN Tilgang",
-    "label.disassociate.profile.blade": "Deassosier profil fra Blade",
-    "label.disbale.vnmc.device": "Deaktivert VNMC enhet",
-    "label.disk.allocated": "Disk allokert",
-    "label.disk.bytes.read.rate": "Disklesehastighet (BPS)",
-    "label.disk.bytes.write.rate": "Diskskrivehastighet  (BPS)",
-    "label.disk.iops.max": "Maks IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Disklesehastighet (IOPS)",
-    "label.disk.iops.total": "IOPS Totalt",
-    "label.disk.iops.write.rate": "Diskskrivehastighet (IOPS)",
-    "label.disk.offering": "Disktilbud",
-    "label.disk.offering.details": "Disktilbud detaljer",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisjoneringstype",
-    "label.disk.read.bytes": "Disk lese (Bytes)",
-    "label.disk.read.io": "Disk lese (IO)",
-    "label.disk.size": "Diskstørrelse",
-    "label.disk.size.gb": "Diskstørrelse (i GB)",
-    "label.disk.total": "Disk Totalt",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Disk Volum",
-    "label.disk.write.bytes": "Disk skrive (Bytes)",
-    "label.disk.write.io": "Disk skrive (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Visningsnavn",
-    "label.display.text": "Visningstekst",
-    "label.distributedrouter": "DIstribuert router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domene",
-    "label.domain.admin": "Domeneadministrator",
-    "label.domain.details": "Domenedetaljer",
-    "label.domain.id": "Domene ID",
-    "label.domain.lower": "domene",
-    "label.domain.name": "Domenenavn",
-    "label.domain.router": "Domeneruter",
-    "label.domain.suffix": "DNS domenesuffiks (f.eks, xyz.com)",
-    "label.done": "Utført",
-    "label.double.quotes.are.not.allowed": "Doble anførselstegn er ikke tillatt",
-    "label.download.progress": "Nedlastningsprogresjon",
-    "label.drag.new.position": "Dra til ny posisjon",
-    "label.duration.in.sec": "Varighet (i sek.)",
-    "label.dynamically.scalable": "Dynamisk skalerbar",
-    "label.edit": "Editer",
-    "label.edit.acl.rule": "Endre ACL regel",
-    "label.edit.affinity.group": "Rediger affinitetsgruppe",
-    "label.edit.lb.rule": "Endre LB-regel",
-    "label.edit.network.details": "Editér nettverksdetaljer",
-    "label.edit.project.details": "Editer prosjektdetaljer",
-    "label.edit.region": "Editer region",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Endre regel",
-    "label.edit.secondary.ips": "Endre sekundære IPer",
-    "label.edit.tags": "Rediger tagger",
-    "label.edit.traffic.type": "Endre trafikktype",
-    "label.edit.vpc": "Rediger VPC",
-    "label.egress.default.policy": "Egress standardpolicy",
-    "label.egress.rule": "Egressregel",
-    "label.egress.rules": "Egressregler",
-    "label.elastic": "Elastisk",
-    "label.elastic.IP": "Elastisk IP",
-    "label.elastic.LB": "Elastisk LB",
-    "label.email": "E-post",
-    "label.email.lower": "epost",
-    "label.enable.autoscale": "Aktivert autoskalering",
-    "label.enable.host": "Aktiver host",
-    "label.enable.network.offering": "Aktiver nettverkstilbud",
-    "label.enable.provider": "Aktiver tilbyder",
-    "label.enable.s3": "Aktiver S3-støttet sekundærlagring",
-    "label.enable.swift": "Aktiver Swift",
-    "label.enable.vnmc.device": "Aktivert VNMC enhet",
-    "label.enable.vnmc.provider": "Aktivert VNMC tilbyder",
-    "label.enable.vpc.offering": "Aktiver VPC tilbud",
-    "label.enable.vpn": "Aktiver VPN",
-    "label.enabling.vpn": "Aktiverer VPN",
-    "label.enabling.vpn.access": "Aktiverer VPN-tilgang",
-    "label.end.IP": "Slutt-IP",
-    "label.end.port": "Sluttport",
-    "label.end.reserved.system.IP": "Siste reserverte system IP",
-    "label.end.vlan": "Slutt VLAN",
-    "label.end.vxlan": "Slutt VXLAN",
-    "label.endpoint": "Endepunkt",
-    "label.endpoint.or.operation": "Endepunkt eller operasjon",
-    "label.enter.token": "Skriv inn koden",
-    "label.error": "Feil",
-    "label.error.code": "Feilkode",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX/ESXi vert",
-    "label.event": "Hendelse",
-    "label.event.archived": "Hendelser Arkivert",
-    "label.event.deleted": "Hendelse slettet",
-    "label.every": "Hver",
-    "label.example": "Eksempel",
-    "label.expunge": "Permanent Slett",
-    "label.external.link": "Ekstern kobling",
-    "label.extractable": "Nedlastbar",
-    "label.extractable.lower": "Nedlastbar",
-    "label.f5": "F5",
-    "label.f5.details": "F5 detaljer",
-    "label.failed": "Feilet",
-    "label.featured": "Fremhevet",
-    "label.fetch.latest": "Hent siste",
-    "label.filterBy": "Filtrer etter",
-    "label.fingerprint": "Fingeravtrykk",
-    "label.firewall": "Brannmur",
-    "label.first.name": "Fornavn",
-    "label.firstname.lower": "fornavn",
-    "label.format": "Format",
-    "label.format.lower": "format",
-    "label.friday": "Fredag",
-    "label.full": "Full",
-    "label.full.path": "Full sti",
-    "label.gateway": "Gateway",
-    "label.general.alerts": "Generelle varsler",
-    "label.generating.url": "Genererer URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS-konfigurasjon",
-    "label.gluster.volume": "Volum",
-    "label.go.step.2": "Gå til steg 2",
-    "label.go.step.3": "Gå til steg 3",
-    "label.go.step.4": "Gå til steg 4",
-    "label.go.step.5": "Gå til steg 5",
-    "label.gpu": "GPU",
-    "label.group": "Gruppe",
-    "label.group.by.account": "Grupper på konto",
-    "label.group.by.cluster": "Grupper på kluster",
-    "label.group.by.pod": "Grupper på pod",
-    "label.group.by.zone": "Grupper på sone",
-    "label.group.optional": "Gruppe (Valgfritt)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Tildelt lastbalansering",
-    "label.gslb.assigned.lb.more": "Tildel mer lastbalansering",
-    "label.gslb.delete": "Slett GSLB",
-    "label.gslb.details": "GSLB detaljer",
-    "label.gslb.domain.name": "GSLB domenenavn",
-    "label.gslb.lb.details": "Lastbalanseringsdetaljer",
-    "label.gslb.lb.remove": "Fjern lastbalansering fra denne GSLB",
-    "label.gslb.lb.rule": "Lastbalanseringsregel",
-    "label.gslb.service": "GSLB tjeneste",
-    "label.gslb.service.private.ip": "GSLB tjeneste privat IP-adresse",
-    "label.gslb.service.public.ip": "GSLB tjeneste offentlig IP-adresse",
-    "label.gslb.servicetype": "Tjeneste Type",
-    "label.guest": "Gjest",
-    "label.guest.cidr": "Gjest CIDR",
-    "label.guest.end.ip": "Gjest slutt-IP",
-    "label.guest.gateway": "Gjestegateway",
-    "label.guest.ip": "Gjest IP-adresse",
-    "label.guest.ip.range": "Gjest IP-rekke",
-    "label.guest.netmask": "Gjest nettmaske",
-    "label.guest.network.details": "Gjestenettverksdetaljer",
-    "label.guest.networks": "Gjestenettverk",
-    "label.guest.start.ip": "Gjest start-IP",
-    "label.guest.traffic": "Gjestetrafikk",
-    "label.guest.traffic.vswitch.name": "Gjestetrafikk vSwitch Navn",
-    "label.guest.traffic.vswitch.type": "Gjestetrafikk vSwitch Type",
-    "label.guest.type": "Gjestetype",
-    "label.ha.enabled": "HA Aktivert",
-    "label.health.check": "Helsesjekk",
-    "label.health.check.advanced.options": "Avanserte valg:",
-    "label.health.check.configurations.options": "Konfigureringsvalg:",
-    "label.health.check.interval.in.sec": "Helsesjekk Intervall (i sekunder)",
-    "label.health.check.message.desc": "Din lastbalanserer vil automatisk utføre helsesjekker mot dine cloudstackinstanser og kun rute trafikk til de instansene som passerer helsesjekk.",
-    "label.health.check.wizard": "Helsesjekkveiviser",
-    "label.healthy.threshold": "Sunn Terskel",
-    "label.help": "Hjelp",
-    "label.hide.ingress.rule": "Skjul ingressregel",
-    "label.hints": "Hint",
-    "label.home": "Hjem",
-    "label.host": "Vert",
-    "label.host.MAC": "Verts MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Vertsnavn",
-    "label.host.tag": "Merkelapper for vert",
-    "label.host.tags": "Vertsknagger",
-    "label.hosts": "Verter",
-    "label.hourly": "Hver time",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Trafikk Etikett",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Hypervisor evner",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Øyeblikks Kapasitet",
-    "label.hypervisor.type": "Hypervisor type",
-    "label.hypervisor.version": "Hypervisor versjon",
-    "label.hypervisors": "Hypervisors",
-    "label.id": "ID",
-    "label.info": "Info",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Ingressregel",
-    "label.initiated.by": "Initiert av",
-    "label.inside.port.profile": "Intern Port Profil",
-    "label.installWizard.addClusterIntro.subtitle": "Hva er en klynge?",
-    "label.installWizard.addClusterIntro.title": "La oss legge til en klynge",
-    "label.installWizard.addHostIntro.subtitle": "Hva er en vert?",
-    "label.installWizard.addHostIntro.title": "La oss legge til en vert",
-    "label.installWizard.addPodIntro.subtitle": "Hva er en pod?",
-    "label.installWizard.addPodIntro.title": "La oss legge til en pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Hva er primærlagring?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Legg til primærlagring",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Hva er sekundærlagring?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Legg til sekundærlagring",
-    "label.installWizard.addZone.title": "Legg til sone",
-    "label.installWizard.addZoneIntro.subtitle": "Hva er en sone?",
-    "label.installWizard.addZoneIntro.title": "La oss legge til en sone",
-    "label.installWizard.click.launch": "Klikk startknappen.",
-    "label.installWizard.subtitle": "Denne veiviseren vil hjelpe deg i din installasjon av CloudStack&#8482",
-    "label.installWizard.title": "Hei og velkommen til CloudStack&#8482",
-    "label.instance": "Instans",
-    "label.instance.limits": "Instans Begrensninger",
-    "label.instance.name": "Instans Navn",
-    "label.instance.port": "Instansport",
-    "label.instance.scaled.up": "Instans skalert til forespurt tilbud",
-    "label.instances": "Instanser",
-    "label.instanciate.template.associate.profile.blade": "Instansier mal og assosier malen med Blade",
-    "label.intermediate.certificate": "Intermediate sertifikat {0}",
-    "label.internal.dns.1": "Intern DNS 1",
-    "label.internal.dns.2": "Intern DNS 2",
-    "label.internal.lb": "Intern LB",
-    "label.internal.lb.details": "Intern LB detaljer",
-    "label.internal.name": "Internt navn",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Intervalltype",
-    "label.introduction.to.cloudstack": "Introduksjon til CloudStack&#8482",
-    "label.invalid.integer": "Ugyldig heltall",
-    "label.invalid.number": "Ugyldig tall",
-    "label.invitations": "Invitasjoner",
-    "label.invite": "Inviter",
-    "label.invite.to": "Inviter til",
-    "label.invited.accounts": "Inviterte kontoer",
-    "label.ip": "IP",
-    "label.ip.address": "IP-adresse",
-    "label.ip.allocations": "IP Allokeringer",
-    "label.ip.limits": "Offentlig IP-addresse Grenser",
-    "label.ip.or.fqdn": "IP eller FQDN",
-    "label.ip.range": "IP-rekke",
-    "label.ip.ranges": "IP-rekker",
-    "label.ipaddress": "IP-adresse",
-    "label.ips": "IPer",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 Slutt IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 nettmaske",
-    "label.ipv4.start.ip": "IPv4 Start IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Adresse",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 Slutt IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Start IP",
-    "label.is.default": "Er standard",
-    "label.is.redundant.router": "Redundant",
-    "label.is.shared": "Er delt",
-    "label.is.system": "Er system",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO Boot",
-    "label.isolated.networks": "Isolerte nettverk",
-    "label.isolation.method": "Isolasjonsmetode",
-    "label.isolation.mode": "Isolasjonsmetode",
-    "label.isolation.uri": "Isolasjons URI",
-    "label.item.listing": "Elementlisting",
-    "label.japanese.keyboard": "Japansk-tastatur",
-    "label.keep": "Behold",
-    "label.keep.colon": "Behold:",
-    "label.key": "Nøkkel",
-    "label.keyboard.language": "Tastaturspråk",
-    "label.keyboard.type": "Tastaturtype",
-    "label.kvm.traffic.label": "KVM trafikketikett",
-    "label.label": "Etikett",
-    "label.lang.arabic": "Arabisk",
-    "label.lang.brportugese": "Brasiliansk Portugisisk",
-    "label.lang.catalan": "Katalansk",
-    "label.lang.chinese": "Kinesisk (Forenklet)",
-    "label.lang.dutch": "Dutch (Nederland)",
-    "label.lang.english": "Engelsk",
-    "label.lang.french": "Fransk",
-    "label.lang.german": "Tysk",
-    "label.lang.hungarian": "Ungarsk",
-    "label.lang.italian": "Italiensk",
-    "label.lang.japanese": "Japanesisk",
-    "label.lang.korean": "Koreansk",
-    "label.lang.norwegian": "Norsk",
-    "label.lang.polish": "Polsk",
-    "label.lang.russian": "Russisk",
-    "label.lang.spanish": "Spansk",
-    "label.last.disconnected": "Siste Frakobling",
-    "label.last.name": "Etternavn",
-    "label.lastname.lower": "etternavn",
-    "label.latest.events": "Siste hendelser",
-    "label.launch": "Start",
-    "label.launch.vm": "Start VM",
-    "label.launch.zone": "Start sone",
-    "label.lb.algorithm.leastconn": "Færrest tilkoblinger",
-    "label.lb.algorithm.roundrobin": "Ringdistribusjon",
-    "label.lb.algorithm.source": "Kilde",
-    "label.ldap.configuration": "LDAP-konfigurasjon",
-    "label.ldap.group.name": "LDAP Gruppe",
-    "label.ldap.link.type": "Type",
-    "label.ldap.port": "LDAP port",
-    "label.level": "Nivå",
-    "label.link.domain.to.ldap": "Knytt domene til LDAP",
-    "label.linklocal.ip": "Link-lokal IP-adresse",
-    "label.load.balancer": "Lastbalanserer",
-    "label.load.balancer.type": "Lastbalanseringstype",
-    "label.load.balancing": "Lastbalansering",
-    "label.load.balancing.policies": "Regler for lastbalansering",
-    "label.loading": "Laster",
-    "label.local": "Lokal",
-    "label.local.file": "Lokal fil",
-    "label.local.storage": "Lokal lagring",
-    "label.local.storage.enabled": "Aktiver lokal lagring for bruker VMer",
-    "label.local.storage.enabled.system.vms": "Aktiver lokal lagring for SystemVMer",
-    "label.login": "Logg inn",
-    "label.logout": "Logg ut",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC trafikk etikett",
-    "label.make.project.owner": "Gjør konto prosjekteier",
-    "label.make.redundant": "Gjør redundant",
-    "label.manage": "Administrer",
-    "label.manage.resources": "Behandle ressurser",
-    "label.managed": "Administrert",
-    "label.management": "Administrasjon",
-    "label.management.ips": "Administrasjons IP-adresser",
-    "label.management.server": "Administrasjonsserver",
-    "label.max.cpus": "Maks CPU kjerner",
-    "label.max.guest.limit": "Maks antall gjester",
-    "label.max.instances": "Maks Instanser",
-    "label.max.memory": "Maks minne (MiB)",
-    "label.max.networks": "Maks nettverk",
-    "label.max.primary.storage": "Maks primær (GiB)",
-    "label.max.public.ips": "Maks offentlige IPer",
-    "label.max.secondary.storage": "Maks sekundær (GiB)",
-    "label.max.snapshots": "Maks øyeblikksbilder",
-    "label.max.templates": "Maks maler",
-    "label.max.vms": "Maks bruker-VMer",
-    "label.max.volumes": "Maks volumer",
-    "label.max.vpcs": "Maks VPCs",
-    "label.maximum": "Maksimum",
-    "label.may.continue": "Du kan nå fortsette.",
-    "label.md5.checksum": "MD5 sjekksum",
-    "label.memory": "Minne",
-    "label.memory.allocated": "Minne allokert",
-    "label.memory.limits": "Minnebegrensning (MiB)",
-    "label.memory.mb": "Minne (i MB)",
-    "label.memory.total": "Minne totalt",
-    "label.memory.used": "Minne brukt",
-    "label.menu.accounts": "Kontoer",
-    "label.menu.alerts": "Varsler",
-    "label.menu.all.accounts": "Alle kontoer",
-    "label.menu.all.instances": "Alle instanser",
-    "label.menu.community.isos": "Fellesskap ISO medier",
-    "label.menu.community.templates": "Felleskap Maler",
-    "label.menu.configuration": "Konfigurering",
-    "label.menu.dashboard": "Dashbord",
-    "label.menu.destroyed.instances": "Ødelagte instanser",
-    "label.menu.disk.offerings": "Disktilbud",
-    "label.menu.domains": "Domener",
-    "label.menu.events": "Hendelser",
-    "label.menu.featured.isos": "Fremhevede ISOer",
-    "label.menu.featured.templates": "Fremhevde maler",
-    "label.menu.global.settings": "Globale innstillinger",
-    "label.menu.infrastructure": "Infrastruktur",
-    "label.menu.instances": "Instanser",
-    "label.menu.ipaddresses": "IP-adresser",
-    "label.menu.isos": "ISOer",
-    "label.menu.my.accounts": "Mine kontoer",
-    "label.menu.my.instances": "Mine instanser",
-    "label.menu.my.isos": "Mine ISOer",
-    "label.menu.my.templates": "Mine maler",
-    "label.menu.network": "Nettverk",
-    "label.menu.network.offerings": "Nettverkstilbud",
-    "label.menu.physical.resources": "Fysiske ressurser",
-    "label.menu.regions": "Regioner",
-    "label.menu.running.instances": "Kjørende instanser",
-    "label.menu.security.groups": "Sikkerhetsgrupper",
-    "label.menu.service.offerings": "Tjenestetilbud",
-    "label.menu.snapshots": "Øyebliksbilder",
-    "label.menu.sshkeypair": "SSH nøkkelpar",
-    "label.menu.stopped.instances": "Stoppede instanser",
-    "label.menu.storage": "Lagring",
-    "label.menu.system": "System",
-    "label.menu.system.service.offerings": "Systemtilbud",
-    "label.menu.system.vms": "System VMer",
-    "label.menu.templates": "Maler",
-    "label.menu.virtual.appliances": "Virtuelle Apparater",
-    "label.menu.virtual.resources": "Virtuelle ressurser",
-    "label.menu.volumes": "Volumer",
-    "label.menu.vpc.offerings": "VPC tilbud",
-    "label.metrics": "Beregninger",
-    "label.metrics.allocated": "Allokert",
-    "label.metrics.clusters": "Klynger",
-    "label.metrics.cpu.allocated": "CPU-Allokasjon",
-    "label.metrics.cpu.max.dev": "Avvik",
-    "label.metrics.cpu.total": "Totalt",
-    "label.metrics.cpu.usage": "CPU-bruk",
-    "label.metrics.cpu.used.avg": "Brukt",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "Allokert",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Lese",
-    "label.metrics.disk.size": "Størrelse",
-    "label.metrics.disk.storagetype": "Type",
-    "label.metrics.disk.total": "Totalt",
-    "label.metrics.disk.unallocated": "Uallokert",
-    "label.metrics.disk.usage": "Diskforbruk",
-    "label.metrics.disk.used": "Brukt",
-    "label.metrics.disk.write": "Skriv",
-    "label.metrics.hosts": "Verter",
-    "label.metrics.memory.allocated": "Minneallokering",
-    "label.metrics.memory.max.dev": "Avvik",
-    "label.metrics.memory.total": "Totalt",
-    "label.metrics.memory.usage": "Minneforbruk",
-    "label.metrics.memory.used.avg": "Brukt",
-    "label.metrics.name": "Navn",
-    "label.metrics.network.read": "Lese",
-    "label.metrics.network.usage": "Nettverksforbruk",
-    "label.metrics.network.write": "Skriv",
-    "label.metrics.num.cpu.cores": "Kjerner",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Egenskap",
-    "label.metrics.scope": "Omfang",
-    "label.metrics.state": "Status",
-    "label.metrics.storagepool": "Lagringspool",
-    "label.metrics.vm.name": "VM-navn",
-    "label.migrate.instance.to": "Migrer instans til",
-    "label.migrate.instance.to.host": "Migrer instansen til en annen vert",
-    "label.migrate.instance.to.ps": "Migrer instansen til en annen primærlagring.",
-    "label.migrate.lb.vm": "Migrer LB VM",
-    "label.migrate.router.to": "Migrer Ruter til",
-    "label.migrate.systemvm.to": "Migrer System VM til",
-    "label.migrate.to.host": "Migrer til vert",
-    "label.migrate.to.storage": "Migrer til lagring",
-    "label.migrate.volume": "Migrer volum",
-    "label.migrate.volume.to.primary.storage": "Migrer volumet til en annen primærlagring.",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instanser",
-    "label.min.past.the.hr": "minutter etter time",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "minutt(er) etter hel time",
-    "label.minutes.past.hour": "minutt(er) etter time",
-    "label.mode": "Modus",
-    "label.monday": "Mandag",
-    "label.monthly": "Månedlig",
-    "label.more.templates": "Flere maler",
-    "label.move.down.row": "Flytt én rad ned",
-    "label.move.to.bottom": "Flytt til bunnen",
-    "label.move.to.top": "Flytt til toppen",
-    "label.move.up.row": "Flytt én rad opp",
-    "label.my.account": "Min konto",
-    "label.my.network": "Mitt nettverk",
-    "label.my.templates": "Mine maler",
-    "label.na": "N/A",
-    "label.name": "Navn",
-    "label.name.lower": "Navn",
-    "label.name.optional": "Navn (Valgfritt)",
-    "label.nat.port.range": "NAT portrekke",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Nettmaske",
-    "label.netscaler.details": "NetScaler detaljer",
-    "label.network": "Nettverk",
-    "label.network.ACL": "Nettverk ACL",
-    "label.network.ACL.total": "Nettverk ACL Total",
-    "label.network.ACLs": "Nettverk ACLer",
-    "label.network.addVM": "Legg nettverk til VM",
-    "label.network.cidr": "Nettverk CIDR",
-    "label.network.desc": "Nettverksbeskrivelse",
-    "label.network.details": "Nettverksdetaljer",
-    "label.network.device": "Nettverksenhet",
-    "label.network.device.type": "Type nettverksenhet",
-    "label.network.domain": "Nettverksdomene",
-    "label.network.domain.text": "Nettverksdomene",
-    "label.network.id": "Nettverks ID",
-    "label.network.label.display.for.blank.value": "Bruk standard gateway",
-    "label.network.limits": "Nettverksbegrensninger",
-    "label.network.name": "Nettverksnavn",
-    "label.network.offering": "Nettverkstilbud",
-    "label.network.offering.details": "Nettverkstilbud detaljer",
-    "label.network.offering.display.text": "Nettverkstilbud Forklaring",
-    "label.network.offering.id": "Nettverkstilbud ID",
-    "label.network.offering.name": "Nettverkstilbud Navn",
-    "label.network.rate": "Nettverks fart (MB/s)",
-    "label.network.rate.megabytes": "Nettverks fart (MB/s)",
-    "label.network.read": "Nettverk les",
-    "label.network.service.providers": "Nettverktjenestetilbydere",
-    "label.network.type": "Nettverkstype",
-    "label.network.write": "Nettverk skriveoperasjoner",
-    "label.networking.and.security": "Nettverk og sikkerhet",
-    "label.networks": "Nettverk",
-    "label.new": "Ny",
-    "label.new.password": "Nytt passord",
-    "label.current.password": "Current Password",
-    "label.new.project": "Nytt prosjekt",
-    "label.new.ssh.key.pair": "Nytt SSH-nøkkelpar",
-    "label.new.vm": "Ny VM",
-    "label.next": "Neste",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS Server",
-    "label.nfs.storage": "NFS Lagring",
-    "label.nic.adapter.type": "NIC adaptertype",
-    "label.nicira.controller.address": "Kontrolleradresse",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway tjeneste-uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Tjeneste Uuid",
-    "label.nicira.nvp.details": "Nicira NVP detaljer",
-    "label.nicira.transportzoneuuid": "Transport sone Uuid",
-    "label.nics": "NICer",
-    "label.no": "Nei",
-    "label.no.actions": "Ingen tilgjengelige handlinger",
-    "label.no.alerts": "Ingen nylige alarmer",
-    "label.no.data": "Ingen data å vise",
-    "label.no.errors": "Ingen nylige feil",
-    "label.no.grouping": "(ingen gruppering)",
-    "label.no.isos": "Ingen tilgjengelige ISOer",
-    "label.no.items": "Ingen tilgjengelige elementer",
-    "label.no.security.groups": "Ingen tilgjengelige sikkerhetsgrupper",
-    "label.no.thanks": "Nei, takk",
-    "label.none": "Ingen",
-    "label.not.found": "Ikke funnet",
-    "label.notifications": "Notifikasjoner",
-    "label.num.cpu.cores": "# av CPU-kjerner",
-    "label.number.of.clusters": "Antall klynger",
-    "label.number.of.cpu.sockets": "Totalt antall CPU-sockets",
-    "label.number.of.hosts": "Antall verter",
-    "label.number.of.pods": "Antall pods",
-    "label.number.of.system.vms": "Antall System VMer",
-    "label.number.of.virtual.routers": "Antall virtuelle rutere",
-    "label.number.of.zones": "Antall soner",
-    "label.numretries": "Antall forsøk",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "av måned",
-    "label.offer.ha": "Tilby HA",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight kontroller",
-    "label.opendaylight.controllerdetail": "OpenDaylight kontrollerdetaljer",
-    "label.opendaylight.controllers": "OpenDaylight kontrollere",
-    "label.operator": "Operatør",
-    "label.optional": "Valgfritt",
-    "label.order": "Rekkefølge",
-    "label.os.preference": "OS-preferanse",
-    "label.os.type": "OS-type",
-    "label.other": "Andre",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Handling",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Passord",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Brukernavn",
-    "label.override.guest.traffic": "Overstyr Gjeste Trafikk",
-    "label.override.public.traffic": "Overstyr Offentlig Trafikk",
-    "label.ovm.traffic.label": "OVM trafikk etikett",
-    "label.ovm3.cluster": "Innebygd Klynge Funksjon",
-    "label.ovm3.pool": "Innebygd Pooling",
-    "label.ovm3.traffic.label": "OVM3 trafikketikett",
-    "label.ovm3.vip": "Hoved VIP IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Offentlige IP-addresser i bruk",
-    "label.owner.account": "Eierkonto",
-    "label.owner.domain": "Eierdomene",
-    "label.palo.alto.details": "Palo Alto detaljer",
-    "label.parent.domain": "Foreldre domene",
-    "label.passive": "Passiv",
-    "label.password": "Passord",
-    "label.password.enabled": "Passord Aktivert",
-    "label.password.lower": "passord",
-    "label.password.reset.confirm": "Passordet har blitt resatt til",
-    "label.path": "Sti",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Vedvarende",
-    "label.physical.network": "Fysisk nettverk",
-    "label.physical.network.ID": "Fysisk nettverksid",
-    "label.physical.network.name": "Fysisk nettverksnavn",
-    "label.ping.path": "Ping Sti",
-    "label.planner.mode": "Planleggingsmodus",
-    "label.please.complete.the.following.fields": "Vennligst fullført følgende felter",
-    "label.please.specify.netscaler.info": "Vennligst spesifiser NetScaler-info",
-    "label.please.wait": "Vennligst vent",
-    "label.plugin.details": "Plugin detaljer",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dedikert",
-    "label.pod.name": "Pod navn",
-    "label.pods": "Pods",
-    "label.polling.interval.sec": "Sjekkintervall (i sekunder)",
-    "label.port": "Port",
-    "label.port.forwarding": "Portvideresending",
-    "label.port.forwarding.policies": "Regler for portvideresending",
-    "label.port.range": "Portrekke",
-    "label.portable.ip": "Flyttbar IP",
-    "label.portable.ip.range.details": "Portabel IP-rekke detaljer",
-    "label.portable.ip.ranges": "Transportable IP-rekker",
-    "label.portable.ips": "Portabel IP-rekke",
-    "label.powerstate": "Power State",
-    "label.prev": "Forrige",
-    "label.previous": "Forrige",
-    "label.primary.allocated": "Primærlagring allokert",
-    "label.primary.network": "Primærnettverk",
-    "label.primary.storage": "Primærlagring",
-    "label.primary.storage.count": "Primærlagrings Pool",
-    "label.primary.storage.limits": "Primærlagring Maxgrense (GiB)",
-    "label.primary.used": "Primærlagring brukt",
-    "label.private.Gateway": "Privat Gateway",
-    "label.private.interface": "Privat Grensesnitt",
-    "label.private.ip": "Privat IP-adresse",
-    "label.private.ip.range": "Privat IP-rekke",
-    "label.private.ips": "Private IP-adresser",
-    "label.private.key": "Privat nøkkel",
-    "label.private.network": "Privat nettverk",
-    "label.private.port": "Privat port",
-    "label.private.zone": "Privat sone",
-    "label.privatekey": "PKCS#8 Privat Nøkkel",
-    "label.profile": "Profil",
-    "label.project": "Prosjekt",
-    "label.project.dashboard": "Prosjektoversikt",
-    "label.project.id": "Prosjektid",
-    "label.project.invite": "Inviter til prosjekt",
-    "label.project.name": "Prosjektnavn",
-    "label.project.view": "Prosjektvisning",
-    "label.projects": "Prosjekter",
-    "label.protocol": "Protokoll",
-    "label.protocol.number": "Protokollnummer",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Tilbyder",
-    "label.providers": "Tilbydere",
-    "label.public": "Offentlig",
-    "label.public.interface": "Offentlig Grensesnitt",
-    "label.public.ip": "Offentlig IP-adresse",
-    "label.public.ips": "Offentlig IP-adresser",
-    "label.public.key": "Offentlig nøkkel",
-    "label.public.lb": "Offentlig LB",
-    "label.public.load.balancer.provider": "Offentlig Lastbalanserer Tilbyder",
-    "label.public.network": "Offentlig nettverk",
-    "label.public.port": "Offentlig port",
-    "label.public.traffic": "Offentlig trafikk",
-    "label.public.traffic.vswitch.name": "Offentlig Trafikk vSwitch Navn",
-    "label.public.traffic.vswitch.type": "Offentlig Trafikk vSwitch Type",
-    "label.public.zone": "Offentlig sone",
-    "label.purpose": "Formål",
-    "label.qos.type": "QoS Type",
-    "label.quickview": "Hurtigvisning",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Tid (sekunder)",
-    "label.quota.add.credits": "Legg til kreditt",
-    "label.quota.balance": "Balanse",
-    "label.quota.configuration": "Kvotekonfigurasjon",
-    "label.quota.configure": "Konfigurer Kvote",
-    "label.quota.credit": "Kreditt",
-    "label.quota.credits": "Kreditt",
-    "label.quota.date": "Dato",
-    "label.quota.dates": "Oppdater datoer",
-    "label.quota.description": "Kvotebeskrivelse",
-    "label.quota.email.body": "Innhold",
-    "label.quota.email.lastupdated": "Sist oppdatert",
-    "label.quota.email.subject": "Emne",
-    "label.quota.email.template": "Epostmal",
-    "label.quota.enddate": "Sluttdato",
-    "label.quota.endquota": "Sluttkvote",
-    "label.quota.enforcequota": "Tving Kvote",
-    "label.quota.fullsummary": "Alle kontoer",
-    "label.quota.minbalance": "Minste balanse",
-    "label.quota.remove": "Fjern Kvote",
-    "label.quota.startdate": "Startdato",
-    "label.quota.startquota": "Startkvote",
-    "label.quota.state": "Status",
-    "label.quota.statement": "Kontoutskrift",
-    "label.quota.statement.balance": "Kvotebalanse",
-    "label.quota.statement.bydates": "Kontoutskrift",
-    "label.quota.statement.quota": "Kvoteforbrukk",
-    "label.quota.statement.tariff": "Kvotetariff",
-    "label.quota.summary": "Sammendrag",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Rediger tariff",
-    "label.quota.tariff.effectivedate": "Effektiv dato",
-    "label.quota.tariff.value": "Tariffverdi",
-    "label.quota.total": "Totalt",
-    "label.quota.totalusage": "Totalbruk",
-    "label.quota.type.name": "Brukstype",
-    "label.quota.type.unit": "Bruksenhet",
-    "label.quota.usage": "Kvoteforbruk",
-    "label.quota.value": "Kvoteverdi",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx user",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx hemmelighet",
-    "label.reboot": "Restart",
-    "label.recent.errors": "Nylige feil",
-    "label.recover.vm": "Gjenopprett VM",
-    "label.redundant.router": "Redundant ruter",
-    "label.redundant.router.capability": "Redundant ruter",
-    "label.redundant.state": "Redundant tilstand",
-    "label.redundant.vpc": "Redundant VPC",
-    "label.refresh": "Oppfrisk",
-    "label.refresh.blades": "Oppdater blad(er)",
-    "label.region": "Region",
-    "label.region.details": "Regiondetaljer",
-    "label.regionlevelvpc": "Region Nivå VPC",
-    "label.reinstall.vm": "Reinstaller VM",
-    "label.related": "Relaterte",
-    "label.release.account": "Frigi fra Konto",
-    "label.release.account.lowercase": "Frigi fra konto",
-    "label.release.dedicated.cluster": "Frigjør dedikert kluster",
-    "label.release.dedicated.host": "Frigjør dedikert host",
-    "label.release.dedicated.pod": "Frigjør Dedikert Pod",
-    "label.release.dedicated.vlan.range": "Frigjør dedikerte VLAN rekke",
-    "label.release.dedicated.zone": "Frigjør dedikert sone",
-    "label.remind.later": "Påminn meg senere",
-    "label.remove.ACL": "Fjern ACL",
-    "label.remove.egress.rule": "Fjern egressregel",
-    "label.remove.from.load.balancer": "Fjerner instans fra lastbalanserer",
-    "label.remove.ingress.rule": "Fjern ingressregel",
-    "label.remove.ip.range": "Fjern IP-rekke",
-    "label.remove.ldap": "Fjern LDAP",
-    "label.remove.network.offering": "Fjern nettverkstilbud",
-    "label.remove.pf": "Fjern portvideresendingsregel",
-    "label.remove.project.account": "Fjern konto fra prosjekt",
-    "label.remove.region": "Fjern region",
-    "label.remove.rule": "Fjern regel",
-    "label.remove.ssh.key.pair": "Fjern SSH-nøkkelpar",
-    "label.remove.static.nat.rule": "Fjern statisk NAT-regel",
-    "label.remove.static.route": "Fjern statisk rute",
-    "label.remove.this.physical.network": "Fjern dette fysiske nettverk",
-    "label.remove.tier": "Fjern gren",
-    "label.remove.vm.from.lb": "Fjern VM fra lastbalanseringsregel",
-    "label.remove.vm.load.balancer": "Fjern VM fra lastbalanserer",
-    "label.remove.vmware.datacenter": "Fjern VMware datasenter",
-    "label.remove.vpc": "fjern VPC",
-    "label.remove.vpc.offering": "Fjern VPC tilbud",
-    "label.removing": "Fjerner",
-    "label.removing.user": "Fjerner Bruker",
-    "label.reource.id": "Ressurs ID",
-    "label.replace.acl": "Erstatt ACL",
-    "label.replace.acl.list": "Erstatt ACL Liste",
-    "label.required": "Påkrevd",
-    "label.requires.upgrade": "Krever oppgradering",
-    "label.reserved.ip.range": "Reservert IP-rekke",
-    "label.reserved.system.gateway": "Reservert System Gateway",
-    "label.reserved.system.ip": "Reservert System IP",
-    "label.reserved.system.netmask": "Reservert system nettmaske",
-    "label.reset.VPN.connection": "Resett VPN-tilkobling",
-    "label.reset.ssh.key.pair": "Resett SSH-nøkkelpar",
-    "label.reset.ssh.key.pair.on.vm": "Reset SSH-nøkkelpar på VM",
-    "label.resetVM": "Resett VM",
-    "label.resize.new.offering.id": "Nytt tilbud",
-    "label.resize.new.size": "Ny størrelse (GB)",
-    "label.resize.shrink.ok": "Krympe OK",
-    "label.resource": "Ressurs",
-    "label.resource.limit.exceeded": "Ressursbegrensning Overskridet",
-    "label.resource.limits": "Ressursbegrensninger",
-    "label.resource.name": "Ressursnavn",
-    "label.resource.state": "Ressurs Status",
-    "label.resources": "Ressurser",
-    "label.response.timeout.in.sec": "Respons Tidsavbrudd (sekunder)",
-    "label.restart.network": "Nettverksomstart",
-    "label.restart.required": "Omstart påkrevd",
-    "label.restart.vpc": "Omstart VPC",
-    "label.restore": "Gjenopprett",
-    "label.retry.interval": "Nyforsøk Intervall",
-    "label.review": "Gjennomgå",
-    "label.revoke.project.invite": "Tilbakekall invitasjonen",
-    "label.role": "Rolle",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Rootsertifikat",
-    "label.root.disk.controller": "Root diskkontroller",
-    "label.root.disk.offering": "Root disktilbud",
-    "label.root.disk.size": "Rotdiskstørrelse (GB)",
-    "label.router.vm.scaled.up": "RuterVM skalert opp",
-    "label.routing": "Ruting",
-    "label.routing.host": "Ruter Vert",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Regel",
-    "label.rule.number": "Regelnummer",
-    "label.rules": "Regler",
-    "label.running.vms": "Kjørende VMer",
-    "label.s3.access_key": "Aksessnøkkel",
-    "label.s3.bucket": "Bøtte",
-    "label.s3.connection_timeout": "Tilkoblingsavbrudd",
-    "label.s3.endpoint": "Endepunkt",
-    "label.s3.max_error_retry": "Max Nyforsøk Etter Feilmelding",
-    "label.s3.nfs.path": "S3 NFS Sti",
-    "label.s3.nfs.server": "S3 NFS Server",
-    "label.s3.secret_key": "Hemmelig nøkkel",
-    "label.s3.socket_timeout": "Socket Tidsavbrudd",
-    "label.s3.use_https": "Bruk HTTPS",
-    "label.saml.enable": "Autoriser SAML SSO",
-    "label.saml.entity": "Identitets Tilbydere",
-    "label.saturday": "Lørdag",
-    "label.save": "Lagre",
-    "label.save.and.continue": "Lagre og fortsett",
-    "label.save.changes": "Lagre endringer",
-    "label.saving.processing": "Lagrer....",
-    "label.scale.up.policy": "Oppskalerings policy",
-    "label.scaledown.policy": "Nedtrappings policy",
-    "label.scaleup.policy": "Oppskalerings policy",
-    "label.scope": "Omfang",
-    "label.search": "Søk",
-    "label.secondary.ips": "Sekundære IPer",
-    "label.secondary.isolated.vlan.id": "Sekundær Isolert VLAN ID",
-    "label.secondary.staging.store": "Sekundærmellomlagringsområde",
-    "label.secondary.staging.store.details": "Sekundærmellomlagringsområde detaljer",
-    "label.secondary.storage": "Sekundærlagring",
-    "label.secondary.storage.count": "Sekundærlagrings Pool",
-    "label.secondary.storage.details": "Sekundærlagringsdetaljer",
-    "label.secondary.storage.limits": "Sekundærlagringsbregrensninger (GiB)",
-    "label.secondary.storage.vm": "Sekundærlagring VM",
-    "label.secondary.used": "Sekundærlagringsplass brukt",
-    "label.secret.key": "Hemmelig nøkkel",
-    "label.security.group": "Sikkerhetsgruppe",
-    "label.security.group.name": "Sikkerhetsgruppenavn",
-    "label.security.groups": "Sikkerhetsgrupper",
-    "label.security.groups.enabled": "Sikkerhetsgrupper Aktivert",
-    "label.select": "Velg",
-    "label.select-view": "Velg visning",
-    "label.select.a.template": "Velg en mal",
-    "label.select.a.zone": "Velg en sone",
-    "label.select.instance": "Velg instans",
-    "label.select.instance.to.attach.volume.to": "Velg instans for tildeling av volum",
-    "label.select.iso.or.template": "Velg ISO eller mal",
-    "label.select.offering": "Velg tilbud",
-    "label.select.project": "Velg prosjekt",
-    "label.select.region": "Velg region",
-    "label.select.template": "Velg Mal",
-    "label.select.tier": "Velg gren",
-    "label.select.vm.for.static.nat": "Velg instans for statisk NAT",
-    "label.sent": "Sendt",
-    "label.server": "Tjener",
-    "label.service.capabilities": "Tjeneste Evner",
-    "label.service.offering": "Tjenestetilbud",
-    "label.service.offering.details": "Tjenstetilbudsdetaljer",
-    "label.service.state": "Tjenestestatus",
-    "label.services": "Tjenester",
-    "label.session.expired": "Sesjon utløpt",
-    "label.set.default.NIC": "Sett som standard NIC",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Oppsett av sonetype",
-    "label.settings": "Innstillinger",
-    "label.setup": "Oppsett",
-    "label.setup.network": "Sett opp nettverk",
-    "label.setup.zone": "Sett opp sone",
-    "label.shared": "Delt",
-    "label.show.advanced.settings": "VIs avanserte instillinger",
-    "label.show.ingress.rule": "Vis ingressregel",
-    "label.shutdown.provider": "Steng tilbyder",
-    "label.simplified.chinese.keyboard": "Forenklet kinesisk-tastatur",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Størrelse",
-    "label.skip.guide": "Jeg har brukt CloudStack tidligere. Hopp over denne veiviseren",
-    "label.smb.domain": "SMB Domene",
-    "label.smb.password": "SMB Passord",
-    "label.smb.username": "SMB Brukernavn",
-    "label.snapshot": "Øyeblikksbilde",
-    "label.snapshot.limits": "Øyeblikksbildebegrensning",
-    "label.snapshot.name": "Øyeblikksbildenavn",
-    "label.snapshot.s": "Øyeblikksbilder",
-    "label.snapshot.schedule": "Sett Opp Gjentagende øyeblikksbilder",
-    "label.snapshots": "Øyeblikksbilder",
-    "label.sockets": "CPU Sokkel",
-    "label.source.ip.address": "Kilde IP-adresse",
-    "label.source.nat": "Kilde NAT",
-    "label.source.nat.supported": "SourceNAT støttet",
-    "label.source.port": "Kildeport",
-    "label.specify.IP.ranges": "Spesifiser IP-rekker",
-    "label.specify.vlan": "Spesifiser VLAN",
-    "label.specify.vxlan": "Spesifiser VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX detaljer",
-    "label.ssh.key.pair": "SSH-nøkkelpar",
-    "label.ssh.key.pair.details": "SSH-nøkkelpardetaljer",
-    "label.ssh.key.pairs": "SSH nøkkelpar",
-    "label.standard.us.keyboard": "Standard (Amerikansk) tastatur",
-    "label.start.IP": "Start-IP",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "Start port",
-    "label.start.reserved.system.IP": "Første reserverte system IP",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "Start VXLAN",
-    "label.state": "Status",
-    "label.static.nat": "Statistk NAT",
-    "label.static.nat.enabled": "Statisk NAT aktivert",
-    "label.static.nat.to": "Statisk NAT til",
-    "label.static.nat.vm.details": "Statisk NAT VM Detaljer",
-    "label.static.routes": "Statiske ruter",
-    "label.statistics": "Statistikk",
-    "label.status": "Status",
-    "label.step.1": "Steg 1",
-    "label.step.1.title": "Steg 1: <strong>Velg en mal</strong>",
-    "label.step.2": "Steg 2",
-    "label.step.2.title": "Steg 2: <strong>Tjenestetilbud</strong>",
-    "label.step.3": "Steg 3",
-    "label.step.3.title": "Steg 3: <strong id=\"step3_label\">Velg et disktilbud</strong>",
-    "label.step.4": "Steg 4",
-    "label.step.4.title": "Steg 4: <strong>Nettverk</strong>",
-    "label.step.5": "Steg 5",
-    "label.step.5.title": "Steg 5: <strong>Repetere</strong>",
-    "label.stickiness": "Klebrighet",
-    "label.stickiness.method": "Klebrighetmetode",
-    "label.sticky.cookie-name": "Cookie navn",
-    "label.sticky.domain": "Domene",
-    "label.sticky.expire": "Utløper",
-    "label.sticky.holdtime": "Oppholds tid",
-    "label.sticky.indirect": "Indirekte",
-    "label.sticky.length": "Lengde",
-    "label.sticky.mode": "Modus",
-    "label.sticky.name": "Sticky Navn",
-    "label.sticky.nocache": "Ingen cache",
-    "label.sticky.postonly": "Send bare",
-    "label.sticky.prefix": "Prefiks",
-    "label.sticky.request-learn": "Lær Forespørsel",
-    "label.sticky.tablesize": "Tabellstørrelse",
-    "label.stop": "Stopp",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "Stoppede VMer",
-    "label.storage": "Lagring",
-    "label.storage.pool": "Lagringspool",
-    "label.storage.tags": "Merkelapper for lagring",
-    "label.storage.traffic": "Lagringstrafikk",
-    "label.storage.type": "Lagringstype",
-    "label.subdomain.access": "Tilgang for underdomene",
-    "label.submit": "Send",
-    "label.submitted.by": "[Innsendt av: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Vellykket",
-    "label.sunday": "Søndag",
-    "label.super.cidr.for.guest.networks": "Super CIDR for gjestenettverk",
-    "label.supported.services": "Støttede Tjenester",
-    "label.supported.source.NAT.type": "Supporterte kilde-NAT typer",
-    "label.supportsstrechedl2subnet": "Støtter strekket L2 subnett",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Suspender prosjekt",
-    "label.switch.type": "Svitsjtype",
-    "label.system.capacity": "Systemkapasistet",
-    "label.system.offering": "Systemtilbud",
-    "label.system.offering.for.router": "Systemtilbud for Rutere",
-    "label.system.service.offering": "Systemtjenestetilbud",
-    "label.system.service.offering.details": "Systemtjenestetilbudsdetaljer",
-    "label.system.vm": "System VM",
-    "label.system.vm.details": "SystemVM-detaljer",
-    "label.system.vm.scaled.up": "SystemVM skalert opp",
-    "label.system.vm.type": "SystemVM-type",
-    "label.system.vms": "System VMer",
-    "label.system.wide.capacity": "Systemomfattende kapasistet",
-    "label.tag.key": "Merkelapp Key",
-    "label.tag.value": "Tag Verdi",
-    "label.tagged": "Tagget",
-    "label.tags": "Tagger",
-    "label.target.iqn": "Mål IQN",
-    "label.task.completed": "Oppgave utført",
-    "label.template": "Mal",
-    "label.template.limits": "Malbegrensninger",
-    "label.tftp.root.directory": "TFTP rot-mappe",
-    "label.theme.default": "Standardtema",
-    "label.theme.grey": "Tilpasset - Grå",
-    "label.theme.lightblue": "Tilpasset - Lys Grå",
-    "label.threshold": "Terskel",
-    "label.thursday": "Torsdag",
-    "label.tier": "Gren",
-    "label.tier.details": "VPC-gren detaljer",
-    "label.time": "Tid",
-    "label.time.colon": "Time:",
-    "label.time.zone": "Tidssone",
-    "label.timeout": "Tidsavbrudd",
-    "label.timeout.in.second ": " Tidsavbrudd (sekunder)",
-    "label.timezone": "Tidssone",
-    "label.timezone.colon": "Tidssone:",
-    "label.token": "Kode",
-    "label.total.CPU": "Totalt CPU",
-    "label.total.cpu": "Totalt CPU",
-    "label.total.hosts": "Totalt Verter",
-    "label.total.memory": "Totalt minne",
-    "label.total.of.ip": "Totalt IP-adresser",
-    "label.total.of.vm": "Totalt av VM",
-    "label.total.storage": "Totalt lagring",
-    "label.total.virtual.routers": "Total antall virtuelle rutere",
-    "label.total.virtual.routers.upgrade": "Totalt antall virtuelle routere som trenger oppgradering",
-    "label.total.vms": "Totalt VMs",
-    "label.traffic.label": "Trafikketikett",
-    "label.traffic.type": "Trafikktype",
-    "label.traffic.types": "Trafikktyper",
-    "label.tuesday": "Tirsdag",
-    "label.type": "Type",
-    "label.type.id": "Type ID",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK-tastatur",
-    "label.unavailable": "Utilgjengelig",
-    "label.unhealthy.threshold": "Usunn Terskel",
-    "label.unlimited": "Ubegrenset",
-    "label.untagged": "Utagget",
-    "label.update.project.resources": "Oppdater prosjektressurser",
-    "label.update.ssl": " SSL-sertifikat",
-    "label.update.ssl.cert": " SSL-sertifikat",
-    "label.updating": "Oppdaterer",
-    "label.upgrade.required": "Oppgradering er påkrevd",
-    "label.upgrade.router.newer.template": "Oppgrader ruter til nyere mal",
-    "label.upload": "Last opp",
-    "label.upload.from.local": "Last opp fra lokal",
-    "label.upload.template.from.local": "Last opp mal fra lokal",
-    "label.upload.volume": "Last opp volum",
-    "label.upload.volume.from.local": "Last opp volum fra lokal",
-    "label.upload.volume.from.url": "Last opp volum fra URL",
-    "label.url": "URL",
-    "label.usage.interface": "Brukergrensesnitt",
-    "label.usage.sanity.result": "Forbruks Tilregnelighet Resultat",
-    "label.usage.server": "Forbruksserver",
-    "label.usage.type": "Brukstype",
-    "label.usage.unit": "Enhet",
-    "label.use.vm.ip": "Bruk VM IP:",
-    "label.use.vm.ips": "Bruk VM IPer",
-    "label.used": "Brukt",
-    "label.user": "Bruker",
-    "label.user.data": "Brukerdata",
-    "label.user.details": "Brukerdetaljer",
-    "label.user.vm": "Bruker VM",
-    "label.username": "Brukernavn",
-    "label.username.lower": "brukernavn",
-    "label.users": "Brukere",
-    "label.vSwitch.type": "vSwitch type",
-    "label.value": "Verdi",
-    "label.vcdcname": "vCenter DC navn",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter Klynge",
-    "label.vcenter.datacenter": "vCenter Datacenter",
-    "label.vcenter.datastore": "vCenter Datastore",
-    "label.vcenter.host": "vCenter Vert",
-    "label.vcenter.password": "vCenter passord",
-    "label.vcenter.username": "vCenter brukernavn",
-    "label.vcipaddress": "vCenter IP-adresse",
-    "label.version": "Versjon",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Maks oppløsning",
-    "label.vgpu.max.vgpu.per.gpu": "VGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Gjenstående kapasitet",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Vis",
-    "label.view.all": "Vis alle",
-    "label.view.console": "Se konsoll",
-    "label.view.more": "Vis mer",
-    "label.view.secondary.ips": "Se sekundære IPer",
-    "label.viewing": "Viser",
-    "label.virtual.appliance": "Virtuellt Apparat",
-    "label.virtual.appliance.details": "Virtuelt apparat detaljer",
-    "label.virtual.appliances": "Virtuelle Apparater",
-    "label.virtual.machine": "Virtuell Maskin",
-    "label.virtual.machines": "Virtuelle Maskiner",
-    "label.virtual.network": "Virtuelt-nettverk",
-    "label.virtual.networking": "Virtuelt Nettverk",
-    "label.virtual.router": "Virtuell ruter",
-    "label.virtual.routers": "Virtuelle rutere",
-    "label.virtual.routers.group.account": "Virtuelle rutere gruppert på konto",
-    "label.virtual.routers.group.cluster": "Virtuelle rutere gruppert på kluster",
-    "label.virtual.routers.group.pod": "Virtuelle rutere gruppert på pod",
-    "label.virtual.routers.group.zone": "Virtuelle rutere gruppert på sone",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI Rekke",
-    "label.vlan.range.details": "VLAN-rekke detaljer",
-    "label.vlan.ranges": "VLAN-rekke(r)",
-    "label.vlan.vni.range": "VLAN/VNI Rekke",
-    "label.vlan.vni.ranges": "VLAN/VNI Rekke(r)",
-    "label.vm.add": "Legg til Instans",
-    "label.vm.destroy": "Destruer",
-    "label.vm.display.name": "Visningsnavn for VM",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP-adresse",
-    "label.vm.name": "VM-navn",
-    "label.vm.password": "Passord til VM er",
-    "label.vm.reboot": "Restart",
-    "label.vm.start": "Start",
-    "label.vm.state": "VM-status",
-    "label.vm.stop": "Stopp",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMer",
-    "label.vmsnapshot": "VM Øyeblikksbilder",
-    "label.vmsnapshot.current": "isCurrent",
-    "label.vmsnapshot.memory": "Øyeblikksbilde av minne",
-    "label.vmsnapshot.parentname": "Forelder",
-    "label.vmsnapshot.type": "Type",
-    "label.vmware.datacenter.id": "VMware datasenter ID",
-    "label.vmware.datacenter.name": "VMware datasenternavn",
-    "label.vmware.datacenter.vcenter": "VMware datasenter vcenter",
-    "label.vmware.traffic.label": "VMware trafikketikett",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC enheter",
-    "label.volatile": "volatil",
-    "label.volgroup": "Volumgruppe",
-    "label.volume": "Volum",
-    "label.volume.details": "Volumdetaljer",
-    "label.volume.limits": "Volumbegrensninger",
-    "label.volume.migrated": "Volum migrert",
-    "label.volume.name": "Volumnavn",
-    "label.volumes": "Volumer",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Distribuert VPC router",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC tilbud",
-    "label.vpc.offering.details": "VPC tilbudsdetaljer",
-    "label.vpc.router.details": "VPC ruterdetaljer",
-    "label.vpc.supportsregionlevelvpc": "Støtter Region Nivå VPC",
-    "label.vpc.virtual.router": "VPC virtuell ruter",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN Kundegateway",
-    "label.vpn.force.encapsulation": "Tving UDP innkapsling av ESP-pakker",
-    "label.vsmctrlvlanid": "Kontroll VLAN ID",
-    "label.vsmpktvlanid": "Pakke VLAN ID",
-    "label.vsmstoragevlanid": "Lagrings VLAN ID",
-    "label.vsphere.managed": "Administrert Av vSphere",
-    "label.vswitch.name": "vSwitch navn",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN-rekke",
-    "label.waiting": "Venter",
-    "label.warn": "Varsle",
-    "label.warn.upper": "WARN",
-    "label.warning": "Advarsel",
-    "label.wednesday": "Onsdag",
-    "label.weekly": "Ukentlig",
-    "label.welcome": "Velkommen",
-    "label.welcome.cloud.console": "Velkommen til administrasjonskonsollet",
-    "label.what.is.cloudstack": "Hva er CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Original XS versjon er 6.1+",
-    "label.xenserver.traffic.label": "XenServer trafikketikett",
-    "label.yes": "Ja",
-    "label.zone": "Sone",
-    "label.zone.dedicated": "Dedikert sone",
-    "label.zone.details": "Sonedetaljer",
-    "label.zone.id": "Sone ID",
-    "label.zone.lower": "Sone",
-    "label.zone.name": "Sonenavn",
-    "label.zone.step.1.title": "Steg 1: <strong>Velg et nettverk</strong>",
-    "label.zone.step.2.title": "Steg 2: <strong>Legg til en sone</strong>",
-    "label.zone.step.3.title": "Steg 3: <strong>Legg til en pod</strong>",
-    "label.zone.step.4.title": "Steg 4: <strong>Legg til en IP-rekke</strong>",
-    "label.zone.type": "Sonetype",
-    "label.zone.wide": "Sone omfattende",
-    "label.zoneWizard.trafficType.guest": "Gjest: Trafikk mellom brukeres virtuelle maskiner",
-    "label.zoneWizard.trafficType.management": "Administrasjon: Trafikk mellom CloudStacks interne ressurser, inkludert eventuelle komponenter som kommuniserer med administrasjonsservere, som verter og CloudStack systemVMer",
-    "label.zoneWizard.trafficType.public": "Offentlig: nettverkstrafikk mellom internet og VMs i CloudStack.",
-    "label.zoneWizard.trafficType.storage": "Lagring: Trafikk mellom primær og sekundærlagringsservere, slik som VM-maler og øyeblikksbilder.",
-    "label.zones": "Soner",
-    "managed.state": "Administrert Status",
-    "message.XSTools61plus.update.failed": "Feilet å oppdatere original XS versjon er 6.1+ feltet. Feil:",
-    "message.Zone.creation.complete": "Opprettelsen av sonen utført",
-    "message.acquire.ip.nic": "Vennligst bekreft at du vil allokere en ny sekundær IP for dette nettverkskortet. <br />NB: Du må manuelt konfigurere den nye sekundær-IPen i den virtuelle maskinen.",
-    "message.acquire.new.ip": "Vennligst bekreft at du ønsker å anskaffe en ny IP for dette nettverket",
-    "message.acquire.new.ip.vpc": "Vennligst bekreft at du ønsker å hente en ny IP for denne VPC.",
-    "message.acquire.public.ip": "Vennligst velg en sone som du vil hente ny IP fra.",
-    "message.action.cancel.maintenance": "Din vert har vellykket blitt kansellert for vedlikehold. Denne prosessen kan ta opptil flere minutter.",
-    "message.action.cancel.maintenance.mode": "Vennligst bekreft at du ønsker å kansellere dette vedlikeholdet.",
-    "message.action.change.service.warning.for.instance": "Din instans må være stopped før du forsøker å endret nåværende tjenestetilbud.",
-    "message.action.change.service.warning.for.router": "Din ruter må være stoppet før du kan forsøke å endre nåværende tjenestetilbud.",
-    "message.action.delete.ISO": "Vennligst bekreft at du vil slette denne ISO.",
-    "message.action.delete.ISO.for.all.zones": "Denne ISO er brukt av alle soner. Vennligst bekreft at du ønsker å slette den fra alle soner.",
-    "message.action.delete.cluster": "Vennligst bekreft at du vil slette denne klyngen.",
-    "message.action.delete.disk.offering": "Vennligst bekreft at du ønsker å slette dette disktilbudet.",
-    "message.action.delete.domain": "Vennligst bekreft at du vil slette dette domenet.",
-    "message.action.delete.external.firewall": "Vennligst bekreft at du vil fjerne denne eksterne brannmuren. Advarsel: hvis du planlegger å legge tilbake den samme eksterne brannmuren, må du resette bruksdataene på enheten.",
-    "message.action.delete.external.load.balancer": "Vennligst bekreft at du ønsker å fjerne denne eksterne lastbalansereren. Advarsel: hvis du planlegger å legge til den samme eksterne lastbalansereren senere, må du resette bruksdataene på enheten.",
-    "message.action.delete.ingress.rule": "Vennligst bekreft at du ønsker å slette denne inngående regel.",
-    "message.action.delete.network": "Vennligst bekreft at du vil slette dette nettverket.",
-    "message.action.delete.nexusVswitch": "Vennligst bekreft at du ønsker å slette denne nexus 1000v",
-    "message.action.delete.nic": "Vennligst bekreft at du vil fjerne dette NIC, noe som også vil fjerne det assosierte nettverket fra VMen.",
-    "message.action.delete.physical.network": "Vennligst bekreft at du ønsker å slette dette fysiske nettverk",
-    "message.action.delete.pod": "Vennligst bekreft at du vil slette denne pod.",
-    "message.action.delete.primary.storage": "Vennligst bekreft at du ønsker å slette denne primærlagring.",
-    "message.action.delete.secondary.storage": "Vennligst bekreft at du ønsker å slette denne sekundærlagring.",
-    "message.action.delete.security.group": "Vennligst bekreft at du ønsker å slette denne sikkerhetsgruppe.",
-    "message.action.delete.service.offering": "Vennligst bekreft at du ønsker å slette dette tjenestetilbud.",
-    "message.action.delete.snapshot": "Vennligst bekreft at du ønsker å slette dette øyeblikksbildet.",
-    "message.action.delete.system.service.offering": "Vennligst bekreft at du ønsker å slette dette system-tjenestetilbud.",
-    "message.action.delete.template": "Vennligst bekreft at du vil slette denne mal.",
-    "message.action.delete.template.for.all.zones": "Denne mal er brukt av alle soner. Vennligst bekreft at du ønsker å slette den fra alle soner.",
-    "message.action.delete.volume": "Vennligst bekreft at du vil slette dette volumet.",
-    "message.action.delete.zone": "Vennligst bekreft at du ønsker å slette denne sone.",
-    "message.action.destroy.instance": "Vennligst bekreft at du ønsker å fjerne denne instansen.",
-    "message.action.destroy.systemvm": "Vennligst bekreft at du ønsker å ødelegge denne System VM.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Vennligst bekreft at du ønsker å detaktivere denne klyngen.",
-    "message.action.disable.nexusVswitch": "Vennligst bekreft at du ønsker å deaktivere denne nexus 1000v",
-    "message.action.disable.physical.network": "Vennligst bekreft at du ønsker å deaktivere dette fysiske nettverket.",
-    "message.action.disable.pod": "Vennligst bekreft at du ønsker å aktivere denne poden",
-    "message.action.disable.static.NAT": "Vennligst bekreft at du ønsker å deaktivere statisk NAT.",
-    "message.action.disable.zone": "Vennligst bekreft at du ønsker å deaktivere denne sonen.",
-    "message.action.download.iso": "Vennligst bekreft at du ønsker å laste ned denne ISO.",
-    "message.action.download.template": "Vennligst bekreft at du ønsker å laste ned denne malen.",
-    "message.action.downloading.template": "Laster ned mal.",
-    "message.action.enable.cluster": "Vennligst bekreft at du ønsker å aktivere denne klyngen.",
-    "message.action.enable.maintenance": "Din vert har vellykket blitt forberedt for vedlikehold. Denne prosessen kan ta opptil flere minutter.",
-    "message.action.enable.nexusVswitch": "Vennligst bekreft at du ønsker å aktivere denne nexus 1000v",
-    "message.action.enable.physical.network": "Vennligst bekreft at du ønsker å aktivere dette fysiske nettverket.",
-    "message.action.enable.pod": "Vennligst bekreft at du ønsker å aktivere denne poden.",
-    "message.action.enable.zone": "Vennligst bekreft at du ønsker å aktivere denne sonen.",
-    "message.action.expunge.instance": "Vennligst bekreft at du vil permanent slette denne instansen.",
-    "message.action.force.reconnect": "Din vert har vellykket blitt tvunget til å koble til på nytt. Denne prosessen kan ta noen minutter.",
-    "message.action.host.enable.maintenance.mode": "Aktivering av vedlikeholdsmodus vil forårsake migrering av alle kjørende instanser på denne vert til hvilken som helst annen tilgjengelig vert.",
-    "message.action.instance.reset.password": "Vennligst bekreft ay du ønsker å endre ROOT-passordet for denne virtuelle maskin.",
-    "message.action.manage.cluster": "Vennligst bekreft at du ønsker å administrere klyngen.",
-    "message.action.primarystorage.enable.maintenance.mode": "Advarsel: setting av primærlagring i vedlikeholdsmodus vil forårsake at alle VMer som benytter volum fra det vil bli stoppet. Ønsker du å fortsette?",
-    "message.action.reboot.instance": "Vennligst bekreft at du vill restarte denne instansen.",
-    "message.action.reboot.router": "Alle tjenester levert fra denne virtuelle ruter vil bli avbrutt. Vennligst bekreft at du ønsker å restarte denne ruteren.",
-    "message.action.reboot.systemvm": "Vennligst bekreft at du vil restarte denne system VM",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Vennligst bekreft at du ønsker å frigi denne IP.",
-    "message.action.remove.host": "Vennligst bekreft at du vil gjerne denne tjeneren.",
-    "message.action.reset.password.off": "Din instans støtter foreløpig ikke denne funksjonen.",
-    "message.action.reset.password.warning": "Din instans må være stoppet før man forsøker å bytte nåværende passord.",
-    "message.action.restore.instance": "Vennligst bekreft at du ønsker å gjenopprette denne instansen.",
-    "message.action.revert.snapshot": "Vennligst bekreft at du ønsker å gjenopprette volumet til dette øyeblikksbildet.",
-    "message.action.start.instance": "Vennligst bekreft at du ønsker å starte denne instansen.",
-    "message.action.start.router": "Vennligst bekreft at du vil starte denne ruter.",
-    "message.action.start.systemvm": "Vennligst bekreft at du vil starte denne system VM.",
-    "message.action.stop.instance": "Vennligst bekreft at du vil stoppe denne instansen.",
-    "message.action.stop.router": "Alle tjenester levert fra denne virtuelle ruter vil bli avbrutt. Vennligst bekreft at du ønsker å stoppe denne ruteren.",
-    "message.action.stop.systemvm": "Vennligst bekreft at du vil stoppe denne system VM.",
-    "message.action.take.snapshot": "Vennligst bekreft at du vil ta et øyeblikksbilde av dette volumet.",
-    "message.action.snapshot.fromsnapshot":"Bekreft at du vil ta et øyeblikksbilde av dette virtuelle maskinbildet.",
-    "message.action.unmanage.cluster": "Vennligst bekreft at du ikke ønsker å administere klyngen.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Vennligst bekreft at du ønsker å slette dette VM øyeblikksbildet.",
-    "message.action.vmsnapshot.revert": "Tilbakestill VM øyeblikksbilde",
-    "message.activate.project": "Er du sikker på du ønsker å aktivere dette prosjektet?",
-    "message.add.VPN.gateway": "Vennligst bekreft at du ønsker å legge til en VPN Gateway",
-    "message.add.cluster": "Legg til en hypervisor-administrert klynge for sone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Legg til en hypervisor-administrert klynge for sone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Vennligst spesifiser følgende parametere for å legge til et nytt disktjenestetilbud",
-    "message.add.domain": "Vennligst bekreft underdomenet du ønsker å opprette under dette domenet",
-    "message.add.firewall": "Legg en brannmur til sonen",
-    "message.add.guest.network": "Vennligst bekreft at du ønsker å legge til gjestenettverk",
-    "message.add.host": "Vennligst spesifiser følgende parametere for å legge til en ny vert",
-    "message.add.ip.range": "Legg til en IP-rekke til offentlige nettverk i sonen",
-    "message.add.ip.range.direct.network": "Legg til en IP-rekke til et direkte-nettverk <b><span id=\"directnetwork_name\"></span></b> i sone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Legg til IP-addresser til pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Legg til lastbalanserer i sone",
-    "message.add.load.balancer.under.ip": "Lastbalanseringsregelen har blitt lagt til under IP:",
-    "message.add.network": "Legg til nytt nettverk for sone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Vennligst spesifiser følgende påkrevd informasjon for å legge til en ny gateway i dette VPC nettverket.",
-    "message.add.pod": "Legg til ny pod for sone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Hver sone må inneholde en eller flere pods, og vi legger til den første poden nå. En pod inneholder verter og primærlagring, som du legger til i et senere steg.Først, konfigurer en rekke med reserverte IP-adresser for CloudStacks interne administrasjonstrafikk. Den reserverte IP-rekken må være unik for hver sone i en sky.",
-    "message.add.primary": "Vennligst spesifiser følgende paramtere for å legge til ny hovedlagring.",
-    "message.add.primary.storage": "Legg til ny primærlagring for sone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Vennligst spesifiser følgende påkrevd informasjon for å legge til en ny region.",
-    "message.add.secondary.storage": "Legg til ny lagring for sone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Vennligst skriv inn følgende data for å legge til et nytt datakraftstilbud.",
-    "message.add.system.service.offering": "Vennligst skriv inn følgende data for å legge til et nytt systemtjenestetilbud.",
-    "message.add.template": "Vennligst skriv inn følgende data for å opprette din nye mal",
-    "message.add.volume": "Vennligst skriv inn følgende data for å legge til et nytt volum.",
-    "message.added.vpc.offering": "La til VPC tilbud",
-    "message.adding.Netscaler.device": "Legg til NetScaler-enhet",
-    "message.adding.Netscaler.provider": "Legger til Netscaler tilbyder",
-    "message.adding.host": "Legger til vert",
-    "message.additional.networks.desc": "Vennligst velg tilleggsnettverk som din virtuelle instans vil være tilkoblet.",
-    "message.admin.guide.read": "For VMware-baserte VMer, vennligst les avsnittet om dynamisk skalering i administrasjonsdokumentasjonen før skalering. Ønsker du å fortsette?,",
-    "message.advanced.mode.desc": "Velg denne nettverksmodellen hvis du ønsker å aktivere VLAN-støtte. Denne nettverksmodellen gir den største fleksibiliteten ved å tillate administatorer å lage egne nettverkstilbud som å tilby brannmur, vpn og lastbalanserings-støtte så vel som å tillate direkte mot virtuelt nettverk.",
-    "message.advanced.security.group": "Velg dette hvis du ønsker å bruke sikkerhetsgrupper for å tilby gjeste-VM isolering.",
-    "message.advanced.virtual": "Velg dette hvis du ønsker å bruke soneomfattende VLAN for å tilby gjeste-VM isolering.",
-    "message.after.enable.s3": "S3-støttet sekundærlagring konfigurert. Merk: Når du forlater denne siden så vil det ikke være mulig å konfigurere S3 på nytt.",
-    "message.after.enable.swift": "Swift konfigurert. Merk: Når du forlater denne siden så vil det ikke være mulig konfigurere Swift på nytt.",
-    "message.alert.state.detected": "Alarm oppdaget",
-    "message.allow.vpn.access": "Vennligst skriv inn et brukernavn og passord for brukeren du til gi VPN-tilgang.",
-    "message.apply.snapshot.policy": "Du har oppdatert den nåværende øyeblikksbilde policyen.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Vennligst bekreft at du vil tildele ISOen til denne virtuelle instans.",
-    "message.attach.volume": "Vennligst fyll inn følgende data for å tilknytte et nytt volum. Hvis du tilknytter et diskvolum til en Windows-basert virtuell maskin så er du nødt til å restarte instansen for å se den tilknyttede disken.",
-    "message.basic.mode.desc": "Velg denne nettverksmodellen hvis du <b>*<u>ikke</u>*</b> vil aktivere VLAN støtte. Alle virtuelle instnanser opprettet under denne nettverksmodellen vil bli tildelt en IP direkte fra nettverket og sikkerhetsgrupper blir benyttet for å tilby sikkerhet og segregering.",
-    "message.change.ipaddress": "Vennligst bekreft at du ønsker å endre IP-adressen til dette nettverkskortet på maskinen.",
-    "message.change.offering.confirm": "Vennligst bekreft at du vil forandre servicetilbudet for denne virtuelle maskinen.",
-    "message.change.password": "Vennligst endre ditt passord",
-    "message.cluster.dedicated": "Dedikert Til Klynge",
-    "message.cluster.dedication.released": "Klynge dedikering frigjort",
-    "message.configure.all.traffic.types": "Du har flere fysiske nett; vennligst konfigurer etiketter for hver trafikktype ved å klikke på Rediger-knappen.",
-    "message.configure.firewall.rules.allow.traffic": "Konfigurer reglene for å tillate trafikk",
-    "message.configure.firewall.rules.block.traffic": "Konfigurer reglene for å blokkere trafikk",
-    "message.configure.ldap": "Bekreft at du ønsker å konfigurere LDAP.",
-    "message.configuring.guest.traffic": "Konfigurerer gjestetrafikk",
-    "message.configuring.physical.networks": "Konfigurer fysisk nettverk",
-    "message.configuring.public.traffic": "Konfigurerer offentlig trafikk",
-    "message.configuring.storage.traffic": "Konfigurerer lagringstrafikk",
-    "message.confirm.action.force.reconnect": "Vennligst bekreft at du ønsker å tvinge et nytt tilkoblingsforsøk for denne vert.",
-    "message.confirm.add.vnmc.provider": "Vennligst bekreft at du ønsker å installere denne VNMC tilbyderen.",
-    "message.confirm.archive.alert": "Vennlgist bekreft at du vil arkivere denne varslingen.",
-    "message.confirm.archive.event": "Vennligst bekreft at du ønsker å arkivere denne hendelsen.",
-    "message.confirm.archive.selected.alerts": "Vennligst bekreft at du ønsker å arkivere valgte varsler",
-    "message.confirm.archive.selected.events": "Vennligst bekreft at du vil arkivere valgte hendelser",
-    "message.confirm.attach.disk": "Er du sikker på at du vil tildele disk?",
-    "message.confirm.create.volume": "Er du sikker på at du vil opprette volum?",
-    "message.confirm.current.guest.CIDR.unchanged": "Ønsker du å beholde nåværende gjestenettverks CIDR uendret?",
-    "message.confirm.dedicate.cluster.domain.account": "Bekreft at du vil dedikere denne klyngen til et domene / en konto?",
-    "message.confirm.dedicate.host.domain.account": "Ønsker du virkelig å dedikere denne verten til et domene/konto?",
-    "message.confirm.dedicate.pod.domain.account": "Ønsker du virkelig å dedikere denne pod til et domene/konto?",
-    "message.confirm.dedicate.zone": "Ønsker du virkelig å dedikere denne sonen til et domene/konto?",
-    "message.confirm.delete.BigSwitchBcf": "Vennligst bekreft at du ønsker å slette denne BigSwitch BCF Controlleren?",
-    "message.confirm.delete.BrocadeVcs": "Vennligst bekreft at du vil slette denne Brocade Vcs svitsjen",
-    "message.confirm.delete.F5": "Vennligst bekreft at du ønsker å slette F5",
-    "message.confirm.delete.NetScaler": "Vennligst bekreft at du ønsker å slette Netscaler",
-    "message.confirm.delete.PA": "Vennligst bekreft at du vil slette Palo Alto",
-    "message.confirm.delete.SRX": "Vennligst bekreft at du ønsker å slette SRX",
-    "message.confirm.delete.acl.list": "Er du sikker på at du ønsker å slette denne ACL listen?",
-    "message.confirm.delete.alert": "Er du sikker på at du vil slette denne varslingen ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Vennligst bekreft at du ønsker å slette Bare Metal-konfigurasjonen.",
-    "message.confirm.delete.ciscoASA1000v": "Vennligst bekreft at du vil slette CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Vennligst bekreft at du vil slette CiscoVNMC",
-    "message.confirm.delete.internal.lb": "Vennligst bekreft at du ønsker å slette Intern LB",
-    "message.confirm.delete.secondary.staging.store": "Vennligst bekreft at du vil slette dette sekundærmellomlagringsområde.",
-    "message.confirm.delete.ucs.manager": "Vennligst bekreft at du ønsker å slette UCS Manager",
-    "message.confirm.destroy.router": "Vennligst bekreft at du ønsker å fjerne denne ruteren",
-    "message.confirm.disable.host": "Vennligst bekreft at du vil detaktivere denne vert",
-    "message.confirm.disable.network.offering": "Er du sikker på at du vil deaktivere dette nettverkstilbudet?",
-    "message.confirm.disable.provider": "Vennligst bekreft at du ønsker å deaktivere denne tilbyderen",
-    "message.confirm.disable.vnmc.provider": "Vennligst bekreft at du ønsker å deaktivere denne VNMC tilbyderen.",
-    "message.confirm.disable.vpc.offering": "Er du sikker på at du vil deaktivere dette VPC tilbudet?",
-    "message.confirm.enable.host": "Vennligst bekreft at du ønsker å aktivere verten",
-    "message.confirm.enable.network.offering": "Vil du aktivere dette nettverkstilbudet?",
-    "message.confirm.enable.provider": "Vennligst bekreft at du ønsker å aktivere denne tilbyderen",
-    "message.confirm.enable.vnmc.provider": "Vennligst bekreft at du ønsker å aktivere denne VNMC tilbyderen.",
-    "message.confirm.enable.vpc.offering": "Er du sikker på at du vil aktivere dette VPC nettverkstilbudet?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Vennligst bekreft at du ønsker å delta i dette prosjektet.",
-    "message.confirm.migrate.volume": "Ønsker du å migrere dette volumet?",
-    "message.confirm.refresh.blades": "Vennligst bekreft at du vil oppdatere blade status.",
-    "message.confirm.release.dedicate.vlan.range": "Vennligst bekreft at du vil frigi denne dedierte VLAN-rekken",
-    "message.confirm.release.dedicated.cluster": "Vil du aktivere denne dedikerte klyngen?",
-    "message.confirm.release.dedicated.host": "Ønsker du å frigi denne dedikerte verten ?",
-    "message.confirm.release.dedicated.pod": "Ønsker du å frigi denne dedikerte poden ?",
-    "message.confirm.release.dedicated.zone": "Ønsker du å frigi denne dedikerte sonen ?",
-    "message.confirm.remove.IP.range": "Vennligst bekreft du til fjerne denne IP-rangen.",
-    "message.confirm.remove.event": "Er du sikker på at du vil fjerne denne hendelsen?",
-    "message.confirm.remove.load.balancer": "Vennligst bekreft at du vil fjerne VM fra lastbalanserer",
-    "message.confirm.remove.network.offering": "Er du sikker på at du vil fjerne dette nettverkstilbudet?",
-    "message.confirm.remove.selected.alerts": "Vennligst bekreft at du ønsker å fjerne valgte alarmer",
-    "message.confirm.remove.selected.events": "Vennligst bekreft at du vil fjerne valgte hendelser",
-    "message.confirm.remove.vmware.datacenter": "Vennligst bekreft at du vil fjerne dette VMWare data senteret",
-    "message.confirm.remove.vpc.offering": "Er du sikker på at du vil fjerne dette VPC tilbudet?",
-    "message.confirm.replace.acl.new.one": "Vil du erstatte ACL med en ny?",
-    "message.confirm.scale.up.router.vm": "Ønsker du å skalere opp denne Ruter-VMen?",
-    "message.confirm.scale.up.system.vm": "Ønsker du å skalere opp denne system VM?",
-    "message.confirm.shutdown.provider": "Vennligst bekreft at du ønsker å stenge denne tilbyderen",
-    "message.confirm.start.lb.vm": "Vennligst bekreft at du vil starte LB VM",
-    "message.confirm.stop.lb.vm": "Vennligst bekreft at du vil stoppe LB VM",
-    "message.confirm.upgrade.router.newer.template": "Vennligst bekreft at du vil oppgradere ruter til å bruke nyere mal",
-    "message.confirm.upgrade.routers.account.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne kontoen til å bruke en nyere mal",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne klyngen til å bruke en nyere mal",
-    "message.confirm.upgrade.routers.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne sonen til å bruke en nyere mal",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne pod til å bruke en nyere mal",
-    "message.copy.iso.confirm": "Vennligst bekreft at du vil kopiere din ISO til",
-    "message.copy.template": "Kopier template <b id=\"copy_template_name_text\">XXX</b> fra sone <b id=\"copy_template_source_zone_text\"></b> til",
-    "message.copy.template.confirm": "Ønsker du å kopiere malen?",
-    "message.create.template": "Er du sikker på at du ønsker å lage malen?",
-    "message.create.template.vm": "Lage VM fra template <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Vennligst spesifiser følgende informasjon før opprettelse av en mal for ditt diskvolum: <b><span id=\"volume_name\"></span></b>. Opprettelse av malen kan ta flere minutter og lenger avhengig av størrelsen på volumet.",
-    "message.creating.cluster": "Oppretter klynge",
-    "message.creating.guest.network": "Oppretter gjestenettverk",
-    "message.creating.physical.networks": "Oppretter fysiske nettverk",
-    "message.creating.pod": "Oppretter pod",
-    "message.creating.primary.storage": "Oppretter primærlagring",
-    "message.creating.secondary.storage": "Oppretter sekundærlagring",
-    "message.creating.systemVM": "Oppretter system-VMer (dette kan ta litt tid)",
-    "message.creating.zone": "Oppretter sone",
-    "message.decline.invitation": "Er du sikker på du ønsker å avvise denne prosjektinvitasjonen?",
-    "message.dedicate.zone": "Dedikerer sone",
-    "message.dedicated.zone.released": "Sone dedikering frigitt",
-    "message.delete.VPN.connection": "Vennligst bekreft at du ønsker å slette VPN-tilkobling",
-    "message.delete.VPN.customer.gateway": "Vennligst bekreft at du ønsker å slette denne VPN gatewayen",
-    "message.delete.VPN.gateway": "Vennligst bekreft at du ønsker å slette denne VPN gatewayen",
-    "message.delete.account": "Vennligst bekreft at du vil slette denne kontoen.",
-    "message.delete.affinity.group": "Vennligst bekreft du til fjerne denne affinitetsgruppen.",
-    "message.delete.gateway": "Vennligst bekreft at du ønsker å slette gateway",
-    "message.delete.project": "Er du sikker på du ønsker å slette dette prosjektet?",
-    "message.delete.user": "Vennligst bekreft at du ønsker å slette denne bruker.",
-    "message.desc.add.new.lb.sticky.rule": "Legg til ny LB sticky regel",
-    "message.desc.advanced.zone": "For mer avanserte nettverks topologier. Denne nettverks modellen gir flest egenskaper rundt definisjon av gjestenettverk og gir alternativer for tilpassede netverkstilbud, slik for brannmurer, VPN og lastbalanserere.",
-    "message.desc.basic.zone": "Gir et enkelt nettverk hvor alle virtuelle instanser blir tildelt en IP-adresse direkte fra nettverket. Isolering av gjester kan tilbys på lag-3 ved hjelp av sikkerhetsgrupper (IP-adresse kilde-filtrering).",
-    "message.desc.cluster": "Hver pod må inneholde en eller flere pods, og vi vil installere den første klyngen nå. En klynge har til formål å samle en gruppe hypervisor verter. All vertene i en klynge må ha identisk marskinvare, kjøre samme hypervisor, være på samme nettverk, og ha tilgang til den samme primærlagringsenheten. Hver klynge består av en eller flere verter og en eller flere primærlagrings verter.",
-    "message.desc.create.ssh.key.pair": "Vennligst fyll inn følgende data for å opprette eller registrere et ssh-nøkkelpar. <br><br>(1) Hvis offentlig nøkkel er valgt så vil CloudStack registrere den offentlige nøkkelen. Du kan bruke den igjennom din private nøkkel.<br><br>(2) Hvis offentlig nøkkel ikke er valgt så vil CloudStack opprette et SSH-nøkkelpar. I dette tilfellet, vennligst kopier og ta være på den private nøkkelen. CloudStack vil ikke ta vare på den.<br>",
-    "message.desc.created.ssh.key.pair": "Laget et SSH-nøkkelpar.",
-    "message.desc.host": "Hver klynge må inneholde minst en vert (datamaskin) for gjester å kjøre på, og vi legger til den første nå. For at en vert skal fungere i CloudStack må du installere hypervisor-programvare på den, tildele en IP-adresse og sørge for at den er tilkoblet CloudStacks administrasjonsserver.<br/><br/>Oppgi vertens DNS- eller IP-adresse, brukernavnet (vanligvis root) og passord, og eventuelle etiketter du ønsker å kategorisere den med.",
-    "message.desc.primary.storage": "Hver klynge må inneholde en eller flere primærlagringer, og vi skal legge til den første nå. Primærlagring inneholder diskvolumer for alle maskiner som kjører på verter i klyngen. Bruk hvilken som helst standard-protokoll den underliggende hypervisoren støtter.",
-    "message.desc.reset.ssh.key.pair": "Vennligst spesifiser et ssh nøkkelpar som du vil legge til denne VM. Vennligst merk at root passordet vil bli endret av denne operasjonen hvis passord er aktivert.",
-    "message.desc.secondary.storage": "Hver sone må ha minst en NFS eller sekundærlagringsserver og vi vil legge til den første nå. Sekundærlingsserveren lagrer VM-maler, ISO-bilder og VM-disk øyeblikksbilder. Denne serveren må være tilgjengelig for alle verter i denne sonen. <br/><br/>Oppgi IP-adresseng og eksportert sti.",
-    "message.desc.zone": "En sone er den største gruppe enheten i en CloudStack installasjon. En sone er typisk sett på som et datasenter,  og gir bedre pålitelighet gjennom isolasjon og redundans. En sone består av en eller flere pods (hver pod inneholder hypervisor verter og primærlagringsenheter) og en sekundærlagringsenhet som er delt mellom alle pods i sonen.",
-    "message.detach.disk": "Er du sikker på at du ønsker å frakoble denne disken?",
-    "message.detach.iso.confirm": "Vennligst bekreft at du ønsker å frakoble ISOen fra denne virtuelle instansen.",
-    "message.disable.account": "Vennligst bekreft at du ønsker å deaktivere denne kontoen. Ved å deaktivere kontoen så vil alle brukere av denne kontoen ikke lenger ha tilgang til sine skyressurser. Alle virtuelle maskiner vil bli skrudd av umiddelbart.",
-    "message.disable.snapshot.policy": "Du har deaktivert den nåværende øyeblikksbilde policyen.",
-    "message.disable.user": "Vennligst bekreft at du ønsker å deaktivere denne bruker.",
-    "message.disable.vpn": "Er du sikker på at du vil deaktivere VPN?",
-    "message.disable.vpn.access": "Vennligst bekreft at du ønsker å deaktivere VPN-tilgang.",
-    "message.disabling.network.offering": "Deaktiverer nettverkstilbud",
-    "message.disabling.vpc.offering": "Deaktiverer VPC tilbud",
-    "message.disallowed.characters": "Ikke tillatte tegn: <,>",
-    "message.download.ISO": "Vennligst klikk <a href=\"#\">00000</a> for å laste ned ISO",
-    "message.download.template": "Vennligst klikk <a href=\"#\">00000</a> for å laste ned mal",
-    "message.download.volume": "Vennligst klikk <a href=\"#\">00000</a> for å laste ned volumet",
-    "message.download.volume.confirm": "Vennligst bekreft at du ønsker å laste ned dette volumet.",
-    "message.edit.account": "Oppdater (\"-1\" indikerer at det ikke er satt øvre grense for resursbruk)",
-    "message.edit.confirm": "Vennligst bekreft dine endringer før du klikker \"Lagre\".",
-    "message.edit.limits": "Oppdater øvre grense for resursbruk. \"-1\" indikerer at det ikke er satt øvre grense.",
-    "message.edit.traffic.type": "Vennligst oppgi trafikk-etiketten du ønsker knyttet til denne trafikktypen.",
-    "message.enable.account": "Bekreft at du ønsker å aktivere denne kontoen.",
-    "message.enable.user": "Vennligst bekreft at du ønsker å aktivere denne bruker.",
-    "message.enable.vpn": "Vennligst bekreft at du ønsker å aktivere VPN-tilgang for denne IP-adressen",
-    "message.enable.vpn.access": "VPN er deaktivert for denne IP-adressen. Ønsker du å aktivere VPN-tilgang?",
-    "message.enabled.vpn": "Din fjerntilkoblings-VPN er aktivert og kan nås via IPen",
-    "message.enabled.vpn.ip.sec": "Din IPSec delte nøkkel (psk) er",
-    "message.enabling.network.offering": "Aktiver nettverkstilbud",
-    "message.enabling.security.group.provider": "Aktiverer sikkerhetsgruppetilbyder",
-    "message.enabling.vpc.offering": "Aktiverer VPC tilbud",
-    "message.enabling.zone": "Aktiverer sonen",
-    "message.enabling.zone.dots": "Aktiverer sone...",
-    "message.enter.seperated.list.multiple.cidrs": "Skriv inn en kommaseparert liste over CIDRs hvis du har mer enn en",
-    "message.enter.token": "Vennligst skriv inn koden du fikk i invitasjonsmailen.",
-    "message.generate.keys": "Vennligst bekreft at du ønsker å generere nye nøkler for denne bruker.",
-    "message.gslb.delete.confirm": "Vennligst bekreft at du vil slette denne GSLB",
-    "message.gslb.lb.remove.confirm": "Vennligst bekreft at du vil slette lastbalansering fra GSLB",
-    "message.guest.traffic.in.advanced.zone": "Gjestetrafikk er kommunikasjon mellom sluttbrukers virtuelle maskiner. Spesifiser en rekke med VLAN-ider som kan inneholde gjestetrafikk for hvert fysiske nettverk.",
-    "message.guest.traffic.in.basic.zone": "Gjestetrafikk er kommunikasjon mellom sluttbrukers virtuelle gjester. Spesifiser en rekke med IP-adresser som CloudStack kan tildele virtuelle gjester. Sørg for at denne rekken ikke overlapper IP-rekken(e) som er reservert systemmaskiner.",
-    "message.host.dedicated": "Dedikert Vert",
-    "message.host.dedication.released": "Vert dedikering frigitt",
-    "message.installWizard.click.retry": "Klikk på knappen for å prøve oppstart på nytt.",
-    "message.installWizard.copy.whatIsACluster": "En klynge har til formål å samle en gruppe hypervisor verter. All vertene i en klynge må ha identisk marskinvare, kjøre samme hypervisor, være på samme subnett, og ha tilgang til den samme primærlagringsenheten.   Kjørende virtuelle maskiner (VM) kan migreres fra en vert i klyngen til en annen uten avbrudd for brukeren. En klynge er den tredje største enheten i CloudStack. En pod inneholder en eller flere klynger, og en sone inneholder en eller flere pods. <br/><br/>CloudStack can inneholde en eller flere klynger, men for en basic installasjon trengs bare en.",
-    "message.installWizard.copy.whatIsAHost": "En vert er en enkelt datamaskin. Verter tilbyr ressurser som kan gjøre virtuelle gjester. Hver vert har hypervisor-programvare installert for å administrere gjestene (bortsett fra råjern-verter, som er et spesialtilfelle diskutert i den avanserte installasjonsguiden). For eksempel, en Linux KVM-aktivert server, en Citrix XenServer server og en ESXi server er verter. I en enkel installasjon bruker vi en enkelt vert som kjører XenServer eller KVM.<br/><br/>Verten er den minste organisasjonsenheten i en CloudStack-installasjon. Verter er del av klynger, klynger er del av poder og poder er del av soner.",
-    "message.installWizard.copy.whatIsAPod": "En pod representerer ofte et enkelt rack. Verter i samme pod er i samme subnett.<br/><br/>En pod er den nest største enheten i en CloudStack-installasjon. Poder er en del av soner. Hver sone kan inneholde en eller flere poder; i en enkel installasjon vil du kun ha en pod i sonen.",
-    "message.installWizard.copy.whatIsAZone": "En sone er den største gruppe enheten i en CloudStack installasjon. En sone er typisk sett på som et datasenter, selv om man kan ha flere datasenter i en sone. CloudStack infrastrukturen kan deles inn i soner for å isolere og å gi redundans. Hver sone kan for eksempel ha sin egen data senter strømtilførsel og nettverkslink, og soner kan være spredd over større distanser.",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 er en programvare-plattform som grupperer dataressurser for å bygge offentlige, private og hybride infrastruktur som en tjeneste (IaaS) skyer. CloudStack&#8482 administrerer nettverk, lagring og regnekraft-verter som til sammen blir en sky-infrastruktur. Bruk CloudStack&#8482 til å distribuere, administrerre og konfigurere dine skyressurser og miljøer.<br/><br/>Utvid forbi individuelle virtuelle gjester som kjører på typisk maskinvare, CloudStack&#8482 gir en skybasert infrastruktur-programvare for levering av virtuelle datasentre som en tjeneste - lever alle de essensielle komponenente for å bygge, distribuere og administrere multi-tier og multi-tenant sky-applikasjoner. Både fri kildekode- og premium-versjoner er tilgjengelig, hvor den fri kildekode-basert gir tilnærmet samme funksjonalitet.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "En CloudStack&#8482 sky-infrastruktur tar i bruk to typer lagring: primærlagring og sekundærlagring. <br/><br/><strong>Primærlagring</strong> er assosiert med en klynge, og lagrer datadisker for hver gjest som kjører i den klyngen. Primærlagring er typisk plassert nært den faktiske verten.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Sekundærlagring er assosiert med en sone, og lagrer følgende: <ul><li>Maler - OS-bilder som kan brukes til å starte opp virtuelle gjester og kan inkludere ekstra konfigurasjon, som installerte applikasjoner</li><li>ISO-bilder - Bilder som kan være bootbare eller ikke-bootbare.</li><li>Diskvolum øyeblikksbilder - Lagrede kopier av virtuelle gjester som kan benyttes til rekonstruksjon eller for å lage nye maler</li></ul>",
-    "message.installWizard.now.building": "Bygger nå din nettsky...",
-    "message.installWizard.tooltip.addCluster.name": "Klyngenavnet. Dette kan være hva som helst og er ikke benyttet av CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "DNS-navnet eller IP-adressen til verten.",
-    "message.installWizard.tooltip.addHost.password": "Dette er passordet for brukeren gjengitt ovenfor (fra din XenServer-installasjon).",
-    "message.installWizard.tooltip.addHost.username": "Vanligvis root.",
-    "message.installWizard.tooltip.addPod.name": "Et navn for poden",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Dette er IP-rekken i det private nettverket som CloudStack bruker for å administrere Sekundærlagrins-servere og Konsollproxy-servere. Disse IP-adressene tas fra samme subnett som regnekraft-serverne.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "Gatewayen til vertene i poden.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "Nettmasken benyttet på subnettet gjestene vil bruke.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Dette er IP-rekken i det private nettverket som CloudStack bruker for å administrere Sekundærlagrins-servere og Konsollproxy-servere. Disse IP-adressene tas fra samme subnett som regnekraft-serverne.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "Navnet på lagringsenheten.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(for NFS) I NFS er dette den eksporterte filbanen fra serveren. Banen (for SharedMountPoint).  Med KVM er dette banen på hver vert hvor denne primære lagringen er tilkoblet.  For eksempel: \"mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(for NFS, iSCSI eller PreSetup) IP-adressen eller DNS-navnet til lagringsenheten.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "IP-adressen til NFS-serveren som inneholder sekundær lagring",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "Den eksporterte filbanen, fra serveren du spesifiserte ovenfor",
-    "message.installWizard.tooltip.addZone.dns1": "Dette er DNS-serveren som benyttes av gjeste-VMer i sonen. Disse DNS-serverene vil bli aksessert via det offentlige nettverket du vil legge til senere. De offentlige IP-adressene for en sone må ha en rute til DNS-serveren navngitt her.",
-    "message.installWizard.tooltip.addZone.dns2": "Dette er DNS-serveren som benyttes av gjeste-VMer i sonen. Disse DNS-serverene vil bli aksessert via det offentlige nettverket du vil legge til senere. De offentlige IP-adressene for en sone må ha en rute til DNS-serveren navngitt her.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Dette er DNS-servere som benyttes av systemmaskiner i sonen. Disse DNS-serverne vil bli aksessert via det private nettverksgrensesnittet til systemmaskinene. De private IP-adressene du oppgir for podene må ha en rute til DNS-serverne nevnt her.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Dette er DNS-servere som benyttes av systemmaskiner i sonen. Disse DNS-serverne vil bli aksessert via det private nettverksgrensesnittet til systemmaskinene. De private IP-adressene du oppgir for podene må ha en rute til DNS-serverne nevnt her.",
-    "message.installWizard.tooltip.addZone.name": "Et navn for sonen",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "En beskrivelse av nettverket",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "Rekken av IP-adresser som vil være tilgjengelig for allokering til gjester i denne sonen. Hvis ett grensesnitt er brukt, bør disse IPene være i samme CIDR som podens CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "Gatewayen gjestene skal bruke",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "Nettmasken benyttet på subnettet gjestene skal bruke",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "Rekken av IP-adresser som vil være tilgjengelig for allokering til gjester i denne sonen. Hvis ett grensesnitt er brukt, bør disse IPene være i samme CIDR som podens CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Et navn for nettverket",
-    "message.instance.scaled.up.confirm": "Ønsker du å skalere opp denne instancen?",
-    "message.instanceWizard.noTemplates": "Du har ingen maler tilgjengelig. Vennligst legg til en kompatibel mal og kjør instansveiviseren.",
-    "message.ip.address.changed": "Din IP-adresse kan ha endret seg. Ønsker du å oppdatere visningen? Merk at detaljvisningen vil i såfall lukkes.",
-    "message.iso.desc": "Diskimage som inneholder data etter oppstartsbar media for OS",
-    "message.join.project": "Du har nå deltatt i et prosjekt. Vennligst bytt til prosjektvisning for å se prosjektet.",
-    "message.launch.vm.on.private.network": "Ønsker du å starte instancen din på ditt dedikerte nettverk?",
-    "message.launch.zone": "Sonen er klar for aktivering; vennligst fortsett til neste steg.",
-    "message.ldap.group.import": "Alle brukere fra nevnte gruppe vil bli importert",
-    "message.link.domain.to.ldap": "Aktiver automatisk synkronisering for dette domenet i LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-klikk)",
-    "message.lock.account": "Vennligst bekreft at du ønsker å låse denne kontoen. Ved å låse kontoen så vil ingen brukere av denne kontoen kunne administere sine skyressurser. Eksisterende ressurser kan fortsatt bli aksessert.",
-    "message.migrate.instance.confirm": "Vennligst bekreft verten du ønsker å migrere den virtuelle instansen til.",
-    "message.migrate.instance.to.host": "Vennligst bekreft at du ønsker å migrere instansen til en annen vert.",
-    "message.migrate.instance.to.ps": "Vennligst bekreft at du ønsker å migrere instansen til en annen primærlagring.",
-    "message.migrate.router.confirm": "Vennligst bekreft verten du ønsker å migrere ruteren til:",
-    "message.migrate.systemvm.confirm": "Vennligst bekreft verten du ønsker å migrere system VM til:",
-    "message.migrate.volume": "Vennligst bekreft at du ønsker å migrere volumet til en annen primærlagring.",
-    "message.network.addVM.desc": "Vennligst spesifiser nettverket du vil legge til denne VMen. Et nytt NIC vil bli lagt til for dette nettverket.",
-    "message.network.addVMNIC": "Vennligst bekreft at du vil legge til ett nytt NIC for dette nettverket.",
-    "message.network.remote.access.vpn.configuration": "VPN fjerntilgangskonfigurasjon har blitt generert, men aktivering feilet. Vennligst sjekk tilkoblingen til nettverkselementet og forsøk på nytt.",
-    "message.new.user": "Spesifiser følgende informasjon for å legge til en ny bruker til denne kontoen",
-    "message.no.affinity.groups": "Du har ingen affinitetsgrupper. Fortsett til neste steg.",
-    "message.no.host.available": "Ingen hoster tilgjengelig for migrering",
-    "message.no.network.support": "Din valgte hypervisor, vSphere, har ikke flere nettverks evner. Forsett til punkt 5.",
-    "message.no.network.support.configuration.not.true": "Du har ingen soner med sikkerhetsgrupper aktivert. Derfor ingen ekstra nettverksfunksjoner. Fortsett til steg 5.",
-    "message.no.projects": "Du har ingen prosjekter.<br/>Vennligst opprett et nytt fra prosjektseksjonen.",
-    "message.no.projects.adminOnly": "Du har ingen prosjekter.<br/>Vennligst be din administrator om å opprette et nytt prosjekt.",
-    "message.number.clusters": "<h2><span> # av </span> Klynger</h2>",
-    "message.number.hosts": "<h2><span> # av </span> Verter</h2>",
-    "message.number.pods": "<h2><span> # av </span> Pods</h2>",
-    "message.number.storage": "<h2><span> # av </span> Primærlagringsvolumer</h2>",
-    "message.number.zones": "<h2><span> # av </span> Soner</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Passordet har blitt endret til",
-    "message.password.of.the.vm.has.been.reset.to": "Passorde for VM har blitt endre til",
-    "message.pending.projects.1": "Du har følgende prosjektinvitasjoner:",
-    "message.pending.projects.2": "For å se, vennligst gå til prosjektseksjonen og velg invitasjoner fra nedtrekksmenyen.",
-    "message.please.add.at.lease.one.traffic.range": "Vennligst legg til minst étt trafikknivå",
-    "message.please.confirm.remove.ssh.key.pair": "Vennligst bekreft at du vil fjerne dette SSH-nøkkelpar",
-    "message.please.proceed": "Vennligst fortsett til neste steg",
-    "message.please.select.a.configuration.for.your.zone": "Vennligst velg en konfigurasjon for din sone",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Vennligst velg et annet offentlig- og administrasjonsnettverk før du fjerner",
-    "message.please.select.networks": "Vennligst velg nettverk for din VM",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Vennligst velg et ssh nøkkelpar som du vil at denne VM skal benytte:",
-    "message.please.wait.while.zone.is.being.created": "Vennlist vent mens din sone opprettes. Dette kan ta noe tid...",
-    "message.pod.dedication.released": "Pod dedikering frigitt",
-    "message.portable.ip.delete.confirm": "Vennligst bekreft at du vil slette denne portable IP-rekken",
-    "message.project.invite.sent": "Invitasjon sendt til bruker. De vil bli lagt til prosjektet så snart de har akseptert invitasjonen",
-    "message.public.traffic.in.advanced.zone": "Offentlig trafikk blir generert av verter i skyen som aksesserer internett. Offentlige IP-adresser må allokerers for dette formået. Sluttbrukere kan bruke CloudStack brukergrensesnittet til å forespørre om disse IP-adressene til å implentere NAT mellom deres gjestenettverk og det offentlige nettverket.<br/><br/>Oppgi minst en rekke med IP-adresser for internettrafikk.",
-    "message.public.traffic.in.basic.zone": "Offentlig trafikk blir generert når virtuelle gjester i skyen aksesserer internett eller kan tilby tjenester til klienter over internett. Offentlig tilgjengelige IP-adresser må allokerers for dette formålet. Når en instans opprettes vil en IP fra dette settet med Offentlige IP-adresser bli tildelt i tillegg til en gjeste-IP-adresse. Statisk 1-1 NAT vil også bli satt opp automatisk mellom the offentlige og den private IP-adressen. Sluttbrukere kan også bruke CloudStack brukergrensesnittet til å tilegne ekstra IP-adresser for å implementere statisk NAT mellom deres instans og den offentlige IP-adressen.",
-    "message.question.are.you.sure.you.want.to.add": "Er du sikker på at du vil legge til",
-    "message.read.admin.guide.scaling.up": "Vennligst les avsnittet om dynamisk skalering i administrasjondokumentasjonen før du oppskalerer.",
-    "message.recover.vm": "Vennligst bekreft at du ønsker å gjenopprette denne VMen.",
-    "message.redirecting.region": "Omdirigerer til region...",
-    "message.reinstall.vm": "Advarsel: Fortsett med forsiktighet. Dette vil reinstallere VMen fra malen; data på rot-disken vil forsvinne. Ekstra datavolumer; hvis noen, vil ikke bli rørt.",
-    "message.remove.ldap": "Er du sikker på at du vil slette LDAP-konfigurasjonen?",
-    "message.remove.region": "Er du sikker på at du vil fjerne denne regionen fra denne administrasjonsserveren?",
-    "message.remove.vpc": "Vennligst bekreft at du ønsker å fjerne VPC",
-    "message.remove.vpn.access": "Vennligst bekreft at du ønsker å fjerne VPN-tilgang fra følgende bruker.",
-    "message.removed.ssh.key.pair": "Fjernet et SSH-nøkkelpar",
-    "message.reset.VPN.connection": "Vennligst bekreft at du ønsker å resette VPN-tilkobling",
-    "message.reset.password.warning.notPasswordEnabled": "Denne malen vil bli opprettet uten passord",
-    "message.reset.password.warning.notStopped": "Din instans må stoppes før man forsøker å bytte nåværende passord",
-    "message.restart.mgmt.server": "Vennlist restart administrajonsserveren(e) din(e) for at de nye innstillingene skal trå i kraft.",
-    "message.restart.mgmt.usage.server": "Vennligst restart administrasjonsserveren(e) din(e) og bruksserver(e) for at de nye innstillingene skal trå i kraft.",
-    "message.restart.network": "Alle tjenester fra dette nettverket vil bli avbrutt. Vennligst bekreft at du ønsker å restarte dette nettverket.",
-    "message.restart.vpc": "Vennligst bekreft at du ønsker å restarte VPC",
-    "message.restart.vpc.remark": "Vennligst bekreft du at du vil restarte VPC <p><small><i>Merk: Å gjøre en ikke reduntant VPC redundant vil tvinge en opprydning. Nettverkene vil ikke være tilgjengelig i noen minutter</i>.</small></p>",
-    "message.restoreVM": "Vil du gjenopprette denne VMen?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Bruk <strong>Ctrl-klikk</strong> for å velge alle aktuelle sikkerhetsgrupper)",
-    "message.select.a.zone": "En sone er typisk sett på som et datasenter. Multiple soner gir  CloudStack bedre pålitelighet gjennom isolasjon og redundans.",
-    "message.select.affinity.groups": "Vennligst velg en affinitetsgruppe denne VMen skal tilhøre:",
-    "message.select.instance": "Vennligst velg en instans.",
-    "message.select.iso": "Vennligst velg en ISO for din nye virtuelle instans.",
-    "message.select.item": "Vennligst velg et element",
-    "message.select.security.groups": "Vennligst velg sikkerhetsgruppe(r) for din nye VM",
-    "message.select.template": "Vennligst velg en mal for din nye virtuelle instans.",
-    "message.select.tier": "Vennligst velg en VPC-gren",
-    "message.set.default.NIC": "Vennligst bekreft at du vil gjøre dette NIC til standard for denne VM.",
-    "message.set.default.NIC.manual": "Vennligst oppdater standard-NIC manuelt på VMen nå.",
-    "message.setup.physical.network.during.zone.creation": "Når du legger til en avansert sone, må du konfigurere en eller flere fysiske nettverk. Hvert nettverk representerer et NIC på verten. Hvert fysiske nettverk kan inneholde en eller flere typer trafikk, med noen restriksjoner for hvordan de kan kombineres.<br/><br/><strong>Dra og slipp en eller flere nettverkstyper</strong> til hvert fysiske nettverk.",
-    "message.setup.physical.network.during.zone.creation.basic": "Når du legger til en enkel sone så kan du sette opp ett fysisk nettverk som korrensponderer til et NIC på hypervisor. Nettverket transporterer flere typer trafikk.<br/><br/> Du kan også <strong>drag og slippe</strong> andre trafikktyper over til det fysiske nettverket.",
-    "message.setup.successful": "Oppsettet av nettskyen er vellykket!",
-    "message.snapshot.schedule": "Du kan sette opp gjentakende øyeblikksbilder ved å velge fra tilgjengelige opsjoner nedenfor og aktivere dine preferanser.",
-    "message.specifiy.tag.key.value": "Vennligst bekreft tag nøkkel og verdi",
-    "message.specify.url": "Vennligst spesifiser URL",
-    "message.step.1.continue": "Vennligst velg en mal eller ISO for å fortsette.",
-    "message.step.1.desc": "Vennligst velg en mal for din nye virtuelle instans. Du kan også velge en blank mal som du kan installere fra en ISO på.",
-    "message.step.2.continue": "Velg et resurstilbud for å fortsette",
-    "message.step.3.continue": "Vennligst velg et disktilbud for å fortsette",
-    "message.step.4.continue": "Vennligst velg minst ett nettverk for å fortsette",
-    "message.step.4.desc": "Vennligst velg primærnettverket som din virtuelle instans vil bli tilkoblet til.",
-    "message.storage.traffic": "Trafikk mellom CloudStacks interne ressurser, inkludert alle komponenter som kommuniserer med administrassjonsserver, som verter og CloudStack systemmaskiner. Vennligst konfigurer lagringstrafikk her.",
-    "message.suspend.project": "Er du sikker du ønsker å pause dette prosjektet?",
-    "message.systems.vms.ready": "System-VMer klare.",
-    "message.template.copying": "Malen blir kopiert.",
-    "message.template.desc": "OS-image som kan brukes til å starte VMer",
-    "message.tier.required": "VPC-gren er påkrevd.",
-    "message.tooltip.dns.1": "Oppgi en DNS server for bruk av VMer i denne sonen. De offentlige IP-adressene for denne sonen må ha en rute til denne serveren.",
-    "message.tooltip.dns.2": "En sekundær DNS server for bruk av VMer i denne sonen. De offentlige IP-adressene for denne sonen må ha en rute til denne serveren.",
-    "message.tooltip.internal.dns.1": "Navn på en DNS-server for bruk av CloudStack interne systemVMer i sonen. Den private IP-adressen i podden må ha en rute til serveren.",
-    "message.tooltip.internal.dns.2": "Navn på en DNS-server for bruk av CloudStack interne systemVMer i sonen. Den private IP-adressen i podden må ha en rute til serveren.",
-    "message.tooltip.network.domain": "Et DNS suffiks som vil opprette et tilpasset domenenavn for nettverket som aksesseres av gjeste VMer.",
-    "message.tooltip.pod.name": "Et navn for denne pod.",
-    "message.tooltip.reserved.system.gateway": "Gatewayen til vertene i poden.",
-    "message.tooltip.reserved.system.netmask": "Nettverksprefiks som definerer podens subnett. Bruker CIDR-notasjon.",
-    "message.tooltip.zone.name": "Et navn for denne sonen.",
-    "message.update.os.preference": "Vennligst velg preferert OS for denne verten. Alle virtuelle instanser med lignende OS vil først bli allokert til denne verten før andre velges.",
-    "message.update.resource.count": "Vennligst bekreft at du ønsker å oppdatere ressurstellere for denne kontoen.",
-    "message.update.ssl": "Vennligst send inn en ny X.509 kompatibel SSL-sertifikatkjede for å oppdatere hver konsollproxy og virtuell instans for sekundærlagring:",
-    "message.update.ssl.failed": "Oppdatering av SSL-sertifikat feilet.",
-    "message.update.ssl.succeeded": "Oppdatering av SSL-sertifikat vellykket",
-    "message.validate.URL": "Vennligst skriv inn en gyldig URL.",
-    "message.validate.accept": "Vennligst skriv inn en verdi med et gyldig prefiks.",
-    "message.validate.creditcard": "Vennligst oppgi et gyldig kredittkortnummer.",
-    "message.validate.date": "Vennligst skriv inn en gyldig dato.",
-    "message.validate.date.ISO": "Vennligst skriv inn en gyldig dato (ISO).",
-    "message.validate.digits": "Vennligst skriv inn kun tall.",
-    "message.validate.email.address": "Vennligst skriv inn en gyldig e-postadresse.",
-    "message.validate.equalto": "Vennligst skriv inn den samme verdien igjen.",
-    "message.validate.fieldrequired": "Dette feltet er påkrevd.",
-    "message.validate.fixfield": "Vennligst fiks dette feltet.",
-    "message.validate.instance.name": "Instansnavn kan ikke være lenger enn 63 tegn. Kun ACSCII bokstaver a~z, A~Z, tall 0~9, bindestrek er tillatt. Må starte med en bokstav og slutte med en bokstav eller et tall.",
-    "message.validate.invalid.characters": "Ugyldige tegn funnet; vennligst korriger.",
-    "message.validate.max": "Skriv en verdi mindre enn eller lik {0}.",
-    "message.validate.maxlength": "Vennligst ikke skriv inn mer enn {0} tegn.",
-    "message.validate.minlength": "Vennligst skriv inn minst {0} tegn.",
-    "message.validate.number": "Vennligst skriv inn et gyldig nummer.",
-    "message.validate.range": "Skriv en verdi mellom {0} og {1}.",
-    "message.validate.range.length": "Vennligst skriv inn en verdi som er mellom {0} og {1} tegn langt.",
-    "message.virtual.network.desc": "Et dedikert virtualisert nettverk for din konto. Kringkastingsdomenet er isolert inne i et VLAN og offentlig nettverkstrafikk er rutet ut av en virtuell ruter.",
-    "message.vm.create.template.confirm": "Oppretting av Mal vil restarte VM automatisk.",
-    "message.vm.review.launch": "Vennligst vurder følgende informasjon og bekreft at din virtuelle instans er korrekt før kjøring",
-    "message.vnmc.available.list": "VNMC er ikke tilgjengelig fra tilbyder listen.",
-    "message.vnmc.not.available.list": "VNMC er ikke tilgjengelig fra tilbyder listen.",
-    "message.volume.create.template.confirm": "Vennligst bekreft at du ønsker å lage en mal for dette diskvolumet. Opprettelse av male kan ta opptil flere minutter eller lenger, avhengig av størrelsen på volumet.",
-    "message.waiting.for.builtin.templates.to.load": "Venter på at innebygde maler skal lastes...",
-    "message.you.must.have.at.least.one.physical.network": "Du trenger minst ett fysisk nettverk",
-    "message.your.cloudstack.is.ready": "Din CloudStack er klar!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Soneopprettelse fullført. Ønsker du å aktivere denne sonen?",
-    "message.zone.no.network.selection": "Sonen du har valgt har ingen mulighet for valg av nettverk.",
-    "message.zone.step.1.desc": "Vennligst en nettverksmodell for din sone.",
-    "message.zone.step.2.desc": "Vennligst skriv inn følgende informasjon for å legge til en ny sone",
-    "message.zone.step.3.desc": "Vennligst skriv inn følgende informasjon for å legge til en ny pod",
-    "message.zoneWizard.enable.local.storage": "ADVARSEL: Hvis du aktiverer lokal lagring for denne sonen må du gjøre følgende, avhengig av hvor du ønsker at systemmaskiner skal starte:<br/><br/>1. Hvis systemmaskiner trenger å starte fra delt lagring, må det legges til delt lagring etter at sonen er opprettet. Sonen må også startes som deaktivert.<br/><br/>2. Hvis systemmaskiner trenger å starte fra lokal lagring, må system.vm.use.local.storage settes til true før du aktiverer sonen.<br/><br/><br/>Vil du fortsette?",
-    "messgae.validate.min": "Skriv en verdig større enn eller lik {0}.",
-    "mode": "Modus",
-    "network.rate": "Nettverksrate",
-    "notification.reboot.instance": "Omstart av instans",
-    "notification.start.instance": "Start instans",
-    "notification.stop.instance": "Stopp instans",
-    "side.by.side": "Side ved side",
-    "state.Accepted": "Akseptert",
-    "state.Active": "Aktiv",
-    "state.Allocated": "Allokert",
-    "state.Allocating": "Allokerer",
-    "state.BackedUp": "Sikkerhetskopiert",
-    "state.BackingUp": "Sikkerhetskopierer",
-    "state.Completed": "Utført",
-    "state.Creating": "Oppretter",
-    "state.Declined": "Avvist",
-    "state.Destroyed": "Destruert",
-    "state.Disabled": "Inaktiv",
-    "state.Enabled": "Aktivert",
-    "state.Error": "Feil",
-    "state.Expunging": "Fjerner",
-    "state.Migrating": "Migrering",
-    "state.Pending": "Venter",
-    "state.Ready": "Klar",
-    "state.Running": "Kjører",
-    "state.Starting": "Starter",
-    "state.Stopped": "Stoppet",
-    "state.Stopping": "Stopper",
-    "state.Suspended": "Pauset",
-    "state.detached": "Frakoblet",
-    "title.upload.volume": "Last opp volum",
-    "ui.listView.filters.all": "Alle",
-    "ui.listView.filters.mine": "Mine"
-};
diff --git a/ui/legacy/l10n/nl_NL.js b/ui/legacy/l10n/nl_NL.js
deleted file mode 100644
index b3f3733..0000000
--- a/ui/legacy/l10n/nl_NL.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP Code",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP Type",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Item eigenschappen gewijzigd",
-    "confirm.enable.s3": "Vul de volgende informatie in om ondersteuning voor S3-aangestuurde Secundaire Opslag te activeren",
-    "confirm.enable.swift": "Vul de volgende informatie in om ondersteuning voor Swift te activeren",
-    "error.could.not.change.your.password.because.non.native.user": "Fout. Kan wachtwoord niet wijzigen omdat LDAP is uitgeschakeld.",
-    "error.could.not.enable.zone": "Kon zone niet activeren",
-    "error.installWizard.message": "Er ging iets mis; je kunt teruggaan om de eventuele fouten te herstellen",
-    "error.invalid.username.password": "Ongeldige gebruikersnaam of wachtwoord",
-    "error.login": "Uw gebruikersnaam/wachtwoord komt niet overeen met onze gegevens",
-    "error.menu.select": "Kan actie niet uitvoeren omdat geen items zijn geselecteerd",
-    "error.mgmt.server.inaccessible": "The Management Server is niet toegankelijk. Probeer het later opnieuw.",
-    "error.password.not.match": "De wachtwoord velden komen niet overeen",
-    "error.please.specify.physical.network.tags": "Netwerk aanbiedingen zijn niet beschikbaar totdat u labels voor het fysieke netwerk specificeert.",
-    "error.session.expired": "Uw sessie is verlopen",
-    "error.something.went.wrong.please.correct.the.following": "Er is iets mis gegaan; Corrigeer het volgende",
-    "error.unable.to.reach.management.server": "Niet in staat om de Management Server te bereiken",
-    "error.unresolved.internet.name": "Uw internet naam kan niet worden omgezet.",
-    "force.delete": "Geforceerd verwijderen",
-    "force.delete.domain.warning": "Waarschuwing: Wanneer u deze optie selecteert zullen alle onderliggende domeinen, hun gekoppelde accounts en hun verbruik worden verwijderd.",
-    "force.remove": "Geforceerd loskoppelen",
-    "force.remove.host.warning": "Waarschuwing: Wanneer u deze optie selecteert zal CloudStack alle draaiende virtuele machines geforceerd stoppen voordat de host van het cluster wordt verwijderd.",
-    "force.stop": "Geforceerd stoppen",
-    "force.stop.instance.warning": "Waarschuwing: Een instantie geforceerd stoppen zou uw laatste optie moeten zijn. Het kan leiden tot dataverlies en inconsistent gedrag van de staat van de virtuele machine.",
-    "hint.no.host.tags": "geen machine kentekens gevonden",
-    "hint.no.storage.tags": "geen opslag kentekens gevonden",
-    "hint.type.part.host.tag": "type een deel van een machine kenteken",
-    "hint.type.part.storage.tag": "type een deel van een opslag kenteken",
-    "image.directory": "Afbeelding Directory",
-    "inline": "Inline",
-    "instances.actions.reboot.label": "Herstart instantie",
-    "label.CIDR.list": "CIDR lijst",
-    "label.CIDR.of.destination.network": "CIDR van bestemmingsnetwerk",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "DHCP Server Type",
-    "label.DNS.domain.for.guest.networks": "DNS domein voor Gast Netwerken",
-    "label.ESP.encryption": "ESP Encryptie",
-    "label.ESP.hash": "ESP Hash",
-    "label.ESP.lifetime": "ESP Lifetime (secondes)",
-    "label.ESP.policy": "ESP policy",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE Encryptie",
-    "label.IKE.hash": "IKE Hash",
-    "label.IKE.lifetime": "IKE lifetime (secondes)",
-    "label.IKE.policy": "IKE policy",
-    "label.IPsec.preshared.key": "IPsec Preshared-Key",
-    "label.LB.isolation": "LB isolatie",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto Log Profiel",
-    "label.PA.threat.profile": "Palo Alto Threat Profiel",
-    "label.PING.CIFS.password": "PING CIFS wachtwoord",
-    "label.PING.CIFS.username": "PING CIFS gebruikersnaam",
-    "label.PING.dir": "PING Directory",
-    "label.PING.storage.IP": "PING opslag IP",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "PXE Server Type",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Poort",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP Directory",
-    "label.VMFS.datastore": "VMFS datastore",
-    "label.VMs.in.tier": "VMs in tier",
-    "label.VPC.limits": "VPC limieten",
-    "label.VPC.router.details": "VPC router details",
-    "label.VPN.connection": "VPN Connectie",
-    "label.VPN.customer.gateway": "VPN Customer Gateway",
-    "label.VPN.gateway": "VPN Gateway",
-    "label.Xenserver.Tools.Version61plus": "XenServer Tools Versie 6.1+",
-    "label.about": "Over",
-    "label.about.app": "Over CloudStack",
-    "label.accept.project.invitation": "Accepteer project uitnodiging",
-    "label.account": "Account",
-    "label.account.and.security.group": "Account, Security group",
-    "label.account.details": "rekening gegevens",
-    "label.account.id": "Account ID",
-    "label.account.lower": "account",
-    "label.account.name": "Account Naam",
-    "label.account.specific": "Account-specifiek",
-    "label.account.type": "Account type",
-    "label.accounts": "Accounts",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL lijst regels",
-    "label.acl.name": "ACL naam",
-    "label.acl.replaced": "ACL vervangen",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Bemachtig nieuw IP",
-    "label.acquire.new.secondary.ip": "Verkrijg nieuw secundair IP",
-    "label.action": "Actie",
-    "label.action.attach.disk": "Schijf toevoegen",
-    "label.action.attach.disk.processing": "Schijf wordt toegevoegd....",
-    "label.action.attach.iso": "ISO toevoegen",
-    "label.action.attach.iso.processing": "ISO wordt toegevoegd....",
-    "label.action.cancel.maintenance.mode": "Annuleer Onderhoudsmodus",
-    "label.action.cancel.maintenance.mode.processing": "Onderhoudsmodus wordt geannuleerd....",
-    "label.action.change.password": "Wijzig Wachtwoord",
-    "label.action.change.service": "Wijzig Service",
-    "label.action.change.service.processing": "Service wordt gewijzigd....",
-    "label.action.configure.samlauthorization": "configureer SAML SSO authorisatie",
-    "label.action.copy.ISO": "Kopieer ISO",
-    "label.action.copy.ISO.processing": "Bezig een ISO te kopiëren...",
-    "label.action.copy.template": "Kopieer Template",
-    "label.action.copy.template.processing": "Bezig een template te kopiëren...",
-    "label.action.create.template": "Creëer Template",
-    "label.action.create.template.from.vm": "Creëer Template vanaf VM",
-    "label.action.create.template.from.volume": "Creëer Template van Volume",
-    "label.action.create.template.processing": "Bezig met aanmaken Template....",
-    "label.action.create.vm": "Creëer VM",
-    "label.action.create.vm.processing": "Bezig met aanmaken VM....",
-    "label.action.create.volume": "Creëer Volume",
-    "label.action.create.volume.processing": "Bezig met creëren volume....",
-    "label.action.delete.IP.range": "Verwijder IP Range",
-    "label.action.delete.IP.range.processing": "Bezig met verwijderen van IP Range....",
-    "label.action.delete.ISO": "Verwijder ISO",
-    "label.action.delete.ISO.processing": "Bezig met verwijderen van ISO....",
-    "label.action.delete.account": "Verwijder account",
-    "label.action.delete.account.processing": "Bezig met verwijderen account....",
-    "label.action.delete.cluster": "Verwijder Cluster",
-    "label.action.delete.cluster.processing": "Bezig met verwijderen van Cluster....",
-    "label.action.delete.disk.offering": "Verwijder Schijf Aanbieding",
-    "label.action.delete.disk.offering.processing": "Bezig met verwijderen van Schijf Aanbieding....",
-    "label.action.delete.domain": "Verwijder Domein",
-    "label.action.delete.domain.processing": "Bezig met verwijderen van Domein....",
-    "label.action.delete.firewall": "Verwijder firewall regel",
-    "label.action.delete.firewall.processing": "Bezig met verwijderen van Firewall....",
-    "label.action.delete.ingress.rule": "Verwijder Inkomende Regel",
-    "label.action.delete.ingress.rule.processing": "Bezig met verwijderen van Inkomende Regel....",
-    "label.action.delete.load.balancer": "Verwijder load balancer regel",
-    "label.action.delete.load.balancer.processing": "Bezig met verwijderen van Load Balancer....",
-    "label.action.delete.network": "Verwijder Netwerk",
-    "label.action.delete.network.processing": "Bezig met verwijderen van Netwerk....",
-    "label.action.delete.nexusVswitch": "Verwijder Nexus 1000v",
-    "label.action.delete.nic": "Verwijder netwerkkaart",
-    "label.action.delete.physical.network": "Verwijder fysiek netwerk",
-    "label.action.delete.pod": "Verwijder Pod",
-    "label.action.delete.pod.processing": "Bezig met verwijderen van Pod....",
-    "label.action.delete.primary.storage": "Verwijder Primaire Opslag",
-    "label.action.delete.primary.storage.processing": "Bezig met verwijderen van Primaire Opslag....",
-    "label.action.delete.secondary.storage": "Verwijder Secundaire Opslag",
-    "label.action.delete.secondary.storage.processing": "Bezig met verwijderen van Secundaire Opslag....",
-    "label.action.delete.security.group": "Verwijder Security Group",
-    "label.action.delete.security.group.processing": "Bezig met verwijderen van Security Group....",
-    "label.action.delete.service.offering": "Verwijder Service Aanbieding",
-    "label.action.delete.service.offering.processing": "Bezig met verwijderen van Service Aanbieding....",
-    "label.action.delete.snapshot": "Verwijder Snapshot",
-    "label.action.delete.snapshot.processing": "Bezig met verwijderen van Snapshot....",
-    "label.action.delete.system.service.offering": "Verwijder Systeem Service Aanbieding",
-    "label.action.delete.template": "Verwijder Template",
-    "label.action.delete.template.processing": "Bezig met verwijderen van Template....",
-    "label.action.delete.user": "Verwijder Gebruiker",
-    "label.action.delete.user.processing": "Bezig met verwijderen Gebruiker....",
-    "label.action.delete.volume": "Verwijder Volume",
-    "label.action.delete.volume.processing": "Bezig met verwijderen van Volume....",
-    "label.action.delete.zone": "Verwijder Zone",
-    "label.action.delete.zone.processing": "Bezig met verwijderen van Zone....",
-    "label.action.destroy.instance": "Verwijder Instantie",
-    "label.action.destroy.instance.processing": "Bezig met vernietigen van Instantie....",
-    "label.action.destroy.systemvm": "Vernietig Systeem VM",
-    "label.action.destroy.systemvm.processing": "Bezig met vernietigen van Systeem VM....",
-    "label.action.destroy.volume":"Vernietig schijf",
-    "label.action.detach.disk": "Ontkoppel Schijf",
-    "label.action.detach.disk.processing": "Bezig met ontkoppelen van Schijf....",
-    "label.action.detach.iso": "Ontkoppel ISO",
-    "label.action.detach.iso.processing": "Bezig met ontkoppelen van ISO....",
-    "label.action.disable.account": "Deactiveer account",
-    "label.action.disable.account.processing": "Bezig met deactiveren van account....",
-    "label.action.disable.cluster": "Deactiveer Cluster",
-    "label.action.disable.cluster.processing": "Bezig met deactiveren van Cluster....",
-    "label.action.disable.nexusVswitch": "Deactiveer Nexus 1000v",
-    "label.action.disable.physical.network": "Deactiveer fysiek netwerk",
-    "label.action.disable.pod": "Deactiveer Pod",
-    "label.action.disable.pod.processing": "Bezig met deactiveren van Pod....",
-    "label.action.disable.static.NAT": "Deactiveer Static NAT",
-    "label.action.disable.static.NAT.processing": "Bezig met deactiveren van Static NAT....",
-    "label.action.disable.user": "Deactiveer Gebruiker",
-    "label.action.disable.user.processing": "Bezig met deactiveren van Gebruiker....",
-    "label.action.disable.zone": "Deactiveer Zone",
-    "label.action.disable.zone.processing": "Bezig met deactiveren van Zone....",
-    "label.action.download.ISO": "Download ISO",
-    "label.action.download.template": "Download Template",
-    "label.action.download.volume": "Download Volume",
-    "label.action.download.volume.processing": "Bezig met downloaden van Volume....",
-    "label.action.edit.ISO": "Wijzig ISO",
-    "label.action.edit.account": "Wijzig account",
-    "label.action.edit.disk.offering": "Wijzig schijf aanbieding",
-    "label.action.edit.domain": "Wijzig Domein",
-    "label.action.edit.global.setting": "Wijzig Algemene Instellingen",
-    "label.action.edit.host": "Wijzig Host",
-    "label.action.edit.instance": "Wijzig Instantie",
-    "label.action.edit.network": "Wijzig Netwerk",
-    "label.action.edit.network.offering": "Wijzig Netwerk Aanbieding",
-    "label.action.edit.network.processing": "Bezig met wijzigen van Netwerk...",
-    "label.action.edit.pod": "Wijzig Pod",
-    "label.action.edit.primary.storage": "Wijzig Primaire Opslag",
-    "label.action.edit.resource.limits": "Wijzig verbruikslimieten",
-    "label.action.edit.service.offering": "Wijzig Service Aanbieding",
-    "label.action.edit.template": "Wijzig Template",
-    "label.action.edit.user": "Wijzig Gebruiker",
-    "label.action.edit.zone": "Wijzig Zone",
-    "label.action.enable.account": "Activeer account",
-    "label.action.enable.account.processing": "Bezig met activeren van account....",
-    "label.action.enable.cluster": "Activeer Cluster",
-    "label.action.enable.cluster.processing": "Bezig met activeren van Cluster....",
-    "label.action.enable.maintenance.mode": "Activeer onderhoudsmodus",
-    "label.action.enable.maintenance.mode.processing": "Bezig met activeren van Onderhoudsmodus",
-    "label.action.enable.nexusVswitch": "Activeer Nexus 1000v",
-    "label.action.enable.physical.network": "Activeer fysiek netwerk",
-    "label.action.enable.pod": "Activeer Pod",
-    "label.action.enable.pod.processing": "Bezig met activeren van Pod....",
-    "label.action.enable.static.NAT": "Activeer Static NAT",
-    "label.action.enable.static.NAT.processing": "Bezig met activeren van Static NAT....",
-    "label.action.enable.user": "Activeer Gebruiker",
-    "label.action.enable.user.processing": "Bezig met activeren van Gebruiker....",
-    "label.action.enable.zone": "Activeer Zone",
-    "label.action.enable.zone.processing": "Bezig met activeren van Zone....",
-    "label.action.expunge.instance": "Ruim instantie op",
-    "label.action.expunge.instance.processing": "Opruimen Instantie....",
-    "label.action.force.reconnect": "Forceer opnieuw verbinden",
-    "label.action.force.reconnect.processing": "Bezig met opnieuw verbinden....",
-    "label.action.generate.keys": "Genereer Sleutels",
-    "label.action.generate.keys.processing": "Bezig met generen van Sleutels....",
-    "label.action.list.nexusVswitch": "Toon Nexus 1000v",
-    "label.action.lock.account": "Account op slot zetten",
-    "label.action.lock.account.processing": "Bezig met account op slot zetten....",
-    "label.action.manage.cluster": "Beheer Cluster",
-    "label.action.manage.cluster.processing": "Bezig met beheren van Cluster....",
-    "label.action.migrate.instance": "Migreer Instantie",
-    "label.action.migrate.instance.processing": "Bezig met migreren van Instantie....",
-    "label.action.migrate.router": "MIgreer Router",
-    "label.action.migrate.router.processing": "Bezig met migreren van Router....",
-    "label.action.migrate.systemvm": "Migreer Systeem VM",
-    "label.action.migrate.systemvm.processing": "Bezig met migreren van Systeem VM....",
-    "label.action.reboot.instance": "Herstart Instantie",
-    "label.action.reboot.instance.processing": "Bezig met herstarten van Instantie....",
-    "label.action.reboot.router": "Herstart Router",
-    "label.action.reboot.router.processing": "Bezig met herstarten van Router....",
-    "label.action.reboot.systemvm": "Herstart Systeem VM",
-    "label.action.reboot.systemvm.processing": "Bezig met herstarten van Systeem VM....",
-    "label.action.recover.volume":"Herstel schijf",
-    "label.action.recurring.snapshot": "Terugkerende Snapshots",
-    "label.action.register.iso": "Registreer ISO",
-    "label.action.register.template": "Registreer een template van een URL",
-    "label.action.release.ip": "Ontkoppel IP",
-    "label.action.release.ip.processing": "Bezig met ontkoppelen van IP....",
-    "label.action.remove.host": "Verwijder Host",
-    "label.action.remove.host.processing": "Bezig met verwijderen van Host....",
-    "label.action.reset.password": "Reset Wachtwoord",
-    "label.action.reset.password.processing": "Bezig met resetten van wachtwoord....",
-    "label.action.resize.volume": "Wijzig de grootte van het volume",
-    "label.action.resize.volume.processing": "Bezig met aanpassen van de grootte van het Volume",
-    "label.action.resource.limits": "Verbruikslimieten",
-    "label.action.restore.instance": "Herstel Instantie",
-    "label.action.restore.instance.processing": "Bezig met herstellen van Instantie....",
-    "label.action.revert.snapshot": "Draai terug naar snapshot",
-    "label.action.revert.snapshot.processing": "Terugdraaien naar snapshot...",
-    "label.action.start.instance": "Start Instantie",
-    "label.action.start.instance.processing": "Bezig met starten van Instantie....",
-    "label.action.start.router": "Start Router",
-    "label.action.start.router.processing": "Start Router....",
-    "label.action.start.systemvm": "Start Systeem VM",
-    "label.action.start.systemvm.processing": "Bezig met starten van Systeem VM....",
-    "label.action.stop.instance": "Stop Instantie",
-    "label.action.stop.instance.processing": "Bezig met stoppen van Instantie....",
-    "label.action.stop.router": "Stop Router",
-    "label.action.stop.router.processing": "Bezig met stoppen van Router....",
-    "label.action.stop.systemvm": "Stop Systeem VM",
-    "label.action.stop.systemvm.processing": "Bezig met stoppen van Systeem VM....",
-    "label.action.take.snapshot": "Neem Snapshot",
-    "label.action.take.snapshot.processing": "Bezig met nemen van Snapshot....",
-    "label.action.unmanage.cluster": "Schakel Clusterbeheer uit",
-    "label.action.unmanage.cluster.processing": "Bezig met uitschakelen van Clusterbeheer....",
-    "label.action.update.OS.preference": "Wijzig OS voorkeuren",
-    "label.action.update.OS.preference.processing": "Bezig met wijzigen van OS voorkeuren....",
-    "label.action.update.resource.count": "Update Verbruikslimieten",
-    "label.action.update.resource.count.processing": "Bezig met updaten van verbruikslimieten....",
-    "label.action.vmsnapshot.create": "Neem Snapshot van de VM",
-    "label.action.vmsnapshot.delete": "Verwijder Snapshot van de VM",
-    "label.action.vmsnapshot.revert": "Draai Snapshot van de VM terug",
-    "label.actions": "Acties",
-    "label.activate.project": "Activeer Project",
-    "label.active.sessions": "Actieve Sessies",
-    "label.add": "Voeg toe",
-    "label.add.ACL": "Voeg ACL toe",
-    "label.add.BigSwitchBcf.device": "Voeg eenBigSwitch BCF controller toe",
-    "label.add.BrocadeVcs.device": "Voeg een Brocade Vcs switch toe",
-    "label.add.F5.device": "Voeg F5 apparaat toe",
-    "label.add.LDAP.account": "voeg LDAP rekening toe",
-    "label.add.NiciraNvp.device": "Voeg NVP Controller toe",
-    "label.add.OpenDaylight.device": "OpenDaylight Controller toevoegen",
-    "label.add.PA.device": "Nieuw Palo Alto apparaat toevoegen",
-    "label.add.SRX.device": "SRX apparaat toevoegen",
-    "label.add.VM.to.tier": "Voeg VM toe aan tier",
-    "label.add.VPN.gateway": "VPN Gateway toevoegen",
-    "label.add.account": "Voeg Account toe",
-    "label.add.account.to.project": "Voeg account aan project toe",
-    "label.add.accounts": "Voeg accounts toe",
-    "label.add.accounts.to": "Voeg accounts toe aan",
-    "label.add.acl.list": "voeg een ACL lijst toe",
-    "label.edit.acl.list": "Verander een ACL lijst",
-    "label.add.affinity.group": "Nieuwe affinity groep toevoegen",
-    "label.add.baremetal.dhcp.device": "Voeg Baremetal DHCP Apparaat toe",
-    "label.add.baremetal.rack.configuration": "voeg baremetal rek configuratie toe",
-    "label.add.by": "Voeg toe door middel van",
-    "label.add.by.cidr": "Voeg toe door middel van CIDR",
-    "label.add.by.group": "Voeg toe door middel van Groep",
-    "label.add.ciscoASA1000v": "voeg CiscoASA1000v toe",
-    "label.add.cluster": "Voeg Cluster toe",
-    "label.add.compute.offering": "Voeg Compute aanbieding toe",
-    "label.add.direct.iprange": "Voeg Direct IP Range toe",
-    "label.add.disk.offering": "Voeg Schijf Aanbieding toe",
-    "label.add.domain": "Voeg Domein toe",
-    "label.add.egress.rule": "Voeg uitgaande regel toe",
-    "label.add.firewall": "Voeg firewall regel toe",
-    "label.add.globo.dns": "voeg GloboDNS toe",
-    "label.add.gslb": "GSLB Toevoegen",
-    "label.add.guest.network": "Gast netwerk toevoegen",
-    "label.add.host": "Host toevoegen",
-    "label.add.ingress.rule": "Voeg inkomende regel toe",
-    "label.add.intermediate.certificate": "Voeg een intermediair certificaat toe",
-    "label.add.internal.lb": "voeg interne LB toe",
-    "label.add.ip.range": "Voeg IP range toe",
-    "label.add.isolated.guest.network": "Voeg een geïsoleerd netwerk toe",
-    "label.add.isolated.guest.network.with.sourcenat": "voeg en geïsoleerd gast netwerk met bron-NAT toe",
-    "label.add.isolated.network": "Geisoleerd Netwerk Toevoegen",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Voeg LDAP account toe",
-    "label.add.list.name": "ACL lijst naam",
-    "label.add.load.balancer": "Voeg Load Balancer toe",
-    "label.add.more": "Voeg meer toe",
-    "label.add.netScaler.device": "Voeg Netscaler apparaat toe",
-    "label.add.network": "Voeg Netwerk toe",
-    "label.add.network.ACL": "Voeg netwerk ACL toe",
-    "label.add.network.acl.list": "voeg netwerk ACL lijst toe",
-    "label.add.network.device": "Voeg Netwerk Apparaat toe",
-    "label.add.network.offering": "Voeg netwerk aanbieding toe",
-    "label.add.new.F5": "Voeg nieuwe F5 toe",
-    "label.add.new.NetScaler": "Voeg nieuwe Netscaler toe",
-    "label.add.new.PA": "Nieuwe Palo Alto toevoegen",
-    "label.add.new.SRX": "Voeg nieuwe SRX toe",
-    "label.add.new.gateway": "Voeg nieuwe gateway toe",
-    "label.add.new.tier": "Voeg nieuwe Tier toe",
-    "label.add.nfs.secondary.staging.store": "Secundaire Staging Opslag toevoegen",
-    "label.add.physical.network": "Voeg fysiek netwerk toe",
-    "label.add.pod": "Voeg Pod toe",
-    "label.add.port.forwarding.rule": "Voeg port forwarding regel toe",
-    "label.add.portable.ip.range": "Porteerbare IP Range toevoegen",
-    "label.add.primary.storage": "Voeg Primaire Opslag toe",
-    "label.add.private.gateway": "voeg private doorgang toe",
-    "label.add.region": "Voeg Regio toe",
-    "label.add.resources": "Resources toevoegen",
-    "label.add.role": "Add Role",
-    "label.add.route": "Route toevoegen",
-    "label.add.rule": "Regel toevoegen",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Secundaire Opslag toevoegen",
-    "label.add.security.group": "Security Group toevoegen",
-    "label.add.service.offering": "Service Aanbieding toevoegen",
-    "label.add.static.nat.rule": "Statische NAT regel toevoegen",
-    "label.add.static.route": "Statische route toevoegen",
-    "label.add.system.service.offering": "Systeem Service Aanbieding toevoegen",
-    "label.add.template": "Template toevoegen",
-    "label.add.to.group": "Toevoegen aan groep",
-    "label.add.ucs.manager": "UCS Manager toevoegen",
-    "label.add.user": "Gebruiker toevoegen",
-    "label.add.userdata": "Gebruikers gegevens",
-    "label.add.vlan": "VLAN toevoegen",
-    "label.add.vm": "VM toevoegen",
-    "label.add.vms": "VMs toevoegen",
-    "label.add.vms.to.lb": "Voeg VM(s) toe aan load balancer regel",
-    "label.add.vmware.datacenter": "VMware datacenter toevoegen",
-    "label.add.vnmc.device": "VNMC apparaat toevoegen",
-    "label.add.vnmc.provider": "VNMC provider toevoegen",
-    "label.add.volume": "Volume toevoegen",
-    "label.add.vpc": "VPC toevoegen",
-    "label.add.vpc.offering": "VPC Aanbieding toevoegen",
-    "label.add.vpn.customer.gateway": "VPN Customer Gateway toevoegen",
-    "label.add.vpn.user": "VPN gebruiker toevoegen",
-    "label.add.vxlan": "VXLAN toevoegen",
-    "label.add.zone": "Zone toevoegen",
-    "label.added.brocade.vcs.switch": "een nieuwe Brocade Vcs switch is toegevoegd",
-    "label.added.network.offering": "netwerk aanbieding toegevoegd",
-    "label.added.new.bigswitch.bcf.controller": "een nieuwe BigSwitch BCF controller is toegevoegd",
-    "label.added.nicira.nvp.controller": "Nieuwe Nicira NVP Controller toegevoegd",
-    "label.addes.new.f5": "Nieuwe F5 toegevoegd",
-    "label.adding": "Toevoegen",
-    "label.adding.cluster": "Bezig met toevoegen van Cluster",
-    "label.adding.failed": "Toevoegen mislukt",
-    "label.adding.pod": "Bezig met toevoegen van Pod",
-    "label.adding.processing": "Toevoegen....",
-    "label.adding.succeeded": "Toevoegen geslaagd",
-    "label.adding.user": "Bezig met toevoegen van Gebruiker",
-    "label.adding.zone": "Bezig met toevoegen van Zone",
-    "label.additional.networks": "Additioneele Netwerken",
-    "label.admin": "Beheerder",
-    "label.admin.accounts": "Beheer Accounts",
-    "label.advanced": "Geavanceerd",
-    "label.advanced.mode": "Geavanceerde Modus",
-    "label.advanced.search": "Geavanceerd zoeken",
-    "label.affinity": "Affinity",
-    "label.affinity.group": "Affinity Groep",
-    "label.affinity.groups": "Affinity Groepen",
-    "label.agent.password": "Agent wachtwoord",
-    "label.agent.port": "Agent poort",
-    "label.agent.state": "agent status",
-    "label.agent.username": "Agent Gebruikersnaam",
-    "label.agree": "Accepteren",
-    "label.alert": "Alarm",
-    "label.alert.archived": "waarschuwing gearchiveerd",
-    "label.alert.deleted": "waarschuwing verwijderd",
-    "label.alert.details": "waarschuwing gegevens",
-    "label.algorithm": "Algoritme",
-    "label.allocated": "Gebruikt",
-    "label.allocation.state": "Verbruik Staat",
-    "label.allow": "Toestaan",
-    "label.anti.affinity": "Anti-affinity",
-    "label.anti.affinity.group": "Anti-affinity Groep",
-    "label.anti.affinity.groups": "Anti-affinity Groepen",
-    "label.api.key": "API Sleutel",
-    "label.api.version": "API versie",
-    "label.app.name": "CloudStack",
-    "label.apply": "Uitvoeren",
-    "label.archive": "archief",
-    "label.archive.alerts": "Archiveer waarschuwingen",
-    "label.archive.events": "Archiveer evenementen",
-    "label.assign": "Toevoegen",
-    "label.assign.instance.another": "Wijs instantie toe aan een andere Account",
-    "label.assign.to.load.balancer": "Voeg instantie toe aan load balancer",
-    "label.assign.vms": "wijs VMs toe",
-    "label.assigned.vms": "toegewezen VMs",
-    "label.associate.public.ip": "Associeers Publiek IP",
-    "label.associated.network": "Bijbehorend Netwerk",
-    "label.associated.network.id": "Bijbehorend Netwerk ID",
-    "label.associated.profile": "Bijbehorend Profiel",
-    "label.attached.iso": "Gekoppelde ISO",
-    "label.author.email": "Auteur e-mail",
-    "label.author.name": "Auteur naam",
-    "label.autoscale": "Automatisch Schalen",
-    "label.autoscale.configuration.wizard": "autoschaal configuratie toverdoos",
-    "label.availability": "Beschikbaarheid",
-    "label.availability.zone": "Beschikbaarheids-zone",
-    "label.availabilityZone": "beschikbaarheidszone",
-    "label.available": "Beschikbaar",
-    "label.available.public.ips": "Beschikbare Publieke IP adressen",
-    "label.back": "Terug",
-    "label.bandwidth": "Bandbreedte",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP Apparten",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP Provider",
-    "label.baremetal.pxe.device": "Voeg Baremetal PXE Apparaat toe",
-    "label.baremetal.pxe.devices": "Baremetal DHCP Apparaten",
-    "label.baremetal.pxe.provider": "Baremetal PXE Provider",
-    "label.baremetal.rack.configuration": "baremetal rek configuratie",
-    "label.basic": "Basis",
-    "label.basic.mode": "Basis Modus",
-    "label.bigswitch.bcf.details": "BigSwitch BCF gegevens",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT staat aan",
-    "label.bigswitch.controller.address": "BigSwitch BCF Controller adres",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "Bootable",
-    "label.broadcast.domain.range": "Broadcast domain range",
-    "label.broadcast.domain.type": "Broadcast Domain Type",
-    "label.broadcast.uri": "Broadcast URI",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "broadcast URI",
-    "label.brocade.vcs.address": "Vcs switch adres",
-    "label.brocade.vcs.details": "Brocade Vcs switch gegevens",
-    "label.by.account": "Op Account",
-    "label.by.alert.type": "Op alarm type",
-    "label.by.availability": "Op Beschikbaarheid",
-    "label.by.date.end": "Op datum (eind)",
-    "label.by.date.start": "Op datum (start)",
-    "label.by.domain": "Op Domein",
-    "label.by.end.date": "Op Eind Datum",
-    "label.by.event.type": "Op gebeurtenis type",
-    "label.by.level": "Op Level",
-    "label.by.pod": "Op Pod",
-    "label.by.role": "Op Rol",
-    "label.by.start.date": "Op Start Datum",
-    "label.by.state": "Op Staat",
-    "label.by.traffic.type": "Op Verkeerstype",
-    "label.by.type": "Op Type",
-    "label.by.type.id": "Op Type ID",
-    "label.by.zone": "Op Zone",
-    "label.bytes.received": "Bytes Ontvangen",
-    "label.bytes.sent": "Bytes Verzonden",
-    "label.cache.mode": "Schrijf cache Type",
-    "label.cancel": "Annuleer",
-    "label.capacity": "Capaciteit",
-    "label.capacity.bytes": "Capaciteit in bytes",
-    "label.capacity.iops": "Capaciteit in IOPS",
-    "label.certificate": "Certificaat",
-    "label.change.affinity": "Wijzig Affinity",
-    "label.change.ipaddress": "Verander het IP adres voor NIC",
-    "label.change.service.offering": "Wijzig service aanbieding",
-    "label.change.value": "Wijzig waarde",
-    "label.character": "Karakter",
-    "label.chassis": "Chassis",
-    "label.checksum": "controlesom",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDRN of Account/Security Group",
-    "label.cidr.list": "Bron CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Adres",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Wachtwoord",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Gebruikersnaam",
-    "label.ciscovnmc.resource.details": "CiscoVNMC resource details",
-    "label.clean.up": "Opschonen",
-    "label.clear.list": "Schoon lijst op",
-    "label.close": "Sluiten",
-    "label.cloud.console": "Cloud Beheers Console",
-    "label.cloud.managed": "Cloud.com Managed",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Cluster Naam",
-    "label.cluster.type": "Cluster Type",
-    "label.clusters": "Clusters",
-    "label.clvm": "CLVM",
-    "label.code": "Code",
-    "label.community": "Community",
-    "label.compute": "Compute",
-    "label.compute.and.storage": "Compute en Opslag",
-    "label.compute.offering": "Compute aanbieding",
-    "label.compute.offerings": "Compute aanbiedingen",
-    "label.configuration": "Configuratie",
-    "label.configure": "Configureer",
-    "label.configure.ldap": "Configureer LDAP",
-    "label.configure.network.ACLs": "Configureer Netwerk ACLs",
-    "label.configure.sticky.policy": "configureer klevende regel",
-    "label.configure.vpc": "Configureer VPC",
-    "label.confirm.password": "Bevestig wachtwoord",
-    "label.confirmation": "Bevestiging",
-    "label.congratulations": "Gefeliciteerd!",
-    "label.conserve.mode": "Conserveer modus",
-    "label.console.proxy": "Console proxy",
-    "label.console.proxy.vm": "Console Proxy VM",
-    "label.continue": "Ga door",
-    "label.continue.basic.install": "Ga door met basis installatie",
-    "label.copying.iso": "bezig ISO te kopiëren",
-    "label.corrections.saved": "Correcties opgeslagen",
-    "label.counter": "teller",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU gebruik",
-    "label.cpu.allocated.for.VMs": "CPU gebruikt voor VMs",
-    "label.cpu.limits": "CPU limieten",
-    "label.cpu.mhz": "CPU (in MHz)",
-    "label.cpu.utilized": "CPU Verbruik",
-    "label.create.VPN.connection": "Nieuwe VPN connectie",
-    "label.create.nfs.secondary.staging.storage": "Creeer NFS staging secudaire opslag",
-    "label.create.nfs.secondary.staging.store": "Creeer NFS staging secudaire opslag",
-    "label.create.project": "Nieuw project",
-    "label.create.ssh.key.pair": "creëer een SSH sleutelpaar",
-    "label.create.template": "Nieuwe template",
-    "label.created": "Aangemaakt",
-    "label.created.by.system": "Aangemaakt door systeem",
-    "label.cross.zones": "Over Zones",
-    "label.custom": "Aangepast",
-    "label.custom.disk.iops": "Aangepaste IOPS",
-    "label.custom.disk.offering": "schijf aanbieding op maat",
-    "label.custom.disk.size": "Vrije schijf grootte",
-    "label.daily": "Dagelijkse",
-    "label.data.disk.offering": "Data Schijf Aanbieding",
-    "label.date": "Datum",
-    "label.day": "dag",
-    "label.day.of.month": "Dag van de Maand",
-    "label.day.of.week": "Dag van de Week",
-    "label.dc.name": "DC Naam",
-    "label.dead.peer.detection": "Dead Peer detectie",
-    "label.decline.invitation": "Sla uitnodiging af",
-    "label.dedicate": "Toewijden",
-    "label.dedicate.cluster": "Cluster toewijden",
-    "label.dedicate.host": "Host Toewijden",
-    "label.dedicate.pod": "Pod toewijden",
-    "label.dedicate.vlan.vni.range": "Toegewijde VLAN/VNI Range",
-    "label.dedicate.zone": "Zone toewijden",
-    "label.dedicated": "Toegewijd",
-    "label.dedicated.vlan.vni.ranges": "Toegewijde VLAN/VNI Ranges",
-    "label.default": "Standaard",
-    "label.default.egress.policy": "Standaard Uitgaande policy",
-    "label.default.use": "Standaard Gebruik",
-    "label.default.view": "Standaard Weergave",
-    "label.delete": "Verwijder",
-    "label.delete.BigSwitchBcf": "Verwijder BigSwitch BCF Controller",
-    "label.delete.BrocadeVcs": "Verwijder Brocade Vcs Switch",
-    "label.delete.F5": "Verwijder F5",
-    "label.delete.NetScaler": "Verwijder NetScaler",
-    "label.delete.NiciraNvp": "Verwijder Nvp Controller",
-    "label.delete.OpenDaylight.device": "OpenDaylight Controller verwijderen",
-    "label.delete.PA": "Verwijder Palo Alto",
-    "label.delete.SRX": "Verwijder SRX",
-    "label.delete.VPN.connection": "Verwijder VPN connectie",
-    "label.delete.VPN.customer.gateway": "Verwijder VPN Customer Gateway",
-    "label.delete.VPN.gateway": "Verwijder VPN Gateway",
-    "label.delete.acl.list": "verwijder ACL lijst",
-    "label.delete.affinity.group": "Verwijder Affinity Groep",
-    "label.delete.alerts": "Verwijder waarschuwingen",
-    "label.delete.baremetal.rack.configuration": "verwijder baremetal rek configuratie",
-    "label.delete.ciscoASA1000v": "verwijder CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "CiscoVNMC resource verwijderen",
-    "label.delete.events": "Verwijder gebeurtenissen",
-    "label.delete.gateway": "Verwijder gateway",
-    "label.delete.internal.lb": "verwijder interne LB",
-    "label.delete.portable.ip.range": "Porteerbare IP Range verwijderen",
-    "label.delete.profile": "Profiel Verwijderen",
-    "label.delete.project": "Verwijder project",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Secundaire Staging Opslag verwijderen",
-    "label.delete.ucs.manager": "Verwijder UCS Manager",
-    "label.delete.vpn.user": "Verwijder VPN gebruiker",
-    "label.deleting.failed": "Verwijderen Mislukt",
-    "label.deleting.processing": "Verwijderen....",
-    "label.deny": "Weigeren",
-    "label.deployment.planner": "Deployment planner",
-    "label.description": "Beschrijving",
-    "label.destination.physical.network.id": "Bestemming fysiek netwerk ID",
-    "label.destination.zone": "Bestemmingszone",
-    "label.destroy": "Verwijder",
-    "label.destroy.router": "Verwijder router",
-    "label.destroy.vm.graceperiod": "Respijt periode verwijderde VM",
-    "label.detaching.disk": "Ontkoppelen Schijf",
-    "label.details": "Details",
-    "label.device.id": "Apparaat ID",
-    "label.devices": "Apparaten",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "direct verbonden publieke IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Shared Netwerk IPs",
-    "label.disable.autoscale": "Autoscale uitschakelen",
-    "label.disable.host": "schakel host uit",
-    "label.disable.network.offering": "Netwerk Aanbieding Uitschakelen",
-    "label.disable.provider": "Provider uitschakelen",
-    "label.disable.vnmc.provider": "VNMC provider uitschakelen",
-    "label.disable.vpc.offering": "VPC aanbieding uitschakelen",
-    "label.disable.vpn": "VPN uitschakelen",
-    "label.disabled": "Uitgeschakeld",
-    "label.disabling.vpn.access": "Uitschakelen van VPN Toegang",
-    "label.disassociate.profile.blade": "Ontkoppel Profiel van Blade",
-    "label.disbale.vnmc.device": "VNMC apparaat uitschakelen",
-    "label.disk.allocated": "Schijfruimte gealloceerd",
-    "label.disk.bytes.read.rate": "Lees Snelheid Schijf (BPS)",
-    "label.disk.bytes.write.rate": "Schrijf Snelheid Schijf (BPS)",
-    "label.disk.iops.max": "Max IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Lees Snelheid Schijf (IOPS)",
-    "label.disk.iops.total": "IOPS Totaal",
-    "label.disk.iops.write.rate": "Schrijf snelheid Schijf (IOPS)",
-    "label.disk.offering": "Schijf Aanbieding",
-    "label.disk.offering.details": "schijfe offerte gegevens",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisioning type",
-    "label.disk.read.bytes": "Schijf lezen (Bytes)",
-    "label.disk.read.io": "Schijf Lezen (IO)",
-    "label.disk.size": "Schijf Grootte",
-    "label.disk.size.gb": "Schijf Grootte (in GB)",
-    "label.disk.total": "Schijf Totaal",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Schijf Volume",
-    "label.disk.write.bytes": "Schijf Schrijven (Bytes)",
-    "label.disk.write.io": "Schijf Schrijven (IO)",
-    "label.diskoffering": "opslagaanbieding",
-    "label.display.name": "publieke naam",
-    "label.display.text": "Weergavetekst",
-    "label.distributedrouter": "gedistribueerde router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domein",
-    "label.domain.admin": "Domein Beheerder",
-    "label.domain.details": "domein gegevens",
-    "label.domain.id": "Domein ID",
-    "label.domain.lower": "domein",
-    "label.domain.name": "Domeinnaam",
-    "label.domain.router": "Domein router",
-    "label.domain.suffix": "DNS domein achtervoegsel (v.b., xyz.com)",
-    "label.done": "Klaar",
-    "label.double.quotes.are.not.allowed": "Aanhalingstekens zijn hier niet toegestaan",
-    "label.download.progress": "Download Voortgang",
-    "label.drag.new.position": "Sleep naar nieuwe positie",
-    "label.duration.in.sec": "duur (in sec)",
-    "label.dynamically.scalable": "Dynamisch Schaalbaar",
-    "label.edit": "Wijzig",
-    "label.edit.acl.rule": "wijzig ACL regel",
-    "label.edit.affinity.group": "Wijzig Affinity Groep",
-    "label.edit.lb.rule": "Wijzig LB regel",
-    "label.edit.network.details": "Wijzig netwerk details",
-    "label.edit.project.details": "Wijzig project details",
-    "label.edit.region": "Wijzig Regio",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "wijzig regel",
-    "label.edit.secondary.ips": "Weizig secundaire IPs",
-    "label.edit.tags": "Wijzig tags",
-    "label.edit.traffic.type": "Wijzig traffic type",
-    "label.edit.vpc": "Wijzig VPC",
-    "label.egress.default.policy": "Standaard uitgaande policy",
-    "label.egress.rule": "Uitgaande regel",
-    "label.egress.rules": "Uitgaande regels",
-    "label.elastic": "Elastisch",
-    "label.elastic.IP": "Elastisch IP",
-    "label.elastic.LB": "Elastisch LB",
-    "label.email": "Email",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Autoscale inschakelen",
-    "label.enable.host": "schakel host in",
-    "label.enable.network.offering": "Netwerk Aanbieding Inschakelen",
-    "label.enable.provider": "Provider inschakelen",
-    "label.enable.s3": "S3-gebaseerde Secondary Storage inschakelen",
-    "label.enable.swift": "Swift inschakelen",
-    "label.enable.vnmc.device": "VNMC appraat inschakelen",
-    "label.enable.vnmc.provider": "VNMC provider inschakelen",
-    "label.enable.vpc.offering": "VPC aanbieding inschakelen",
-    "label.enable.vpn": "VPN inschakelen",
-    "label.enabling.vpn": "VPN inschakelen",
-    "label.enabling.vpn.access": "VPN toegang inschakelen",
-    "label.end.IP": "Eind IP",
-    "label.end.port": "Eind Poort",
-    "label.end.reserved.system.IP": "Einde gereserveerde systeem IP",
-    "label.end.vlan": "Laatste VLAN",
-    "label.end.vxlan": "Laatste VXLAN",
-    "label.endpoint": "Endpoint",
-    "label.endpoint.or.operation": "Endpoint or Operation",
-    "label.enter.token": "Voer token in",
-    "label.error": "Fout",
-    "label.error.code": "Fout code",
-    "label.error.upper": "FOUT",
-    "label.esx.host": "ESX/ESXi Host",
-    "label.event": "gebeurtenis",
-    "label.event.archived": "gebeurtenis gearchiveerd",
-    "label.event.deleted": "gebeurtenis verwijderd",
-    "label.every": "elke",
-    "label.example": "Voorbeeld",
-    "label.expunge": "Ruim op",
-    "label.external.link": "Externe link",
-    "label.extractable": "Uitpakbaar",
-    "label.extractable.lower": "ophaalbaar",
-    "label.f5": "F5",
-    "label.f5.details": "F5 details",
-    "label.failed": "Mislukt",
-    "label.featured": "Voorgesteld",
-    "label.fetch.latest": "Haal laatste op",
-    "label.filterBy": "Filter per",
-    "label.fingerprint": "vinger afdruk",
-    "label.firewall": "Firewall",
-    "label.first.name": "Voornaam",
-    "label.firstname.lower": "voornaam",
-    "label.format": "Formaat",
-    "label.format.lower": "formaat",
-    "label.friday": "Vrijdag",
-    "label.full": "Volledig",
-    "label.full.path": "Volledig pad",
-    "label.gateway": "Gateway",
-    "label.general.alerts": "Algemene Waarschuwingen",
-    "label.generating.url": "Generen van URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS configuratie",
-    "label.gluster.volume": "Volume",
-    "label.go.step.2": "Ga naar Stap 2",
-    "label.go.step.3": "Ga naar Stap 3",
-    "label.go.step.4": "Ga naar Stap 4",
-    "label.go.step.5": "Ga naar Stap 5",
-    "label.gpu": "GPU",
-    "label.group": "Groep",
-    "label.group.by.account": "groepeer per account",
-    "label.group.by.cluster": "groepeer per cluster",
-    "label.group.by.pod": "groepeer per pod",
-    "label.group.by.zone": "groepeer per zone",
-    "label.group.optional": "Groep (Optioneel)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "toegewezen load balancing",
-    "label.gslb.assigned.lb.more": "Wijs meer load balancing toe",
-    "label.gslb.delete": "GSLB verwijderen",
-    "label.gslb.details": "GSLB details",
-    "label.gslb.domain.name": "GSLB Domein Naam",
-    "label.gslb.lb.details": "load balancing details",
-    "label.gslb.lb.remove": "verwijder load balancing van deze GSLB",
-    "label.gslb.lb.rule": "load balancing regel",
-    "label.gslb.service": "GSLB service",
-    "label.gslb.service.private.ip": "GSLB service Private IP",
-    "label.gslb.service.public.ip": "GSLB service Publiek IP",
-    "label.gslb.servicetype": "Service Type",
-    "label.guest": "Gast",
-    "label.guest.cidr": "Gast CIDR",
-    "label.guest.end.ip": "Gast eind IP",
-    "label.guest.gateway": "Gast Gateway",
-    "label.guest.ip": "Gast IP Adres",
-    "label.guest.ip.range": "Gast IP range",
-    "label.guest.netmask": "Gast Netmask",
-    "label.guest.network.details": "Gast netwerk details",
-    "label.guest.networks": "Gast netwerken",
-    "label.guest.start.ip": "Gast start IP",
-    "label.guest.traffic": "Gast verkeer",
-    "label.guest.traffic.vswitch.name": "vSwitch Gast Verkeer Naam",
-    "label.guest.traffic.vswitch.type": "vSwitch Gast Verkeer Type",
-    "label.guest.type": "Gast Type",
-    "label.ha.enabled": "HA ingeschakeld",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "geavanceerde opties:",
-    "label.health.check.configurations.options": "configuratie opties:",
-    "label.health.check.interval.in.sec": "gezondheid check interval (in sec)",
-    "label.health.check.message.desc": "Uw load balancer zal automatisch gezondheidskeuringen op uw cloudstack instanties uitvoeren en allen verkeer routeren naar instanties die gezondheidskeuring doorstaan.",
-    "label.health.check.wizard": "gezondheids controle tovenaar",
-    "label.healthy.threshold": "gezonde marge",
-    "label.help": "Help",
-    "label.hide.ingress.rule": "Verberg Inkomende Regel",
-    "label.hints": "Tips",
-    "label.home": "Home",
-    "label.host": "Host",
-    "label.host.MAC": "Host MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Hostnaam",
-    "label.host.tag": "machine kenteken",
-    "label.host.tags": "Host Tags",
-    "label.hosts": "Hosts",
-    "label.hourly": "Uurlijks",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV verkeerslabel",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Hypervisor mogelijkheden",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Snapshot Reserve",
-    "label.hypervisor.type": "Hypervisor Type",
-    "label.hypervisor.version": "Hypervisor versie",
-    "label.hypervisors": "Hypervisors",
-    "label.id": "ID",
-    "label.info": "Info",
-    "label.info.upper": "INFORMATIE",
-    "label.ingress.rule": "Inkomende Regel",
-    "label.initiated.by": "Geïnitieerd door",
-    "label.inside.port.profile": "binnen poort profiel",
-    "label.installWizard.addClusterIntro.subtitle": "Wat is een cluster?",
-    "label.installWizard.addClusterIntro.title": "Nu: Cluster toevoegen",
-    "label.installWizard.addHostIntro.subtitle": "Wat is een host?",
-    "label.installWizard.addHostIntro.title": "Nu: Host toevoegen",
-    "label.installWizard.addPodIntro.subtitle": "Wat is een pod?",
-    "label.installWizard.addPodIntro.title": "Nu: Pod toevoegen",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Wat is primary storage?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Nu: Primaire opslag toevoegen",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Wat is secundaire opslag?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Nu: Secundaire opslag toevoegen",
-    "label.installWizard.addZone.title": "Zone toevoegen",
-    "label.installWizard.addZoneIntro.subtitle": "Wat is een zone?",
-    "label.installWizard.addZoneIntro.title": "Nu: Zone toevoegen",
-    "label.installWizard.click.launch": "Klik op de lanceer knop.",
-    "label.installWizard.subtitle": "Deze rondleiding gaat je helpen met het uitvoeren van de CloudStack&#8482 installatie",
-    "label.installWizard.title": "Hallo en welkom bij CloudStack&#8482",
-    "label.instance": "Instantie",
-    "label.instance.limits": "Instantie Limieten",
-    "label.instance.name": "Instantie Naam",
-    "label.instance.port": "instantie poort",
-    "label.instance.scaled.up": "Instantie is geschaald naar de gevraagde aanbieding",
-    "label.instances": "Instanties",
-    "label.instanciate.template.associate.profile.blade": "Initieer Template en verbind Profiel met Blade",
-    "label.intermediate.certificate": "Intermediair certificaat {0}",
-    "label.internal.dns.1": "Interne DNS 1",
-    "label.internal.dns.2": "Interne DNS 2",
-    "label.internal.lb": "interne LB",
-    "label.internal.lb.details": "interne LB gegevens",
-    "label.internal.name": "Interne naam",
-    "label.internallbvm": "interne LBVM",
-    "label.interval.type": "Interval Type",
-    "label.introduction.to.cloudstack": "CloudStack&#8482 Introductie",
-    "label.invalid.integer": "Onjuiste Waarde",
-    "label.invalid.number": "Onjuist nummer",
-    "label.invitations": "Uitnodigingen",
-    "label.invite": "Uitnodigen",
-    "label.invite.to": "Nodig uit voor",
-    "label.invited.accounts": "Uitgenodigde accounts",
-    "label.ip": "IP",
-    "label.ip.address": "IP Adres",
-    "label.ip.allocations": "IP Allocaties",
-    "label.ip.limits": "Publieke IP Limieten",
-    "label.ip.or.fqdn": "IP of FQDN",
-    "label.ip.range": "IP Range",
-    "label.ip.ranges": "IP Ranges",
-    "label.ipaddress": "IP Adres",
-    "label.ips": "IPs",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 Eind IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 Netmask",
-    "label.ipv4.start.ip": "IPv4 Begin IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Address",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 Eind IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Begin IP",
-    "label.is.default": "Is Standaard",
-    "label.is.redundant.router": "Redundant",
-    "label.is.shared": "Is Gedeeld",
-    "label.is.system": "Is Systeem",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO Boot",
-    "label.isolated.networks": "Geisoleerde netwerken",
-    "label.isolation.method": "Isolatie methode",
-    "label.isolation.mode": "Isolatie Modus",
-    "label.isolation.uri": "Isolatie URI",
-    "label.item.listing": "Items lijst",
-    "label.japanese.keyboard": "Japans toetsenbord",
-    "label.keep": "Bewaar",
-    "label.keep.colon": "bewaar:",
-    "label.key": "Sleutel",
-    "label.keyboard.language": "toetsenbord taal",
-    "label.keyboard.type": "Toetsenbord type",
-    "label.kvm.traffic.label": "KVM verkeer label",
-    "label.label": "Label",
-    "label.lang.arabic": "Arabisch",
-    "label.lang.brportugese": "Braziliaans Portgees",
-    "label.lang.catalan": "Catalaans",
-    "label.lang.chinese": "Chinees (Simplified)",
-    "label.lang.dutch": "Nederlands (Nederlands)",
-    "label.lang.english": "Engels",
-    "label.lang.french": "Frans",
-    "label.lang.german": "Duits",
-    "label.lang.hungarian": "Hongaars",
-    "label.lang.italian": "Italiaans",
-    "label.lang.japanese": "Japans",
-    "label.lang.korean": "Koreans",
-    "label.lang.norwegian": "Noors",
-    "label.lang.polish": "Pools",
-    "label.lang.russian": "Russisch",
-    "label.lang.spanish": "Spaans",
-    "label.last.disconnected": "Laatse keer niet verbonden",
-    "label.last.name": "Achternaam",
-    "label.lastname.lower": "achternaam",
-    "label.latest.events": "Laatste gebeurtenissen",
-    "label.launch": "Lanceer",
-    "label.launch.vm": "Lanceer VM",
-    "label.launch.zone": "Lanceer zone",
-    "label.lb.algorithm.leastconn": "Minste connecties",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "Bron",
-    "label.ldap.configuration": "LDAP Configuratie",
-    "label.ldap.group.name": "LDAP Groep",
-    "label.ldap.link.type": "Type",
-    "label.ldap.port": "LDAP poort",
-    "label.level": "Level",
-    "label.link.domain.to.ldap": "link domein aan LDAP",
-    "label.linklocal.ip": "Link Local IP Adres",
-    "label.load.balancer": "Load Balancer",
-    "label.load.balancer.type": "loadbalancer type",
-    "label.load.balancing": "Load Balancing",
-    "label.load.balancing.policies": "Load balancing policies",
-    "label.loading": "Laden",
-    "label.local": "Lokaal",
-    "label.local.file": "lokaal bestand",
-    "label.local.storage": "Lokale Opslag",
-    "label.local.storage.enabled": "Schakel locale opslag voor gebruiker VMs in",
-    "label.local.storage.enabled.system.vms": "zet lokale opslag voor systeem VMs aan",
-    "label.login": "Login",
-    "label.logout": "Log uit",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC verkeerslabel",
-    "label.make.project.owner": "Maak account project eigenaar",
-    "label.make.redundant": "Maak redundant",
-    "label.manage": "Beheer",
-    "label.manage.resources": "Beheer Resources",
-    "label.managed": "beheerd(e)",
-    "label.management": "Beheer",
-    "label.management.ips": "Beheers IP Adressen",
-    "label.management.server": "Beheers Machine",
-    "label.max.cpus": "Max. CPU cores",
-    "label.max.guest.limit": "Max. Instanties",
-    "label.max.instances": "Max Instances",
-    "label.max.memory": "Max. geheugen (MiB)",
-    "label.max.networks": "Max. netwerken",
-    "label.max.primary.storage": "Max. primare opslag (GiB)",
-    "label.max.public.ips": "Max. publieke IPs",
-    "label.max.secondary.storage": "Max. secundaire opslag (GiB)",
-    "label.max.snapshots": "Max. snapshots",
-    "label.max.templates": "Max. templates",
-    "label.max.vms": "Max. VMs per gebruiker",
-    "label.max.volumes": "Max. volumes",
-    "label.max.vpcs": "Max. VPCs",
-    "label.maximum": "Maximaal",
-    "label.may.continue": "U kunt nu verder gaan.",
-    "label.md5.checksum": "MD5 checksum",
-    "label.memory": "Geheugen",
-    "label.memory.allocated": "Geheugen Gealloceerd",
-    "label.memory.limits": "Geheugen limieten (MiB)",
-    "label.memory.mb": "Geheugen (in MB)",
-    "label.memory.total": "Totaal Geheugen",
-    "label.memory.used": "Geheugen gebruikt",
-    "label.menu.accounts": "Accounts",
-    "label.menu.alerts": "Waarschuwingen",
-    "label.menu.all.accounts": "Alle Accounts",
-    "label.menu.all.instances": "Alle Instanties",
-    "label.menu.community.isos": "Community ISOs",
-    "label.menu.community.templates": "Community Templates",
-    "label.menu.configuration": "Configuratie",
-    "label.menu.dashboard": "Dashboard",
-    "label.menu.destroyed.instances": "Vernietigde Instanties",
-    "label.menu.disk.offerings": "Schijf Aanbiedingen",
-    "label.menu.domains": "Domeinen",
-    "label.menu.events": "Gebeurtenissen",
-    "label.menu.featured.isos": "Voorgestelde ISOs",
-    "label.menu.featured.templates": "Voorgestelde Templates",
-    "label.menu.global.settings": "Algemene Instellingen",
-    "label.menu.infrastructure": "Infrastructuur",
-    "label.menu.instances": "Instanties",
-    "label.menu.ipaddresses": "IP Adressen",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "Mijn Accounts",
-    "label.menu.my.instances": "Mijn Instanties",
-    "label.menu.my.isos": "Mijn ISOs",
-    "label.menu.my.templates": "Mijn Templates",
-    "label.menu.network": "Netwerk",
-    "label.menu.network.offerings": "Netwerk Aanbiedingen",
-    "label.menu.physical.resources": "Fysieke Resources",
-    "label.menu.regions": "Regio's",
-    "label.menu.running.instances": "Draaiende Instanties",
-    "label.menu.security.groups": "Security Groups",
-    "label.menu.service.offerings": "Service Aanbiedingen",
-    "label.menu.snapshots": "Snapshots",
-    "label.menu.sshkeypair": "SSH sleutelpaar",
-    "label.menu.stopped.instances": "Uitgeschakelde Instanties",
-    "label.menu.storage": "Opslag",
-    "label.menu.system": "Systeem",
-    "label.menu.system.service.offerings": "Systeem Aanbiedingen",
-    "label.menu.system.vms": "Systeem VMs",
-    "label.menu.templates": "Templates",
-    "label.menu.virtual.appliances": "Virtueele Appliances",
-    "label.menu.virtual.resources": "Virtuele Resources",
-    "label.menu.volumes": "Volumes",
-    "label.menu.vpc.offerings": "VPC Aanbiedingen",
-    "label.metrics": "meet-gegevens",
-    "label.metrics.allocated": "Gebruikt",
-    "label.metrics.clusters": "Clusters",
-    "label.metrics.cpu.allocated": "CPU allocatie",
-    "label.metrics.cpu.max.dev": "afwijking",
-    "label.metrics.cpu.total": "totaal",
-    "label.metrics.cpu.usage": "CPU gebruik",
-    "label.metrics.cpu.used.avg": "Gebruikt",
-    "label.metrics.disk": "schijf",
-    "label.metrics.disk.allocated": "Gebruikt",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "lees",
-    "label.metrics.disk.size": "Grootte",
-    "label.metrics.disk.storagetype": "Type",
-    "label.metrics.disk.total": "totaal",
-    "label.metrics.disk.unallocated": "niet-toegekend",
-    "label.metrics.disk.usage": "schijf gebruik",
-    "label.metrics.disk.used": "Gebruikt",
-    "label.metrics.disk.write": "schrijf",
-    "label.metrics.hosts": "Hosts",
-    "label.metrics.memory.allocated": "geheugen allocatie",
-    "label.metrics.memory.max.dev": "afwijking",
-    "label.metrics.memory.total": "totaal",
-    "label.metrics.memory.usage": "geheugen gebruik",
-    "label.metrics.memory.used.avg": "Gebruikt",
-    "label.metrics.name": "Naam",
-    "label.metrics.network.read": "lees",
-    "label.metrics.network.usage": "netwerk gebruik",
-    "label.metrics.network.write": "schrijf",
-    "label.metrics.num.cpu.cores": "kernen",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "eigenschap",
-    "label.metrics.scope": "Scope",
-    "label.metrics.state": "Staat",
-    "label.metrics.storagepool": "opslag poel",
-    "label.metrics.vm.name": "VM naam",
-    "label.migrate.instance.to": "Migreer instantie naar",
-    "label.migrate.instance.to.host": "Migreer instantie naar andere host",
-    "label.migrate.instance.to.ps": "Migreer instantie naar andere primaire opslag",
-    "label.migrate.lb.vm": "Migreer LB VM",
-    "label.migrate.router.to": "Migreer Router naar",
-    "label.migrate.systemvm.to": "Migreer Systeem VM naar",
-    "label.migrate.to.host": "Migreer naar host",
-    "label.migrate.to.storage": "Migreer naar opslag",
-    "label.migrate.volume": "Migreer volume",
-    "label.migrate.volume.to.primary.storage": "Migreer volume naar andere primaire opslag",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instances",
-    "label.min.past.the.hr": "min na het uur",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "Minuten na het uur",
-    "label.minutes.past.hour": "minu(u)t(en) in het laatste uur",
-    "label.mode": "Modus",
-    "label.monday": "Maandag",
-    "label.monthly": "Maandelijks",
-    "label.more.templates": "Meer Templates",
-    "label.move.down.row": "Verplaats één regel naar beneden",
-    "label.move.to.bottom": "Verplaats naar beneden",
-    "label.move.to.top": "Verplaats naar boven",
-    "label.move.up.row": "Verplaats één regel naar boven",
-    "label.my.account": "Mijn Account",
-    "label.my.network": "Mijn netwerk",
-    "label.my.templates": "Mijn templates",
-    "label.na": "N/A",
-    "label.name": "Naam",
-    "label.name.lower": "naam",
-    "label.name.optional": "Naam (Optioneel)",
-    "label.nat.port.range": "NAT Poort Range",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Netmask",
-    "label.netscaler.details": "NetScaler details",
-    "label.network": "Netwerk",
-    "label.network.ACL": "Netwerk ACL",
-    "label.network.ACL.total": "Netwerk ACL Totaal",
-    "label.network.ACLs": "Netwerk ACLs",
-    "label.network.addVM": "Voeg netwerk toe aan VM",
-    "label.network.cidr": "Network CIDR",
-    "label.network.desc": "Netwerk  Beschr.",
-    "label.network.details": "netwerk details",
-    "label.network.device": "Netwerk Apparaat",
-    "label.network.device.type": "Netwerk Apparaat Type",
-    "label.network.domain": "Netwerk Domein",
-    "label.network.domain.text": "Netwerk Domein",
-    "label.network.id": "Netwerk ID",
-    "label.network.label.display.for.blank.value": "Gebruik standaard gateway",
-    "label.network.limits": "Netwerk limieten",
-    "label.network.name": "Netwerk Naam",
-    "label.network.offering": "Netwerk Aanbieding",
-    "label.network.offering.details": "netwerk offerte gegevens",
-    "label.network.offering.display.text": "Netwerk Aanbieding Weergave Tekst",
-    "label.network.offering.id": "Netwerk Aanbieding ID",
-    "label.network.offering.name": "Netwerk Aanbieding Naam",
-    "label.network.rate": "Netwerk Snelheid (Mb/s)",
-    "label.network.rate.megabytes": "Netwerk Snelheid (MB/s)",
-    "label.network.read": "Netwerk gelezen",
-    "label.network.service.providers": "Netwerk Service Aanbieders",
-    "label.network.type": "Netwerk Type",
-    "label.network.write": "Netwerk geschreven",
-    "label.networking.and.security": "Netwerken en beveiliging",
-    "label.networks": "Netwerken",
-    "label.new": "Nieuw",
-    "label.new.password": "Nieuw wachtwoord",
-    "label.current.password": "Current Password",
-    "label.new.project": "Nieuw Project",
-    "label.new.ssh.key.pair": "nieuw SSH sleutelpaar",
-    "label.new.vm": "Nieuwe VM",
-    "label.next": "Volgende",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS Server",
-    "label.nfs.storage": "NFS Opslag",
-    "label.nic.adapter.type": "NIC adapter type",
-    "label.nicira.controller.address": "Controller Adres",
-    "label.nicira.l2gatewayserviceuuid": "L2 gateway service UUID",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP details",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "NICs",
-    "label.no": "Nee",
-    "label.no.actions": "Geen Beschikbare Acties",
-    "label.no.alerts": "Geen Recente Waarschuwingen",
-    "label.no.data": "Geen data om weer te geven",
-    "label.no.errors": "Geen Recente Fouten",
-    "label.no.grouping": "(Geen groepering)",
-    "label.no.isos": "Geen beschikbare ISOs",
-    "label.no.items": "Geen Beschikbare Items",
-    "label.no.security.groups": "Geen Beschikbare Security Groups",
-    "label.no.thanks": "Nee bedankt",
-    "label.none": "Geen",
-    "label.not.found": "Niet gevonden",
-    "label.notifications": "Notificaties",
-    "label.num.cpu.cores": "Aantal CPU Cores",
-    "label.number.of.clusters": "Aantal Clusters",
-    "label.number.of.cpu.sockets": "Het aantal CPU sockets",
-    "label.number.of.hosts": "Aantal Hosts",
-    "label.number.of.pods": "Aantal Pods",
-    "label.number.of.system.vms": "Aantal Systeem VMs",
-    "label.number.of.virtual.routers": "Aantal Virtual Routers",
-    "label.number.of.zones": "Aantal Zones",
-    "label.numretries": "Keren opnieuw geprorbeerd",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "van de maand",
-    "label.offer.ha": "HA aanbieden",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controllers",
-    "label.operator": "operator",
-    "label.optional": "Optioneel",
-    "label.order": "Volgorde",
-    "label.os.preference": "OS Voorkeur",
-    "label.os.type": "OS Type",
-    "label.other": "anders",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Actie",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Wachtwoord",
-    "label.outofbandmanagement.port": "Poort",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Gebruikersnaam",
-    "label.override.guest.traffic": "Overschrijf Gast Verkeer",
-    "label.override.public.traffic": "Overschrijf Publiek Verkeer",
-    "label.ovm.traffic.label": "OVM verkeerslabel",
-    "label.ovm3.cluster": "inheems clustering",
-    "label.ovm3.pool": "inheemse pooling",
-    "label.ovm3.traffic.label": "OVM3 verkeer etiket",
-    "label.ovm3.vip": "Master VIP IP ip",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Publieke IP Adressen in beheer",
-    "label.owner.account": "Account Eigenaar",
-    "label.owner.domain": "Domein Eigenaar",
-    "label.palo.alto.details": "Palo Alto details",
-    "label.parent.domain": "Bovenliggend Domein",
-    "label.passive": "passief",
-    "label.password": "Wachtwoord",
-    "label.password.enabled": "Wachtwoord Ingeschakeld",
-    "label.password.lower": "wachtwoord",
-    "label.password.reset.confirm": "Het wachtwoord is gereset naar",
-    "label.path": "Pad",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Persistent",
-    "label.physical.network": "Fysiek Netwerk",
-    "label.physical.network.ID": "Fysiek netwerk ID",
-    "label.physical.network.name": "fysieke netwerk naam",
-    "label.ping.path": "ping pad",
-    "label.planner.mode": "Planner modus",
-    "label.please.complete.the.following.fields": "vul alstublieft de volgende velden volledig af",
-    "label.please.specify.netscaler.info": "Geef hier informatie van de Netscaler op",
-    "label.please.wait": "Een ogenblik geduld a.u.b.",
-    "label.plugin.details": "Plugin details",
-    "label.plugins": "Plugins",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod toegewijd",
-    "label.pod.name": "Pod Naam",
-    "label.pods": "Pods",
-    "label.polling.interval.sec": "Polling Interval (in sec)",
-    "label.port": "Poort",
-    "label.port.forwarding": "Port Forwarding",
-    "label.port.forwarding.policies": "Port forwarding policies",
-    "label.port.range": "Port Range",
-    "label.portable.ip": "verplaatsbaar IP",
-    "label.portable.ip.range.details": "Porteerbare IP Range details",
-    "label.portable.ip.ranges": "Porteerbare IP Ranges",
-    "label.portable.ips": "Porteerbare IPs",
-    "label.powerstate": "Power State",
-    "label.prev": "Terug",
-    "label.previous": "Vorige",
-    "label.primary.allocated": "Primaire Opslag Gealloceerd",
-    "label.primary.network": "Primair Netwerk",
-    "label.primary.storage": "Primaire Opslag",
-    "label.primary.storage.count": "Primaire Opslag Pools",
-    "label.primary.storage.limits": "Primaire Opslag limieten (GiB)",
-    "label.primary.used": "Primaire Opslag Gebruikt",
-    "label.private.Gateway": "Privé Gateway",
-    "label.private.interface": "Privé Interface",
-    "label.private.ip": "Privé IP Adres",
-    "label.private.ip.range": "Privé IP Range",
-    "label.private.ips": "Privé IP adressen",
-    "label.private.key": "privé sleutel",
-    "label.private.network": "Privé Netwerk",
-    "label.private.port": "Privé Port",
-    "label.private.zone": "Privé Zone",
-    "label.privatekey": "PKCS#8 Private Key",
-    "label.profile": "Profiel",
-    "label.project": "Project",
-    "label.project.dashboard": "Project Dashboard",
-    "label.project.id": "Project ID",
-    "label.project.invite": "Nodig uit voor project",
-    "label.project.name": "Project naam",
-    "label.project.view": "Project Weergave",
-    "label.projects": "Projecten",
-    "label.protocol": "Protocol",
-    "label.protocol.number": "protocol nummer",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Provider",
-    "label.providers": "Providers",
-    "label.public": "Publiek",
-    "label.public.interface": "Publieke Interface",
-    "label.public.ip": "Publiek IP Adres",
-    "label.public.ips": "Publieke IP Adressen",
-    "label.public.key": "publieke sleutel",
-    "label.public.lb": "publieke LB",
-    "label.public.load.balancer.provider": "Publieke Load Balancer Provider",
-    "label.public.network": "Publiek netwerk",
-    "label.public.port": "Publieke Poort",
-    "label.public.traffic": "Publiek verkeer",
-    "label.public.traffic.vswitch.name": "vSwitch Publiek Verkeer Naam",
-    "label.public.traffic.vswitch.type": "vSwitch Publiek Verkeer Type",
-    "label.public.zone": "Publieke Zone",
-    "label.purpose": "Doel",
-    "label.qos.type": "QoS Type",
-    "label.quickview": "Sneloverzicht",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Time (in sec)",
-    "label.quota.add.credits": "voeg krediet toe",
-    "label.quota.balance": "balans",
-    "label.quota.configuration": "quota configuratie",
-    "label.quota.configure": "configureer quota",
-    "label.quota.credit": "krediet",
-    "label.quota.credits": "tegoeden",
-    "label.quota.date": "Datum",
-    "label.quota.dates": "bijwerken data",
-    "label.quota.description": "quota beschrijving",
-    "label.quota.email.body": "inhoud",
-    "label.quota.email.lastupdated": "laatste wijziging",
-    "label.quota.email.subject": "onderwerp",
-    "label.quota.email.template": "e-mail sjabloon",
-    "label.quota.enddate": "eind datum",
-    "label.quota.endquota": "eind quota",
-    "label.quota.enforcequota": "dwing quota af",
-    "label.quota.fullsummary": "Alle Accounts",
-    "label.quota.minbalance": "min balans",
-    "label.quota.remove": "verwijder quota",
-    "label.quota.startdate": "start datum",
-    "label.quota.startquota": "start quota",
-    "label.quota.state": "Staat",
-    "label.quota.statement": "verklaring",
-    "label.quota.statement.balance": "quota balans",
-    "label.quota.statement.bydates": "verklaring",
-    "label.quota.statement.quota": "quota gebruik",
-    "label.quota.statement.tariff": "quota tarief",
-    "label.quota.summary": "samenvatting",
-    "label.quota.tariff": "tarief",
-    "label.quota.tariff.edit": "wijzig tarief",
-    "label.quota.tariff.effectivedate": "effectieve datum",
-    "label.quota.tariff.value": "tarief waarde",
-    "label.quota.total": "totaal",
-    "label.quota.totalusage": "totaal gebruik",
-    "label.quota.type.name": "gebruik type",
-    "label.quota.type.unit": "gebruik eenheid",
-    "label.quota.usage": "quota verbruik",
-    "label.quota.value": "quota waarde",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx gebruiker",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "Reboot",
-    "label.recent.errors": "Recente Fouten",
-    "label.recover.vm": "Herstel VM",
-    "label.redundant.router": "Redundante Router",
-    "label.redundant.router.capability": "Redundante router mogelijkheden",
-    "label.redundant.state": "Redundante staat",
-    "label.redundant.vpc": "Redundante VPC",
-    "label.refresh": "Ververs",
-    "label.refresh.blades": "Ververs Blades",
-    "label.region": "Regio",
-    "label.region.details": "regio gegevens",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "Herinstalleer VM",
-    "label.related": "Samenhangend",
-    "label.release.account": "Ontkoppel van Account",
-    "label.release.account.lowercase": "ontkoppel van account",
-    "label.release.dedicated.cluster": "Toegewijd Cluster loskoppelen",
-    "label.release.dedicated.host": "Toegewijde Host ontkoppelen",
-    "label.release.dedicated.pod": "Toegewijde Pod loskoppelen",
-    "label.release.dedicated.vlan.range": "Toegewijde VLAN range ontkoppelen",
-    "label.release.dedicated.zone": "Toegewijde zone ontkoppelen",
-    "label.remind.later": "Herinner me later",
-    "label.remove.ACL": "Verwijder ACL",
-    "label.remove.egress.rule": "Verwijder uitgaande regel",
-    "label.remove.from.load.balancer": "Verwijder Instantie van load balancer",
-    "label.remove.ingress.rule": "Verwijder inkomende regel",
-    "label.remove.ip.range": "Verwijder IP range",
-    "label.remove.ldap": "Verwijder LDAP",
-    "label.remove.network.offering": "Netwerk Aanbieding Verwijderen",
-    "label.remove.pf": "Verwijder port forwarding regel",
-    "label.remove.project.account": "Verwijder account van project",
-    "label.remove.region": "Verwijder Regio",
-    "label.remove.rule": "Verwijder regel",
-    "label.remove.ssh.key.pair": "verwijder SSH sleutelpaar",
-    "label.remove.static.nat.rule": "Verwijder static NAT regel",
-    "label.remove.static.route": "Verwijder statische route",
-    "label.remove.this.physical.network": "verwijder dit fysieke netwerk",
-    "label.remove.tier": "Verwijder tier",
-    "label.remove.vm.from.lb": "Verwijder VM van load balancer regel",
-    "label.remove.vm.load.balancer": "verwijder VM uit de load balancer",
-    "label.remove.vmware.datacenter": "VMware datacenter verwijderen",
-    "label.remove.vpc": "verwijder VPC",
-    "label.remove.vpc.offering": "VPC aanbieding verwijderen",
-    "label.removing": "Verwijderen",
-    "label.removing.user": "Verwijderen Gebruiker",
-    "label.reource.id": "Verbruik ID",
-    "label.replace.acl": "vervang ACL",
-    "label.replace.acl.list": "vervang ACL lijst",
-    "label.required": "Vereist",
-    "label.requires.upgrade": "Upgrade Benodigd",
-    "label.reserved.ip.range": "Gereserveerde IP Range",
-    "label.reserved.system.gateway": "Gereseveerde systeem gateway",
-    "label.reserved.system.ip": "Gereserveerd Systeem IP",
-    "label.reserved.system.netmask": "Gereserveerd systeem netmask",
-    "label.reset.VPN.connection": "Reset VPN verbinding",
-    "label.reset.ssh.key.pair": "zet SSH sleutelpaar terug",
-    "label.reset.ssh.key.pair.on.vm": "zet SSH sleutelpaar terug op VM",
-    "label.resetVM": "Reset VM",
-    "label.resize.new.offering.id": "Nieuwe Aanbieding",
-    "label.resize.new.size": "Nieuwe grootte (GB)",
-    "label.resize.shrink.ok": "Verklein OK",
-    "label.resource": "Verbruik",
-    "label.resource.limit.exceeded": "resource limiet overschreden",
-    "label.resource.limits": "Verbruikslimieten",
-    "label.resource.name": "Verbruik Naam",
-    "label.resource.state": "Verbruik staat",
-    "label.resources": "Verbruiken",
-    "label.response.timeout.in.sec": "antwoord wachttijd (in sec)",
-    "label.restart.network": "Herstart netwerk",
-    "label.restart.required": "Herstart benodigd",
-    "label.restart.vpc": "herstart VPC",
-    "label.restore": "Herstel",
-    "label.retry.interval": "Wachttijd voor nieuwe poging",
-    "label.review": "Beoordeel",
-    "label.revoke.project.invite": "Trek uitnodiging in",
-    "label.role": "Rol",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "root certificaat",
-    "label.root.disk.controller": "Root schijf controller",
-    "label.root.disk.offering": "Root Schijf Aanbieding",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Omhoog  Geschaald",
-    "label.routing": "Routing",
-    "label.routing.host": "routeer machine",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Regel Nummer",
-    "label.rules": "Regels",
-    "label.running.vms": "Draaiende VMs",
-    "label.s3.access_key": "Toegangssleutel",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Connectie Timeout",
-    "label.s3.endpoint": "Endpoint",
-    "label.s3.max_error_retry": "Max. opnieuw proberen na Fout",
-    "label.s3.nfs.path": "S3 NFS Pad",
-    "label.s3.nfs.server": "S3 NFS Server",
-    "label.s3.secret_key": "Geheime sleutel",
-    "label.s3.socket_timeout": "Socket Timeout",
-    "label.s3.use_https": "Gebruik HTTPS",
-    "label.saml.enable": "authoriseer SAML SSO",
-    "label.saml.entity": "identificeer leverancier",
-    "label.saturday": "Zaterdag",
-    "label.save": "Opslaan",
-    "label.save.and.continue": "Opslaan en verder gaan",
-    "label.save.changes": "Bewaar wijzigingen",
-    "label.saving.processing": "Opslaan....",
-    "label.scale.up.policy": "schaal op beleid",
-    "label.scaledown.policy": "verklein beleid",
-    "label.scaleup.policy": "vergoot beleid",
-    "label.scope": "Scope",
-    "label.search": "Zoeken",
-    "label.secondary.ips": "Secundaire IPs",
-    "label.secondary.isolated.vlan.id": "Secundair Geisoleerd VLAN ID",
-    "label.secondary.staging.store": "Secundaire Staging Opslag",
-    "label.secondary.staging.store.details": "Secundaire Staging Opslag details",
-    "label.secondary.storage": "Secundaire Opslag",
-    "label.secondary.storage.count": "Secundaire Opslag Pools",
-    "label.secondary.storage.details": "Secundaire Opslag details",
-    "label.secondary.storage.limits": "Secundaire Opslag limieten (GiB)",
-    "label.secondary.storage.vm": "Secundaire Opslag VM",
-    "label.secondary.used": "Secundaire Opslag Gebruikt",
-    "label.secret.key": "Geheime sleutel",
-    "label.security.group": "Security Group",
-    "label.security.group.name": "Security Group Naam",
-    "label.security.groups": "Security Groups",
-    "label.security.groups.enabled": "Security Groups Ingeschakeld",
-    "label.select": "Selecteer",
-    "label.select-view": "Selecteer Weergave",
-    "label.select.a.template": "Selecteer een template",
-    "label.select.a.zone": "Selecteer een zone",
-    "label.select.instance": "Selecteer een instance",
-    "label.select.instance.to.attach.volume.to": "Selecteer een instance om het volume aan te koppelen",
-    "label.select.iso.or.template": "Selecteer een ISO of template",
-    "label.select.offering": "Selecteer Aanbieding",
-    "label.select.project": "Selecteer Project",
-    "label.select.region": "Select regio",
-    "label.select.template": "Selecteer Template",
-    "label.select.tier": "Selecteer Tier",
-    "label.select.vm.for.static.nat": "Selecteer VM voor static NAT",
-    "label.sent": "Verstuurd",
-    "label.server": "Server",
-    "label.service.capabilities": "Service Mogelijkheden",
-    "label.service.offering": "Service Aanbieding",
-    "label.service.offering.details": "dienst offerte gegevens",
-    "label.service.state": "Service Status",
-    "label.services": "Diensten",
-    "label.session.expired": "Sessie Verlopen",
-    "label.set.default.NIC": "Stel standaard NIC in",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Stel zone type in",
-    "label.settings": "Instellingen",
-    "label.setup": "Instellen",
-    "label.setup.network": "creëer netwerk",
-    "label.setup.zone": "creëer zone",
-    "label.shared": "Gedeeld",
-    "label.show.advanced.settings": "Geavaceerde instellingen weergeven",
-    "label.show.ingress.rule": "Toon Inkomende Regel",
-    "label.shutdown.provider": "Schakel provider uit",
-    "label.simplified.chinese.keyboard": "versimpeld Chinees toetsenbord",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Grootte",
-    "label.skip.guide": "Ik heb CloudStack al eerder gebruikt, sla deze stap over",
-    "label.smb.domain": "SMB Domein",
-    "label.smb.password": "SMB Wachtwoord",
-    "label.smb.username": "SMB Gebruikersnaam",
-    "label.snapshot": "Snapshot",
-    "label.snapshot.limits": "Snapshot Limieten",
-    "label.snapshot.name": "Snapshot Naam",
-    "label.snapshot.s": "Snapshots",
-    "label.snapshot.schedule": "creëer herhaalde momentopname",
-    "label.snapshots": "Snapshots",
-    "label.sockets": "CPU Sockets",
-    "label.source.ip.address": "bron IP adres",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT ondersteund",
-    "label.source.port": "bron poort",
-    "label.specify.IP.ranges": "Specificeer IP ranges",
-    "label.specify.vlan": "Specificeer VLAN",
-    "label.specify.vxlan": "Specificeer VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX details",
-    "label.ssh.key.pair": "SSH sleutelpaar",
-    "label.ssh.key.pair.details": "SSH sleutelpaar gegevens",
-    "label.ssh.key.pairs": "SSH sleutel paren",
-    "label.standard.us.keyboard": "standaard (Amerikaans-US) toetsenbord",
-    "label.start.IP": "Start IP",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "Start Poort",
-    "label.start.reserved.system.IP": "Start gereseveerd systeem IP",
-    "label.start.vlan": "start VLAN",
-    "label.start.vxlan": "start VXLAN",
-    "label.state": "Staat",
-    "label.static.nat": "Static NAT",
-    "label.static.nat.enabled": "Static NAT Ingeschakeld",
-    "label.static.nat.to": "Static NAT naar",
-    "label.static.nat.vm.details": "Static NAT VM Details",
-    "label.static.routes": "statische routes",
-    "label.statistics": "Statistieken",
-    "label.status": "Status",
-    "label.step.1": "Stap 1",
-    "label.step.1.title": "Stap 1: <strong>Selecteer een Template</strong>",
-    "label.step.2": "Stap 2",
-    "label.step.2.title": "Stap 2: <strong>Service Aanbieding</strong>",
-    "label.step.3": "Stap 3",
-    "label.step.3.title": "Stap 4: <strong id=\"step3_label\">Selecteer een Schijf Aanbieding</strong>",
-    "label.step.4": "Stap 4",
-    "label.step.4.title": "Stap 4: <strong>Netwerk</strong>",
-    "label.step.5": "Stap 5",
-    "label.step.5.title": "Stap 5: <strong>Beoordeel</strong>",
-    "label.stickiness": "Stickiness",
-    "label.stickiness.method": "kleef methode",
-    "label.sticky.cookie-name": "Cookie naam",
-    "label.sticky.domain": "Domein",
-    "label.sticky.expire": "Verloopt",
-    "label.sticky.holdtime": "Wacht tijd",
-    "label.sticky.indirect": "Indirect",
-    "label.sticky.length": "Lengte",
-    "label.sticky.mode": "Modus",
-    "label.sticky.name": "klevende naam",
-    "label.sticky.nocache": "Geen cache",
-    "label.sticky.postonly": "Alleen Post",
-    "label.sticky.prefix": "Prefix",
-    "label.sticky.request-learn": "Request learn",
-    "label.sticky.tablesize": "Tabel grootte",
-    "label.stop": "Stop",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "Uitgeschakelde VMs",
-    "label.storage": "Opslag",
-    "label.storage.pool": "opslag poel",
-    "label.storage.tags": "Opslag Tags",
-    "label.storage.traffic": "Opslag Verkeer",
-    "label.storage.type": "Opslag Type",
-    "label.subdomain.access": "Subdomein Toegang",
-    "label.submit": "Verstuur",
-    "label.submitted.by": "[Verstuurd door: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Geslaagd",
-    "label.sunday": "Zondag",
-    "label.super.cidr.for.guest.networks": "Super CIDR voor Gast Netwerken",
-    "label.supported.services": "Geondersteunde Diensten",
-    "label.supported.source.NAT.type": "Ondersteunde Source NAT type",
-    "label.supportsstrechedl2subnet": "Ondersteund Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Pauzeer Project",
-    "label.switch.type": "Switch Type",
-    "label.system.capacity": "Systeem Capaciteit",
-    "label.system.offering": "Systeem Aanbieding",
-    "label.system.offering.for.router": "Systeem Aanbieding voor Router",
-    "label.system.service.offering": "Systeem Service Aanbieding",
-    "label.system.service.offering.details": "systeem dienst offerte gegevens:",
-    "label.system.vm": "Systeem VM",
-    "label.system.vm.details": "Systeem VM details",
-    "label.system.vm.scaled.up": "Systeem VM omhoog geschaald",
-    "label.system.vm.type": "Systeem VM type",
-    "label.system.vms": "Systeem VMs",
-    "label.system.wide.capacity": "Systeembreede capaciteit",
-    "label.tag.key": "Tag Sleutel",
-    "label.tag.value": "Tag Waarde",
-    "label.tagged": "Tagged",
-    "label.tags": "Tags",
-    "label.target.iqn": "Doel IQN",
-    "label.task.completed": "Taak uitgevoerd",
-    "label.template": "Template",
-    "label.template.limits": "Template Limieten",
-    "label.tftp.root.directory": "TFTP root directory",
-    "label.theme.default": "Standaard Thema",
-    "label.theme.grey": "Aangepast - Grijs",
-    "label.theme.lightblue": "Aangepast - Licht Blauw",
-    "label.threshold": "marge",
-    "label.thursday": "Donderdag",
-    "label.tier": "Tier",
-    "label.tier.details": "Tier details",
-    "label.time": "Tijd",
-    "label.time.colon": "tijd:",
-    "label.time.zone": "Tijdzone",
-    "label.timeout": "Timeout",
-    "label.timeout.in.second ": " timeout (seconden)",
-    "label.timezone": "Tijdzone",
-    "label.timezone.colon": "tijdszone:",
-    "label.token": "Token",
-    "label.total.CPU": "Totaal CPU",
-    "label.total.cpu": "Totaal CPU",
-    "label.total.hosts": "Totaal Hosts",
-    "label.total.memory": "Totaal Geheugen",
-    "label.total.of.ip": "totaal aantal IP adressen",
-    "label.total.of.vm": "Totaal VMs",
-    "label.total.storage": "Totaal Opslag",
-    "label.total.virtual.routers": "Totaal Virtual Routers",
-    "label.total.virtual.routers.upgrade": "Totaal Virtueele Routers die een ugrade nodig hebben",
-    "label.total.vms": "Totaal VMs",
-    "label.traffic.label": "Verkeerslabel",
-    "label.traffic.type": "Verkeer Type",
-    "label.traffic.types": "Verkeer Types",
-    "label.tuesday": "Dinsdag",
-    "label.type": "Type",
-    "label.type.id": "Type ID",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "Brits toetsenbord",
-    "label.unavailable": "Niet beschikbaar",
-    "label.unhealthy.threshold": "ongezonde marge",
-    "label.unlimited": "Ongelimiteerd",
-    "label.untagged": "Untagged",
-    "label.update.project.resources": "Update project verbruik",
-    "label.update.ssl": " SSL Certificaat",
-    "label.update.ssl.cert": " SSL Certificaat",
-    "label.updating": "Bezig met updaten",
-    "label.upgrade.required": "Upgrade is benodigd",
-    "label.upgrade.router.newer.template": "Upgrade Router om nieuwe Template te gebruiken",
-    "label.upload": "Upload",
-    "label.upload.from.local": "laad vanuit lokaal",
-    "label.upload.template.from.local": "laad sjabloon vanuit lokaal",
-    "label.upload.volume": "Upload Volume",
-    "label.upload.volume.from.local": "laad volume vanuit lokaal",
-    "label.upload.volume.from.url": "laad volume vanuit een webadres",
-    "label.url": "URL",
-    "label.usage.interface": "Verbruik Interface",
-    "label.usage.sanity.result": "gebruiks zingevings resultaat",
-    "label.usage.server": "gebruik server",
-    "label.usage.type": "gebruik type",
-    "label.usage.unit": "eenheid",
-    "label.use.vm.ip": "Gebruik VM IP:",
-    "label.use.vm.ips": "Gebruik VM IPs",
-    "label.used": "Gebruikt",
-    "label.user": "Gebruiker",
-    "label.user.data": "Gebruiker Data",
-    "label.user.details": "gebruikers gegevens",
-    "label.user.vm": "gebruiker VM",
-    "label.username": "Gebruikersnaam",
-    "label.username.lower": "gebruikersnaam",
-    "label.users": "Gebruikers",
-    "label.vSwitch.type": "vSwitch type",
-    "label.value": "Waarde",
-    "label.vcdcname": "vCenter DC naam",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter Cluster",
-    "label.vcenter.datacenter": "vCenter Datacenter",
-    "label.vcenter.datastore": "VCenter Datastore",
-    "label.vcenter.host": "vCenter Host",
-    "label.vcenter.password": "vCenter Wachtwoord",
-    "label.vcenter.username": "vCenter Gebruikersnaam",
-    "label.vcipaddress": "vCenter IP Adres",
-    "label.version": "Versie",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Maximale resolutie",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Overgebleven capaciteit",
-    "label.vgpu.type": "vCPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Toon",
-    "label.view.all": "Toon alle",
-    "label.view.console": "Toon console",
-    "label.view.more": "Toon meer",
-    "label.view.secondary.ips": "Toon secundaire IPs",
-    "label.viewing": "Weergeven",
-    "label.virtual.appliance": "Virtuele Appliance",
-    "label.virtual.appliance.details": "Virtual applicance details",
-    "label.virtual.appliances": "Virtueele Appliances",
-    "label.virtual.machine": "virtuele machine",
-    "label.virtual.machines": "virtuele machines",
-    "label.virtual.network": "Virtueel Netwerk",
-    "label.virtual.networking": "Virtual Networking",
-    "label.virtual.router": "Virtuele Router",
-    "label.virtual.routers": "Virtuele Routers",
-    "label.virtual.routers.group.account": "Groepeer Virtuele Routers op account",
-    "label.virtual.routers.group.cluster": "Groepeer Virtuele Routers op cluster",
-    "label.virtual.routers.group.pod": "Groepeer Virtuele Routers op pod",
-    "label.virtual.routers.group.zone": "Groepeer Virtuele Routers op zone",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI Reeks",
-    "label.vlan.range.details": "VLAN Range details",
-    "label.vlan.ranges": "VLAN Range(s)",
-    "label.vlan.vni.range": "VLAN/VNI Reeks",
-    "label.vlan.vni.ranges": "VLAN/VNI Range(s)",
-    "label.vm.add": "Instantie Toevoegen",
-    "label.vm.destroy": "Verwijder",
-    "label.vm.display.name": "VM weergave naam",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP adres",
-    "label.vm.name": "VM naam",
-    "label.vm.password": "Het wachtwoord van de VM is",
-    "label.vm.reboot": "Reboot",
-    "label.vm.start": "Start",
-    "label.vm.state": "VM staat",
-    "label.vm.stop": "Stop",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "VM Snapshots",
-    "label.vmsnapshot.current": "isHuidige",
-    "label.vmsnapshot.memory": "Snapshot geheugen",
-    "label.vmsnapshot.parentname": "Bovenliggend",
-    "label.vmsnapshot.type": "Type",
-    "label.vmware.datacenter.id": "VMware datacenter ID",
-    "label.vmware.datacenter.name": "VMware datacenter Naam",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "VMware verkeerslabel",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC apparaten",
-    "label.volatile": "Volatile",
-    "label.volgroup": "Volume Groep",
-    "label.volume": "Volume",
-    "label.volume.details": "volume gegevens",
-    "label.volume.limits": "Volume Limieten",
-    "label.volume.migrated": "volume gemigreerd",
-    "label.volume.name": "Volume Naam",
-    "label.volumes": "Volumes",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Gedistribueerde VPC Router",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC Aanbieding",
-    "label.vpc.offering.details": "VPC Aanbieding details",
-    "label.vpc.router.details": "VPC router details",
-    "label.vpc.supportsregionlevelvpc": "Ondersteund Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtueele Router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN Customer Gateway",
-    "label.vpn.force.encapsulation": "Forceer UDP Encapsulatie van ESP Packets",
-    "label.vsmctrlvlanid": "Controle VLAN ID",
-    "label.vsmpktvlanid": "Pakket VLAN ID",
-    "label.vsmstoragevlanid": "Opslag VLAN ID",
-    "label.vsphere.managed": "vSphere beheerd",
-    "label.vswitch.name": "vSwitch naam",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN Reeks",
-    "label.waiting": "Wachten",
-    "label.warn": "Waarschuwing",
-    "label.warn.upper": "WAARSCHUWING",
-    "label.warning": "waarschuwing",
-    "label.wednesday": "Woensdag",
-    "label.weekly": "Wekelijks",
-    "label.welcome": "Welkom",
-    "label.welcome.cloud.console": "Welkom op de Management Console",
-    "label.what.is.cloudstack": "Wat is CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "XenServer Tools Versie 6.1+",
-    "label.xenserver.traffic.label": "XenServer verkeerslabel",
-    "label.yes": "Ja",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone toegewijd",
-    "label.zone.details": "Zone details",
-    "label.zone.id": "Zone ID",
-    "label.zone.lower": "zone",
-    "label.zone.name": "zone naam",
-    "label.zone.step.1.title": "Stap 1: <strong>Selecteer een Netwerk</strong>",
-    "label.zone.step.2.title": "Stap 2: <strong>Zone toevoegen</strong>",
-    "label.zone.step.3.title": "Stap 3: <strong>Pod toevoegen</strong>",
-    "label.zone.step.4.title": "Step 4: <strong>IP range toevoegen</strong>",
-    "label.zone.type": "Type Zone",
-    "label.zone.wide": "Zone breed",
-    "label.zoneWizard.trafficType.guest": "Gast: Verkeer tussen virtuele machines van de eindgebruiker",
-    "label.zoneWizard.trafficType.management": "Management: Verkeer tussen CloudStack's interne resources zoals componenten die communiceren met de Management Server zoals hosts en CloudStack systeem VMs",
-    "label.zoneWizard.trafficType.public": "Publiek: Verkeer tussen het internet en virtueele machines in de cloud.",
-    "label.zoneWizard.trafficType.storage": "Opslag: Verkeer tussen de primaire en secundaire opslag servers zoals VM templates en snapshots",
-    "label.zones": "Zones",
-    "managed.state": "Beheersstaat",
-    "message.XSTools61plus.update.failed": "Kon XenServer Tools Version 6.1+ field niet updaten. Fout:",
-    "message.Zone.creation.complete": "De installatie van de zone is compleet",
-    "message.acquire.ip.nic": "Bevestig dat u een nieuw secundair IP voor deze netwerkkaart wilt verkrijgen. LET OP: U dient het secundaire IP adres handmatig te configureren binnen de virtueele machine.",
-    "message.acquire.new.ip": "Bevestigen dat je een nieuw IP voor dit netwerk wilt verkrijgen.",
-    "message.acquire.new.ip.vpc": "Bevestig dat u een nieuw IP wilt verkrijgen voor deze VPC.",
-    "message.acquire.public.ip": "Selecteer de zone waarvan u een nieuw IP wenst te verkrijgen.",
-    "message.action.cancel.maintenance": "Het onderhoud voor de host is succesvol geannuleerd. Het daadwerkelijke proces kan echter enkele minuten duren.",
-    "message.action.cancel.maintenance.mode": "Bevestig dat u het onderhoud wilt annuleren.",
-    "message.action.change.service.warning.for.instance": "Uw instantie moet uitgeschakeld zijn voordat u de service aanbieding kunt wijzigen.",
-    "message.action.change.service.warning.for.router": "Uw router moet uitgeschakeld zijn voordat u de service aanbieding kunt wijzigen.",
-    "message.action.delete.ISO": "Bevestig dat u deze ISO wilt verwijderen.",
-    "message.action.delete.ISO.for.all.zones": "Deze ISO wordt gebruikt door alle zones. Bevestig dat u deze wilt verwijderen van alle zones.",
-    "message.action.delete.cluster": "Bevestig dat u dit cluster wilt verwijderen.",
-    "message.action.delete.disk.offering": "Bevestig dat u deze schijf aanbieding wilt verwijderen.",
-    "message.action.delete.domain": "Bevestig dat u dit domein wilt verwijderen.",
-    "message.action.delete.external.firewall": "Bevestig dat u deze externe firewall wilt verwijderen. Waarschuwing: Als u van plan bent dezelfde firewall opnieuw toe te voegen, dient u de verbruiksstatistieken eerst te resetten.",
-    "message.action.delete.external.load.balancer": "Bevestig dat u deze externe loadbalancer wilt verwijderen. Waarschuwing: Als u van plan bent dezelfde loadbalancer opnieuw toe te voegen, dient u de verbruiksstatistieken eerst te resetten.",
-    "message.action.delete.ingress.rule": "Bevestig dat u deze inkomende regel wilt verwijderen.",
-    "message.action.delete.network": "Bevestig dat u dit netwerk wilt verwijderen.",
-    "message.action.delete.nexusVswitch": "Bevestig dat u deze nexus 1000v wilt verwijderen",
-    "message.action.delete.nic": "Bevestig dat u deze netwerkkaart wilt verwijderen, de VM zal ontkoppeld worden van het netwerk wat aan de netwerkkaart aangesloten zit.",
-    "message.action.delete.physical.network": "Bevestig dat u dit fysieke netwerk wilt verwijderen.",
-    "message.action.delete.pod": "Bevestig dat u deze pod wilt verwijderen.",
-    "message.action.delete.primary.storage": "Bevestig dat u deze primaire opslag wilt verwijderen.",
-    "message.action.delete.secondary.storage": "Bevestig dat u deze secudaire opslag wilt verwijderen.",
-    "message.action.delete.security.group": "Bevestig dat u deze security group wilt verwijderen.",
-    "message.action.delete.service.offering": "Bevestig dat u deze service aanbieding wilt verwijderen.",
-    "message.action.delete.snapshot": "Bevestig dat u deze snapshot wilt verwijderen.",
-    "message.action.delete.system.service.offering": "Bevestig dat u deze systeem service aanbieding wilt verwijderen.",
-    "message.action.delete.template": "Bevestig dat u deze template wilt verwijderen",
-    "message.action.delete.template.for.all.zones": "Deze template wordt gebruikt door alle zones. Bevestig dat u deze wilt verwijderen van alle zones.",
-    "message.action.delete.volume": "Bevestig dat u dit volume wilt verwijderen",
-    "message.action.delete.zone": "Bevestig dat u deze zone wilt verwijderen",
-    "message.action.destroy.instance": "Bevestig dat u deze instantie wilt vernietigen",
-    "message.action.destroy.systemvm": "Bevestig dat u deze Systeem VM wilt vernietigen",
-    "message.action.destroy.volume":"Bevestig alstublieft dat U deze schijf wilt vernietigen?",
-    "message.action.disable.cluster": "Bevestig dat u dit cluster wilt uitschakelen.",
-    "message.action.disable.nexusVswitch": "Bevestig dat u deze nexus 1000v wilt uitschakelen.",
-    "message.action.disable.physical.network": "Bevestig dat u dit fysieke netwerk wilt uitschakelen.",
-    "message.action.disable.pod": "Bevestig dat u deze pod wilt uitschakelen.",
-    "message.action.disable.static.NAT": "Bevestig dat u static NAT wilt uitschakelen.",
-    "message.action.disable.zone": "Bevestig dat u deze zone wilt uitschakelen.",
-    "message.action.download.iso": "Bevestig dat u deze ISO wilt downloaden.",
-    "message.action.download.template": "Bevestig dat u deze template wilt downloaden.",
-    "message.action.downloading.template": "Downloaden template.",
-    "message.action.enable.cluster": "Bevestig dat u dit cluster wilt inschakelen.",
-    "message.action.enable.maintenance": "Uw host is succesvol voorbereid op onderhoud. Het proces kan echter een paar minuten duren afhankelijk van de hoeveelheid VMs op de host.",
-    "message.action.enable.nexusVswitch": "Bevestig dat u deze nexus 1000v wilt inschakelen",
-    "message.action.enable.physical.network": "Bevestig dat u dit fysieke netwerk wilt inschakelen.",
-    "message.action.enable.pod": "Bevestigd dat u deze pod wilt inschakelen.",
-    "message.action.enable.zone": "Bevestig dat u deze zone wilt inschakelen.",
-    "message.action.expunge.instance": "Bevestig dat u deze instantie wilt opruimen",
-    "message.action.force.reconnect": "De host is succesvol geforceerd om opnieuw te verbinden. Dit proces kan echter enkele minuten duren.",
-    "message.action.host.enable.maintenance.mode": "Het inschakelen van de onderhoudsmodus zorgt ervoor dat alle draaiende instanties worden gemigreerd naar andere beschikbare hosts.",
-    "message.action.instance.reset.password": "Bevestig dat u het ROOT wachtwoord van deze virtueele machine wilt aanpassen.",
-    "message.action.manage.cluster": "Bevestig dat u dit cluster wilt beheren.",
-    "message.action.primarystorage.enable.maintenance.mode": "Waarschuwing: Wanneer u de primaire opslag in onderhoudsmodus plaatst, worden alle VMs die hier gebruik van maken gestopt. Weet u zeker dat u deze actie wilt uitvoeren?",
-    "message.action.reboot.instance": "Bevestig dat u deze instantie wilt herstarten.",
-    "message.action.reboot.router": "Als u deze router herstarten zullen de diensten op de router verstoord worden. Weet u zeker dat u deze actie wil uitvoeren?",
-    "message.action.reboot.systemvm": "Bevestig dat u deze Systeem VM wilt herstarten.",
-    "message.action.recover.volume":"Bevestig alstublieft dat U deze schijf wilt herstellen?",
-    "message.action.release.ip": "Bevestigd dat u dit IP adres wilt los koppelen.",
-    "message.action.remove.host": "Bevestig dat u deze host wilt verwijderen.",
-    "message.action.reset.password.off": "Uw instantie ondersteunt deze functie momenteel niet.",
-    "message.action.reset.password.warning": "Uw instantie moet gestopt worden voordat u het wachtwoord kunt wijzigen.",
-    "message.action.restore.instance": "Bevestig dat u deze instantie wilt herstellen.",
-    "message.action.revert.snapshot": "Bevestig dat u het volume wilt terugdraaien naar dit snapshot.",
-    "message.action.start.instance": "Bevestig dat u deze instantie wilt starten.",
-    "message.action.start.router": "Bevestig dat uw deze router wilt starten.",
-    "message.action.start.systemvm": "Bevestig dat u deze Systeem VM wilt starten.",
-    "message.action.stop.instance": "Bevestig dat u deze instantie wilt stoppen.",
-    "message.action.stop.router": "Als u deze router stopt zullen de diensten die gebruik maken van de router verstoord worden. Weet u zeker dat u deze actie wil uitvoeren?",
-    "message.action.stop.systemvm": "Bevestig dat u deze systeem VM wilt stoppen.",
-    "message.action.take.snapshot": "Bevestig dat u een snapshot wilt maken van dit volume.",
-    "message.action.snapshot.fromsnapshot":"Bevestig dat u een snapshot wilt maken van dit VM snapshot.",
-    "message.action.unmanage.cluster": "Bevestig dat u dit cluster niet langer wilt laten beheren door CloudStack.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Bevestig dat u deze VM snapshot wilt verwijderen.",
-    "message.action.vmsnapshot.revert": "Draai VM snapshot terug",
-    "message.activate.project": "Weet u zeker dat u dit project wilt activeren?",
-    "message.add.VPN.gateway": "Bevestig dat u een VPN Gateway wilt toevoegen",
-    "message.add.cluster": "Voeg een hypervisor beheerd cluster toe voor zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b",
-    "message.add.cluster.zone": "Voeg een hypervisor beheerd cluster toe voor zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Specificeer de volgende waardes om een nieuwe schijf aanbieding toe te voegen",
-    "message.add.domain": "Specificeer het subdomein welke u onder dit domein wilt aanmaken",
-    "message.add.firewall": "Voeg firewall toe aan zone",
-    "message.add.guest.network": "Bevestig dat u een gast netwerk wilt toevoegen",
-    "message.add.host": "Specificeer de volgende parameters om een nieuwe host toe te voegen",
-    "message.add.ip.range": "Voeg een IP range aan het publieke netwerk in de zone toe",
-    "message.add.ip.range.direct.network": "Voeg een IP range toe aan direct gekoppeld netwerk <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Voeg een IP range toe aan pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Voeg load balancer toe aan zone",
-    "message.add.load.balancer.under.ip": "De loadbalancer regel is toegeovegd onder IP adres:",
-    "message.add.network": "Voeg nieuw netwerk toe aan zone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Specificeer de volgende informatie om een nieuwe  gateway toe te voegen aan deze VPC.",
-    "message.add.pod": "Voeg een nieuwe pod toe aan zone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Elke zone moet één of meerdere pods hebben, de eerste pod gaan we nu toevoegen. Een pod bevat de hosts en primaire opslag servers welke we in een van de volgende stappen toevoegen. Allereerst dient u een reeks gereserveerde IP adressen te definiëren voor CloudStack&#39s management verkeer. Deze gereserveerde IP reeks moet uniek zijn voor elke zone in de cloud.",
-    "message.add.primary": "Specificeer de volgende parameters om nieuwe primaire opslag toe te voegen",
-    "message.add.primary.storage": "Voeg nieuwe primaire opslag toe voor zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Specificeer de benodigde informatie om een nieuwe regio toe te voegen.",
-    "message.add.secondary.storage": "Voeg nieuwe opslag toe voor zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Specificeer de volgende gegevens om een nieuwe service aanbieding aan te maken.",
-    "message.add.system.service.offering": "Specificeer de volgende gegevens om een nieuwe systeem aanbieding toe te voegen.",
-    "message.add.template": "Specificeer de volgende gegevens om een nieuwe template aan te maken",
-    "message.add.volume": "Specificeer de volgende gegevens om een nieuw volume toe te voegen.",
-    "message.added.vpc.offering": "VPC aanbieding toegevoegd",
-    "message.adding.Netscaler.device": "Netscaler toevoegen",
-    "message.adding.Netscaler.provider": "Netscaler provider toevoegen",
-    "message.adding.host": "Host toevoegen",
-    "message.additional.networks.desc": "Selecteer additionele netwerk(en) waar uw virtuele instantie aan gekoppeld moet worden.",
-    "message.admin.guide.read": "Voor VMware-gebaseerde VMs, lees eerst de dynamic scaling sectie in de admin guide voordat u gaat schalen. Weet u zeker dat u verder wilt gaan?,",
-    "message.advanced.mode.desc": "Kies dit netwerk model als u VLAN ondersteuning wilt inschakelen. Dit netwerk model geeft u de meeste flexibiliteit en stelt beheerders in staat om aangepaste netwerk aanbiedingen aan te maken met firewall, vpn, of load balancer ondersteuning. Ook kunt u kiezen tussen direct en virtual networking.",
-    "message.advanced.security.group": "Kies dit netwerk model als u security groups wilt gebruiken om virtueele machines te isoleren.",
-    "message.advanced.virtual": "Kies deze optie als u zone breede VLANs wilt gebruiken om virtueele machines te isoleren.",
-    "message.after.enable.s3": "S3-backed Secondary Storage is geconfigureerd. Let op: Als u deze pagina verlaat zult u niet in staat zijn om S3 te (her)configureren.",
-    "message.after.enable.swift": "Swift is geconfigureerd.  Let op: Als u deze pagina verlaat zult u niet in staat zijn om Swift te (her)configureren.",
-    "message.alert.state.detected": "Probleem status gedetecteerd",
-    "message.allow.vpn.access": "Specificeer een gebruikersnaam en wachtwoord voor de gebruiker die u toegang wilt geven tot de VPN.",
-    "message.apply.snapshot.policy": "De huidige snapshot policy is succesvol gewijzigd.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Bevestig dat u deze ISO wilt koppelen aan de virtuele machine.",
-    "message.attach.volume": "Specificeer de volgende gegevens om een nieuw volume te koppelen. Als u een schijf volume wilt toevoegen aan een Windows gebaseerde machine, dan dient u deze te rebooten om de schijf zichtbaar te maken.",
-    "message.basic.mode.desc": "Kies dit netwerk model als u <b>*<u>geen</u>*</b> VLAN ondersteuning wilt inschakelen. Alle virtuele machines onder dit netwerk model zullen direct een IP gealloceerd krijgen vanuit het netwerk en security groups kunnen gebruikt worden om beveiliging en segmentering te realiseren.",
-    "message.change.ipaddress": "Bevestig alstublieft dat U het IP adres voor deze NIC op de VM wilt wijzigen.",
-    "message.change.offering.confirm": "Bevestig dat u de service aanbieding van deze virtueele machine wilt wijzigen.",
-    "message.change.password": "Wijzig a.u.b. uw wachtwoord.",
-    "message.cluster.dedicated": "Zone toegewijd",
-    "message.cluster.dedication.released": "Cluster toewijding losgekoppeld",
-    "message.configure.all.traffic.types": "U heeft meerdere fysieke netwerken; Configureer labels voor elk verkeerstype door op de Wijzig knop te klikken.",
-    "message.configure.firewall.rules.allow.traffic": "configureer regels om verkeer toe te staan",
-    "message.configure.firewall.rules.block.traffic": "configureer regels om verkeer te blokkeren",
-    "message.configure.ldap": "Bevestig dat u LDAP wilt configureren.",
-    "message.configuring.guest.traffic": "Bezig met configureren guest traffic",
-    "message.configuring.physical.networks": "Bezig met configureren fysieke netwerken",
-    "message.configuring.public.traffic": "Bezig met configureren publiek verkeer",
-    "message.configuring.storage.traffic": "Bezig met configureren opslag verkeer",
-    "message.confirm.action.force.reconnect": "Bevestig dat u deze host geforceerd opnieuw wilt laten verbinden.",
-    "message.confirm.add.vnmc.provider": "Bevestig dat u de VNMC provider wilt toevoegen.",
-    "message.confirm.archive.alert": "Bevestig dat U deze melding wilt archiveren, alstublieft.",
-    "message.confirm.archive.event": "bevestig dat u deze melding wilt archiveren, alstublieft",
-    "message.confirm.archive.selected.alerts": "bevestig dat u de geselecteerde meldingen wilt archiveren, alstublieft",
-    "message.confirm.archive.selected.events": "bevestig dat u de geselecteerde gebeurtenissen wilt archiveren, alstublieft",
-    "message.confirm.attach.disk": "Weet U zeker dat U een disk wilt koppelen?",
-    "message.confirm.create.volume": "Weet U zeker dat U een volume wilt creëren?",
-    "message.confirm.current.guest.CIDR.unchanged": "Wilt u het huidige gastnetwerk-CIDR ongewijzigd laten?",
-    "message.confirm.dedicate.cluster.domain.account": "Weet u zeker dat u dit cluster wilt toewijden aan een domein/account?",
-    "message.confirm.dedicate.host.domain.account": "Weet u zeker dat u deze host  wilt toewijden aan een domein/account?",
-    "message.confirm.dedicate.pod.domain.account": "Weet u zeker dat u deze pod wilt toewijden aan een domein/account?",
-    "message.confirm.dedicate.zone": "Weet u zeker dat u deze zone wilt toewijden aan een domein/account?",
-    "message.confirm.delete.BigSwitchBcf": "bevestig dat u deze BigSwitch BCF Controller wilt verwijderen, alstublieft",
-    "message.confirm.delete.BrocadeVcs": "bevestigd dat Brocade Vcs Switch wilt verwijderen, altublieft",
-    "message.confirm.delete.F5": "Bevestig dat u deze F5 wilt verwijderen",
-    "message.confirm.delete.NetScaler": "Bevestig dat u deze NetScaler wilt verwijderen",
-    "message.confirm.delete.PA": "Bevestig dat u Palo Alto wilt verwijderen",
-    "message.confirm.delete.SRX": "Bevestig dat u deze SRX wilt verwijderen",
-    "message.confirm.delete.acl.list": "Weet U zeker dat U dit ACL wilt verwijderen?",
-    "message.confirm.delete.alert": "Weet U zeker dat U deze melding wilt verwijderen?",
-    "message.confirm.delete.baremetal.rack.configuration": "Bevestig dat u de baremetal rek configuratie wilt verwijderen, alstublieft.",
-    "message.confirm.delete.ciscoASA1000v": "bevestig dat u CiscoASA100v wilt verwijderen, alstublieft",
-    "message.confirm.delete.ciscovnmc.resource": "Bevestig dat u de CiscoVNMC resource wilt verwijderen.",
-    "message.confirm.delete.internal.lb": "bevestigd dat U interne LB wilt verwijderen, alstublieft",
-    "message.confirm.delete.secondary.staging.store": "Bevestig dat u de secudaire staging opslag wilt verwijderen.",
-    "message.confirm.delete.ucs.manager": "Bevestig dat u de UCS Manager wilt verwijderen",
-    "message.confirm.destroy.router": "Bevestig dat u deze router wilt verwijderen",
-    "message.confirm.disable.host": "bevestigd dat de machine wilt afkoppelen, alstublieft",
-    "message.confirm.disable.network.offering": "Weet u zeker dat u deze netwerk aanbieding wilt uitschakelen?",
-    "message.confirm.disable.provider": "Bevestig dat u deze provider wilt uitschakelen",
-    "message.confirm.disable.vnmc.provider": "Bevestig dat u de VNMC provider wilt uitschakelen.",
-    "message.confirm.disable.vpc.offering": "Weet u zeker dat u deze VPC aanbieding wilt uitschakelen?",
-    "message.confirm.enable.host": "bevestigd dat u de machine wilt aankoppelen, alsublieft",
-    "message.confirm.enable.network.offering": "Weet u het zeker dat u deze netwerk aanbieding wilt inschakelen?",
-    "message.confirm.enable.provider": "Bevestig dat u deze provider wilt inschakelen",
-    "message.confirm.enable.vnmc.provider": "Bevestig dat u de VNMC provider wilt inschakelen.",
-    "message.confirm.enable.vpc.offering": "Weet u zeker dat u deze VPC aanbieding wilt inschakelen?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Bevestig dat u aan dit project wilt bijdragen",
-    "message.confirm.migrate.volume": "Wilt U dit volume migreren?",
-    "message.confirm.refresh.blades": "Bevestig dat u de blades wilt verversen.",
-    "message.confirm.release.dedicate.vlan.range": "Bevestig dat u de toegewijde VLAN range wilt loskoppelen",
-    "message.confirm.release.dedicated.cluster": "Weet u zeker dat u dit toegewijde cluster wilt loskoppelen?",
-    "message.confirm.release.dedicated.host": "Weet u zeker dat u deze toegewijde host wilt loskoppelen?",
-    "message.confirm.release.dedicated.pod": "Weet u zeker dat u deze toegewijde pod wilt loskoppelen?",
-    "message.confirm.release.dedicated.zone": "Weet u zeker dat u deze toegewijde zone wilt loskoppelen?",
-    "message.confirm.remove.IP.range": "Bevestig dat u deze IP range wilt verwijderen.",
-    "message.confirm.remove.event": "Weet u zeker dat u deze melding wilt verwijderen?",
-    "message.confirm.remove.load.balancer": "bevestigd dat U deze VM uit de load balancer wilt halen, alstublieft",
-    "message.confirm.remove.network.offering": "Weet u zeker dat u deze netwerk aanbieding wilt verwijderen?",
-    "message.confirm.remove.selected.alerts": "bevestig dat u de geselecteerde meldingen wilt verwijderen, alstublieft",
-    "message.confirm.remove.selected.events": "bevestig dat u de geselcteerde gebeurtenissen wilt verwijderen, alstublieft",
-    "message.confirm.remove.vmware.datacenter": "Bevestig dat u VM datacenter wilt verwijderen",
-    "message.confirm.remove.vpc.offering": "Weet u zeker dat u deze VPC aanbieding wilt verwijderen?",
-    "message.confirm.replace.acl.new.one": "Wilt U de ACL vervangen door een nieuwe?",
-    "message.confirm.scale.up.router.vm": "Weet u zeker dat u de Router VM wilt opschalen?",
-    "message.confirm.scale.up.system.vm": "Weet u zeker dat u de Systeem VM wilt opschalen?",
-    "message.confirm.shutdown.provider": "Bevestig dat u deze provider wilt afsluiten",
-    "message.confirm.start.lb.vm": "Bevestig dat u de LB VM wilt starten",
-    "message.confirm.stop.lb.vm": "Bevestig dat u de LB VM wilt stoppen",
-    "message.confirm.upgrade.router.newer.template": "Bevestig dat u de router naar een nieuwere template versie wilt upgraden",
-    "message.confirm.upgrade.routers.account.newtemplate": "Bevestig dat u alle routers onder deze account wilt upgraden naar een nieuwe template",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Bevestig dat u alle routers in dit cluster wilt upgraden naar een nieuwe template",
-    "message.confirm.upgrade.routers.newtemplate": "Bevestig dat u alle routers in deze zone wilt upgraden naar een nieuwe template",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Bevestig dat u alle routers in deze pod wilt upgraden naar een nieuwe template",
-    "message.copy.iso.confirm": "Bevestig dat u deze ISO wilt kopieeren naar",
-    "message.copy.template": "Kopieer template <b id=\"copy_template_name_text\">XXX</b> van zone <b id=\"copy_template_source_zone_text\"></b> naar",
-    "message.copy.template.confirm": "Weet u zeker dat u de template wilt kopieeren?",
-    "message.create.template": "Weet u het zeker dat u een template wilt aanmaken?",
-    "message.create.template.vm": "Maak een VM aan vanaf een template",
-    "message.create.template.volume": "Specificeer a.u.b. de volgende informatie voordat u een template van het schijf volume: <b><span id=\"volume_name\"></span></b>. Het maken van een template kan een paar minuten duren maar ook langer afhankelijk van de grote van het volume.",
-    "message.creating.cluster": "Cluster aanmaken",
-    "message.creating.guest.network": "Gast netwerk aanmaken",
-    "message.creating.physical.networks": "Fysieke netwerken aanmaken",
-    "message.creating.pod": "Pod aanmaken",
-    "message.creating.primary.storage": "Primaire opslag aanmaken",
-    "message.creating.secondary.storage": "Secundaire opslag aanmaken",
-    "message.creating.systemVM": "Bezig met aanmaken van systeem VMs (dit kan enige tijd duren)",
-    "message.creating.zone": "Zone aanmaken",
-    "message.decline.invitation": "Weet u zeker dat u deze project uitnodiging wilt afwijzen?",
-    "message.dedicate.zone": "Dedicating zone",
-    "message.dedicated.zone.released": "Zone toewijding losgekoppeld",
-    "message.delete.VPN.connection": "Bevestig dat u deze VPN verbinding wilt verwijderen",
-    "message.delete.VPN.customer.gateway": "Bevestig dat u deze VPN Customer Gateway wilt verwijderen",
-    "message.delete.VPN.gateway": "Bevestig dat u deze VPN Gateway wilt verwijderen",
-    "message.delete.account": "Bevestig dat u deze account wilt verwijderen.",
-    "message.delete.affinity.group": "Bevestig dat u deze affinity groep wilt verwijderen",
-    "message.delete.gateway": "Bevestig dat u deze gateway wilt verwijderen",
-    "message.delete.project": "Weet u zeker dat u dit project wilt verwijderen?",
-    "message.delete.user": "Bevestig dat u deze gebruiker wilt verwijderen",
-    "message.desc.add.new.lb.sticky.rule": "voeg een nieuwe LB klevende regel toe",
-    "message.desc.advanced.zone": "Voor ingewikkeldere netwerk topologieën. Dit netwerk model geeft de meeste flexibiliteit en het definieren van gast netwerken en het aanbieden van speciale diensten zoals firewall, VPN of loadbalancer ondersteuning.",
-    "message.desc.basic.zone": "Creëert een enkel netwerk waar elke VM instantie direct een IP op krijgt. Het isoleren van instanties kunt op layer-3 niveau doen door middel van security groups.",
-    "message.desc.cluster": "Elke pod moet één of meerdere cluster bevatten, en we gaan het eerste cluster nu toevoegen. Een cluster is een manier om hosts te groeperen. De hosts in een cluster hebben identieke hardware, gebruiken de zelfde hypervisor, zitten op hetzelfde subnet en kunnen bij dezelfde gedeelde opslag. Elk cluster bestaan uit één of meerdere hosts en één of meerdere primaire opslag systemen.",
-    "message.desc.create.ssh.key.pair": "Gelieve de volgende gegevens in te vullen voor het maken of registreren van een ssh sleutelpaar. <br> (1) Als de publieke sleutel wordt ingesteld zal CloudStack de publieke sleutel te registreren. Je kunt het gebruiken via uw geheime sleutel. <br> (2) Als de publieke sleutel niet is ingesteld zal CloudStack een nieuw SSH-sleutelpaar creëren. In dat geval, kopiëert en slaat van de private/geheime sleutel alsutblieft op. CloudStack zal het niet bewaren. <br>",
-    "message.desc.created.ssh.key.pair": "Creëer SSH sleutelpaar.",
-    "message.desc.host": "Elke cluster moet een of meerdere hosts (servers) bevatten om gast VMs op te draaien. We gaan de eerste host nu toevoegen. Om een host met CloudStack te laten werken moet hij voorzien zijn van hypersvisor software, een werkend IP adres en in staat zijn de management server over het netwerk te bereiken. <br/><br/>Specificeer de DNS hostnaam of het IP adres van de host, de gebruikersnaam (meestal root) en het bijbehorende wachtwoord en als laatste eventuele labels om de host te categoriseren.",
-    "message.desc.primary.storage": "Elk cluster moet over één of meerdere primaire opslag servers beschikken, de eerste gaan we nu aanmaken. Primaire opslag bevat de volumes van VMs draaiende op de hosts in het cluster. Gebruik een protocol dat is ondersteund door de  hypervisor.",
-    "message.desc.reset.ssh.key.pair": "Specificeer een sleutelpaar dat u aan deze VM wilt toevoegen, alstublieft. Let alstublieft op dat het root-wachtwoord veranderd wordt door deze operatie als wachtwoord is aangezet.",
-    "message.desc.secondary.storage": "Elke zone moet minimaal één of meerdere secundaire opslag servers hebben, de eerste maken we nu aan. Secundaire opslag wordt gebruikt voor het opslaan van VM templates, ISO bestanden en snapshots. Deze server moet beschikbaar zijn aan alle hosts in de zone. <br/><br/>Specificeer het IP adres en het exporteerde pad.",
-    "message.desc.zone": "Een zone is de grootste organisatorische unit binnen CloudStack en correspondeert normaliter met enkel datacenter. Zones geven fysieke isolatie en redundantie. Een zone bestaat uit een of meerdere pods (waarvan ieder eigen hosts en primaire opslag servers heeft) en een secundaire opslag server welke gedeeld wordt door alle pods in de zone.",
-    "message.detach.disk": "Weet u zeker zeker dat u deze schijf wilt ontkoppelen?",
-    "message.detach.iso.confirm": "Bevestig dat u deze ISO wilt ontkoppelen van de virtueele machine.",
-    "message.disable.account": "Bevestig dat u deze account wilt uitschakelen. Als u deze account uitschakelt zullen de gebruikers niet langer toegang hebben tot hun cloud resources. Alle draaiende virtueele machines zullen direct afgesloten worden.",
-    "message.disable.snapshot.policy": "De huidige snapshot policy is uitgeschakeld.",
-    "message.disable.user": "Bevestig dat u deze gebruiker wilt uitschakelen.",
-    "message.disable.vpn": "Weet u zeker dat u VPN wilt uitschakelen?",
-    "message.disable.vpn.access": "Bevestig dat u VPN toegang wilt uitschakelen.",
-    "message.disabling.network.offering": "Netwerk Aanbieding Uitschakelen",
-    "message.disabling.vpc.offering": "VPC offering uitschakelen",
-    "message.disallowed.characters": "Niet toegestane karakters: <,>",
-    "message.download.ISO": "Klik op <a href=\"#\">00000</a> om de ISO te downloaden",
-    "message.download.template": "Klik op <a href=\"#\">00000</a> om de template te downloaden",
-    "message.download.volume": "Klik op <a href=\"#\">00000</a> om het volume te downloaden",
-    "message.download.volume.confirm": "bevestigd at U dit volume wilt ophalen, alstublieft",
-    "message.edit.account": "Wijzig (\"-1\" geeft aan dat er geen limiet is ingesteld)",
-    "message.edit.confirm": "Bevestig u veranderingen voor u op \"bewaar\" klikt, alstublieft.",
-    "message.edit.limits": "Specificeer de limieten voor de volgende resources.  Met \"-1\" geeft u aan dat er geen limiet geld.",
-    "message.edit.traffic.type": "Specificeer het verkeerslabel dat u met dit type verkeer wilt associeren.",
-    "message.enable.account": "Bevestig dat u deze account wilt inschakelen.",
-    "message.enable.user": "Bevestig dat u deze gebruiker wilt inschakelen.",
-    "message.enable.vpn": "Bevestig dat u VPN toegang voor dit IP adres wilt inschakelen.",
-    "message.enable.vpn.access": "VPN is momenteel uitgeschakeld voor dit IP adres. Wilt u deze inschakelen?",
-    "message.enabled.vpn": "Uw VPN toegang is ingeschakeld en kan benaderd worden via het IP",
-    "message.enabled.vpn.ip.sec": "Uw IPSec pre-shared key is",
-    "message.enabling.network.offering": "Netwerk Aanbieding Inschakelen",
-    "message.enabling.security.group.provider": "Inschakelen Security Group provider",
-    "message.enabling.vpc.offering": "VPC aanbieding inschakelen",
-    "message.enabling.zone": "Inschakelen zone",
-    "message.enabling.zone.dots": "Bezig met activeren van Zone....",
-    "message.enter.seperated.list.multiple.cidrs": "Gelieve een met komma's gescheiden lijst van CIDRs invoeren wanneer er meer dan een zijn",
-    "message.enter.token": "Vul het token in dat vermeld staat in de e-mail uitnodiging.",
-    "message.generate.keys": "Bevestig dat u nieuwe sleutels wilt genereren voor deze gebruiker.",
-    "message.gslb.delete.confirm": "Bevestigd dat u deze GSLB wilt verwijderen",
-    "message.gslb.lb.remove.confirm": "Bevestig dat u loadbalancing van GSLB wilt verwijderen",
-    "message.guest.traffic.in.advanced.zone": "Gast netwerk verkeer is communicatie tussen virtuele machines van de eindgebruiker. Specificeer een range van VLAN IDs om gast verkeer te transporteren over het fysieke netwerk.",
-    "message.guest.traffic.in.basic.zone": "Gast netwerk verkeer is communicatie tussen virtuele machines van de eindgebruiker. Specificeer een range van IP adressen welke CloudStack kan uitdelen aan gast VMs. Let erop dat deze range niet overlapt met de gereserveerde systeem IP range.",
-    "message.host.dedicated": "Host toegewijd",
-    "message.host.dedication.released": "Toegewijde host losgekoppeld",
-    "message.installWizard.click.retry": "Druk op de knop om de lancering opnieuw te proberen",
-    "message.installWizard.copy.whatIsACluster": "Een cluster is een manier om hosts te groeperen. De hosts in een cluster hebben ieder identieke hardware, draaien dezelfde hypervisor, zitten op hetzelfde subnet en kunnen dezelfde gedeelde opslag benaderen. Virtuele machines (VMs) kunnen live gemigreerd worden van tot ene naar de andere host in hetzelfde cluster zonder dat de gebruiker hier iets van merkt. Een cluster is de 3e grootste organisatorische unit binnen Cloudstack&#8482;. Clusters worden ondergebracht in pods, en pods zijn op hun beurt ondergebracht in zones. CloudStack&#8482; biedt te mogelijkheid tot meerdere clusters, maar voor een basis installatie hebben we maar één cluster nodig.",
-    "message.installWizard.copy.whatIsAHost": "Een host een opzichzelfstaande computer. Hosts verzorgen de resources nodig om de gast virtuele machines te draaien. Elke host heeft eigen hypervisor software geinstalleerd om de virtuele machines erop te beheren (Afgezien van bare metal hosts, hierover is meer te vinden in de geavanceerde installatie handleiding). Om een paar voorbeelden te noemen: een Linux server met KVM, een server met Citrix XenServer en servers met ESXi geinstalleerd zijn hosts. Bij de basis installatie gebruiken we een opzichzelfstaande host met XenServer of KVM geinstalleerd. <br/><br/> Een host is de kleinste organisatorische unit binnen een CloudStack&#8482; omgeving. Hosts worden ondergebracht in clusters, cluster zijn ondergebracht in pods en pods zijn ongebracht in zones.",
-    "message.installWizard.copy.whatIsAPod": "Een pod vertegenwoordigd meestal een rack. Hosts in dezelfde pod hebben hetzelfde subnet. <br/><br/>Een pod is de tweede grootste organisatorische unit binnen een CloudStack&#8482; omgeving. Pods zijn ondergebracht in zones. Elke zone kan meerdere pods hebben, voor de basis installatie hebben we een enkele pod in de zone.",
-    "message.installWizard.copy.whatIsAZone": "Een zone is de grootste organisatorische unit binnen een CloudStack&#8482; omgeving. Een zone staat meestal voor een datacenter, al is het geen probleem om meerdere zones in hetzelfde datacenter te hebben. Het voordeel van infrastructuur onderbrengen in zones is om fysieke isolatie en redundantie te creëren. Elke zone kan bijvoorbeeld zijn eigen stroom voorziening en netwerk uplinks hebben en kunnen geografisch verspreid worden (al is dit geen vereiste).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482; is een software platform welke computer capaciteit herenigd om public, private en hybrid infrastructure as a Service (IaaS) clouds te bouwen. CloudStack&#8482; beheert het netwerk, de opslag en de computer nodes welke de cloud infrastructuur vertegenwoordigen. Gebruik CloudStack&#8482; om cloud computing omgevingen uit te rollen, te beheren en te configureren. <br/><br/> CloudStack&#8482 gaat veel verder dan het draaien van virtuele machine bestanden op commodity hardware, het is een turnkey oplossing om virtuele datacenters (as a service) te realiseren. Daarbij levert het alle essentiële componenten om multi-tier en multi-tentant cloud applicaties te bouwen en te beheren. Er is een zowel een open-source als Premium versie beschikbaar, waarbij de open-source versie nagenoeg dezelfde functionaliteit biedt als de Premium versie.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "Een CloudStack&#8482; cloud infrastructuur maakt gebruik van 2 type opslag, namelijk primaire en secundaire opslag.  Primaire opslag kan iSCSI, NFS of lokale opslag zijn. Secundaire opslag werkt via NFS of een S3-compatible opslag systeem. <br/><br/><strong>Primaire opslag</strong> is onderdeel van een cluster, en het bevat de schijf volumes van iedere gast VM in dat cluster. De primaire opslag server wordt meestal dicht bij de hosts geplaatst.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Secundaire opslag is onderdeel van een zone, en biedt opslagruimte aan:<ul><li>Templates - kant-en-klare VMs die gebruikt kunnen worden zonder voorafgaande installatie. </li><li>ISO bestanden - Installatie mediums voor VMs. </li><li>Schijf volume snapshots - reservekopieën van schijf volumes die later gebruikt kunnen worden tijdens recovery of het maken van nieuwe templates. </ul>",
-    "message.installWizard.now.building": "Bezig met het bouwen van je cloud...",
-    "message.installWizard.tooltip.addCluster.name": "Een naam voor het cluster. U kunt deze tekst vrij invullen, en zal verder niet gebruikt worden door CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "De DNS naam of het IP adres van de host.",
-    "message.installWizard.tooltip.addHost.password": "Dit is het wachtwoord voor de gebruiker die hierboven genoemd wordt (van uw Xenserver instllatie).",
-    "message.installWizard.tooltip.addHost.username": "Meestal root.",
-    "message.installWizard.tooltip.addPod.name": "Een naam voor de pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Dit is de IP range van het private netwerk dat CloudStack gebruikt om met Secundaire Opslag VMs en Console Proxy VMs te communiceren. Deze IP adressen komen uit hetzelfde subnet als de gast VMs.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "De gateway voor de hosts in die pod.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "De netmask die gebruikt wordt op het subnet dat de gast VMs gaan gebruiken.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Dit is de IP range van het private netwerk dat CloudStack gebruikt om met Secundaire Opslag VMs en Console Proxy VMs te communiceren. Deze IP adressen komen uit hetzelfde subnet als de gast VMs.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "De naam voor het opslag apparaat.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(Voor NFS) Bij NFS dit is het geëxporteerde pad van de server. Pad (Voor SharedMountPoint). Bij KVM is dit het pad waar op elke machine de primaire opslag is gekoppeld. Bijvoorbeeld, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(Voor NFS, iSCSI of PreSetup)  Het IP adres of DNS naam van het opslag apparaat.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "Het IP adres van de NFS server welke de secundaire opslag serveert",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "Het geëxporteerde pad, op de server die u hierboven heeft gespecificeerd",
-    "message.installWizard.tooltip.addZone.dns1": "Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het publieke netwerk wat we later gaan toevoegen. De publieke IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld.",
-    "message.installWizard.tooltip.addZone.dns2": "Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het publieke netwerk wat we later gaan toevoegen. De publieke IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het private netwerk wat we later gaan toevoegen. De private IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het private netwerk wat we later gaan toevoegen. De private IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld.",
-    "message.installWizard.tooltip.addZone.name": "Een naam voor de zone",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Een beschrijving voor het netwerk",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "De IP reeks welke beschikbaar zal zijn voor gast VMs in de zone. Als één NIC gebruikt wordt, zouden deze IP adressen in hetzelfde CIDR moeten vallen als die van de pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "De gateway welke gast VMs moeten gebruiken",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "De netmask die gebruikt wordt op het subnet dat door gast VMs gebruikt wordt",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "De IP reeks welke beschikbaar zal zijn voor gast VMs in de zone. Als één NIC gebruikt wordt, zouden deze IP adressen in hetzelfde CIDR moeten vallen als die van de pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Een naam voor het netwerk",
-    "message.instance.scaled.up.confirm": "Weet u zeker dat u deze VM wilt opschalen?",
-    "message.instanceWizard.noTemplates": "Er zijn geen templates beschikbaar. Voeg een geschikte template toe, en herstart deze instantie wizard.",
-    "message.ip.address.changed": "Uw IP adres is mogelijk gewijzigd, wilt u de lijst verversen? Wanneer dit het geval is, zal het detail paneel gesloten worden.",
-    "message.iso.desc": "Image bestand met data of bootable media voor besturingsysteem",
-    "message.join.project": "U neemt nu deel aan een project. Klik op het project overzicht om het project te zien.",
-    "message.launch.vm.on.private.network": "Wilt u de instantie starten op uw eigen private dedicated netwerk?",
-    "message.launch.zone": "De zone is klaar om geactiveerd te worden, ga door naar de volgende stap.",
-    "message.ldap.group.import": "Alle gebruikers uit de gegeven groep worden geïmporteerd",
-    "message.link.domain.to.ldap": "schakel autosync voor dit domein in LDAP in",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Bevestig dat u deze account wilt vergrendelen. Wanneer u de account vergrendeld zullen alle gebruikers van deze account hun cloud resources niet meer kunnen beheren. Toegang tot bestaande producten blijft bestaan.",
-    "message.migrate.instance.confirm": "Bevestig de host naar waar u de instantie toe wilt migreren.",
-    "message.migrate.instance.to.host": "Bevestig dat u de instantie naar een andere host toe wilt migreren.",
-    "message.migrate.instance.to.ps": "Bevestig dat u de instantie naar een andere primaire opslag toe wilt migreren.",
-    "message.migrate.router.confirm": "Bevestig de host waar u de router naartoe wilt migreren:",
-    "message.migrate.systemvm.confirm": "Bevestig de host naar waar u de systeem VM toe wilt migreren:",
-    "message.migrate.volume": "Bevestig dat u het volume wilt migreren naar een andere primaire opslag.",
-    "message.network.addVM.desc": "Specificeer het netwerk dat u aan deze VM wilt toevoegen. Een nieuwe netwerk interface zal worden toegevoegd aan de VM.",
-    "message.network.addVMNIC": "Bevestig dat u een nieuwe netwerk interface voor dit netwerk wilt verkrijgen.",
-    "message.network.remote.access.vpn.configuration": "VPN configuratie op afstand is gegenereerd, maar kon niet worden doorgevoerd. Controleer alstublieft de verbinding met het netwerk bestanddeel en probeer opnieuw.",
-    "message.new.user": "Sepecificeer de volgende waarden om een nieuwe gebruiker toe te voegen aan de account",
-    "message.no.affinity.groups": "U heeft geen affinity groepen. Ga door naar de volgende stap.",
-    "message.no.host.available": "Geen hosts beschikbaar voor Migratie",
-    "message.no.network.support": "De geselecteerde hypervisor, vSphere, beschikt niet over additionele netwerk diensten. Ga door naar stap 5.",
-    "message.no.network.support.configuration.not.true": "Er is geen zone waarin security groups zijn ingeschakeld. Om die reden zijn er geen additionele netwerk diensten beschikbaar. Ga door naar stap 5.",
-    "message.no.projects": "U hebt momenteel geen projecten.<br/>U kunt een nieuw project aanmaken vanuit de projecten sectie.",
-    "message.no.projects.adminOnly": "U hebt momenteel geen projecten. <br/>Uw beheerder kan een nieuw project aanmaken.",
-    "message.number.clusters": "<h2><span> Aantal </span> Clusters</h2>",
-    "message.number.hosts": "<h2><span> Aantal </span> Hosts</h2>",
-    "message.number.pods": "<h2><span> Aantal </span> Pods</h2>",
-    "message.number.storage": "<h2><span> Aantal </span> Primaire Opslag Volumes</h2>",
-    "message.number.zones": "<h2><span> Aantal </span> Zones</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Het wachtwoord is veranderd in",
-    "message.password.of.the.vm.has.been.reset.to": "Het wachtwoord van de VM is veranderd in",
-    "message.pending.projects.1": "U heeft openstaande project uitnodigigingen:",
-    "message.pending.projects.2": "Ga naar de project sectie om deze te zien. Selecteer de uitnodiging vanuit het drop-down menu.",
-    "message.please.add.at.lease.one.traffic.range": "U dient minimaal één traffic range toe te voegen.",
-    "message.please.confirm.remove.ssh.key.pair": "bevestig dat u dit SSH sleutelpaar wilt verwijderen, alstublieft",
-    "message.please.proceed": "Ga door naar de volgende stap.",
-    "message.please.select.a.configuration.for.your.zone": "Selecteer een configuratie voor uw zone.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Selecteer a.u.b. een ander publiek en beheer netwerk voordat u deze verwijderd",
-    "message.please.select.networks": "Selecteer netwerken voor uw virtuele machine.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "selecteer alstublieft een ssh sleutelpaar dat U met deze VM wilt gebruiken:",
-    "message.please.wait.while.zone.is.being.created": "Even geduld, uw zone wordt aangemaakt; Dit kan enige tijd duren...",
-    "message.pod.dedication.released": "Toegewijde pod losgekoppeld",
-    "message.portable.ip.delete.confirm": "Bevestig dat u deze porteerbare IP reeks wilt verwijderen",
-    "message.project.invite.sent": "Uitnodiging is verstuurd aan gebruiker. De gebruiker wordt toegevoegd aan het project wanneer hij de uitnodiging accepteert.",
-    "message.public.traffic.in.advanced.zone": "Publiek verkeer wordt gegenereerd wanneer VMs in de cloud het internet bezoeken. Publiek toegankelijke IPs moeten om deze reden toegevoegd worden. Eindgebruikers kunnen deze IP adressen via de Cloudstack UI aanvragen om zo verkeer tussen het gast netwerk en publieke netwerk te realiseren. <br/><br/> Geef minimaal één IP range op voor internet verkeer.",
-    "message.public.traffic.in.basic.zone": "Publiek verkeer wordt gegenereerd wanneer VMs in de cloud het internet bezoeken of diensten serveren aan het internet. Publiek toegankelijke IPs moeten om deze reden toegevoegd worden. Wanneer een instantie wordt aangemaakt, krijgt deze automatisch een van deze IP adressen toegewezen naast het gast IP adres. Static 1-1 NAT wordt automatisch geconfigureerd tussen het publieke IP en gast IP adres. Eindgebruikers kunnen via de CloudStack UI meerdere IP adressen aanvragen om static NAT tussen hun instanties en het publieke IP te realiseren.",
-    "message.question.are.you.sure.you.want.to.add": "Weet U zeker dat U het volgende wenst toe te voegen",
-    "message.read.admin.guide.scaling.up": "Gelieve de dynamic scaling sectie te lezen in admin guide voordat u gaat opschalen.",
-    "message.recover.vm": "Bevestig dat u deze VM wilt herstellen.",
-    "message.redirecting.region": "U wordt doorverbonden met de regio...",
-    "message.reinstall.vm": "LET OP: Als u doorgaat zal de VM opnieuw geïnstalleerd worden vanaf de template. Alle data op de root disk zal verwijderd worden. Eventuele data volumes blijven onaangeraakt.",
-    "message.remove.ldap": "Weet u zeker dat u de LDAP configuratie wilt verwijderen?",
-    "message.remove.region": "Weet u zeker dat u deze regio wilt verwijderen van deze management server?",
-    "message.remove.vpc": "Bevestigd dat u de VPC wilt verwijderen",
-    "message.remove.vpn.access": "Bevestig dat u VPN toegang wilt verwijderen van de volgende gebruiker.",
-    "message.removed.ssh.key.pair": "een ssh sleutelpaar is verwijderd",
-    "message.reset.VPN.connection": "Bevestig dat u deze VPN verbinding wilt resetten",
-    "message.reset.password.warning.notPasswordEnabled": "De template van deze instantie was aangemaakt zonder wachtwoord functie",
-    "message.reset.password.warning.notStopped": "Uw instantie moet gestopt worden voordat u het wachtwoord kunt wijzigen.",
-    "message.restart.mgmt.server": "Gelieve uw management server(s) herstarten om deze wijziging actief te maken.",
-    "message.restart.mgmt.usage.server": "Gelieve uw management server(s) en gebruik server(s) herstarten om deze wijziging actief te maken.",
-    "message.restart.network": "Als u dit netwerk herstart zullen de diensten op het netwerk verstoord worden. Weet u zeker dat u deze actie wil uitvoeren?",
-    "message.restart.vpc": "Bevestig dat u deze VPC wilt herstarten",
-    "message.restart.vpc.remark": "Bevestig altublieft dat U de VPC wilt herstarten <p><small><i>Opmerking: Een niet-redundante VPC redundant maken zal opschonen forceren. De netwerken zullen enige tijd niet beschikbaar zijn</i>.</small></p>",
-    "message.restoreVM": "Wilt u de VM herstellen?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Gebruik <strong>Ctrl-klik</strong> om meerdere security groups te selecteren)",
-    "message.select.a.zone": "Een zone correspondeert meestal met een enkel datacenter. Meerdere zones maken de cloud betrouwbaarder door fysiek isolatie en redunatie te verzorgen.",
-    "message.select.affinity.groups": "Selecteer welke affinity groepen u wilt gebruiken voor deze VM:",
-    "message.select.instance": "Selecteer een instantie.",
-    "message.select.iso": "Gelieve een ISO te selecteren voor uw nieuwe instantie.",
-    "message.select.item": "Gelieve een item te selecteren.",
-    "message.select.security.groups": "Gelieve security group(s) te selecteren voor de nieuwe instantie",
-    "message.select.template": "Gelieve een template te selecteren voor de nieuwe instantie",
-    "message.select.tier": "Gelieve een tier te selecteren",
-    "message.set.default.NIC": "Bevestig dat u dit netwerk apparaat standaard wilt maken voor deze VM.",
-    "message.set.default.NIC.manual": "U dient nu manueel de netwerk interface op de VM updaten.",
-    "message.setup.physical.network.during.zone.creation": "Wanneer u een geavanceerde zone toevoegt, dient u meerdere fysiek netwerken te configureren. Een netwerk correspondeert met een netwerkkaart op de hypervisor. Elk fysiek netwerk kan een of meerdere traffic types bevatten, met bepaald geldende restricties hoe deze gecombineerd mogen worden.  Drag & Drop een of meerdere verkeerstypen op het fysieke netwerk.",
-    "message.setup.physical.network.during.zone.creation.basic": "Wanneer u een basis zone toevoegt bevat deze een fysiek netwerk welke correspondeert met de netwerkkaart op de hypervisor. Op dit netwerk zullen meerdere verkeerstypen gebruikt worden. <br/><br/> U kunt via drag & drop andere verkeerstypen toevoegen aan het fysieke netwerk.",
-    "message.setup.successful": "Cloud installatie is succesvol verlopen!",
-    "message.snapshot.schedule": "U kunt terugkerende momentopname plannen maken door uit de onderstaande mogelijkheden te kiezen en uw beleid voorkeuren toe te passen.",
-    "message.specifiy.tag.key.value": "Gelieve een tag sleutel en waarde te specificeren",
-    "message.specify.url": "Gelieve een URL te specificeren",
-    "message.step.1.continue": "Gelieve een template of ISO te selecteren om door te gaan",
-    "message.step.1.desc": "Selecteer een template voor uw nieuwe instantie. U kunt ook een blanco template selecteren op welke een ISO bestand geinstalleerd kan worden.",
-    "message.step.2.continue": "Selecteer een service aanbieding om verder te gaan.",
-    "message.step.3.continue": "Selecteer een schijf aanbieding om verder te gaan",
-    "message.step.4.continue": "Selecteer minimaal één netwerk om door te gaan",
-    "message.step.4.desc": "Selecteer het primaire netwerk aan welke uw instantie verbonden moet worden",
-    "message.storage.traffic": "Verkeer tussen CloudStack&#39s interne diensten, inclusief componenten die communiceren met de management server zoals hosts en CloudStack systeem VMs. Configureer opslag verkeer hier.",
-    "message.suspend.project": "Weet u zeker dat u dit project wilt pauzeren?",
-    "message.systems.vms.ready": "Systeem VMs klaar.",
-    "message.template.copying": "De template wordt gekopieerd.",
-    "message.template.desc": "OS image bestand dat gebruikt kan worden om de VM op te starten",
-    "message.tier.required": "Tier is benodigd",
-    "message.tooltip.dns.1": "Naam van de DNS server die gebruikt mag worden door VMs in de zone. De publieke IP adressen in de zone moeten een route hebben naar deze server.",
-    "message.tooltip.dns.2": "Naam van een secudaire DNS server die gebruikt mag worden door VMs in de zone. De publieke IP adressen in de zone moeten een route hebben naar deze server.",
-    "message.tooltip.internal.dns.1": "Naam van de DNS server die gebruikt mag worden door interne systeem VMs van CloudStack in de zone. De privé IP adressen in de pod moeten een route hebben naar deze server.",
-    "message.tooltip.internal.dns.2": "Naam van de DNS server die gebruikt mag worden door interne systeem VMs van CloudStack in de zone. De privé IP adressen in de pod moeten een route hebben naar deze server.",
-    "message.tooltip.network.domain": "Een DNS toevoeging dat de domeinnaam zal zijn voor het netwerk wat toegangkelijk is voor gast VMs.",
-    "message.tooltip.pod.name": "Een naam voor deze pod.",
-    "message.tooltip.reserved.system.gateway": "De gateway voor hosts in deze pod.",
-    "message.tooltip.reserved.system.netmask": "De netwerk prefix dat het pod subnet definieert. Gebruik de CIDR notatie.",
-    "message.tooltip.zone.name": "Een naam voor de zone.",
-    "message.update.os.preference": "Selecteer een OS voorkeur voor deze host. Alle virtueel instanties van gelijke voorkeur zullen eerst op deze machine gealloceerd worden voordat er gekeken wordt naar andere hosts.",
-    "message.update.resource.count": "Bevestig dat u de verbruiksstatistieken voor deze account wilt bijwerken.",
-    "message.update.ssl": "Geef een nieuw X.509 compliant SSL certificaat in waarmee elke console proxy en secundaire opslag instantie mee geupdate kunnen worden:",
-    "message.update.ssl.failed": "update SSL certificaat is mislukt",
-    "message.update.ssl.succeeded": "update SSL certificaat is gelukt",
-    "message.validate.URL": "Gelieve een geldige URL in te geven.",
-    "message.validate.accept": "Gelieve een waarde in te geven met een geldidge extensie.",
-    "message.validate.creditcard": "Gelieve een geldig credit card nummer in te geven.",
-    "message.validate.date": "Gelieve een geldige datum in te geven.",
-    "message.validate.date.ISO": "Gelieve een geldige datum (ISO) in te geven.",
-    "message.validate.digits": "Gelieve alleen cijfers in te geven.",
-    "message.validate.email.address": "Gelieve een geldig email adres in te geven.",
-    "message.validate.equalto": "Voer dezelfde waarde nogmaals in.",
-    "message.validate.fieldrequired": "Dit veld is vereist",
-    "message.validate.fixfield": "Gelieve dit veld te herstellen.",
-    "message.validate.instance.name": "Namen van instantie kunnen niet langer zijn dan 63 karakters. Alleen ASCII letters a~z, A~Z, cijfers 0~9 zijn toegestaan. Moet beginnen met een letter en mag eindigen met een letter of cijfer.",
-    "message.validate.invalid.characters": "Niet toegestane karakters gevonden, corrigeer deze.",
-    "message.validate.max": "Gelieve een waarde kleiner of gelijk aan {0} in te geven.",
-    "message.validate.maxlength": "Gelieve niet meer dan {0} karakters in te geven.",
-    "message.validate.minlength": "Gelieve minimaal {0} karakters in te geven.",
-    "message.validate.number": "Gelieve een geldig nummer in te geven.",
-    "message.validate.range": "Gelieve een waarde tussen {0} en {1} in te geven.",
-    "message.validate.range.length": "Gelieve een waarde tussen de {0} en {1} karakters lang in te geven.",
-    "message.virtual.network.desc": "Een dedicated gevirtualiseerd netwerk voor uw account. Het broadcast domein is ingesloten binnen een VLAN en toegang naar het publieke netwerk wordt gerouteerd door een virtueele router.",
-    "message.vm.create.template.confirm": "Creer een template welke de VM atuomatisch laat opstarten.",
-    "message.vm.review.launch": "Gelieve de volgende gegevens te verifiëren te bevestigen zodat uw instantie gestart kan worden.",
-    "message.vnmc.available.list": "VNMC is niet beschikbaar van de provider lijst.",
-    "message.vnmc.not.available.list": "VNMC is niet beschikbaar van de provider lijst.",
-    "message.volume.create.template.confirm": "Bevestig dat u een template wilt maken van dit schijf volume. Het maken van een template kan meerdere minuten duren maar soms ook langer afhankelijk van de grootte van het volume.",
-    "message.waiting.for.builtin.templates.to.load": "Wachten totdat ingebouwde templates zijn geladen...",
-    "message.you.must.have.at.least.one.physical.network": "U moet minimaal één fysiek netwerk hebben",
-    "message.your.cloudstack.is.ready": "Uw CloudStack is klaar!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "De installatie van de zone is compleet, wilt u deze zone meteen inschakelen?",
-    "message.zone.no.network.selection": "De geselecteerde zone heeft geen meerdere netwerk selectie mogelijkheden.",
-    "message.zone.step.1.desc": "Selecteer een netwerk model voor uw zone.",
-    "message.zone.step.2.desc": "Specificeer de volgende gegevens om een nieuwe zone toe te voegen",
-    "message.zone.step.3.desc": "Specificeer de volgende gegevens om een nieuwe pod toe te voegen",
-    "message.zoneWizard.enable.local.storage": "WAARSCHUWING: Als u lokale opslag activeert voor deze zone, moet u de volgende stappen ondernemen afhankelijk van het opslagsysteem waar u de systeem VMs vanaf wilt starten:<br/><br/>1. Wanneer de systeem VMs gestart moeten worden van primaire (gedeelde) opslag moet deze nadat configuratie van de zone klaar is, toegevoegd worden. <br/><br/>2. Wanneer de systeem VMs gestart moeten worden vanaf lokale opslag,  dient de parameter system.vm.use.local.storage gezet zijn voordat u de zone activeert.<br/><br/><br/>Weet u zeker dat u verder wilt gaan?",
-    "messgae.validate.min": "Gelieve een waarde groter of gelijk aan {0} in te geven.",
-    "mode": "Modus",
-    "network.rate": "Netwerk Snelheid",
-    "notification.reboot.instance": "Herstart instantie",
-    "notification.start.instance": "Start Instantie",
-    "notification.stop.instance": "Stop Instantie",
-    "side.by.side": "Zij aan Zij",
-    "state.Accepted": "Geaccepteerd",
-    "state.Active": "Actief",
-    "state.Allocated": "Gebruikt",
-    "state.Allocating": "Alloceren",
-    "state.BackedUp": "Geback-upt",
-    "state.BackingUp": "Back-uppen",
-    "state.Completed": "Uitgevoerd",
-    "state.Creating": "Aanmaken",
-    "state.Declined": "Geweigerd",
-    "state.Destroyed": "Verwijderd",
-    "state.Disabled": "Uitgeschakeld",
-    "state.Enabled": "Geactiveerd",
-    "state.Error": "Fout",
-    "state.Expunging": "Opruimen",
-    "state.Migrating": "MIgreren",
-    "state.Pending": "In afwachting",
-    "state.Ready": "Klaar",
-    "state.Running": "Draaiend",
-    "state.Starting": "Starten",
-    "state.Stopped": "Gestopt",
-    "state.Stopping": "Stoppen",
-    "state.Suspended": "Gepauzeerd",
-    "state.detached": "ontkoppeld",
-    "title.upload.volume": "laad volume",
-    "ui.listView.filters.all": "Alle",
-    "ui.listView.filters.mine": "Eigen"
-};
diff --git a/ui/legacy/l10n/pl.js b/ui/legacy/l10n/pl.js
deleted file mode 100644
index 7262ced..0000000
--- a/ui/legacy/l10n/pl.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP Code",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP Type",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Changed item properties",
-    "confirm.enable.s3": "Please fill in the following information to enable support for S3-backed Secondary Storage",
-    "confirm.enable.swift": "Please fill in the following information to enable support for Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Error could not change your password because LDAP is enabled.",
-    "error.could.not.enable.zone": "Could not enable zone",
-    "error.installWizard.message": "Something went wrong; you may go back and correct any errors",
-    "error.invalid.username.password": "Błędna nazwa użytkownika lub hasło",
-    "error.login": "Your username/password does not match our records.",
-    "error.menu.select": "Unable to perform action due to no items being selected.",
-    "error.mgmt.server.inaccessible": "The Management Server is unaccessible.  Please try again later.",
-    "error.password.not.match": "The password fields do not match",
-    "error.please.specify.physical.network.tags": "Network offerings is not available until you specify tags for this physical network.",
-    "error.session.expired": "Your session has expired.",
-    "error.something.went.wrong.please.correct.the.following": "Something went wrong; please correct the following",
-    "error.unable.to.reach.management.server": "Unable to reach Management Server",
-    "error.unresolved.internet.name": "Your internet name cannot be resolved.",
-    "force.delete": "Force Delete",
-    "force.delete.domain.warning": "Warning: Choosing this option will cause the deletion of all child domains and all associated accounts and their resources.",
-    "force.remove": "Force Remove",
-    "force.remove.host.warning": "Warning: Choosing this option will cause CloudStack to forcefully stop all running virtual machines before removing this host from the cluster.",
-    "force.stop": "Force Stop",
-    "force.stop.instance.warning": "Warning: Forcing a stop on this instance should be your last option. It can lead to data loss as well as inconsistent behavior of the virtual machine state.",
-    "hint.no.host.tags": "No host tags found",
-    "hint.no.storage.tags": "No storage tags found",
-    "hint.type.part.host.tag": "Type in part of a host tag",
-    "hint.type.part.storage.tag": "Type in part of a storage tag",
-    "image.directory": "Image Directory",
-    "inline": "Inline",
-    "instances.actions.reboot.label": "Reboot instance",
-    "label.CIDR.list": "Lista CIDR",
-    "label.CIDR.of.destination.network": "CIDR of destination network",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "DHCP Server Type",
-    "label.DNS.domain.for.guest.networks": "DNS domain for Guest Networks",
-    "label.ESP.encryption": "ESP Encryption",
-    "label.ESP.hash": "ESP Hash",
-    "label.ESP.lifetime": "ESP Lifetime (second)",
-    "label.ESP.policy": "ESP policy",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "IKE Encryption",
-    "label.IKE.hash": "IKE Hash",
-    "label.IKE.lifetime": "IKE lifetime (second)",
-    "label.IKE.policy": "IKE policy",
-    "label.IPsec.preshared.key": "IPsec Preshared-Key",
-    "label.LB.isolation": "LB isolation",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto Log Profile",
-    "label.PA.threat.profile": "Palo Alto Threat Profile",
-    "label.PING.CIFS.password": "PING CIFS password",
-    "label.PING.CIFS.username": "PING CIFS username",
-    "label.PING.dir": "PING Directory",
-    "label.PING.storage.IP": "PING storage IP",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Pxe Server Type",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Port",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP Directory",
-    "label.VMFS.datastore": "VMFS datastore",
-    "label.VMs.in.tier": "VMs in tier",
-    "label.VPC.limits": "VPC limits",
-    "label.VPC.router.details": "VPC router details",
-    "label.VPN.connection": "VPN Connection",
-    "label.VPN.customer.gateway": "VPN Customer Gateway",
-    "label.VPN.gateway": "VPN Gateway",
-    "label.Xenserver.Tools.Version61plus": "Original XS Version is 6.1+",
-    "label.about": "About",
-    "label.about.app": "About CloudStack",
-    "label.accept.project.invitation": "Accept project invitation",
-    "label.account": "Konto",
-    "label.account.and.security.group": "Account, Security group",
-    "label.account.details": "Account details",
-    "label.account.id": "ID konta",
-    "label.account.lower": "account",
-    "label.account.name": "Nazwa konta",
-    "label.account.specific": "Account-Specific",
-    "label.account.type": "Account Type",
-    "label.accounts": "Konta",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL List Rules",
-    "label.acl.name": "ACL Name",
-    "label.acl.replaced": "ACL replaced",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Acquire New IP",
-    "label.acquire.new.secondary.ip": "Acquire new secondary IP",
-    "label.action": "Action",
-    "label.action.attach.disk": "Dodaj dysk",
-    "label.action.attach.disk.processing": "Dodawanie dysku",
-    "label.action.attach.iso": "Dodaj obraz ISO",
-    "label.action.attach.iso.processing": "Dodawanie obrazu ISO",
-    "label.action.cancel.maintenance.mode": "Cancel Maintenance Mode",
-    "label.action.cancel.maintenance.mode.processing": "Cancelling Maintenance Mode....",
-    "label.action.change.password": "Zmień hasło",
-    "label.action.change.service": "Change Service",
-    "label.action.change.service.processing": "Changing Service....",
-    "label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
-    "label.action.copy.ISO": "Kopiuj ISO",
-    "label.action.copy.ISO.processing": "Copying ISO....",
-    "label.action.copy.template": "Kopij szablon",
-    "label.action.copy.template.processing": "Copying Template....",
-    "label.action.create.template": "Utwórz szablon",
-    "label.action.create.template.from.vm": "Utwórz szablon z VM",
-    "label.action.create.template.from.volume": "Utwórz Szablon z wolumenu",
-    "label.action.create.template.processing": "Tworzę szablon",
-    "label.action.create.vm": "Utwórz VM",
-    "label.action.create.vm.processing": "Tworzę VM....",
-    "label.action.create.volume": "Utwórz wolumen",
-    "label.action.create.volume.processing": "Tworzę wolumen....",
-    "label.action.delete.IP.range": "Delete IP Range",
-    "label.action.delete.IP.range.processing": "Deleting IP Range....",
-    "label.action.delete.ISO": "Usuń ISO",
-    "label.action.delete.ISO.processing": "Usuwam ISO....",
-    "label.action.delete.account": "Usuń dostęp",
-    "label.action.delete.account.processing": "Usuwanie dostępu....",
-    "label.action.delete.cluster": "Usuń klaster",
-    "label.action.delete.cluster.processing": "Usuwam klaster....",
-    "label.action.delete.disk.offering": "Delete Disk Offering",
-    "label.action.delete.disk.offering.processing": "Deleting Disk Offering....",
-    "label.action.delete.domain": "Usuń domenę",
-    "label.action.delete.domain.processing": "Usuwam domenę....",
-    "label.action.delete.firewall": "Usuń regułę Firewall",
-    "label.action.delete.firewall.processing": "Usuwam Firewall",
-    "label.action.delete.ingress.rule": "Delete Ingress Rule",
-    "label.action.delete.ingress.rule.processing": "Deleting Ingress Rule....",
-    "label.action.delete.load.balancer": "Delete load balancer rule",
-    "label.action.delete.load.balancer.processing": "Deleting Load Balancer....",
-    "label.action.delete.network": "Usuń sieć",
-    "label.action.delete.network.processing": "Usuwam sieć....",
-    "label.action.delete.nexusVswitch": "Usuń Nexus 1000v",
-    "label.action.delete.nic": "Remove NIC",
-    "label.action.delete.physical.network": "Usuń fizyczną sieć",
-    "label.action.delete.pod": "Delete Pod",
-    "label.action.delete.pod.processing": "Deleting Pod....",
-    "label.action.delete.primary.storage": "Delete Primary Storage",
-    "label.action.delete.primary.storage.processing": "Deleting Primary Storage....",
-    "label.action.delete.secondary.storage": "Delete Secondary Storage",
-    "label.action.delete.secondary.storage.processing": "Deleting Secondary Storage....",
-    "label.action.delete.security.group": "Delete Security Group",
-    "label.action.delete.security.group.processing": "Deleting Security Group....",
-    "label.action.delete.service.offering": "Delete Service Offering",
-    "label.action.delete.service.offering.processing": "Deleting Service Offering....",
-    "label.action.delete.snapshot": "Delete Snapshot",
-    "label.action.delete.snapshot.processing": "Deleting Snapshot....",
-    "label.action.delete.system.service.offering": "Delete System Service Offering",
-    "label.action.delete.template": "Delete Template",
-    "label.action.delete.template.processing": "Deleting Template....",
-    "label.action.delete.user": "Usuń użytkownika",
-    "label.action.delete.user.processing": "Usuwam użytkownika....",
-    "label.action.delete.volume": "Usuń wolumen",
-    "label.action.delete.volume.processing": "Usuwam wolumen....",
-    "label.action.delete.zone": "Usuń strefę",
-    "label.action.delete.zone.processing": "Usuwam strefę....",
-    "label.action.destroy.instance": "Usuń instancję",
-    "label.action.destroy.instance.processing": "Usuwam instancję",
-    "label.action.destroy.systemvm": "Destroy System VM",
-    "label.action.destroy.systemvm.processing": "Destroying System VM....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Odłącz dysk",
-    "label.action.detach.disk.processing": "Odłączanie dysku....",
-    "label.action.detach.iso": "Odłącz obraz ISO",
-    "label.action.detach.iso.processing": "Odłączanie obrazu ISO",
-    "label.action.disable.account": "Wyłącz dostęp",
-    "label.action.disable.account.processing": "Wyłączam dostęp....",
-    "label.action.disable.cluster": "Wyłącz klaster",
-    "label.action.disable.cluster.processing": "Wyłączam klaster....",
-    "label.action.disable.nexusVswitch": "Wyłącz Nexus 1000v",
-    "label.action.disable.physical.network": "Wyłącz fizyczną sieć",
-    "label.action.disable.pod": "Disable Pod",
-    "label.action.disable.pod.processing": "Disabling Pod....",
-    "label.action.disable.static.NAT": "Disable Static NAT",
-    "label.action.disable.static.NAT.processing": "Disabling Static NAT....",
-    "label.action.disable.user": "Wyłącz użytkownika",
-    "label.action.disable.user.processing": "Wyłączam użytkownika",
-    "label.action.disable.zone": "Wyłącz strefę",
-    "label.action.disable.zone.processing": "Wyłączam strefę....",
-    "label.action.download.ISO": "Pobierz ISO",
-    "label.action.download.template": "Pobierz szablon",
-    "label.action.download.volume": "Pobierz wolumen",
-    "label.action.download.volume.processing": "Pobieram wolumen....",
-    "label.action.edit.ISO": "Edytuj ISO",
-    "label.action.edit.account": "Edytuj dostęp",
-    "label.action.edit.disk.offering": "Edit Disk Offering",
-    "label.action.edit.domain": "Edytuj domenę",
-    "label.action.edit.global.setting": "Edytuj Globalne ustawienia",
-    "label.action.edit.host": "Edytuj host",
-    "label.action.edit.instance": "Edytuj instancję",
-    "label.action.edit.network": "Edytuj sieć",
-    "label.action.edit.network.offering": "Edit Network Offering",
-    "label.action.edit.network.processing": "Zmieniam sieć....",
-    "label.action.edit.pod": "Edit Pod",
-    "label.action.edit.primary.storage": "Edit Primary Storage",
-    "label.action.edit.resource.limits": "Edit Resource Limits",
-    "label.action.edit.service.offering": "Edit Service Offering",
-    "label.action.edit.template": "Edytuj szablon",
-    "label.action.edit.user": "Edytuj użytkownika",
-    "label.action.edit.zone": "Edytuj strefę",
-    "label.action.enable.account": "Włącz dostęp",
-    "label.action.enable.account.processing": "Włączam dostęp....",
-    "label.action.enable.cluster": "Włącz klaster",
-    "label.action.enable.cluster.processing": "Włączam klaster....",
-    "label.action.enable.maintenance.mode": "Enable Maintenance Mode",
-    "label.action.enable.maintenance.mode.processing": "Enabling Maintenance Mode....",
-    "label.action.enable.nexusVswitch": "Włącz Nexus 1000v",
-    "label.action.enable.physical.network": "Włącz fizyczną sieć",
-    "label.action.enable.pod": "Enable Pod",
-    "label.action.enable.pod.processing": "Enabling Pod....",
-    "label.action.enable.static.NAT": "Enable Static NAT",
-    "label.action.enable.static.NAT.processing": "Enabling Static NAT....",
-    "label.action.enable.user": "Włącz użytkownika",
-    "label.action.enable.user.processing": "Włączam użytkownika....",
-    "label.action.enable.zone": "Włącz strefę",
-    "label.action.enable.zone.processing": "Włączam strefę....",
-    "label.action.expunge.instance": "Expunge Instance",
-    "label.action.expunge.instance.processing": "Expunging Instance....",
-    "label.action.force.reconnect": "Force Reconnect",
-    "label.action.force.reconnect.processing": "Reconnecting....",
-    "label.action.generate.keys": "Generuj klucze",
-    "label.action.generate.keys.processing": "Generuję klucze....",
-    "label.action.list.nexusVswitch": "Kista Nexus 1000v",
-    "label.action.lock.account": "Zablokuj dostęp",
-    "label.action.lock.account.processing": "Blokuję dostęp....",
-    "label.action.manage.cluster": "Zarządzaj klastrem",
-    "label.action.manage.cluster.processing": "Zarządzam klastrem....",
-    "label.action.migrate.instance": "Migruj instancję",
-    "label.action.migrate.instance.processing": "Migruję instancję....",
-    "label.action.migrate.router": "Migruj router",
-    "label.action.migrate.router.processing": "Migruje router....",
-    "label.action.migrate.systemvm": "Migruj system VM",
-    "label.action.migrate.systemvm.processing": "Migruję system VM....",
-    "label.action.reboot.instance": "Restartuj instancję",
-    "label.action.reboot.instance.processing": "Restartuje instancję",
-    "label.action.reboot.router": "Restartuj router",
-    "label.action.reboot.router.processing": "Restartuje router.....",
-    "label.action.reboot.systemvm": "Restartuj system VM",
-    "label.action.reboot.systemvm.processing": "Restartuje system VM....",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Recurring Snapshots",
-    "label.action.register.iso": "Rejestruj ISO",
-    "label.action.register.template": "Register Template from URL",
-    "label.action.release.ip": "Release IP",
-    "label.action.release.ip.processing": "Releasing IP....",
-    "label.action.remove.host": "Usuń host",
-    "label.action.remove.host.processing": "Usuwam host....",
-    "label.action.reset.password": "Resetuj hasło",
-    "label.action.reset.password.processing": "Resetuję hasło....",
-    "label.action.resize.volume": "Zmień wielkość wolumenu",
-    "label.action.resize.volume.processing": "Zmieniam wielkość wolumenu....",
-    "label.action.resource.limits": "Resource limits",
-    "label.action.restore.instance": "Przywróć instancję",
-    "label.action.restore.instance.processing": "Restoring Instance....",
-    "label.action.revert.snapshot": "Revert to Snapshot",
-    "label.action.revert.snapshot.processing": "Reverting to Snapshot...",
-    "label.action.start.instance": "Uruchom instancję",
-    "label.action.start.instance.processing": "Uruchamiam instancję....",
-    "label.action.start.router": "Uruchom router",
-    "label.action.start.router.processing": "Uruchamiam router....",
-    "label.action.start.systemvm": "Uruchom system VM",
-    "label.action.start.systemvm.processing": "Uruchamiam system VM...",
-    "label.action.stop.instance": "Zatrzymaj instancję",
-    "label.action.stop.instance.processing": "Zatrzymuję instancję....",
-    "label.action.stop.router": "Zatrzymaj router",
-    "label.action.stop.router.processing": "Zatrzymuję router...",
-    "label.action.stop.systemvm": "Zatrzymaj system VM",
-    "label.action.stop.systemvm.processing": "Zatrzymuję system VM....",
-    "label.action.take.snapshot": "Zrób snapshot",
-    "label.action.take.snapshot.processing": "Tworzę snapshot....",
-    "label.action.unmanage.cluster": "Unmanage Cluster",
-    "label.action.unmanage.cluster.processing": "Unmanaging Cluster....",
-    "label.action.update.OS.preference": "Update OS Preference",
-    "label.action.update.OS.preference.processing": "Updating OS Preference....",
-    "label.action.update.resource.count": "Update Resource Count",
-    "label.action.update.resource.count.processing": "Updating Resource Count....",
-    "label.action.vmsnapshot.create": "Take VM Snapshot",
-    "label.action.vmsnapshot.delete": "Delete VM snapshot",
-    "label.action.vmsnapshot.revert": "Revert to VM snapshot",
-    "label.actions": "Akcje",
-    "label.activate.project": "Aktywuj projekt",
-    "label.active.sessions": "Active Sessions",
-    "label.add": "Dodaj",
-    "label.add.ACL": "Dodaj ACL",
-    "label.add.BigSwitchBcf.device": "Add BigSwitch BCF Controller",
-    "label.add.BrocadeVcs.device": "Add Brocade Vcs Switch",
-    "label.add.F5.device": "Add F5 device",
-    "label.add.LDAP.account": "Add LDAP Account",
-    "label.add.NiciraNvp.device": "Add Nvp Controller",
-    "label.add.OpenDaylight.device": "Add OpenDaylight Controller",
-    "label.add.PA.device": "Add Palo Alto device",
-    "label.add.SRX.device": "Add SRX device",
-    "label.add.VM.to.tier": "Add VM to tier",
-    "label.add.VPN.gateway": "Add VPN Gateway",
-    "label.add.account": "Dodaj konto",
-    "label.add.account.to.project": "Dodaj konto do projektu",
-    "label.add.accounts": "Dodaj konta",
-    "label.add.accounts.to": "Dodaj konto do",
-    "label.add.acl.list": "Add ACL List",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Add new affinity group",
-    "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
-    "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
-    "label.add.by": "Dodaj przez",
-    "label.add.by.cidr": "Dodaj przez CIDR",
-    "label.add.by.group": "Dodaj przez grupę",
-    "label.add.ciscoASA1000v": "Add CiscoASA1000v Resource",
-    "label.add.cluster": "Dodaj klaster",
-    "label.add.compute.offering": "Add compute offering",
-    "label.add.direct.iprange": "Add Direct Ip Range",
-    "label.add.disk.offering": "Add Disk Offering",
-    "label.add.domain": "Dodaj domenę",
-    "label.add.egress.rule": "Add egress rule",
-    "label.add.firewall": "Dodaj regułę firewall",
-    "label.add.globo.dns": "Add GloboDNS",
-    "label.add.gslb": "Add GSLB",
-    "label.add.guest.network": "Add guest network",
-    "label.add.host": "Dodaj host",
-    "label.add.ingress.rule": "Add Ingress Rule",
-    "label.add.intermediate.certificate": "Add intermediate certificate",
-    "label.add.internal.lb": "Add Internal LB",
-    "label.add.ip.range": "Add IP Range",
-    "label.add.isolated.guest.network": "Add Isolated Guest Network",
-    "label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
-    "label.add.isolated.network": "Add Isolated Network",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Add LDAP account",
-    "label.add.list.name": "ACL List Name",
-    "label.add.load.balancer": "Add Load Balancer",
-    "label.add.more": "Dodaj więcej",
-    "label.add.netScaler.device": "Add Netscaler device",
-    "label.add.network": "Dodaj sieć",
-    "label.add.network.ACL": "Add network ACL",
-    "label.add.network.acl.list": "Add Network ACL List",
-    "label.add.network.device": "Dodaj urządzenie sieciowe",
-    "label.add.network.offering": "Add network offering",
-    "label.add.new.F5": "Dodaj nowy F5",
-    "label.add.new.NetScaler": "Add new NetScaler",
-    "label.add.new.PA": "Add new Palo Alto",
-    "label.add.new.SRX": "Dodaj nowy SRX",
-    "label.add.new.gateway": "Add new gateway",
-    "label.add.new.tier": "Add new tier",
-    "label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
-    "label.add.physical.network": "Add physical network",
-    "label.add.pod": "Add Pod",
-    "label.add.port.forwarding.rule": "Add port forwarding rule",
-    "label.add.portable.ip.range": "Add Portable IP Range",
-    "label.add.primary.storage": "Add Primary Storage",
-    "label.add.private.gateway": "Add Private Gateway",
-    "label.add.region": "Dodaj region",
-    "label.add.resources": "Add Resources",
-    "label.add.role": "Add Role",
-    "label.add.route": "Add route",
-    "label.add.rule": "Dodaj regułę",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Add Secondary Storage",
-    "label.add.security.group": "Add Security Group",
-    "label.add.service.offering": "Add Service Offering",
-    "label.add.static.nat.rule": "Add static NAT rule",
-    "label.add.static.route": "Add static route",
-    "label.add.system.service.offering": "Add System Service Offering",
-    "label.add.template": "Add Template",
-    "label.add.to.group": "Dodaj do grupy",
-    "label.add.ucs.manager": "Add UCS Manager",
-    "label.add.user": "Dodaj użytkownika",
-    "label.add.userdata": "Userdata",
-    "label.add.vlan": "Dodaj VLAN",
-    "label.add.vm": "Dodaj VM",
-    "label.add.vms": "Dodaj VM-ny",
-    "label.add.vms.to.lb": "Add VM(s) to load balancer rule",
-    "label.add.vmware.datacenter": "Add VMware datacenter",
-    "label.add.vnmc.device": "Add VNMC device",
-    "label.add.vnmc.provider": "Add VNMC provider",
-    "label.add.volume": "Dodaj wolumen",
-    "label.add.vpc": "Dodaj VPC",
-    "label.add.vpc.offering": "Add VPC Offering",
-    "label.add.vpn.customer.gateway": "Add VPN Customer Gateway",
-    "label.add.vpn.user": "Add VPN user",
-    "label.add.vxlan": "Add VXLAN",
-    "label.add.zone": "Dodaj strefę",
-    "label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
-    "label.added.network.offering": "Added network offering",
-    "label.added.new.bigswitch.bcf.controller": "Added new BigSwitch BCF Controller",
-    "label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
-    "label.addes.new.f5": "Added new F5",
-    "label.adding": "Dodawanie",
-    "label.adding.cluster": "Adding Cluster",
-    "label.adding.failed": "Dodanie nieudane",
-    "label.adding.pod": "Adding Pod",
-    "label.adding.processing": "Dodawanie",
-    "label.adding.succeeded": "Dodanie udane",
-    "label.adding.user": "Adding User",
-    "label.adding.zone": "Adding Zone",
-    "label.additional.networks": "Additional Networks",
-    "label.admin": "Admin",
-    "label.admin.accounts": "Admin Accounts",
-    "label.advanced": "Advanced",
-    "label.advanced.mode": "Advanced Mode",
-    "label.advanced.search": "Advanced Search",
-    "label.affinity": "Affinity",
-    "label.affinity.group": "Affinity Group",
-    "label.affinity.groups": "Affinity Groups",
-    "label.agent.password": "Agent Password",
-    "label.agent.port": "Agent Port",
-    "label.agent.state": "Agent State",
-    "label.agent.username": "Agent Username",
-    "label.agree": "Agree",
-    "label.alert": "Alert",
-    "label.alert.archived": "Alert Archived",
-    "label.alert.deleted": "Alert Deleted",
-    "label.alert.details": "Alert details",
-    "label.algorithm": "Algorithm",
-    "label.allocated": "Allocated",
-    "label.allocation.state": "Allocation State",
-    "label.allow": "Allow",
-    "label.anti.affinity": "Anti-affinity",
-    "label.anti.affinity.group": "Anti-affinity Group",
-    "label.anti.affinity.groups": "Anti-affinity Groups",
-    "label.api.key": "Klucz API",
-    "label.api.version": "API Version",
-    "label.app.name": "CloudStack",
-    "label.apply": "Zastosuj",
-    "label.archive": "Archive",
-    "label.archive.alerts": "Archive alerts",
-    "label.archive.events": "Archive events",
-    "label.assign": "Assign",
-    "label.assign.instance.another": "Assign Instance to Another Account",
-    "label.assign.to.load.balancer": "Assigning instance to load balancer",
-    "label.assign.vms": "Assign VMs",
-    "label.assigned.vms": "Assigned VMs",
-    "label.associate.public.ip": "Associate Public IP",
-    "label.associated.network": "Associated Network",
-    "label.associated.network.id": "Associated Network ID",
-    "label.associated.profile": "Associated Profile",
-    "label.attached.iso": "Attached ISO",
-    "label.author.email": "Author e-mail",
-    "label.author.name": "Imię autora",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
-    "label.availability": "Availability",
-    "label.availability.zone": "Availability Zone",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "Dostępne",
-    "label.available.public.ips": "Dostępne publiczne adresy IP",
-    "label.back": "Wstecz",
-    "label.bandwidth": "Przepustowość",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP Devices",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP Provider",
-    "label.baremetal.pxe.device": "Add Baremetal PXE Device",
-    "label.baremetal.pxe.devices": "Baremetal PXE Devices",
-    "label.baremetal.pxe.provider": "Baremetal PXE Provider",
-    "label.baremetal.rack.configuration": "Baremetal Rack Configuration",
-    "label.basic": "Basic",
-    "label.basic.mode": "Basic Mode",
-    "label.bigswitch.bcf.details": "BigSwitch BCF details",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT Enabled",
-    "label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "Bootable",
-    "label.broadcast.domain.range": "Broadcast domain range",
-    "label.broadcast.domain.type": "Broadcast Domain Type",
-    "label.broadcast.uri": "Broadcast URI",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "Broadcast URI",
-    "label.brocade.vcs.address": "Vcs Switch Address",
-    "label.brocade.vcs.details": "Brocade Vcs Switch details",
-    "label.by.account": "By Account",
-    "label.by.alert.type": "By alert type",
-    "label.by.availability": "By Availability",
-    "label.by.date.end": "By date (end)",
-    "label.by.date.start": "By date (start)",
-    "label.by.domain": "By Domain",
-    "label.by.end.date": "By End Date",
-    "label.by.event.type": "By event type",
-    "label.by.level": "By Level",
-    "label.by.pod": "By Pod",
-    "label.by.role": "By Role",
-    "label.by.start.date": "By Start Date",
-    "label.by.state": "By State",
-    "label.by.traffic.type": "By Traffic Type",
-    "label.by.type": "By Type",
-    "label.by.type.id": "By Type ID",
-    "label.by.zone": "By Zone",
-    "label.bytes.received": "Bytes Received",
-    "label.bytes.sent": "Bytes Sent",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "Zakończ",
-    "label.capacity": "Capacity",
-    "label.capacity.bytes": "Capacity Bytes",
-    "label.capacity.iops": "Capacity IOPS",
-    "label.certificate": "Certyfikat",
-    "label.change.affinity": "Change Affinity",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "Change service offering",
-    "label.change.value": "Change value",
-    "label.character": "Character",
-    "label.chassis": "Chassis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR or Account/Security Group",
-    "label.cidr.list": "Source CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Address",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Password",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Username",
-    "label.ciscovnmc.resource.details": "CiscoVNMC resource details",
-    "label.clean.up": "Wyczyść",
-    "label.clear.list": "Wyczyść listę",
-    "label.close": "Zamknij",
-    "label.cloud.console": "Cloud Management Console",
-    "label.cloud.managed": "Cloud.com Managed",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Cluster Name",
-    "label.cluster.type": "Cluster Type",
-    "label.clusters": "Clusters",
-    "label.clvm": "CLVM",
-    "label.code": "Kod",
-    "label.community": "Społeczność",
-    "label.compute": "Compute",
-    "label.compute.and.storage": "Compute and Storage",
-    "label.compute.offering": "Compute offering",
-    "label.compute.offerings": "Compute Offerings",
-    "label.configuration": "Konfiguracja",
-    "label.configure": "Konfiguruj",
-    "label.configure.ldap": "Configure LDAP",
-    "label.configure.network.ACLs": "Configure Network ACLs",
-    "label.configure.sticky.policy": "Configure Sticky Policy",
-    "label.configure.vpc": "Konfiguruj VPC",
-    "label.confirm.password": "Potwierdź hasło",
-    "label.confirmation": "Potwierdzenie",
-    "label.congratulations": "Gratulacje!",
-    "label.conserve.mode": "Conserve mode",
-    "label.console.proxy": "Console proxy",
-    "label.console.proxy.vm": "Console Proxy VM",
-    "label.continue": "Kontynuuj",
-    "label.continue.basic.install": "Continue with basic installation",
-    "label.copying.iso": "Copying ISO",
-    "label.corrections.saved": "Poprawka zapisana",
-    "label.counter": "Counter",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU Allocated",
-    "label.cpu.allocated.for.VMs": "CPU Allocated for VMs",
-    "label.cpu.limits": "Limit CPU",
-    "label.cpu.mhz": "CPU (w MHz)",
-    "label.cpu.utilized": "CPU Utilized",
-    "label.create.VPN.connection": "Create VPN Connection",
-    "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
-    "label.create.nfs.secondary.staging.store": "Create NFS secondary staging store",
-    "label.create.project": "Stwórz projekt",
-    "label.create.ssh.key.pair": "Create a SSH Key Pair",
-    "label.create.template": "Create template",
-    "label.created": "Utworzono",
-    "label.created.by.system": "Utworzono przez system",
-    "label.cross.zones": "Cross Zones",
-    "label.custom": "Custom",
-    "label.custom.disk.iops": "Custom IOPS",
-    "label.custom.disk.offering": "Custom Disk Offering",
-    "label.custom.disk.size": "Custom Disk Size",
-    "label.daily": "Dziennie",
-    "label.data.disk.offering": "Data Disk Offering",
-    "label.date": "Data",
-    "label.day": "Day",
-    "label.day.of.month": "Dzień miesiąca",
-    "label.day.of.week": "Dzień tygodnia",
-    "label.dc.name": "DC Name",
-    "label.dead.peer.detection": "Dead Peer Detection",
-    "label.decline.invitation": "Decline invitation",
-    "label.dedicate": "Dedicate",
-    "label.dedicate.cluster": "Dedicate Cluster",
-    "label.dedicate.host": "Dedicate Host",
-    "label.dedicate.pod": "Dedicate Pod",
-    "label.dedicate.vlan.vni.range": "Dedicate VLAN/VNI Range",
-    "label.dedicate.zone": "Dedicate Zone",
-    "label.dedicated": "Dedykowany",
-    "label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
-    "label.default": "Domyślnie",
-    "label.default.egress.policy": "Default egress policy",
-    "label.default.use": "Default Use",
-    "label.default.view": "Widok domyślny",
-    "label.delete": "Usuń",
-    "label.delete.BigSwitchBcf": "Remove BigSwitch BCF Controller",
-    "label.delete.BrocadeVcs": "Remove Brocade Vcs Switch",
-    "label.delete.F5": "Usuń F5",
-    "label.delete.NetScaler": "Delete NetScaler",
-    "label.delete.NiciraNvp": "Remove Nvp Controller",
-    "label.delete.OpenDaylight.device": "Delete OpenDaylight Controller",
-    "label.delete.PA": "Delete Palo Alto",
-    "label.delete.SRX": "Usuń SRX",
-    "label.delete.VPN.connection": "Delete VPN connection",
-    "label.delete.VPN.customer.gateway": "Delete VPN Customer Gateway",
-    "label.delete.VPN.gateway": "Delete VPN Gateway",
-    "label.delete.acl.list": "Delete ACL List",
-    "label.delete.affinity.group": "Delete Affinity Group",
-    "label.delete.alerts": "Delete alerts",
-    "label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
-    "label.delete.ciscoASA1000v": "Delete CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
-    "label.delete.events": "Delete events",
-    "label.delete.gateway": "Delete gateway",
-    "label.delete.internal.lb": "Delete Internal LB",
-    "label.delete.portable.ip.range": "Delete Portable IP Range",
-    "label.delete.profile": "Delete Profile",
-    "label.delete.project": "Usuń projekt",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Delete Secondary Staging Store",
-    "label.delete.ucs.manager": "Delete UCS Manager",
-    "label.delete.vpn.user": "Delete VPN user",
-    "label.deleting.failed": "Usuwanie nieudane",
-    "label.deleting.processing": "Usuwanie....",
-    "label.deny": "Deny",
-    "label.deployment.planner": "Deployment planner",
-    "label.description": "Description",
-    "label.destination.physical.network.id": "Destination physical network ID",
-    "label.destination.zone": "Destination Zone",
-    "label.destroy": "Zniszcz",
-    "label.destroy.router": "Zniszcz router",
-    "label.destroy.vm.graceperiod": "Destroy VM Grace Period",
-    "label.detaching.disk": "Odłączanie dysku",
-    "label.details": "Szczegóły",
-    "label.device.id": "Device ID",
-    "label.devices": "Devices",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Direct Attached Public IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Shared Network IPs",
-    "label.disable.autoscale": "Disable Autoscale",
-    "label.disable.host": "Disable Host",
-    "label.disable.network.offering": "Disable network offering",
-    "label.disable.provider": "Disable provider",
-    "label.disable.vnmc.provider": "Disable VNMC provider",
-    "label.disable.vpc.offering": "Disable VPC offering",
-    "label.disable.vpn": "Wyłącz VPN",
-    "label.disabled": "Wyłączony",
-    "label.disabling.vpn.access": "Disabling VPN Access",
-    "label.disassociate.profile.blade": "Disassociate Profile from Blade",
-    "label.disbale.vnmc.device": "Disable VNMC device",
-    "label.disk.allocated": "Disk Allocated",
-    "label.disk.bytes.read.rate": "Disk Read Rate (BPS)",
-    "label.disk.bytes.write.rate": "Disk Write Rate (BPS)",
-    "label.disk.iops.max": "Max IOPS",
-    "label.disk.iops.min": "Min IOPS",
-    "label.disk.iops.read.rate": "Disk Read Rate (IOPS)",
-    "label.disk.iops.total": "IOPS Total",
-    "label.disk.iops.write.rate": "Disk Write Rate (IOPS)",
-    "label.disk.offering": "Disk Offering",
-    "label.disk.offering.details": "Disk offering details",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisioning Type",
-    "label.disk.read.bytes": "Disk Read (Bytes)",
-    "label.disk.read.io": "Disk Read (IO)",
-    "label.disk.size": "Wielkość dysku",
-    "label.disk.size.gb": "Wielkość dysku (w GB)",
-    "label.disk.total": "Disk Total",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Disk Volume",
-    "label.disk.write.bytes": "Disk Write (Bytes)",
-    "label.disk.write.io": "Disk Write (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Display Name",
-    "label.display.text": "Display Text",
-    "label.distributedrouter": "Distributed Router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domena",
-    "label.domain.admin": "Administrator domeny",
-    "label.domain.details": "Domain details",
-    "label.domain.id": "ID domeny",
-    "label.domain.lower": "domain",
-    "label.domain.name": "Nazwa domeny",
-    "label.domain.router": "Domain router",
-    "label.domain.suffix": "DNS Domain Suffix (i.e., xyz.com)",
-    "label.done": "Skończono",
-    "label.double.quotes.are.not.allowed": "Double quotes are not allowed",
-    "label.download.progress": "Postęp w pobieraniu",
-    "label.drag.new.position": "Przenieś w nowe miejsce",
-    "label.duration.in.sec": "Duration (in sec)",
-    "label.dynamically.scalable": "Dynamically Scalable",
-    "label.edit": "Edytuj",
-    "label.edit.acl.rule": "Edit ACL rule",
-    "label.edit.affinity.group": "Edit Affinity Group",
-    "label.edit.lb.rule": "Edit LB rule",
-    "label.edit.network.details": "Edytuj szczegóły sieci",
-    "label.edit.project.details": "Zmień szczegóły projektu",
-    "label.edit.region": "Edit Region",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Edit rule",
-    "label.edit.secondary.ips": "Edit secondary IPs",
-    "label.edit.tags": "Edit tags",
-    "label.edit.traffic.type": "Edit traffic type",
-    "label.edit.vpc": "Edytuj VPC",
-    "label.egress.default.policy": "Egress Default Policy",
-    "label.egress.rule": "Egress rule",
-    "label.egress.rules": "Egress rules",
-    "label.elastic": "Elastyczny",
-    "label.elastic.IP": "Zmienne IP",
-    "label.elastic.LB": "Elastic LB",
-    "label.email": "Poczta",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Enable Autoscale",
-    "label.enable.host": "Enable Host",
-    "label.enable.network.offering": "Enable network offering",
-    "label.enable.provider": "Enable provider",
-    "label.enable.s3": "Enable S3-backed Secondary Storage",
-    "label.enable.swift": "Enable Swift",
-    "label.enable.vnmc.device": "Enable VNMC device",
-    "label.enable.vnmc.provider": "Enable VNMC provider",
-    "label.enable.vpc.offering": "Enable VPC offering",
-    "label.enable.vpn": "Włącz VPN",
-    "label.enabling.vpn": "Enabling VPN",
-    "label.enabling.vpn.access": "Enabling VPN Access",
-    "label.end.IP": "End IP",
-    "label.end.port": "End Port",
-    "label.end.reserved.system.IP": "End Reserved system IP",
-    "label.end.vlan": "End VLAN",
-    "label.end.vxlan": "End VXLAN",
-    "label.endpoint": "Endpoint",
-    "label.endpoint.or.operation": "Endpoint or Operation",
-    "label.enter.token": "Enter token",
-    "label.error": "Błąd",
-    "label.error.code": "Error Code",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "ESX/ESXi Host",
-    "label.event": "Event",
-    "label.event.archived": "Event Archived",
-    "label.event.deleted": "Event Deleted",
-    "label.every": "Every",
-    "label.example": "Example",
-    "label.expunge": "Expunge",
-    "label.external.link": "External link",
-    "label.extractable": "Extractable",
-    "label.extractable.lower": "extractable",
-    "label.f5": "F5",
-    "label.f5.details": "F5 details",
-    "label.failed": "Błąd",
-    "label.featured": "Polecane",
-    "label.fetch.latest": "Fetch latest",
-    "label.filterBy": "Filtrowanie wg",
-    "label.fingerprint": "FingerPrint",
-    "label.firewall": "Zapora",
-    "label.first.name": "Pierwsza nazwa",
-    "label.firstname.lower": "firstname",
-    "label.format": "Format",
-    "label.format.lower": "format",
-    "label.friday": "Piątek",
-    "label.full": "Full",
-    "label.full.path": "Pełna ścieżka",
-    "label.gateway": "Gateway",
-    "label.general.alerts": "General Alerts",
-    "label.generating.url": "Generating URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS Configuration",
-    "label.gluster.volume": "Volume",
-    "label.go.step.2": "Idź do punktu 2",
-    "label.go.step.3": "Idź do punktu 3",
-    "label.go.step.4": "Idź do punktu 4",
-    "label.go.step.5": "Idź do punktu 5",
-    "label.gpu": "GPU",
-    "label.group": "Grupa",
-    "label.group.by.account": "Group by account",
-    "label.group.by.cluster": "Group by cluster",
-    "label.group.by.pod": "Group by pod",
-    "label.group.by.zone": "Group by zone",
-    "label.group.optional": "Grupa (opcjonalnie)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Assigned load balancing",
-    "label.gslb.assigned.lb.more": "Assign more load balancing",
-    "label.gslb.delete": "Delete GSLB",
-    "label.gslb.details": "GSLB details",
-    "label.gslb.domain.name": "GSLB Domain Name",
-    "label.gslb.lb.details": "Load balancing details",
-    "label.gslb.lb.remove": "Remove load balancing from this GSLB",
-    "label.gslb.lb.rule": "Load balancing rule",
-    "label.gslb.service": "GSLB service",
-    "label.gslb.service.private.ip": "GSLB service Private IP",
-    "label.gslb.service.public.ip": "GSLB service Public IP",
-    "label.gslb.servicetype": "Service Type",
-    "label.guest": "Gość",
-    "label.guest.cidr": "Guest CIDR",
-    "label.guest.end.ip": "Guest end IP",
-    "label.guest.gateway": "Guest Gateway",
-    "label.guest.ip": "Guest IP Address",
-    "label.guest.ip.range": "Guest IP Range",
-    "label.guest.netmask": "Guest Netmask",
-    "label.guest.network.details": "Guest network details",
-    "label.guest.networks": "Guest networks",
-    "label.guest.start.ip": "Guest start IP",
-    "label.guest.traffic": "Guest Traffic",
-    "label.guest.traffic.vswitch.name": "Guest Traffic vSwitch Name",
-    "label.guest.traffic.vswitch.type": "Guest Traffic vSwitch Type",
-    "label.guest.type": "Rodzaj gości",
-    "label.ha.enabled": "HA Enabled",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "Advanced Options:",
-    "label.health.check.configurations.options": "Configuration Options:",
-    "label.health.check.interval.in.sec": "Health Check Interval (in sec)",
-    "label.health.check.message.desc": "Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check",
-    "label.health.check.wizard": "Health Check Wizard",
-    "label.healthy.threshold": "Healthy Threshold",
-    "label.help": "Pomoc",
-    "label.hide.ingress.rule": "Hide Ingress Rule",
-    "label.hints": "Podpowiedzi",
-    "label.home": "Home",
-    "label.host": "Host",
-    "label.host.MAC": "Host MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Host Name",
-    "label.host.tag": "Host Tag",
-    "label.host.tags": "Host Tags",
-    "label.hosts": "Hosts",
-    "label.hourly": "Hourly",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Traffic Label",
-    "label.hypervisor": "Hypervisor",
-    "label.hypervisor.capabilities": "Hypervisor capabilities",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Snapshot Reserve",
-    "label.hypervisor.type": "Hypervisor Type",
-    "label.hypervisor.version": "Hypervisor version",
-    "label.hypervisors": "Hypervisors",
-    "label.id": "ID",
-    "label.info": "Informacje",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Ingress Rule",
-    "label.initiated.by": "Initiated By",
-    "label.inside.port.profile": "Inside Port Profile",
-    "label.installWizard.addClusterIntro.subtitle": "What is a cluster?",
-    "label.installWizard.addClusterIntro.title": "Let&rsquo;s add a cluster",
-    "label.installWizard.addHostIntro.subtitle": "What is a host?",
-    "label.installWizard.addHostIntro.title": "Let&rsquo;s add a host",
-    "label.installWizard.addPodIntro.subtitle": "What is a pod?",
-    "label.installWizard.addPodIntro.title": "Let&rsquo;s add a pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "What is primary storage?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Let&rsquo;s add primary storage",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "What is secondary storage?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Let&rsquo;s add secondary storage",
-    "label.installWizard.addZone.title": "Add zone",
-    "label.installWizard.addZoneIntro.subtitle": "What is a zone?",
-    "label.installWizard.addZoneIntro.title": "Let&rsquo;s add a zone",
-    "label.installWizard.click.launch": "Click the launch button.",
-    "label.installWizard.subtitle": "This tour will aid you in setting up your CloudStack&#8482 installation",
-    "label.installWizard.title": "Hello and Welcome to CloudStack&#8482",
-    "label.instance": "Instance",
-    "label.instance.limits": "Instance Limits",
-    "label.instance.name": "Instance Name",
-    "label.instance.port": "Instance Port",
-    "label.instance.scaled.up": "Instance scaled to the requested offering",
-    "label.instances": "Instancje",
-    "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-    "label.intermediate.certificate": "Intermediate certificate {0}",
-    "label.internal.dns.1": "Internal DNS 1",
-    "label.internal.dns.2": "Internal DNS 2",
-    "label.internal.lb": "Internal LB",
-    "label.internal.lb.details": "Internal LB details",
-    "label.internal.name": "Internal name",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Interval Type",
-    "label.introduction.to.cloudstack": "Introduction to CloudStack&#8482",
-    "label.invalid.integer": "Invalid Integer",
-    "label.invalid.number": "Invalid Number",
-    "label.invitations": "Zaproszenia",
-    "label.invite": "Zaproś",
-    "label.invite.to": "Zaproś do",
-    "label.invited.accounts": "Zaproszone konta",
-    "label.ip": "IP",
-    "label.ip.address": "IP Address",
-    "label.ip.allocations": "IP Allocations",
-    "label.ip.limits": "Public IP Limits",
-    "label.ip.or.fqdn": "IP or FQDN",
-    "label.ip.range": "IP Range",
-    "label.ip.ranges": "IP Ranges",
-    "label.ipaddress": "IP Address",
-    "label.ips": "IP",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 End IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 Netmask",
-    "label.ipv4.start.ip": "IPv4 Start IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Address",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 End IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Start IP",
-    "label.is.default": "Is Default",
-    "label.is.redundant.router": "Redundant",
-    "label.is.shared": "Is Shared",
-    "label.is.system": "Is System",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO Boot",
-    "label.isolated.networks": "Isolated networks",
-    "label.isolation.method": "Isolation method",
-    "label.isolation.mode": "Isolation Mode",
-    "label.isolation.uri": "Isolation URI",
-    "label.item.listing": "Item listing",
-    "label.japanese.keyboard": "Japanese keyboard",
-    "label.keep": "Zostaw",
-    "label.keep.colon": "Keep:",
-    "label.key": "Klucz",
-    "label.keyboard.language": "Keyboard language",
-    "label.keyboard.type": "Keyboard type",
-    "label.kvm.traffic.label": "KVM traffic label",
-    "label.label": "Label",
-    "label.lang.arabic": "Arabic",
-    "label.lang.brportugese": "Brazilian Portugese",
-    "label.lang.catalan": "Catalan",
-    "label.lang.chinese": "Chinese (Simplified)",
-    "label.lang.dutch": "Dutch (Netherlands)",
-    "label.lang.english": "Angielski",
-    "label.lang.french": "Francuski",
-    "label.lang.german": "German",
-    "label.lang.hungarian": "Hungarian",
-    "label.lang.italian": "Italian",
-    "label.lang.japanese": "Japoński",
-    "label.lang.korean": "Koreański",
-    "label.lang.norwegian": "Norwegian",
-    "label.lang.polish": "Polish",
-    "label.lang.russian": "Rosyjski",
-    "label.lang.spanish": "Hiszpiański",
-    "label.last.disconnected": "Last Disconnected",
-    "label.last.name": "Nazwisko",
-    "label.lastname.lower": "lastname",
-    "label.latest.events": "Latest events",
-    "label.launch": "Rozpocznij",
-    "label.launch.vm": "Launch VM",
-    "label.launch.zone": "Launch zone",
-    "label.lb.algorithm.leastconn": "Ostatnie połączenie",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "Source",
-    "label.ldap.configuration": "LDAP Configuration",
-    "label.ldap.group.name": "LDAP Group",
-    "label.ldap.link.type": "Wpisz",
-    "label.ldap.port": "LDAP port",
-    "label.level": "Poziom",
-    "label.link.domain.to.ldap": "Link Domain to LDAP",
-    "label.linklocal.ip": "Link Local IP Address",
-    "label.load.balancer": "Load Balancer",
-    "label.load.balancer.type": "Load Balancer Type",
-    "label.load.balancing": "Load Balancing",
-    "label.load.balancing.policies": "Load balancing policies",
-    "label.loading": "Wczytywanie",
-    "label.local": "Lokalne",
-    "label.local.file": "Local file",
-    "label.local.storage": "Pamięć lokalna",
-    "label.local.storage.enabled": "Enable local storage for User VMs",
-    "label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
-    "label.login": "Zaloguj",
-    "label.logout": "Wyloguj",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Traffic Label",
-    "label.make.project.owner": "Make account project owner",
-    "label.make.redundant": "Make redundant",
-    "label.manage": "Manage",
-    "label.manage.resources": "Manage Resources",
-    "label.managed": "Managed",
-    "label.management": "Management",
-    "label.management.ips": "Management IP Addresses",
-    "label.management.server": "Management Server",
-    "label.max.cpus": "Max. CPU cores",
-    "label.max.guest.limit": "Maksymalna liczba gości",
-    "label.max.instances": "Max Instances",
-    "label.max.memory": "Max. memory (MiB)",
-    "label.max.networks": "Max. networks",
-    "label.max.primary.storage": "Max. primary (GiB)",
-    "label.max.public.ips": "Maksymalna liczba publicznych adresów IP",
-    "label.max.secondary.storage": "Max. secondary (GiB)",
-    "label.max.snapshots": "Max. snapshots",
-    "label.max.templates": "Max. templates",
-    "label.max.vms": "Max. user VMs",
-    "label.max.volumes": "Max. volumes",
-    "label.max.vpcs": "Max. VPCs",
-    "label.maximum": "Maksimum",
-    "label.may.continue": "You may now continue.",
-    "label.md5.checksum": "MD5 checksum",
-    "label.memory": "Pamięć",
-    "label.memory.allocated": "Memory Allocated",
-    "label.memory.limits": "Limit pamięci (MiB)",
-    "label.memory.mb": "Pamięć (w MB)",
-    "label.memory.total": "Memory Total",
-    "label.memory.used": "Memory Used",
-    "label.menu.accounts": "Konta",
-    "label.menu.alerts": "Alarmy",
-    "label.menu.all.accounts": "Wszystkie konta",
-    "label.menu.all.instances": "Wszystkie instancje",
-    "label.menu.community.isos": "Community ISOs",
-    "label.menu.community.templates": "Community Templates",
-    "label.menu.configuration": "Konfiguracja",
-    "label.menu.dashboard": "Dashboard",
-    "label.menu.destroyed.instances": "Destroyed Instances",
-    "label.menu.disk.offerings": "Disk Offerings",
-    "label.menu.domains": "Domeny",
-    "label.menu.events": "Events",
-    "label.menu.featured.isos": "Featured ISOs",
-    "label.menu.featured.templates": "Featured Templates",
-    "label.menu.global.settings": "Global Settings",
-    "label.menu.infrastructure": "Infrastruktura",
-    "label.menu.instances": "Instancje",
-    "label.menu.ipaddresses": "Adresy IP",
-    "label.menu.isos": "ISO",
-    "label.menu.my.accounts": "Moje konta",
-    "label.menu.my.instances": "Moje instancje",
-    "label.menu.my.isos": "Moje ISO",
-    "label.menu.my.templates": "My Templates",
-    "label.menu.network": "Sieć",
-    "label.menu.network.offerings": "Network Offerings",
-    "label.menu.physical.resources": "Physical Resources",
-    "label.menu.regions": "Regiony",
-    "label.menu.running.instances": "Running Instances",
-    "label.menu.security.groups": "Security Groups",
-    "label.menu.service.offerings": "Service Offerings",
-    "label.menu.snapshots": "Snapshots",
-    "label.menu.sshkeypair": "SSH KeyPair",
-    "label.menu.stopped.instances": "Stopped Instances",
-    "label.menu.storage": "Storage",
-    "label.menu.system": "System",
-    "label.menu.system.service.offerings": "System Offerings",
-    "label.menu.system.vms": "System VMs",
-    "label.menu.templates": "Templates",
-    "label.menu.virtual.appliances": "Virtual Appliances",
-    "label.menu.virtual.resources": "Virtual Resources",
-    "label.menu.volumes": "Volumes",
-    "label.menu.vpc.offerings": "VPC Offerings",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "Allocated",
-    "label.metrics.clusters": "Clusters",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "Użyte",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "Allocated",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "Wielkośc",
-    "label.metrics.disk.storagetype": "Wpisz",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "Użyte",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "Hosts",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "Użyte",
-    "label.metrics.name": "Nazwa",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "Scope",
-    "label.metrics.state": "Status",
-    "label.metrics.storagepool": "Storage Pool",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "Migrate instance to",
-    "label.migrate.instance.to.host": "Migrate instance to another host",
-    "label.migrate.instance.to.ps": "Migrate instance to another primary storage",
-    "label.migrate.lb.vm": "Migrate LB VM",
-    "label.migrate.router.to": "Migrate Router to",
-    "label.migrate.systemvm.to": "Migrate System VM to",
-    "label.migrate.to.host": "Migrate to host",
-    "label.migrate.to.storage": "Migrate to storage",
-    "label.migrate.volume": "Migrate Volume",
-    "label.migrate.volume.to.primary.storage": "Migrate volume to another primary storage",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instances",
-    "label.min.past.the.hr": "min past the hr",
-    "label.minimum": "Minimum",
-    "label.minute.past.hour": "minute(s) past the hour",
-    "label.minutes.past.hour": "minutes(s) past the hour",
-    "label.mode": "Tryb",
-    "label.monday": "Poniedziałek",
-    "label.monthly": "Miesięcznie",
-    "label.more.templates": "More Templates",
-    "label.move.down.row": "Jeden rząd na dół",
-    "label.move.to.bottom": "Move to bottom",
-    "label.move.to.top": "Przenieś na samą górę",
-    "label.move.up.row": "Jeden rząd do góry",
-    "label.my.account": "Moje konto",
-    "label.my.network": "Moja sieć",
-    "label.my.templates": "My templates",
-    "label.na": "N/A",
-    "label.name": "Nazwa",
-    "label.name.lower": "Nazwa",
-    "label.name.optional": "Nazwa (opcjonalnie)",
-    "label.nat.port.range": "NAT Port Range",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Netmask",
-    "label.netscaler.details": "NetScaler details",
-    "label.network": "Sieć",
-    "label.network.ACL": "Network ACL",
-    "label.network.ACL.total": "Network ACL Total",
-    "label.network.ACLs": "Network ACLs",
-    "label.network.addVM": "Add network to VM",
-    "label.network.cidr": "Network CIDR",
-    "label.network.desc": "Network Desc",
-    "label.network.details": "Network Details",
-    "label.network.device": "Network Device",
-    "label.network.device.type": "Network Device Type",
-    "label.network.domain": "Network Domain",
-    "label.network.domain.text": "Network domain",
-    "label.network.id": "ID sieci",
-    "label.network.label.display.for.blank.value": "Use default gateway",
-    "label.network.limits": "Network limits",
-    "label.network.name": "Nazwa sieci",
-    "label.network.offering": "Network Offering",
-    "label.network.offering.details": "Network offering details",
-    "label.network.offering.display.text": "Network Offering Display Text",
-    "label.network.offering.id": "Network Offering ID",
-    "label.network.offering.name": "Network Offering Name",
-    "label.network.rate": "Network Rate (Mb/s)",
-    "label.network.rate.megabytes": "Network Rate (MB/s)",
-    "label.network.read": "Network Read",
-    "label.network.service.providers": "Network Service Providers",
-    "label.network.type": "Network Type",
-    "label.network.write": "Network Write",
-    "label.networking.and.security": "Networking and security",
-    "label.networks": "Sieci",
-    "label.new": "Nowy",
-    "label.new.password": "New Password",
-    "label.current.password": "Current Password",
-    "label.new.project": "Nowy projekt",
-    "label.new.ssh.key.pair": "New SSH Key Pair",
-    "label.new.vm": "New VM",
-    "label.next": "Następny",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "Serwer NFS",
-    "label.nfs.storage": "NFS Storage",
-    "label.nic.adapter.type": "NIC adapter type",
-    "label.nicira.controller.address": "Controller Address",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP details",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "NICs",
-    "label.no": "Nie",
-    "label.no.actions": "No Available Actions",
-    "label.no.alerts": "No Recent Alerts",
-    "label.no.data": "Brak danych",
-    "label.no.errors": "No Recent Errors",
-    "label.no.grouping": "(no grouping)",
-    "label.no.isos": "No available ISOs",
-    "label.no.items": "No Available Items",
-    "label.no.security.groups": "No Available Security Groups",
-    "label.no.thanks": "Nie dziękuję",
-    "label.none": "Brak",
-    "label.not.found": "Not Found",
-    "label.notifications": "Przypomnienia",
-    "label.num.cpu.cores": "# of CPU Cores",
-    "label.number.of.clusters": "Number of Clusters",
-    "label.number.of.cpu.sockets": "The Number of CPU Sockets",
-    "label.number.of.hosts": "Liczba hostów",
-    "label.number.of.pods": "Number of Pods",
-    "label.number.of.system.vms": "Number of System VMs",
-    "label.number.of.virtual.routers": "Number of Virtual Routers",
-    "label.number.of.zones": "Number of Zones",
-    "label.numretries": "Number of Retries",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "of month",
-    "label.offer.ha": "Offer HA",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controllers",
-    "label.operator": "Operator",
-    "label.optional": "Optional",
-    "label.order": "Zadanie",
-    "label.os.preference": "OS Preference",
-    "label.os.type": "OS Type",
-    "label.other": "Other",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Action",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Hasło",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Nazwa użytkownika",
-    "label.override.guest.traffic": "Override Guest-Traffic",
-    "label.override.public.traffic": "Override Public-Traffic",
-    "label.ovm.traffic.label": "OVM traffic label",
-    "label.ovm3.cluster": "Native Clustering",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Owned Public IP Addresses",
-    "label.owner.account": "Owner Account",
-    "label.owner.domain": "Owner Domain",
-    "label.palo.alto.details": "Palo Alto details",
-    "label.parent.domain": "Parent Domain",
-    "label.passive": "Passive",
-    "label.password": "Hasło",
-    "label.password.enabled": "Password Enabled",
-    "label.password.lower": "password",
-    "label.password.reset.confirm": "Password has been reset to ",
-    "label.path": "Ścieżka",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Persistent ",
-    "label.physical.network": "Physical Network",
-    "label.physical.network.ID": "Physical network ID",
-    "label.physical.network.name": "Physical network name",
-    "label.ping.path": "Ping Path",
-    "label.planner.mode": "Planner mode",
-    "label.please.complete.the.following.fields": "Please complete the following fields",
-    "label.please.specify.netscaler.info": "Please specify Netscaler info",
-    "label.please.wait": "Proszę czekać",
-    "label.plugin.details": "Szczegóły wtyczki",
-    "label.plugins": "Wtyczki",
-    "label.pod": "Pod",
-    "label.pod.dedicated": "Pod Dedicated",
-    "label.pod.name": "Pod name",
-    "label.pods": "Pods",
-    "label.polling.interval.sec": "Polling Interval (in sec)",
-    "label.port": "Port",
-    "label.port.forwarding": "Port Forwarding",
-    "label.port.forwarding.policies": "Port forwarding policies",
-    "label.port.range": "Port Range",
-    "label.portable.ip": "Portable IP",
-    "label.portable.ip.range.details": "Portable IP Range details",
-    "label.portable.ip.ranges": "Portable IP Ranges",
-    "label.portable.ips": "Portable IPs",
-    "label.powerstate": "Power State",
-    "label.prev": "Prev",
-    "label.previous": "Wstecz",
-    "label.primary.allocated": "Primary Storage Allocated",
-    "label.primary.network": "Primary Network",
-    "label.primary.storage": "Primary Storage",
-    "label.primary.storage.count": "Primary Storage Pools",
-    "label.primary.storage.limits": "Primary Storage limits (GiB)",
-    "label.primary.used": "Primary Storage Used",
-    "label.private.Gateway": "Private Gateway",
-    "label.private.interface": "Private Interface",
-    "label.private.ip": "Private IP Address",
-    "label.private.ip.range": "Private IP Range",
-    "label.private.ips": "Private IP Addresses",
-    "label.private.key": "Private Key",
-    "label.private.network": "Sieć prywatna",
-    "label.private.port": "Private Port",
-    "label.private.zone": "Private Zone",
-    "label.privatekey": "PKCS#8 Private Key",
-    "label.profile": "Profile",
-    "label.project": "Projekt",
-    "label.project.dashboard": "Project dashboard",
-    "label.project.id": "Nazwa ID projektu",
-    "label.project.invite": "Zaproś do projektu",
-    "label.project.name": "Nazwa projektu",
-    "label.project.view": "Project View",
-    "label.projects": "Projekty",
-    "label.protocol": "Protokół",
-    "label.protocol.number": "Protocol Number",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Provider",
-    "label.providers": "Dostawcy",
-    "label.public": "Pobliczny",
-    "label.public.interface": "Public Interface",
-    "label.public.ip": "Publiczny adres IP",
-    "label.public.ips": "Publiczne adresy IP",
-    "label.public.key": "Public Key",
-    "label.public.lb": "Public LB",
-    "label.public.load.balancer.provider": "Public Load Balancer Provider",
-    "label.public.network": "Sieć publiczna",
-    "label.public.port": "Publiczny port",
-    "label.public.traffic": "Public traffic",
-    "label.public.traffic.vswitch.name": "Public Traffic vSwitch Name",
-    "label.public.traffic.vswitch.type": "Public Traffic vSwitch Type",
-    "label.public.zone": "Public Zone",
-    "label.purpose": "Purpose",
-    "label.qos.type": "QoS Type",
-    "label.quickview": "Quickview",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Time (in sec)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "Data",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "Wszystkie konta",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "Status",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx user",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "Uruchom ponownie",
-    "label.recent.errors": "Recent Errors",
-    "label.recover.vm": "Recover VM",
-    "label.redundant.router": "Redundant Router",
-    "label.redundant.router.capability": "Redundant router capability",
-    "label.redundant.state": "Redundant state",
-    "label.redundant.vpc": "Redundant VPC",
-    "label.refresh": "Odśwież",
-    "label.refresh.blades": "Refresh Blades",
-    "label.region": "Region",
-    "label.region.details": "Region details",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "Reinstall VM",
-    "label.related": "Related",
-    "label.release.account": "Release from Account",
-    "label.release.account.lowercase": "Release from account",
-    "label.release.dedicated.cluster": "Release Dedicated Cluster",
-    "label.release.dedicated.host": "Release Dedicated Host",
-    "label.release.dedicated.pod": "Release Dedicated Pod",
-    "label.release.dedicated.vlan.range": "Release dedicated VLAN range",
-    "label.release.dedicated.zone": "Release Dedicated Zone",
-    "label.remind.later": "Przypomnij później",
-    "label.remove.ACL": "Remove ACL",
-    "label.remove.egress.rule": "Remove egress rule",
-    "label.remove.from.load.balancer": "Removing instance from load balancer",
-    "label.remove.ingress.rule": "Remove ingress rule",
-    "label.remove.ip.range": "Remove IP range",
-    "label.remove.ldap": "Remove LDAP",
-    "label.remove.network.offering": "Remove network offering",
-    "label.remove.pf": "Remove port forwarding rule",
-    "label.remove.project.account": "Remove account from project",
-    "label.remove.region": "Remove Region",
-    "label.remove.rule": "Usuń regułę",
-    "label.remove.ssh.key.pair": "Remove SSH Key Pair",
-    "label.remove.static.nat.rule": "Remove static NAT rule",
-    "label.remove.static.route": "Remove static route",
-    "label.remove.this.physical.network": "Remove this physical network",
-    "label.remove.tier": "Remove tier",
-    "label.remove.vm.from.lb": "Remove VM from load balancer rule",
-    "label.remove.vm.load.balancer": "Remove VM from load balancer",
-    "label.remove.vmware.datacenter": "Remove VMware datacenter",
-    "label.remove.vpc": "Usuń VPC",
-    "label.remove.vpc.offering": "Remove VPC offering",
-    "label.removing": "Usuwanie",
-    "label.removing.user": "Usuń użytkownika",
-    "label.reource.id": "Resource ID",
-    "label.replace.acl": "Replace ACL",
-    "label.replace.acl.list": "Replace ACL List",
-    "label.required": "Wymagane",
-    "label.requires.upgrade": "Requires Upgrade",
-    "label.reserved.ip.range": "Reserved IP Range",
-    "label.reserved.system.gateway": "Reserved system gateway",
-    "label.reserved.system.ip": "Reserved System IP",
-    "label.reserved.system.netmask": "Reserved system netmask",
-    "label.reset.VPN.connection": "Reset VPN connection",
-    "label.reset.ssh.key.pair": "Reset SSH Key Pair",
-    "label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
-    "label.resetVM": "Reset VM",
-    "label.resize.new.offering.id": "New Offering",
-    "label.resize.new.size": "New Size (GB)",
-    "label.resize.shrink.ok": "Shrink OK",
-    "label.resource": "Zasób",
-    "label.resource.limit.exceeded": "Resource Limit Exceeded",
-    "label.resource.limits": "Limit zasobów",
-    "label.resource.name": "Resource Name",
-    "label.resource.state": "Resource state",
-    "label.resources": "Zasoby",
-    "label.response.timeout.in.sec": "Response Timeout (in sec)",
-    "label.restart.network": "Restart network",
-    "label.restart.required": "Wymagany restart",
-    "label.restart.vpc": "Restart VPC",
-    "label.restore": "Restore",
-    "label.retry.interval": "Retry Interval",
-    "label.review": "Review",
-    "label.revoke.project.invite": "Revoke invitation",
-    "label.role": "Role",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Root certificate",
-    "label.root.disk.controller": "Root disk controller",
-    "label.root.disk.offering": "Root Disk Offering",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Scaled Up",
-    "label.routing": "Routing",
-    "label.routing.host": "Routing Host",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Rule Number",
-    "label.rules": "Zasady",
-    "label.running.vms": "Running VMs",
-    "label.s3.access_key": "Access Key",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Connection Timeout",
-    "label.s3.endpoint": "Endpoint",
-    "label.s3.max_error_retry": "Max Error Retry",
-    "label.s3.nfs.path": "S3 NFS Path",
-    "label.s3.nfs.server": "S3 NFS Server",
-    "label.s3.secret_key": "Secret Key",
-    "label.s3.socket_timeout": "Socket Timeout",
-    "label.s3.use_https": "Use HTTPS",
-    "label.saml.enable": "Authorize SAML SSO",
-    "label.saml.entity": "Identity Provider",
-    "label.saturday": "Sobota",
-    "label.save": "Zapisz",
-    "label.save.and.continue": "Zapisz i kontynuuj",
-    "label.save.changes": "Save changes",
-    "label.saving.processing": "Zapisywanie....",
-    "label.scale.up.policy": "SCALE UP POLICY",
-    "label.scaledown.policy": "ScaleDown Policy",
-    "label.scaleup.policy": "ScaleUp Policy",
-    "label.scope": "Scope",
-    "label.search": "Szukaj",
-    "label.secondary.ips": "Secondary IPs",
-    "label.secondary.isolated.vlan.id": "Secondary Isolated VLAN ID",
-    "label.secondary.staging.store": "Secondary Staging Store",
-    "label.secondary.staging.store.details": "Secondary Staging Store details",
-    "label.secondary.storage": "Secondary Storage",
-    "label.secondary.storage.count": "Secondary Storage Pools",
-    "label.secondary.storage.details": "Secondary storage details",
-    "label.secondary.storage.limits": "Secondary Storage limits (GiB)",
-    "label.secondary.storage.vm": "Secondary storage VM",
-    "label.secondary.used": "Secondary Storage Used",
-    "label.secret.key": "Secret Key",
-    "label.security.group": "Security Group",
-    "label.security.group.name": "Security Group Name",
-    "label.security.groups": "Security Groups",
-    "label.security.groups.enabled": "Security Groups Enabled",
-    "label.select": "Wybierz",
-    "label.select-view": "Select view",
-    "label.select.a.template": "Select a template",
-    "label.select.a.zone": "Select a zone",
-    "label.select.instance": "Wybierz instancję",
-    "label.select.instance.to.attach.volume.to": "Select instance to attach volume to",
-    "label.select.iso.or.template": "Select ISO or template",
-    "label.select.offering": "Select offering",
-    "label.select.project": "Wybierz projekt",
-    "label.select.region": "Select region",
-    "label.select.template": "Select Template",
-    "label.select.tier": "Select Tier",
-    "label.select.vm.for.static.nat": "Select VM for static NAT",
-    "label.sent": "Wysłano",
-    "label.server": "Serwer",
-    "label.service.capabilities": "Service Capabilities",
-    "label.service.offering": "Service Offering",
-    "label.service.offering.details": "Service offering details",
-    "label.service.state": "Service State",
-    "label.services": "Services",
-    "label.session.expired": "Session Expired",
-    "label.set.default.NIC": "Set default NIC",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Set up zone type",
-    "label.settings": "Settings",
-    "label.setup": "Konfiguracja",
-    "label.setup.network": "Set up Network",
-    "label.setup.zone": "Set up Zone",
-    "label.shared": "Shared",
-    "label.show.advanced.settings": "Show advanced settings",
-    "label.show.ingress.rule": "Show Ingress Rule",
-    "label.shutdown.provider": "Shutdown provider",
-    "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Wielkośc",
-    "label.skip.guide": "I have used CloudStack before, skip this guide",
-    "label.smb.domain": "SMB Domain",
-    "label.smb.password": "SMB Password",
-    "label.smb.username": "SMB Username",
-    "label.snapshot": "Snapshot",
-    "label.snapshot.limits": "Snapshot Limits",
-    "label.snapshot.name": "Snapshot Name",
-    "label.snapshot.s": "Snapshots",
-    "label.snapshot.schedule": "Set up Recurring Snapshot",
-    "label.snapshots": "Snapshots",
-    "label.sockets": "CPU Sockets",
-    "label.source.ip.address": "Source IP Address",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT Supported",
-    "label.source.port": "Source Port",
-    "label.specify.IP.ranges": "Wyszczególnij zasięg adresów IP",
-    "label.specify.vlan": "Specify VLAN",
-    "label.specify.vxlan": "Specify VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX details",
-    "label.ssh.key.pair": "SSH Key Pair",
-    "label.ssh.key.pair.details": "SSH Key Pair Details",
-    "label.ssh.key.pairs": "SSH Key Pairs",
-    "label.standard.us.keyboard": "Standard (US) keyboard",
-    "label.start.IP": "Start IP",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "Start Port",
-    "label.start.reserved.system.IP": "Start Reserved system IP",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "Start VXLAN",
-    "label.state": "Status",
-    "label.static.nat": "Static NAT",
-    "label.static.nat.enabled": "Static NAT Enabled",
-    "label.static.nat.to": "Static NAT to",
-    "label.static.nat.vm.details": "Static NAT VM Details",
-    "label.static.routes": "Static Routes",
-    "label.statistics": "Statystyki",
-    "label.status": "Status",
-    "label.step.1": "Krok 1",
-    "label.step.1.title": "Step 1: <strong>Select a Template</strong>",
-    "label.step.2": "Krok 2",
-    "label.step.2.title": "Step 2: <strong>Service Offering</strong>",
-    "label.step.3": "Krok 3",
-    "label.step.3.title": "Step 3: <strong id=\"step3_label\">Select a Disk Offering</strong>",
-    "label.step.4": "Krok 4",
-    "label.step.4.title": "Step 4: <strong>Network</strong>",
-    "label.step.5": "Krok 5",
-    "label.step.5.title": "Step 5: <strong>Review</strong>",
-    "label.stickiness": "Stickiness",
-    "label.stickiness.method": "Stickiness method",
-    "label.sticky.cookie-name": "Cookie name",
-    "label.sticky.domain": "Domena",
-    "label.sticky.expire": "Wygasa",
-    "label.sticky.holdtime": "Hold time",
-    "label.sticky.indirect": "Indirect",
-    "label.sticky.length": "Długość",
-    "label.sticky.mode": "Tryb",
-    "label.sticky.name": "Sticky Name",
-    "label.sticky.nocache": "No cache",
-    "label.sticky.postonly": "Post only",
-    "label.sticky.prefix": "Prefiks",
-    "label.sticky.request-learn": "Request learn",
-    "label.sticky.tablesize": "Table size",
-    "label.stop": "Stop",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "Stopped VMs",
-    "label.storage": "Storage",
-    "label.storage.pool": "Storage Pool",
-    "label.storage.tags": "Storage Tags",
-    "label.storage.traffic": "Storage Traffic",
-    "label.storage.type": "Storage Type",
-    "label.subdomain.access": "Subdomain Access",
-    "label.submit": "Submit",
-    "label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Succeeded",
-    "label.sunday": "Niedziela",
-    "label.super.cidr.for.guest.networks": "Super CIDR for Guest Networks",
-    "label.supported.services": "Supported Services",
-    "label.supported.source.NAT.type": "Supported Source NAT type",
-    "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Zawieś projekt",
-    "label.switch.type": "Switch Type",
-    "label.system.capacity": "System Capacity",
-    "label.system.offering": "System Offering",
-    "label.system.offering.for.router": "System Offering for Router",
-    "label.system.service.offering": "System Service Offering",
-    "label.system.service.offering.details": "System service offering details",
-    "label.system.vm": "System VM",
-    "label.system.vm.details": "System VM details",
-    "label.system.vm.scaled.up": "System VM Scaled Up",
-    "label.system.vm.type": "System VM Type",
-    "label.system.vms": "System VMs",
-    "label.system.wide.capacity": "System-wide capacity",
-    "label.tag.key": "Tag Key",
-    "label.tag.value": "Tag Value",
-    "label.tagged": "Otagowany",
-    "label.tags": "Tagi",
-    "label.target.iqn": "Target IQN",
-    "label.task.completed": "Zadania ukończone",
-    "label.template": "Template",
-    "label.template.limits": "Template Limits",
-    "label.tftp.root.directory": "Tftp root directory",
-    "label.theme.default": "Default Theme",
-    "label.theme.grey": "Custom - Grey",
-    "label.theme.lightblue": "Custom - Light Blue",
-    "label.threshold": "Threshold",
-    "label.thursday": "Thursday",
-    "label.tier": "Tier",
-    "label.tier.details": "Tier details",
-    "label.time": "Czas",
-    "label.time.colon": "Time:",
-    "label.time.zone": "Strefa czasowa",
-    "label.timeout": "Timeout",
-    "label.timeout.in.second ": " Timeout (seconds)",
-    "label.timezone": "Strefa czasowa",
-    "label.timezone.colon": "Timezone:",
-    "label.token": "Token",
-    "label.total.CPU": "Total CPU",
-    "label.total.cpu": "Total CPU",
-    "label.total.hosts": "Total Hosts",
-    "label.total.memory": "Total Memory",
-    "label.total.of.ip": "Total of IP Addresses",
-    "label.total.of.vm": "Total of VMs",
-    "label.total.storage": "Total Storage",
-    "label.total.virtual.routers": "Total of Virtual Routers",
-    "label.total.virtual.routers.upgrade": "Total of Virtual Routers that require upgrade",
-    "label.total.vms": "Total VMs",
-    "label.traffic.label": "Traffic label",
-    "label.traffic.type": "Traffic Type",
-    "label.traffic.types": "Traffic Types",
-    "label.tuesday": "Tuesday",
-    "label.type": "Wpisz",
-    "label.type.id": "Wpisz ID",
-    "label.type.lower": "type",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK keyboard",
-    "label.unavailable": "Niedostępny",
-    "label.unhealthy.threshold": "Unhealthy Threshold",
-    "label.unlimited": "Nieograniczony",
-    "label.untagged": "Nieotagowany",
-    "label.update.project.resources": "Update project resources",
-    "label.update.ssl": " SSL Certificate",
-    "label.update.ssl.cert": " SSL Certificate",
-    "label.updating": "Aktualizowanie",
-    "label.upgrade.required": "Upgrade is required",
-    "label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
-    "label.upload": "Upload",
-    "label.upload.from.local": "Upload from Local",
-    "label.upload.template.from.local": "Upload Template from Local",
-    "label.upload.volume": "Upload volume",
-    "label.upload.volume.from.local": "Upload Volume from Local",
-    "label.upload.volume.from.url": "Upload volume from URL",
-    "label.url": "URL",
-    "label.usage.interface": "Usage Interface",
-    "label.usage.sanity.result": "Usage Sanity Result",
-    "label.usage.server": "Usage Server",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "Use VM IP:",
-    "label.use.vm.ips": "Use VM IPs",
-    "label.used": "Użyte",
-    "label.user": "Użytkowni",
-    "label.user.data": "User Data",
-    "label.user.details": "User details",
-    "label.user.vm": "User VM",
-    "label.username": "Nazwa użytkownika",
-    "label.username.lower": "username",
-    "label.users": "Użytkownicy",
-    "label.vSwitch.type": "vSwitch Type",
-    "label.value": "Value",
-    "label.vcdcname": "vCenter DC name",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter Cluster",
-    "label.vcenter.datacenter": "vCenter Datacenter",
-    "label.vcenter.datastore": "vCenter Datastore",
-    "label.vcenter.host": "vCenter Host",
-    "label.vcenter.password": "vCenter Password",
-    "label.vcenter.username": "vCenter Username",
-    "label.vcipaddress": "vCenter IP Address",
-    "label.version": "Wersja",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Max resolution",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Remaining capacity",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Zobacz",
-    "label.view.all": "Zobacz wszystko",
-    "label.view.console": "View console",
-    "label.view.more": "View more",
-    "label.view.secondary.ips": "View secondary IPs",
-    "label.viewing": "Viewing",
-    "label.virtual.appliance": "Virtual Appliance",
-    "label.virtual.appliance.details": "Virtual applicance details",
-    "label.virtual.appliances": "Virtual Appliances",
-    "label.virtual.machine": "Virtual Machine",
-    "label.virtual.machines": "Virtual Machines",
-    "label.virtual.network": "Virtual Network",
-    "label.virtual.networking": "Virtual Networking",
-    "label.virtual.router": "Virtual Router",
-    "label.virtual.routers": "Virtual Routers",
-    "label.virtual.routers.group.account": "Virtual Routers group by account",
-    "label.virtual.routers.group.cluster": "Virtual Routers group by cluster",
-    "label.virtual.routers.group.pod": "Virtual Routers group by pod",
-    "label.virtual.routers.group.zone": "Virtual Routers group by zone",
-    "label.vlan": "VLAN",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI Range",
-    "label.vlan.range.details": "VLAN Range details",
-    "label.vlan.ranges": "VLAN Range(s)",
-    "label.vlan.vni.range": "VLAN/VNI Range",
-    "label.vlan.vni.ranges": "VLAN/VNI Range(s)",
-    "label.vm.add": "Dodaj instancję",
-    "label.vm.destroy": "Zniszcz",
-    "label.vm.display.name": "VM display name",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP Address",
-    "label.vm.name": "Nazwa VM",
-    "label.vm.password": "Password of the VM is",
-    "label.vm.reboot": "Uruchom ponownie",
-    "label.vm.start": "Rozpocznij",
-    "label.vm.state": "VM state",
-    "label.vm.stop": "Stop",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "VM Snapshots",
-    "label.vmsnapshot.current": "isCurrent",
-    "label.vmsnapshot.memory": "Snapshot memory",
-    "label.vmsnapshot.parentname": "Parent",
-    "label.vmsnapshot.type": "Wpisz",
-    "label.vmware.datacenter.id": "VMware datacenter ID",
-    "label.vmware.datacenter.name": "VMware datacenter Name",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "VMware traffic label",
-    "label.vnet": "VLAN",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC Devices",
-    "label.volatile": "Volatile",
-    "label.volgroup": "Volume Group",
-    "label.volume": "Volume",
-    "label.volume.details": "Volume details",
-    "label.volume.limits": "Volume Limits",
-    "label.volume.migrated": "Volume migrated",
-    "label.volume.name": "Volume Name",
-    "label.volumes": "Volumes",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Distributed VPC Router",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC Offering",
-    "label.vpc.offering.details": "VPC offering details",
-    "label.vpc.router.details": "VPC Router Details",
-    "label.vpc.supportsregionlevelvpc": "Supports Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtual Router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN Customer Gateway",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "Control VLAN ID",
-    "label.vsmpktvlanid": "Packet VLAN ID",
-    "label.vsmstoragevlanid": "Storage VLAN ID",
-    "label.vsphere.managed": "vSphere Managed",
-    "label.vswitch.name": "vSwitch Name",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN Range",
-    "label.waiting": "Czekanie",
-    "label.warn": "Ostrzeżenie",
-    "label.warn.upper": "WARN",
-    "label.warning": "Warning",
-    "label.wednesday": "Środa",
-    "label.weekly": "Tygodniowo",
-    "label.welcome": "Witaj",
-    "label.welcome.cloud.console": "Welcome to Management Console",
-    "label.what.is.cloudstack": "Czym jest CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Original XS Version is 6.1+",
-    "label.xenserver.traffic.label": "XenServer traffic label",
-    "label.yes": "Tak",
-    "label.zone": "Zone",
-    "label.zone.dedicated": "Zone Dedicated",
-    "label.zone.details": "Zone details",
-    "label.zone.id": "Zone ID",
-    "label.zone.lower": "zone",
-    "label.zone.name": "Zone Name",
-    "label.zone.step.1.title": "Step 1: <strong>Select a Network</strong>",
-    "label.zone.step.2.title": "Step 2: <strong>Add a Zone</strong>",
-    "label.zone.step.3.title": "Step 3: <strong>Add a Pod</strong>",
-    "label.zone.step.4.title": "Step 4: <strong>Add an IP range</strong>",
-    "label.zone.type": "Zone Type",
-    "label.zone.wide": "Zone-Wide",
-    "label.zoneWizard.trafficType.guest": "Guest: Traffic between end-user virtual machines",
-    "label.zoneWizard.trafficType.management": "Management: Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs",
-    "label.zoneWizard.trafficType.public": "Public: Traffic between the internet and virtual machines in the cloud.",
-    "label.zoneWizard.trafficType.storage": "Storage: Traffic between primary and secondary storage servers, such as VM templates and snapshots",
-    "label.zones": "Zones",
-    "managed.state": "Managed State",
-    "message.XSTools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
-    "message.Zone.creation.complete": "Zone creation complete",
-    "message.acquire.ip.nic": "Please confirm that you would like to acquire a new secondary IP for this NIC.<br/>NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine.",
-    "message.acquire.new.ip": "Please confirm that you would like to acquire a new IP for this network.",
-    "message.acquire.new.ip.vpc": "Please confirm that you would like to acquire a new IP for this VPC.",
-    "message.acquire.public.ip": "Please select a zone from which you want to acquire your new IP from.",
-    "message.action.cancel.maintenance": "Your host has been successfully canceled for maintenance. This process can take up to several minutes.",
-    "message.action.cancel.maintenance.mode": "Please confirm that you want to cancel this maintenance.",
-    "message.action.change.service.warning.for.instance": "Your instance must be stopped before attempting to change its current service offering.",
-    "message.action.change.service.warning.for.router": "Your router must be stopped before attempting to change its current service offering.",
-    "message.action.delete.ISO": "Please confirm that you want to delete this ISO.",
-    "message.action.delete.ISO.for.all.zones": "The ISO is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.cluster": "Please confirm that you want to delete this cluster.",
-    "message.action.delete.disk.offering": "Please confirm that you want to delete this disk offering.",
-    "message.action.delete.domain": "Please confirm that you want to delete this domain.",
-    "message.action.delete.external.firewall": "Please confirm that you would like to remove this external firewall. Warning: If you are planning to add back the same external firewall, you must reset usage data on the device.",
-    "message.action.delete.external.load.balancer": "Please confirm that you would like to remove this external load balancer. Warning: If you are planning to add back the same external load balancer, you must reset usage data on the device.",
-    "message.action.delete.ingress.rule": "Please confirm that you want to delete this ingress rule.",
-    "message.action.delete.network": "Please confirm that you want to delete this network.",
-    "message.action.delete.nexusVswitch": "Potwierdź, że chcesz usunąć: nexus 1000v",
-    "message.action.delete.nic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
-    "message.action.delete.physical.network": "Please confirm that you want to delete this physical network",
-    "message.action.delete.pod": "Please confirm that you want to delete this pod.",
-    "message.action.delete.primary.storage": "Please confirm that you want to delete this primary storage.",
-    "message.action.delete.secondary.storage": "Please confirm that you want to delete this secondary storage.",
-    "message.action.delete.security.group": "Please confirm that you want to delete this security group.",
-    "message.action.delete.service.offering": "Please confirm that you want to delete this service offering.",
-    "message.action.delete.snapshot": "Please confirm that you want to delete this snapshot.",
-    "message.action.delete.system.service.offering": "Please confirm that you want to delete this system service offering.",
-    "message.action.delete.template": "Please confirm that you want to delete this template.",
-    "message.action.delete.template.for.all.zones": "The template is used by all zones. Please confirm that you want to delete it from all zones.",
-    "message.action.delete.volume": "Please confirm that you want to delete this volume.",
-    "message.action.delete.zone": "Please confirm that you want to delete this zone.",
-    "message.action.destroy.instance": "Please confirm that you want to destroy this instance.",
-    "message.action.destroy.systemvm": "Please confirm that you want to destroy this System VM.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Please confirm that you want to disable this cluster.",
-    "message.action.disable.nexusVswitch": "Please confirm that you want to disable this nexus 1000v",
-    "message.action.disable.physical.network": "Please confirm that you want to disable this physical network.",
-    "message.action.disable.pod": "Please confirm that you want to disable this pod.",
-    "message.action.disable.static.NAT": "Please confirm that you want to disable static NAT.",
-    "message.action.disable.zone": "Please confirm that you want to disable this zone.",
-    "message.action.download.iso": "Potwierdź, że chcesz pobrać ten obraz ISO.",
-    "message.action.download.template": "Please confirm that you want to download this template.",
-    "message.action.downloading.template": "Downloading template.",
-    "message.action.enable.cluster": "Please confirm that you want to enable this cluster.",
-    "message.action.enable.maintenance": "Your host has been successfully prepared for maintenance.  This process can take up to several minutes or longer depending on how many VMs are currently on this host.",
-    "message.action.enable.nexusVswitch": "Please confirm that you want to enable this nexus 1000v",
-    "message.action.enable.physical.network": "Please confirm that you want to enable this physical network.",
-    "message.action.enable.pod": "Please confirm that you want to enable this pod.",
-    "message.action.enable.zone": "Please confirm that you want to enable this zone.",
-    "message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
-    "message.action.force.reconnect": "Your host has been successfully forced to reconnect.  This process can take up to several minutes.",
-    "message.action.host.enable.maintenance.mode": "Enabling maintenance mode will cause a live migration of all running instances on this host to any available host.",
-    "message.action.instance.reset.password": "Please confirm that you want to change the ROOT password for this virtual machine.",
-    "message.action.manage.cluster": "Please confirm that you want to manage the cluster.",
-    "message.action.primarystorage.enable.maintenance.mode": "Warning: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped.  Do you want to continue?",
-    "message.action.reboot.instance": "Please confirm that you want to reboot this instance.",
-    "message.action.reboot.router": "All services provided by this virtual router will be interrupted. Please confirm that you want to reboot this router.",
-    "message.action.reboot.systemvm": "Please confirm that you want to reboot this system VM.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Please confirm that you want to release this IP.",
-    "message.action.remove.host": "Please confirm that you want to remove this host.",
-    "message.action.reset.password.off": "Your instance currently does not support this feature.",
-    "message.action.reset.password.warning": "Your instance must be stopped before attempting to change its current password.",
-    "message.action.restore.instance": "Please confirm that you want to restore this instance.",
-    "message.action.revert.snapshot": "Please confirm that you want to revert the owning volume to this snapshot.",
-    "message.action.start.instance": "Please confirm that you want to start this instance.",
-    "message.action.start.router": "Please confirm that you want to start this router.",
-    "message.action.start.systemvm": "Please confirm that you want to start this system VM.",
-    "message.action.stop.instance": "Please confirm that you want to stop this instance.",
-    "message.action.stop.router": "All services provided by this virtual router will be interrupted. Please confirm that you want to stop this router.",
-    "message.action.stop.systemvm": "Please confirm that you want to stop this system VM.",
-    "message.action.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
-    "message.action.snapshot.fromsnapshot":"Please confirm that you want to take a snapshot of this VM snapshot.",
-    "message.action.unmanage.cluster": "Please confirm that you want to unmanage the cluster.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Please confirm that you want to delete this VM snapshot.",
-    "message.action.vmsnapshot.revert": "Revert VM snapshot",
-    "message.activate.project": "Czy na pewno chcesz aktywować ten projekt?",
-    "message.add.VPN.gateway": "Please confirm that you want to add a VPN Gateway",
-    "message.add.cluster": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Please specify the following parameters to add a new disk offering",
-    "message.add.domain": "Please specify the subdomain you want to create under this domain",
-    "message.add.firewall": "Add a firewall to zone",
-    "message.add.guest.network": "Please confirm that you would like to add a guest network",
-    "message.add.host": "Please specify the following parameters to add a new host",
-    "message.add.ip.range": "Add an IP range to public network in zone",
-    "message.add.ip.range.direct.network": "Add an IP range to direct network <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Add an IP range to pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Add a load balancer to zone",
-    "message.add.load.balancer.under.ip": "The load balancer rule has been added under IP:",
-    "message.add.network": "Add a new network for zone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Please specify the information to add a new gateway to this VPC.",
-    "message.add.pod": "Add a new pod for zone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack's internal management traffic. The reserved IP range must be unique for each zone in the cloud.",
-    "message.add.primary": "Please specify the following parameters to add a new primary storage",
-    "message.add.primary.storage": "Add a new Primary Storage for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Please specify the required information to add a new region.",
-    "message.add.secondary.storage": "Add a new storage for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Please fill in the following data to add a new compute offering.",
-    "message.add.system.service.offering": "Please fill in the following data to add a new system service offering.",
-    "message.add.template": "Please enter the following data to create your new template",
-    "message.add.volume": "Please fill in the following data to add a new volume.",
-    "message.added.vpc.offering": "Added VPC offering",
-    "message.adding.Netscaler.device": "Adding Netscaler device",
-    "message.adding.Netscaler.provider": "Adding Netscaler provider",
-    "message.adding.host": "Adding host",
-    "message.additional.networks.desc": "Please select additional network(s) that your virtual instance will be connected to.",
-    "message.admin.guide.read": "For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?,",
-    "message.advanced.mode.desc": "Choose this network model if you wish to enable VLAN support.  This network model provides the most flexibility in allowing administrators to provide custom network offerings such as providing firewall, vpn, or load balancer support as well as enabling direct vs virtual networking.",
-    "message.advanced.security.group": "Choose this if you wish to use security groups to provide guest VM isolation.",
-    "message.advanced.virtual": "Choose this if you wish to use zone-wide VLANs to provide guest VM isolation.",
-    "message.after.enable.s3": "S3-backed Secondary Storage configured. Note: When you leave this page, you will not be able to re-configure S3 again.",
-    "message.after.enable.swift": "Swift configured. Note: When you leave this page, you will not be able to re-configure Swift again.",
-    "message.alert.state.detected": "Alert state detected",
-    "message.allow.vpn.access": "Please enter a username and password of the user that you want to allow VPN access.",
-    "message.apply.snapshot.policy": "You have successfully updated your current snapshot policy.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Please confirm that you want to attach the ISO to this virtual instance.",
-    "message.attach.volume": "Please fill in the following data to attach a new volume. If you are attaching a disk volume to a Windows based virtual machine, you will need to reboot the instance to see the attached disk.",
-    "message.basic.mode.desc": "Choose this network model if you do <b>*<u>not</u>*</b> want to enable any VLAN support.  All virtual instances created under this network model will be assigned an IP directly from the network and security groups are used to provide security and segregation.",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "Please confirm that you wish to change the service offering of this virtual instance.",
-    "message.change.password": "Please change your password.",
-    "message.cluster.dedicated": "Cluster Dedicated",
-    "message.cluster.dedication.released": "Cluster dedication released",
-    "message.configure.all.traffic.types": "You have multiple physical networks; please configure labels for each traffic type by clicking on the Edit button.",
-    "message.configure.firewall.rules.allow.traffic": "Configure the rules to allow Traffic",
-    "message.configure.firewall.rules.block.traffic": "Configure the rules to block Traffic",
-    "message.configure.ldap": "Please confirm you would like to configure LDAP.",
-    "message.configuring.guest.traffic": "Configuring guest traffic",
-    "message.configuring.physical.networks": "Configuring physical networks",
-    "message.configuring.public.traffic": "Configuring public traffic",
-    "message.configuring.storage.traffic": "Configuring storage traffic",
-    "message.confirm.action.force.reconnect": "Please confirm that you want to force reconnect this host.",
-    "message.confirm.add.vnmc.provider": "Please confirm you would like to add the VNMC provider.",
-    "message.confirm.archive.alert": "Please confirm that you want to archive this alert.",
-    "message.confirm.archive.event": "Please confirm that you want to archive this event.",
-    "message.confirm.archive.selected.alerts": "Please confirm you would like to archive the selected alerts",
-    "message.confirm.archive.selected.events": "Please confirm you would like to archive the selected events",
-    "message.confirm.attach.disk": "Are you sure you want to attach disk?",
-    "message.confirm.create.volume": "Are you sure you want to create volume?",
-    "message.confirm.current.guest.CIDR.unchanged": "Do you want to keep the current guest network CIDR unchanged?",
-    "message.confirm.dedicate.cluster.domain.account": "Do you really want to dedicate this cluster to a domain/account? ",
-    "message.confirm.dedicate.host.domain.account": "Do you really want to dedicate this host to a domain/account? ",
-    "message.confirm.dedicate.pod.domain.account": "Do you really want to dedicate this pod to a domain/account? ",
-    "message.confirm.dedicate.zone": "Do you really want to dedicate this zone to a domain/account?",
-    "message.confirm.delete.BigSwitchBcf": "Please confirm that you would like to delete this BigSwitch BCF Controller",
-    "message.confirm.delete.BrocadeVcs": "Please confirm that you would like to delete Brocade Vcs Switch",
-    "message.confirm.delete.F5": "Czy na pewno chcesz usunąć F5?",
-    "message.confirm.delete.NetScaler": "Please confirm that you would like to delete NetScaler",
-    "message.confirm.delete.PA": "Please confirm that you would like to delete Palo Alto",
-    "message.confirm.delete.SRX": "Czy na pewno chcesz usunąć SRX?",
-    "message.confirm.delete.acl.list": "Are you sure you want to delete this ACL list?",
-    "message.confirm.delete.alert": "Are you sure you want to delete this alert ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Please confirm that you want to delete Baremetal Rack Configuration.",
-    "message.confirm.delete.ciscoASA1000v": "Please confirm you want to delete CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
-    "message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
-    "message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
-    "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
-    "message.confirm.destroy.router": "Please confirm that you would like to destroy this router",
-    "message.confirm.disable.host": "Please confirm that you want to disable the host",
-    "message.confirm.disable.network.offering": "Are you sure you want to disable this network offering?",
-    "message.confirm.disable.provider": "Please confirm that you would like to disable this provider",
-    "message.confirm.disable.vnmc.provider": "Please confirm you would like to disable the VNMC provider.",
-    "message.confirm.disable.vpc.offering": "Are you sure you want to disable this VPC offering?",
-    "message.confirm.enable.host": "Please confirm that you want to enable the host",
-    "message.confirm.enable.network.offering": "Are you sure you want to enable this network offering?",
-    "message.confirm.enable.provider": "Please confirm that you would like to enable this provider",
-    "message.confirm.enable.vnmc.provider": "Please confirm you would like to enable the VNMC provider.",
-    "message.confirm.enable.vpc.offering": "Are you sure you want to enable this VPC offering?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Please confirm you wish to join this project.",
-    "message.confirm.migrate.volume": "Do you want to migrate this volume?",
-    "message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
-    "message.confirm.release.dedicate.vlan.range": "Please confirm you want to release dedicated VLAN range",
-    "message.confirm.release.dedicated.cluster": "Do you want to release this dedicated cluster ?",
-    "message.confirm.release.dedicated.host": "Do you want to release this dedicated host ?",
-    "message.confirm.release.dedicated.pod": "Do you want to release this dedicated pod ?",
-    "message.confirm.release.dedicated.zone": "Do you want to release this dedicated zone ? ",
-    "message.confirm.remove.IP.range": "Please confirm that you would like to remove this IP range.",
-    "message.confirm.remove.event": "Are you sure you want to remove this event?",
-    "message.confirm.remove.load.balancer": "Please confirm you want to remove VM from load balancer",
-    "message.confirm.remove.network.offering": "Are you sure you want to remove this network offering?",
-    "message.confirm.remove.selected.alerts": "Please confirm you would like to remove the selected alerts",
-    "message.confirm.remove.selected.events": "Please confirm you would like to remove the selected events",
-    "message.confirm.remove.vmware.datacenter": "Please confirm you want to remove VMware datacenter",
-    "message.confirm.remove.vpc.offering": "Are you sure you want to remove this VPC offering?",
-    "message.confirm.replace.acl.new.one": "Do you want to replace the ACL with a new one?",
-    "message.confirm.scale.up.router.vm": "Do you really want to scale up the Router VM ?",
-    "message.confirm.scale.up.system.vm": "Do you really want to scale up the system VM ?",
-    "message.confirm.shutdown.provider": "Please confirm that you would like to shutdown this provider",
-    "message.confirm.start.lb.vm": "Please confirm you want to start LB VM",
-    "message.confirm.stop.lb.vm": "Please confirm you want to stop LB VM",
-    "message.confirm.upgrade.router.newer.template": "Please confirm that you want to upgrade router to use newer template",
-    "message.confirm.upgrade.routers.account.newtemplate": "Please confirm that you want to upgrade all routers in this account to use newer template",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Please confirm that you want to upgrade all routers in this cluster to use newer template",
-    "message.confirm.upgrade.routers.newtemplate": "Please confirm that you want to upgrade all routers in this zone to use newer template",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Please confirm that you want to upgrade all routers in this pod to use newer template",
-    "message.copy.iso.confirm": "Please confirm that you wish to copy your ISO to",
-    "message.copy.template": "Copy template <b id=\"copy_template_name_text\">XXX</b> from zone <b id=\"copy_template_source_zone_text\"></b> to",
-    "message.copy.template.confirm": "Are you sure you want to copy template?",
-    "message.create.template": "Are you sure you want to create template?",
-    "message.create.template.vm": "Create VM from template <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Please specify the following information before creating a template of your disk volume: <b><span id=\"volume_name\"></span></b>. Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.creating.cluster": "Creating cluster",
-    "message.creating.guest.network": "Creating guest network",
-    "message.creating.physical.networks": "Creating physical networks",
-    "message.creating.pod": "Creating pod",
-    "message.creating.primary.storage": "Creating primary storage",
-    "message.creating.secondary.storage": "Creating secondary storage",
-    "message.creating.systemVM": "Creating system VMs (this may take a while)",
-    "message.creating.zone": "Creating zone",
-    "message.decline.invitation": "Are you sure you want to decline this project invitation?",
-    "message.dedicate.zone": "Dedicating zone",
-    "message.dedicated.zone.released": "Zone dedication released",
-    "message.delete.VPN.connection": "Please confirm that you want to delete VPN connection",
-    "message.delete.VPN.customer.gateway": "Please confirm that you want to delete this VPN Customer Gateway",
-    "message.delete.VPN.gateway": "Please confirm that you want to delete this VPN Gateway",
-    "message.delete.account": "Please confirm that you want to delete this account.",
-    "message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
-    "message.delete.gateway": "Please confirm you want to delete the gateway",
-    "message.delete.project": "Czy na pewno chcesz usunąć ten projekt?",
-    "message.delete.user": "Please confirm that you would like to delete this user.",
-    "message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
-    "message.desc.advanced.zone": "For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support.",
-    "message.desc.basic.zone": "Provide a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering).",
-    "message.desc.cluster": "Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.",
-    "message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.<br><br>(1) If public key is set, CloudStack will register the public key. You can use it through your private key.<br><br>(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.<br>",
-    "message.desc.created.ssh.key.pair": "Created a SSH Key Pair.",
-    "message.desc.host": "Each cluster must contain at least one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.<br/><br/>Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.",
-    "message.desc.primary.storage": "Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor.",
-    "message.desc.reset.ssh.key.pair": "Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled.",
-    "message.desc.secondary.storage": "Each zone must have at least one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.<br/><br/>Provide the IP address and exported path.",
-    "message.desc.zone": "A zone is the largest organizational unit in CloudStack, and it typically corresponds to a single datacenter. Zones provide physical isolation and redundancy. A zone consists of one or more pods (each of which contains hosts and primary storage servers) and a secondary storage server which is shared by all pods in the zone.",
-    "message.detach.disk": "Are you sure you want to detach this disk?",
-    "message.detach.iso.confirm": "Please confirm that you want to detach the ISO from this virtual instance.",
-    "message.disable.account": "Please confirm that you want to disable this account.  By disabling the account, all users for this account will no longer have access to their cloud resources.  All running virtual machines will be immediately shut down.",
-    "message.disable.snapshot.policy": "You have successfully disabled your current snapshot policy.",
-    "message.disable.user": "Please confirm that you would like to disable this user.",
-    "message.disable.vpn": "Czy na pewno chcesz wyłączyć VPN?",
-    "message.disable.vpn.access": "Please confirm that you want to disable Remote Access VPN.",
-    "message.disabling.network.offering": "Disabling network offering",
-    "message.disabling.vpc.offering": "Disabling VPC offering",
-    "message.disallowed.characters": "Disallowed characters: <,>",
-    "message.download.ISO": "Please click <a href=\"#\">00000</a> to download ISO",
-    "message.download.template": "Please click <a href=\"#\">00000</a> to download template",
-    "message.download.volume": "Please click <a href=\"#\">00000</a> to download volume",
-    "message.download.volume.confirm": "Please confirm that you want to download this volume.",
-    "message.edit.account": "Edit (\"-1\" indicates no limit to the amount of resources create)",
-    "message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
-    "message.edit.limits": "Please specify limits to the following resources.  A \"-1\" indicates no limit to the amount of resources create.",
-    "message.edit.traffic.type": "Please specify the traffic label you want associated with this traffic type.",
-    "message.enable.account": "Please confirm that you want to enable this account.",
-    "message.enable.user": "Please confirm that you would like to enable this user.",
-    "message.enable.vpn": "Please confirm that you want Remote Access VPN enabled for this IP address.",
-    "message.enable.vpn.access": "VPN is currently disabled for this IP Address.  Would you like to enable VPN access?",
-    "message.enabled.vpn": "Your Remote Access VPN is currently enabled and can be accessed via the IP",
-    "message.enabled.vpn.ip.sec": "Your IPSec pre-shared key is",
-    "message.enabling.network.offering": "Enabling network offering",
-    "message.enabling.security.group.provider": "Enabling Security Group provider",
-    "message.enabling.vpc.offering": "Enabling VPC offering",
-    "message.enabling.zone": "Enabling zone",
-    "message.enabling.zone.dots": "Enabling zone...",
-    "message.enter.seperated.list.multiple.cidrs": "Please enter a comma separated list of CIDRs if more than one",
-    "message.enter.token": "Please enter the token that you were given in your invite e-mail.",
-    "message.generate.keys": "Please confirm that you would like to generate new keys for this user.",
-    "message.gslb.delete.confirm": "Please confirm you want to delete this GSLB",
-    "message.gslb.lb.remove.confirm": "Please confirm you want to remove load balancing from GSLB",
-    "message.guest.traffic.in.advanced.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network.",
-    "message.guest.traffic.in.basic.zone": "Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range.",
-    "message.host.dedicated": "Host Dedicated",
-    "message.host.dedication.released": "Host dedication released",
-    "message.installWizard.click.retry": "Click the button to retry launch.",
-    "message.installWizard.copy.whatIsACluster": "A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Virtual machine instances (VMs) can be live-migrated from one host to another within the same cluster, without interrupting service to the user. A cluster is the third-largest organizational unit within a CloudStack&#8482; deployment. Clusters are contained within pods, and pods are contained within zones.<br/><br/>CloudStack&#8482; allows multiple clusters in a cloud deployment, but for a Basic Installation, we only need one cluster.",
-    "message.installWizard.copy.whatIsAHost": "A host is a single computer. Hosts provide the computing resources that run the guest virtual machines. Each host has hypervisor software installed on it to manage the guest VMs (except for bare metal hosts, which are a special case discussed in the Advanced Installation Guide). For example, a Linux KVM-enabled server, a Citrix XenServer server, and an ESXi server are hosts. In a Basic Installation, we use a single host running XenServer or KVM.<br/><br/>The host is the smallest organizational unit within a CloudStack&#8482; deployment. Hosts are contained within clusters, clusters are contained within pods, and pods are contained within zones.",
-    "message.installWizard.copy.whatIsAPod": "A pod often represents a single rack. Hosts in the same pod are in the same subnet.<br/><br/>A pod is the second-largest organizational unit within a CloudStack&#8482; deployment. Pods are contained within zones. Each zone can contain one or more pods; in the Basic Installation, you will have just one pod in your zone.",
-    "message.installWizard.copy.whatIsAZone": "A zone is the largest organizational unit within a CloudStack&#8482; deployment. A zone typically corresponds to a single datacenter, although it is permissible to have multiple zones in a datacenter. The benefit of organizing infrastructure into zones is to provide physical isolation and redundancy. For example, each zone can have its own power supply and network uplink, and the zones can be widely separated geographically (though this is not required).",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack&#8482 manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack&#8482 to deploy, manage, and configure cloud computing environments.<br/><br/>Extending beyond individual virtual machine images running on commodity hardware, CloudStack&#8482 provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications. Both open-source and Premium versions are available, with the open-source version offering nearly identical features.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "A CloudStack&#8482; cloud infrastructure makes use of two types of storage: primary storage and secondary storage. Both of these can be iSCSI or NFS servers, or localdisk.<br/><br/><strong>Primary storage</strong> is associated with a cluster, and it stores the disk volumes of each guest VM for all the VMs running on hosts in that cluster. The primary storage server is typically located close to the hosts.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Secondary storage is associated with a zone, and it stores the following:<ul><li>Templates - OS images that can be used to boot VMs and can include additional configuration information, such as installed applications</li><li>ISO images - OS images that can be bootable or non-bootable</li><li>Disk volume snapshots - saved copies of VM data which can be used for data recovery or to create new templates</ul>",
-    "message.installWizard.now.building": "Now building your cloud...",
-    "message.installWizard.tooltip.addCluster.name": "A name for the cluster.  This can be text of your choosing and is not used by CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "The DNS name or IP address of the host.",
-    "message.installWizard.tooltip.addHost.password": "This is the password for the user named above (from your XenServer install).",
-    "message.installWizard.tooltip.addHost.username": "Usually root.",
-    "message.installWizard.tooltip.addPod.name": "A name for the pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "The gateway for the hosts in that pod.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "The netmask in use on the subnet the guests will use.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "The name for the storage device.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(for NFS) In NFS this is the exported path from the server. Path (for SharedMountPoint).  With KVM this is the path on each host that is where this primary storage is mounted.  For example, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(for NFS, iSCSI, or PreSetup) The IP address or DNS name of the storage device.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "The IP address of the NFS server hosting the secondary storage",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "The exported path, located on the server you specified above",
-    "message.installWizard.tooltip.addZone.dns1": "These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.dns2": "These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.internaldns1": "These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.internaldns2": "These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here.",
-    "message.installWizard.tooltip.addZone.name": "A name for the zone",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "A description for your network",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "The gateway that the guests should use",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "The netmask in use on the subnet that the guests should use",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "The range of IP addresses that will be available for allocation to guests in this zone.  If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "A name for your network",
-    "message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
-    "message.instanceWizard.noTemplates": "You do not have any templates available; please add a compatible template, and re-launch the instance wizard.",
-    "message.ip.address.changed": "Your IP addresses may have changed; would you like to refresh the listing? Note that in this case the details pane will close.",
-    "message.iso.desc": "Disc image containing data or bootable media for OS",
-    "message.join.project": "You have now joined a project. Please switch to Project view to see the project.",
-    "message.launch.vm.on.private.network": "Do you wish to launch your instance on your own private dedicated network?",
-    "message.launch.zone": "Zone is ready to launch; please proceed to the next step.",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Please confirm that you want to lock this account.  By locking the account, all users for this account will no longer be able to manage their cloud resources.  Existing resources can still be accessed.",
-    "message.migrate.instance.confirm": "Please confirm the host you wish to migrate the virtual instance to.",
-    "message.migrate.instance.to.host": "Please confirm that you want to migrate instance to another host.",
-    "message.migrate.instance.to.ps": "Please confirm that you want to migrate instance to another primary storage.",
-    "message.migrate.router.confirm": "Please confirm the host you wish to migrate the router to:",
-    "message.migrate.systemvm.confirm": "Please confirm the host you wish to migrate the system VM to:",
-    "message.migrate.volume": "Please confirm that you want to migrate volume to another primary storage.",
-    "message.network.addVM.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-    "message.network.addVMNIC": "Please confirm that you would like to add a new VM NIC for this network.",
-    "message.network.remote.access.vpn.configuration": "Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-    "message.new.user": "Specify the following to add a new user to the account",
-    "message.no.affinity.groups": "You do not have any affinity groups. Please continue to the next step.",
-    "message.no.host.available": "No Hosts are available for Migration",
-    "message.no.network.support": "Your selected hypervisor, vSphere, does not have any additional network features.  Please continue to step 5.",
-    "message.no.network.support.configuration.not.true": "You do not have any zone that has security group enabled. Thus, no additional network features.  Please continue to step 5.",
-    "message.no.projects": "Nie posiadasz żadnych projektów.<br/> Utwórz nowy projekt w zakładce projekty",
-    "message.no.projects.adminOnly": "You do not have any projects.<br/>Please ask your administrator to create a new project.",
-    "message.number.clusters": "<h2><span> # of </span> Clusters</h2>",
-    "message.number.hosts": "<h2><span> # of </span> Hosts</h2>",
-    "message.number.pods": "<h2><span> # of </span> Pods</h2>",
-    "message.number.storage": "<h2><span> # of </span> Primary Storage Volumes</h2>",
-    "message.number.zones": "<h2><span> # of </span> Zones</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Password has been reset to",
-    "message.password.of.the.vm.has.been.reset.to": "Password of the VM has been reset to",
-    "message.pending.projects.1": "You have pending project invitations:",
-    "message.pending.projects.2": "To view, please go to the projects section, then select invitations from the drop-down.",
-    "message.please.add.at.lease.one.traffic.range": "Please add at least one traffic range.",
-    "message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
-    "message.please.proceed": "Przejdź do następnego punktu",
-    "message.please.select.a.configuration.for.your.zone": "Please select a configuration for your zone.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Please select a different public and management network before removing",
-    "message.please.select.networks": "Please select networks for your virtual machine.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Please select a ssh key pair you want this VM to use:",
-    "message.please.wait.while.zone.is.being.created": "Please wait while your zone is being created; this may take a while...",
-    "message.pod.dedication.released": "Pod dedication released",
-    "message.portable.ip.delete.confirm": "Please confirm you want to delete Portable IP Range",
-    "message.project.invite.sent": "Invite sent to user; they will be added to the project once they accept the invitation",
-    "message.public.traffic.in.advanced.zone": "Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.<br/><br/>Provide at least one range of IP addresses for internet traffic.",
-    "message.public.traffic.in.basic.zone": "Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP.",
-    "message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
-    "message.read.admin.guide.scaling.up": "Please read the dynamic scaling section in the admin guide before scaling up.",
-    "message.recover.vm": "Please confirm that you would like to recover this VM.",
-    "message.redirecting.region": "Redirecting to region...",
-    "message.reinstall.vm": "NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched.",
-    "message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
-    "message.remove.region": "Are you sure you want to remove this region from this management server?",
-    "message.remove.vpc": "Please confirm that you want to remove the VPC",
-    "message.remove.vpn.access": "Please confirm that you want to remove VPN access from the following user.",
-    "message.removed.ssh.key.pair": "Removed a SSH Key Pair",
-    "message.reset.VPN.connection": "Please confirm that you want to reset VPN connection",
-    "message.reset.password.warning.notPasswordEnabled": "The template of this instance was created without password enabled",
-    "message.reset.password.warning.notStopped": "Your instance must be stopped before attempting to change its current password",
-    "message.restart.mgmt.server": "Please restart your management server(s) for your new settings to take effect.",
-    "message.restart.mgmt.usage.server": "Please restart your management server(s) and usage server(s) for your new settings to take effect.",
-    "message.restart.network": "All services provided by this network will be interrupted. Please confirm that you want to restart this network.",
-    "message.restart.vpc": "Please confirm that you want to restart the VPC",
-    "message.restart.vpc.remark": "Please confirm that you want to restart the VPC <p><small><i>Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes</i>.</small></p>",
-    "message.restoreVM": "Do you want to restore the VM ?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Use <strong>Ctrl-click</strong> to select all applicable security groups)",
-    "message.select.a.zone": "A zone typically corresponds to a single datacenter. Multiple zones help make the cloud more reliable by providing physical isolation and redundancy.",
-    "message.select.affinity.groups": "Please select any affinity groups you want this VM to belong to:",
-    "message.select.instance": "Please select an instance.",
-    "message.select.iso": "Please select an ISO for your new virtual instance.",
-    "message.select.item": "Please select an item.",
-    "message.select.security.groups": "Please select security group(s) for your new VM",
-    "message.select.template": "Please select a template for your new virtual instance.",
-    "message.select.tier": "Please select a tier",
-    "message.set.default.NIC": "Please confirm that you would like to make this NIC the default for this VM.",
-    "message.set.default.NIC.manual": "Please manually update the default NIC on the VM now.",
-    "message.setup.physical.network.during.zone.creation": "When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.<br/><br/><strong>Drag and drop one or more traffic types</strong> onto each physical network.",
-    "message.setup.physical.network.during.zone.creation.basic": "When adding a basic zone, you can set up one physical network, which corresponds to a NIC on the hypervisor. The network carries several types of traffic.<br/><br/>You may also <strong>drag and drop</strong> other traffic types onto the physical network.",
-    "message.setup.successful": "Cloud setup successful!",
-    "message.snapshot.schedule": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-    "message.specifiy.tag.key.value": "Please specify a tag key and value",
-    "message.specify.url": "Please specify URL",
-    "message.step.1.continue": "Please select a template or ISO to continue",
-    "message.step.1.desc": "Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto.",
-    "message.step.2.continue": "Please select a service offering to continue",
-    "message.step.3.continue": "Please select a disk offering to continue",
-    "message.step.4.continue": "Please select at least one network to continue",
-    "message.step.4.desc": "Please select the primary network that your virtual instance will be connected to.",
-    "message.storage.traffic": "Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here.",
-    "message.suspend.project": "Czy na pewno chcesz zawiesić ten projekt",
-    "message.systems.vms.ready": "System VMs ready.",
-    "message.template.copying": "Template is being copied.",
-    "message.template.desc": "OS image that can be used to boot VMs",
-    "message.tier.required": "Tier is required",
-    "message.tooltip.dns.1": "Name of a DNS server for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.dns.2": "A second DNS server name for use by VMs in the zone. The public IP addresses for the zone must have a route to this server.",
-    "message.tooltip.internal.dns.1": "Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-    "message.tooltip.internal.dns.2": "Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server.",
-    "message.tooltip.network.domain": "A DNS suffix that will create a custom domain name for the network that is accessed by guest VMs.",
-    "message.tooltip.pod.name": "A name for this pod.",
-    "message.tooltip.reserved.system.gateway": "The gateway for the hosts in the pod.",
-    "message.tooltip.reserved.system.netmask": "The network prefix that defines the pod subnet. Uses CIDR notation.",
-    "message.tooltip.zone.name": "A name for the zone.",
-    "message.update.os.preference": "Please choose a OS preference for this host.  All virtual instances with similar preferences will be first allocated to this host before choosing another.",
-    "message.update.resource.count": "Please confirm that you want to update resource counts for this account.",
-    "message.update.ssl": "Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance:",
-    "message.update.ssl.failed": "Failed to update SSL Certificate.",
-    "message.update.ssl.succeeded": "Update SSL Certificates succeeded",
-    "message.validate.URL": "Please enter a valid URL.",
-    "message.validate.accept": "Please enter a value with a valid extension.",
-    "message.validate.creditcard": "Please enter a valid credit card number.",
-    "message.validate.date": "Please enter a valid date.",
-    "message.validate.date.ISO": "Please enter a valid date (ISO).",
-    "message.validate.digits": "Please enter only digits.",
-    "message.validate.email.address": "Please enter a valid email address.",
-    "message.validate.equalto": "Please enter the same value again.",
-    "message.validate.fieldrequired": "This field is required.",
-    "message.validate.fixfield": "Please fix this field.",
-    "message.validate.instance.name": "Instance name can not be longer than 63 characters. Only ASCII letters a~z, A~Z, digits 0~9, hyphen are allowed. Must start with a letter and end with a letter or a digit.",
-    "message.validate.invalid.characters": "Invalid characters found; please correct.",
-    "message.validate.max": "Please enter a value less than or equal to {0}.",
-    "message.validate.maxlength": "Please enter no more than {0} characters.",
-    "message.validate.minlength": "Please enter at least {0} characters.",
-    "message.validate.number": "Please enter a valid number.",
-    "message.validate.range": "Please enter a value between {0} and {1}.",
-    "message.validate.range.length": "Please enter a value between {0} and {1} characters long.",
-    "message.virtual.network.desc": "A dedicated virtualized network for your account.  The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router.",
-    "message.vm.create.template.confirm": "Create Template will reboot the VM automatically.",
-    "message.vm.review.launch": "Please review the following information and confirm that your virtual instance is correct before launch.",
-    "message.vnmc.available.list": "VNMC is not available from provider list.",
-    "message.vnmc.not.available.list": "VNMC is not available from provider list.",
-    "message.volume.create.template.confirm": "Please confirm that you wish to create a template for this disk volume.  Creation of the template can range from several minutes to longer depending on the size of the volume.",
-    "message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
-    "message.you.must.have.at.least.one.physical.network": "You must have at least one physical network",
-    "message.your.cloudstack.is.ready": "Your CloudStack is ready!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Zone creation complete. Would you like to enable this zone?",
-    "message.zone.no.network.selection": "The zone you selected does not have any choices for network selection.",
-    "message.zone.step.1.desc": "Please select a network model for your zone.",
-    "message.zone.step.2.desc": "Please enter the following info to add a new zone",
-    "message.zone.step.3.desc": "Please enter the following info to add a new pod",
-    "message.zoneWizard.enable.local.storage": "WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:<br/><br/>1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.<br/><br/>2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.<br/><br/><br/>Would you like to continue?",
-    "messgae.validate.min": "Please enter a value greater than or equal to {0}.",
-    "mode": "Tryb",
-    "network.rate": "Network Rate",
-    "notification.reboot.instance": "Reboot instance",
-    "notification.start.instance": "Start instance",
-    "notification.stop.instance": "Stop instance",
-    "side.by.side": "Side by Side",
-    "state.Accepted": "Akceptowano",
-    "state.Active": "Aktywny",
-    "state.Allocated": "Allocated",
-    "state.Allocating": "Allocating",
-    "state.BackedUp": "Backed Up",
-    "state.BackingUp": "Backing Up",
-    "state.Completed": "Ukończono",
-    "state.Creating": "Tworzenie",
-    "state.Declined": "Odrzucono",
-    "state.Destroyed": "Zniszczono",
-    "state.Disabled": "Wyłączony",
-    "state.Enabled": "Włączone",
-    "state.Error": "Błąd",
-    "state.Expunging": "Expunging",
-    "state.Migrating": "Migrating",
-    "state.Pending": "Pending",
-    "state.Ready": "Gotowe",
-    "state.Running": "Running",
-    "state.Starting": "Rozpoczynanie",
-    "state.Stopped": "Zatrzymano",
-    "state.Stopping": "Stopping",
-    "state.Suspended": "Zawieszono",
-    "state.detached": "Detached",
-    "title.upload.volume": "Upload Volume",
-    "ui.listView.filters.all": "Wszystko",
-    "ui.listView.filters.mine": "Mine"
-};
diff --git a/ui/legacy/l10n/pt_BR.js b/ui/legacy/l10n/pt_BR.js
deleted file mode 100644
index 13ca563..0000000
--- a/ui/legacy/l10n/pt_BR.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "Código ICMP",
-    "ICMP.code.desc": "Informe -1, se vocês quiser permitir todos os códigos ICMP.",
-    "ICMP.type": "Tipo ICMP",
-    "ICMP.type.desc": "Informe -1, se vocês quiser permitir todos os tipos ICMP.",
-    "changed.item.properties": "Propriedades do item alteradas",
-    "confirm.enable.s3": "Por favor, preencha as informações abaixo para habilitar suporte o Storage Secundário fornecido por S3",
-    "confirm.enable.swift": "Por favor, preencha as informações abaixo para habilitar suporte ao Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Erro: a nuvem não alterou sua senha porque o LDAP está ativo.",
-    "error.could.not.enable.zone": "Não foi possível habilitar a zona",
-    "error.installWizard.message": "Alguma coisa está errada; você pode voltar e corrigir quaisquer erros",
-    "error.invalid.username.password": "Usuário ou senha inválidos",
-    "error.login": "O seu usuário/senha não coincidem com nossos registros.",
-    "error.menu.select": "Não foi possível realizar a ação pois nenhum item foi selecionado.",
-    "error.mgmt.server.inaccessible": "O Servidor de Gerenciamento está inacessível. Tente novamente mais tarde.",
-    "error.password.not.match": "Os campos de senha não combinam",
-    "error.please.specify.physical.network.tags": "As Ofertas de Rede não estarão disponíveis enquanto você não especificar tags para esta interface física.",
-    "error.session.expired": "Sua sessão expirou.",
-    "error.something.went.wrong.please.correct.the.following": "Alguma coisa está errada; por favor corrija abaixo",
-    "error.unable.to.reach.management.server": "Não foi possível acessar o Servidor de Gerenciamento",
-    "error.unresolved.internet.name": "Impossível resolver DNS",
-    "force.delete": "Forçar Exclusão",
-    "force.delete.domain.warning": "Atenção: Esta opção removerá todos os domínios, contas e recursos associados.",
-    "force.remove": "Forçar Remoção",
-    "force.remove.host.warning": "Atenção: O CloudStack desligará de maneira forçada todas as VMs antes de remover o host do cluster.",
-    "force.stop": "Forçar Parada",
-    "force.stop.instance.warning": "Aviso: Forçar o desligamento desta instância deve ser sua última opção. Isto pode levar a perda de dados, bem como  comportamento inconsistênte do estado da máquina virtual.",
-    "hint.no.host.tags": "Nenhuma tag de host encontrada",
-    "hint.no.storage.tags": "Nenhuma tag de storage encontrada",
-    "hint.type.part.host.tag": "Digite parte de um tag de host",
-    "hint.type.part.storage.tag": "Digite parte de um tag de storage",
-    "image.directory": "Diretório da Imagem",
-    "inline": "Inline",
-    "instances.actions.reboot.label": "Reiniciar instância",
-    "label.CIDR.list": "Lista CIDR",
-    "label.CIDR.of.destination.network": "CIDR da rede de destino",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "Tipo de Servidor DHCP",
-    "label.DNS.domain.for.guest.networks": "Domínio DNS para redes hóspedes",
-    "label.ESP.encryption": "Encriptação ESP",
-    "label.ESP.hash": "Hash ESP",
-    "label.ESP.lifetime": "Tempo de vida do ESP (segundos)",
-    "label.ESP.policy": "Política ESP",
-    "label.IKE.DH": "DH IKE",
-    "label.IKE.encryption": "Encriptação IKE",
-    "label.IKE.hash": "Hash IKE",
-    "label.IKE.lifetime": "Tempo de vida IKE (segundos)",
-    "label.IKE.policy": "Política IKE",
-    "label.IPsec.preshared.key": "Chave IPSec pré compartilhada",
-    "label.LB.isolation": "Isolamento de LB",
-    "label.LUN.number": "LUN #",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto Log Profile",
-    "label.PA.threat.profile": "Palo Alto Threat Profile",
-    "label.PING.CIFS.password": "PING CIFS password",
-    "label.PING.CIFS.username": "PING CIFS username",
-    "label.PING.dir": "PING Directory",
-    "label.PING.storage.IP": "Disparar PING para IP do Storage",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Tipo de Servidor PXE",
-    "label.SNMP.community": "Comunidade SNMP",
-    "label.SNMP.port": "Porta SNMP",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP Directory",
-    "label.VMFS.datastore": "VMFS datastore",
-    "label.VMs.in.tier": "Máquinas virtuais em camadas",
-    "label.VPC.limits": "Limites VPC",
-    "label.VPC.router.details": "Detalhes de roteador de VPC",
-    "label.VPN.connection": "Conexão VPN",
-    "label.VPN.customer.gateway": "Gateway de VPN de usuário",
-    "label.VPN.gateway": "Gateway de VPN",
-    "label.Xenserver.Tools.Version61plus": "Versão original do XS é 6.1+",
-    "label.about": "Sobre",
-    "label.about.app": "Sobre o CloudStack",
-    "label.accept.project.invitation": "Aceitar convite de projeto.",
-    "label.account": "Conta",
-    "label.account.and.security.group": "Contas, grupos de Segurança",
-    "label.account.details": "Detalhes da conta",
-    "label.account.id": "ID da Conta",
-    "label.account.lower": "conta",
-    "label.account.name": "Nome da Conta",
-    "label.account.specific": "Conta-Specific",
-    "label.account.type": "Tipo de Conta",
-    "label.accounts": "Contas",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "Lista de regas de ACL",
-    "label.acl.name": "Nome da ACL",
-    "label.acl.replaced": "ACL trocado",
-    "label.acl.reason": "Motivo",
-    "label.acl.reason.description": "Motivo para se utilizar a regra.",
-    "label.acquire.new.ip": "Adquirir novo IP",
-    "label.acquire.new.secondary.ip": "Adquira um novo IP secundário",
-    "label.action": "Ação",
-    "label.action.attach.disk": "Anexar Disco",
-    "label.action.attach.disk.processing": "Anexando Disco....",
-    "label.action.attach.iso": "Anexar ISO",
-    "label.action.attach.iso.processing": "Anexando ISO....",
-    "label.action.cancel.maintenance.mode": "Cancelar Modo de Manutenção",
-    "label.action.cancel.maintenance.mode.processing": "Cancelando Modo de Manutenção....",
-    "label.action.change.password": "Troca de Senha",
-    "label.action.change.service": "Trocar Plano",
-    "label.action.change.service.processing": "Trocando de Plano....",
-    "label.action.configure.samlauthorization": "Configurar Autorização SAML SSO",
-    "label.action.copy.ISO": "Copiar ISO",
-    "label.action.copy.ISO.processing": "Copiando ISO...",
-    "label.action.copy.template": "Copiar Template",
-    "label.action.copy.template.processing": "Copiando Template...",
-    "label.action.create.template": "Criar Template",
-    "label.action.create.template.from.vm": "Criar Template a partir da VM",
-    "label.action.create.template.from.volume": "Criar Template a partir do Disco",
-    "label.action.create.template.processing": "Criando Template....",
-    "label.action.create.vm": "Criar VM",
-    "label.action.create.vm.processing": "Criando VM....",
-    "label.action.create.volume": "Criar Disco",
-    "label.action.create.volume.processing": "Criando Disco....",
-    "label.action.delete.IP.range": "Remover Range IP",
-    "label.action.delete.IP.range.processing": "Removendo Range de IP....",
-    "label.action.delete.ISO": "Removendo ISO",
-    "label.action.delete.ISO.processing": "Removendo ISO....",
-    "label.action.delete.account": "Remover conta",
-    "label.action.delete.account.processing": "Removendo conta....",
-    "label.action.delete.cluster": "Remover Cluster",
-    "label.action.delete.cluster.processing": "Removendo Cluster....",
-    "label.action.delete.disk.offering": "Remover Oferta de Disco",
-    "label.action.delete.disk.offering.processing": "Removendo Oferta de Disco....",
-    "label.action.delete.domain": "Remover Domínio",
-    "label.action.delete.domain.processing": "Removendo Domínio....",
-    "label.action.delete.firewall": "Remover regra de firewall",
-    "label.action.delete.firewall.processing": "Removendo Firewall....",
-    "label.action.delete.ingress.rule": "Remover Regra de Entrada",
-    "label.action.delete.ingress.rule.processing": "Removendo Regra de Entrada....",
-    "label.action.delete.load.balancer": "Remover regra de balanceador de carga",
-    "label.action.delete.load.balancer.processing": "Removendo Load Balancer....",
-    "label.action.delete.network": "Remover Rede",
-    "label.action.delete.network.processing": "Removendo Rede....",
-    "label.action.delete.nexusVswitch": "Remover NexusVswitch",
-    "label.action.delete.nic": "Remover Interface de Rede",
-    "label.action.delete.physical.network": "Deletar rede física",
-    "label.action.delete.pod": "Remover POD",
-    "label.action.delete.pod.processing": "Removendo POD....",
-    "label.action.delete.primary.storage": "Remover Storage Primário",
-    "label.action.delete.primary.storage.processing": "Removendo Storage Primário....",
-    "label.action.delete.secondary.storage": "Remover Storage Secundário",
-    "label.action.delete.secondary.storage.processing": "Removendo Storage Secundário....",
-    "label.action.delete.security.group": "Remover Security Group",
-    "label.action.delete.security.group.processing": "Removendo Security Group....",
-    "label.action.delete.service.offering": "Remover Plano",
-    "label.action.delete.service.offering.processing": "Removendo Plano....",
-    "label.action.delete.snapshot": "Remover Snapshot",
-    "label.action.delete.snapshot.processing": "Removendo Snapshot....",
-    "label.action.delete.system.service.offering": "Deletar Oferta de Serviço de Sistema",
-    "label.action.delete.template": "Remover Template",
-    "label.action.delete.template.processing": "Removendo Template....",
-    "label.action.delete.user": "Remover Usuário",
-    "label.action.delete.user.processing": "Removendo Usuário....",
-    "label.action.delete.volume": "Remover Disco",
-    "label.action.delete.volume.processing": "Removendo Disco....",
-    "label.action.delete.zone": "Remover Zona",
-    "label.action.delete.zone.processing": "Removendo Zona....",
-    "label.action.destroy.instance": "Apagar Instância",
-    "label.action.destroy.instance.processing": "Apagando Instância....",
-    "label.action.destroy.systemvm": "Apagar VM de Sistema",
-    "label.action.destroy.systemvm.processing": "Apagando VM de Sistema....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Desplugar Disco",
-    "label.action.detach.disk.processing": "Desplugando Disco....",
-    "label.action.detach.iso": "Desplugar ISO",
-    "label.action.detach.iso.processing": "Desplugando ISO....",
-    "label.action.disable.account": "Desativar conta",
-    "label.action.disable.account.processing": "Desativando conta....",
-    "label.action.disable.cluster": "Desativar Cluster",
-    "label.action.disable.cluster.processing": "Desativando Cluster....",
-    "label.action.disable.nexusVswitch": "Desabilitar NexusVswitch",
-    "label.action.disable.physical.network": "Desabilitar rede física",
-    "label.action.disable.pod": "Desativar POD",
-    "label.action.disable.pod.processing": "Desativando POD....",
-    "label.action.disable.static.NAT": "Desativar NAT Estático",
-    "label.action.disable.static.NAT.processing": "Desativando NAT Estático....",
-    "label.action.disable.user": "Desativar Usuário",
-    "label.action.disable.user.processing": "Desativando Usuário....",
-    "label.action.disable.zone": "Desativar Zona",
-    "label.action.disable.zone.processing": "Desativando Zona....",
-    "label.action.download.ISO": "Baixar ISO",
-    "label.action.download.template": "Baixar Template",
-    "label.action.download.volume": "Baixar Disco",
-    "label.action.download.volume.processing": "Baixando Disco....",
-    "label.action.edit.ISO": "Editar ISO",
-    "label.action.edit.account": "Editar conta",
-    "label.action.edit.disk.offering": "Editar Oferta de Disco",
-    "label.action.edit.domain": "Editar Domínio",
-    "label.action.edit.global.setting": "Editar Configurações Globais",
-    "label.action.edit.host": "Editar Host",
-    "label.action.edit.instance": "Editar Instância",
-    "label.action.edit.network": "Editar Rede",
-    "label.action.edit.network.offering": "Editar Oferta de Rede",
-    "label.action.edit.network.processing": "Editarando Rede....",
-    "label.action.edit.pod": "Editar Pod",
-    "label.action.edit.primary.storage": "Editar Storage Primário",
-    "label.action.edit.resource.limits": "Editar Limite de Recursos",
-    "label.action.edit.service.offering": "Editar Plano",
-    "label.action.edit.template": "Editar Template",
-    "label.action.edit.user": "Editar Usuário",
-    "label.action.edit.zone": "Editar Zona",
-    "label.action.enable.account": "Ativar conta",
-    "label.action.enable.account.processing": "Ativando conta....",
-    "label.action.enable.cluster": "Ativar Cluster",
-    "label.action.enable.cluster.processing": "Ativando Cluster....",
-    "label.action.enable.maintenance.mode": "Ativar Modo de Manutenção",
-    "label.action.enable.maintenance.mode.processing": "Ativando Modo de Manutenção....",
-    "label.action.enable.nexusVswitch": "Habilitar NexusVswitch",
-    "label.action.enable.physical.network": "Habilitar rede física",
-    "label.action.enable.pod": "Ativar POD",
-    "label.action.enable.pod.processing": "Ativando POD....",
-    "label.action.enable.static.NAT": "Ativar NAT Estático",
-    "label.action.enable.static.NAT.processing": "Ativando NAT Estático....",
-    "label.action.enable.user": "Habilitar usuário",
-    "label.action.enable.user.processing": "Habilitando Usuário...",
-    "label.action.enable.zone": "Ativar Zona",
-    "label.action.enable.zone.processing": "Ativando Zona....",
-    "label.action.expunge.instance": "Eliminar Instância",
-    "label.action.expunge.instance.processing": "Expurgando Instância....",
-    "label.action.force.reconnect": "Force Reconnect",
-    "label.action.force.reconnect.processing": "Reconectando....",
-    "label.action.generate.keys": "Gerar Chaves",
-    "label.action.generate.keys.processing": "Gerando Chaves....",
-    "label.action.list.nexusVswitch": "Listar NexusVswitch",
-    "label.action.lock.account": "Bloquear conta",
-    "label.action.lock.account.processing": "Bloqueando conta....",
-    "label.action.manage.cluster": "Vincular Cluster",
-    "label.action.manage.cluster.processing": "Vinculando o Cluster....",
-    "label.action.migrate.instance": "Migrar Instância",
-    "label.action.migrate.instance.processing": "Migrando Instância....",
-    "label.action.migrate.router": "Migrar Roteador",
-    "label.action.migrate.router.processing": "Migrando Roteador...",
-    "label.action.migrate.systemvm": "Migrar VM de Sistema",
-    "label.action.migrate.systemvm.processing": "Migrando VM de Sistema...",
-    "label.action.reboot.instance": "Reiniciar Instância",
-    "label.action.reboot.instance.processing": "Reiniciando Instância...",
-    "label.action.reboot.router": "Reiniciar Roteador",
-    "label.action.reboot.router.processing": "Reiniciando Roteador....",
-    "label.action.reboot.systemvm": "Reiniciar VM de Sistema",
-    "label.action.reboot.systemvm.processing": "Reiniciando VM de Sistema....",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Snapshots recorrentes",
-    "label.action.register.iso": "Registrar ISO",
-    "label.action.register.template": "Registrar Template da URL",
-    "label.action.release.ip": "Liberar IP",
-    "label.action.release.ip.processing": "Liberando IP....",
-    "label.action.remove.host": "Remover Host",
-    "label.action.remove.host.processing": "Removendo Host....",
-    "label.action.reset.password": "Recuperar Senha",
-    "label.action.reset.password.processing": "Recuperando a Senha....",
-    "label.action.resize.volume": "Resize Volume",
-    "label.action.resize.volume.processing": "Resizing Volume....",
-    "label.action.resource.limits": "Limite de Recursos",
-    "label.action.restore.instance": "Restaurar Instância",
-    "label.action.restore.instance.processing": "Restaurando Instância...",
-    "label.action.revert.snapshot": "Reverter para Snapshot",
-    "label.action.revert.snapshot.processing": "Revertendo para Snapshot...",
-    "label.action.start.instance": "Iniciar Instância",
-    "label.action.start.instance.processing": "Iniciando Instância...",
-    "label.action.start.router": "Iniciar Roteador",
-    "label.action.start.router.processing": "Iniciando Roteador....",
-    "label.action.start.systemvm": "Iniciar VM de Sistema",
-    "label.action.start.systemvm.processing": "Iniciando VM de Sistema....",
-    "label.action.stop.instance": "Parar Instância",
-    "label.action.stop.instance.processing": "Parando Instância...",
-    "label.action.stop.router": "Parar Roteador",
-    "label.action.stop.router.processing": "Parando Roteador....",
-    "label.action.stop.systemvm": "Parar VM de Sistema",
-    "label.action.stop.systemvm.processing": "Parando VM de Sistema....",
-    "label.action.take.snapshot": "Tirar Snapshot",
-    "label.action.take.snapshot.processing": "Tirando Snapshot....",
-    "label.action.unmanage.cluster": "Desvincular Cluster",
-    "label.action.unmanage.cluster.processing": "Desvinculando Cluster....",
-    "label.action.update.OS.preference": "Atualizar Preferência de SO",
-    "label.action.update.OS.preference.processing": "Atualizando Preferência de SO....",
-    "label.action.update.resource.count": "Atualiza Contador de Recursos",
-    "label.action.update.resource.count.processing": "Atualizando Contador de Recursos....",
-    "label.action.vmsnapshot.create": "Fazer Snapshot de VM",
-    "label.action.vmsnapshot.delete": "Remover snapshot de VM",
-    "label.action.vmsnapshot.revert": "Reverter snapshot de VM",
-    "label.actions": "Ações",
-    "label.activate.project": "Ativar Projeto",
-    "label.active.sessions": "Sessões Ativas",
-    "label.add": "Adicionar",
-    "label.add.ACL": "Adicionar ACL",
-    "label.add.BigSwitchBcf.device": "Adicionar BigSwitch BCF Controller",
-    "label.add.BrocadeVcs.device": "Adicionar Brocade Vcs Switch",
-    "label.add.F5.device": "Adicionar dispositivo F5",
-    "label.add.LDAP.account": "Adicionar Conta LDAP",
-    "label.add.NiciraNvp.device": "Adicionar Controlador Nvp",
-    "label.add.OpenDaylight.device": "Adiciona Controlador OpenDaylight",
-    "label.add.PA.device": "Adicionar dispositivo Palo Alto",
-    "label.add.SRX.device": "Adicionar dispositivo SRX",
-    "label.add.VM.to.tier": "Adicionar máquina virtual à camada",
-    "label.add.VPN.gateway": "Adicionar gateway de VPN",
-    "label.add.account": "Adicionar Conta",
-    "label.add.account.to.project": "Adicionar conta ao projeto",
-    "label.add.accounts": "Adicionar contas",
-    "label.add.accounts.to": "Adicionar contas para",
-    "label.add.acl.list": "Adiciona Lista ACL",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Adicionar um grupo de afinidade",
-    "label.add.baremetal.dhcp.device": "Adiciona Dispositivo DHCP Baremetal",
-    "label.add.baremetal.rack.configuration": "Adicionar Configuração de Rack de Baremetal",
-    "label.add.by": "Adicionado por",
-    "label.add.by.cidr": "Adicionar por CIDR",
-    "label.add.by.group": "Adicionar por Grupo",
-    "label.add.ciscoASA1000v": "Adicone Recurso",
-    "label.add.cluster": "Adicionar Cluster",
-    "label.add.compute.offering": "Adicionar oferta de computação",
-    "label.add.direct.iprange": "Add Direct Ip Range",
-    "label.add.disk.offering": "Adicionar Oferta de Disco",
-    "label.add.domain": "Adicionar Domínio",
-    "label.add.egress.rule": "Adicionar regra egress",
-    "label.add.firewall": "Adicionar regra de Firewall",
-    "label.add.globo.dns": "Adicionar GloboDNS",
-    "label.add.gslb": "Adicionar GSLB",
-    "label.add.guest.network": "Adicionar rede guest",
-    "label.add.host": "Adicionar Host",
-    "label.add.ingress.rule": "Adicionar Regra de Entrada",
-    "label.add.intermediate.certificate": "Adicionar certificado intermediário",
-    "label.add.internal.lb": "Adiciona LB Interno",
-    "label.add.ip.range": "Adicionar Range de IP",
-    "label.add.isolated.guest.network": "Adiciona Rede Guest Isolada",
-    "label.add.isolated.guest.network.with.sourcenat": "Adicionar rede Guest isolada com SourceNat",
-    "label.add.isolated.network": "Adiciona Rede Isolada",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Adicionar Conta LDAP",
-    "label.add.list.name": "Nome de Lista ACL",
-    "label.add.load.balancer": "Adicionar Load Balance",
-    "label.add.more": "Adicionar Mais",
-    "label.add.netScaler.device": "Adicionar dispositivo Netscaler",
-    "label.add.network": "Adicionar Rede",
-    "label.add.network.ACL": "Adicione ACL de rede",
-    "label.add.network.acl.list": "Adicionar Lista de ACL de Rede",
-    "label.add.network.device": "Adicionar Dispositivo de Rede",
-    "label.add.network.offering": "Adicionar oferta de rede",
-    "label.add.new.F5": "Adicionar um novo F5",
-    "label.add.new.NetScaler": "Adicionar um novo NetScaler",
-    "label.add.new.PA": "Adicionar novo Palo Alto",
-    "label.add.new.SRX": "Adicionar um novo SRX",
-    "label.add.new.gateway": "Adicionar novo gateway",
-    "label.add.new.tier": "Adicionar nova camada",
-    "label.add.nfs.secondary.staging.store": "Adiciona Armazenamento NFS de Estágio Secundário",
-    "label.add.physical.network": "Adicionar rede física",
-    "label.add.pod": "Adicionar POD",
-    "label.add.port.forwarding.rule": "Adicionar regra de encaminhamento de porta",
-    "label.add.portable.ip.range": "Adicionar Faixa de Endereços IPs Portáveis",
-    "label.add.primary.storage": "Adicionar Storage Primário",
-    "label.add.private.gateway": "Adicionar Gateway Privado",
-    "label.add.region": "Adicionar Região",
-    "label.add.resources": "Adicionar Recursos",
-    "label.add.role": "Add Role",
-    "label.add.route": "Adicionar rota",
-    "label.add.rule": "Adicionar regra",
-    "label.add.rule.desc": "Criar nova regra ACL",
-    "label.add.secondary.storage": "Adicionar Storage Secundário",
-    "label.add.security.group": "Adicionar Security Group",
-    "label.add.service.offering": "Adicionar Plano",
-    "label.add.static.nat.rule": "Adicionar regra de NAT estático",
-    "label.add.static.route": "Adicionar rota estática",
-    "label.add.system.service.offering": "Adicionar Plano para VM de Sistema",
-    "label.add.template": "Adicionar Template",
-    "label.add.to.group": "Adicionar ao grupo",
-    "label.add.ucs.manager": "Adiciona Gerenciador UCS",
-    "label.add.user": "Adicionar Usuário",
-    "label.add.userdata": "Userdata",
-    "label.add.vlan": "Adicionar VLAN",
-    "label.add.vm": "Adicionar VM",
-    "label.add.vms": "Adicionar VMs",
-    "label.add.vms.to.lb": "Add VM(s) na regra de balanceamento de carga",
-    "label.add.vmware.datacenter": "Adicionar Datacerter VMware",
-    "label.add.vnmc.device": "Adiciona dispositivo VNMC",
-    "label.add.vnmc.provider": "Adicione provedor VNMC",
-    "label.add.volume": "Adicionar Disco",
-    "label.add.vpc": "Adicionar VPC",
-    "label.add.vpc.offering": "Adicionar Oferta VPC",
-    "label.add.vpn.customer.gateway": "Adicionar Gateway de VPN de usuário",
-    "label.add.vpn.user": "Adicionar usuário VPN",
-    "label.add.vxlan": "Adicionar VXLAN",
-    "label.add.zone": "Adicionar Zona",
-    "label.added.brocade.vcs.switch": "Adicionado novo Brocade Vcs Switch",
-    "label.added.network.offering": "Adicionar uma oferta de rede",
-    "label.added.new.bigswitch.bcf.controller": "Adicionar novo BigSwitch BCF Controller",
-    "label.added.nicira.nvp.controller": "Adicionado nova Controladora Nicira NVP",
-    "label.addes.new.f5": "Adicionado novo F5",
-    "label.adding": "Adicionando",
-    "label.adding.cluster": "Adicionando Cluster",
-    "label.adding.failed": "Falha ao Adicionar",
-    "label.adding.pod": "Adicionando POD",
-    "label.adding.processing": "Adicionando....",
-    "label.adding.succeeded": "Adicionado com Sucesso",
-    "label.adding.user": "Adicionando Usuário",
-    "label.adding.zone": "Adicionando Zona",
-    "label.additional.networks": "Redes Adicionais",
-    "label.admin": "Administrador",
-    "label.admin.accounts": "Contas Administrativas",
-    "label.advanced": "Avançado",
-    "label.advanced.mode": "Modo Avançado",
-    "label.advanced.search": "Busca Avançada",
-    "label.affinity": "Afinidade",
-    "label.affinity.group": "Grupo de Afinidade",
-    "label.affinity.groups": "Grupos de Afinidade",
-    "label.agent.password": "Senha do Agente",
-    "label.agent.port": "Porta do Agente",
-    "label.agent.state": "Estado do Agente",
-    "label.agent.username": "Usuário do Agente",
-    "label.agree": "Concordo",
-    "label.alert": "Alerta",
-    "label.alert.archived": "Alerta Arquivado",
-    "label.alert.deleted": "Alerta Apagado",
-    "label.alert.details": "Detalhes de alerta",
-    "label.algorithm": "Algoritmo",
-    "label.allocated": "Alocado",
-    "label.allocation.state": "Status da Alocação",
-    "label.allow": "Pertitir",
-    "label.anti.affinity": "Anti-afinidade",
-    "label.anti.affinity.group": "Grupo de Anti-afinidade",
-    "label.anti.affinity.groups": "Grupos de Anti-afinidade",
-    "label.api.key": "API Key",
-    "label.api.version": "Verão da API",
-    "label.app.name": "CloudStack",
-    "label.apply": "Aplicar",
-    "label.archive": "Arquivo",
-    "label.archive.alerts": "Guardar alertas",
-    "label.archive.events": "Guardar eventos",
-    "label.assign": "Atribuir",
-    "label.assign.instance.another": "Atribuir Instância para outra Conta",
-    "label.assign.to.load.balancer": "Atribuindo Instância ao balanceador de carga",
-    "label.assign.vms": "Atribuir VMs",
-    "label.assigned.vms": "VMs designadas",
-    "label.associate.public.ip": "Associa IP Público",
-    "label.associated.network": "Rede associada",
-    "label.associated.network.id": "ID de Rede Associado",
-    "label.associated.profile": "Perfil Associado",
-    "label.attached.iso": "Imagem ISO Plugada",
-    "label.author.email": "E-mail do autor",
-    "label.author.name": "Nome do autor",
-    "label.autoscale": "Escalonamento Automático",
-    "label.autoscale.configuration.wizard": "Assistente de configuração de AutoScale",
-    "label.availability": "Availability",
-    "label.availability.zone": "Datacenter",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "Disponível",
-    "label.available.public.ips": "IP Público Disponível",
-    "label.back": "Voltar",
-    "label.bandwidth": "Bandwidth",
-    "label.baremetal.dhcp.devices": "Dispositivos DHCP Baremetal",
-    "label.baremetal.dhcp.provider": "Provedor DHCP Baremetal",
-    "label.baremetal.pxe.device": "Adiciona Dispositivo PXE Baremetal",
-    "label.baremetal.pxe.devices": "Dispositivo PXE Baremetal",
-    "label.baremetal.pxe.provider": "Provedor PXE Baremetal",
-    "label.baremetal.rack.configuration": "Configuração do Rack de Baremetal",
-    "label.basic": "Básico",
-    "label.basic.mode": "Modo Básico",
-    "label.bigswitch.bcf.details": "Detalhes do BigSwitch BCF",
-    "label.bigswitch.bcf.nat": "Habilitar BigSwitch BCF NAT",
-    "label.bigswitch.controller.address": "Endereço do BigSwitch BCF Controller",
-    "label.blade.id": "ID da Lâmina",
-    "label.blades": "Lâminas",
-    "label.bootable": "Inicializável",
-    "label.broadcast.domain.range": "Range do domínio de Broadcast",
-    "label.broadcast.domain.type": "Tipo de Domínio Broadcast",
-    "label.broadcast.uri": "URI de broadcast",
-    "label.broadcasturi": "url de broadcast",
-    "label.broadcat.uri": "URI de broadcast",
-    "label.brocade.vcs.address": "Endereço do Vcs Switch",
-    "label.brocade.vcs.details": "Detalhes do Brocade Vcs Switch",
-    "label.by.account": "por Conta",
-    "label.by.alert.type": "Por tipo de alerta",
-    "label.by.availability": "By Availability",
-    "label.by.date.end": "Por data (final)",
-    "label.by.date.start": "Por data (início)",
-    "label.by.domain": "por Domínio",
-    "label.by.end.date": "por Data Final",
-    "label.by.event.type": "Por tipo de evento",
-    "label.by.level": "por Nível",
-    "label.by.pod": "por Pod",
-    "label.by.role": "por Função",
-    "label.by.start.date": "por Data Inicial",
-    "label.by.state": "por estado",
-    "label.by.traffic.type": "por Tipo de Tráfego",
-    "label.by.type": "Por Tipo",
-    "label.by.type.id": "por Tipo de ID",
-    "label.by.zone": "por Zona",
-    "label.bytes.received": "Bytes Recebidos",
-    "label.bytes.sent": "Bytes Enviados",
-    "label.cache.mode": "Tipo do cache de escrita",
-    "label.cancel": "Cancelar",
-    "label.capacity": "Capacidade",
-    "label.capacity.bytes": "Capacidade de Bytes",
-    "label.capacity.iops": "Capacidade de IOPS",
-    "label.certificate": "Certificado",
-    "label.change.affinity": "Muda Afinidade",
-    "label.change.ipaddress": "Mudança de endereço IP para NIC",
-    "label.change.service.offering": "Alterar oferta de serviço",
-    "label.change.value": "Alterar valor",
-    "label.character": "Caracter",
-    "label.chassis": "Chassis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR ou Conta/Security Group",
-    "label.cidr.list": "CIDR de Origem",
-    "label.cisco.nexus1000v.ip.address": "Endereço IP do Nexus 1000v",
-    "label.cisco.nexus1000v.password": "Senha do Nexus 1000v",
-    "label.cisco.nexus1000v.username": "Usuário do Nexus 1000v",
-    "label.ciscovnmc.resource.details": "Detalhes de recurso CiscoVNMC",
-    "label.clean.up": "Limpar",
-    "label.clear.list": "Limpar lista",
-    "label.close": "Fechar",
-    "label.cloud.console": "Console de Gerenciamento da Nuvem",
-    "label.cloud.managed": "Cloud.com Managed",
-    "label.cluster": "Cluster",
-    "label.cluster.name": "Nome do Cluster",
-    "label.cluster.type": "Tipo de Cluster",
-    "label.clusters": "Clusters",
-    "label.clvm": "CLVM",
-    "label.code": "Código",
-    "label.community": "Comunidade",
-    "label.compute": "Computação",
-    "label.compute.and.storage": "Processamento e Armazenamento",
-    "label.compute.offering": "Oferta de Computação",
-    "label.compute.offerings": "Oferta de Computação",
-    "label.configuration": "Configuração",
-    "label.configure": "Configurar",
-    "label.configure.ldap": "Configurar LDAP",
-    "label.configure.network.ACLs": "Configure ACLs de rede",
-    "label.configure.sticky.policy": "Configurar Política Fixa",
-    "label.configure.vpc": "Configurar VPC",
-    "label.confirm.password": "Confirme a senha",
-    "label.confirmation": "Confirmação",
-    "label.congratulations": "Parabéns!",
-    "label.conserve.mode": "Modo Conservativo",
-    "label.console.proxy": "Console proxy",
-    "label.console.proxy.vm": "VM da Console Proxy",
-    "label.continue": "Continuar",
-    "label.continue.basic.install": "Continuar com a instalação básica",
-    "label.copying.iso": "Copiando ISO",
-    "label.corrections.saved": "Alterações salvas",
-    "label.counter": "Contador",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "CPU Alocada",
-    "label.cpu.allocated.for.VMs": "CPU Alocada por VMs",
-    "label.cpu.limits": "Limite de CPU",
-    "label.cpu.mhz": "CPU (em MHz)",
-    "label.cpu.utilized": "CPU Utilizada",
-    "label.create.VPN.connection": "Criar uma conexão VPN",
-    "label.create.nfs.secondary.staging.storage": "Cria Armazenamento NFS de Estágio Secundário",
-    "label.create.nfs.secondary.staging.store": "Criar storage staging secundário NFS",
-    "label.create.project": "Criar um projeto",
-    "label.create.ssh.key.pair": "Criar par de chaves SSH",
-    "label.create.template": "Criar template",
-    "label.created": "Criado",
-    "label.created.by.system": "Criado pelo sistema",
-    "label.cross.zones": "Inter Zonas",
-    "label.custom": "Customizado",
-    "label.custom.disk.iops": "IOPS personalizado",
-    "label.custom.disk.offering": "Oferta de Disco customizado",
-    "label.custom.disk.size": "Tamanho Customizado",
-    "label.daily": "Diário",
-    "label.data.disk.offering": "Oferta de Disco Adicional",
-    "label.date": "Data",
-    "label.day": "Dia",
-    "label.day.of.month": "Dia do Mês",
-    "label.day.of.week": "Dia da Semana",
-    "label.dc.name": "Nome do DC",
-    "label.dead.peer.detection": "Detecção de correspondente morto",
-    "label.decline.invitation": "Rejeitar convite",
-    "label.dedicate": "Dedicado",
-    "label.dedicate.cluster": "Cluster Dedicado",
-    "label.dedicate.host": "Dedica Host",
-    "label.dedicate.pod": "Pod Dedicado",
-    "label.dedicate.vlan.vni.range": "Range de VLAN/VNI Dedicado",
-    "label.dedicate.zone": "Zona Dedicada",
-    "label.dedicated": "Dedicado",
-    "label.dedicated.vlan.vni.ranges": "Range(s) de VLAN/VNI Dedicados",
-    "label.default": "Padrão",
-    "label.default.egress.policy": "Política padrão de egressão",
-    "label.default.use": "Uso padrão",
-    "label.default.view": "Visão Padrão",
-    "label.delete": "Remover",
-    "label.delete.BigSwitchBcf": "Remover BigSwitch BCF Controller",
-    "label.delete.BrocadeVcs": "Remover Brocade Vcs Switch",
-    "label.delete.F5": "Remover F5",
-    "label.delete.NetScaler": "Remover NetScaler",
-    "label.delete.NiciraNvp": "Remover Controlador Nvp",
-    "label.delete.OpenDaylight.device": "Apaga Controladora OpenDaylight",
-    "label.delete.PA": "Remover Palo Alto",
-    "label.delete.SRX": "Remover SRX",
-    "label.delete.VPN.connection": "deletar a conexão VPN",
-    "label.delete.VPN.customer.gateway": "deletar gateway de VPN de usuário",
-    "label.delete.VPN.gateway": "deletar um gateway de VPN",
-    "label.delete.acl.list": "Apagar Lista ACL",
-    "label.delete.affinity.group": "Deletar Grupo de Afinidade",
-    "label.delete.alerts": "Remover alertas",
-    "label.delete.baremetal.rack.configuration": "Deletar Configuração de Rack de Baremetal",
-    "label.delete.ciscoASA1000v": "Apaga CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Apaga recurso CiscoVNMC",
-    "label.delete.events": "Remover eventos",
-    "label.delete.gateway": "delete gateway",
-    "label.delete.internal.lb": "Apaga LB Interno",
-    "label.delete.portable.ip.range": "Deletar Endereços IPs Portáteis",
-    "label.delete.profile": "Apaga Perfil",
-    "label.delete.project": "Deletar projeto",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Apaga Armazenamento de Estágio Secundário",
-    "label.delete.ucs.manager": "Apaga Gerenciador UCS",
-    "label.delete.vpn.user": "Deletar usuário VPN",
-    "label.deleting.failed": "Falha ao remover",
-    "label.deleting.processing": "Removendo....",
-    "label.deny": "Negar",
-    "label.deployment.planner": "Deployment planejado",
-    "label.description": "Descrição",
-    "label.destination.physical.network.id": "ID de destino da rede física",
-    "label.destination.zone": "Zona de Destino",
-    "label.destroy": "Apagar",
-    "label.destroy.router": "Destruir roteador",
-    "label.destroy.vm.graceperiod": "Destruir Grace Period da VM",
-    "label.detaching.disk": "Desplugando Disco",
-    "label.details": "Detalhes",
-    "label.device.id": "ID do Dispositivo",
-    "label.devices": "Dispositivos",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "IP Público COnectado Diretamente",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "IPs Diretos",
-    "label.disable.autoscale": "Desabilita Auto-escala",
-    "label.disable.host": "Desabilita Host",
-    "label.disable.network.offering": "Desabilita oferta de rede",
-    "label.disable.provider": "Desabilitar Provider",
-    "label.disable.vnmc.provider": "Habilita provedor VNMC",
-    "label.disable.vpc.offering": "Desabilitar oferta VPC",
-    "label.disable.vpn": "Desabilitar VPN",
-    "label.disabled": "Desativado",
-    "label.disabling.vpn.access": "Desativando Acesso VPN",
-    "label.disassociate.profile.blade": "Desassocia Perfil de Lâmina",
-    "label.disbale.vnmc.device": "Desabilita dispositivo VNMC",
-    "label.disk.allocated": "Disco Alocado",
-    "label.disk.bytes.read.rate": "Taxa de Leitura do Disco (BPS)",
-    "label.disk.bytes.write.rate": "Taxa de Escrita no Disco (BPS)",
-    "label.disk.iops.max": "Máx IOPS",
-    "label.disk.iops.min": "Mín IOPS",
-    "label.disk.iops.read.rate": "Taxa de Leitura do Disco (IOPS)",
-    "label.disk.iops.total": "IOPS Total",
-    "label.disk.iops.write.rate": "Taxa de Escrita no Disco (IOPS)",
-    "label.disk.offering": "Oferta de Disco",
-    "label.disk.offering.details": "Detalhes da oferta de disco",
-    "label.disk.newOffering": "Nova oferta de disco",
-    "label.disk.newOffering.description": "Oferta de disco a ser aplicada no volume após migração.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Tipo de Provisionamento",
-    "label.disk.read.bytes": "Leitura do Disco (Bytes)",
-    "label.disk.read.io": "Leitura do Disk (I/O)",
-    "label.disk.size": "Tamanho do Disco",
-    "label.disk.size.gb": "Tamanho (em GB)",
-    "label.disk.total": "Disco Total",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Disco",
-    "label.disk.write.bytes": "Escrita no Disco (Bytes)",
-    "label.disk.write.io": "Escrita no Disco (I/O)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Mostrar Nome",
-    "label.display.text": "Descrição",
-    "label.distributedrouter": "Roteador Distribuido",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Domínio",
-    "label.domain.admin": "Administrador de Domínio",
-    "label.domain.details": "Detalhes do domínio",
-    "label.domain.id": "ID do Domínio",
-    "label.domain.lower": "domínio",
-    "label.domain.name": "Nome do Domínio",
-    "label.domain.router": "Roteador do Domínio",
-    "label.domain.suffix": "Sufixo de Domínio DNS (ex. xyz.com)",
-    "label.done": "Pronto",
-    "label.double.quotes.are.not.allowed": "Aspas duplas não são permitidas",
-    "label.download.progress": "Status do Download",
-    "label.drag.new.position": "Arrastar para uma nova posição",
-    "label.duration.in.sec": "Duração (em seg)",
-    "label.dynamically.scalable": "Dinamicamente Escalável",
-    "label.edit": "Editar",
-    "label.edit.acl.rule": "Edita regra ACL",
-    "label.edit.affinity.group": "Editar Grupo de Afinidade",
-    "label.edit.lb.rule": "Editar regra de LB",
-    "label.edit.network.details": "Editar detalhes de rede",
-    "label.edit.project.details": "Editar detalhes do projeto",
-    "label.edit.region": "Editar Região",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Editar regra",
-    "label.edit.secondary.ips": "Editar IPs secundários",
-    "label.edit.tags": "Edite etiquetas",
-    "label.edit.traffic.type": "Editar tipo de tráfego",
-    "label.edit.vpc": "Editar VPC",
-    "label.egress.default.policy": "Política de Entrada Padrão",
-    "label.egress.rule": "Regra Egress",
-    "label.egress.rules": "Regras de saída",
-    "label.elastic": "Elástico",
-    "label.elastic.IP": "IP Elástico",
-    "label.elastic.LB": "LB Elástico",
-    "label.email": "Email",
-    "label.email.lower": "email",
-    "label.enable.autoscale": "Habilita Auto-escala",
-    "label.enable.host": "Habilita Host",
-    "label.enable.network.offering": "Habilita oferta de rede",
-    "label.enable.provider": "Habilitar provider",
-    "label.enable.s3": "Habilita storage secundária fornecida por S3",
-    "label.enable.swift": "Habilitar Swift",
-    "label.enable.vnmc.device": "Habilita dispositivo VNMC",
-    "label.enable.vnmc.provider": "Habilita provedor VNMC",
-    "label.enable.vpc.offering": "Habilitar oferta VPC",
-    "label.enable.vpn": "Habilitar VPN",
-    "label.enabling.vpn": "Ativando VPN",
-    "label.enabling.vpn.access": "Ativando Acesso VPN",
-    "label.end.IP": "IP do fim",
-    "label.end.port": "Porta Final",
-    "label.end.reserved.system.IP": "Fim dos IPs reservados para o sistema",
-    "label.end.vlan": "VLAN final",
-    "label.end.vxlan": "VXLAN final",
-    "label.endpoint": "Ponto de acesso",
-    "label.endpoint.or.operation": "Endpoint or Operation",
-    "label.enter.token": "Digite o token",
-    "label.error": "Erro",
-    "label.error.code": "Código de Erro",
-    "label.error.upper": "ERRO",
-    "label.esx.host": "ESX/ESXi Host",
-    "label.event": "Eventos",
-    "label.event.archived": "Evento Arquivado",
-    "label.event.deleted": "Evento Detectado",
-    "label.every": "Cada",
-    "label.example": "Examplo",
-    "label.expunge": "Eliminar",
-    "label.external.link": "Link externo",
-    "label.extractable": "Extraível",
-    "label.extractable.lower": "extraível",
-    "label.f5": "F5",
-    "label.f5.details": "Detalhes do F5",
-    "label.failed": "Falhou",
-    "label.featured": "Featured",
-    "label.fetch.latest": "Obter últimos",
-    "label.filterBy": "Filtrar por",
-    "label.fingerprint": "Impressão Digital",
-    "label.firewall": "Firewall",
-    "label.first.name": "Primeiro Nome",
-    "label.firstname.lower": "primeiro nome",
-    "label.format": "Formato",
-    "label.format.lower": "formato",
-    "label.friday": "Sexta-feira",
-    "label.full": "Full",
-    "label.full.path": "Path completo",
-    "label.gateway": "Gateway",
-    "label.general.alerts": "Alertas Gerais",
-    "label.generating.url": "Criando URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "Configurar GloboDNS",
-    "label.gluster.volume": "Disco",
-    "label.go.step.2": "Vá para passo 2",
-    "label.go.step.3": "Vá para passo 3",
-    "label.go.step.4": "Vá para passo 4",
-    "label.go.step.5": "Vá para passo 5",
-    "label.gpu": "GPU",
-    "label.group": "Grupo",
-    "label.group.by.account": "Agrupamento por conta",
-    "label.group.by.cluster": "Grupo por cluster",
-    "label.group.by.pod": "Grupo por pod",
-    "label.group.by.zone": "Grupo por Zona",
-    "label.group.optional": "Grupo (Opcional)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Balanceamento de carga designado",
-    "label.gslb.assigned.lb.more": "Designe mais balanceamento de carga",
-    "label.gslb.delete": "Apaga GSLB",
-    "label.gslb.details": "Detalhes do GSLB",
-    "label.gslb.domain.name": "Nome do Domínio GSLB",
-    "label.gslb.lb.details": "Detalhes de balanceamento de carga",
-    "label.gslb.lb.remove": "Remova balanceamento de carga deste GSLB",
-    "label.gslb.lb.rule": "Regra de balanceamento de carga",
-    "label.gslb.service": "Serviço GSLB",
-    "label.gslb.service.private.ip": "Serviço GSLB - IP Privado",
-    "label.gslb.service.public.ip": "GSLB atende IP Público",
-    "label.gslb.servicetype": "Tipo do Serviço",
-    "label.guest": "Guest",
-    "label.guest.cidr": "CIDR de rede Convidado",
-    "label.guest.end.ip": "IP do fim do guest",
-    "label.guest.gateway": "Gateway de rede Convidado",
-    "label.guest.ip": "Endereço IP Convidado",
-    "label.guest.ip.range": "Intervalo de rede convidado",
-    "label.guest.netmask": "Máscara de rede Guest",
-    "label.guest.network.details": "Detalhes de rede convidada",
-    "label.guest.networks": "Redes Guest",
-    "label.guest.start.ip": "IP de início do guest",
-    "label.guest.traffic": "Tráfego de hóspedes",
-    "label.guest.traffic.vswitch.name": "Nome do vSwitch de Tráfego Convidado",
-    "label.guest.traffic.vswitch.type": "Tipo de vSwitch de Tráfego Convidado",
-    "label.guest.type": "Tipo de Guest",
-    "label.ha.enabled": "HA Ativado",
-    "label.health.check": "Checagem de Saúde",
-    "label.health.check.advanced.options": "Opções avançadas:",
-    "label.health.check.configurations.options": "Opções de configuração:",
-    "label.health.check.interval.in.sec": "Intervalo de Health Check (em seg)",
-    "label.health.check.message.desc": "Seu balanceador de carga realizará automaticamente verificações da saúde das suas instâncias no Cloudstack e irá rotear tráfego somente  para as instâncias que passarem nas verificações.",
-    "label.health.check.wizard": "Assistente de configuração de Health Check",
-    "label.healthy.threshold": "Limiar de Sanidade",
-    "label.help": "Ajuda",
-    "label.hide.ingress.rule": "Ocultar Regra de Entrada",
-    "label.hints": "Dicas",
-    "label.home": "Home",
-    "label.host": "Host",
-    "label.host.MAC": "Host MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Host Name",
-    "label.host.tag": "Tag de host",
-    "label.host.tags": "Tags de Host",
-    "label.hosts": "Hosts",
-    "label.hourly": "A cada hora",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "Rótulo de tráfego HyperV",
-    "label.hypervisor": "Hipervisor",
-    "label.hypervisor.capabilities": "Recursos de Virtualizador",
-    "label.hypervisor.snapshot.reserve": "Reserva de Snapshot do Hypervisor",
-    "label.hypervisor.type": "Tipo do Hypervisor",
-    "label.hypervisor.version": "Versão de Virtualizador",
-    "label.hypervisors": "Hypervisors",
-    "label.id": "ID",
-    "label.info": "Info",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Regra de Entrada",
-    "label.initiated.by": "Iniciado por",
-    "label.inside.port.profile": "Perfil de Porta Interna",
-    "label.installWizard.addClusterIntro.subtitle": "O que é um cluster?",
-    "label.installWizard.addClusterIntro.title": "Vamos adicionar um cluster",
-    "label.installWizard.addHostIntro.subtitle": "O que é um Host ?",
-    "label.installWizard.addHostIntro.title": "Vamos adicionar um host",
-    "label.installWizard.addPodIntro.subtitle": "O que é um pod ?",
-    "label.installWizard.addPodIntro.title": "Vamos adicionar um pod",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Qual é o storage primário ?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Vamos adicionar o storage primário",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Qual é o storage secundário ?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Vamos adicionar o storage secundário",
-    "label.installWizard.addZone.title": "Adicionar zona",
-    "label.installWizard.addZoneIntro.subtitle": "O que é uma zona?",
-    "label.installWizard.addZoneIntro.title": "Vamos adicionar uma zona",
-    "label.installWizard.click.launch": "Click no botão executar.",
-    "label.installWizard.subtitle": "Este tour vai auxiliar você na configuração da sua instalação de  CloudStack&#8482",
-    "label.installWizard.title": "Olá, seja bem vindo ao CloudStack&#8482",
-    "label.instance": "Instância",
-    "label.instance.limits": "Limites da Instância",
-    "label.instance.name": "Nome da Instância",
-    "label.instance.port": "Instanciar Porta",
-    "label.instance.scaled.up": "Instância escalada para a oferta solicitada",
-    "label.instances": "Instâncias",
-    "label.instanciate.template.associate.profile.blade": "Instancia Template e Associa Perfil à Lâmina",
-    "label.intermediate.certificate": "Certificado intermediário {0}",
-    "label.internal.dns.1": "DNS 1 Interno",
-    "label.internal.dns.2": "DNS 2 Interno",
-    "label.internal.lb": "LB interno",
-    "label.internal.lb.details": "Detalhes de LB Interno",
-    "label.internal.name": "Nome interno",
-    "label.internallbvm": "LbVm Interno",
-    "label.interval.type": "Tipo de Intervalo",
-    "label.introduction.to.cloudstack": "Introdução ao CloudStack&#8482",
-    "label.invalid.integer": "Invalid Integer",
-    "label.invalid.number": "Número inválido",
-    "label.invitations": "Convites",
-    "label.invite": "Convidar",
-    "label.invite.to": "Convidar para",
-    "label.invited.accounts": "Contas convidadas",
-    "label.ip": "IP",
-    "label.ip.address": "Endereço IP",
-    "label.ip.allocations": "Alocações de IP",
-    "label.ip.limits": "Limites de IP Público",
-    "label.ip.or.fqdn": "IP ou FQDN",
-    "label.ip.range": "Range de IP",
-    "label.ip.ranges": "Ranges de IP",
-    "label.ipaddress": "Endereço IP",
-    "label.ips": "IPs",
-    "label.ipv4.cidr": "CIDR IPv4",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IP FInal IPv4",
-    "label.ipv4.gateway": "Gateway IPV4",
-    "label.ipv4.netmask": "Máscara de Rede IPv4",
-    "label.ipv4.start.ip": "IP Inicial IPv4",
-    "label.ipv6.CIDR": "CIDR IPv6",
-    "label.ipv6.address": "Endereço IPv6",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IP FInal IPv6",
-    "label.ipv6.gateway": "Gateway IPv6",
-    "label.ipv6.start.ip": "IP Inicial IPv6",
-    "label.is.default": "ɉ Padrão",
-    "label.is.redundant.router": "Redundante",
-    "label.is.shared": "É Compartilhado",
-    "label.is.system": "é um sistema",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO de Boot",
-    "label.isolated.networks": "Redes Isoladas",
-    "label.isolation.method": "Método de isolamento",
-    "label.isolation.mode": "Modo Isolado",
-    "label.isolation.uri": "URI de isolamento",
-    "label.item.listing": "Listar items",
-    "label.japanese.keyboard": "Japanese keyboard",
-    "label.keep": "Manter",
-    "label.keep.colon": "Manter",
-    "label.key": "Chave",
-    "label.keyboard.language": "Linguagem do teclado",
-    "label.keyboard.type": "Tipo de Teclado",
-    "label.kvm.traffic.label": "Etiqueta de tráfego KVM",
-    "label.label": "Etiqueta",
-    "label.lang.arabic": "Arabe",
-    "label.lang.brportugese": "Português brasileiro",
-    "label.lang.catalan": "Catalão",
-    "label.lang.chinese": "Chinese (Simplified)",
-    "label.lang.dutch": "Holandês (Holanda)",
-    "label.lang.english": "English",
-    "label.lang.french": "Francês",
-    "label.lang.german": "Alemão",
-    "label.lang.hungarian": "Húngaro",
-    "label.lang.italian": "Italiano",
-    "label.lang.japanese": "Japanese",
-    "label.lang.korean": "Coreano",
-    "label.lang.norwegian": "Norueguês",
-    "label.lang.polish": "Polonês",
-    "label.lang.russian": "Russo",
-    "label.lang.spanish": "Spanish",
-    "label.last.disconnected": "Last Disconnected",
-    "label.last.name": "Último Nome",
-    "label.lastname.lower": "último nome",
-    "label.latest.events": "Últimos eventos",
-    "label.launch": "Executar",
-    "label.launch.vm": "Executar VM",
-    "label.launch.zone": "Executar zona.",
-    "label.lb.algorithm.leastconn": "Least connections",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "Origem",
-    "label.ldap.configuration": "Configuração do LDAP",
-    "label.ldap.group.name": "Grupo LDAP",
-    "label.ldap.link.type": "Tipo",
-    "label.ldap.port": "Porta do LDAP",
-    "label.level": "Nível",
-    "label.link.domain.to.ldap": "Link Domínio para LDAP",
-    "label.linklocal.ip": "Endereço IP do Link Local",
-    "label.load.balancer": "Load Balancer",
-    "label.load.balancer.type": "Tipo de Balanceamento de Carga",
-    "label.load.balancing": "Balanceamento de Carga",
-    "label.load.balancing.policies": "Políticas de balanceamento de carga",
-    "label.loading": "Carregando",
-    "label.local": "Local",
-    "label.local.file": "Arquivo local",
-    "label.local.storage": "Storage Local",
-    "label.local.storage.enabled": "Habilitar storage local para VMs de usuários",
-    "label.local.storage.enabled.system.vms": "Habilitar storage local para VMs de Sistema",
-    "label.login": "Entrar",
-    "label.logout": "Sair",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "Rótulo de tráfego LXC",
-    "label.make.project.owner": "Criar proprietário de conta de projeto",
-    "label.make.redundant": "Deixar redundante",
-    "label.manage": "Gerenciar",
-    "label.manage.resources": "Gerenciar Recursos",
-    "label.managed": "Gerenciado",
-    "label.management": "Gerenciamento",
-    "label.management.ips": "Gerenciamento de Endereços IP",
-    "label.management.server": "Servidor de Gerenciamento",
-    "label.max.cpus": "Máximo de cores de CPU",
-    "label.max.guest.limit": "Limite máx. de guest",
-    "label.max.instances": "Instâncias Max",
-    "label.max.memory": "Máx. de memória (MiB)",
-    "label.max.networks": "Máx. de redes",
-    "label.max.primary.storage": "Máx. primário (GiB)",
-    "label.max.public.ips": "Máx. IPs públicos",
-    "label.max.secondary.storage": "Max. Secundário (GiB)",
-    "label.max.snapshots": "Max. snapshots",
-    "label.max.templates": "Máx. templates",
-    "label.max.vms": "Máx. VMs de usuário",
-    "label.max.volumes": "Máx. volumes",
-    "label.max.vpcs": "Máx. VPCs",
-    "label.maximum": "Máximo",
-    "label.may.continue": "Você pode continuar agora",
-    "label.md5.checksum": "MD5 checksum",
-    "label.memory": "Memória (em MB)",
-    "label.memory.allocated": "Memória Alocada",
-    "label.memory.limits": "Limites de memória (MiB)",
-    "label.memory.mb": "Memória (em MB)",
-    "label.memory.total": "Memória Total",
-    "label.memory.used": "Memória Usada",
-    "label.menu.accounts": "Contas",
-    "label.menu.alerts": "Alertas",
-    "label.menu.all.accounts": "Todas as Contas",
-    "label.menu.all.instances": "Todas Instâncias",
-    "label.menu.community.isos": "ISOs Públicas",
-    "label.menu.community.templates": "Templates Públicos",
-    "label.menu.configuration": "Configuração",
-    "label.menu.dashboard": "Dashboard",
-    "label.menu.destroyed.instances": "Instâncias Apagadas",
-    "label.menu.disk.offerings": "Oferta de Discos",
-    "label.menu.domains": "Domínios",
-    "label.menu.events": "Eventos",
-    "label.menu.featured.isos": "ISOs Customizada",
-    "label.menu.featured.templates": "Templates Customizados",
-    "label.menu.global.settings": "Configurações Globais",
-    "label.menu.infrastructure": "Infra-estrutura",
-    "label.menu.instances": "Instâncias",
-    "label.menu.ipaddresses": "Endereços IP",
-    "label.menu.isos": "ISOs",
-    "label.menu.my.accounts": "Minhas Contas",
-    "label.menu.my.instances": "Minhas Instâncias",
-    "label.menu.my.isos": "Minhas ISOs",
-    "label.menu.my.templates": "Meus Templates",
-    "label.menu.network": "Rede",
-    "label.menu.network.offerings": "Oferta de Rede",
-    "label.menu.physical.resources": "Recursos Bá­sicos",
-    "label.menu.regions": "Regiões",
-    "label.menu.running.instances": "Instâncias Rodando",
-    "label.menu.security.groups": "Grupos de segurança",
-    "label.menu.service.offerings": "Oferta de Serviços",
-    "label.menu.snapshots": "Snapshots",
-    "label.menu.sshkeypair": "SSH KeyPair",
-    "label.menu.stopped.instances": "Instâncias Paradas",
-    "label.menu.storage": "Storage",
-    "label.menu.system": "Sistema",
-    "label.menu.system.service.offerings": "Ofertas do Sistema",
-    "label.menu.system.vms": "VM de Sistemas",
-    "label.menu.templates": "Templates",
-    "label.menu.virtual.appliances": "Appliance Virtual",
-    "label.menu.virtual.resources": "Recursos Virtuais",
-    "label.menu.volumes": "Discos",
-    "label.menu.vpc.offerings": "Ofertas VPC",
-    "label.metrics": "Metricas",
-    "label.metrics.allocated": "Alocado",
-    "label.metrics.clusters": "Clusters",
-    "label.metrics.cpu.allocated": "Alocação de CPU",
-    "label.metrics.cpu.max.dev": "Desvio",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "Utilização de",
-    "label.metrics.cpu.used.avg": "Usado",
-    "label.metrics.disk": "Disco",
-    "label.metrics.disk.allocated": "Alocado",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Leitura",
-    "label.metrics.disk.size": "Tamanho",
-    "label.metrics.disk.storagetype": "Tipo",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Não alocado",
-    "label.metrics.disk.usage": "Utilização do Disco",
-    "label.metrics.disk.used": "Usado",
-    "label.metrics.disk.write": "Escrita",
-    "label.metrics.hosts": "Hosts",
-    "label.metrics.memory.allocated": "Alocação de Memória",
-    "label.metrics.memory.max.dev": "Desvio",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Utilização de Memória",
-    "label.metrics.memory.used.avg": "Usado",
-    "label.metrics.name": "Nome",
-    "label.metrics.network.read": "Leitura",
-    "label.metrics.network.usage": "Utilização de Rede",
-    "label.metrics.network.write": "Escrita",
-    "label.metrics.num.cpu.cores": "Núcleos",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Propriedade",
-    "label.metrics.scope": "Escopo",
-    "label.metrics.state": "Estado",
-    "label.metrics.storagepool": "Pool de Armazanamento",
-    "label.metrics.vm.name": "Nome da VM",
-    "label.migrate.instance.to": "Migrar Instância para",
-    "label.migrate.instance.to.host": "Migrar instância para outro host",
-    "label.migrate.instance.to.ps": "Migrar instância para outro storage primário",
-    "label.migrate.lb.vm": "Migre LB VM",
-    "label.migrate.router.to": "Migrar Roteador para",
-    "label.migrate.systemvm.to": "Migrar VM de sistema para",
-    "label.migrate.to.host": "Migrar para outro host",
-    "label.migrate.to.storage": "Migrar para storage",
-    "label.migrate.volume": "Migrar Volume",
-    "label.migrate.volume.to.primary.storage": "Migrar volume para outro storage primário",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Instâncias Min",
-    "label.min.past.the.hr": "minutos passados da última hora",
-    "label.minimum": "Mí­nimo",
-    "label.minute.past.hour": "minuto(s) passado(s) da última hora",
-    "label.minutes.past.hour": "minuto(s) passados da última hora",
-    "label.mode": "Modo",
-    "label.monday": "Segunda",
-    "label.monthly": "Mensal",
-    "label.more.templates": "Mais Templates",
-    "label.move.down.row": "Mover uma célula para baixo",
-    "label.move.to.bottom": "Mover para baixo",
-    "label.move.to.top": "Mover para o topo",
-    "label.move.up.row": "Mover uma célula para cima",
-    "label.my.account": "Minha Conta",
-    "label.my.network": "Minha rede",
-    "label.my.templates": "Meus templates",
-    "label.na": "N/D",
-    "label.name": "Nome",
-    "label.name.lower": "Nome",
-    "label.name.optional": "Nome (Opcional)",
-    "label.nat.port.range": "Range de Portas NAT",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Máscara de Rede",
-    "label.netscaler.details": "Detalhes do NetScaler",
-    "label.network": "Rede",
-    "label.network.ACL": "ACL de rede",
-    "label.network.ACL.total": "Total de rede ACL",
-    "label.network.ACLs": "Network ACLs",
-    "label.network.addVM": "Adicionar rede para VM",
-    "label.network.cidr": "CIDR da Rede",
-    "label.network.desc": "Descrição de Rede",
-    "label.network.details": "Detalhes da rede",
-    "label.network.device": "Dispositivo de Rede",
-    "label.network.device.type": "Tipo de Dispositivo de Rede",
-    "label.network.domain": "Domínio de Rede",
-    "label.network.domain.text": "Texto do domínio de rede",
-    "label.network.id": "ID de Rede",
-    "label.network.label.display.for.blank.value": "Utilizar gateway default",
-    "label.network.limits": "Limites de rede",
-    "label.network.name": "Nome da Rede",
-    "label.network.offering": "Network Offering",
-    "label.network.offering.details": "Detalhes da oferta de rede",
-    "label.network.offering.display.text": "Network Offering Display Text",
-    "label.network.offering.id": "Network Offering ID",
-    "label.network.offering.name": "Network Offering Name",
-    "label.network.rate": "Taxa de Transferência",
-    "label.network.rate.megabytes": "Taxa de Rede (MB/s)",
-    "label.network.read": "Network Read",
-    "label.network.service.providers": "Provedores de Serviços de Rede",
-    "label.network.type": "Tipo de Rede",
-    "label.network.write": "Network Write",
-    "label.networking.and.security": "Rede e segurança",
-    "label.networks": "Redes",
-    "label.new": "Novo",
-    "label.new.password": "Nova Senha",
-    "label.current.password": "Senha Antiga",
-    "label.new.project": "Novo Projeto",
-    "label.new.ssh.key.pair": "Novo par de chaves SSH",
-    "label.new.vm": "Nova VM",
-    "label.next": "Próximo",
-    "label.nexusVswitch": "Nexus Vswitch",
-    "label.nfs": "NFS",
-    "label.nfs.server": "Servidor NFS",
-    "label.nfs.storage": "Storage NFS",
-    "label.nic.adapter.type": "Tipo de adaptador de Rede",
-    "label.nicira.controller.address": "Endereço do Controlador",
-    "label.nicira.l2gatewayserviceuuid": "Uuid do Serviço de Gateway L2",
-    "label.nicira.l3gatewayserviceuuid": "Uuid do Serviço de Gateway L3",
-    "label.nicira.nvp.details": "Detalhes do Nicira NVP",
-    "label.nicira.transportzoneuuid": "Uuid da Zona de Transporte",
-    "label.nics": "Adaptadores de Rede",
-    "label.no": "Não",
-    "label.no.actions": "Sem Ações Disponíveis",
-    "label.no.alerts": "Sem Alertas Recentes",
-    "label.no.data": "Sem dados para mostrar",
-    "label.no.errors": "Sem Erros Recentes",
-    "label.no.grouping": "(sem agrupamento)",
-    "label.no.isos": "Sem ISO Disponível",
-    "label.no.items": "Sem Itens Disponíveis",
-    "label.no.security.groups": "Sem Security Groups Disponíveis",
-    "label.no.thanks": "Não obrigado",
-    "label.none": "Nenhum",
-    "label.not.found": "Não Encontrado",
-    "label.notifications": "Notificações",
-    "label.num.cpu.cores": "# de Core CPU",
-    "label.number.of.clusters": "Número de Clusters",
-    "label.number.of.cpu.sockets": "O Número de Sockets de CPU",
-    "label.number.of.hosts": "Número de Hosts",
-    "label.number.of.pods": "Número de Pods",
-    "label.number.of.system.vms": "Número de VMs de sistema",
-    "label.number.of.virtual.routers": "Número de Roteadores Virtuais",
-    "label.number.of.zones": "Número de Zonas",
-    "label.numretries": "Número de Tentativas",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "do mês",
-    "label.offer.ha": "Offer HA",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "Controlador OpenDaylight",
-    "label.opendaylight.controllerdetail": "Detalhes do Controlador OpenDaylight",
-    "label.opendaylight.controllers": "Controladores OpenDaylight",
-    "label.operator": "Operador",
-    "label.optional": "Opcional",
-    "label.order": "Ordenar",
-    "label.os.preference": "Preferência de SO",
-    "label.os.type": "Tipo de SO",
-    "label.other": "Outro",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Ação",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Endereço",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Senha",
-    "label.outofbandmanagement.port": "Porta",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Nome de usuário",
-    "label.override.guest.traffic": "Anula Tráfego Convidado",
-    "label.override.public.traffic": "Sobrepõe Tráfego Público",
-    "label.ovm.traffic.label": "Rótulo de tráfego OVM",
-    "label.ovm3.cluster": "Native Clustering",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "Label de trafego OVM3",
-    "label.ovm3.vip": "IP principal do Vip",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "IP Público Utilizado",
-    "label.owner.account": "Dono da Conta",
-    "label.owner.domain": "Dono do Domínio",
-    "label.palo.alto.details": "Detalhes do Palo Alto",
-    "label.parent.domain": "Domínio Principal",
-    "label.passive": "Passivo",
-    "label.password": "Senha",
-    "label.password.enabled": "Senha Ativada",
-    "label.password.lower": "senha",
-    "label.password.reset.confirm": "A senha foi recuperada para",
-    "label.path": "Caminho (Path)",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permissão",
-    "label.persistent": "Persistente",
-    "label.physical.network": "Rede Física",
-    "label.physical.network.ID": "ID da rede física",
-    "label.physical.network.name": "Nome da rede física",
-    "label.ping.path": "Caminho do Ping",
-    "label.planner.mode": "Modo planejado",
-    "label.please.complete.the.following.fields": "Por favor, preencha os seguintes campos",
-    "label.please.specify.netscaler.info": "Por favor especifique as informações do Netscaler",
-    "label.please.wait": "Por Favor Aguarde",
-    "label.plugin.details": "Detalhes do plugin",
-    "label.plugins": "Plugins",
-    "label.pod": "POD",
-    "label.pod.dedicated": "Pod Dedicado",
-    "label.pod.name": "Nome do Pod",
-    "label.pods": "Pods",
-    "label.polling.interval.sec": "Intervalo de Polling (em seg)",
-    "label.port": "Porta",
-    "label.port.forwarding": "Encaminhamento de Porta",
-    "label.port.forwarding.policies": "Políticas de redirecionamento de portas",
-    "label.port.range": "Range de Porta",
-    "label.portable.ip": "IP Portável",
-    "label.portable.ip.range.details": "Detalhes de Range de IP Portáveis",
-    "label.portable.ip.ranges": "Faixa de endereços IPs Portável",
-    "label.portable.ips": "IPs Portáveis",
-    "label.powerstate": "Power State",
-    "label.prev": "Prev",
-    "label.previous": "Anterior",
-    "label.primary.allocated": "Alocação do Storage Primário",
-    "label.primary.network": "Rede Primária",
-    "label.primary.storage": "Storage Primário",
-    "label.primary.storage.count": "Pools de Storage Primários",
-    "label.primary.storage.limits": "Limites do Storage Primário (GiB)",
-    "label.primary.used": "Uso do Storage Primário",
-    "label.private.Gateway": "Gateway privado",
-    "label.private.interface": "Interface Privada",
-    "label.private.ip": "Endereço IP Privado",
-    "label.private.ip.range": "Range de IP Privado",
-    "label.private.ips": "IPs Privados",
-    "label.private.key": "Chave privada",
-    "label.private.network": "Rede Privada",
-    "label.private.port": "Porta Privada",
-    "label.private.zone": "Zona Privada",
-    "label.privatekey": "PKCS#8 Private Key",
-    "label.profile": "Perfil",
-    "label.project": "Projeto",
-    "label.project.dashboard": "Dashboard do Projeto",
-    "label.project.id": "ID de Projeto",
-    "label.project.invite": "Convidar para o projeto",
-    "label.project.name": "Nome de projeto",
-    "label.project.view": "Visão de Projeto",
-    "label.projects": "Projetos",
-    "label.protocol": "Protocolo",
-    "label.protocol.number": "Número do Protocolo",
-    "label.protocol.number.short" : "#Protocolo",
-    "label.provider": "Provedor",
-    "label.providers": "Providers",
-    "label.public": "Público",
-    "label.public.interface": "Interface Pública",
-    "label.public.ip": "Endereço IP Público",
-    "label.public.ips": "IPs Públicos",
-    "label.public.key": "Chave pública",
-    "label.public.lb": "LB público",
-    "label.public.load.balancer.provider": "Provedor Público de Balanceamento de Carga",
-    "label.public.network": "Rede Pública",
-    "label.public.port": "Porta Pública",
-    "label.public.traffic": "Tráfego Público",
-    "label.public.traffic.vswitch.name": "Nome do vSwitch de Tráfego Público",
-    "label.public.traffic.vswitch.type": "Tipo de vSwitch de Tráfego Público",
-    "label.public.zone": "Zona Pública",
-    "label.purpose": "Propósito",
-    "label.qos.type": "Tipo de QoS",
-    "label.quickview": "Visualização rápida",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Tempo Silencioso (em seg)",
-    "label.quota.add.credits": "Adicionar Cru00e9ditos",
-    "label.quota.balance": "Saldo",
-    "label.quota.configuration": "Configurau00e7u00e3o da Tarifa",
-    "label.quota.configure": "Configure a Cota",
-    "label.quota.credit": "Cru00e9dito",
-    "label.quota.credits": "Cru00e9ditos",
-    "label.quota.date": "Data",
-    "label.quota.dates": "Atualizar Data",
-    "label.quota.description": "Descriu00e7u00e3o",
-    "label.quota.email.body": "Corpo do Email",
-    "label.quota.email.lastupdated": "u00daltima atualizau00e7u00e3o",
-    "label.quota.email.subject": "Assunto",
-    "label.quota.email.template": "Template de Email",
-    "label.quota.enddate": "Data de Fim",
-    "label.quota.endquota": "Fim",
-    "label.quota.enforcequota": "Bloquear Conta pu00f3s Limite",
-    "label.quota.fullsummary": "Todas as Contas",
-    "label.quota.minbalance": "Saldo Mu00ednimo",
-    "label.quota.remove": "Remover Cota",
-    "label.quota.startdate": "Data de Inu00edcio",
-    "label.quota.startquota": "Inu00edcio",
-    "label.quota.state": "Estado",
-    "label.quota.statement": "Demonstrativo",
-    "label.quota.statement.balance": "Saldo",
-    "label.quota.statement.bydates": "Demonstrativo",
-    "label.quota.statement.quota": "Utilizau00e7u00e3o",
-    "label.quota.statement.tariff": "Tarifa",
-    "label.quota.summary": "Sumu00e1rio",
-    "label.quota.tariff": "Tarifa",
-    "label.quota.tariff.edit": "Editar Tarifa",
-    "label.quota.tariff.effectivedate": "Data Efetiva",
-    "label.quota.tariff.value": "Valor da Tarifa",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Uso Total",
-    "label.quota.type.name": "Tipo",
-    "label.quota.type.unit": "Unidade",
-    "label.quota.usage": "Consumo da Cota",
-    "label.quota.value": "Valor",
-    "label.rbd": "RDB",
-    "label.rbd.id": "Usuário Ceph",
-    "label.rbd.monitor": "Monitor Ceph",
-    "label.rbd.pool": "Pool Ceph",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "Reiniciar",
-    "label.recent.errors": "Erros Recentes",
-    "label.recover.vm": "Recuperar VM",
-    "label.redundant.router": "Roteador Redundantee",
-    "label.redundant.router.capability": "Recurso de roteador redundante",
-    "label.redundant.state": "Estado redundante",
-    "label.redundant.vpc": "VPC Redundante",
-    "label.refresh": "Atualizar",
-    "label.refresh.blades": "Atualizar Lâminas",
-    "label.region": "Região",
-    "label.region.details": "Detalhes da região",
-    "label.regionlevelvpc": "VPC a Nível de Região",
-    "label.reinstall.vm": "Reinstalar VM",
-    "label.related": "Relacionado",
-    "label.release.account": "Liberar de Conta",
-    "label.release.account.lowercase": "LIberar de conta",
-    "label.release.dedicated.cluster": "Libera Cluster Dedicado",
-    "label.release.dedicated.host": "Libera Host Dedicado",
-    "label.release.dedicated.pod": "LIberar Pod Dedicado",
-    "label.release.dedicated.vlan.range": "Liberar range de VLAN dedicado",
-    "label.release.dedicated.zone": "Liberar Zona Dedicada",
-    "label.remind.later": "Me lembre depois",
-    "label.remove.ACL": "Remove ACL",
-    "label.remove.egress.rule": "Remover regra egress",
-    "label.remove.from.load.balancer": "Removendo Instância do balanceador de carga",
-    "label.remove.ingress.rule": "Remover regra ingress",
-    "label.remove.ip.range": "Remover range de IP",
-    "label.remove.ldap": "Remover LDAP",
-    "label.remove.network.offering": "Remove oferta de rede",
-    "label.remove.pf": "Remover regra de redirecionamento de porta",
-    "label.remove.project.account": "Remover conta de projeto",
-    "label.remove.region": "Remover Região",
-    "label.remove.rule": "Remover regra",
-    "label.remove.ssh.key.pair": "Remover par de chaves SSH",
-    "label.remove.static.nat.rule": "Remover regra de NAT estático",
-    "label.remove.static.route": "Remover rota estática",
-    "label.remove.this.physical.network": "Remover esta rede física",
-    "label.remove.tier": "Remover camada",
-    "label.remove.vm.from.lb": "Remover VM da regra de balanceamento de carga",
-    "label.remove.vm.load.balancer": "Remover VM do balanceamento de carga",
-    "label.remove.vmware.datacenter": "Remover Datacenter VMware",
-    "label.remove.vpc": "remover a VPC",
-    "label.remove.vpc.offering": "Remover oferta VPC",
-    "label.removing": "Removendo",
-    "label.removing.user": "Removendo Usuário",
-    "label.reource.id": "ID do Recurso",
-    "label.replace.acl": "Substituir ACL",
-    "label.replace.acl.list": "Substituir Lista ACL",
-    "label.required": "Obrigatório",
-    "label.requires.upgrade": "Requer Atualização",
-    "label.reserved.ip.range": "Faixa de IP Reservada",
-    "label.reserved.system.gateway": "Gateway de sistema reservado",
-    "label.reserved.system.ip": "IP de Sistema Reservado",
-    "label.reserved.system.netmask": "Máscara de rede reservada do sistema",
-    "label.reset.VPN.connection": "Resetar a conexão VPN",
-    "label.reset.ssh.key.pair": "Recriar par de chaves SSH",
-    "label.reset.ssh.key.pair.on.vm": "Recriar par de chaves SSH na VM",
-    "label.resetVM": "Restabelecer VM",
-    "label.resize.new.offering.id": "New Offering",
-    "label.resize.new.size": "Novo Tamanho (GB)",
-    "label.resize.shrink.ok": "Shrink OK",
-    "label.resource": "Recurso",
-    "label.resource.limit.exceeded": "Limite de Recurso Excedido",
-    "label.resource.limits": "Limite de Recursos",
-    "label.resource.name": "Nome do Recurso",
-    "label.resource.state": "Estado do Recurso",
-    "label.resources": "Recursos",
-    "label.response.timeout.in.sec": "Timeout de Resposta (em seg)",
-    "label.restart.network": "Reiniciar rede",
-    "label.restart.required": "Reiniciar obrigatório",
-    "label.restart.vpc": "reiniciar a VPC",
-    "label.restore": "Restaurar",
-    "label.retry.interval": "Intervalo de repetição",
-    "label.review": "Revisar",
-    "label.revoke.project.invite": "Revogar convite",
-    "label.role": "Função",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Certificado Root",
-    "label.root.disk.controller": "Controlador do disco Root",
-    "label.root.disk.offering": "Oferta de Disco ROOT",
-    "label.root.disk.size": "Tamanho do disco root (GB)",
-    "label.router.vm.scaled.up": "VM do Roteador Escalonada",
-    "label.routing": "Roteamento",
-    "label.routing.host": "Host de Roteamento",
-    "label.rule": "Regra",
-    "label.rule.number.short": "#Regra",
-    "label.rule.number": "Regra Número",
-    "label.rules": "Regras",
-    "label.running.vms": "VMs Rodando",
-    "label.s3.access_key": "Chave de acesso",
-    "label.s3.bucket": "Balde",
-    "label.s3.connection_timeout": "Tempo limite de conexão",
-    "label.s3.endpoint": "Ponto de acesso",
-    "label.s3.max_error_retry": "Limite de tentativas de recuperação de erro",
-    "label.s3.nfs.path": "Caminho NFS S3",
-    "label.s3.nfs.server": "Servidor NFS S3",
-    "label.s3.secret_key": "Chave Secreta",
-    "label.s3.socket_timeout": "Tempo limite no socket",
-    "label.s3.use_https": "Use HTTPS",
-    "label.saml.enable": "Autorizar SAML SSO",
-    "label.saml.entity": "Provedor de Identidade",
-    "label.saturday": "Sábado",
-    "label.save": "Salvar",
-    "label.save.and.continue": "Salvar e continuar",
-    "label.save.changes": "Salvar alterações",
-    "label.saving.processing": "Salvando....",
-    "label.scale.up.policy": "Política de Escalonamento",
-    "label.scaledown.policy": "Política de redução",
-    "label.scaleup.policy": "Política de ampliação",
-    "label.scope": "Escopo",
-    "label.search": "Pesquisar",
-    "label.secondary.ips": "IPs secundários",
-    "label.secondary.isolated.vlan.id": "ID de VLAN Secundária Isolada",
-    "label.secondary.staging.store": "Armazenamento de Estágio Secundário",
-    "label.secondary.staging.store.details": "Detalhes do Armazenamento de Estágio Secundário",
-    "label.secondary.storage": "Storage Secundário",
-    "label.secondary.storage.count": "Pools de Storage secundários",
-    "label.secondary.storage.details": "Detalhes de armazenamento secundário",
-    "label.secondary.storage.limits": "Limites do Storage Secundário (GiB)",
-    "label.secondary.storage.vm": "VM de storage secundário",
-    "label.secondary.used": "Uso do Storage Secundário",
-    "label.secret.key": "Chave Secreta",
-    "label.security.group": "Security Group",
-    "label.security.group.name": "Nome do Security Group",
-    "label.security.groups": "Grupos de segurança",
-    "label.security.groups.enabled": "Security Groups Ativado",
-    "label.select": "Selecionar",
-    "label.select-view": "Selecionar visualização",
-    "label.select.a.template": "Selecione um template",
-    "label.select.a.zone": "Selecione uma zona",
-    "label.select.instance": "Selecionar instância",
-    "label.select.instance.to.attach.volume.to": "Escolha uma instância para conectar o volume",
-    "label.select.iso.or.template": "Selecione ISO ou template",
-    "label.select.offering": "Selecionar Oferta",
-    "label.select.project": "Selecionar Projeto",
-    "label.select.region": "Selecione Região",
-    "label.select.template": "Seleciona Template",
-    "label.select.tier": "Selecione camada",
-    "label.select.vm.for.static.nat": "Selecionar VM para NAT estático",
-    "label.sent": "Enviado",
-    "label.server": "Servidor",
-    "label.service.capabilities": "Recursos de serviços",
-    "label.service.offering": "Plano",
-    "label.service.offering.details": "Detalhes da oferta de serviço",
-    "label.service.state": "Estado do Serviço",
-    "label.services": "Serviços",
-    "label.session.expired": "Sessão Expirada",
-    "label.set.default.NIC": "Configurar para NIC padrão",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Configurar tipo de zona",
-    "label.settings": "Ajustes",
-    "label.setup": "Configuração",
-    "label.setup.network": "Configurar Rede",
-    "label.setup.zone": "Configurar Zona",
-    "label.shared": "Compatilhado",
-    "label.show.advanced.settings": "Mostra ajustes avançados",
-    "label.show.ingress.rule": "Mostrar Regra de Entrada",
-    "label.shutdown.provider": "Desabilitar provider",
-    "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Tamanho",
-    "label.skip.guide": "Eu utilizei o CloudStack antes, pular este guia",
-    "label.smb.domain": "Domínio SMB",
-    "label.smb.password": "Senha SMB",
-    "label.smb.username": "Usuário SMB",
-    "label.snapshot": "Snapshot",
-    "label.snapshot.limits": "Limites de Snapshot",
-    "label.snapshot.name": "Nome do Snapshot",
-    "label.snapshot.s": "Snapshots",
-    "label.snapshot.schedule": "Configurar Snapshot Recorrente",
-    "label.snapshots": "Snapshots",
-    "label.sockets": "Sockets",
-    "label.source.ip.address": "Endereço IP de origem",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT Supportado",
-    "label.source.port": "Porta de origem",
-    "label.specify.IP.ranges": "Especifique range de IP",
-    "label.specify.vlan": "Especificar VLAN",
-    "label.specify.vxlan": "Especificar VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "Detalhes do SRX",
-    "label.ssh.key.pair": "Par de chaves SSH",
-    "label.ssh.key.pair.details": "Detalhes do par de chaves SSH",
-    "label.ssh.key.pairs": "Par de chaves SSH",
-    "label.standard.us.keyboard": "Standard (US) keyboard",
-    "label.start.IP": "IP do início",
-    "label.start.lb.vm": "Iniciar LB VM",
-    "label.start.port": "Porta de Início",
-    "label.start.reserved.system.IP": "Início dos IPs reservados para o sistema",
-    "label.start.vlan": "VLAN Inicial",
-    "label.start.vxlan": "VXLAN Inicial",
-    "label.state": "Estado",
-    "label.static.nat": "NAT Estático",
-    "label.static.nat.enabled": "NAT estático Habilitado",
-    "label.static.nat.to": "NAT Estático para",
-    "label.static.nat.vm.details": "Detalhes de NAT estático da VM",
-    "label.static.routes": "Rotas estáticas",
-    "label.statistics": "Estatísticas",
-    "label.status": "Estado",
-    "label.step.1": "Passo 1",
-    "label.step.1.title": "Passo 1: <strong>Selecione o Template</strong>",
-    "label.step.2": "Passo 2",
-    "label.step.2.title": "Passo 2: <strong>Plano</strong>",
-    "label.step.3": "Passo 3",
-    "label.step.3.title": "Passo 3: <strong id=\"step3_label\">Selecione o Disco Adicional</strong>",
-    "label.step.4": "Passo 4",
-    "label.step.4.title": "Passo 4: <strong>Rede</strong>",
-    "label.step.5": "Passo 5",
-    "label.step.5.title": "Passo 5: <strong>Revisar</strong>",
-    "label.stickiness": "Aderência",
-    "label.stickiness.method": "Método de Stickness",
-    "label.sticky.cookie-name": "Nome do Cookie",
-    "label.sticky.domain": "Domínio",
-    "label.sticky.expire": "Expires",
-    "label.sticky.holdtime": "Tempo de espera",
-    "label.sticky.indirect": "Indireto",
-    "label.sticky.length": "Tamanho",
-    "label.sticky.mode": "Modo",
-    "label.sticky.name": "Nome Sticky",
-    "label.sticky.nocache": "Sem Cache",
-    "label.sticky.postonly": "Apenas publicar",
-    "label.sticky.prefix": "Prefixo",
-    "label.sticky.request-learn": "Solicitar para aprender",
-    "label.sticky.tablesize": "Tamanho da Tabela",
-    "label.stop": "Parar",
-    "label.stop.lb.vm": "Pare LB VM",
-    "label.stopped.vms": "VMs Paradas",
-    "label.storage": "Storage",
-    "label.storage.pool": "Pool de Armazanamento",
-    "label.storage.tags": "Tags de Storage",
-    "label.storage.traffic": "Tráfego do Storage",
-    "label.storage.type": "Tipo de Storage",
-    "label.subdomain.access": "Acesso ao subdomínio",
-    "label.submit": "Enviar",
-    "label.submitted.by": "[Enviado por: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Sucedido",
-    "label.sunday": "Domingo",
-    "label.super.cidr.for.guest.networks": "Super CIDR para redes hóspedes",
-    "label.supported.services": "Serviços Suportados",
-    "label.supported.source.NAT.type": "Tipo de Source NAT Suportado",
-    "label.supportsstrechedl2subnet": "Suporte à Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Suspender Projeto",
-    "label.switch.type": "Tipo de Switch",
-    "label.system.capacity": "Capacidade do Sistema",
-    "label.system.offering": "Ofertas de Sistema",
-    "label.system.offering.for.router": "Oferta do Sistema para Roteador",
-    "label.system.service.offering": "System Service Offering",
-    "label.system.service.offering.details": "Detalhes da oferta de serviço de sistema",
-    "label.system.vm": "VM de Sistema",
-    "label.system.vm.details": "Detalhes do System VM",
-    "label.system.vm.scaled.up": "System VM Escalonada",
-    "label.system.vm.type": "Tipo de VM de Sistema",
-    "label.system.vms": "VM de Sistemas",
-    "label.system.wide.capacity": "Capacidade Total do Sistema",
-    "label.tag.key": "Chave",
-    "label.tag.value": "Valor",
-    "label.tagged": "Tagged",
-    "label.tags": "Tags",
-    "label.target.iqn": "Target IQN",
-    "label.task.completed": "Tarefa completa",
-    "label.template": "Template",
-    "label.template.limits": "Limites do Template",
-    "label.tftp.root.directory": "Diretório raiz do tftp",
-    "label.theme.default": "Tema Padrão",
-    "label.theme.grey": "Custom - Grey",
-    "label.theme.lightblue": "Custom - Light Blue",
-    "label.threshold": "Limiar",
-    "label.thursday": "Quinta",
-    "label.tier": "Camada",
-    "label.tier.details": "Detalhes da camada",
-    "label.time": "Time",
-    "label.time.colon": "Tempo:",
-    "label.time.zone": "Fuso Horário",
-    "label.timeout": "Timeout",
-    "label.timeout.in.second ": " Timeout (segundos)",
-    "label.timezone": "Fuso Horário",
-    "label.timezone.colon": "Fuso Horário",
-    "label.token": "Token",
-    "label.total.CPU": "CPU TOTAL",
-    "label.total.cpu": "CPU TOTAL",
-    "label.total.hosts": "Total de Hosts",
-    "label.total.memory": "Total de Memória",
-    "label.total.of.ip": "Total de Endereços IPs",
-    "label.total.of.vm": "Total VMs",
-    "label.total.storage": "Totam de Storage",
-    "label.total.virtual.routers": "Total de Roteadores Virtuais",
-    "label.total.virtual.routers.upgrade": "Total de Roteadores Virtuais que requerem atualização",
-    "label.total.vms": "Total VMs",
-    "label.traffic.label": "Etiqueta de tráfego",
-    "label.traffic.type": "Tipo de Tráfego",
-    "label.traffic.types": "Tipos de Tráfego",
-    "label.tuesday": "Terça",
-    "label.type": "Tipo",
-    "label.type.id": "Tipo do ID",
-    "label.type.lower": "tipo",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK keyboard",
-    "label.unavailable": "Indisponível",
-    "label.unhealthy.threshold": "Limiar de Insalubridade",
-    "label.unlimited": "Ilimitado",
-    "label.untagged": "Não Marcado",
-    "label.update.project.resources": "Atualizar recursos de projeto",
-    "label.update.ssl": " Atualizar Certificado SSL",
-    "label.update.ssl.cert": " Atualizar Certificado SSL",
-    "label.updating": "Atualizando",
-    "label.upgrade.required": "Atualização é necessária",
-    "label.upgrade.router.newer.template": "Atualize Roteador Para Usar Template Mais Novo",
-    "label.upload": "Enviar",
-    "label.upload.from.local": "Fazer upload local",
-    "label.upload.template.from.local": "Upload de Template Local",
-    "label.upload.volume": "Enviar o Volume",
-    "label.upload.volume.from.local": "Upload de Volume Local",
-    "label.upload.volume.from.url": "Upload de volume por URL",
-    "label.url": "URL",
-    "label.usage.interface": "Usage Interface",
-    "label.usage.sanity.result": "Resultado de Sanidade de Uso",
-    "label.usage.server": "Uso do Servidor",
-    "label.usage.type": "Uso Tipo",
-    "label.usage.unit": "Unidade",
-    "label.use.vm.ip": "Usar IP da VM:",
-    "label.use.vm.ips": "Usa IPs da VM",
-    "label.used": "Usado",
-    "label.user": "Usuário",
-    "label.user.data": "Dados de Usuário",
-    "label.user.details": "Detalhes do usuário",
-    "label.user.vm": "VM do Usuário",
-    "label.username": "Nome de usuário",
-    "label.username.lower": "nome do usuário",
-    "label.users": "Usuários",
-    "label.vSwitch.type": "Tipo do vSwitch",
-    "label.value": "Valor",
-    "label.vcdcname": "Nome do vCenter DC",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "vCenter Cluster",
-    "label.vcenter.datacenter": "vCenter Datacenter",
-    "label.vcenter.datastore": "vCenter Datastore",
-    "label.vcenter.host": "vCenter Host",
-    "label.vcenter.password": "vCenter Password",
-    "label.vcenter.username": "vCenter Username",
-    "label.vcipaddress": "Endereço IP do vCenter",
-    "label.version": "Versão",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Resuloção max",
-    "label.vgpu.max.vgpu.per.gpu": "vGPU por GPU",
-    "label.vgpu.remaining.capacity": "Capacidade restante",
-    "label.vgpu.type": "Tipo de vGPU",
-    "label.vgpu.video.ram": "RAM de vídeo",
-    "label.view": "Visualizar",
-    "label.view.all": "Visualizar tudo",
-    "label.view.console": "Visualizar Console",
-    "label.view.more": "Ver mais",
-    "label.view.secondary.ips": "Visualizar os IPs secundários",
-    "label.viewing": "Visualizar",
-    "label.virtual.appliance": "Appliance Virtual",
-    "label.virtual.appliance.details": "Detalhes de appliance virtual",
-    "label.virtual.appliances": "Appliance Virtual",
-    "label.virtual.machine": "Maquina Virtual",
-    "label.virtual.machines": "Maquinas Virtuais",
-    "label.virtual.network": "Rede Virtual",
-    "label.virtual.networking": "Rede Virtual",
-    "label.virtual.router": "Roteador Virtual",
-    "label.virtual.routers": "Roteadores Virtuais",
-    "label.virtual.routers.group.account": "Grupo de Roteadores Virtuais por conta",
-    "label.virtual.routers.group.cluster": "Grupo de Roteadores Virtuais por cluster",
-    "label.virtual.routers.group.pod": "Grupo de Roteadores Virtuais por pod",
-    "label.virtual.routers.group.zone": "Grupo de Roteadores Virtuais por Zona",
-    "label.vlan": "VLAN",
-    "label.vlan.id": "VLAN ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "Intervalo de VLAN",
-    "label.vlan.range.details": "Detalhes de range VLAN",
-    "label.vlan.ranges": "Range(s) de VLAN",
-    "label.vlan.vni.range": "Intervalo de VLAN",
-    "label.vlan.vni.ranges": "Range(s) de VLAN/VNI",
-    "label.vm.add": "Adicionar Instância",
-    "label.vm.destroy": "Apagar",
-    "label.vm.display.name": "Nome de exibição da VM",
-    "label.vm.id": "ID da VM",
-    "label.vm.ip": "Endereço IP da VM",
-    "label.vm.name": "Nome da VM",
-    "label.vm.password": "Senha para a VM é",
-    "label.vm.reboot": "Reiniciar",
-    "label.vm.start": "Início",
-    "label.vm.state": "Estado da VM",
-    "label.vm.stop": "Parar",
-    "label.vmfs": "VMFS",
-    "label.vms": "VMs",
-    "label.vmsnapshot": "Snapshot da VM",
-    "label.vmsnapshot.current": "isCurrent",
-    "label.vmsnapshot.memory": "Snapshot da memória",
-    "label.vmsnapshot.parentname": "Pai",
-    "label.vmsnapshot.type": "Tipo",
-    "label.vmware.datacenter.id": "ID do datacenter VMware",
-    "label.vmware.datacenter.name": "Nome do datacenter VMware",
-    "label.vmware.datacenter.vcenter": "Vcednter do datacenter VMware",
-    "label.vmware.traffic.label": "Etiqueta de tráfego VMware",
-    "label.vnet": "VLAN",
-    "label.vnet.id": "VLAN ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "Dispositivos VNMC",
-    "label.volatile": "Volátil",
-    "label.volgroup": "Grupo de Volume",
-    "label.volume": "Disco",
-    "label.volume.details": "Detalhe do volume",
-    "label.volume.limits": "Limites de Disco",
-    "label.volume.migrated": "Volume migrado",
-    "label.volume.name": "Nome do Disco",
-    "label.volumes": "Discos",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Roteador VPC Distribuido",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "Oferta VPC",
-    "label.vpc.offering.details": "Detalhes da oferta VPC",
-    "label.vpc.router.details": "Detalhes do roteador da VPC",
-    "label.vpc.supportsregionlevelvpc": "Suporta VPC em Nível de Região",
-    "label.vpc.virtual.router": "Roteador Virtual VPC",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "Gateway de VPN de usuário",
-    "label.vpn.force.encapsulation": "Forçar encapsulamento UDP de pacotes ESP",
-    "label.vsmctrlvlanid": "Control VLAN ID",
-    "label.vsmpktvlanid": "Packet VLAN ID",
-    "label.vsmstoragevlanid": "Storage VLAN ID",
-    "label.vsphere.managed": "vSphere Managed",
-    "label.vswitch.name": "Nome do vSwitch",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "Intervalo de VXLAN",
-    "label.waiting": "Aguardando",
-    "label.warn": "Avisar",
-    "label.warn.upper": "AVISO",
-    "label.warning": "Atenção",
-    "label.wednesday": "Quarta-Feira",
-    "label.weekly": "Semanal",
-    "label.welcome": "Bem-Vindo",
-    "label.welcome.cloud.console": "Painel de Controle",
-    "label.what.is.cloudstack": "O que é o CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Versão original do XS é 6.1+",
-    "label.xenserver.traffic.label": "Etiqueta de tráfego XenServer",
-    "label.yes": "Sim",
-    "label.zone": "Zona",
-    "label.zone.dedicated": "Zona Dedicada",
-    "label.zone.details": "Detalhes de zona",
-    "label.zone.id": "ID da Zona",
-    "label.zone.lower": "Zona",
-    "label.zone.name": "Nome da zona",
-    "label.zone.step.1.title": "Passo 1: <strong>Selecionar a Rede</strong>",
-    "label.zone.step.2.title": "Passo 2: <strong>Adicionar a Zona</strong>",
-    "label.zone.step.3.title": "Passo 3: <strong>Adicionar o POD</strong>",
-    "label.zone.step.4.title": "Passo 4: <strong>Adicionar um Intervalo de IP</strong>",
-    "label.zone.type": "Tipo de Zona",
-    "label.zone.wide": "Zone-Wide",
-    "label.zoneWizard.trafficType.guest": "Hóspede: tráfego entre máquinas virtuais de usuários finais",
-    "label.zoneWizard.trafficType.management": "Gerência: Tráfego entre recursos internos do CloudStack incluindo quaisquer componentes que se comunicam com o servidor de gerenciamento tais como hosts e máquinas virtuais de sistema do CloudStack",
-    "label.zoneWizard.trafficType.public": "Público: tráfego entre a internet e máquinas virtuais na nuvem.",
-    "label.zoneWizard.trafficType.storage": "Storage: tráfego entre servidores de storage primária e secundária, tais como templates de máquinas virtuais e snapshots",
-    "label.zones": "Zonas",
-    "managed.state": "Status do Gerenciamento",
-    "message.XSTools61plus.update.failed": "A atualização do campo Original XS Version is 6.1+ falhou. Erro:",
-    "message.Zone.creation.complete": "Criação de zona completa",
-    "message.acquire.ip.nic": "Por favor, confirme que você deseja adquirir um novo IP secundário para esta Interface de Rede.</br>NOTA: Você precisa configurar manualmente o novo IP secundário dentro da maquinas virtual.",
-    "message.acquire.new.ip": "Por favor confirme que você gostaria de adquirir um novo IP para esta rede.",
-    "message.acquire.new.ip.vpc": "Por favor confirme que você gostaria de adquirir um novo IP para esta VPC.",
-    "message.acquire.public.ip": "Selecione a zona de onde você deseja adquirir o novo IP",
-    "message.action.cancel.maintenance": "A Manutenção do seu HOST foi cancelada com sucesso",
-    "message.action.cancel.maintenance.mode": "Confirme que você deseja cancelar esta Manutenção",
-    "message.action.change.service.warning.for.instance": "Sua instância deve ser desligada antes de tentar alterar a oferta de serviços utilizada.",
-    "message.action.change.service.warning.for.router": "O roteador precisa ser desligado antes de trocar o plano/tamanho.",
-    "message.action.delete.ISO": "Confirme que você deseja excluir esta ISO",
-    "message.action.delete.ISO.for.all.zones": "Esta ISO é usada por todas as Zonas. Confirme se você deseja excluir a ISO de todas as Zonas",
-    "message.action.delete.cluster": "Confirme que você deseja excluir este HOST",
-    "message.action.delete.disk.offering": "Confirme que você deseja excluir esta oferta de disco",
-    "message.action.delete.domain": "Confirme que você deseja excluir este Domínio",
-    "message.action.delete.external.firewall": "Confirme que você gostaria de remover este Firewall externo. Aviso: Se você Está planejando adicionar novamente este mesmo Firewall, é necessário apagar os contadores do dispositivo.",
-    "message.action.delete.external.load.balancer": "Confirme que você gostaria de remover este Load Balancer Externo. Aviso: Se você Está planejando adicionar novamente este mesmo Load Balancer, é necessário apagar os contadores do dispositivo.",
-    "message.action.delete.ingress.rule": "Confirme que você deseja excluir esta regra de entrada.",
-    "message.action.delete.network": "Confirme que você deseja remover esta rede.",
-    "message.action.delete.nexusVswitch": "Por favor confirme que você deseja remover este nexusVswitch.",
-    "message.action.delete.nic": "Por favor, confirme que deseja remover esta Interface de Rede, esta ação também irá remover a rede associada à VM.",
-    "message.action.delete.physical.network": "Por favor confirme que você deseja deletar esta rede física",
-    "message.action.delete.pod": "Confirme que você deseja remover este POD.",
-    "message.action.delete.primary.storage": "Confirme que você deseja remover este Storage Primário.",
-    "message.action.delete.secondary.storage": "Confirme que você deseja remover este Storage Secundário.",
-    "message.action.delete.security.group": "Confirme que você deseja remover este Security Group.",
-    "message.action.delete.service.offering": "Confirme que você deseja remover este Plano.",
-    "message.action.delete.snapshot": "Confirme que você deseja remover este Snapshot.",
-    "message.action.delete.system.service.offering": "Por favor confirme que você deseja deletar esta oferta de serviço de sistema.",
-    "message.action.delete.template": "Confirme que você deseja remover este Template.",
-    "message.action.delete.template.for.all.zones": "Este Template é usado por todas as zonas. Confirme que você deseja remover o Template de todas as zonas.",
-    "message.action.delete.volume": "Confirme que você deseja remover este Disco.",
-    "message.action.delete.zone": "Confirme que você deseja remover esta Zona.",
-    "message.action.destroy.instance": "Por favor, confirme que você deseja excluir esta Instância.",
-    "message.action.destroy.systemvm": "Confirme que você deseja excluir esta VM de Sistema.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Confirma a desativação do cluster.",
-    "message.action.disable.nexusVswitch": "Por favor confirme que você deseja desabilitar este nexusVswitch",
-    "message.action.disable.physical.network": "Por favor confirme que você deseja desabilitar esta rede física.",
-    "message.action.disable.pod": "Confirma a desativação do POD.",
-    "message.action.disable.static.NAT": "Confirme que você deseja desativar o NAT Estático.",
-    "message.action.disable.zone": "Confirma a desativação da zona.",
-    "message.action.download.iso": "Por favor confirme que você deseja baixar esta ISO.",
-    "message.action.download.template": "Por favor confirme que você deseja baixar este template.",
-    "message.action.downloading.template": "Baixando template",
-    "message.action.enable.cluster": "Confirma a ativação do cluster.",
-    "message.action.enable.maintenance": "O Host foi preparado com sucesso para Manutenção. Este processo poderá levar alguns minutos ou mais dependendo do número de VMs hospedadas neste Host.",
-    "message.action.enable.nexusVswitch": "Por favor confirme que você deseja habilitar este nexusVswitch.",
-    "message.action.enable.physical.network": "Por favor confirme que você deseja habilitar esta rede física.",
-    "message.action.enable.pod": "Confirma a ativação do POD.",
-    "message.action.enable.zone": "Confirma a ativação da zona.",
-    "message.action.expunge.instance": "Por favor, confirme que você deseja eliminar esta instância.",
-    "message.action.force.reconnect": "O procedimento de reconexão forçada foi preparado com sucesso. Este processo poderá levar alguns minutos.",
-    "message.action.host.enable.maintenance.mode": "Ativar o modo de Manutenção irá causar o live migration de todas as Instâncias hospedadas neste Host para o próximo disponível.",
-    "message.action.instance.reset.password": "Por favor confirme que você deseja alterar a senha de ROOT para está máquina virtual.",
-    "message.action.manage.cluster": "Confirma a vinculação do cluster.",
-    "message.action.primarystorage.enable.maintenance.mode": "Aviso: Colocar o Storage primário em modo de Manutenção irá causar a parada de todas as VMs hospedadas nesta unidade. Deseja continuar?",
-    "message.action.reboot.instance": "Por favor, confirme que você deseja reiniciar esta instância.",
-    "message.action.reboot.router": "Confirme que você deseja reiniciar este roteador.",
-    "message.action.reboot.systemvm": "Confirme que você deseja reiniciar esta VM de sistema.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Confirme que você deseja liberar este IP.",
-    "message.action.remove.host": "Favor confirmar que você deseja remover este host.",
-    "message.action.reset.password.off": "Sua Instância não suporta esta funcionalidade.",
-    "message.action.reset.password.warning": "Para recuperar a senha é necessário parar a Instância.",
-    "message.action.restore.instance": "Por favor, confirme que você deseja restaurar esta Instância.",
-    "message.action.revert.snapshot": "Por favor, confirme que você deseja reverter o seu volume deste snapshot.",
-    "message.action.start.instance": "Por favor, confirme que você deseja iniciar esta Instância.",
-    "message.action.start.router": "Confirme que você deseja inciar este roteador.",
-    "message.action.start.systemvm": "Confirme que você deseja iniciar esta VM de sistema.",
-    "message.action.stop.instance": "Por favor, confirme que você deseja parar esta instância.",
-    "message.action.stop.router": "Confirme que você deseja parar este roteador.",
-    "message.action.stop.systemvm": "Confirme que você deseja parar esta VM de Sistema.",
-    "message.action.take.snapshot": "Por favor confirme que você deseja criar um snapshot deste volume.",
-    "message.action.snapshot.fromsnapshot":"Por favor confirme que você deseja criar um snapshot deste VM snapshot.",
-    "message.action.unmanage.cluster": "Confirma a desvinculação do cluster.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Por favor, confirme que você deseja excluir este snapshot da VM.",
-    "message.action.vmsnapshot.revert": "Reverter snapshot da VM",
-    "message.activate.project": "Você tem certeza que deseja ativar este projeto ?",
-    "message.add.VPN.gateway": "Favor confirmar que você deseja adicionar um gateway de VPN",
-    "message.add.cluster": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Add a hypervisor managed cluster for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Especifique o seguintes parâmetros para adicionar uma nova oferta de disco.",
-    "message.add.domain": "Por favor especifique o subdomínio que você deseja criar neste domínio",
-    "message.add.firewall": "Adicionar Firewall à  zona.",
-    "message.add.guest.network": "Por favor confirme que você gostaria de adicionar uma rede guest.",
-    "message.add.host": "Especifique os seguintes parâmetros para adicionar um novo host.",
-    "message.add.ip.range": "Add an IP range to public network in zone",
-    "message.add.ip.range.direct.network": "Add an IP range to direct network <b><span id=\"directnetwork_name\"></span></b> in zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Add an IP range to pod: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Add a load balancer to zone",
-    "message.add.load.balancer.under.ip": "A regra do balanceador de carga foi adicionada para o IP:",
-    "message.add.network": "Add a new network for zone: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Favor especificar a informação para adicionar um novo gateway a esta VPC.",
-    "message.add.pod": "Add a new pod for zone <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Cada zona deve conter um ou mais pods e iremos adicionar o primeiro pod agora. Um pod contém hosts e servidores de storage primário que serão adicionados em uma etapa posterior. Inicialmente, configure um intervalo de endereços IP reservados para o tráfego de gerenciamento interno do CloudStack. A faixa de IP reservados devem ser únicos para cada zona na nuvem.",
-    "message.add.primary": "Especifique os seguintes parâmetros para adicionar um novo Storage primário.",
-    "message.add.primary.storage": "Adicionar novo Storage primário à zona <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Por favor, especifique as informações necessárias para adicionar uma nova região.",
-    "message.add.secondary.storage": "Add a new storage for zone <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Por favor preencha os dados abaixo para adicionar uma nova oferta de computação.",
-    "message.add.system.service.offering": "Por favor preencha os dados abaixo para adicionar uma nova oferta de serviço de sistema.",
-    "message.add.template": "Entre com os dados para criar um novo template.",
-    "message.add.volume": "Entre com os dados para criar um novo disco.",
-    "message.added.vpc.offering": "Adicionada oferta VPC",
-    "message.adding.Netscaler.device": "Adicionando dispositivo Nescaler",
-    "message.adding.Netscaler.provider": "Adicionando Netscaler provider",
-    "message.adding.host": "Adicionando host",
-    "message.additional.networks.desc": "Por favor, selecione a(s) rede(s) adicionais que sua instância virtual estará conectada.",
-    "message.admin.guide.read": "Para VMs baseadas em VMware, por favor leia a sessão sobre escalonamento dinâmico no guia do administrador antes de escalonar. Você gostaria de continuar?,",
-    "message.advanced.mode.desc": "Escolhe este modelo de rede se deseja ter habilitar o suporte a VLAN. Este modelo permite maior flexibilidade ao administrador ao permitir ofertas de rede customizada, firewall, vpn ou load balancer bem como acesso via rede virtual ou acesso direto.",
-    "message.advanced.security.group": "Escolha esta opção se desejar utilizar Security Groups para isolamento das VMs guest.",
-    "message.advanced.virtual": "Escolha esta opção se desejar utilizar VLANs para isolamento das VMs guest.",
-    "message.after.enable.s3": "Storage secundária fornecida por S3 configurada. Nota: ao deixar esta página, você não será capaz de reconfigurar S3 novamente.",
-    "message.after.enable.swift": "Swift Configurado. Nota: Após deixar esta página, você não será capaz de reconfigurar o Swift novamente.",
-    "message.alert.state.detected": "Alerta de estado detectado",
-    "message.allow.vpn.access": "Entre com nome de Usuário e senha do Usuário que terá acesso VPN.",
-    "message.apply.snapshot.policy": "Você atualizou com sucesso sua política de Snapshot.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Por favor, confirme que você deseja conectar o ISO à esta instância virtual.",
-    "message.attach.volume": "Preencha os seguintes dados para conectar o novo disco. Se você Está conectando um disco a uma maquina virtual Windows, será necessário reiniciar a Instância para visualizar o novo disco.",
-    "message.basic.mode.desc": "Escolha este modelo de rede se você <b>*<u>não</u>*</b> quer suporte a VLAN. Toda Instância criada neste modelo de rede estará ligado diretamente a um IP da rede e será usado Security Groups para prover segurança e segregação.",
-    "message.change.ipaddress": "Por favor, confirme que você gostaria de mudar o endereço IP da NIC em VM.",
-    "message.change.offering.confirm": "Por favor, confirme que você deseja mudar a oferta de serviço desta instância virtual.",
-    "message.change.password": "Por favor, troque sua senha.",
-    "message.cluster.dedicated": "Cluster Dedicado",
-    "message.cluster.dedication.released": "Cluster dedicado liberado",
-    "message.configure.all.traffic.types": "Você tem múltiplas redes físicas; favor configurar etiquetas para cada tipo de tráfego clicando no botão Edit.",
-    "message.configure.firewall.rules.allow.traffic": "Configure as regras para permitir o Tráfego",
-    "message.configure.firewall.rules.block.traffic": "Configurar as regras para bloquear o Tráfego",
-    "message.configure.ldap": "Por favor, confirme que você deseja configurar o LDAP.",
-    "message.configuring.guest.traffic": "Configurando tráfego do guest",
-    "message.configuring.physical.networks": "Configurando redes físicas",
-    "message.configuring.public.traffic": "Configurando tráfego público",
-    "message.configuring.storage.traffic": "Configurando tráfego de storage",
-    "message.confirm.action.force.reconnect": "Por favor confirme que você deseja forçar a reconexão com este host.",
-    "message.confirm.add.vnmc.provider": "Por favor confirme que você gostaria de adicionar este provedor VNMC.",
-    "message.confirm.archive.alert": "Por favor confirme que você deseja arquivar este alerta.",
-    "message.confirm.archive.event": "Por favor confirme que você deseja arquivar este evento",
-    "message.confirm.archive.selected.alerts": "Por favor confirme que você deseja arquivar os alertas selecionados",
-    "message.confirm.archive.selected.events": "Por favor confirme que você deseja arquivar os eventos selecionados",
-    "message.confirm.attach.disk": "Você tem certeza que deseja conectar este disco?",
-    "message.confirm.create.volume": "Você tem certeza que deseja criar o volume?",
-    "message.confirm.current.guest.CIDR.unchanged": "Gostaria de manter o CIDR da rede convidado inalterado?",
-    "message.confirm.dedicate.cluster.domain.account": "Você realmente quer dedicar este cluster ao domínio/conta?",
-    "message.confirm.dedicate.host.domain.account": "Você realmente quer dedicar este host ao domínio/conta?",
-    "message.confirm.dedicate.pod.domain.account": "Você realmente quer dedicar este pod ao domínio/conta?",
-    "message.confirm.dedicate.zone": "Você realmente quer dedicar esta zona ao domínio/conta?",
-    "message.confirm.delete.BigSwitchBcf": "Por favor, confirme que você deseja deletar este BigSwitch BCF Controller",
-    "message.confirm.delete.BrocadeVcs": "Por favor confirme que você deseja remover o Brocade Vcs Switch",
-    "message.confirm.delete.F5": "Por favor confirme que você deseja remover o F5",
-    "message.confirm.delete.NetScaler": "Por favor confirme que você deseja remover o NetScaler",
-    "message.confirm.delete.PA": "Por favor, confirme que você deseja remover Palo Alto",
-    "message.confirm.delete.SRX": "Por favor confirme que você deseja remover o SRX",
-    "message.confirm.delete.acl.list": "Você tem certeza que deseja apagar esta lista ACL?",
-    "message.confirm.delete.alert": "Você tem certeza que deseja apagar este alerta?",
-    "message.confirm.delete.baremetal.rack.configuration": "Por favor, confirme que você deseja remover a Configuração de Rack de Baremetal",
-    "message.confirm.delete.ciscoASA1000v": "Favor confirmar que você deseja apagar este CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Por favor confirme que você deseja apagar este recurso CiscoVNMC",
-    "message.confirm.delete.internal.lb": "Por favor confirme que você deseja remover este LB interno",
-    "message.confirm.delete.secondary.staging.store": "Por favor confirme que deseja apagar Armazenamento de Estágio Secundário",
-    "message.confirm.delete.ucs.manager": "Confirme se você deseja excluir o Gerente UCS.",
-    "message.confirm.destroy.router": "Por favor confirme que você gostaria de destruir este roteador",
-    "message.confirm.disable.host": "Favor confirmar que você deseja desabilitar este host.",
-    "message.confirm.disable.network.offering": "Você tem certeza que deseja deshabilitar esta oferta de rede?",
-    "message.confirm.disable.provider": "Por favor confirme que você gostaria de desabilitar este provider",
-    "message.confirm.disable.vnmc.provider": "Por favor confirme que você gostaria de desabilitar este provedor VNMC.",
-    "message.confirm.disable.vpc.offering": "Você tem certeza que deseja desabilitar esta oferta de VPC?",
-    "message.confirm.enable.host": "Por favor confirme que você deseja habilitar este host.",
-    "message.confirm.enable.network.offering": "Você tem certeza que deseja habilitar esta oferta de rede?",
-    "message.confirm.enable.provider": "Por favor confirme que você gostaria de habilitar este provider",
-    "message.confirm.enable.vnmc.provider": "Por favor confirme que você gostaria de habilitar este provedor VNMC.",
-    "message.confirm.enable.vpc.offering": "Você tem certeza que deseja habilitar esta oferta de VPC?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Por favor confirme que você deseja entrar neste projeto",
-    "message.confirm.migrate.volume": "Você quer migrar este volume?",
-    "message.confirm.refresh.blades": "Por favor confirme que você deseja renovar as lâminas.",
-    "message.confirm.release.dedicate.vlan.range": "Confirme que você deseja liberar esta faixa de VLAN dedicada.",
-    "message.confirm.release.dedicated.cluster": "Você deseja liberar este cluster dedicado?",
-    "message.confirm.release.dedicated.host": "Você deseja liberar esta host dedicado?",
-    "message.confirm.release.dedicated.pod": "Você deseja liberar esta pod dedicado?",
-    "message.confirm.release.dedicated.zone": "Você deseja liberar esta zona dedicada?",
-    "message.confirm.remove.IP.range": "Por favor confirme que você deseja remover este range de IP.",
-    "message.confirm.remove.event": "Você tem certeza que deseja remover este evento?",
-    "message.confirm.remove.load.balancer": "Por favor, confirme que você quer remover a VM do Balanceador de Carga",
-    "message.confirm.remove.network.offering": "Você tem certeza que deseja remover esta oferta de rede?",
-    "message.confirm.remove.selected.alerts": "Por favor confirme que você deseja remover os alertas selecionados",
-    "message.confirm.remove.selected.events": "Por favor confirme que você deseja remover os eventos selecionados",
-    "message.confirm.remove.vmware.datacenter": "Por favor, confirme que você quer remover este VMware datacenter",
-    "message.confirm.remove.vpc.offering": "Você tem certeza que deseja remover esta oferta de VPC?",
-    "message.confirm.replace.acl.new.one": "Você deseja substituir a ACL com uma nova?",
-    "message.confirm.scale.up.router.vm": "Você realmente quer escalonar a VM do Roteador?",
-    "message.confirm.scale.up.system.vm": "Você realmente quer escalonar a VM do sistema?",
-    "message.confirm.shutdown.provider": "Por favor confirme que você deseja desligar este provider",
-    "message.confirm.start.lb.vm": "Confirme que você deseja iniciar esta LB VM",
-    "message.confirm.stop.lb.vm": "Confirme que você deseja parar esta LB VM",
-    "message.confirm.upgrade.router.newer.template": "Por favor confirme que você deseja atualizar o roteador para usar template mais recente.",
-    "message.confirm.upgrade.routers.account.newtemplate": "Por favor confirme que você deseja atualizar todos os roteadores desta conta para o template mais novo.",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Por favor confirme que você deseja atualizar todos os roteadores deste cluster para o template mais novo.",
-    "message.confirm.upgrade.routers.newtemplate": "Por favor confirme que você deseja atualizar todos os roteadores desta zona para o template mais novo.",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Por favor confirme que você deseja atualizar todos os roteadores neste pod para o template mais novo.",
-    "message.copy.iso.confirm": "Confirme se você deseja copiar a ISO para",
-    "message.copy.template": "Copiar template <b id=\"copy_template_name_text\">XXX</b> da zona <b id=\"copy_template_source_zone_text\"></b> para",
-    "message.copy.template.confirm": "Você tem certeza que deseja copiar o template ?",
-    "message.create.template": "Você tem certeza que deseja criar um template ?",
-    "message.create.template.vm": "Criar VM do template <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Especifique as seguintes informações antes de criar o template a partir do disco: <b><span id=\"volume_name\"></span></b>. A criação de um template a partir de um disco pode levar alguns minutos ou mais dependendo do tamnho do disco.",
-    "message.creating.cluster": "Criando cluster",
-    "message.creating.guest.network": "Criando rede guest",
-    "message.creating.physical.networks": "Criando redes fisicas",
-    "message.creating.pod": "Criando pod",
-    "message.creating.primary.storage": "Criando storage primário",
-    "message.creating.secondary.storage": "Criando storage secundário",
-    "message.creating.systemVM": "Criando VMs do sistema (isso pode levar algum tempo)",
-    "message.creating.zone": "Criando zona.",
-    "message.decline.invitation": "Você tem certeza que quer rejeitar este convite de projeto ?",
-    "message.dedicate.zone": "Zona dedicada",
-    "message.dedicated.zone.released": "Zona dedicada lioberada",
-    "message.delete.VPN.connection": "Favor confirmar que você deseja deletar esta conexão VPN",
-    "message.delete.VPN.customer.gateway": "Favor confirmar que você deseja deletar este gateway de VPN de usuário",
-    "message.delete.VPN.gateway": "Favor confirmar que você deseja deletar este gateway de VPN",
-    "message.delete.account": "Confirme se você deseja excluir esta conta.",
-    "message.delete.affinity.group": "Por favor, confirme que você deseja remover este grupo de afinidade",
-    "message.delete.gateway": "Favor confirmar que você deseja deleta o gateway",
-    "message.delete.project": "Você tem certeza que deseja deletar este projeto ?",
-    "message.delete.user": "Por favor confirme que você deseja deletar este usuário.",
-    "message.desc.add.new.lb.sticky.rule": "Adicionar nova regra fixa de LB",
-    "message.desc.advanced.zone": "Para topologias de rede mais sofisticadas. Este modelo fornece maior flexibilidade na definição de redes de clientes e fornece ofertas de rede personalizadas, tais como firewall, VPN ou de balanceamento de carga.",
-    "message.desc.basic.zone": "Fornece uma única rede onde em cada instância de VM é atribuído um IP diretamente na rede. O isolamento Guest podem ser fornecidos através de camada-3 da rede com grupos de segurança (filtragem da fonte de endereços IP).",
-    "message.desc.cluster": "Cada pod deve conter um ou mais clusters, e iremos adicionar o primeiro cluster agora. Um cluster fornece uma maneira de agrupamento de hosts. Os hosts de um cluster têm hardware idêntico, executam o mesmo hypervisor, estão na mesma sub-rede e acessam o mesmo storage compartilhado. Cada cluster é constituído por um ou mais hosts e um ou mais servidores de storage primário.",
-    "message.desc.create.ssh.key.pair": "Por favor, preencha os seguintes dados para criar ou registar um par de chaves ssh.<br><br>(1) Se a chave pública está definida, CloudStack irá registrar a chave pública. Você pode usá-la através de sua chave privada.<br><br>(2) Se a chave pública não está definida, CloudStack irá criar um novo par de chaves SSH. Neste caso, copie e salve a chave privada. CloudStack não irá mantê-la.<br>",
-    "message.desc.created.ssh.key.pair": "Par de chaves SSH criado",
-    "message.desc.host": "Cada cluster deve conter pelo menos um host (computador) para as VMs guest serem executadas e iremos adicionar o primeira host agora. Para um host funcionar no CloudStack, você deve instalar um hypervisor no host, atribuir um endereço IP e garantir que o host está conectado ao servidor de gerenciamento do CloudStack.<br/><br/>Forneça o hostname ou o endereço IP do host, o nome de usuário (geralmente root) e a senha  e qualquer label que você utiliza para categorizar os hosts.",
-    "message.desc.primary.storage": "Cada cluster deve conter um ou mais servidores de storage primário e iremos adicionar o primeiro agora. Um storage primário, contém os volumes de disco para todas as VMs em execução nos hosts do cluster. Utiliza qualquer protocolo compatível com os padrões que é suportado pelo hypervisor utilizado.",
-    "message.desc.reset.ssh.key.pair": "Por favor, especifique um par de chaves SSH que você deseja adicionar a esta VM. Por favor, note que a senha de root será alterada por esta operação caso a senha esteja ativada.",
-    "message.desc.secondary.storage": "Cada zona deve ter pelo menos um NFS ou servidor de storage secundário e iremos adicionar o primeiro agora. Um storage secundários armazena templates de VM, imagens ISO e snapshots do volume de disco da VM. Esse servidor deve estar disponível para todos os hosts na zona. <br/><br/> Fornecer o endereço IP e o caminho exportados.",
-    "message.desc.zone": "Uma zona é a maior unidade organizacional no CloudStack e normalmente corresponde à um único datacenter. As Zonas disponibilizam isolamento físico e redundância. Uma zona é composta por um ou mais pods (cada um dos quais contém os hosts e servidores de storage primário) e um servidor de storage secundário que é compartilhado por todos os pods na zona.",
-    "message.detach.disk": "Você tem certeza que deseja desconectar este disco ?",
-    "message.detach.iso.confirm": "Confirme se você deseja desconectar o ISO da instância virtual.",
-    "message.disable.account": "Por favor confirme que você deseja desabilitar esta conta. Após desabilitar uma conta, todos os usuários desta conta não irão possuir mais acesso aos seus recursos da cloud.  Todas as máquinas virtuais serão automaticamente desligadas.",
-    "message.disable.snapshot.policy": "Você desativou com sucesso sua política de Snapshot.",
-    "message.disable.user": "Por favor confirme que você deseja desabilitar este usuário.",
-    "message.disable.vpn": "Você tem certeza que deseja desabilitar a VPN?",
-    "message.disable.vpn.access": "Confirme se você deseja desativar o acesso VPN.",
-    "message.disabling.network.offering": "Desabilita oferta de rede",
-    "message.disabling.vpc.offering": "Desabilitando oferta VPC",
-    "message.disallowed.characters": "Caracteres não-permitidos: <,>",
-    "message.download.ISO": "Por favor clique <a href=\"#\">00000</a> para baixar o ISO",
-    "message.download.template": "Por favor clique <a href=\"#\">00000</a> para baixar o template",
-    "message.download.volume": "Clique <a href=\"#\">00000</a> para baixar o disco",
-    "message.download.volume.confirm": "Por favor confirme que você quer baixar este volume",
-    "message.edit.account": "Editar (\"-1\" indica que não haverá limites para a quantidade de recursos criado)",
-    "message.edit.confirm": "Por favor, confirme as alterações antes de clicar em \"Salvar\".",
-    "message.edit.limits": "Especifique os limites para os seguintes recursos. \"-1\" indica sem limite para o total de recursos criados.",
-    "message.edit.traffic.type": "Favor especificar a etiqueta de tráfego que você deseja associar com este tipo de tráfego.",
-    "message.enable.account": "Confirme se você deseja ativar a conta.",
-    "message.enable.user": "Por favor confirme que você deseja habilitar este usuário.",
-    "message.enable.vpn": "Por favor confirme que você deseja acesso VPN habilitado para este endereço IP.",
-    "message.enable.vpn.access": "VPN Está desativada para este endereço IP. Gostaria de ativar o acesso VPN?",
-    "message.enabled.vpn": "Seu acesso VPN Está ativado e pode ser acessado através do IP",
-    "message.enabled.vpn.ip.sec": "Sua chave IPSec (pre-shared) é",
-    "message.enabling.network.offering": "Habilitando oferta de rede",
-    "message.enabling.security.group.provider": "Habilitar provider de grupo de segurança",
-    "message.enabling.vpc.offering": "Habilitando oferta VPC",
-    "message.enabling.zone": "Habilitando zona",
-    "message.enabling.zone.dots": "Habilitando Zona....",
-    "message.enter.seperated.list.multiple.cidrs": "Por favor entre a de CIDRs separadas por vírgula, se houver mais de uma",
-    "message.enter.token": "Por favor entre o token que você recebeu no e-mail privado.",
-    "message.generate.keys": "Por favor confirme que você deseja gerar novas chaves para este usuário.",
-    "message.gslb.delete.confirm": "Confirme que você deseja apagar este GSLB",
-    "message.gslb.lb.remove.confirm": "Confirme que você deseja remover o balanceamento de carga deste GSLB",
-    "message.guest.traffic.in.advanced.zone": "O tráfego de rede guest é para comunicação entre máquinas virtuais do usuário final. Especifique um intervalo de IDs de VLAN para transportar o tráfego do guest para cada rede física.",
-    "message.guest.traffic.in.basic.zone": "O tráfego de rede guest é para comunicação entre máquinas virtuais do usuário final. Especifique um intervalo de endereços IP para que CloudStack possa atribuir às VMs. Certifique-se que este intervalo não se sobreponha o range de IPs reservados do sistema.",
-    "message.host.dedicated": "Host dedicado",
-    "message.host.dedication.released": "Host dedicado liberado",
-    "message.installWizard.click.retry": "Click no botão para tentar executar novamente.",
-    "message.installWizard.copy.whatIsACluster": "Um cluster provê uma maneira de agrupar hosts. Os hosts em um cluster tem hardware idêntico, rodam o mesmo hypervisor, estão na mesma subnet, acessam o mesmo storage compartilhado. Instâncias de máquinas virtuais (VMs) podem ser migradas a quente - live migration -  de um host para outro host no mesmo cluster, sem interromper o serviço para o usuário. Um Cluster é a terceira maior unidade organizacional em uma instalação CloudStack&#8482; . Clusters estão contidos em pods e pods estão contidos em zonas.<br/><br/>O CloudStack&#8482; permite múltiplos clusters em uma mesma cloud, entretanto para a instalação básica, nós iremos precisar apenas de um cluster.",
-    "message.installWizard.copy.whatIsAHost": "Um host é um único computador. Os Hosts provêem os recursos computacionais para executar as máquinas virtuais.  Cada host possuí o software do hypervisor instalado nele para gerenciar as guest VMs (Exceto os hosts bare metal, que são um caso especial discutido no Guia Avançado de Instalação). Por exemplo, um servidor Linux com KVM habilitado,  um servidor Citrix XenServer e um servidor ESXi são hosts. Na Instalação Básica, nós utilizamos um único host rodando XenServer ou KVM.<br/><br/>O host é a menor unidade organizacional dentro de uma instalação CloudStack&#8482; . Hosts estão contidos dentro de Clusters, clusters estão contidos dentro de pods e pods estão contidos dentro de zonas.",
-    "message.installWizard.copy.whatIsAPod": "Um pod normalmente representa um único rack. Hosts no mesmo pod estão na mesma subrede.<br/><br/> Um pod é a segunda maior unidade organizacional de uma instalação CloudStack&#8482; . Pods estão contidos dentro de zonas. Cada zona, pode conter um ou mais pods; Na instalação básica, você irá ter apenas um pod na sua zona.",
-    "message.installWizard.copy.whatIsAZone": "Uma zona é a maior unidade organizacional em uma instalação CloudStack&#8482; . Uma zona tipicamente corresponde a um único datacenter, apesar de ser possível ter múltiplas zonas no mesmo datacenter. O benefício de se organizar a infra-estrutura em zonas é permitir o isolamento físico e redundância. Por exemplo, cada zona pode possuir sua própria alimentação de  energia e link de saída de internet e zonas podem estar geograficamente separadas (apesar de não ser obrigatório).",
-    "message.installWizard.copy.whatIsCloudStack": "O CloudStack&#8482 é uma plataforma de software que agrega recursos computacionais para construir uma Cloud de Infra-estrutura como Serviço (IaaS) pública, privada ou híbrida. O CloudStack&#8482 gerência a rede, o storage e os recursos computacionais que compõem a infra-estrutura de cloud. Utilize o CloudStack&#8482 para instalar, gerenciar e configurar os ambientes de cloud computing.<br/><br/>Indo além de imagens de máquinas virtuais individuais rodando em hardware commodity, CloudStack&#8482 provê uma solução  completa de software de infra-estrutura de cloud para entregar datacenters virtuais como um serviço - possuindo todos os componentes essenciais para contruir, instalar e gerenciar aplicações na cloud multi-camadas e multi-tenant. Ambas as versões open-source e premium estão disponíveis, com a versão opensource oferecendo praticamente os mesmos recursos.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "Uma infraestrutura de Cloud CloudStack; utiliza dois tipos de storage: storage primário e storage secundário. Ambos os tipos podem ser iSCSI,  NFS servers, ou disco local.<br/><br/><strong>O Storage primário</strong> está associado com um cluster, e armazena os volumes de disco de cada guest VM para todas as VMs em execução nos hosts deste cluster. O servidor de storage primário tipicamente encontra-se localizado perto dos hosts.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "O storage secundário está associado a uma zona, ele é responsável por armazenar o seguinte: <ul><li>Imagens de Templates do SO - que podem ser utilizadas para boot das VMs e podem incluir configurações adicionais, como por exemplo as aplicações instaladas</li><li>Imagens ISO - Imagens de sistema operacional que podem ser bootáveis ou não</li><li>Snapshots do volume de discos - cópias salvas dos dados de uma VM que pode ser utilizada para recuperação de dados ou criação de novos templates</ul>",
-    "message.installWizard.now.building": "Construindo sua cloud agora...",
-    "message.installWizard.tooltip.addCluster.name": "Um nome para o cluster. Este nome pode ser um nome de sua escolha e não é usado pelo CloudStack.",
-    "message.installWizard.tooltip.addHost.hostname": "O nome DNS ou endereço IP do host.",
-    "message.installWizard.tooltip.addHost.password": "Este é a senha do usuário especificado acima (da sua instalação do XenServer)",
-    "message.installWizard.tooltip.addHost.username": "Usualmente root.",
-    "message.installWizard.tooltip.addPod.name": "O nome para o pod",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Este é o range de IP na rede privada que o CloudStack utiliza para gerenciar o storage secundário das VMs e Proxy Console das VMs. Estes endereços IP são obtidos da mesma subrede dos servidores hosts.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "O gateway para os hosts neste pod.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "A máscara de rede está em uso na subrede que os guests irão utilizar.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Este é o range de IP na rede privada que o CloudStack utiliza para gerenciar o storage secundário das VMs e Proxy Console das VMs. Estes endereços IP são obtidos da mesma subrede dos servidores hosts.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "O Nome do dispositivo de storage.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(para NFS) No NFS este é o path exportado pelo servidor. Path (para SharedMountPoint). Com o KVM este é o path em cada host onde o storage primário está montado. Por exemplo, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(para NFS, iSCSI ou PreSetup) O Endereço IP ou nome DNS do dispositivo de storage.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "O endereço IP do servidor NFS hospedando o storage secundário",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "Path exportado, localizado no servidor que você especificou acima",
-    "message.installWizard.tooltip.addZone.dns1": "Estes são os servidores DNS utilizados pelas guest VMs na zona. Estes servidores DNS serão acessados pela interface de rede pública que você irá adicionar posteriormente. O endereço IP público da zona deve possuir uma rota para os servidores DNS configurados aqui.",
-    "message.installWizard.tooltip.addZone.dns2": "Estes são os servidores DNS utilizados pelas guest VMs na zona. Estes servidores DNS serão acessados pela interface de rede pública que você irá adicionar posteriormente. O endereço IP público da zona deve possuir uma rota para os servidores DNS configurados aqui.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Estes são os servidores DNS utilizados pelas VMs de sistema nesta zona. Estes servidores DNS serão acessados através da interface de rede privada das VMs de sistema. O endereço IP privado que você configurar para os pods deve possuir uma rota para os servidores DNS configurados aqui.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Estes são os servidores DNS utilizados pelas VMs de sistema nesta zona. Estes servidores DNS serão acessados através da interface de rede privada das VMs de sistema. O endereço IP privado que você configurar para os pods deve possuir uma rota para os servidores DNS configurados aqui.",
-    "message.installWizard.tooltip.addZone.name": "Um nome para a zona",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Uma descrição da sua rede",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "O range de endereços IP que estará disponível para alocação para os guests nesta zona. Caso uma Interface de Rede seja utilizada, estes IPs devem estar no mesmo CIDR que o CIDR do pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "O gateway que os guests devem usar",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "A máscara de rede da subrede que os guests devem usar",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "O range de endereços IP que estará disponível para alocação para os guests nesta zona. Caso uma Interface de Rede seja utilizada, estes IPs devem estar no mesmo CIDR que o CIDR do pod.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Um nome para sua rede",
-    "message.instance.scaled.up.confirm": "Você realmente quer escalonar sua instância?",
-    "message.instanceWizard.noTemplates": "Você não possui nenhum template disponível; por favor adicione um template compatível e reinicie o wizard de instância.",
-    "message.ip.address.changed": "Seu endereço IP pode ter mudado; você gostaria de atualizar a listagem ? Note que neste caso o painel de detalhes irá fechar.",
-    "message.iso.desc": "Imagem de disco contendo dados ou mídia de sistema operacional bootável",
-    "message.join.project": "Você agora entrou em um projeto. Por favor troque para a visão de Projeto para visualizar o projeto.",
-    "message.launch.vm.on.private.network": "Você deseja executar a sua instância na sua própria rede privada dedicada?",
-    "message.launch.zone": "A zona está pronta para ser executada; por favor, vá para o próximo passo.",
-    "message.ldap.group.import": "Todos os usuários do grupo nome dado será importado",
-    "message.link.domain.to.ldap": "Ativar sincronização automática para este domínio em LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Confirme se você deseja bloquear esta conta. Bloqueando a conta, todos os Usuários desta conta não estarão mais habilitados a gerenciar os recursos na nuvem. Os recursos existentes (Cloud Server) ainda poderão ser acessados.",
-    "message.migrate.instance.confirm": "Confirme o host que você deseja migrar a instância virtual.",
-    "message.migrate.instance.to.host": "Por favor confirme que você deseja migrar a instância para outro host.",
-    "message.migrate.instance.to.ps": "Por favor confirme que você deseja migrar a instância para outro storage primário.",
-    "message.migrate.router.confirm": "Por favor confirme o host que você deseja migrar o roteador para:",
-    "message.migrate.systemvm.confirm": "Por favor confirme o host para o qual você deseja migrar a VM de sistema:",
-    "message.migrate.volume": "Por favor confirme que você deseja migrar o volume para outro storage primário.",
-    "message.network.addVM.desc": "Por favor especifique a rede onde você gostaria de adicionar esta VM. Uma nova NIC será adicionada a esta rede.",
-    "message.network.addVMNIC": "Por favor confirme que você gostaria de adicionar uma nova VM NIC para esta rede.",
-    "message.network.remote.access.vpn.configuration": "A configuração de acesso remoto VPN foi gerada, mas falhou ao ser aplicada. Por favor, verifique a conectividade dos elementos de rede e depois tente novamente.",
-    "message.new.user": "Especifique abaixo para adicionar novos usuários para a conta",
-    "message.no.affinity.groups": "Você não tem nenhum grupo de afinidade. Por favor, vá para o próximo passo.",
-    "message.no.host.available": "Sem hosts disponíveis para Migração",
-    "message.no.network.support": "O hypervisor escolhido, vSphere, não possui nenhum recurso de rede adicional. Por favor, vá para o passo 5.",
-    "message.no.network.support.configuration.not.true": "Você não possui nenhuma zona com grupos de segurança habilitado. Assim sendo, não possui recursos adicionais de rede. Por favor continue para o passo 5.",
-    "message.no.projects": "Você não possui nenhum projeto.<br/>Por favor crie um novo projeto à partir da seção Projetos.",
-    "message.no.projects.adminOnly": "Você não possui nenhum projeto. <br/> Por favor solicite ao seu administrador a criação de um novo projeto.",
-    "message.number.clusters": "<h2>Clusters</h2>",
-    "message.number.hosts": "<h2>Hosts</h2>",
-    "message.number.pods": "<h2>PODs</h2>",
-    "message.number.storage": "<h2>Volumes do Storage Primário</h2>",
-    "message.number.zones": "<h2>Zonas</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "A senha foi redefinida para",
-    "message.password.of.the.vm.has.been.reset.to": "A senha da VM foi redefinida para",
-    "message.pending.projects.1": "Você possui convites de projetos pendentes:",
-    "message.pending.projects.2": "Para visualizar, por favor acesse a seção de projetos, depois selecione os convites no menu drop-down.",
-    "message.please.add.at.lease.one.traffic.range": "Por favor adicione pelo menos um range de tráfego.",
-    "message.please.confirm.remove.ssh.key.pair": "Por favor, confirme que você deseja remover este par de chaves SSH",
-    "message.please.proceed": "Por favor, vá para o próximo passo.",
-    "message.please.select.a.configuration.for.your.zone": "Por favor selecione uma configuracao para sua zona.",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Por favor selecione uma rede pública e de gerenciamento diferente antes de remover",
-    "message.please.select.networks": "Por favor selecione as redes para sua máquina virtual.",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Por favor, selecione um par de chaves SSH que você deseja que esta VM utilize:",
-    "message.please.wait.while.zone.is.being.created": "Por favor, espere enquanto sua zona está sendo criada; isto pode demorar um pouco...",
-    "message.pod.dedication.released": "Pod Dedicado liberado",
-    "message.portable.ip.delete.confirm": "Favor confirmar que você deseja apagar esta Faixa de IPs Portáveis",
-    "message.project.invite.sent": "Convite enviado para o usuário; Eles serão adicionados ao projeto após aceitarem o convite",
-    "message.public.traffic.in.advanced.zone": "O tráfego público é gerado quando as VMs na nuvem acessam a internet. Os IPs acessíveis ao público devem ser alocados para essa finalidade. Os usuários finais podem usar a interface do usuário CloudStack para adquirir esses IPs afim de implementar NAT entre a sua rede de guests e sua rede pública. <br/><br/> Forneça pelo menos um intervalo de endereços IP para o tráfego de internet.",
-    "message.public.traffic.in.basic.zone": "O tráfego público é gerado quando as VMs na nuvem acessam a Internet ou prestam serviços aos clientes através da Internet. Os IPs acessíveis ao público devem ser alocados para essa finalidade. Quando uma instância é criada, um IP a partir deste conjunto de IPs públicos serão destinados à instância, além do endereço IP guest. Um NAT estático 1-1  será criada automaticamente entre o IP público e IP guest. Os usuários finais também podem usar a interface de usuário CloudStack para adquirir IPs adicionais afim de se implementar NAT estático entre suas instâncias e o IP público.",
-    "message.question.are.you.sure.you.want.to.add": "Você tem certeza que deseja adicionar",
-    "message.read.admin.guide.scaling.up": "Por favor leia a sessão sobre escalonamento dinâmico no guia do administrador antes de escalonar.",
-    "message.recover.vm": "Por favor, confirme a recuperação desta VM.",
-    "message.redirecting.region": "Redirecionando para região...",
-    "message.reinstall.vm": "NOTA: Proceda com cuidado. Isso fará com que a máquina virtual seja re-instalada a partir  do Template. Todos os datos do disco ROOT serão perdidos. Volumes de Dados adicionais, se houver, não serão alterados.",
-    "message.remove.ldap": "Você tem certeza que deseja deletar a configuração LDAP?",
-    "message.remove.region": "Você tem certeza que deseja remover esta região deste servidor de gerenciamento?",
-    "message.remove.vpc": "Favor confirmar que você deseja remover a VPC",
-    "message.remove.vpn.access": "Confirme se você deseja remover acesso VPN do seguinte Usuário.",
-    "message.removed.ssh.key.pair": "Par de chaves SSH removido",
-    "message.reset.VPN.connection": "Favor confirmar que você deseja resetar a conexão VPN",
-    "message.reset.password.warning.notPasswordEnabled": "O template desta instância foi criado sem uma senha habilitada",
-    "message.reset.password.warning.notStopped": "Sua instância deve estar parada antes de tentar trocar sua senha atual",
-    "message.restart.mgmt.server": "Reinicie o(s) servidor(es) de gerenciamento para que a nova configuração tenha efeito.",
-    "message.restart.mgmt.usage.server": "Por favor reinicie seu servidor(es) de gerenciamento e seu servidor(es) de utilização para as mudanças entrarem em efeito.",
-    "message.restart.network": "Por favor confirme que você deseja reiniciar a rede",
-    "message.restart.vpc": "Favor confirmar que você deseja reiniciar a VPC",
-    "message.restart.vpc.remark": "Por favor, confirme a reinicialização do VPC <p><small><i>Observação: fazendo um VPC redundante não redundante irá forçar uma limpeza. As redes não estarão disponíveis por alguns minutos</i>.</small></p>",
-    "message.restoreVM": "Quer restaurar a VM?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Use <strong>Ctrl-clique</strong> para selecionar todos os Security Groups)",
-    "message.select.a.zone": "A zone tipicamente corresponde a um único datacenter. Múltiplas zonas auxiliam a cloud a ser mais confiável provendo isolamento físico e redundância.",
-    "message.select.affinity.groups": "Por favor, selecione quaisquer grupos de afinidade que você deseja que esta VM pertença:",
-    "message.select.instance": "Por favor selecione uma instância.",
-    "message.select.iso": "Por favor selecione um ISO para sua nova instância virtual",
-    "message.select.item": "Por favor selecione um item.",
-    "message.select.security.groups": "Por favor selecione o(s) grupo(s) de segurança para sua nova VM",
-    "message.select.template": "Por favor selecione um template para sua nova instância virtual.",
-    "message.select.tier": "Por favor, selecione um tier",
-    "message.set.default.NIC": "Por favor confirme que você quer tornar este NIC o padrão para esta VM,",
-    "message.set.default.NIC.manual": "Por favor atualize manualmente o NIC padrão desta VM agora.",
-    "message.setup.physical.network.during.zone.creation": "Ao adicionar uma zona avançada, você precisa configurar uma ou mais redes físicas. Cada rede corresponde  à uma Interface de Rede no hypervisor. Cada rede física pode ser utilizada para transportar um ou mais tipos de tráfego, com certas restrições sobre como eles podem ser combinados. <br/> <strong> Arraste e solte um ou mais tipos de tráfego </ strong> em cada rede física.",
-    "message.setup.physical.network.during.zone.creation.basic": "Quando adicionar uma zona básica, você pode configurar uma rede física, que corresponde a uma Interface de Rede no hypervisor. A rede carrega diversos tipos de tráfego.<br/><br/>Você pode <strong>adicionar e remover</strong> outros tipos de tráfego na mesma interface de rede física.",
-    "message.setup.successful": "Cloud configurada com sucesso!",
-    "message.snapshot.schedule": "Você pode configurar Snapshots recorrentes agendados selecionando as opções disponíveis abaixo e aplicando suas políticas preferenciais",
-    "message.specifiy.tag.key.value": "Por favor especifique chave e valor da tag",
-    "message.specify.url": "Por favor especifique a URL",
-    "message.step.1.continue": "Selecione o template ou ISO para continuar",
-    "message.step.1.desc": "Por favor, selecione um template para a sua nova instância virtual. Você pode também escolher um template limpo e instalar a partir de uma imagem ISO.",
-    "message.step.2.continue": "Selecione o plano",
-    "message.step.3.continue": "Seleciona a oferta de disco",
-    "message.step.4.continue": "Selecione pelo menos uma rede para continuar",
-    "message.step.4.desc": "Selecione a rede principal que a sua instância virtual estará conectada.",
-    "message.storage.traffic": "Tráfego entre os recursos internos do CloudStack, incluindo todos os componentes que se comunicam com o servidor de gerenciamento tais como hosts e máquinas virtuais de sistema CloudStack. Por favor, configure o tráfego do storage aqui.",
-    "message.suspend.project": "Você tem certeza que deseja suspender este projeto ?",
-    "message.systems.vms.ready": "VM de Sistema prontas.",
-    "message.template.copying": "O template está sendo copiado.",
-    "message.template.desc": "Imagem de SO que pode ser utilizada para bootar VMs",
-    "message.tier.required": "Tier é obrigatório",
-    "message.tooltip.dns.1": "Endereço de um servidor DNS que será utilizado por todas as VMs da Zone. A faixa de IPs públicos para essa Zone deve possuir uma rota para o servidor configurado.",
-    "message.tooltip.dns.2": "Um servidor DNS secundário para ser utilizado pelas VMs nesta zona. Os endereços IP públicos nesta zona devem ter rota para este servidor.",
-    "message.tooltip.internal.dns.1": "Nome de um servidor DNS que será utilizado pelas VMs internas de sistema do CloudStack nesta zona. Os endereços privados dos pods devem ter uma rota para este servidor.",
-    "message.tooltip.internal.dns.2": "Nome de um servidor DNS que será utilizado pelas VMs internas de sistema do CloudStack nesta zona. Os endereços privados dos pods devem ter uma rota para este servidor.",
-    "message.tooltip.network.domain": "Um sufixo DNS que irá criar um nome de domínio customizado para a rede que é acessada pelas guest VMs.",
-    "message.tooltip.pod.name": "Um nome para este pod.",
-    "message.tooltip.reserved.system.gateway": "O gateway para os hosts neste pod.",
-    "message.tooltip.reserved.system.netmask": "O prefixo de rede que define a subrede deste pod. Utilize a notação CIDR.",
-    "message.tooltip.zone.name": "Um nome para a zona.",
-    "message.update.os.preference": "Escolha o SO de preferencia para este host. Todas Instâncias com preferencias similares serão alocadas neste host antes de tentar em outro.",
-    "message.update.resource.count": "Por favor confirme que você quer atualizar a contagem de recursos para esta conta.",
-    "message.update.ssl": "Envie o novo certificado SSL X.509 para ser atualizado em cada console proxy:",
-    "message.update.ssl.failed": "Atualização do Certificado SSL falhou",
-    "message.update.ssl.succeeded": "Atualização do Certificado SSL feita com sucesso",
-    "message.validate.URL": "Por favor entre uma URL válida.",
-    "message.validate.accept": "Por favor entre com uma extensão válida.",
-    "message.validate.creditcard": "Por favor entre um número de cartão de crédito válido.",
-    "message.validate.date": "Por favor entre com uma data válida.",
-    "message.validate.date.ISO": "Por favor entre com uma data válida (ISO).",
-    "message.validate.digits": "Por favor entre com dígitos apenas.",
-    "message.validate.email.address": "Por favor entre um email válido.",
-    "message.validate.equalto": "Por favor entre com o mesmo valor novamente.",
-    "message.validate.fieldrequired": "Este campo é obrigatório.",
-    "message.validate.fixfield": "Por favor, arrume este campo.",
-    "message.validate.instance.name": "Nomes de instâncias não podem ter mais de 63 caracteres. Somente letras ASCII a~z, A~Z, dígitos 0~9 e hífen são permitidos. Deve começar com uma letra e terminar com uma letra ou dígito.",
-    "message.validate.invalid.characters": "Caracteres inválidos encontrados, por favor corrija.",
-    "message.validate.max": "Por favor entre com um valor menor que ou igual a {0}.",
-    "message.validate.maxlength": "Por favor entre com mais de [0] caracteres.",
-    "message.validate.minlength": "Por favor entre com pelo menos [0] caracteres.",
-    "message.validate.number": "Por favor entre um número válido.",
-    "message.validate.range": "Por favor entre com um valor com valor entre [0] e [1].",
-    "message.validate.range.length": "Por favor entre com um valor com tamanho entre [0] e [1] caracteres.",
-    "message.virtual.network.desc": "Rede virtual dedicado para sua conta. O Domínio de broadcast Está na VLAN e todo acesso a internet é roteado através do virtual router.",
-    "message.vm.create.template.confirm": "Criar Template reiniciará a VM automaticamente.",
-    "message.vm.review.launch": "Por favor revise a informação abaixo e confirme que sua instância virtual está correta antes de executa-la.",
-    "message.vnmc.available.list": "VNMC não está disponível na lista de provedores.",
-    "message.vnmc.not.available.list": "VNMC não está disponível na lista de provedores.",
-    "message.volume.create.template.confirm": "Confirme se você deseja criar um template a partir deste disco. A criação do template pode levar alguns minutos ou mais dependendo do tamanho do disco.",
-    "message.waiting.for.builtin.templates.to.load": "Aguardando a carga dos templates integrados...",
-    "message.you.must.have.at.least.one.physical.network": "Você deve ter pelo menos uma rede física",
-    "message.your.cloudstack.is.ready": "Seu CLoudStack está pronto!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Criação de zona completa. Você gostaria de habilitar esta zona?",
-    "message.zone.no.network.selection": "A zona que você selecionou não possui nenhuma rede para ser escolhida.",
-    "message.zone.step.1.desc": "Seleciona o modelo de rede para a zona.",
-    "message.zone.step.2.desc": "Entre a informação a seguir para adicionar uma nova zona",
-    "message.zone.step.3.desc": "Entre a informação a seguir para adicionar um novo pod",
-    "message.zoneWizard.enable.local.storage": "ALERTA: se você habilitar storage local para esta zona, você deve fazer o seguinte, dependendo se você quiser que suas máquinas virtuais de sistema inicializem:<br/><br/>1. Se máquinas virtuais de sistema precisam ser iniciadas em storage primária, storage primária precisa ser adicionada à zona após a criação. Você também deve ativar a zona em um estado desabilitado.<br/><br/>2. Se máquinas virtuais de sistema precisam ser iniciadas em storage local, system.vm.use.local.storage precisa ser estabelecida como verdadeira antes de você habilitar a zona.<br/><br/><br/>Você quer continuar?",
-    "messgae.validate.min": "Por favor entre com um valor maior que ou igual a {0}.",
-    "mode": "Modo",
-    "network.rate": "Taxa de Transferência",
-    "notification.reboot.instance": "Reiniciar instância",
-    "notification.start.instance": "Iniciar instãncia",
-    "notification.stop.instance": "Parar instância",
-    "side.by.side": "Lado a Lado",
-    "state.Accepted": "Aceito",
-    "state.Active": "Ativo",
-    "state.Allocated": "Alocado",
-    "state.Allocating": "Alocando",
-    "state.BackedUp": "Back up realizado com sucesso",
-    "state.BackingUp": "Realizando Back up",
-    "state.Completed": "Completo",
-    "state.Creating": "Criando",
-    "state.Declined": "Recusado",
-    "state.Destroyed": "Destruído",
-    "state.Disabled": "Desativado",
-    "state.Enabled": "Habilitado",
-    "state.Error": "Erro",
-    "state.Expunging": "Removendo",
-    "state.Migrating": "Migrando",
-    "state.Pending": "Pendente",
-    "state.Ready": "Pronto",
-    "state.Running": "Executando",
-    "state.Starting": "Iniciando",
-    "state.Stopped": "Parado",
-    "state.Stopping": "Parando",
-    "state.Suspended": "Suspendido",
-    "state.detached": "Desanexado",
-    "title.upload.volume": "Upload Volume",
-    "ui.listView.filters.all": "Todos",
-    "ui.listView.filters.mine": "Meus"
-};
diff --git a/ui/legacy/l10n/ru_RU.js b/ui/legacy/l10n/ru_RU.js
deleted file mode 100644
index a3485a5..0000000
--- a/ui/legacy/l10n/ru_RU.js
+++ /dev/null
@@ -1,2312 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "Код ICMP",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "Тип ICMP",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "Параметры элемента изменены",
-    "confirm.enable.s3": "Заполните информацию для включения  S3-совместимого дополнительного хранилища",
-    "confirm.enable.swift": "Заполните нижеследующую информацию для включения поддержи Swift",
-    "error.could.not.change.your.password.because.non.native.user": "Error could not change your password because LDAP is enabled.",
-    "error.could.not.enable.zone": "Не удалось включить зону",
-    "error.installWizard.message": "Что-то не так. Вернитесь назад и исправьте ошибки.",
-    "error.invalid.username.password": "Неправильній логин или пароль",
-    "error.login": "Ваше имя пользователя или пароль не соответствуют нашим записям.",
-    "error.menu.select": "Не удается выполнить действие из-за отсутствия выбраных пунктов.",
-    "error.mgmt.server.inaccessible": "Сервер управления недоступен. Пожалуйста попробуйте еще раз позже.",
-    "error.password.not.match": "Пароли не совпадают",
-    "error.please.specify.physical.network.tags": "Предложение сети недоступно, пока вы не укажете теги для этой физической сети.",
-    "error.session.expired": "Время ожидания сессии истекло.",
-    "error.something.went.wrong.please.correct.the.following": "Что-то не так. Вернитесь назад и исправьте ошибки.",
-    "error.unable.to.reach.management.server": "Не удается подключиться к серверу управления",
-    "error.unresolved.internet.name": "Ваше сетевое имя не удалось разрешить.",
-    "force.delete": "Принудительное удаление",
-    "force.delete.domain.warning": "Предупреждение: Выбор этой опции приведет к удалению всех дочерних доменов и связанных с ними учетных записей и их ресурсов",
-    "force.remove": "Принудительное удаление",
-    "force.remove.host.warning": "Выбор этой опции приведет к принудительной остановке работающих виртуальных машин перед удалением сервера из кластера.",
-    "force.stop": "Принудительно остановить",
-    "force.stop.instance.warning": "Внимание: Принудительная остановка должна применяться в самую последнюю очередь. Вы можете потерять данные или получить неожиданное поведение/состояние виртуальной машины.",
-    "hint.no.host.tags": "No host tags found",
-    "hint.no.storage.tags": "No storage tags found",
-    "hint.type.part.host.tag": "Type in part of a host tag",
-    "hint.type.part.storage.tag": "Type in part of a storage tag",
-    "image.directory": "Каталог с образами",
-    "inline": "Встроенный",
-    "instances.actions.reboot.label": "Перезагрузить машину",
-    "label.CIDR.list": "Список CIDR",
-    "label.CIDR.of.destination.network": "CIDR сети назначения",
-    "label.CPU.cap": "CPU Cap",
-    "label.DHCP.server.type": "Тип сервера DHCP",
-    "label.DNS.domain.for.guest.networks": "DNS домен для гостевой сети",
-    "label.ESP.encryption": "шифрование ESP",
-    "label.ESP.hash": "хэш ESP",
-    "label.ESP.lifetime": "Время жизни ESP (в секундах)",
-    "label.ESP.policy": "Политика ESP",
-    "label.IKE.DH": "IKE DH",
-    "label.IKE.encryption": "Шифрование IKE",
-    "label.IKE.hash": "IKE Hash",
-    "label.IKE.lifetime": "IKE lifetime (second)",
-    "label.IKE.policy": "Политика IKE",
-    "label.IPsec.preshared.key": "IPsec Preshared-Key",
-    "label.LB.isolation": "Изоляция LB",
-    "label.LUN.number": "LUN #",
-    "label.PA": "static NAT",
-    "label.PA.log.profile": "Palo Alto Log Profile",
-    "label.PA.threat.profile": "Palo Alto Threat Profile",
-    "label.PING.CIFS.password": "Пароль PING CIFS",
-    "label.PING.CIFS.username": "Имя пользователя PING CIFS",
-    "label.PING.dir": "Каталог PING",
-    "label.PING.storage.IP": "IP адрес PING-хранилища",
-    "label.PreSetup": "Предварительная настройка",
-    "label.Pxe.server.type": "Тип сервера PXE",
-    "label.SNMP.community": "SNMP Community",
-    "label.SNMP.port": "SNMP Port",
-    "label.SR.name": "SR Name-Label",
-    "label.SharedMountPoint": "ОткрытаяТочкаДоступа",
-    "label.TFTP.dir": "Каталог TFTP",
-    "label.VMFS.datastore": "Хранилище VMFS",
-    "label.VMs.in.tier": "Tier ВМ",
-    "label.VPC.limits": "Ограничения VPC",
-    "label.VPC.router.details": "Детали маршрутизатора VPC",
-    "label.VPN.connection": "VPN подлючение",
-    "label.VPN.customer.gateway": "VPN шлюз клиента",
-    "label.VPN.gateway": "VPN шлюз",
-    "label.Xenserver.Tools.Version61plus": "Original XS Version is 6.1+",
-    "label.about": "О системе",
-    "label.about.app": "О CloudStack",
-    "label.accept.project.invitation": "Принять приглашение на проект",
-    "label.account": "Учётная запись",
-    "label.account.and.security.group": "Аккаунт, группы безопасности",
-    "label.account.details": "Account details",
-    "label.account.id": "ID учётной записи",
-    "label.account.lower": "Учётная запись",
-    "label.account.name": "Имя учётной записи",
-    "label.account.specific": "Специфика аккауннта",
-    "label.account.type": "Account Type",
-    "label.accounts": "Учётные записи",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL List Rules",
-    "label.acl.name": "ACL Name",
-    "label.acl.replaced": "ACL replaced",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "Получить новый IP",
-    "label.acquire.new.secondary.ip": "Запросить дополнительный IP-адрес",
-    "label.action": "Действия",
-    "label.action.attach.disk": "Подключить диск",
-    "label.action.attach.disk.processing": "Подключение диска...",
-    "label.action.attach.iso": "Подключить ISO",
-    "label.action.attach.iso.processing": "Подключение ISO...",
-    "label.action.cancel.maintenance.mode": "Выйти из режима обслуживания.",
-    "label.action.cancel.maintenance.mode.processing": "Выход из режима обслуживания...",
-    "label.action.change.password": "Изменить пароль",
-    "label.action.change.service": "Изменить службу",
-    "label.action.change.service.processing": "Изменение службы...",
-    "label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
-    "label.action.copy.ISO": "Копировать ISO",
-    "label.action.copy.ISO.processing": "Копирование ISO...",
-    "label.action.copy.template": "Скопировать шаблон",
-    "label.action.copy.template.processing": "Копирование шаблона...",
-    "label.action.create.template": "Создать шаблон",
-    "label.action.create.template.from.vm": "Создать шаблон из ВМ",
-    "label.action.create.template.from.volume": "Создать шаблон из тома",
-    "label.action.create.template.processing": "Создание шаблона...",
-    "label.action.create.vm": "Создать виртуальную машину",
-    "label.action.create.vm.processing": "Создание виртуальной машины...",
-    "label.action.create.volume": "Создать диск",
-    "label.action.create.volume.processing": "Создание диска...",
-    "label.action.delete.IP.range": "Удалить диапазон IP адресов",
-    "label.action.delete.IP.range.processing": "Удаление диапазона IP адресов...",
-    "label.action.delete.ISO": "Удалить ISO",
-    "label.action.delete.ISO.processing": "Удаление ISO...",
-    "label.action.delete.account": "Удалить учётную запись",
-    "label.action.delete.account.processing": "Удаление учётной записи...",
-    "label.action.delete.cluster": "Удалить кластер",
-    "label.action.delete.cluster.processing": "Удаление кластера...",
-    "label.action.delete.disk.offering": "Удалить услугу дискового пространства",
-    "label.action.delete.disk.offering.processing": "Удаление услуги дискового пространства...",
-    "label.action.delete.domain": "Удалить домен",
-    "label.action.delete.domain.processing": "Удаление домена...",
-    "label.action.delete.firewall": "Удалить правило фаервола",
-    "label.action.delete.firewall.processing": "Удаление сетевого экрана...",
-    "label.action.delete.ingress.rule": "Удалить входящее правило",
-    "label.action.delete.ingress.rule.processing": "Удаление входящего правила...",
-    "label.action.delete.load.balancer": "Удалить правило балансировки нагрузки",
-    "label.action.delete.load.balancer.processing": "Удаление балансировщика нагрузки....",
-    "label.action.delete.network": "Удалить сеть",
-    "label.action.delete.network.processing": "Удаление сети...",
-    "label.action.delete.nexusVswitch": "Удалить NexusVswitch",
-    "label.action.delete.nic": "Удалить NIC",
-    "label.action.delete.physical.network": "Удаление физической сети",
-    "label.action.delete.pod": "Удалить стенд",
-    "label.action.delete.pod.processing": "Удаление стенда...",
-    "label.action.delete.primary.storage": "Удалить основное хранилище",
-    "label.action.delete.primary.storage.processing": "Удаление основного хранилища...",
-    "label.action.delete.secondary.storage": "Удалить дополнительное хранилище",
-    "label.action.delete.secondary.storage.processing": "Удаление дополнительного хранилища...",
-    "label.action.delete.security.group": "Удалить Security Group",
-    "label.action.delete.security.group.processing": "Удаление Security Group....",
-    "label.action.delete.service.offering": "Удалить служебный ресурс",
-    "label.action.delete.service.offering.processing": "Удаление служебного ресурса...",
-    "label.action.delete.snapshot": "Удалить снимок",
-    "label.action.delete.snapshot.processing": "Удаление снимка...",
-    "label.action.delete.system.service.offering": "Удалить системный ресурс",
-    "label.action.delete.template": "Удалить шаблон",
-    "label.action.delete.template.processing": "Удаление шаблона...",
-    "label.action.delete.user": "Удалить пользователя",
-    "label.action.delete.user.processing": "Удаление пользователя...",
-    "label.action.delete.volume": "Удалить том",
-    "label.action.delete.volume.processing": "Удаление тома...",
-    "label.action.delete.zone": "Удалить зону",
-    "label.action.delete.zone.processing": "Удаление зоны...",
-    "label.action.destroy.instance": "Уничтожить машину",
-    "label.action.destroy.instance.processing": "Уничтожение машины...",
-    "label.action.destroy.systemvm": "Уничтожить системную ВМ",
-    "label.action.destroy.systemvm.processing": "Уничтожение системной ВМ....",
-    "label.action.destroy.volume":"Destroy Volume",
-    "label.action.detach.disk": "Отсоединить диск",
-    "label.action.detach.disk.processing": "Отсоединение диска....",
-    "label.action.detach.iso": "Отсоединить ISO",
-    "label.action.detach.iso.processing": "Отсоединение ISO....",
-    "label.action.disable.account": "Деактивировать учетную запись",
-    "label.action.disable.account.processing": "Выключение учётной записи",
-    "label.action.disable.cluster": "Отключть кластер",
-    "label.action.disable.cluster.processing": "Отключение кластера...",
-    "label.action.disable.nexusVswitch": "Отключить Nexus 1000v",
-    "label.action.disable.physical.network": "Отключить физическую сеть",
-    "label.action.disable.pod": "Отключить стенд.",
-    "label.action.disable.pod.processing": "Отключение стенда...",
-    "label.action.disable.static.NAT": "Отключить Static NAT",
-    "label.action.disable.static.NAT.processing": "Отключение статической трансляции адресов....",
-    "label.action.disable.user": "Деактивировать пользователя",
-    "label.action.disable.user.processing": "Деактивация пользователя....",
-    "label.action.disable.zone": "Оключить зону",
-    "label.action.disable.zone.processing": "Отключение зоны...",
-    "label.action.download.ISO": "Загрузить ISO",
-    "label.action.download.template": "Загрузить шаблон",
-    "label.action.download.volume": "Загрузить диск",
-    "label.action.download.volume.processing": "Загрузка диска....",
-    "label.action.edit.ISO": "Измениить ISO",
-    "label.action.edit.account": "Изменить учетную запись",
-    "label.action.edit.disk.offering": "Настроить услугу дискового пространства",
-    "label.action.edit.domain": "Изменить домен",
-    "label.action.edit.global.setting": "Изменить основные настройки",
-    "label.action.edit.host": "Редактировать узел",
-    "label.action.edit.instance": "Изменить машину",
-    "label.action.edit.network": "Настроить сеть",
-    "label.action.edit.network.offering": "Настроить услугу сетевого сервиса",
-    "label.action.edit.network.processing": "Настройка сети....",
-    "label.action.edit.pod": "Редактировать стенд",
-    "label.action.edit.primary.storage": "Изменить основное хранилище",
-    "label.action.edit.resource.limits": "Изменить ресурсные ограничения",
-    "label.action.edit.service.offering": "Изменить ресурсы обслуживания",
-    "label.action.edit.template": "Изменить шаблон",
-    "label.action.edit.user": "Изменить пользователя",
-    "label.action.edit.zone": "Изменить зону",
-    "label.action.enable.account": "Активировать учетную запись",
-    "label.action.enable.account.processing": "Активация учетной записи....",
-    "label.action.enable.cluster": "Включить кластер",
-    "label.action.enable.cluster.processing": "Включение кластера...",
-    "label.action.enable.maintenance.mode": "Активировать режим обслуживания",
-    "label.action.enable.maintenance.mode.processing": "Активация режима обслуживания.....",
-    "label.action.enable.nexusVswitch": "Включить Nexus 1000v",
-    "label.action.enable.physical.network": "Включить физическую сеть",
-    "label.action.enable.pod": "Включить стенд",
-    "label.action.enable.pod.processing": "Включение стенда..",
-    "label.action.enable.static.NAT": "Активировать Static NAT",
-    "label.action.enable.static.NAT.processing": "Активация статической трансляции адресов....",
-    "label.action.enable.user": "Активировать пользователя",
-    "label.action.enable.user.processing": "Активация пользователя....",
-    "label.action.enable.zone": "Активировать зону",
-    "label.action.enable.zone.processing": "Активация зоны...",
-    "label.action.expunge.instance": "Уничтожить ВМ",
-    "label.action.expunge.instance.processing": "Expunging Instance....",
-    "label.action.force.reconnect": "Принудительно переподключить",
-    "label.action.force.reconnect.processing": "Переподключение...",
-    "label.action.generate.keys": "Генерировать ключи",
-    "label.action.generate.keys.processing": "Генерация ключей...",
-    "label.action.list.nexusVswitch": "Просмотр Nexus 1000v",
-    "label.action.lock.account": "Заблокировать учётную запись",
-    "label.action.lock.account.processing": "Блокирование учетной записи....",
-    "label.action.manage.cluster": "Управление кластером",
-    "label.action.manage.cluster.processing": "Переход кластера в режим обслуживания...",
-    "label.action.migrate.instance": "Перенести машину",
-    "label.action.migrate.instance.processing": "Миграция машины....",
-    "label.action.migrate.router": "Перенести роутер",
-    "label.action.migrate.router.processing": "Перенос роутера...",
-    "label.action.migrate.systemvm": "Перенести системную ВМ",
-    "label.action.migrate.systemvm.processing": "Перенос системной ВМ...",
-    "label.action.reboot.instance": "Перезагрузить машину",
-    "label.action.reboot.instance.processing": "Перезагрузка машины...",
-    "label.action.reboot.router": "Перезагрузить роутер",
-    "label.action.reboot.router.processing": "Перезагрузка роутера...",
-    "label.action.reboot.systemvm": "Перезапустить системную ВМ",
-    "label.action.reboot.systemvm.processing": "Перезагрузка системной ВМ",
-    "label.action.recover.volume":"Recover Volume",
-    "label.action.recurring.snapshot": "Повторяемые снимки",
-    "label.action.register.iso": "Регистрация ISO",
-    "label.action.register.template": "Регистрация шаблона по URL",
-    "label.action.release.ip": "Освободить IP",
-    "label.action.release.ip.processing": "Освобождение IP...",
-    "label.action.remove.host": "Удалить узел",
-    "label.action.remove.host.processing": "Удаление узла...",
-    "label.action.reset.password": "Сбросить пароль",
-    "label.action.reset.password.processing": "Сброс пароля...",
-    "label.action.resize.volume": "Изменить размер диска",
-    "label.action.resize.volume.processing": "Изменение размера диска....",
-    "label.action.resource.limits": "Ограничения ресуров",
-    "label.action.restore.instance": "Восстановить машину",
-    "label.action.restore.instance.processing": "Восстановление машины...",
-    "label.action.revert.snapshot": "Возврат к снимку",
-    "label.action.revert.snapshot.processing": "Возвращение к снимку...",
-    "label.action.start.instance": "Запустить машину",
-    "label.action.start.instance.processing": "Запуск машины...",
-    "label.action.start.router": "Запустить роутер",
-    "label.action.start.router.processing": "Запуск роутера....",
-    "label.action.start.systemvm": "Запустить системную ВМ",
-    "label.action.start.systemvm.processing": "Запуск системной ВМ...",
-    "label.action.stop.instance": "Остановить машину",
-    "label.action.stop.instance.processing": "Остановка машины...",
-    "label.action.stop.router": "Остановить роутер",
-    "label.action.stop.router.processing": "Остановка роутера...",
-    "label.action.stop.systemvm": "Остановить системной ВМ",
-    "label.action.stop.systemvm.processing": "Остановка системной ВМ...",
-    "label.action.take.snapshot": "Получить снимок...",
-    "label.action.take.snapshot.processing": "Получение снимка...",
-    "label.action.unmanage.cluster": "Перевести кластер в обычный режим",
-    "label.action.unmanage.cluster.processing": "Переход кластера в обычный режим...",
-    "label.action.update.OS.preference": "Обновить настройки ОС",
-    "label.action.update.OS.preference.processing": "Обновление параметров ОС...",
-    "label.action.update.resource.count": "Обновить учет ресурсов",
-    "label.action.update.resource.count.processing": "Обновление учета ресурсов",
-    "label.action.vmsnapshot.create": "Создать снимок ВМ",
-    "label.action.vmsnapshot.delete": "Удалить снимок ВМ",
-    "label.action.vmsnapshot.revert": "Восстановить снимок ВМ",
-    "label.actions": "Действия",
-    "label.activate.project": "Запустить проект",
-    "label.active.sessions": "Активные сессии",
-    "label.add": "Добавить",
-    "label.add.ACL": "Добавить ACL",
-    "label.add.BigSwitchBcf.device": "Add BigSwitch BCF Controller",
-    "label.add.BrocadeVcs.device": "Add Brocade Vcs Switch",
-    "label.add.F5.device": "Добавить F5 устройво",
-    "label.add.LDAP.account": "Add LDAP Account",
-    "label.add.NiciraNvp.device": "Добавить контроллер Nvp",
-    "label.add.OpenDaylight.device": "Add OpenDaylight Controller",
-    "label.add.PA.device": "Добавить устройство Palo Alto",
-    "label.add.SRX.device": "Добавить SRX устройство",
-    "label.add.VM.to.tier": "Добавить ВМ к tier",
-    "label.add.VPN.gateway": "Добавить VPN шлюз",
-    "label.add.account": "Добавить учетную запись",
-    "label.add.account.to.project": "Добавить учётные записи в проект",
-    "label.add.accounts": "Добавить учётные записи",
-    "label.add.accounts.to": "Добавить учётные записи",
-    "label.add.acl.list": "Add ACL List",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "Добавить новую affinity group",
-    "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
-    "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
-    "label.add.by": "Добавить",
-    "label.add.by.cidr": "Добавить к CIDR",
-    "label.add.by.group": "Добавить к группе",
-    "label.add.ciscoASA1000v": "Add CiscoASA1000v Resource",
-    "label.add.cluster": "Добавить кластер",
-    "label.add.compute.offering": "Добавить ресурсы вычисления",
-    "label.add.direct.iprange": "Добавить диапазон маршрутизируемых IP адресов",
-    "label.add.disk.offering": "Добавить услугу дискового пространства",
-    "label.add.domain": "Добавить домен",
-    "label.add.egress.rule": "Добавить исходящее правило",
-    "label.add.firewall": "Добавить правило фаервола.",
-    "label.add.globo.dns": "Add GloboDNS",
-    "label.add.gslb": "Add GSLB",
-    "label.add.guest.network": "Добавить гостевую сеть",
-    "label.add.host": "Добавить узел",
-    "label.add.ingress.rule": "Добавить входящее правило",
-    "label.add.intermediate.certificate": "Add intermediate certificate",
-    "label.add.internal.lb": "Add Internal LB",
-    "label.add.ip.range": "Добавить диапазон адресов",
-    "label.add.isolated.guest.network": "Добавить изолированную гостевую сеть",
-    "label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
-    "label.add.isolated.network": "Добавить изолированную сеть",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "Добавить LDAP аккаунт",
-    "label.add.list.name": "ACL List Name",
-    "label.add.load.balancer": "Добавить балансировщик нагрузки",
-    "label.add.more": "Добавить что-то еще",
-    "label.add.netScaler.device": "Добавить Netscaler устройство",
-    "label.add.network": "Добавить сеть",
-    "label.add.network.ACL": "Добавить сетевую ACL",
-    "label.add.network.acl.list": "Add Network ACL List",
-    "label.add.network.device": "Добавить сетевое устройство",
-    "label.add.network.offering": "Добавить сетевые ресурсы",
-    "label.add.new.F5": "Добавить новый F5",
-    "label.add.new.NetScaler": "Добавить новый NetScaler",
-    "label.add.new.PA": "Добавить Palo Alto",
-    "label.add.new.SRX": "Добавить новый SRX",
-    "label.add.new.gateway": "Добавить новый шлюз",
-    "label.add.new.tier": "Добавить новый Tier",
-    "label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
-    "label.add.physical.network": "Добавить физическую сеть",
-    "label.add.pod": "Добавить стенд",
-    "label.add.port.forwarding.rule": "Добавить правило перенаправление порта",
-    "label.add.portable.ip.range": "Add Portable IP Range",
-    "label.add.primary.storage": "Добавить основное хранилище данных",
-    "label.add.private.gateway": "Add Private Gateway",
-    "label.add.region": "Добавить регион",
-    "label.add.resources": "Добавить ресурсов",
-    "label.add.role": "Add Role",
-    "label.add.route": "Добавить маршрут",
-    "label.add.rule": "Добавить правило",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "Добавить дополнительное хранилище",
-    "label.add.security.group": "Добавить группу безопасности",
-    "label.add.service.offering": "Добавить службу",
-    "label.add.static.nat.rule": "Добавить правило статичного NAT",
-    "label.add.static.route": "Добавить статичный маршрут",
-    "label.add.system.service.offering": "Добавить услуги системных служб",
-    "label.add.template": "Добавить шаблон",
-    "label.add.to.group": "Добавить в группу",
-    "label.add.ucs.manager": "Add UCS Manager",
-    "label.add.user": "Добавить пользователя",
-    "label.add.userdata": "Userdata",
-    "label.add.vlan": "Добавить VLAN",
-    "label.add.vm": "Добавить ВМ",
-    "label.add.vms": "Добавить ВМ-ы",
-    "label.add.vms.to.lb": "Добавить ВМ в правило балансировки нагрузки",
-    "label.add.vmware.datacenter": "Add VMware datacenter",
-    "label.add.vnmc.device": "Add VNMC device",
-    "label.add.vnmc.provider": "Add VNMC provider",
-    "label.add.volume": "Добавить диск",
-    "label.add.vpc": "Добавить VPC",
-    "label.add.vpc.offering": "Добавить услугу VPC",
-    "label.add.vpn.customer.gateway": "Добавить VPN шлюз клиента",
-    "label.add.vpn.user": "Добавить пользователя VPN",
-    "label.add.vxlan": "Добавить VXLAN",
-    "label.add.zone": "Добавить зону",
-    "label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
-    "label.added.network.offering": "Добавить сетевые услуги",
-    "label.added.new.bigswitch.bcf.controller": "Added new BigSwitch BCF Controller",
-    "label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
-    "label.addes.new.f5": "Added new F5",
-    "label.adding": "Добавление зоны",
-    "label.adding.cluster": "Добавление кластера",
-    "label.adding.failed": "Добавление не удалось",
-    "label.adding.pod": "Добавление стенда",
-    "label.adding.processing": "Добавление...",
-    "label.adding.succeeded": "Добавление завершено успешно",
-    "label.adding.user": "Добавление пользователя",
-    "label.adding.zone": "Добавление зоны",
-    "label.additional.networks": "Дополнительные сети",
-    "label.admin": "Администратор",
-    "label.admin.accounts": "Административные учётные записи",
-    "label.advanced": "Расширенный",
-    "label.advanced.mode": "Расширенный режим",
-    "label.advanced.search": "Расширенный поиск",
-    "label.affinity": " Совместимость",
-    "label.affinity.group": "Affinity Group",
-    "label.affinity.groups": "Affinity Groups",
-    "label.agent.password": "Пароль агента",
-    "label.agent.port": "Agent Port",
-    "label.agent.state": "Agent State",
-    "label.agent.username": "Имя агента",
-    "label.agree": "Согласен",
-    "label.alert": "Тревога",
-    "label.alert.archived": "Alert Archived",
-    "label.alert.deleted": "Alert Deleted",
-    "label.alert.details": "Alert details",
-    "label.algorithm": "Алгоритм",
-    "label.allocated": "Распределено",
-    "label.allocation.state": "Используется",
-    "label.allow": "Allow",
-    "label.anti.affinity": "Anti-affinity",
-    "label.anti.affinity.group": "Anti-affinity Group",
-    "label.anti.affinity.groups": "Anti-affinity Groups",
-    "label.api.key": "Ключ API",
-    "label.api.version": "Версия API",
-    "label.app.name": "CloudStack",
-    "label.apply": "Применить",
-    "label.archive": "Archive",
-    "label.archive.alerts": "Архивировать тревоги",
-    "label.archive.events": "Архивировать события",
-    "label.assign": "Присвоено",
-    "label.assign.instance.another": "Assign Instance to Another Account",
-    "label.assign.to.load.balancer": "Включение машины в систему балансировки нагрузки",
-    "label.assign.vms": "Assign VMs",
-    "label.assigned.vms": "Assigned VMs",
-    "label.associate.public.ip": "Связанные публичне IP",
-    "label.associated.network": "Связанная сеть",
-    "label.associated.network.id": "ID Связанной сети",
-    "label.associated.profile": "Associated Profile",
-    "label.attached.iso": "Присоединенный ISO",
-    "label.author.email": "E-mail автора",
-    "label.author.name": "Имя автора",
-    "label.autoscale": "AutoScale",
-    "label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
-    "label.availability": "Доступность",
-    "label.availability.zone": "Доступность зоны",
-    "label.availabilityZone": "availabilityZone",
-    "label.available": "Доступно",
-    "label.available.public.ips": "Доступные маршрутизируемые IP адреса",
-    "label.back": "Назад",
-    "label.bandwidth": "Пропускная способность",
-    "label.baremetal.dhcp.devices": "Baremetal DHCP Devices",
-    "label.baremetal.dhcp.provider": "Baremetal DHCP Provider",
-    "label.baremetal.pxe.device": "Add Baremetal PXE Device",
-    "label.baremetal.pxe.devices": "Baremetal PXE Devices",
-    "label.baremetal.pxe.provider": "Baremetal PXE Provider",
-    "label.baremetal.rack.configuration": "Baremetal Rack Configuration",
-    "label.basic": "Основной",
-    "label.basic.mode": "Основной режим",
-    "label.bigswitch.bcf.details": "BigSwitch BCF details",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF NAT Enabled",
-    "label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
-    "label.blade.id": "Blade ID",
-    "label.blades": "Blades",
-    "label.bootable": "Загружаемый",
-    "label.broadcast.domain.range": "Диапазон широковещательного домена",
-    "label.broadcast.domain.type": "Тип широковещательного домена",
-    "label.broadcast.uri": "Широковещательный URI",
-    "label.broadcasturi": "broadcasturi",
-    "label.broadcat.uri": "Широковещательный URI",
-    "label.brocade.vcs.address": "Vcs Switch Address",
-    "label.brocade.vcs.details": "Brocade Vcs Switch details",
-    "label.by.account": "По учетным записям",
-    "label.by.alert.type": "По типу тревоги",
-    "label.by.availability": "По доступности",
-    "label.by.date.end": "По дате(конец)",
-    "label.by.date.start": "По дате(начало)",
-    "label.by.domain": "До домену",
-    "label.by.end.date": "По дате окончания",
-    "label.by.event.type": "По типу события",
-    "label.by.level": "По уровню",
-    "label.by.pod": "По стенду",
-    "label.by.role": "По ролям",
-    "label.by.start.date": "По дате начала",
-    "label.by.state": "По состоянию",
-    "label.by.traffic.type": "По типу трафика",
-    "label.by.type": "По типу",
-    "label.by.type.id": "По типу ID",
-    "label.by.zone": "По зоне",
-    "label.bytes.received": "Байт получено",
-    "label.bytes.sent": "Байтов отправлено",
-    "label.cache.mode": "Write-cache Type",
-    "label.cancel": "Отмена",
-    "label.capacity": "Мощность",
-    "label.capacity.bytes": "Количество Байт",
-    "label.capacity.iops": "количество IOPS",
-    "label.certificate": "Сертификат",
-    "label.change.affinity": "Change Affinity",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "Изменить ресурс обслуживания",
-    "label.change.value": "Изменить значение",
-    "label.character": "Символов",
-    "label.chassis": "Chassis",
-    "label.checksum": "checksum",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR или учётная запись/группа безопасности",
-    "label.cidr.list": "CIDR источника",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP Address",
-    "label.cisco.nexus1000v.password": "Nexus 1000v Password",
-    "label.cisco.nexus1000v.username": "Nexus 1000v Username",
-    "label.ciscovnmc.resource.details": "CiscoVNMC resource details",
-    "label.clean.up": "Очистить",
-    "label.clear.list": "Очистить список",
-    "label.close": "Закрыть",
-    "label.cloud.console": "Панель управления облаком",
-    "label.cloud.managed": "Панель управления",
-    "label.cluster": "Кластер",
-    "label.cluster.name": "Имя кластера",
-    "label.cluster.type": "Тип кластера",
-    "label.clusters": "Кластеры",
-    "label.clvm": "CLVM",
-    "label.code": "Код",
-    "label.community": "Сообщество",
-    "label.compute": "Вычисление",
-    "label.compute.and.storage": "Вычисления и хранилище",
-    "label.compute.offering": "Услуга вычесления",
-    "label.compute.offerings": "Услуги вычесления",
-    "label.configuration": "Конфигурация",
-    "label.configure": "Настроить",
-    "label.configure.ldap": "Configure LDAP",
-    "label.configure.network.ACLs": "Настройка ACL сети",
-    "label.configure.sticky.policy": "Configure Sticky Policy",
-    "label.configure.vpc": "Настроить VPC",
-    "label.confirm.password": "Подтвердите пароль",
-    "label.confirmation": "Подтверждение",
-    "label.congratulations": "Поздравляем!",
-    "label.conserve.mode": "Экономичный режим",
-    "label.console.proxy": "Прокси консоли",
-    "label.console.proxy.vm": "Console Proxy VM",
-    "label.continue": "Продолжить",
-    "label.continue.basic.install": "Продолжить простую установку",
-    "label.copying.iso": "Копирование ISO",
-    "label.corrections.saved": "Изменения сохранены",
-    "label.counter": "Counter",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "Выделенные CPU",
-    "label.cpu.allocated.for.VMs": "Выделенные виртуальным машинам CPU",
-    "label.cpu.limits": "Ограничения CPU",
-    "label.cpu.mhz": "CPU (в Мгц)",
-    "label.cpu.utilized": "Загружено CPU",
-    "label.create.VPN.connection": "Создать VPN подлючение",
-    "label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
-    "label.create.nfs.secondary.staging.store": "Create NFS secondary staging store",
-    "label.create.project": "Создать проект",
-    "label.create.ssh.key.pair": "Create a SSH Key Pair",
-    "label.create.template": "Создать шаблон",
-    "label.created": "Создано",
-    "label.created.by.system": "Создано системой",
-    "label.cross.zones": "Общие для зон",
-    "label.custom": "Custom",
-    "label.custom.disk.iops": "Свое кол-во IPOS",
-    "label.custom.disk.offering": "Custom Disk Offering",
-    "label.custom.disk.size": "Произвольный размер диска",
-    "label.daily": "Ежедневно",
-    "label.data.disk.offering": "Услуга дополнительного дискового пространства",
-    "label.date": "Дата",
-    "label.day": "Day",
-    "label.day.of.month": "День месяца",
-    "label.day.of.week": "День недели",
-    "label.dc.name": "DC Name",
-    "label.dead.peer.detection": "Dead Peer Detection",
-    "label.decline.invitation": "Отменить приглашение",
-    "label.dedicate": "Dedicate",
-    "label.dedicate.cluster": "Dedicate Cluster",
-    "label.dedicate.host": "Dedicate Host",
-    "label.dedicate.pod": "Dedicate Pod",
-    "label.dedicate.vlan.vni.range": "Dedicate VLAN/VNI Range",
-    "label.dedicate.zone": "Dedicate Zone",
-    "label.dedicated": "Выделенный",
-    "label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
-    "label.default": "По умолчанию",
-    "label.default.egress.policy": "Исходящая политика по умолчанию",
-    "label.default.use": "По умолчанию",
-    "label.default.view": "Стандартный вид",
-    "label.delete": "Удалить",
-    "label.delete.BigSwitchBcf": "Remove BigSwitch BCF Controller",
-    "label.delete.BrocadeVcs": "Remove Brocade Vcs Switch",
-    "label.delete.F5": "Удалить F5",
-    "label.delete.NetScaler": "Удалить NetScaler",
-    "label.delete.NiciraNvp": "Удалить Nvp контроллер",
-    "label.delete.OpenDaylight.device": "Delete OpenDaylight Controller",
-    "label.delete.PA": "Удалить Palo Alto",
-    "label.delete.SRX": "Удалить SRX",
-    "label.delete.VPN.connection": "Удалить VPN подлючение",
-    "label.delete.VPN.customer.gateway": "Удалить VPN шлюз клиента",
-    "label.delete.VPN.gateway": "Удалить VPN шлюз",
-    "label.delete.acl.list": "Delete ACL List",
-    "label.delete.affinity.group": "Удалить affinity group",
-    "label.delete.alerts": "Удалить тревоги",
-    "label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
-    "label.delete.ciscoASA1000v": "Delete CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
-    "label.delete.events": "Удалить события",
-    "label.delete.gateway": "Удалить шлюз",
-    "label.delete.internal.lb": "Delete Internal LB",
-    "label.delete.portable.ip.range": "Delete Portable IP Range",
-    "label.delete.profile": "Удалить профиль",
-    "label.delete.project": "Удалить проект",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "Delete Secondary Staging Store",
-    "label.delete.ucs.manager": "Delete UCS Manager",
-    "label.delete.vpn.user": "Удалить пользователя VPN",
-    "label.deleting.failed": "Удаление не удалось",
-    "label.deleting.processing": "Удаление...",
-    "label.deny": "Deny",
-    "label.deployment.planner": "Deployment planner",
-    "label.description": "Описание",
-    "label.destination.physical.network.id": "ID целевой физической сети",
-    "label.destination.zone": "Целевая зона",
-    "label.destroy": "Уничтожить",
-    "label.destroy.router": "Удалить роутер",
-    "label.destroy.vm.graceperiod": "Destroy VM Grace Period",
-    "label.detaching.disk": "Отключение диска",
-    "label.details": "Детали",
-    "label.device.id": "ID устройства",
-    "label.devices": "Устройство",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "Выданные публичные IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "Прямые IP-адреса",
-    "label.disable.autoscale": "Выключить автоматическое маштабирование",
-    "label.disable.host": "Отключить хост",
-    "label.disable.network.offering": "Отключить сетевые услуги",
-    "label.disable.provider": "Выключить поставщика",
-    "label.disable.vnmc.provider": "Disable VNMC provider",
-    "label.disable.vpc.offering": "Отключить услугу VPC",
-    "label.disable.vpn": "Выключить VPN",
-    "label.disabled": "Выключено",
-    "label.disabling.vpn.access": "Выключение доступа к VPN",
-    "label.disassociate.profile.blade": "Disassociate Profile from Blade",
-    "label.disbale.vnmc.device": "Disable VNMC device",
-    "label.disk.allocated": "Занято дисковое пространства",
-    "label.disk.bytes.read.rate": "Скорость чтения диска (BPS)",
-    "label.disk.bytes.write.rate": "Скорость записи диска (BPS)",
-    "label.disk.iops.max": "Макс. IOPS",
-    "label.disk.iops.min": "Мин. IOPS",
-    "label.disk.iops.read.rate": "Скорость записи диска (IOPS)",
-    "label.disk.iops.total": "Всего IOPS",
-    "label.disk.iops.write.rate": "Скорость записи диска (IOPS)",
-    "label.disk.offering": "Услуга дискового пространства",
-    "label.disk.offering.details": "Disk offering details",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "Provisioning Type",
-    "label.disk.read.bytes": "Прочитано с диска (Байт)",
-    "label.disk.read.io": "Прочитано с диска (IO)",
-    "label.disk.size": "Размер диска",
-    "label.disk.size.gb": "Размер диска (в ГБ)",
-    "label.disk.total": "Всего в дисках",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "Объем диска",
-    "label.disk.write.bytes": "Записано на диск (Байт)",
-    "label.disk.write.io": "Записано на диск (IO)",
-    "label.diskoffering": "diskoffering",
-    "label.display.name": "Display Name",
-    "label.display.text": "Отображаемый текст",
-    "label.distributedrouter": "Distributed Router",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "Домен",
-    "label.domain.admin": "Администратор домена",
-    "label.domain.details": "Domain details",
-    "label.domain.id": "ID домена",
-    "label.domain.lower": "Домен",
-    "label.domain.name": "Имя домена",
-    "label.domain.router": "Машрутизатор",
-    "label.domain.suffix": "Суффикс домена DNS (нпр. xyz.com)",
-    "label.done": "Готово",
-    "label.double.quotes.are.not.allowed": "Двойные кавычки не допускаются",
-    "label.download.progress": "Статус загрузки",
-    "label.drag.new.position": "Переместить на новую позицию",
-    "label.duration.in.sec": "Duration (in sec)",
-    "label.dynamically.scalable": "Динамическое масштабирование",
-    "label.edit": "Редактировать",
-    "label.edit.acl.rule": "Edit ACL rule",
-    "label.edit.affinity.group": "Редактировать affinity group",
-    "label.edit.lb.rule": "Редактировать LB правила",
-    "label.edit.network.details": "Редактировать сетевые настройки",
-    "label.edit.project.details": "Редактировать детали проекта",
-    "label.edit.region": "Редактировать регион",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "Edit rule",
-    "label.edit.secondary.ips": "Изменить дополнительные IP-адреса",
-    "label.edit.tags": "Редактировать тэги",
-    "label.edit.traffic.type": "Изменить тип трафика",
-    "label.edit.vpc": "Редактировать VPC",
-    "label.egress.default.policy": "Исходящая политика по умолчанию",
-    "label.egress.rule": "Исходящее правило",
-    "label.egress.rules": "Исходящие правила",
-    "label.elastic": "Гибкий",
-    "label.elastic.IP": "Гибкий IP",
-    "label.elastic.LB": "Гибкий LB",
-    "label.email": "E-mail",
-    "label.email.lower": "E-mail",
-    "label.enable.autoscale": "Включить автоматическое маштабирование",
-    "label.enable.host": "Включить хост",
-    "label.enable.network.offering": "Включить сетевую услугу",
-    "label.enable.provider": "Включить поставщика",
-    "label.enable.s3": "Включить S3-совместимое дополнительное хранилище",
-    "label.enable.swift": "Включить Swift",
-    "label.enable.vnmc.device": "Enable VNMC device",
-    "label.enable.vnmc.provider": "Enable VNMC provider",
-    "label.enable.vpc.offering": "Включить услугу VPC",
-    "label.enable.vpn": "Включить VPN",
-    "label.enabling.vpn": "Активация VPN",
-    "label.enabling.vpn.access": "Активация доступа по VPN",
-    "label.end.IP": "Конечный IP",
-    "label.end.port": "Последний порт диапазона",
-    "label.end.reserved.system.IP": "Конечный зарезервированный системный IP-адрес",
-    "label.end.vlan": "End VLAN",
-    "label.end.vxlan": "End VXLAN",
-    "label.endpoint": "Конечная точка",
-    "label.endpoint.or.operation": "Конечная точка или операция",
-    "label.enter.token": "Введите токен",
-    "label.error": "Ошибка",
-    "label.error.code": "Код ошибки",
-    "label.error.upper": "ERROR",
-    "label.esx.host": "Узел ESX/ESXi",
-    "label.event": "Event",
-    "label.event.archived": "Event Archived",
-    "label.event.deleted": "Event Deleted",
-    "label.every": "Every",
-    "label.example": "Пример",
-    "label.expunge": "Удалён",
-    "label.external.link": "Внешнее подлючение",
-    "label.extractable": "Извлекаемый",
-    "label.extractable.lower": "extractable",
-    "label.f5": "F5",
-    "label.f5.details": "F5 details",
-    "label.failed": "Неудачно",
-    "label.featured": "Рекомендуемый",
-    "label.fetch.latest": "Выборка последних",
-    "label.filterBy": "Фильтровать",
-    "label.fingerprint": "FingerPrint",
-    "label.firewall": "Фаервол",
-    "label.first.name": "Имя",
-    "label.firstname.lower": "Имя",
-    "label.format": "Формат",
-    "label.format.lower": "format",
-    "label.friday": "Пятница",
-    "label.full": "Полный",
-    "label.full.path": "Полный путь",
-    "label.gateway": "Шлюз",
-    "label.general.alerts": "Общие тревоги",
-    "label.generating.url": "Создание URL",
-    "label.globo.dns": "GloboDNS",
-    "label.globo.dns.configuration": "GloboDNS Configuration",
-    "label.gluster.volume": "Том",
-    "label.go.step.2": "Перейти к шагу 2",
-    "label.go.step.3": "Перейти к шагу 3",
-    "label.go.step.4": "Перейти к шагу 4",
-    "label.go.step.5": "Перейти к шагу 5",
-    "label.gpu": "GPU",
-    "label.group": "Группа",
-    "label.group.by.account": "Group by account",
-    "label.group.by.cluster": "Group by cluster",
-    "label.group.by.pod": "Group by pod",
-    "label.group.by.zone": "Group by zone",
-    "label.group.optional": "Группа (по желанию)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "Assigned load balancing",
-    "label.gslb.assigned.lb.more": "Assign more load balancing",
-    "label.gslb.delete": "Delete GSLB",
-    "label.gslb.details": "GSLB details",
-    "label.gslb.domain.name": "GSLB Domain Name",
-    "label.gslb.lb.details": "Детали балансировщика нагрузки",
-    "label.gslb.lb.remove": "Remove load balancing from this GSLB",
-    "label.gslb.lb.rule": "Правило балансировщика нагрузки",
-    "label.gslb.service": "GSLB service",
-    "label.gslb.service.private.ip": "GSLB service Private IP",
-    "label.gslb.service.public.ip": "GSLB service Public IP",
-    "label.gslb.servicetype": "Service Type",
-    "label.guest": "Гость",
-    "label.guest.cidr": "Гостевой CIDR",
-    "label.guest.end.ip": "Конечный гостевой IP.",
-    "label.guest.gateway": "Шлюз",
-    "label.guest.ip": "Гостевые IP-адреса",
-    "label.guest.ip.range": "Диапазон IP-адресов",
-    "label.guest.netmask": "Гостевая сетевая маска",
-    "label.guest.network.details": "Guest network details",
-    "label.guest.networks": "Гостевые сети",
-    "label.guest.start.ip": "Начальный гостевой IP",
-    "label.guest.traffic": "Гостевой трафик",
-    "label.guest.traffic.vswitch.name": "Guest Traffic vSwitch Name",
-    "label.guest.traffic.vswitch.type": "Guest Traffic vSwitch Type",
-    "label.guest.type": "Тип гостя",
-    "label.ha.enabled": "Отказоустойчивость включена",
-    "label.health.check": "Health Check",
-    "label.health.check.advanced.options": "Advanced Options:",
-    "label.health.check.configurations.options": "Configuration Options:",
-    "label.health.check.interval.in.sec": "Health Check Interval (in sec)",
-    "label.health.check.message.desc": "Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check",
-    "label.health.check.wizard": "Health Check Wizard",
-    "label.healthy.threshold": "Healthy Threshold",
-    "label.help": "Помощь",
-    "label.hide.ingress.rule": "Скрыть входящее правило",
-    "label.hints": "Подсказки",
-    "label.home": "Главная",
-    "label.host": "Узел",
-    "label.host.MAC": "MAC узла",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "Имя узла",
-    "label.host.tag": "Host Tag",
-    "label.host.tags": "Метки узла",
-    "label.hosts": "Узлы",
-    "label.hourly": "Ежечасно",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV Traffic Label",
-    "label.hypervisor": "Гипервизор",
-    "label.hypervisor.capabilities": "Возможности гипервизора",
-    "label.hypervisor.snapshot.reserve": "Hypervisor Snapshot Reserve",
-    "label.hypervisor.type": "Тип гипервизора",
-    "label.hypervisor.version": "Версия гипервизора",
-    "label.hypervisors": "Гипервизоры",
-    "label.id": "ID",
-    "label.info": "Информация",
-    "label.info.upper": "INFO",
-    "label.ingress.rule": "Входящее правило",
-    "label.initiated.by": "Инициировано",
-    "label.inside.port.profile": "Inside Port Profile",
-    "label.installWizard.addClusterIntro.subtitle": "Что такое \"Кластер\"?",
-    "label.installWizard.addClusterIntro.title": "Давайте добавим кластер",
-    "label.installWizard.addHostIntro.subtitle": "Что такое \"Узел\"?",
-    "label.installWizard.addHostIntro.title": "Давайте добавим узел",
-    "label.installWizard.addPodIntro.subtitle": "Что такое \"Стенд\"?",
-    "label.installWizard.addPodIntro.title": "Давайте добавим стенд",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "Что такое \"Основное хранилище\"?",
-    "label.installWizard.addPrimaryStorageIntro.title": "Давайте добавим основное хранилище",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "Что такое \"Дополнительное хранилище\"?",
-    "label.installWizard.addSecondaryStorageIntro.title": "Давайте добавим допольнительное хранилище.",
-    "label.installWizard.addZone.title": "Добавить зону",
-    "label.installWizard.addZoneIntro.subtitle": "Что такое \"Зона\"?",
-    "label.installWizard.addZoneIntro.title": "Давайте добавим зону",
-    "label.installWizard.click.launch": "Кликните на кнопку запуска",
-    "label.installWizard.subtitle": "Это руководство настроит ваш CloudStack.",
-    "label.installWizard.title": "Здравствуйте и добро пожаловать в CloudStack!",
-    "label.instance": "Машина",
-    "label.instance.limits": "Лимит машин",
-    "label.instance.name": "Имя машины",
-    "label.instance.port": "Instance Port",
-    "label.instance.scaled.up": "Instance scaled to the requested offering",
-    "label.instances": "Машины",
-    "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-    "label.intermediate.certificate": "Intermediate certificate {0}",
-    "label.internal.dns.1": "Внутренний DNS 1",
-    "label.internal.dns.2": "Внутренний DNS 2",
-    "label.internal.lb": "Internal LB",
-    "label.internal.lb.details": "Internal LB details",
-    "label.internal.name": "Внутреннее имя",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "Тип диапазона",
-    "label.introduction.to.cloudstack": "Введение в CloudStack",
-    "label.invalid.integer": "Неправильное целое число",
-    "label.invalid.number": "Неправильное число",
-    "label.invitations": "Приглашения",
-    "label.invite": "Пригласить",
-    "label.invite.to": "Пригласить",
-    "label.invited.accounts": "Приглашённые учетные записи",
-    "label.ip": "IP",
-    "label.ip.address": "IP адресса",
-    "label.ip.allocations": "Выделенные IP",
-    "label.ip.limits": "Ограничения маршрутизируемых IP",
-    "label.ip.or.fqdn": "IP или FQDN",
-    "label.ip.range": "Диапазон IP адресов",
-    "label.ip.ranges": "Диапазон IP адресов",
-    "label.ipaddress": "IP адресса",
-    "label.ips": "IP",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 End IP",
-    "label.ipv4.gateway": "IPv4 Gateway",
-    "label.ipv4.netmask": "IPv4 Netmask",
-    "label.ipv4.start.ip": "IPv4 Start IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP Address",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 End IP",
-    "label.ipv6.gateway": "IPv6 Gateway",
-    "label.ipv6.start.ip": "IPv6 Start IP",
-    "label.is.default": "По умолчанию",
-    "label.is.redundant.router": "Резервный",
-    "label.is.shared": "Общий",
-    "label.is.system": "Системные",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "Загрузка ISO",
-    "label.isolated.networks": "Изолированные сети",
-    "label.isolation.method": "Метод изоляции",
-    "label.isolation.mode": "Режим изоляции",
-    "label.isolation.uri": "Изоляция URI",
-    "label.item.listing": "Список элементов",
-    "label.japanese.keyboard": "Japanese keyboard",
-    "label.keep": "Хранить",
-    "label.keep.colon": "Keep:",
-    "label.key": "Ключ",
-    "label.keyboard.language": "Keyboard language",
-    "label.keyboard.type": "Тип клавиатуры",
-    "label.kvm.traffic.label": "Метка трафика KVM",
-    "label.label": "Метка",
-    "label.lang.arabic": "Arabic",
-    "label.lang.brportugese": "Brazilian Portugese",
-    "label.lang.catalan": "Catalan",
-    "label.lang.chinese": "Китайский (упрощённый)",
-    "label.lang.dutch": "Dutch (Netherlands)",
-    "label.lang.english": "Английский",
-    "label.lang.french": "French",
-    "label.lang.german": "German",
-    "label.lang.hungarian": "Hungarian",
-    "label.lang.italian": "Italian",
-    "label.lang.japanese": "Японский",
-    "label.lang.korean": "корейский",
-    "label.lang.norwegian": "Norwegian",
-    "label.lang.polish": "Polish",
-    "label.lang.russian": "Русский",
-    "label.lang.spanish": "Испанский",
-    "label.last.disconnected": "Время последнего отсоединения",
-    "label.last.name": "Фамилия",
-    "label.lastname.lower": "Фамилия",
-    "label.latest.events": "Последнии события",
-    "label.launch": "Запуск",
-    "label.launch.vm": "Запуск ВМ",
-    "label.launch.zone": "Запустить зону",
-    "label.lb.algorithm.leastconn": "Least connections",
-    "label.lb.algorithm.roundrobin": "Round-robin",
-    "label.lb.algorithm.source": "Источник",
-    "label.ldap.configuration": "LDAP Configuration",
-    "label.ldap.group.name": "LDAP Group",
-    "label.ldap.link.type": "Тип",
-    "label.ldap.port": "LDAP port",
-    "label.level": "Уровень",
-    "label.link.domain.to.ldap": "Link Domain to LDAP",
-    "label.linklocal.ip": "Локальный IP адрес",
-    "label.load.balancer": "Балансировщик нагрузки",
-    "label.load.balancer.type": "Load Balancer Type",
-    "label.load.balancing": "Балансировка нагрузки",
-    "label.load.balancing.policies": "Политики балансировки нагрузки",
-    "label.loading": "Загрузка",
-    "label.local": "Локальный",
-    "label.local.file": "Local file",
-    "label.local.storage": "Локальное хранилище",
-    "label.local.storage.enabled": "Включить локальное хранилище для пользовательских ВМ",
-    "label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
-    "label.login": "Войти",
-    "label.logout": "Выйти",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC Traffic Label",
-    "label.make.project.owner": "Сделать аккаунт владельцем проекта",
-    "label.make.redundant": "Make redundant",
-    "label.manage": "Управление",
-    "label.manage.resources": "Управление ресурсами",
-    "label.managed": "Управляемый",
-    "label.management": "Управление",
-    "label.management.ips": "Панель управления IP адрессами",
-    "label.management.server": "Сервер упраления",
-    "label.max.cpus": "Макс. ядер ЦП",
-    "label.max.guest.limit": "Ограничения количества гостей",
-    "label.max.instances": "Max Instances",
-    "label.max.memory": "Макс. памяти (в МиБ)",
-    "label.max.networks": "Максимум сетей",
-    "label.max.primary.storage": "Макс. основного хранилища (в ГиБ)",
-    "label.max.public.ips": "Макс. публичных IP",
-    "label.max.secondary.storage": "Макс. вторичного хранилища (в ГиБ)",
-    "label.max.snapshots": "Макс. снимков",
-    "label.max.templates": "Макс. шаблонов",
-    "label.max.vms": "Макс. количество пользовательских ВМ",
-    "label.max.volumes": "Макс. дисков",
-    "label.max.vpcs": "Макс. VPC",
-    "label.maximum": "Максимум",
-    "label.may.continue": "Вы можете продолжить.",
-    "label.md5.checksum": "Проверить MD5 сумму",
-    "label.memory": "Память",
-    "label.memory.allocated": "Выделено памяти",
-    "label.memory.limits": "Ограничения памяти (в МиБ)",
-    "label.memory.mb": "Память (в МБ)",
-    "label.memory.total": "Всего памяти",
-    "label.memory.used": "Использовано памяти",
-    "label.menu.accounts": "Учётные записи",
-    "label.menu.alerts": "Предупреждения",
-    "label.menu.all.accounts": "Все учётные записи",
-    "label.menu.all.instances": "Все машины",
-    "label.menu.community.isos": "ISO-сообщества",
-    "label.menu.community.templates": "Шаблоны сообщества",
-    "label.menu.configuration": "Конфигурация",
-    "label.menu.dashboard": "Панель управления",
-    "label.menu.destroyed.instances": "Уничтоженные машины",
-    "label.menu.disk.offerings": "Услуги дискового пространства",
-    "label.menu.domains": "Домены",
-    "label.menu.events": "События",
-    "label.menu.featured.isos": "Рекомендуемые ISO",
-    "label.menu.featured.templates": "Рекомендуемые шаблоны",
-    "label.menu.global.settings": "Основные настройки",
-    "label.menu.infrastructure": "Инфраструктура",
-    "label.menu.instances": "Машины",
-    "label.menu.ipaddresses": "IP-адреса",
-    "label.menu.isos": "ISO",
-    "label.menu.my.accounts": "Мои учётные записи",
-    "label.menu.my.instances": "Мои машины",
-    "label.menu.my.isos": "Мои ISO",
-    "label.menu.my.templates": "Мои шаблоны",
-    "label.menu.network": "Сеть",
-    "label.menu.network.offerings": "Услуги сети",
-    "label.menu.physical.resources": "Физические ресурсы",
-    "label.menu.regions": "Регион",
-    "label.menu.running.instances": "Работающие машины",
-    "label.menu.security.groups": "Группы безопасности",
-    "label.menu.service.offerings": "Услуги служб",
-    "label.menu.snapshots": "Снимки",
-    "label.menu.sshkeypair": "SSH KeyPair",
-    "label.menu.stopped.instances": "Остановленные машины",
-    "label.menu.storage": "Хранилище",
-    "label.menu.system": "Система",
-    "label.menu.system.service.offerings": "Системные ресурсы",
-    "label.menu.system.vms": "Системные ВМ",
-    "label.menu.templates": "Шаблоны",
-    "label.menu.virtual.appliances": "Виртуальные устройства",
-    "label.menu.virtual.resources": "Виртуальные ресурсы",
-    "label.menu.volumes": "Значения",
-    "label.menu.vpc.offerings": "Услуги VPS",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "Распределено",
-    "label.metrics.clusters": "Кластеры",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "Использовано",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "Распределено",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "Размер",
-    "label.metrics.disk.storagetype": "Тип",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "Использовано",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "Узлы",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "Использовано",
-    "label.metrics.name": "Имя",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "Охват",
-    "label.metrics.state": "Состояние",
-    "label.metrics.storagepool": "Пул хранилища",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "Перенести машину в",
-    "label.migrate.instance.to.host": "Перенос машины на другой узел",
-    "label.migrate.instance.to.ps": "Перенос машины на другое основное хранилище",
-    "label.migrate.lb.vm": "Migrate LB VM",
-    "label.migrate.router.to": "Перенести роутер в",
-    "label.migrate.systemvm.to": "Перенести системную ВМ в",
-    "label.migrate.to.host": "Перенести на узел",
-    "label.migrate.to.storage": "Перенести на хранилище",
-    "label.migrate.volume": "Перенос диска",
-    "label.migrate.volume.to.primary.storage": "Перенести диск в другое основное хранилище",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "Min Instances",
-    "label.min.past.the.hr": "min past the hr",
-    "label.minimum": "Минимум",
-    "label.minute.past.hour": "Минут",
-    "label.minutes.past.hour": "minutes(s) past the hour",
-    "label.mode": "Режим",
-    "label.monday": "Понедельник",
-    "label.monthly": "Каждый месяц",
-    "label.more.templates": "Еще шаблоны",
-    "label.move.down.row": "Переместить на одну строку ниже",
-    "label.move.to.bottom": "Переместить вниз",
-    "label.move.to.top": "Переместить на самый верх",
-    "label.move.up.row": "Переместить на одну строку выше",
-    "label.my.account": "Моя учётная запись",
-    "label.my.network": "Моя сеть",
-    "label.my.templates": "Мои шаблоны",
-    "label.na": "N/A",
-    "label.name": "Имя",
-    "label.name.lower": "Имя",
-    "label.name.optional": "Имя (по желанию)",
-    "label.nat.port.range": "диапазон портов NAT",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "Сетевая маска",
-    "label.netscaler.details": "NetScaler details",
-    "label.network": "Сеть",
-    "label.network.ACL": "Сетевые ACL",
-    "label.network.ACL.total": "Всего сетевых ACL",
-    "label.network.ACLs": "Сетевые ACL",
-    "label.network.addVM": "Добавить сеть в ВМ",
-    "label.network.cidr": "Network CIDR",
-    "label.network.desc": "Описание сети",
-    "label.network.details": "Network Details",
-    "label.network.device": "Сетевое устройство",
-    "label.network.device.type": "Тип сетевого устройства",
-    "label.network.domain": "Сетевой домен",
-    "label.network.domain.text": "Сетевой домен",
-    "label.network.id": "ID сети",
-    "label.network.label.display.for.blank.value": "Исп. основной шлюз",
-    "label.network.limits": "Ограничения сети",
-    "label.network.name": "Имя сети",
-    "label.network.offering": "Сетевые услуги",
-    "label.network.offering.details": "Network offering details",
-    "label.network.offering.display.text": "Отображаемый текст сетевой услуги",
-    "label.network.offering.id": "ID сетевой услуги",
-    "label.network.offering.name": "Название сетевой услуги",
-    "label.network.rate": "Скорость сети",
-    "label.network.rate.megabytes": "Скорость сети  (MB/s)",
-    "label.network.read": "Прочитано через сеть",
-    "label.network.service.providers": "Поставщики сетевых служб",
-    "label.network.type": "Тип сети",
-    "label.network.write": "Записано через сеть",
-    "label.networking.and.security": "Сеть и безопасность",
-    "label.networks": "Сети",
-    "label.new": "Создать",
-    "label.new.password": "Новый пароль",
-    "label.current.password": "Current Password",
-    "label.new.project": "Новый проект",
-    "label.new.ssh.key.pair": "New SSH Key Pair",
-    "label.new.vm": "Новая ВМ",
-    "label.next": "Следующий",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "Сервер NFS",
-    "label.nfs.storage": "Хранилище NFS",
-    "label.nic.adapter.type": "Тип сетевой карты (NIC)",
-    "label.nicira.controller.address": "Адрес контроллера",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
-    "label.nicira.nvp.details": "Nicira NVP details",
-    "label.nicira.transportzoneuuid": "Transport Zone Uuid",
-    "label.nics": "Сетевые интерфейсы",
-    "label.no": "Нет",
-    "label.no.actions": "Нет доступных действий",
-    "label.no.alerts": "Тревог не получено",
-    "label.no.data": "Нет информации для показа",
-    "label.no.errors": "Ошибок не получено",
-    "label.no.grouping": "(no grouping)",
-    "label.no.isos": "Нет доступных ISO",
-    "label.no.items": "Нет доступных пунктов",
-    "label.no.security.groups": "Нет доступных групп безопасности",
-    "label.no.thanks": "Нет, спасибо",
-    "label.none": "Нет",
-    "label.not.found": "Не найдено",
-    "label.notifications": "Оповещения",
-    "label.num.cpu.cores": "Кол-во ядер CPU",
-    "label.number.of.clusters": "Количество кластеров",
-    "label.number.of.cpu.sockets": "The Number of CPU Sockets",
-    "label.number.of.hosts": "Количество узлов",
-    "label.number.of.pods": "Количество стендов",
-    "label.number.of.system.vms": "Количество системных ВМ",
-    "label.number.of.virtual.routers": "Количество виртуальных маршрутизаторов",
-    "label.number.of.zones": "Количество зон",
-    "label.numretries": "Количество попыток",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "of month",
-    "label.offer.ha": "Услуга повышенной отказоустойчивости",
-    "label.ok": "OK",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight Controller",
-    "label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
-    "label.opendaylight.controllers": "OpenDaylight Controllers",
-    "label.operator": "Operator",
-    "label.optional": "Необязательно",
-    "label.order": "Очередь",
-    "label.os.preference": "Предпочтительная ОС",
-    "label.os.type": "Тип ОС",
-    "label.other": "Other",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "Действия",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "Пароль",
-    "label.outofbandmanagement.port": "Port",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "Имя пользователя",
-    "label.override.guest.traffic": "Override Guest-Traffic",
-    "label.override.public.traffic": "Override Public-Traffic",
-    "label.ovm.traffic.label": "OVM traffic label",
-    "label.ovm3.cluster": "Native Clustering",
-    "label.ovm3.pool": "Native Pooling",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "Master Vip IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "Присвоенные маршрутизируемые IP адреса",
-    "label.owner.account": "Учётная запись владельца",
-    "label.owner.domain": "Домен владельца",
-    "label.palo.alto.details": "Palo Alto details",
-    "label.parent.domain": "Родительский домен",
-    "label.passive": "Passive",
-    "label.password": "Пароль",
-    "label.password.enabled": "Пароль включен",
-    "label.password.lower": "Пароль",
-    "label.password.reset.confirm": "Пароль был сброшен в",
-    "label.path": "Путь",
-    "label.perfect.forward.secrecy": "Perfect Forward Secrecy",
-    "label.permission": "Permission",
-    "label.persistent": "Persistent ",
-    "label.physical.network": "Физические сети",
-    "label.physical.network.ID": "ID физической сети",
-    "label.physical.network.name": "Physical network name",
-    "label.ping.path": "Ping Path",
-    "label.planner.mode": "Planner mode",
-    "label.please.complete.the.following.fields": "Please complete the following fields",
-    "label.please.specify.netscaler.info": "Укажите данные NetScaler",
-    "label.please.wait": "Подождите",
-    "label.plugin.details": "Детали плагина",
-    "label.plugins": "Плагины",
-    "label.pod": "Стенд",
-    "label.pod.dedicated": "Pod Dedicated",
-    "label.pod.name": "Имя стенда",
-    "label.pods": "Стенды",
-    "label.polling.interval.sec": "Polling Interval (in sec)",
-    "label.port": "Port",
-    "label.port.forwarding": "Перенаправление портов",
-    "label.port.forwarding.policies": "Политики перенаправления портов",
-    "label.port.range": "Диапазон портов",
-    "label.portable.ip": "Portable IP",
-    "label.portable.ip.range.details": "Portable IP Range details",
-    "label.portable.ip.ranges": "Portable IP Ranges",
-    "label.portable.ips": "Portable IPs",
-    "label.powerstate": "Power State",
-    "label.prev": "Предыдуший",
-    "label.previous": "Предыдущий",
-    "label.primary.allocated": "Выделено основного хранилища",
-    "label.primary.network": "Основная сеть",
-    "label.primary.storage": "Основное хранилище",
-    "label.primary.storage.count": "Пул основного хранилища",
-    "label.primary.storage.limits": "Лимит основного хранилища (GiB)",
-    "label.primary.used": "Использовано основного хранилища",
-    "label.private.Gateway": "Частный шлюз",
-    "label.private.interface": "Частный интерфейс",
-    "label.private.ip": "Частный IP адрес",
-    "label.private.ip.range": "Диапазон частных IP адресов",
-    "label.private.ips": "Частные IP-адреса",
-    "label.private.key": "Private Key",
-    "label.private.network": "Частная сеть",
-    "label.private.port": "Частный порт",
-    "label.private.zone": "Частная зона",
-    "label.privatekey": "Частный ключ PKCS#8",
-    "label.profile": "Профиль",
-    "label.project": "Проект",
-    "label.project.dashboard": "Панель проекта",
-    "label.project.id": "ID проекта",
-    "label.project.invite": "Пригласить в проект",
-    "label.project.name": "Имя проекта",
-    "label.project.view": "Проекты",
-    "label.projects": "Проекты",
-    "label.protocol": "Протокол",
-    "label.protocol.number": "Protocol Number",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "Поставщики",
-    "label.providers": "Поставщики",
-    "label.public": "Публичный",
-    "label.public.interface": "Публичный интерфейс",
-    "label.public.ip": "Публичный IP-адрес",
-    "label.public.ips": "Публичные IP-адреса",
-    "label.public.key": "Public Key",
-    "label.public.lb": "Public LB",
-    "label.public.load.balancer.provider": "Public Load Balancer Provider",
-    "label.public.network": "Публичная сеть",
-    "label.public.port": "Публичный порт",
-    "label.public.traffic": "Публичный трафик",
-    "label.public.traffic.vswitch.name": "Public Traffic vSwitch Name",
-    "label.public.traffic.vswitch.type": "Public Traffic vSwitch Type",
-    "label.public.zone": "Публичная зона",
-    "label.purpose": "Назначение",
-    "label.qos.type": "Тип QoS",
-    "label.quickview": "Быстрый просмотр",
-    "label.quiesce.vm": "Quiesce VM",
-    "label.quiet.time.sec": "Quiet Time (in sec)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "Дата",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "Все учётные записи",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "Состояние",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx user",
-    "label.rbd.monitor": "Ceph monitor",
-    "label.rbd.pool": "Ceph pool",
-    "label.rbd.secret": "Cephx secret",
-    "label.reboot": "Перезагрузить",
-    "label.recent.errors": "Последние ошибки",
-    "label.recover.vm": "Востановить ВМ",
-    "label.redundant.router": "Резервной роутер",
-    "label.redundant.router.capability": "Возможности резервного роутера",
-    "label.redundant.state": "Состояние резерва",
-    "label.redundant.vpc": "Redundant VPC",
-    "label.refresh": "Обновить",
-    "label.refresh.blades": "Refresh Blades",
-    "label.region": "Регион",
-    "label.region.details": "Region details",
-    "label.regionlevelvpc": "Region Level VPC",
-    "label.reinstall.vm": "Переустановить ВМ",
-    "label.related": "Связанный",
-    "label.release.account": "Release from Account",
-    "label.release.account.lowercase": "Release from account",
-    "label.release.dedicated.cluster": "Release Dedicated Cluster",
-    "label.release.dedicated.host": "Release Dedicated Host",
-    "label.release.dedicated.pod": "Release Dedicated Pod",
-    "label.release.dedicated.vlan.range": "Release dedicated VLAN range",
-    "label.release.dedicated.zone": "Release Dedicated Zone",
-    "label.remind.later": "Предупредить позже",
-    "label.remove.ACL": "Удалить ACL",
-    "label.remove.egress.rule": "Удалить входящее правило",
-    "label.remove.from.load.balancer": "Удалить машину с балансировки нагрузки",
-    "label.remove.ingress.rule": "Удалить входящее правило",
-    "label.remove.ip.range": "Удалить диапазон IP",
-    "label.remove.ldap": "Remove LDAP",
-    "label.remove.network.offering": "Удалить сетевую услугу",
-    "label.remove.pf": "Далить правило перенаправление порта",
-    "label.remove.project.account": "Удалить учетную запись проекта",
-    "label.remove.region": "Удалить регион",
-    "label.remove.rule": "Удалить правило",
-    "label.remove.ssh.key.pair": "Remove SSH Key Pair",
-    "label.remove.static.nat.rule": "Удалить правило static NAT",
-    "label.remove.static.route": "Удалить статичный маршрут",
-    "label.remove.this.physical.network": "Remove this physical network",
-    "label.remove.tier": "Удалить tier",
-    "label.remove.vm.from.lb": "Удалить ВМ с правила балансировки нагрузки",
-    "label.remove.vm.load.balancer": "Удалить ВМ с балансировщика нагрузки",
-    "label.remove.vmware.datacenter": "Remove VMware datacenter",
-    "label.remove.vpc": "Удалить VPC",
-    "label.remove.vpc.offering": "Удалить услугу VPC",
-    "label.removing": "Удаление",
-    "label.removing.user": "Удаление пользователя",
-    "label.reource.id": "Resource ID",
-    "label.replace.acl": "Replace ACL",
-    "label.replace.acl.list": "Replace ACL List",
-    "label.required": "Требуется",
-    "label.requires.upgrade": "Requires Upgrade",
-    "label.reserved.ip.range": "Зарезервированный IP диапазон",
-    "label.reserved.system.gateway": "Зарезервированный системный шлюз",
-    "label.reserved.system.ip": "Зарезервированный системный IP",
-    "label.reserved.system.netmask": "Зарезервированная системная маска",
-    "label.reset.VPN.connection": "Восстановить VPN подключение",
-    "label.reset.ssh.key.pair": "Reset SSH Key Pair",
-    "label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
-    "label.resetVM": "Сброс ВМ",
-    "label.resize.new.offering.id": "Новая услуга",
-    "label.resize.new.size": "Новый размер (GB)",
-    "label.resize.shrink.ok": "Shrink OK",
-    "label.resource": "Ресурс",
-    "label.resource.limit.exceeded": "Превышен лимит ресурсов",
-    "label.resource.limits": "Ограничение ресурсов",
-    "label.resource.name": "Resource Name",
-    "label.resource.state": "Состояние ресурсов",
-    "label.resources": "Ресурсы",
-    "label.response.timeout.in.sec": "Response Timeout (in sec)",
-    "label.restart.network": "Перезапустить сеть",
-    "label.restart.required": "Требуется перезапуск",
-    "label.restart.vpc": "Перезапустить VPC",
-    "label.restore": "Востановить",
-    "label.retry.interval": "Retry Interval",
-    "label.review": "Обзор",
-    "label.revoke.project.invite": "Отозвать приглашение",
-    "label.role": "Роль",
-    "label.roles": "Roles",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "Root certificate",
-    "label.root.disk.controller": "Контроллер основного диска",
-    "label.root.disk.offering": "Услуга основного диска",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "Router VM Scaled Up",
-    "label.routing": "Маршрутизация",
-    "label.routing.host": "Routing Host",
-    "label.rule": "Rule",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "Номер правила",
-    "label.rules": "Правила",
-    "label.running.vms": "Запущенные ВМ",
-    "label.s3.access_key": "Ключ доступа",
-    "label.s3.bucket": "Bucket",
-    "label.s3.connection_timeout": "Превышение времени ожидания соединения",
-    "label.s3.endpoint": "Конечная точка",
-    "label.s3.max_error_retry": "Max Error Retry",
-    "label.s3.nfs.path": "S3 NFS путь",
-    "label.s3.nfs.server": "S3 NFS Сервер",
-    "label.s3.secret_key": "Секретный ключ",
-    "label.s3.socket_timeout": "Превышение времени ожидания сокета",
-    "label.s3.use_https": "Используйте HTTPS",
-    "label.saml.enable": "Authorize SAML SSO",
-    "label.saml.entity": "Identity Provider",
-    "label.saturday": "Суббота",
-    "label.save": "Сохранить",
-    "label.save.and.continue": "Сохранить и продолжить",
-    "label.save.changes": "Save changes",
-    "label.saving.processing": "Сохранение...",
-    "label.scale.up.policy": "SCALE UP POLICY",
-    "label.scaledown.policy": "ScaleDown Policy",
-    "label.scaleup.policy": "ScaleUp Policy",
-    "label.scope": "Охват",
-    "label.search": "Поиск",
-    "label.secondary.ips": "Дополнительные IP-адреса",
-    "label.secondary.isolated.vlan.id": "Secondary Isolated VLAN ID",
-    "label.secondary.staging.store": "Secondary Staging Store",
-    "label.secondary.staging.store.details": "Secondary Staging Store details",
-    "label.secondary.storage": "Дополнительное хранилище",
-    "label.secondary.storage.count": "Пул дополнительного хранилища",
-    "label.secondary.storage.details": "Secondary storage details",
-    "label.secondary.storage.limits": "Лимит дополнительного хранилища (GiB)",
-    "label.secondary.storage.vm": "ВМ дополнительного хранилища",
-    "label.secondary.used": "Использование дополнительного хранилища",
-    "label.secret.key": "Секретный ключ",
-    "label.security.group": "Группа безопасности",
-    "label.security.group.name": "Имя группы безопасности",
-    "label.security.groups": "Группы безопасности",
-    "label.security.groups.enabled": "Группы безопасности включены",
-    "label.select": "Выбрать",
-    "label.select-view": "Выберите вид",
-    "label.select.a.template": "Выберите шаблон",
-    "label.select.a.zone": "Выберите зону",
-    "label.select.instance": "Выбирите сервер",
-    "label.select.instance.to.attach.volume.to": "Выберите машину для добавления диска",
-    "label.select.iso.or.template": "Выберите ISO или шаблон",
-    "label.select.offering": "Выберите предложение",
-    "label.select.project": "Выберите проект",
-    "label.select.region": "Выбрать регион",
-    "label.select.template": "Выберите шаблон",
-    "label.select.tier": "Выбрать Tier",
-    "label.select.vm.for.static.nat": "Выбор VM для NAT",
-    "label.sent": "Отправлено",
-    "label.server": "Сервер",
-    "label.service.capabilities": "Возможности службы",
-    "label.service.offering": "Служебный ресурс",
-    "label.service.offering.details": "Service offering details",
-    "label.service.state": "Состояние служб",
-    "label.services": "Services",
-    "label.session.expired": "Сеанс завершен",
-    "label.set.default.NIC": "Установить NIC по умолчанию",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "Настроить тип зоны",
-    "label.settings": "Настройки",
-    "label.setup": "Настройка",
-    "label.setup.network": "Set up Network",
-    "label.setup.zone": "Set up Zone",
-    "label.shared": "Общий",
-    "label.show.advanced.settings": "Показать дополнительные настройки",
-    "label.show.ingress.rule": "Показать входящее правило",
-    "label.shutdown.provider": "Отключить поставщика",
-    "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
-    "label.site.to.site.VPN": "Site-to-site VPN",
-    "label.size": "Размер",
-    "label.skip.guide": "Я уже использовал CloudStack, пропустить это руководство",
-    "label.smb.domain": "SMB Domain",
-    "label.smb.password": "SMB Password",
-    "label.smb.username": "SMB Username",
-    "label.snapshot": "Снимок",
-    "label.snapshot.limits": "Количество снимков",
-    "label.snapshot.name": "Имя снимка",
-    "label.snapshot.s": "Снимки",
-    "label.snapshot.schedule": "Set up Recurring Snapshot",
-    "label.snapshots": "Снимки",
-    "label.sockets": "CPU Sockets",
-    "label.source.ip.address": "Source IP Address",
-    "label.source.nat": "Source NAT",
-    "label.source.nat.supported": "SourceNAT Supported",
-    "label.source.port": "Source Port",
-    "label.specify.IP.ranges": "Укажите диапазон IP-адресов",
-    "label.specify.vlan": "Укажите VLAN",
-    "label.specify.vxlan": "Укажите VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX details",
-    "label.ssh.key.pair": "SSH Key Pair",
-    "label.ssh.key.pair.details": "SSH Key Pair Details",
-    "label.ssh.key.pairs": "SSH Key Pairs",
-    "label.standard.us.keyboard": "Standard (US) keyboard",
-    "label.start.IP": "Начальный IP",
-    "label.start.lb.vm": "Start LB VM",
-    "label.start.port": "Начальный порт",
-    "label.start.reserved.system.IP": "Начальный зарезервированный системный IP-адрес",
-    "label.start.vlan": "Start VLAN",
-    "label.start.vxlan": "Start VXLAN",
-    "label.state": "Состояние",
-    "label.static.nat": "Статичный NAT",
-    "label.static.nat.enabled": "Статический NAT включен",
-    "label.static.nat.to": "Статичный NAT к",
-    "label.static.nat.vm.details": "Статистика NAT виртуальных машин",
-    "label.static.routes": "Static Routes",
-    "label.statistics": "Статистика",
-    "label.status": "Статус",
-    "label.step.1": "Шаг 1",
-    "label.step.1.title": "Шаг 1: <strong>Выберите шаблон</strong>",
-    "label.step.2": "Шаг 2",
-    "label.step.2.title": "Шаг 2: <strong>Системный ресурс</strong>",
-    "label.step.3": "Шаг 3",
-    "label.step.3.title": "Step 3: <strong id=\"step3_label\">Выберите услугу дискового пространства</strong>",
-    "label.step.4": "Шаг 4",
-    "label.step.4.title": "Step 4: <strong>Сеть</strong>",
-    "label.step.5": "Шаг 5",
-    "label.step.5.title": "Step 5: <strong>Обзор</strong>",
-    "label.stickiness": "Липкий",
-    "label.stickiness.method": "Stickiness method",
-    "label.sticky.cookie-name": "Cookie name",
-    "label.sticky.domain": "Домен",
-    "label.sticky.expire": "Истекает",
-    "label.sticky.holdtime": "время удержания",
-    "label.sticky.indirect": "Косвенный",
-    "label.sticky.length": "Длина",
-    "label.sticky.mode": "Режим",
-    "label.sticky.name": "Sticky Name",
-    "label.sticky.nocache": "Нет кэша",
-    "label.sticky.postonly": "Только сообщение",
-    "label.sticky.prefix": "Префикс",
-    "label.sticky.request-learn": "Требуется изучение.",
-    "label.sticky.tablesize": "Размер таблицы",
-    "label.stop": "Остановить",
-    "label.stop.lb.vm": "Stop LB VM",
-    "label.stopped.vms": "Остановленные ВМ",
-    "label.storage": "Хранилище",
-    "label.storage.pool": "Пул хранилища",
-    "label.storage.tags": "Метки хранилища",
-    "label.storage.traffic": "Трафик хранилища",
-    "label.storage.type": "Тип хранилища",
-    "label.subdomain.access": "Доступ к поддомену",
-    "label.submit": "Опубликовать",
-    "label.submitted.by": "[Опубликовано: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "Успешно",
-    "label.sunday": "Воскресенье",
-    "label.super.cidr.for.guest.networks": "Super CIDR гостевой сети",
-    "label.supported.services": "Поддерживаемые службы",
-    "label.supported.source.NAT.type": "Поддерживаемые типы NAT-источника",
-    "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "Приостановить проект",
-    "label.switch.type": "Тип свича",
-    "label.system.capacity": "Мощность системы",
-    "label.system.offering": "Системные ресурсы",
-    "label.system.offering.for.router": "System Offering for Router",
-    "label.system.service.offering": "Услуги системных служб",
-    "label.system.service.offering.details": "System service offering details",
-    "label.system.vm": "Системная ВМ",
-    "label.system.vm.details": "Подробности сслужебной ВМ",
-    "label.system.vm.scaled.up": "System VM Scaled Up",
-    "label.system.vm.type": "Тип системной ВМ",
-    "label.system.vms": "Системные ВМ",
-    "label.system.wide.capacity": "Общесистемного потенциала",
-    "label.tag.key": "Tag Key",
-    "label.tag.value": "Tag Value",
-    "label.tagged": "С меткой",
-    "label.tags": "Метки",
-    "label.target.iqn": "Целевой IQN",
-    "label.task.completed": "Задача выполнена",
-    "label.template": "Шаблон",
-    "label.template.limits": "Пределы шаблона",
-    "label.tftp.root.directory": "Tftp root directory",
-    "label.theme.default": "Стандартная тема",
-    "label.theme.grey": "Серая тема",
-    "label.theme.lightblue": "Голубая тема",
-    "label.threshold": "Threshold",
-    "label.thursday": "Четверг",
-    "label.tier": "Tier",
-    "label.tier.details": "Подробности Tier",
-    "label.time": "Время",
-    "label.time.colon": "Time:",
-    "label.time.zone": "Часовой пояс",
-    "label.timeout": "Время ожидания",
-    "label.timeout.in.second ": " Timeout (seconds)",
-    "label.timezone": "Часовой пояс",
-    "label.timezone.colon": "Timezone:",
-    "label.token": "Токен",
-    "label.total.CPU": "Всего CPU",
-    "label.total.cpu": "Всего CPU",
-    "label.total.hosts": "Всего узлов",
-    "label.total.memory": "Всего памяти",
-    "label.total.of.ip": "Всего IP-адресов",
-    "label.total.of.vm": "Всего ВМ",
-    "label.total.storage": "Всего хранения",
-    "label.total.virtual.routers": "Количество виртуальных маршрутизаторов",
-    "label.total.virtual.routers.upgrade": "Total of Virtual Routers that require upgrade",
-    "label.total.vms": "Всего ВМ",
-    "label.traffic.label": "Трафик",
-    "label.traffic.type": "Тип трафика",
-    "label.traffic.types": "Типы трафика",
-    "label.tuesday": "Вторник",
-    "label.type": "Тип",
-    "label.type.id": "ID типа",
-    "label.type.lower": "Тип",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "UK keyboard",
-    "label.unavailable": "Не доступно",
-    "label.unhealthy.threshold": "Unhealthy Threshold",
-    "label.unlimited": "Бесконечно",
-    "label.untagged": "Без метки",
-    "label.update.project.resources": "Обновить ресурсы проекта",
-    "label.update.ssl": " Обновить сертификаты SSL",
-    "label.update.ssl.cert": " Обновить сертификаты SSL",
-    "label.updating": "Обновление",
-    "label.upgrade.required": "Upgrade is required",
-    "label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
-    "label.upload": "Загрузить",
-    "label.upload.from.local": "Upload from Local",
-    "label.upload.template.from.local": "Upload Template from Local",
-    "label.upload.volume": "Загрузить  диск",
-    "label.upload.volume.from.local": "Upload Volume from Local",
-    "label.upload.volume.from.url": "Upload volume from URL",
-    "label.url": "URL",
-    "label.usage.interface": "Интерфейс использования",
-    "label.usage.sanity.result": "Usage Sanity Result",
-    "label.usage.server": "Сервер статистики",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "Используйте IP ВМ:",
-    "label.use.vm.ips": "Используемые ВМ IPs",
-    "label.used": "Использовано",
-    "label.user": "Пользователь",
-    "label.user.data": "User Data",
-    "label.user.details": "User details",
-    "label.user.vm": "User VM",
-    "label.username": "Имя пользователя",
-    "label.username.lower": "Имя пользователя",
-    "label.users": "Пользователи",
-    "label.vSwitch.type": "vSwitch Type",
-    "label.value": "Значение",
-    "label.vcdcname": "Имя vCenter DC",
-    "label.vcenter": "vcenter",
-    "label.vcenter.cluster": "Кластер vCenter",
-    "label.vcenter.datacenter": "ЦОД vCenter",
-    "label.vcenter.datastore": "Хранилище vCenter",
-    "label.vcenter.host": "Узел vCenter",
-    "label.vcenter.password": "Пароль vCenter",
-    "label.vcenter.username": "Имя пользователя vCenter",
-    "label.vcipaddress": "vCenter IP Адресс",
-    "label.version": "Версия",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "Max resolution",
-    "label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
-    "label.vgpu.remaining.capacity": "Осташиеся емкость",
-    "label.vgpu.type": "vGPU type",
-    "label.vgpu.video.ram": "Video RAM",
-    "label.view": "Вид",
-    "label.view.all": "Просмотреть всё",
-    "label.view.console": "Показать консоль",
-    "label.view.more": "Просмотреть больше",
-    "label.view.secondary.ips": "Обзор дополнительных IP-адресов",
-    "label.viewing": "Просмотр",
-    "label.virtual.appliance": "Виртуальное устройство",
-    "label.virtual.appliance.details": "Virtual applicance details",
-    "label.virtual.appliances": "Виртуальные устройства",
-    "label.virtual.machine": "Виртуальная машина",
-    "label.virtual.machines": "Виртуальные машины",
-    "label.virtual.network": "Виртуальная сеть",
-    "label.virtual.networking": "Виртуальнаt сети",
-    "label.virtual.router": "Виртуальный роутер",
-    "label.virtual.routers": "Виртуальный роутер",
-    "label.virtual.routers.group.account": "Virtual Routers group by account",
-    "label.virtual.routers.group.cluster": "Virtual Routers group by cluster",
-    "label.virtual.routers.group.pod": "Virtual Routers group by pod",
-    "label.virtual.routers.group.zone": "Virtual Routers group by zone",
-    "label.vlan": "VLAN",
-    "label.vlan.id": "ID VLAN",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI Range",
-    "label.vlan.range.details": "VLAN Range details",
-    "label.vlan.ranges": "VLAN Range(s)",
-    "label.vlan.vni.range": "VLAN/VNI Range",
-    "label.vlan.vni.ranges": "VLAN/VNI Range(s)",
-    "label.vm.add": "Добавить машины",
-    "label.vm.destroy": "Уничтожить",
-    "label.vm.display.name": "Отображаемое имя ВМ",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "ВМ IP-адрес",
-    "label.vm.name": "Имя VM",
-    "label.vm.password": "Password of the VM is",
-    "label.vm.reboot": "Перезагрузить",
-    "label.vm.start": "Запустить",
-    "label.vm.state": "Статус сервера",
-    "label.vm.stop": "Остановить",
-    "label.vmfs": "VMFS",
-    "label.vms": "ВМ",
-    "label.vmsnapshot": "Снимок ВМ",
-    "label.vmsnapshot.current": "Текущей",
-    "label.vmsnapshot.memory": "Снимок памяти",
-    "label.vmsnapshot.parentname": "Родитель",
-    "label.vmsnapshot.type": "Тип",
-    "label.vmware.datacenter.id": "VMware datacenter ID",
-    "label.vmware.datacenter.name": "VMware datacenter Name",
-    "label.vmware.datacenter.vcenter": "VMware datacenter vcenter",
-    "label.vmware.traffic.label": "Метка трафика VMware",
-    "label.vnet": "VLAN",
-    "label.vnet.id": "ID VLAN",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC Devices",
-    "label.volatile": "Volatile",
-    "label.volgroup": "Группа диска",
-    "label.volume": "Том",
-    "label.volume.details": "Информация о диске",
-    "label.volume.limits": "Количетсво дисков",
-    "label.volume.migrated": "Диск перенесён",
-    "label.volume.name": "Имя тома",
-    "label.volumes": "Значения",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "Distributed VPC Router",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "Услуга VPC",
-    "label.vpc.offering.details": "Детали услуги VPC",
-    "label.vpc.router.details": "VPC Router Details",
-    "label.vpc.supportsregionlevelvpc": "Supports Region Level VPC",
-    "label.vpc.virtual.router": "VPC Virtual Router",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN шлюз клиента",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "Control VLAN ID",
-    "label.vsmpktvlanid": "Packet VLAN ID",
-    "label.vsmstoragevlanid": "Storage VLAN ID",
-    "label.vsphere.managed": "vSphere Managed",
-    "label.vswitch.name": "vSwitch Name",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "Диапазон Range",
-    "label.waiting": "Ожидание",
-    "label.warn": "Внимание",
-    "label.warn.upper": "WARN",
-    "label.warning": "Warning",
-    "label.wednesday": "Среда",
-    "label.weekly": "Еженедельно",
-    "label.welcome": "Добро пожаловать",
-    "label.welcome.cloud.console": "Добро пожаловать в панель управления",
-    "label.what.is.cloudstack": "Введение в CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "Original XS Version is 6.1+",
-    "label.xenserver.traffic.label": "Метка трафика XenServer",
-    "label.yes": "Да",
-    "label.zone": "Зона",
-    "label.zone.dedicated": "Zone Dedicated",
-    "label.zone.details": "Подробности зоны",
-    "label.zone.id": "ID зоны",
-    "label.zone.lower": "Зона",
-    "label.zone.name": "Zone Name",
-    "label.zone.step.1.title": "Шаг 1: <strong>Выберите сеть</strong>",
-    "label.zone.step.2.title": "Step 2: <strong>Добавьте зону</strong>",
-    "label.zone.step.3.title": "Step 3: <strong>Добавьте стенд</strong>",
-    "label.zone.step.4.title": "Step 4: <strong>Добавьте диапазон IP-адресов</strong>",
-    "label.zone.type": "Тип зоны",
-    "label.zone.wide": "Всей зоны",
-    "label.zoneWizard.trafficType.guest": "Гостевой: Трафик между виртуальными машинами пользователей",
-    "label.zoneWizard.trafficType.management": "Управление: Трафик между внутренним ресурсам CloudStack, в том числе любых компонентов, которые взаимодействуют с сервером управления, таких как узлы и системные виртуальные машины.",
-    "label.zoneWizard.trafficType.public": "Публичный: трафик между интернетом и виртуальными машинами в облаке",
-    "label.zoneWizard.trafficType.storage": "Хранилище: Трафик между первичными и вторичными серверами хранения, таких как шаблоны и снимки виртуальных машин.",
-    "label.zones": "Зоны",
-    "managed.state": "Режим обслуживания",
-    "message.XSTools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
-    "message.Zone.creation.complete": "Создание зоны завершено",
-    "message.acquire.ip.nic": "Пожалуйста, подтвердите, что вы хотели бы запросить новый приватный IP для этой сетевой карты. <br/>Примечание: Вы должны вручную настроить недавно  полученный IP внутри виртуальной машины.",
-    "message.acquire.new.ip": "Подтвердите, что вы действительно хотите получить \"белый\" IP для этой сети.",
-    "message.acquire.new.ip.vpc": "Подтвердите, что вы действительно хотите получить \"белый\" IP для этого VPC.",
-    "message.acquire.public.ip": "Пожалуйста, выберите зону, из которой вы хотите приобрести новый IP.",
-    "message.action.cancel.maintenance": "Узел успешно вышел из режима обслуживания. Этот процесс может длиться несколько минут.",
-    "message.action.cancel.maintenance.mode": "Подтвердите, что вы действительно хотите отменить режим обслуживания.",
-    "message.action.change.service.warning.for.instance": "Перед изменением набора сервисов Ваша машина должна быть остановлена",
-    "message.action.change.service.warning.for.router": "Для смены набора услуг Ваш роутер должен быть остановлен",
-    "message.action.delete.ISO": "Пожалуйста подтвердите, что хотите удалить этот ISO.",
-    "message.action.delete.ISO.for.all.zones": "ISO используется всеми зонами. Пожалуйста подтвердите, что Вы хотите удалить его из всех зон.",
-    "message.action.delete.cluster": "Пожалуйста подтвердите, что хотите удалить этот кластер.",
-    "message.action.delete.disk.offering": "Пожалуйста подтвердите, что ВЫ хотите удалить эту услугу дискового пространства",
-    "message.action.delete.domain": "Пожалуйста подтвердите, что хотите удалить этот домен.",
-    "message.action.delete.external.firewall": "Пожалуйста подтвердите, что хотите удалить этот внешний фаервол. Предупредение: Если Вы в дальнейшем вернуть обратно этот же внешний фаервол, Вы должны будете сбросить данные на этом устройстве.",
-    "message.action.delete.external.load.balancer": "Пожалуйста подтвердите, что хотите удалить этот внешний балансировщик нагрузки. Предупредение: Если Вы в дальнейшем вернуть обратно этот же внешний фаервол, Вы должны будете сбросить данные на этом устройстве",
-    "message.action.delete.ingress.rule": "Пожалуйста подтвердите, что Вы хотите удалить правило.",
-    "message.action.delete.network": "Пожалуйста подтвердите, что Вы хотите удалить эту сеть.",
-    "message.action.delete.nexusVswitch": "Пожалуйста, подтвердите, что вы хотите удалить это nexus 1000v",
-    "message.action.delete.nic": "Пожалуйста, подтвердите, что хотите удалить этот NIC, который также удалит все связанные сети из ВМ.",
-    "message.action.delete.physical.network": "Пожалуйста, подтвердите, что вы хотите удалить эту физическую сеть",
-    "message.action.delete.pod": "Подтвердите, что вы действительно хотите включить этот стенд.",
-    "message.action.delete.primary.storage": "Пожалуйста подтвердите, что Вы хотитк удалить это основное хранилище.",
-    "message.action.delete.secondary.storage": "Пожалуйста подтвердите, что Вы хотитк удалить это дополнительное хранилище",
-    "message.action.delete.security.group": "Пожалуйста подтвердите, что Вы хотитк удалить эту security group.",
-    "message.action.delete.service.offering": "Пожалуйста подтвердите, что ВЫ хотите удалить эту услугу служб",
-    "message.action.delete.snapshot": "Пожалуйста подтвердите, что Вы хотитк удалить этот снимок.",
-    "message.action.delete.system.service.offering": "Подтвердите, что вы действительно хотите удалить этот служебный ресурс.",
-    "message.action.delete.template": "Пожалуйста подтвердите, что Вы хотитк удалить этот шаблон.",
-    "message.action.delete.template.for.all.zones": "Этот шаблон используется во всех зонах. Пожалуйста подтвердите, что Вы хотитк удалить его во всех зонах.",
-    "message.action.delete.volume": "Пожалуйста подтвердите, что Вы хотите удалть этот том.",
-    "message.action.delete.zone": "Пожалуйста подтвердите, что Вы хотите удалть эту зону.",
-    "message.action.destroy.instance": "Пожалуйста подтвердите, что Вы хотите уничтожить эту машину.",
-    "message.action.destroy.systemvm": "Подтвердите, что вы действительно хотите удалить эту системную ВМ.",
-    "message.action.destroy.volume":"Please confirm that you want to destroy this volume.",
-    "message.action.disable.cluster": "Пожалуйста подтвердите, что Вы хотите отключить данный кластер.",
-    "message.action.disable.nexusVswitch": "Пожалуйста, подтвердите, что вы хотите включить это nexusVswitch.",
-    "message.action.disable.physical.network": "Подтвердите, что вы действительно хотите выключить эту физическую сеть.",
-    "message.action.disable.pod": "Подтвердите, что вы действительно хотите включить этот стенд.",
-    "message.action.disable.static.NAT": "Пожалуйста подтвердите, что Вы хотите деактивировать статическую трансляцию адресов.",
-    "message.action.disable.zone": "Пожалуйста подтвердите, что Вы хотите отключить данную зону.",
-    "message.action.download.iso": "Подтвердите, что вы действительно хотите загрузить этот ISO.",
-    "message.action.download.template": "Подтвердите, что вы действительно хотите загрузить этот шаблон.",
-    "message.action.downloading.template": "Downloading template.",
-    "message.action.enable.cluster": "Пожалуйста подтвердите, что Вы хотите включить данный кластер.",
-    "message.action.enable.maintenance": "Ваш сервер успешно подготовлен для обслуживания. Этот процесс может занять несколько минут или более в зависимости от количества виртуальных машин, работающих на нем в данное время.",
-    "message.action.enable.nexusVswitch": "Пожалуйста, подтвердите, что вы хотите включить это nexus 1000v.",
-    "message.action.enable.physical.network": "Подтвердите, что вы действительно хотите включить эту физическую сеть.",
-    "message.action.enable.pod": "Подтвердите, что вы действительно хотите включить этот стенд.",
-    "message.action.enable.zone": "Пожалуйста подтвердите, что Вы хотите активировать эту зону.",
-    "message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
-    "message.action.force.reconnect": "Ваш сервер получил команду принудительного повторного подключения. Этот процесс может занять до нескольких минут.",
-    "message.action.host.enable.maintenance.mode": "Активация режима обслуживания приведет к принудительной миграции всех работающих на данном сервере виртуальных машин.",
-    "message.action.instance.reset.password": "Пожалуйста подтвердите, что Вы хотите изменить пароль администратора для этой виртуальной машины.",
-    "message.action.manage.cluster": "Подтвердите, что вы действительно хотите перевести кластер в режим обслуживания.",
-    "message.action.primarystorage.enable.maintenance.mode": "Предупреждение: перевод основного хранилища в режим обслуживания приведет к остановке всех использующих его виртуальных машин. Вы хотите продолжить?",
-    "message.action.reboot.instance": "Подтвердите, что вы действительно хотите перезагрузить эту машину.",
-    "message.action.reboot.router": "Подтвердите, что вы действительно хотите перезагрузить этот роутер.",
-    "message.action.reboot.systemvm": "Подтвердите, что вы действительно хотите запустить эту системную ВМ.",
-    "message.action.recover.volume":"Please confirm that you would like to recover this volume.",
-    "message.action.release.ip": "Пожалуйста подтвержите желание освободить этот IP адрес.",
-    "message.action.remove.host": "Удаление последнего/единственного сервера в кластере и повторная его установка приведет уничтожению рабочего окружения/базы данных на сервере и сделае гостевые машины непригодными к использованию.",
-    "message.action.reset.password.off": "На данный момент машина не поддерживает данную функцию",
-    "message.action.reset.password.warning": "Перед попыткой сменить пароль Ваша машина должна быть остановлена.",
-    "message.action.restore.instance": "Пожалуйста подтвердите желание восстановить эту машину.",
-    "message.action.revert.snapshot": "Подтвердите, что вы действительно хотите вернуть диск к этому том снимку",
-    "message.action.start.instance": "Пожалуйста подтвердите желание запустить эту машину.",
-    "message.action.start.router": "Пожалуйста подтвердите желание запустить этот роутер.",
-    "message.action.start.systemvm": "Подтвердите, что вы действительно хотите запустить эту системную ВМ.",
-    "message.action.stop.instance": "Пожалуйста подтвердите желание остановить эту машину.",
-    "message.action.stop.router": "Подтвердите, что вы действительно хотите остановить этот роутер.",
-    "message.action.stop.systemvm": "Пожалуйста подтвердите желание остановить эту служебную машину.",
-    "message.action.take.snapshot": "Подтвердите, что вы действительно хотите получить снимок этого диска.",
-    "message.action.snapshot.fromsnapshot":"Пожалуйста, подтвердите, что вы хотите сделать снимок этого снимка виртуальной машины.",
-    "message.action.unmanage.cluster": "Подтвердите, что вы действительно хотите перевести кластер в обычный режим.",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "Пожалуйста подтвердите, что Вы хотите удалить этот снимок ВМ.",
-    "message.action.vmsnapshot.revert": "Восстановить снимок ВМ",
-    "message.activate.project": "Вы действительно хотите запустить этот проект?",
-    "message.add.VPN.gateway": "Пожалуйста подтвердите желание добавить VPN шлюз",
-    "message.add.cluster": "Добавить кластер гипервизоров в зоне <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
-    "message.add.cluster.zone": "Добавить кластер гипервизоров в зоне <b><span id=\"zone_name\"></span></b>",
-    "message.add.disk.offering": "Пожалуйста укажите необходимые параметры для добавления услуги дискового пространства",
-    "message.add.domain": "Укажите поддомен, где вы хотите создать ваш домен",
-    "message.add.firewall": "Добавить фаервол в зону",
-    "message.add.guest.network": "Подтвердите, что вы действительно хотите добавить гостевую сеть",
-    "message.add.host": "Укажите следующие параметры для добавления нового узла.",
-    "message.add.ip.range": "Добавить диапазон IP-адресов в публичную сеть зоны",
-    "message.add.ip.range.direct.network": "Добавить IP-диапазона сети <b><span id=\"directnetwork_name\"></span></b> в зоне <b><span id=\"zone_name\"></span></b>",
-    "message.add.ip.range.to.pod": "<p>Добавить диапазон IP-адресов в стенд: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "Добавить балансировку нагрузки в зону",
-    "message.add.load.balancer.under.ip": "Правило балансировки нагрузки был добавлен в IP:",
-    "message.add.network": "Добавить новую сеть для зоны: <b><span id=\"zone_name\"></span></b>",
-    "message.add.new.gateway.to.vpc": "Укажите следующие информацию для добавления нового шлюза в VPC",
-    "message.add.pod": "Добавить новый стенд для зоны <b><span id=\"add_pod_zone_name\"></span></b>",
-    "message.add.pod.during.zone.creation": "Каждая зона содержит один или более стендов, который вы сейчас добавите первым. Стенд содержит узлы и серверы основного хранилища, которые будут добавлены в последнем шаге. Для начала необходимо настроить диапазон резервных адресов IP для внутренней сети управления. Диапазон резервных IP должен быть уникальным для каждой зоны облака.",
-    "message.add.primary": "Пожалуйста укажите следующие параметры для добавления нового основного зранилища",
-    "message.add.primary.storage": "Добавить основное хранилище для зоны <b><span id=\"zone_name\"></span></b>, стенда <b><span id=\"pod_name\"></span></b>",
-    "message.add.region": "Пожалуйста укажите следующую информацию для добавления нового региона.",
-    "message.add.secondary.storage": "Добавить хранилище в зону <b><span id=\"zone_name\"></span></b>",
-    "message.add.service.offering": "Укажите следующие параметры для добавления нового вычислительного ресурса.",
-    "message.add.system.service.offering": "Пожалуйста заполните следующие параметры для добавления новой сервисной услуги",
-    "message.add.template": "Пожалуйста введите следующие данные для создания нового шаблона",
-    "message.add.volume": "Пожалуйста введите следующие данные для добавления нового диска.",
-    "message.added.vpc.offering": "Added VPC offering",
-    "message.adding.Netscaler.device": "Добавление устройства NetScaler",
-    "message.adding.Netscaler.provider": "Добавить Netscaler",
-    "message.adding.host": "Добавление узла",
-    "message.additional.networks.desc": "Пожалуйста укажите дополнительные сети к которым будет подключена Ваша машина.",
-    "message.admin.guide.read": "For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?,",
-    "message.advanced.mode.desc": "Выберите эту сетевую модель если Вы хотите использовать технологию VLAN. Эта сетевая модель предлагает наибольшую гибкость, позволяя администраторам предлагать такие сетевые сервисы, как фаервол, ВПН, балансировщик нагрузки, а так же выбирать прямое или подключение через  виртуальные частные сети.",
-    "message.advanced.security.group": "Выберите это, если хотите использовать security groups для предоставления изоляции гостевых виртуальных машин.",
-    "message.advanced.virtual": "Выберите это, если хотите использовать VLAN для предоставления изоляции гостевых виртуальных машин.",
-    "message.after.enable.s3": "S3-совместимое дополнительное хранилище настроено. Примечание: Если вы покинете эту страницу, вам не придется настраивать S3 снова.",
-    "message.after.enable.swift": "Swift настроен. Примечание: Если вы покинете эту страницу, вам не придется настраивать Swift снова",
-    "message.alert.state.detected": "Обнаружен сигнал тревоги",
-    "message.allow.vpn.access": "Пожалуйста введите имя и пароль пользователя, которому Вы хотите предоставить VPN доступ.",
-    "message.apply.snapshot.policy": "Вы успешно обновили политику создания резервных копий.",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "Пожалуйста подтвердите желание подключить ISO к этой виртуальной машине.",
-    "message.attach.volume": "Пожалуйста заполните следующие данные для подключеиня нового диска. Если Вы подключаете диск к виртуальной машине Windows, потребуется перезагрузка для того, что бы диск был окончательно подключен.",
-    "message.basic.mode.desc": "Выберите эту сетевую модель, если Вы <b>*<u>не</u>*</b> хотите активировать поддержку VLAN.  Всем созданным в рамках данной сетевой модели виртуальным машинам будет напрямую присвоен маршрутизируемый IP адрес. Для обеспечения безопасности используется функционал Security groups.",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "Пожалуйста подтвердите, что Вы хотите изменить услуги служб этой виртуальной машины.",
-    "message.change.password": "Измените ваш пароль.",
-    "message.cluster.dedicated": "Cluster Dedicated",
-    "message.cluster.dedication.released": "Cluster dedication released",
-    "message.configure.all.traffic.types": "У вас есть несколько физических сетей, пожалуйста, настроить метки для каждого типа трафика, нажав на кнопку Изменить.",
-    "message.configure.firewall.rules.allow.traffic": "Configure the rules to allow Traffic",
-    "message.configure.firewall.rules.block.traffic": "Configure the rules to block Traffic",
-    "message.configure.ldap": "Please confirm you would like to configure LDAP.",
-    "message.configuring.guest.traffic": "Настройка гостевого трафика",
-    "message.configuring.physical.networks": "Настройка физических сетей",
-    "message.configuring.public.traffic": "Настройка публичного трафика",
-    "message.configuring.storage.traffic": "Настройка трафика хранилища",
-    "message.confirm.action.force.reconnect": "Подтвердите, что вы действительно хотите переподключиться к узлу",
-    "message.confirm.add.vnmc.provider": "Please confirm you would like to add the VNMC provider.",
-    "message.confirm.archive.alert": "Please confirm that you want to archive this alert.",
-    "message.confirm.archive.event": "Please confirm that you want to archive this event.",
-    "message.confirm.archive.selected.alerts": "Please confirm you would like to archive the selected alerts",
-    "message.confirm.archive.selected.events": "Please confirm you would like to archive the selected events",
-    "message.confirm.attach.disk": "Are you sure you want to attach disk?",
-    "message.confirm.create.volume": "Are you sure you want to create volume?",
-    "message.confirm.current.guest.CIDR.unchanged": "Do you want to keep the current guest network CIDR unchanged?",
-    "message.confirm.dedicate.cluster.domain.account": "Do you really want to dedicate this cluster to a domain/account? ",
-    "message.confirm.dedicate.host.domain.account": "Do you really want to dedicate this host to a domain/account? ",
-    "message.confirm.dedicate.pod.domain.account": "Do you really want to dedicate this pod to a domain/account? ",
-    "message.confirm.dedicate.zone": "Do you really want to dedicate this zone to a domain/account?",
-    "message.confirm.delete.BigSwitchBcf": "Please confirm that you would like to delete this BigSwitch BCF Controller",
-    "message.confirm.delete.BrocadeVcs": "Please confirm that you would like to delete Brocade Vcs Switch",
-    "message.confirm.delete.F5": "Подтвердите, что вы действительно хотите удалить F5",
-    "message.confirm.delete.NetScaler": "Подтвердите, что вы действительно хотите удалить NetScaler",
-    "message.confirm.delete.PA": "Подтвердите, что вы действительно хотите удалить Palo Alto",
-    "message.confirm.delete.SRX": "Подтвердите, что вы действительно хотите удалить SRX",
-    "message.confirm.delete.acl.list": "Are you sure you want to delete this ACL list?",
-    "message.confirm.delete.alert": "Are you sure you want to delete this alert ?",
-    "message.confirm.delete.baremetal.rack.configuration": "Please confirm that you want to delete Baremetal Rack Configuration.",
-    "message.confirm.delete.ciscoASA1000v": "Please confirm you want to delete CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
-    "message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
-    "message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
-    "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
-    "message.confirm.destroy.router": "Подтвердите, что вы действительно хотите удалить роутер",
-    "message.confirm.disable.host": "Please confirm that you want to disable the host",
-    "message.confirm.disable.network.offering": "Are you sure you want to disable this network offering?",
-    "message.confirm.disable.provider": "Подтвердите, что вы действительно хотите выключить поставщика",
-    "message.confirm.disable.vnmc.provider": "Please confirm you would like to disable the VNMC provider.",
-    "message.confirm.disable.vpc.offering": "Are you sure you want to disable this VPC offering?",
-    "message.confirm.enable.host": "Please confirm that you want to enable the host",
-    "message.confirm.enable.network.offering": "Are you sure you want to enable this network offering?",
-    "message.confirm.enable.provider": "Подтвердите, что вы действительно хотите включить поставщика",
-    "message.confirm.enable.vnmc.provider": "Please confirm you would like to enable the VNMC provider.",
-    "message.confirm.enable.vpc.offering": "Are you sure you want to enable this VPC offering?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "Подтвердите присоединение к проекту.",
-    "message.confirm.migrate.volume": "Do you want to migrate this volume?",
-    "message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
-    "message.confirm.release.dedicate.vlan.range": "Please confirm you want to release dedicated VLAN range",
-    "message.confirm.release.dedicated.cluster": "Do you want to release this dedicated cluster ?",
-    "message.confirm.release.dedicated.host": "Do you want to release this dedicated host ?",
-    "message.confirm.release.dedicated.pod": "Do you want to release this dedicated pod ?",
-    "message.confirm.release.dedicated.zone": "Do you want to release this dedicated zone ? ",
-    "message.confirm.remove.IP.range": "Подтвердите, что вы действительно хотите удалить этот диапазон IP.",
-    "message.confirm.remove.event": "Are you sure you want to remove this event?",
-    "message.confirm.remove.load.balancer": "Please confirm you want to remove VM from load balancer",
-    "message.confirm.remove.network.offering": "Are you sure you want to remove this network offering?",
-    "message.confirm.remove.selected.alerts": "Please confirm you would like to remove the selected alerts",
-    "message.confirm.remove.selected.events": "Please confirm you would like to remove the selected events",
-    "message.confirm.remove.vmware.datacenter": "Please confirm you want to remove VMware datacenter",
-    "message.confirm.remove.vpc.offering": "Are you sure you want to remove this VPC offering?",
-    "message.confirm.replace.acl.new.one": "Do you want to replace the ACL with a new one?",
-    "message.confirm.scale.up.router.vm": "Do you really want to scale up the Router VM ?",
-    "message.confirm.scale.up.system.vm": "Do you really want to scale up the system VM ?",
-    "message.confirm.shutdown.provider": "Подтвердите, что вы действительно хотите отключить этого поставщика",
-    "message.confirm.start.lb.vm": "Please confirm you want to start LB VM",
-    "message.confirm.stop.lb.vm": "Please confirm you want to stop LB VM",
-    "message.confirm.upgrade.router.newer.template": "Please confirm that you want to upgrade router to use newer template",
-    "message.confirm.upgrade.routers.account.newtemplate": "Please confirm that you want to upgrade all routers in this account to use newer template",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "Please confirm that you want to upgrade all routers in this cluster to use newer template",
-    "message.confirm.upgrade.routers.newtemplate": "Please confirm that you want to upgrade all routers in this zone to use newer template",
-    "message.confirm.upgrade.routers.pod.newtemplate": "Please confirm that you want to upgrade all routers in this pod to use newer template",
-    "message.copy.iso.confirm": "Пожалуйста подтвердите желание скопировать Ваш ISO в",
-    "message.copy.template": "Копировать шаблон <b id=\"copy_template_name_text\">XXX</b> из зоны <b id=\"copy_template_source_zone_text\"></b> в",
-    "message.copy.template.confirm": "Are you sure you want to copy template?",
-    "message.create.template": "Вы действительно хотите создать шаблонн?",
-    "message.create.template.vm": "Создать машину из шаблона <b id=\"p_name\"></b>",
-    "message.create.template.volume": "Пожалуйста укажите следующую информацию перед созданием шаблона из Вашего диска: <b><span id=\"volume_name\"></span></b>. Создание шаблона может занять несколько минут и более в зависимости от размера Вашего диска.",
-    "message.creating.cluster": "Создание кластера",
-    "message.creating.guest.network": "Создать гостевую сеть",
-    "message.creating.physical.networks": "Создание физических сетей",
-    "message.creating.pod": "Создание стенда",
-    "message.creating.primary.storage": "Создание основного хранилища",
-    "message.creating.secondary.storage": "Создание дополнительного хранилища",
-    "message.creating.systemVM": "Creating system VMs (this may take a while)",
-    "message.creating.zone": "Создание зоны",
-    "message.decline.invitation": "Подтвердите, что вы хотите отменить приглашение на проект.",
-    "message.dedicate.zone": "Выделенная зона",
-    "message.dedicated.zone.released": "Zone dedication released",
-    "message.delete.VPN.connection": "Пожалуйста подтвердите, что Вы хотите удалить это VPN подключение.",
-    "message.delete.VPN.customer.gateway": "Пожалуйста подтвердите, что хотите удалить этот пользовательский шлюз VPN.",
-    "message.delete.VPN.gateway": "Пожалуйста подтвердите, что хотите удалить этот шлюз VPN.",
-    "message.delete.account": "Пожалуйста подтвердите желание удалить эту учетную запись.",
-    "message.delete.affinity.group": "Подтвердите, что вы действительно хотите удалить эту affinity group",
-    "message.delete.gateway": "Пожалуйста подтвердите, что Вы хотите удалить этот шлюз.",
-    "message.delete.project": "Вы действительно хотите удалить этот проект?",
-    "message.delete.user": "Подтвердите, что вы действительно хотите удалить этого пользователя.",
-    "message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
-    "message.desc.advanced.zone": "Для более сложных сетевых топологий. Эта сетевая модель обеспечивает максимальную гибкость в определении гостевой сети и предоставление услуг, таких как межсетевой экран, VPN, или поддержка балансировки нагрузки.",
-    "message.desc.basic.zone": "Предоставляет едиственную сеть, где каждая ВМ имеет «белый» IP-адрес сети. Изоляции гостей можно добиться использованием сети 3-го уровня, например, группы безопасности (фильтрация IP-вдресов)",
-    "message.desc.cluster": "Каждый стенд должен иметь один или более кластеров, первый из которых вы сейчас добавите. Кластер предоставляет группу узлов. Узлы в кластере имеют одинаковое оборудование, запускается через один гипервизор, находятся в одной сети и имеют доступ к одному  и тому же открытому хранилищу. Каждый кластер содержит один или более узлов, а также иеть один или несколько основных хранилищ.",
-    "message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.<br><br>(1) If public key is set, CloudStack will register the public key. You can use it through your private key.<br><br>(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.<br>",
-    "message.desc.created.ssh.key.pair": "Created a SSH Key Pair.",
-    "message.desc.host": "Каждый кластер должен содержать как минимум один узел (компьютер) для запуска ВМ, первый из кластер вы добавите сейчас. Для работы узла в CloudStack важна установка гипервизора на узел, привязка IP к узлу и соединение узла с сервером управления CloudStack.<br/><br/>Укажите имя DNS или адрес IP, имя пользователя и пароль к ОС (обычно root), а также метки для группирования узлов.",
-    "message.desc.primary.storage": "Каждая группа должна содержать один или несколько первичных серверов хранения данных, и мы добавим первый сейчас. Первичная хранения содержит логические разделы жесткого диска для всех виртуальных машин, работающих на узлах кластера. Используйте любой совместимый протокол, который поддерживает основные гипервизора.",
-    "message.desc.reset.ssh.key.pair": "Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled.",
-    "message.desc.secondary.storage": "Каждая зона должна обладать хотя бы одним сервером NFS или дополнительным хранилищем и их надо добавить в первую очередь. Дополнительное хранилище предназначено для хранения шаблонов ВМ, образов ISO и снимков ВМ. Этот сервер должен быть доступен для всех узлов зоны.<br/><br/>Заполните IP-адрес и путь.",
-    "message.desc.zone": "layer 3",
-    "message.detach.disk": "Вы действительно хотите присоединить этот диск?",
-    "message.detach.iso.confirm": "Пожалуйста подтвердите желание отключить ISO от этой виртуальной машины.",
-    "message.disable.account": "Пожалуйста подтвердите желание деактивировать эту учетную запись. Деактивация учетной записи заблокирует доступ всех пользователей к ресурсам Облака. Все работающие виртуальные машины будут незамедлительно остановлены.",
-    "message.disable.snapshot.policy": "Вы успешно деактивировали политику создания резервных копий.",
-    "message.disable.user": "Подтвердите, что вы действительно хотите выключить этого пользователя.",
-    "message.disable.vpn": "Вы действительно хотите выключить VPN?",
-    "message.disable.vpn.access": "Пожалуйста подтвердите желание деактивировать VPN доступ.",
-    "message.disabling.network.offering": "Disabling network offering",
-    "message.disabling.vpc.offering": "Disabling VPC offering",
-    "message.disallowed.characters": "Disallowed characters: <,>",
-    "message.download.ISO": "Пожалуйста, нажмите <a href=\"#\">00000</a> скачать образ",
-    "message.download.template": "Нажмите <a href=\"#\">00000</a>для загрузки",
-    "message.download.volume": "Нажмите <a href=\"#\">00000</a> для загрузки диска",
-    "message.download.volume.confirm": "Пожалуйста нажмите <a href=\"#\">00000</a> для загрузки диска",
-    "message.edit.account": "Редактировать (значение \"-1\" показывает отсутствие ограничений для ресурса)",
-    "message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
-    "message.edit.limits": "Пожалуйста определите ограничения для следующих ресурсов. \"-1\" обозначает отсутствие ограничений.",
-    "message.edit.traffic.type": "Пожалуйста, укажите метки трафика  вы хотите, связанных с этим типом трафика.",
-    "message.enable.account": "Пожалуйста подтвердите, что хотите активировать эту учетную запись.",
-    "message.enable.user": "Подтвердите, что вы действительно хотите включить этого пользователя.",
-    "message.enable.vpn": "Подтвердите, что вы действительно хотите открыть доступ к VPN для этого IP-адреса.",
-    "message.enable.vpn.access": "VPN в данный момент отключен для этого IP адреса. Вы хотите активировать VPN?",
-    "message.enabled.vpn": "Ваш VPN доступ в данный момент активирован. Доступ может быть осуществлен через IP адрес",
-    "message.enabled.vpn.ip.sec": "Ваш IPSec pre-shared ключ",
-    "message.enabling.network.offering": "Enabling network offering",
-    "message.enabling.security.group.provider": "Включение поставщика групп безопасности",
-    "message.enabling.vpc.offering": "Enabling VPC offering",
-    "message.enabling.zone": "Включить зону",
-    "message.enabling.zone.dots": "Enabling zone...",
-    "message.enter.seperated.list.multiple.cidrs": "Please enter a comma separated list of CIDRs if more than one",
-    "message.enter.token": "Введите ключ, который вы получили в пригласительном письме",
-    "message.generate.keys": "Подтвердите, что вы действительно хотите создать новые ключи для этого пользователя.",
-    "message.gslb.delete.confirm": "Please confirm you want to delete this GSLB",
-    "message.gslb.lb.remove.confirm": "Please confirm you want to remove load balancing from GSLB",
-    "message.guest.traffic.in.advanced.zone": "Гостевой трафик для связи между пользовательскими виртуальныит машинами. Укажите диапазон идентификаторов VLAN для каждой физической сети.",
-    "message.guest.traffic.in.basic.zone": "Гостевой трафик генерируется при общении между виртуальными машинами. Укажите диапазон адресов IP, который CloudStack сможет выделить для ВМ. Убедитесь, что этот диапазон не перекрещивается с диапазоном резервных адресов.",
-    "message.host.dedicated": "Host Dedicated",
-    "message.host.dedication.released": "Host dedication released",
-    "message.installWizard.click.retry": "Кликните, чтобы повторить запуск.",
-    "message.installWizard.copy.whatIsACluster": "Кластер предоставляет группу узлов. Узлы в кластере имеют одинаковое оборудование, запущены в одинаковом гипервизере, находятся в одной подсети и имеют доступ к одному общему хранилищу. Виртуальные машины (ВМ) могут быть перенесены \"вживую\" с одного узла на другой в пределах кластера, без остановки сервисов пользователем. Кластер - третья по размерности единица в платформе CloudStack&#8482. Кластеры располагаются в стендах, а стенды - в зонах. <br/><br/>CloudStack&#8482; разрешает использовать несколько кластеров, но при простой установке эта возможность отсутствует.",
-    "message.installWizard.copy.whatIsAHost": "Узел - это отдельный компьютер. Узлы предоставляют вычислительные ресурсы для запуска гостевых виртуальных машин. Каждый узел содержит гипервизор для управления ВМ (кроме узлов BareMetal, они являются исключением из правил и рассматривается в расширенном руководстве по установке). Например, это Linux-сервер с KVM, сервер Citrix XenServer или сервер ESXI. При простой установке вы можете использовать один узел с XenServer.<br/><br/>Узел - это наименьшая единица в платформе CloudStack&#8482;, далее узлы распологаются в кластерах, кластеры - в стендах, стенды - в зонах.",
-    "message.installWizard.copy.whatIsAPod": "Стенд, как правило, предоставляет одну стойку с машинами. Узлы в одном стенде расположены в одной подсети.<br/><br/>Стенд - вторая по размерности единица в платформе CloudStack&#8482;. Стенды распологаются в зонах. Каждая зона может содержать несколько стендов, но при простой установке в зоне можно создать лишь один стенд.",
-    "message.installWizard.copy.whatIsAZone": "Зона - это наиболее крупная организационная единица в платформе CloudStack&#8482;. Зона обычно соответствует единичному ЦОД, хотя имеется возможность использовать несколько зон в пределах одного ЦОД. Основным преимуществом построения инфраструктуры с использование зон является обеспечение изолирования и избыточности. Например, каждая зона может иметь свой блок питания и сеть, а сами зоны могут широко расположены географически.",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 - это программная плафторма для создания публичных, частных и гибридных облаков по схеме «Инфраструктура как сервис» (IaaS). CloudStack&#8482 управляет сетью, хранилищем и вычислительными узлами, входящие в облачную инфраструктуру. Главным образом, CloudStack&#8482 используется для развертывания, управления и настройкой сложных облачных решений.<br/><br/>CloudStack&#8482 реализует предоставление как услуги целого центра обработки данных с необходимыми компонентами для создания сложных инфраструктур на основе облака. Мы можете выбрать между свободной и Безнес-версиями, которые почти ничем не отличаются.",
-    "message.installWizard.copy.whatIsPrimaryStorage": "CloudStack&#8482; - это облачная платформа, использующая два типа хранилища: основное и дополнительное. В качестве хранителей можно использовать iSCSI или NFS-сервер или локальный диск.<br/><br/><strong>Основное хранилище</strong> связывается с кластером и там хранятся дисковые тома каждой ВМ, запущенной в узлах этого кластера. Как правило, соновное хранилище находится рядом с узлом.",
-    "message.installWizard.copy.whatIsSecondaryStorage": "Дополнительное хранилище привязано к зоне и содержит следующее:<ul><li>Шаблоны - образы ОС, которые можно использовать для загрузки ВМ и содержащие дополнительную информацию, такую как установленные приложения.</li><li>Образы ISO - это загрузочные или незагрузочные образы ОС</li><li>Снимки дисковых томов - сохраненные копии данных ВМ, которых можно использовать для восстановления данных или для создания нового шаблона</ul>",
-    "message.installWizard.now.building": "Ваше облако создаётся...",
-    "message.installWizard.tooltip.addCluster.name": "Имя кластера. Вы можете сами выбрать имя, не используемый Cloudstack.",
-    "message.installWizard.tooltip.addHost.hostname": "Имя DNS или IP-адрес узла.",
-    "message.installWizard.tooltip.addHost.password": "Этот пароль для вышеуказанного пользователя (с вашего XenServer)",
-    "message.installWizard.tooltip.addHost.username": "Обычно root.",
-    "message.installWizard.tooltip.addPod.name": "Имя стенда",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "Это диапазон IP частной сети, который используется CloudStack для ВМ дополнительного хранилища и консольного прокси. Эти адреса получаются из сети вычислительных серверов.",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "Шлюз для узлов этого стенда.",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "Сетевая маска подсети для гостей.",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "Это диапазон IP частной сети, который используется CloudStack для ВМ дополнительного хранилища и консольного прокси. Эти адреса получаются из сети вычислительных серверов.",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "Имя устройства хранилища.",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(для NFS) В NFS это путь экпорта сервера. Путь (для SharedMountPoint). В KVM это путь для каждого узла, который указывает расположение основного хранилища. Например, \"/mnt/primary\".",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(для NFS, iSCSI или PreSetup) IP-адрес или имя DNS устройства хранилища.",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "IP-адрес сервера NFS, где находится дополнительное хранилище",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "Путь экспорта, расположенный на вышеуказанном сервере.",
-    "message.installWizard.tooltip.addZone.dns1": "Это cерверы DNS для гостевых ВМ этой зоны. Эти серверы будут доступны через публичный интерфейс, который вы добавите позже. Публичные IP-адреса, предоставленные в зоне, должны иметь маршрут к этим серверам DNS.",
-    "message.installWizard.tooltip.addZone.dns2": "Это cерверы DNS для гостевых ВМ этой зоны. Эти серверы будут доступны через публичный интерфейс, который вы добавите позже. Публичные IP-адреса, предоставленные в зоне, должны иметь маршрут к этим серверам DNS.",
-    "message.installWizard.tooltip.addZone.internaldns1": "Это cерверы DNS для системных ВМ этой зоны. Эти серверы будут доступны через частный интерфейс системной ВМ. Частный IP-адрес, предоставленный в стенде, должен иметь маршрут к этим серверам DNS.",
-    "message.installWizard.tooltip.addZone.internaldns2": "Это cерверы DNS для системных ВМ этой зоны. Эти серверы будут доступны через частный интерфейс системной ВМ. Частный IP-адрес, предоставленный в стенде, должен иметь маршрут к этим серверам DNS.",
-    "message.installWizard.tooltip.addZone.name": "Имя зоны",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "Описание этой сети",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "Диапазон IP-адресов, которые будут доступны для гостей этой зоны. При использовании одного сетевого устройства (NIC) эти адреса должны быть в подсети (CIDR) стенда.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "Шлюз, используемый гостями",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "Сетевая маска подсети для гостей.",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "Диапазон IP-адресов, которые будут доступны для гостей этой зоны. При использовании одного сетевого устройства (NIC) эти адреса должны быть в подсети (CIDR) стенда.",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "Имя для вашей сети",
-    "message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
-    "message.instanceWizard.noTemplates": "Вы не имеете доступных шаблонов; для перезапуска машины добавьте совместивый шаблон.",
-    "message.ip.address.changed": "Ваши IP-адреса могли быть изменены, хотите обновить список адресов? Помните, что в этом случае область деталей будет закрыта.",
-    "message.iso.desc": "Образ диска, содержащий данные или загрузочный носитель для ОС",
-    "message.join.project": "Теперь вы присоединены к проекту. Выберите \"Просмотр проекта\".",
-    "message.launch.vm.on.private.network": "Вы хотите запустить свою машину в выделенной Вам частной сети?",
-    "message.launch.zone": "Зона готова к запуску, пожалуйста, перейдите к следующему шагу.",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
-    "message.listView.subselect.multi": "(Ctrl/Cmd-click)",
-    "message.lock.account": "Подтвердите, что вы действительно хотите заблокировать эту учётную запись.  Все пользователи в таких учётных записях потеряют возможность управлять своими облачными ресурсами.  Эти ресурсы останутся доступны для других учётных записей.",
-    "message.migrate.instance.confirm": "Пожалуйста подтвердите желание перенести виртуальную машину.",
-    "message.migrate.instance.to.host": "Подтвердите, что вы действительно хотите перенести машину на другой узел.",
-    "message.migrate.instance.to.ps": "Подтвердите, что вы действительно хотите перенести машину на другое основное хранилище.",
-    "message.migrate.router.confirm": "Подтвердите, что вы действительно хотите перенести роутер в узел:",
-    "message.migrate.systemvm.confirm": "Подтвердите, что вы действительно хотите перенести системные ВМ в узел",
-    "message.migrate.volume": "Подтвердите, что вы действительно хотите перенести диск в другое основное хранилище.",
-    "message.network.addVM.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.",
-    "message.network.addVMNIC": "Please confirm that you would like to add a new VM NIC for this network.",
-    "message.network.remote.access.vpn.configuration": "Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.",
-    "message.new.user": "Введите информацию для добавления нового пользователя в учётную запись.",
-    "message.no.affinity.groups": "Вы не имеете affinity groups. Пожалуйста перейдите к следующему шагу.",
-    "message.no.host.available": "No Hosts are available for Migration",
-    "message.no.network.support": "Выбранный гипервизор (vSphere) не обладает дополнительными сетевыми возмодностями. Перейдите к шагу 5.",
-    "message.no.network.support.configuration.not.true": "Функционал security group не активирован ни в одной зоне. Поэтому отсутствуют дополнительные сетевые функции. Пожалуйста перейдите к шагу 5.",
-    "message.no.projects": "У вас нет проектов.<br/>Создайте новый проект в секции \"Проекты\"",
-    "message.no.projects.adminOnly": "У вас нет проектов.<br/>Обратитесь к вашему администратору для создания нового проекта.",
-    "message.number.clusters": "<h2><span> # of </span> Кластеры</h2>",
-    "message.number.hosts": "<h2><span> # of </span> Узлы</h2>",
-    "message.number.pods": "<h2><span> # of </span> Стенды</h2>",
-    "message.number.storage": "<h2><span> # of </span> Тома основного хранилища</h2>",
-    "message.number.zones": "<h2><span> # of </span> Зоны</h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "Пароль был сброшен в",
-    "message.password.of.the.vm.has.been.reset.to": "Password of the VM has been reset to",
-    "message.pending.projects.1": "В ожидании следующие приглашения:",
-    "message.pending.projects.2": "Для просмотра перейдите к раздел проектов, далее выберите приглашения из выпадающего меню.",
-    "message.please.add.at.lease.one.traffic.range": "Добавьте как минимум один диапазон для трафика",
-    "message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
-    "message.please.proceed": "Перейдите к следующему шагу",
-    "message.please.select.a.configuration.for.your.zone": "Выберите конфигурацию вашей зоны",
-    "message.please.select.a.different.public.and.management.network.before.removing": "Выберите другую публичную и обслуживающую сеть перед удалением",
-    "message.please.select.networks": "Выберите сети для виртуальной машины",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "Please select a ssh key pair you want this VM to use:",
-    "message.please.wait.while.zone.is.being.created": "Подождите, создается зона. Это может занять некоторое время...",
-    "message.pod.dedication.released": "Pod dedication released",
-    "message.portable.ip.delete.confirm": "Please confirm you want to delete Portable IP Range",
-    "message.project.invite.sent": "Приглашение было отправлено пользователю; он будет добавлен в проект после подтверждения приглашения.",
-    "message.public.traffic.in.advanced.zone": "Публичный трафик генерируется при получения ВМ доступа к Интернету. Публично доступные IP должны быть обязательно выделены. Пользователь может использовать CloudStack UI для получения IP и создания NAT, используемый для общения между гостевой и публичной сетью. <br/><br/>Укажите как минимум один диапазон адресов для интернет-трафика.",
-    "message.public.traffic.in.basic.zone": "Публичный трафик генерируется при получения ВМ доступа к Интернету или при предоставлении клиентам служб через Интернет.  Публично доступные IP должны быть обязательно выделены. При создании ВМ, адрес из диапазона публичных Ip привяжется к машине в дополнение гостевого адреса IP. Статический 1-1 NAT должен автоматически настроиться на работу между публичной и гостевой сетью. Пользователь также имеет возможность использовать CloudStack UI для получения дополнительных адресов для реализации статического NAT между машинами и публичной сетью.",
-    "message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
-    "message.read.admin.guide.scaling.up": "Please read the dynamic scaling section in the admin guide before scaling up.",
-    "message.recover.vm": "Подтвердите, что вы действительно хотите востановить эту ВМ",
-    "message.redirecting.region": "Перенаправление в регион",
-    "message.reinstall.vm": "Примечание: Cоблюдайте осторожность.  ВМ будет переустановлена из шаблона; данные на основном диске будут потеряны. Дополнительные диски, если таковые имеются, не будут затронуты.",
-    "message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
-    "message.remove.region": "Вы уверены, что хотите удалить этот регион с сервера управления?",
-    "message.remove.vpc": "Пожалуйста подтвердите, что Вы хотите удалить этот VPC",
-    "message.remove.vpn.access": "Пожалуйста подтвердите желание отключить VPN доступ следующему пользователю.",
-    "message.removed.ssh.key.pair": "Removed a SSH Key Pair",
-    "message.reset.VPN.connection": "Пожалуйста подтвердите, что Вы хотите перезапустить это VPN подключение.",
-    "message.reset.password.warning.notPasswordEnabled": "Шаблон для этой машины создан без использования пароля",
-    "message.reset.password.warning.notStopped": "Для изменения пароля необходимо остановить машину",
-    "message.restart.mgmt.server": "Пожалуйста перезапустите сервер(ы) управления для того, чтобы изменения вступили в силу.",
-    "message.restart.mgmt.usage.server": "Пожалуйста, перезагрузите сервер и сервер статистики для вступления новых параметров в силу.",
-    "message.restart.network": "Подтвердите, что вы действительно хотите перезапустить сеть.",
-    "message.restart.vpc": "Подтвердите, что вы действительно хотите перезапустить VPC",
-    "message.restart.vpc.remark": "Please confirm that you want to restart the VPC <p><small><i>Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes</i>.</small></p>",
-    "message.restoreVM": "Do you want to restore the VM ?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(Используйте <strong>Ctrl-click</strong> для выбора всех применимых security groups)",
-    "message.select.a.zone": "Зона обычно соответствует единичному центру обработки данных. Несколько зон помогают создавать более надежные облака, обеспечивая физическую изоляцию и избыточность.",
-    "message.select.affinity.groups": "Пожалуйста, выберите любые affinity groups, которой принадлежит виртуальная машина:",
-    "message.select.instance": "Пожалуйста, выберите сервер.",
-    "message.select.iso": "Выберите образ ISO для новой ВМ",
-    "message.select.item": "Выберите элемент",
-    "message.select.security.groups": "Выберите группу(ы) безопасности для новой ВМ",
-    "message.select.template": "Выберите шаблон для новой ВМ",
-    "message.select.tier": "Please select a tier",
-    "message.set.default.NIC": "Please confirm that you would like to make this NIC the default for this VM.",
-    "message.set.default.NIC.manual": "Please manually update the default NIC on the VM now.",
-    "message.setup.physical.network.during.zone.creation": "Во время расширенной настройки зоны, вам необходимо указать один или несколько физических сетей. Каждая сеть соответствует сетевому интерфейсу гипервизора. Какждая физическая сеть может использоваться для одного или нескольких видов трафика с некоторыми ограничениями при объединении видов трафика.<br/><br/><strong>Перетащите один или несколько видов трафика</strong> к каждой физической сети.",
-    "message.setup.physical.network.during.zone.creation.basic": "При добавления в основную зону, вы можите создать одну физическую сеть, которая соотвествует NIC на гипервизор. Сеть осуществляет несколько видов трафика.<br/><br/>Вы можете также перетаскивать <strong>drag and drop</strong> другие типы трафика на физические сети.",
-    "message.setup.successful": "Настройка облака завершена!",
-    "message.snapshot.schedule": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
-    "message.specifiy.tag.key.value": "Please specify a tag key and value",
-    "message.specify.url": "Пожалуйста, укажите URL",
-    "message.step.1.continue": "Пожалуйста выберите шаблон или ISO для продолжения.",
-    "message.step.1.desc": "Пожалуйста выберите шаблон для Вашей новой виртуальной машины. Вы так же можете выбрать пустой шаблон для установки системы из образа ISO.",
-    "message.step.2.continue": "Пожалуйста выберите услугу для продолжения",
-    "message.step.3.continue": "Пожалуйста выберите размер диска для продолжения",
-    "message.step.4.continue": "Пожалуйста выберите как минимум одну сеть для продолжения.",
-    "message.step.4.desc": "Пожалуйста выберите основную сеть к которой будет подключена Ваша виртуальная машина.",
-    "message.storage.traffic": "Трафик между внутренними ресурсами CloudStack, включая все компоненты, которые взаимодействуют с сервером управления, такие как узлы и CloudStack системные ВМ. Настройте трафик хранения здесь.",
-    "message.suspend.project": "Вы действительно хотите приостановить проект?",
-    "message.systems.vms.ready": "System VMs ready.",
-    "message.template.copying": "Template is being copied.",
-    "message.template.desc": "Образ ОС, который можно использовать в качестве загружаемой в ВМ",
-    "message.tier.required": "Tier is required",
-    "message.tooltip.dns.1": "Имя сервера DNS для ВМ этой зоны. Публичные IP-адреса этой зоны должны иметь маршрут до этого сервера.",
-    "message.tooltip.dns.2": "Имя второго сервера DNS для ВМ этой зоны. Публичные IP-адреса этой зоны должны иметь маршрут до этого сервера.",
-    "message.tooltip.internal.dns.1": "Имя сервера DNS для внутренних ВМ CloudStack этой зоны. Частные IP-адреса стендов должны иметь маршрут до этого сервера.",
-    "message.tooltip.internal.dns.2": "Имя сервера DNS для внутренних ВМ CloudStack этой зоны. Частные IP-адреса стендов должны иметь маршрут до этого сервера.",
-    "message.tooltip.network.domain": "Суффикс DNS для создания собственного доменного имени сети, доступный гостевыми ВМ.",
-    "message.tooltip.pod.name": "Имя для стенда",
-    "message.tooltip.reserved.system.gateway": "Шлюз для узлов этого стенда",
-    "message.tooltip.reserved.system.netmask": "Префикс сети, определяющий подсеть стенда. Используется обозначение CIDR.",
-    "message.tooltip.zone.name": "Имя для зоны",
-    "message.update.os.preference": "Пожалуйста выберите предпочтительную ОС для данного сервера. Виртуальные машины с указанной ОС будут по возможности изначально запускаться на этом сервере.",
-    "message.update.resource.count": "Подтвердите, что вы действительно хотите обновить счетчик ресурсов для этого аккаунта.",
-    "message.update.ssl": "Пожалуйста предоствьте новый X.509 совместимый SSL сертификат для обновления на служебных виртуальных машинах, отвечающих за терминальный доступ:",
-    "message.update.ssl.failed": "Failed to update SSL Certificate.",
-    "message.update.ssl.succeeded": "Update SSL Certificates succeeded",
-    "message.validate.URL": "Please enter a valid URL.",
-    "message.validate.accept": "Please enter a value with a valid extension.",
-    "message.validate.creditcard": "Please enter a valid credit card number.",
-    "message.validate.date": "Please enter a valid date.",
-    "message.validate.date.ISO": "Please enter a valid date (ISO).",
-    "message.validate.digits": "Please enter only digits.",
-    "message.validate.email.address": "Please enter a valid email address.",
-    "message.validate.equalto": "Please enter the same value again.",
-    "message.validate.fieldrequired": "This field is required.",
-    "message.validate.fixfield": "Please fix this field.",
-    "message.validate.instance.name": "Имя сервера не может быть длинее 63 символа. Только ASCII, буквы a~z, A~Z, цыфры 0~9, дефис не допускается. Должна начинаться с буквы и заканчиваться буквой или цифрой.",
-    "message.validate.invalid.characters": "Найдены недопустимые символы; пожалуйста, поправьте.",
-    "message.validate.max": "Please enter a value less than or equal to {0}.",
-    "message.validate.maxlength": "Please enter no more than {0} characters.",
-    "message.validate.minlength": "Please enter at least {0} characters.",
-    "message.validate.number": "Please enter a valid number.",
-    "message.validate.range": "Please enter a value between {0} and {1}.",
-    "message.validate.range.length": "Please enter a value between {0} and {1} characters long.",
-    "message.virtual.network.desc": "Выделенная для Вашей учетной записи виртуальная сеть. Широковещательный домен Вашего VLAN и доступ в публичную сеть обслуживается виртуальным маршрутизатором.",
-    "message.vm.create.template.confirm": "Создание шаблона приведет к автоматической перезагрузке вируальной машины",
-    "message.vm.review.launch": "Проверьте следующую информацию и удостоверьтесь в том, что ваша машина настроена правильно.",
-    "message.vnmc.available.list": "VNMC is not available from provider list.",
-    "message.vnmc.not.available.list": "VNMC is not available from provider list.",
-    "message.volume.create.template.confirm": "Подтвердите, что вы действительно хотите создать шаблон этого тома.  Это процесс может продлиться несколько минут в зависимости от размера тома.",
-    "message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
-    "message.you.must.have.at.least.one.physical.network": "Добавьте как минимум одну физическую сеть",
-    "message.your.cloudstack.is.ready": "Your CloudStack is ready!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "Создание зоны завершено. Хотите включить эту зону?",
-    "message.zone.no.network.selection": "Выбранная зона не имеет вариантов для выбора сети.",
-    "message.zone.step.1.desc": "Пожалуйста выберите сетевую модель для Вашей зоны.",
-    "message.zone.step.2.desc": "Пожалуйста введите следующую информацию для добавления зоны",
-    "message.zone.step.3.desc": "Пожалуйста введите следующую информацию для добавления Стенда",
-    "message.zoneWizard.enable.local.storage": "WARNING: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch:<br/><br/>1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.<br/><br/>2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.<br/><br/><br/>Would you like to continue?",
-    "messgae.validate.min": "Please enter a value greater than or equal to {0}.",
-    "mode": "Режим",
-    "network.rate": "Скорость сети",
-    "notification.reboot.instance": "Перезагрузить машину",
-    "notification.start.instance": "Запустить машину",
-    "notification.stop.instance": "Остановить машину",
-    "side.by.side": "Бок-о-Бок",
-    "state.Accepted": "Принято",
-    "state.Active": "Включен",
-    "state.Allocated": "Распределено",
-    "state.Allocating": "Выделение",
-    "state.BackedUp": "Зарезервировано",
-    "state.BackingUp": "Резервное копирование",
-    "state.Completed": "Завершено",
-    "state.Creating": "Создается",
-    "state.Declined": "Отклонено",
-    "state.Destroyed": "Уничтожено",
-    "state.Disabled": "Выключено",
-    "state.Enabled": "Включено",
-    "state.Error": "Ошибка",
-    "state.Expunging": "Удалён",
-    "state.Migrating": "Миграция",
-    "state.Pending": "Ожидается",
-    "state.Ready": "Готов",
-    "state.Running": "Запущено",
-    "state.Starting": "Запускается",
-    "state.Stopped": "Остановлено",
-    "state.Stopping": "Остановить",
-    "state.Suspended": "Приостановлено",
-    "state.detached": "Отсоединено",
-    "title.upload.volume": "Upload Volume",
-    "ui.listView.filters.all": "Все",
-    "ui.listView.filters.mine": "Мои"
-};
diff --git a/ui/legacy/l10n/zh_CN.js b/ui/legacy/l10n/zh_CN.js
deleted file mode 100644
index f78083c..0000000
--- a/ui/legacy/l10n/zh_CN.js
+++ /dev/null
@@ -1,2316 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-var dictionary = {
-    "ICMP.code": "ICMP 代码",
-    "ICMP.code.desc": "Please specify -1 if you want to allow all ICMP codes",
-    "ICMP.type": "ICMP 类型",
-    "ICMP.type.desc": "Please specify -1 if you want to allow all ICMP types.",
-    "changed.item.properties": "更改项目属性",
-    "confirm.enable.s3": "请填写以下信息以启用对 S3 支持的二级存储的支持",
-    "confirm.enable.swift": "请填写以下信息以启用对 SWIFT 的支持",
-    "error.could.not.change.your.password.because.non.native.user": "错误。LDAP 处于启用状态,无法更改您的密码。",
-    "error.could.not.enable.zone": "无法启用资源域",
-    "error.installWizard.message": "出现问题;请返回并更正任何错误",
-    "error.invalid.username.password": "用户名或密码无效",
-    "error.login": "您的用户名/密码与我们的记录不一致。",
-    "error.menu.select": "正在选择项目,无法执行操作。",
-    "error.mgmt.server.inaccessible": "无法访问管理服务器。请稍后再试。",
-    "error.password.not.match": "密码字段不一致",
-    "error.please.specify.physical.network.tags": "网络方案在您为此物理网络指定标签之后才可用。",
-    "error.session.expired": "您的会话已过期。",
-    "error.something.went.wrong.please.correct.the.following": "出现问题;请更正以下各项",
-    "error.unable.to.reach.management.server": "无法访问管理服务器",
-    "error.unresolved.internet.name": "无法解析您的 Internet 名称。",
-    "force.delete": "强制删除",
-    "force.delete.domain.warning": "警告: 选择此选项将导致删除所有子域以及所有相关联的帐户及其资源。",
-    "force.remove": "强制移除",
-    "force.remove.host.warning": "警告: 选择此选项将导致 CloudStack 在从群集中移除此主机之前,强制停止所有正在运行的虚拟机。",
-    "force.stop": "强制停止",
-    "force.stop.instance.warning": "警告: 除非万不得已,否则不应强制停止此实例。停止此实例可能会导致数据丢失以及致使虚拟机状态不一致。",
-    "hint.no.host.tags": "未找到主机标签",
-    "hint.no.storage.tags": "未找到存储标签",
-    "hint.type.part.host.tag": "主机标签类型",
-    "hint.type.part.storage.tag": "存储标记类型",
-    "image.directory": "图片目录",
-    "inline": "内联",
-    "instances.actions.reboot.label": "重新启动实例",
-    "label.CIDR.list": "CIDR 列表",
-    "label.CIDR.of.destination.network": "目的地网络的 CIDR",
-    "label.CPU.cap": "CPU 上限",
-    "label.DHCP.server.type": "DHCP 服务器类型",
-    "label.DNS.domain.for.guest.networks": "来宾网络的 DNS 域",
-    "label.ESP.encryption": "ESP 加密算法",
-    "label.ESP.hash": "ESP 哈希算法",
-    "label.ESP.lifetime": "ESP 使用期限(第二阶段)",
-    "label.ESP.policy": "ESP 策略",
-    "label.IKE.DH": "IKE DH 算法",
-    "label.IKE.encryption": "IKE 加密算法",
-    "label.IKE.hash": "IKE 哈希算法",
-    "label.IKE.lifetime": "IKE 使用期限(第二阶段)",
-    "label.IKE.policy": "IKE 策略",
-    "label.IPsec.preshared.key": "IPsec 预共享密钥",
-    "label.LB.isolation": "负载平衡器隔离",
-    "label.LUN.number": "LUN 号",
-    "label.PA": "Palo Alto",
-    "label.PA.log.profile": "Palo Alto 日志配置文件",
-    "label.PA.threat.profile": "Palo Alto 威胁配置文件",
-    "label.PING.CIFS.password": "PING CIFS 密码",
-    "label.PING.CIFS.username": "PING CIFS 用户名",
-    "label.PING.dir": "PING 目录",
-    "label.PING.storage.IP": "PING 存储 IP",
-    "label.PreSetup": "PreSetup",
-    "label.Pxe.server.type": "Pxe 服务器类型",
-    "label.SNMP.community": "SNMP 社区",
-    "label.SNMP.port": "SNMP 端口",
-    "label.SR.name": "SR 名称标签",
-    "label.SharedMountPoint": "SharedMountPoint",
-    "label.TFTP.dir": "TFTP 目录",
-    "label.VMFS.datastore": "VMFS 数据存储",
-    "label.VMs.in.tier": "层中的 VM",
-    "label.VPC.limits": "VPC 限制",
-    "label.VPC.router.details": "VPC 路由器详细信息",
-    "label.VPN.connection": "VPN 连接",
-    "label.VPN.customer.gateway": "VPN 客户网关",
-    "label.VPN.gateway": "VPN 网关",
-    "label.Xenserver.Tools.Version61plus": "原始 XS 版本为 6.1+",
-    "label.about": "关于",
-    "label.about.app": "关于 CloudStack",
-    "label.accept.project.invitation": "接受项目邀请",
-    "label.account": "帐户",
-    "label.account.and.security.group": "帐户、安全组",
-    "label.account.details": "账号详情",
-    "label.account.id": "帐户 ID",
-    "label.account.lower": "帐户",
-    "label.account.name": "帐户名称",
-    "label.account.specific": "帐户专用",
-    "label.account.type": "帐号类型",
-    "label.accounts": "帐户",
-    "label.acl": "ACL",
-    "label.acl.id": "ACL ID",
-    "label.acl.export": "Export ACLs",
-    "label.acl.list.rules": "ACL列表策略",
-    "label.acl.name": "ACL 名称",
-    "label.acl.replaced": "ACL 已替换",
-    "label.acl.reason": "Reason",
-    "label.acl.reason.description": "Enter the reason behind an ACL rule.",
-    "label.acquire.new.ip": "获取新 IP",
-    "label.acquire.new.secondary.ip": "获取新二级 IP",
-    "label.action": "操作",
-    "label.action.attach.disk": "附加磁盘",
-    "label.action.attach.disk.processing": "正在附加磁盘...",
-    "label.action.attach.iso": "附加 ISO",
-    "label.action.attach.iso.processing": "正在附加 ISO...",
-    "label.action.cancel.maintenance.mode": "取消维护模式",
-    "label.action.cancel.maintenance.mode.processing": "正在取消维护模式...",
-    "label.action.change.password": "更改密码",
-    "label.action.change.service": "更改服务",
-    "label.action.change.service.processing": "正在更改服务...",
-    "label.action.configure.samlauthorization": "配置 SAML SSO 认证",
-    "label.action.copy.ISO": "复制 ISO",
-    "label.action.copy.ISO.processing": "正在复制ISO镜像",
-    "label.action.copy.template": "复制模板",
-    "label.action.copy.template.processing": "正在复制模板",
-    "label.action.create.template": "创建模板",
-    "label.action.create.template.from.vm": "基于 VM 创建模板",
-    "label.action.create.template.from.volume": "基于卷创建模板",
-    "label.action.create.template.processing": "正在创建模板...",
-    "label.action.create.vm": "创建 VM",
-    "label.action.create.vm.processing": "正在创建 VM...",
-    "label.action.create.volume": "创建卷",
-    "label.action.create.volume.processing": "正在创建卷...",
-    "label.action.delete.IP.range": "删除 IP 范围",
-    "label.action.delete.IP.range.processing": "正在删除 IP 范围...",
-    "label.action.delete.ISO": "删除 ISO",
-    "label.action.delete.ISO.processing": "正在删除 ISO...",
-    "label.action.delete.account": "删除帐户",
-    "label.action.delete.account.processing": "正在删除帐户...",
-    "label.action.delete.cluster": "删除群集",
-    "label.action.delete.cluster.processing": "正在删除群集...",
-    "label.action.delete.disk.offering": "删除磁盘方案",
-    "label.action.delete.disk.offering.processing": "正在删除磁盘方案...",
-    "label.action.delete.domain": "删除域",
-    "label.action.delete.domain.processing": "正在删除域...",
-    "label.action.delete.firewall": "删除防火墙规则",
-    "label.action.delete.firewall.processing": "正在删除防火墙...",
-    "label.action.delete.ingress.rule": "删除入口规则",
-    "label.action.delete.ingress.rule.processing": "正在删除入口规则...",
-    "label.action.delete.load.balancer": "删除负载平衡器规则",
-    "label.action.delete.load.balancer.processing": "正在删除负载平衡器...",
-    "label.action.delete.network": "删除网络",
-    "label.action.delete.network.processing": "正在删除网络...",
-    "label.action.delete.nexusVswitch": "删除 Nexus 1000v",
-    "label.action.delete.nic": "移除 NIC",
-    "label.action.delete.physical.network": "删除物理网络",
-    "label.action.delete.pod": "删除提供点",
-    "label.action.delete.pod.processing": "正在删除提供点...",
-    "label.action.delete.primary.storage": "删除主存储",
-    "label.action.delete.primary.storage.processing": "正在删除主存储...",
-    "label.action.delete.secondary.storage": "删除二级存储",
-    "label.action.delete.secondary.storage.processing": "正在删除二级存储...",
-    "label.action.delete.security.group": "删除安全组",
-    "label.action.delete.security.group.processing": "正在删除安全组...",
-    "label.action.delete.service.offering": "删除服务方案",
-    "label.action.delete.service.offering.processing": "正在删除服务方案...",
-    "label.action.delete.snapshot": "删除快照",
-    "label.action.delete.snapshot.processing": "正在删除快照...",
-    "label.action.delete.system.service.offering": "删除系统服务方案",
-    "label.action.delete.template": "删除模板",
-    "label.action.delete.template.processing": "正在删除模板...",
-    "label.action.delete.user": "删除用户",
-    "label.action.delete.user.processing": "正在删除用户...",
-    "label.action.delete.volume": "删除卷",
-    "label.action.delete.volume.processing": "正在删除卷...",
-    "label.action.delete.zone": "删除资源域",
-    "label.action.delete.zone.processing": "正在删除资源域...",
-    "label.action.destroy.instance": "销毁实例",
-    "label.action.destroy.instance.processing": "正在销毁实例...",
-    "label.action.destroy.systemvm": "销毁系统 VM",
-    "label.action.destroy.systemvm.processing": "正在销毁系统 VM...",
-    "label.action.destroy.volume":"销毁卷",
-    "label.action.detach.disk": "取消附加磁盘",
-    "label.action.detach.disk.processing": "正在取消附加磁盘...",
-    "label.action.detach.iso": "取消附加 ISO",
-    "label.action.detach.iso.processing": "正在取消附加 ISO...",
-    "label.action.disable.account": "禁用帐户",
-    "label.action.disable.account.processing": "正在禁用帐户...",
-    "label.action.disable.cluster": "禁用群集",
-    "label.action.disable.cluster.processing": "正在禁用群集...",
-    "label.action.disable.nexusVswitch": "禁用 Nexus 1000v",
-    "label.action.disable.physical.network": "禁用物理网络",
-    "label.action.disable.pod": "禁用提供点",
-    "label.action.disable.pod.processing": "正在禁用提供点...",
-    "label.action.disable.static.NAT": "禁用静态 NAT",
-    "label.action.disable.static.NAT.processing": "正在禁用静态 NAT...",
-    "label.action.disable.user": "禁用用户",
-    "label.action.disable.user.processing": "正在禁用用户...",
-    "label.action.disable.zone": "禁用资源域",
-    "label.action.disable.zone.processing": "正在禁用资源域...",
-    "label.action.download.ISO": "下载 ISO",
-    "label.action.download.template": "下载模板",
-    "label.action.download.volume": "下载卷",
-    "label.action.download.volume.processing": "正在下载卷...",
-    "label.action.edit.ISO": "编辑 ISO",
-    "label.action.edit.account": "编辑帐户",
-    "label.action.edit.disk.offering": "编辑磁盘方案",
-    "label.action.edit.domain": "编辑域",
-    "label.action.edit.global.setting": "编辑全局设置",
-    "label.action.edit.host": "编辑主机",
-    "label.action.edit.instance": "编辑实例",
-    "label.action.edit.network": "编辑网络",
-    "label.action.edit.network.offering": "编辑网络方案",
-    "label.action.edit.network.processing": "正在编辑网络...",
-    "label.action.edit.pod": "编辑提供点",
-    "label.action.edit.primary.storage": "编辑主存储",
-    "label.action.edit.resource.limits": "编辑资源限制",
-    "label.action.edit.service.offering": "编辑服务方案",
-    "label.action.edit.template": "编辑模板",
-    "label.action.edit.user": "编辑用户",
-    "label.action.edit.zone": "编辑资源域",
-    "label.action.enable.account": "启用帐户",
-    "label.action.enable.account.processing": "正在启用帐户...",
-    "label.action.enable.cluster": "启用群集",
-    "label.action.enable.cluster.processing": "正在启用群集...",
-    "label.action.enable.maintenance.mode": "启用维护模式",
-    "label.action.enable.maintenance.mode.processing": "正在启用维护模式...",
-    "label.action.enable.nexusVswitch": "启用 Nexus 1000v",
-    "label.action.enable.physical.network": "启用物理网络",
-    "label.action.enable.pod": "启用提供点",
-    "label.action.enable.pod.processing": "正在启用提供点...",
-    "label.action.enable.static.NAT": "启用静态 NAT",
-    "label.action.enable.static.NAT.processing": "正在启用静态 NAT...",
-    "label.action.enable.user": "启用用户",
-    "label.action.enable.user.processing": "正在启用用户...",
-    "label.action.enable.zone": "启用资源域",
-    "label.action.enable.zone.processing": "正在启用资源域...",
-    "label.action.expunge.instance": "删除实例",
-    "label.action.expunge.instance.processing": "正在删除实例...",
-    "label.action.force.reconnect": "强制重新连接",
-    "label.action.force.reconnect.processing": "正在重新连接...",
-    "label.action.generate.keys": "生成密钥",
-    "label.action.generate.keys.processing": "正在生成密钥...",
-    "label.action.list.nexusVswitch": "列出 Nexus 1000v",
-    "label.action.lock.account": "锁定帐户",
-    "label.action.lock.account.processing": "正在锁定帐户...",
-    "label.action.manage.cluster": "托管群集",
-    "label.action.manage.cluster.processing": "正在托管群集...",
-    "label.action.migrate.instance": "迁移实例",
-    "label.action.migrate.instance.processing": "正在迁移实例...",
-    "label.action.migrate.router": "迁移路由器",
-    "label.action.migrate.router.processing": "正在迁移路由器...",
-    "label.action.migrate.systemvm": "迁移系统 VM",
-    "label.action.migrate.systemvm.processing": "正在迁移系统 VM...",
-    "label.action.reboot.instance": "重新启动实例",
-    "label.action.reboot.instance.processing": "正在重新启动实例...",
-    "label.action.reboot.router": "重新启动路由器",
-    "label.action.reboot.router.processing": "正在重新启动路由器...",
-    "label.action.reboot.systemvm": "重新启动系统 VM",
-    "label.action.reboot.systemvm.processing": "正在重新启动系统 VM...",
-    "label.action.recover.volume":"恢复卷",
-    "label.action.recurring.snapshot": "重现快照",
-    "label.action.register.iso": "注册 ISO",
-    "label.action.register.template": "使用URL注册模板",
-    "label.action.release.ip": "释放 IP",
-    "label.action.release.ip.processing": "正在释放 IP...",
-    "label.action.remove.host": "删除主机",
-    "label.action.remove.host.processing": "正在删除主机...",
-    "label.action.reset.password": "重置密码",
-    "label.action.reset.password.processing": "正在重置密码...",
-    "label.action.resize.volume": "调整卷大小",
-    "label.action.resize.volume.processing": "正在调整卷大小....",
-    "label.action.resource.limits": "资源限制",
-    "label.action.restore.instance": "还原实例",
-    "label.action.restore.instance.processing": "正在还原实例...",
-    "label.action.revert.snapshot": "还原到快照",
-    "label.action.revert.snapshot.processing": "正在还原到快照...",
-    "label.action.start.instance": "启动实例",
-    "label.action.start.instance.processing": "正在启动实例...",
-    "label.action.start.router": "启动路由器",
-    "label.action.start.router.processing": "正在启动路由器...",
-    "label.action.start.systemvm": "启动系统 VM",
-    "label.action.start.systemvm.processing": "正在启动系统 VM...",
-    "label.action.stop.instance": "停止实例",
-    "label.action.stop.instance.processing": "正在停止实例...",
-    "label.action.stop.router": "停止路由器",
-    "label.action.stop.router.processing": "正在停止路由器...",
-    "label.action.stop.systemvm": "停止系统 VM",
-    "label.action.stop.systemvm.processing": "正在停止系统 VM...",
-    "label.action.take.snapshot": "创建快照",
-    "label.action.take.snapshot.processing": "正在创建快照...",
-    "label.action.unmanage.cluster": "取消托管群集",
-    "label.action.unmanage.cluster.processing": "正在取消托管群集...",
-    "label.action.update.OS.preference": "更新操作系统首选项",
-    "label.action.update.OS.preference.processing": "正在更新操作系统首选项...",
-    "label.action.update.resource.count": "更新资源数量",
-    "label.action.update.resource.count.processing": "正在更新资源数量...",
-    "label.action.vmsnapshot.create": "创建 VM 快照",
-    "label.action.vmsnapshot.delete": "删除 VM 快照",
-    "label.action.vmsnapshot.revert": "还原到 VM 快照",
-    "label.actions": "操作",
-    "label.activate.project": "激活项目",
-    "label.active.sessions": "活动会话",
-    "label.add": "添加",
-    "label.add.ACL": "添加 ACL",
-    "label.add.BigSwitchBcf.device": "添加 BigSwitch BCF 控制器",
-    "label.add.BrocadeVcs.device": "添加 Brocade Vcs 交换机",
-    "label.add.F5.device": "添加 F5 设备",
-    "label.add.LDAP.account": "添加LDAP账户",
-    "label.add.NiciraNvp.device": "添加 Nvp 控制器",
-    "label.add.OpenDaylight.device": "添加 OpenDaylight 控制器",
-    "label.add.PA.device": "添加 Palo Alto 设备",
-    "label.add.SRX.device": "添加 SRX 设备",
-    "label.add.VM.to.tier": "向层中添加 VM",
-    "label.add.VPN.gateway": "添加 VPN 网关",
-    "label.add.account": "添加帐户",
-    "label.add.account.to.project": "向项目中添加帐户",
-    "label.add.accounts": "添加帐户",
-    "label.add.accounts.to": "添加帐户至",
-    "label.add.acl.list": "添加 ACL 列表",
-    "label.edit.acl.list": "Edit ACL List",
-    "label.add.affinity.group": "添加新关联性组",
-    "label.add.baremetal.dhcp.device": "添加裸机 DHCP 设备",
-    "label.add.baremetal.rack.configuration": "添加 Baremetal Rack 配置",
-    "label.add.by": "添加方式",
-    "label.add.by.cidr": "按 CIDR 添加",
-    "label.add.by.group": "按组添加",
-    "label.add.ciscoASA1000v": "添加 CiscoASA1000v 资源",
-    "label.add.cluster": "添加群集",
-    "label.add.compute.offering": "添加计算方案",
-    "label.add.direct.iprange": "添加直接 IP 范围",
-    "label.add.disk.offering": "添加磁盘方案",
-    "label.add.domain": "添加域",
-    "label.add.egress.rule": "添加出口规则",
-    "label.add.firewall": "添加防火墙规则",
-    "label.add.globo.dns": "添加全局DNS",
-    "label.add.gslb": "添加 GSLB",
-    "label.add.guest.network": "添加来宾网络",
-    "label.add.host": "添加主机",
-    "label.add.ingress.rule": "添加入口规则",
-    "label.add.intermediate.certificate": "添加中间证书",
-    "label.add.internal.lb": "添加内部负载平衡器",
-    "label.add.ip.range": "添加 IP 范围",
-    "label.add.isolated.guest.network": "添加隔离的来宾网络",
-    "label.add.isolated.guest.network.with.sourcenat": "添加隔离的来宾网络并启用 SourceNat",
-    "label.add.isolated.network": "添加隔离网络",
-    "label.add.l2.guest.network":"Add L2 Guest Network",
-    "label.add.ldap.account": "添加 LDAP 账户",
-    "label.add.list.name": "ACL 列表名称",
-    "label.add.load.balancer": "添加负载平衡器",
-    "label.add.more": "添加更多",
-    "label.add.netScaler.device": "添加 Netscaler 设备",
-    "label.add.network": "添加网络",
-    "label.add.network.ACL": "添加网络 ACL",
-    "label.add.network.acl.list": "添加网络 ACL 列表",
-    "label.add.network.device": "添加网络设备",
-    "label.add.network.offering": "添加网络方案",
-    "label.add.new.F5": "添加新 F5",
-    "label.add.new.NetScaler": "添加新 NetScaler",
-    "label.add.new.PA": "添加新 Palo Alto",
-    "label.add.new.SRX": "添加新 SRX",
-    "label.add.new.gateway": "添加新网关",
-    "label.add.new.tier": "添加新层",
-    "label.add.nfs.secondary.staging.store": "添加 NFS 二级暂存存储",
-    "label.add.physical.network": "添加物理网络",
-    "label.add.pod": "添加提供点",
-    "label.add.port.forwarding.rule": "添加端口转发规则",
-    "label.add.portable.ip.range": "添加可移植 IP 范围",
-    "label.add.primary.storage": "添加主存储",
-    "label.add.private.gateway": "添加私有网关",
-    "label.add.region": "添加地理区域",
-    "label.add.resources": "添加资源",
-    "label.add.role": "Add Role",
-    "label.add.route": "添加路由",
-    "label.add.rule": "添加规则",
-    "label.add.rule.desc": "Create a new ACL rule",
-    "label.add.secondary.storage": "添加二级存储",
-    "label.add.security.group": "添加安全组",
-    "label.add.service.offering": "添加服务方案",
-    "label.add.static.nat.rule": "添加静态 NAT 规则",
-    "label.add.static.route": "添加静态路由",
-    "label.add.system.service.offering": "添加系统服务方案",
-    "label.add.template": "添加模板",
-    "label.add.to.group": "添加到组",
-    "label.add.ucs.manager": "添加 UCS 管理器",
-    "label.add.user": "添加用户",
-    "label.add.userdata": "用户数据",
-    "label.add.vlan": "添加 VLAN",
-    "label.add.vm": "添加 VM",
-    "label.add.vms": "添加 VM",
-    "label.add.vms.to.lb": "向负载平衡器规则中添加 VM",
-    "label.add.vmware.datacenter": "添加 VMware 数据中心",
-    "label.add.vnmc.device": "添加 VNMC 设备",
-    "label.add.vnmc.provider": "添加 VNMC 提供程序",
-    "label.add.volume": "添加卷",
-    "label.add.vpc": "添加 VPC",
-    "label.add.vpc.offering": "添加 VPC 方案",
-    "label.add.vpn.customer.gateway": "添加 VPN 客户网关",
-    "label.add.vpn.user": "添加 VPN 用户",
-    "label.add.vxlan": "添加 VXLAN",
-    "label.add.zone": "添加资源域",
-    "label.added.brocade.vcs.switch": "已添加新 Brocade Vcs 交换机",
-    "label.added.network.offering": "已添加网络方案",
-    "label.added.new.bigswitch.bcf.controller": "添加新的 BigSwitch BCF 控制器",
-    "label.added.nicira.nvp.controller": "已添加新 Nicira NVP 控制器",
-    "label.addes.new.f5": "已添加新 F5",
-    "label.adding": "正在添加",
-    "label.adding.cluster": "正在添加群集",
-    "label.adding.failed": "添加失败",
-    "label.adding.pod": "正在添加提供点",
-    "label.adding.processing": "正在添加...",
-    "label.adding.succeeded": "已成功添加",
-    "label.adding.user": "正在添加用户",
-    "label.adding.zone": "正在添加资源域",
-    "label.additional.networks": "其他网络",
-    "label.admin": "管理员",
-    "label.admin.accounts": "管理员帐户",
-    "label.advanced": "高级",
-    "label.advanced.mode": "高级模式",
-    "label.advanced.search": "高级搜索",
-    "label.affinity": "关联性",
-    "label.affinity.group": "关联性组",
-    "label.affinity.groups": "关联性组",
-    "label.agent.password": "代理密码",
-    "label.agent.port": "代理端口",
-    "label.agent.state": "代理状态",
-    "label.agent.username": "代理用户名",
-    "label.agree": "同意",
-    "label.alert": "警报",
-    "label.alert.archived": "警报已存档",
-    "label.alert.deleted": "警报已删除",
-    "label.alert.details": "警报详细信息",
-    "label.algorithm": "算法",
-    "label.allocated": "已分配",
-    "label.allocation.state": "分配状态",
-    "label.allow": "允许",
-    "label.anti.affinity": "反关联性",
-    "label.anti.affinity.group": "反关联性组",
-    "label.anti.affinity.groups": "反关联性组",
-    "label.api.key": "API 密钥",
-    "label.api.version": "API 版本",
-    "label.app.name": "CloudStack",
-    "label.apply": "应用",
-    "label.archive": "存档",
-    "label.archive.alerts": "存档警报",
-    "label.archive.events": "存档事件",
-    "label.assign": "分配",
-    "label.assign.instance.another": "将实例分配给其他帐户",
-    "label.assign.to.load.balancer": "正在将实例分配给负载平衡器",
-    "label.assign.vms": "分配实例",
-    "label.assigned.vms": "已分配的 VM",
-    "label.associate.public.ip": "关联公用 IP",
-    "label.associated.network": "关联网络",
-    "label.associated.network.id": "已关联网络 ID",
-    "label.associated.profile": "已关联配置文件",
-    "label.attached.iso": "已附加 ISO",
-    "label.author.email": "作者电子邮件",
-    "label.author.name": "作者姓名",
-    "label.autoscale": "自动扩展",
-    "label.autoscale.configuration.wizard": "自动扩展配置向导",
-    "label.availability": "可用性",
-    "label.availability.zone": "可用资源域",
-    "label.availabilityZone": "可用区域",
-    "label.available": "可用",
-    "label.available.public.ips": "可用公用 IP 地址",
-    "label.back": "后退",
-    "label.bandwidth": "带宽",
-    "label.baremetal.dhcp.devices": "裸机 DHCP 设备",
-    "label.baremetal.dhcp.provider": "裸机 DHCP 提供程序",
-    "label.baremetal.pxe.device": "添加裸机 PXE 设备",
-    "label.baremetal.pxe.devices": "裸机 PXE 设备",
-    "label.baremetal.pxe.provider": "裸机 PXE 提供程序",
-    "label.baremetal.rack.configuration": "Baremetal Rack 配置",
-    "label.basic": "基本",
-    "label.basic.mode": "基本模式",
-    "label.bigswitch.bcf.details": " BigSwitch BCF 详情",
-    "label.bigswitch.bcf.nat": "BigSwitch BCF  NAT 已启用",
-    "label.bigswitch.controller.address": "BigSwitch BCF 控制器地址",
-    "label.blade.id": "刀片式服务器 ID",
-    "label.blades": "刀片式服务器",
-    "label.bootable": "可启动",
-    "label.broadcast.domain.range": "广播域范围",
-    "label.broadcast.domain.type": "广播域类型",
-    "label.broadcast.uri": "广播 URI",
-    "label.broadcasturi": "广播 URI",
-    "label.broadcat.uri": "广播 URI",
-    "label.brocade.vcs.address": "Vcs 交换机地址",
-    "label.brocade.vcs.details": "Brocade Vcs 交换机详细信息",
-    "label.by.account": "按帐户",
-    "label.by.alert.type": "按警报类型",
-    "label.by.availability": "按可用性",
-    "label.by.date.end": "按日期(结束日期)",
-    "label.by.date.start": "按日期(开始日期)",
-    "label.by.domain": "按域",
-    "label.by.end.date": "按结束日期",
-    "label.by.event.type": "按事件类型",
-    "label.by.level": "按级别",
-    "label.by.pod": "按提供点",
-    "label.by.role": "按角色",
-    "label.by.start.date": "按开始日期",
-    "label.by.state": "按状态",
-    "label.by.traffic.type": "按流量类型",
-    "label.by.type": "按类型",
-    "label.by.type.id": "按类型 ID",
-    "label.by.zone": "按资源域",
-    "label.bytes.received": "接收的字节数",
-    "label.bytes.sent": "发送的字节数",
-    "label.cache.mode": "写入缓存类型",
-    "label.cancel": "取消",
-    "label.capacity": "容量",
-    "label.capacity.bytes": "容量(字节)",
-    "label.capacity.iops": "容量 IOPS",
-    "label.certificate": "服务器证书",
-    "label.change.affinity": "更改关联性",
-    "label.change.ipaddress": "Change IP address for NIC",
-    "label.change.service.offering": "更改服务方案",
-    "label.change.value": "更改值",
-    "label.character": "字符",
-    "label.chassis": "机箱",
-    "label.checksum": "校验",
-    "label.cidr": "CIDR",
-    "label.cidr.account": "CIDR 或帐户/安全组",
-    "label.cidr.list": "源 CIDR",
-    "label.cisco.nexus1000v.ip.address": "Nexus 1000v IP 地址",
-    "label.cisco.nexus1000v.password": "Nexus 1000v 密码",
-    "label.cisco.nexus1000v.username": "Nexus 1000v 用户名",
-    "label.ciscovnmc.resource.details": "CiscoVNMC 资源详细信息",
-    "label.clean.up": "清理",
-    "label.clear.list": "清除列表",
-    "label.close": "关闭",
-    "label.cloud.console": "云管理控制台",
-    "label.cloud.managed": "由 Cloud.com 管理",
-    "label.cluster": "群集",
-    "label.cluster.name": "群集名称",
-    "label.cluster.type": "群集类型",
-    "label.clusters": "群集",
-    "label.clvm": "CLVM",
-    "label.code": "代码",
-    "label.community": "社区",
-    "label.compute": "计算",
-    "label.compute.and.storage": "计算与存储",
-    "label.compute.offering": "计算方案",
-    "label.compute.offerings": "计算方案",
-    "label.configuration": "配置",
-    "label.configure": "配置",
-    "label.configure.ldap": "配置 LDAP",
-    "label.configure.network.ACLs": "配置网络 ACL",
-    "label.configure.sticky.policy": "配置粘滞策略",
-    "label.configure.vpc": "配置 VPC",
-    "label.confirm.password": "确认密码",
-    "label.confirmation": "确认",
-    "label.congratulations": "祝贺您!",
-    "label.conserve.mode": "节能模式",
-    "label.console.proxy": "控制台代理",
-    "label.console.proxy.vm": "控制台代理 VM",
-    "label.continue": "继续",
-    "label.continue.basic.install": "继续执行基本安装",
-    "label.copying.iso": "正在复制 ISO",
-    "label.corrections.saved": "已保存修正",
-    "label.counter": "计数器",
-    "label.cpu": "CPU",
-    "label.cpu.allocated": "已分配的 CPU",
-    "label.cpu.allocated.for.VMs": "已分配给 VM 的 CPU",
-    "label.cpu.limits": "CPU 限制",
-    "label.cpu.mhz": "CPU (MHz)",
-    "label.cpu.utilized": "CPU 利用率",
-    "label.create.VPN.connection": "创建 VPN 连接",
-    "label.create.nfs.secondary.staging.storage": "创建 NFS 二级暂存存储",
-    "label.create.nfs.secondary.staging.store": "创建 NFS 二级暂存存储",
-    "label.create.project": "创建项目",
-    "label.create.ssh.key.pair": "生成SSH密钥对",
-    "label.create.template": "创建模板",
-    "label.created": "创建日期",
-    "label.created.by.system": "由系统创建",
-    "label.cross.zones": "跨资源域",
-    "label.custom": "自定义",
-    "label.custom.disk.iops": "自定义 IOPS",
-    "label.custom.disk.offering": "自定义磁盘方案",
-    "label.custom.disk.size": "自定义磁盘大小",
-    "label.daily": "每天",
-    "label.data.disk.offering": "数据磁盘方案",
-    "label.date": "日期",
-    "label.day": "天",
-    "label.day.of.month": "日期",
-    "label.day.of.week": "星期",
-    "label.dc.name": "数据中心名称",
-    "label.dead.peer.detection": "失效对等体检测",
-    "label.decline.invitation": "拒绝邀请",
-    "label.dedicate": "专用",
-    "label.dedicate.cluster": "将群集专用",
-    "label.dedicate.host": "将主机专用",
-    "label.dedicate.pod": "将提供点专用",
-    "label.dedicate.vlan.vni.range": "将 VLAN/VNI 范围专用",
-    "label.dedicate.zone": "将资源域专用",
-    "label.dedicated": "专用",
-    "label.dedicated.vlan.vni.ranges": "VLAN/VNI 范围已专用",
-    "label.default": "默认设置",
-    "label.default.egress.policy": "默认出口规则",
-    "label.default.use": "默认使用",
-    "label.default.view": "默认视图",
-    "label.delete": "删除",
-    "label.delete.BigSwitchBcf": "移除 BigSwitch BCF 控制器",
-    "label.delete.BrocadeVcs": "删除 Brocade Vcs 交换机",
-    "label.delete.F5": "删除 F5",
-    "label.delete.NetScaler": "删除 NetScaler",
-    "label.delete.NiciraNvp": "删除 Nvp 控制器",
-    "label.delete.OpenDaylight.device": "删除 OpenDaylight 控制器",
-    "label.delete.PA": "删除 Palo Alto",
-    "label.delete.SRX": "删除 SRX",
-    "label.delete.VPN.connection": "删除 VPN 连接",
-    "label.delete.VPN.customer.gateway": "删除 VPN 客户网关",
-    "label.delete.VPN.gateway": "删除 VPN 网关",
-    "label.delete.acl.list": "删除 ACL 列表",
-    "label.delete.affinity.group": "删除关联性组",
-    "label.delete.alerts": "删除警报",
-    "label.delete.baremetal.rack.configuration": "删除 Baremetal Rack 配置",
-    "label.delete.ciscoASA1000v": "删除 CiscoASA1000v",
-    "label.delete.ciscovnmc.resource": "删除 CiscoVNMC 资源",
-    "label.delete.events": "删除事件",
-    "label.delete.gateway": "删除网关",
-    "label.delete.internal.lb": "删除内部负载平衡器",
-    "label.delete.portable.ip.range": "删除可移植 IP 范围",
-    "label.delete.profile": "删除配置文件",
-    "label.delete.project": "删除项目",
-    "label.delete.role": "Delete Role",
-    "label.delete.secondary.staging.store": "删除二级暂存存储",
-    "label.delete.ucs.manager": "删除 UCS Manager",
-    "label.delete.vpn.user": "删除 VPN 用户",
-    "label.deleting.failed": "删除失败",
-    "label.deleting.processing": "正在删除...",
-    "label.deny": "拒绝",
-    "label.deployment.planner": "部署规划器",
-    "label.description": "说明",
-    "label.destination.physical.network.id": "目标物理网络 ID",
-    "label.destination.zone": "目标资源域",
-    "label.destroy": "销毁",
-    "label.destroy.router": "销毁路由器",
-    "label.destroy.vm.graceperiod": "销毁 VM 宽限期",
-    "label.detaching.disk": "正在取消附加磁盘",
-    "label.details": "详细信息",
-    "label.device.id": "设备 ID",
-    "label.devices": "设备",
-    "label.dhcp": "DHCP",
-    "label.direct.attached.public.ip": "直连公用 IP",
-    "label.direct.download":"Direct Download",
-    "label.direct.ips": "共享网络 IP",
-    "label.disable.autoscale": "禁用自动缩放",
-    "label.disable.host": "禁用主机",
-    "label.disable.network.offering": "禁用网络方案",
-    "label.disable.provider": "禁用提供程序",
-    "label.disable.vnmc.provider": "禁用 VNMC 提供程序",
-    "label.disable.vpc.offering": "禁用 VPC 方案",
-    "label.disable.vpn": "禁用远程访问 VPN",
-    "label.disabled": "已禁用",
-    "label.disabling.vpn.access": "正在禁用 VPN 访问",
-    "label.disassociate.profile.blade": "取消将配置文件与刀片式服务器关联",
-    "label.disbale.vnmc.device": "禁用 VNMC 设备",
-    "label.disk.allocated": "已分配的磁盘",
-    "label.disk.bytes.read.rate": "磁盘读取速度(BPS)",
-    "label.disk.bytes.write.rate": "磁盘写入速度(BPS)",
-    "label.disk.iops.max": "最大 IOPS",
-    "label.disk.iops.min": "最小 IOPS",
-    "label.disk.iops.read.rate": "磁盘读取速度(IOPS)",
-    "label.disk.iops.total": "总 IOPS",
-    "label.disk.iops.write.rate": "磁盘写入速度(IOPS)",
-    "label.disk.offering": "磁盘方案",
-    "label.disk.offering.details": "磁盘方案详情",
-    "label.disk.newOffering": "New Disk Offering",
-    "label.disk.newOffering.description": "New disk offering to be used by this volume after the migration.",
-    "label.disk.physicalsize":"Physical Size",
-    "label.disk.provisioningtype": "置备类型",
-    "label.disk.read.bytes": "磁盘读取(字节)",
-    "label.disk.read.io": "磁盘读取(IO)",
-    "label.disk.size": "磁盘大小",
-    "label.disk.size.gb": "磁盘大小(GB)",
-    "label.disk.total": "磁盘总量",
-    "label.disk.utilisation":"Utilisation",
-    "label.disk.virtualsize":"Virtual Size",
-    "label.disk.volume": "磁盘卷",
-    "label.disk.write.bytes": "磁盘写入(字节)",
-    "label.disk.write.io": "磁盘写入(IO)",
-    "label.diskoffering": "磁盘方案",
-    "label.display.name": "显示名称",
-    "label.display.text": "显示文本",
-    "label.distributedrouter": "分布式路由器",
-    "label.dns": "DNS",
-    "label.dns.1": "DNS 1",
-    "label.dns.2": "DNS 2",
-    "label.domain": "域",
-    "label.domain.admin": "域管理员",
-    "label.domain.details": "域详情",
-    "label.domain.id": "域 ID",
-    "label.domain.lower": "域",
-    "label.domain.name": "域名",
-    "label.domain.router": "域路由器",
-    "label.domain.suffix": "DNS 域后缀(例如 xyz.com)",
-    "label.done": "完成",
-    "label.double.quotes.are.not.allowed": "不允许使用双引号",
-    "label.download.progress": "下载进度",
-    "label.drag.new.position": "拖动到新位置",
-    "label.duration.in.sec": "持续时间 (秒)",
-    "label.dynamically.scalable": "可动态扩展",
-    "label.edit": "编辑",
-    "label.edit.acl.rule": "编辑 ACL 规则",
-    "label.edit.affinity.group": "编辑关联性组",
-    "label.edit.lb.rule": "编辑负载平衡器规则",
-    "label.edit.network.details": "编辑网络详情",
-    "label.edit.project.details": "编辑项目详情",
-    "label.edit.region": "编辑地理区域",
-    "label.edit.role": "Edit Role",
-    "label.edit.rule": "编辑规则",
-    "label.edit.secondary.ips": "编辑二级 IPs",
-    "label.edit.tags": "编辑标签",
-    "label.edit.traffic.type": "编辑流量类型",
-    "label.edit.vpc": "编辑 VPC",
-    "label.egress.default.policy": "出口默认策略",
-    "label.egress.rule": "出口规则",
-    "label.egress.rules": "出口规则",
-    "label.elastic": "弹性",
-    "label.elastic.IP": "弹性 IP",
-    "label.elastic.LB": "弹性负载平衡器",
-    "label.email": "电子邮件",
-    "label.email.lower": "电子邮件",
-    "label.enable.autoscale": "启用自动缩放",
-    "label.enable.host": "启用主机",
-    "label.enable.network.offering": "启用网络方案",
-    "label.enable.provider": "启用提供程序",
-    "label.enable.s3": "启用 S3 支持的二级存储",
-    "label.enable.swift": "启用 SWIFT",
-    "label.enable.vnmc.device": "启用 VNMC 设备",
-    "label.enable.vnmc.provider": "启用 VNMC 提供程序",
-    "label.enable.vpc.offering": "启用 VPC 方案",
-    "label.enable.vpn": "启用远程访问 VPN",
-    "label.enabling.vpn": "正在启用 VPN",
-    "label.enabling.vpn.access": "正在启用 VPN 访问",
-    "label.end.IP": "结束 IP",
-    "label.end.port": "结束端口",
-    "label.end.reserved.system.IP": "结束预留系统 IP",
-    "label.end.vlan": "结束 VLAN",
-    "label.end.vxlan": "结束 VXLAN",
-    "label.endpoint": "端点",
-    "label.endpoint.or.operation": "端点或操作",
-    "label.enter.token": "输入令牌",
-    "label.error": "错误",
-    "label.error.code": "错误代码",
-    "label.error.upper": "错误",
-    "label.esx.host": "ESX/ESXi 主机",
-    "label.event": "事件",
-    "label.event.archived": "事件已存档",
-    "label.event.deleted": "事件已删除",
-    "label.every": "每",
-    "label.example": "示例",
-    "label.expunge": "删除",
-    "label.external.link": "外部链接",
-    "label.extractable": "可提取",
-    "label.extractable.lower": "可提取",
-    "label.f5": "F5",
-    "label.f5.details": "F5 详细信息",
-    "label.failed": "失败",
-    "label.featured": "精选",
-    "label.fetch.latest": "提取最新内容",
-    "label.filterBy": "过滤依据",
-    "label.fingerprint": "指纹",
-    "label.firewall": "防火墙",
-    "label.first.name": "名字",
-    "label.firstname.lower": "名字",
-    "label.format": "格式",
-    "label.format.lower": "格式",
-    "label.friday": "星期五",
-    "label.full": "满载",
-    "label.full.path": "完整路径",
-    "label.gateway": "网关",
-    "label.general.alerts": "常规警报",
-    "label.generating.url": "正在生成 URL",
-    "label.globo.dns": "全局DNS",
-    "label.globo.dns.configuration": "全局 DNS 配置",
-    "label.gluster.volume": "卷",
-    "label.go.step.2": "转至步骤 2",
-    "label.go.step.3": "转至步骤 3",
-    "label.go.step.4": "转至步骤 4",
-    "label.go.step.5": "转至步骤 5",
-    "label.gpu": "GPU",
-    "label.group": "组",
-    "label.group.by.account": "按帐户分组",
-    "label.group.by.cluster": "按群集分组",
-    "label.group.by.pod": "按提供点分组",
-    "label.group.by.zone": "按资源域分组",
-    "label.group.optional": "组(可选)",
-    "label.gslb": "GSLB",
-    "label.gslb.assigned.lb": "已分配负载平衡",
-    "label.gslb.assigned.lb.more": "分配更多负载平衡",
-    "label.gslb.delete": "删除 GSLB",
-    "label.gslb.details": "GSLB 详细信息",
-    "label.gslb.domain.name": "GSLB 域名",
-    "label.gslb.lb.details": "负载平衡详细信息",
-    "label.gslb.lb.remove": "从此 GSLB 中删除负载平衡",
-    "label.gslb.lb.rule": "负载平衡规则",
-    "label.gslb.service": "GSLB 服务",
-    "label.gslb.service.private.ip": "GSLB 服务专用 IP",
-    "label.gslb.service.public.ip": "GSLB 服务公用 IP",
-    "label.gslb.servicetype": "服务类型",
-    "label.guest": "来宾",
-    "label.guest.cidr": "来宾 CIDR",
-    "label.guest.end.ip": "来宾结束 IP",
-    "label.guest.gateway": "来宾网关",
-    "label.guest.ip": "来宾 IP 地址",
-    "label.guest.ip.range": "来宾 IP 范围",
-    "label.guest.netmask": "来宾网络掩码",
-    "label.guest.network.details": "来宾网络详细信息",
-    "label.guest.networks": "来宾网络",
-    "label.guest.start.ip": "来宾起始 IP",
-    "label.guest.traffic": "来宾流量",
-    "label.guest.traffic.vswitch.name": "来宾流量虚拟交换机名称",
-    "label.guest.traffic.vswitch.type": "来宾流量虚拟交换机类型",
-    "label.guest.type": "来宾类型",
-    "label.ha.enabled": "已启用高可用性",
-    "label.health.check": "运行状况检查",
-    "label.health.check.advanced.options": "高级选项:",
-    "label.health.check.configurations.options": "配置选项:",
-    "label.health.check.interval.in.sec": "运行状况检查时间间隔(秒)",
-    "label.health.check.message.desc": "负载均衡器会自动对实例进行状况检查并且只有路由器至实例的链路正常才能通过检查",
-    "label.health.check.wizard": "运行检查向导",
-    "label.healthy.threshold": "正常阈值",
-    "label.help": "帮助",
-    "label.hide.ingress.rule": "隐藏入口规则",
-    "label.hints": "提示",
-    "label.home": "首页",
-    "label.host": "主机",
-    "label.host.MAC": "主机 MAC",
-    "label.host.alerts": "Hosts in Alert State",
-    "label.host.name": "主机名称",
-    "label.host.tag": "宿主机标签",
-    "label.host.tags": "主机标签",
-    "label.hosts": "主机",
-    "label.hourly": "每小时",
-    "label.hvm": "HVM",
-    "label.hyperv.traffic.label": "HyperV 流量标签",
-    "label.hypervisor": "虚拟机管理程序",
-    "label.hypervisor.capabilities": "虚拟机管理程序功能",
-    "label.hypervisor.snapshot.reserve": "虚拟机管理程序快照预留",
-    "label.hypervisor.type": "虚拟机管理程序类型",
-    "label.hypervisor.version": "虚拟机管理程序版本",
-    "label.hypervisors": "虚拟机管理程序",
-    "label.id": "ID",
-    "label.info": "信息",
-    "label.info.upper": "信息",
-    "label.ingress.rule": "入口规则",
-    "label.initiated.by": "启动者",
-    "label.inside.port.profile": "内部端口配置文件",
-    "label.installWizard.addClusterIntro.subtitle": "什么是群集?",
-    "label.installWizard.addClusterIntro.title": "添加一个群集",
-    "label.installWizard.addHostIntro.subtitle": "什么是主机?",
-    "label.installWizard.addHostIntro.title": "添加一个主机",
-    "label.installWizard.addPodIntro.subtitle": "什么是提供点?",
-    "label.installWizard.addPodIntro.title": "添加一个提供点",
-    "label.installWizard.addPrimaryStorageIntro.subtitle": "什么是主存储?",
-    "label.installWizard.addPrimaryStorageIntro.title": "添加一个主存储",
-    "label.installWizard.addSecondaryStorageIntro.subtitle": "什么是二级存储?",
-    "label.installWizard.addSecondaryStorageIntro.title": "添加一个二级存储",
-    "label.installWizard.addZone.title": "添加资源域",
-    "label.installWizard.addZoneIntro.subtitle": "什么是资源域?",
-    "label.installWizard.addZoneIntro.title": "添加一个资源域",
-    "label.installWizard.click.launch": "请单击“启动”按钮。",
-    "label.installWizard.subtitle": "此教程将帮助您设置 CloudStack&#8482 安装",
-    "label.installWizard.title": "您好,欢迎使用 CloudStack&#8482",
-    "label.instance": "实例",
-    "label.instance.limits": "实例限制",
-    "label.instance.name": "实例名称",
-    "label.instance.port": "实例端口",
-    "label.instance.scaled.up": "提供需要扩展的实例",
-    "label.instances": "实例",
-    "label.instanciate.template.associate.profile.blade": "将模板实例化并将配置文件与刀片式服务器关联",
-    "label.intermediate.certificate": "中间证书 {0}",
-    "label.internal.dns.1": "内部 DNS 1",
-    "label.internal.dns.2": "内部 DNS 2",
-    "label.internal.lb": "内部负载均衡器",
-    "label.internal.lb.details": "内部负载平衡器详细信息",
-    "label.internal.name": "内部名称",
-    "label.internallbvm": "InternalLbVm",
-    "label.interval.type": "间隔类型",
-    "label.introduction.to.cloudstack": "CloudStack&#8482 简介",
-    "label.invalid.integer": "无效整数",
-    "label.invalid.number": "无效数字",
-    "label.invitations": "邀请",
-    "label.invite": "邀请",
-    "label.invite.to": "邀请加入",
-    "label.invited.accounts": "已邀请的帐户",
-    "label.ip": "IP",
-    "label.ip.address": "IP 地址",
-    "label.ip.allocations": "IP 分配",
-    "label.ip.limits": "公用 IP 限制",
-    "label.ip.or.fqdn": "IP 或 FQDN",
-    "label.ip.range": "IP 范围",
-    "label.ip.ranges": "IP 范围",
-    "label.ipaddress": "IP 地址",
-    "label.ips": "IP",
-    "label.ipv4.cidr": "IPv4 CIDR",
-    "label.ipv4.dns1": "IPv4 DNS1",
-    "label.ipv4.dns2": "IPv4 DNS2",
-    "label.ipv4.end.ip": "IPv4 结束 IP",
-    "label.ipv4.gateway": "IPv4 网关",
-    "label.ipv4.netmask": "IPv4 网络掩码",
-    "label.ipv4.start.ip": "IPv4 起始 IP",
-    "label.ipv6.CIDR": "IPv6 CIDR",
-    "label.ipv6.address": "IPv6 IP 地址",
-    "label.ipv6.dns1": "IPv6 DNS1",
-    "label.ipv6.dns2": "IPv6 DNS2",
-    "label.ipv6.end.ip": "IPv6 结束 IP",
-    "label.ipv6.gateway": "IPv6 网关",
-    "label.ipv6.start.ip": "IPv6 起始 IP",
-    "label.is.default": "是否为默认设置",
-    "label.is.redundant.router": "冗余",
-    "label.is.shared": "是否共享",
-    "label.is.system": "是否为系统",
-    "label.iscsi": "iSCSI",
-    "label.iso": "ISO",
-    "label.iso.boot": "ISO 启动",
-    "label.isolated.networks": "隔离网络",
-    "label.isolation.method": "隔离方法",
-    "label.isolation.mode": "隔离模式",
-    "label.isolation.uri": "隔离 URI",
-    "label.item.listing": "项目列表",
-    "label.japanese.keyboard": "日式键盘",
-    "label.keep": "保留",
-    "label.keep.colon": "保留",
-    "label.key": "密钥",
-    "label.keyboard.language": "键盘语言",
-    "label.keyboard.type": "键盘类型",
-    "label.kvm.traffic.label": "KVM 流量标签",
-    "label.label": "标签",
-    "label.lang.arabic": "阿拉伯语",
-    "label.lang.brportugese": "葡萄牙语(巴西)",
-    "label.lang.catalan": "加泰罗尼亚语",
-    "label.lang.chinese": "简体中文",
-    "label.lang.dutch": "荷兰语(荷兰)",
-    "label.lang.english": "英语",
-    "label.lang.french": "法语",
-    "label.lang.german": "德语",
-    "label.lang.hungarian": "匈牙利",
-    "label.lang.italian": "意大利语",
-    "label.lang.japanese": "日语",
-    "label.lang.korean": "韩语",
-    "label.lang.norwegian": "挪威语",
-    "label.lang.polish": "波兰语",
-    "label.lang.russian": "俄语",
-    "label.lang.spanish": "西班牙语",
-    "label.last.disconnected": "上次断开连接时间",
-    "label.last.name": "姓氏",
-    "label.lastname.lower": "姓氏",
-    "label.latest.events": "最新事件",
-    "label.launch": "启动",
-    "label.launch.vm": "启动 VM",
-    "label.launch.zone": "启动资源域",
-    "label.lb.algorithm.leastconn": "最少连接算法",
-    "label.lb.algorithm.roundrobin": "轮循",
-    "label.lb.algorithm.source": "源算法",
-    "label.ldap.configuration": "LDAP 配置",
-    "label.ldap.group.name": "LDAP 组",
-    "label.ldap.link.type": "类型",
-    "label.ldap.port": "LDAP 端口",
-    "label.level": "级别",
-    "label.link.domain.to.ldap": "域链接至 LDAP",
-    "label.linklocal.ip": "链接本地 IP 地址",
-    "label.load.balancer": "负载平衡器",
-    "label.load.balancer.type": "负载平衡器类型",
-    "label.load.balancing": "负载平衡",
-    "label.load.balancing.policies": "负载平衡策略",
-    "label.loading": "正在加载",
-    "label.local": "本地",
-    "label.local.file": "本地文件",
-    "label.local.storage": "本地存储",
-    "label.local.storage.enabled": "为用户实例开启本地存储",
-    "label.local.storage.enabled.system.vms": "为系统实例开启本地存储",
-    "label.login": "登录",
-    "label.logout": "注销",
-    "label.lun": "LUN",
-    "label.lxc.traffic.label": "LXC 流量标签",
-    "label.make.project.owner": "设为帐户项目所有者",
-    "label.make.redundant": "冗余",
-    "label.manage": "托管",
-    "label.manage.resources": "管理资源",
-    "label.managed": "托管",
-    "label.management": "管理",
-    "label.management.ips": "管理类 IP 地址",
-    "label.management.server": "管理服务器",
-    "label.max.cpus": "最大 CPU 内核数",
-    "label.max.guest.limit": "最大来宾数限制",
-    "label.max.instances": "最大实例数",
-    "label.max.memory": "最大内存(MiB)",
-    "label.max.networks": "最大网络数",
-    "label.max.primary.storage": "最大主存储(GiB)",
-    "label.max.public.ips": "最大公用 IP 数",
-    "label.max.secondary.storage": "最大二级存储(GiB)",
-    "label.max.snapshots": "最大快照数",
-    "label.max.templates": "最大模板数",
-    "label.max.vms": "最大用户 VM 数",
-    "label.max.volumes": "最大卷数",
-    "label.max.vpcs": "最大 VPC 数",
-    "label.maximum": "最大值",
-    "label.may.continue": "您现在可以继续进行操作。",
-    "label.md5.checksum": "MD5 校验和",
-    "label.memory": "内存",
-    "label.memory.allocated": "已分配的内存",
-    "label.memory.limits": "内存限制(MiB)",
-    "label.memory.mb": "内存(MB)",
-    "label.memory.total": "内存总量",
-    "label.memory.used": "已使用的内存",
-    "label.menu.accounts": "帐户",
-    "label.menu.alerts": "警报",
-    "label.menu.all.accounts": "所有帐户",
-    "label.menu.all.instances": "所有实例",
-    "label.menu.community.isos": "社区 ISO",
-    "label.menu.community.templates": "社区模板",
-    "label.menu.configuration": "配置",
-    "label.menu.dashboard": "控制板",
-    "label.menu.destroyed.instances": "已销毁的实例",
-    "label.menu.disk.offerings": "磁盘方案",
-    "label.menu.domains": "域",
-    "label.menu.events": "事件",
-    "label.menu.featured.isos": "精选 ISO",
-    "label.menu.featured.templates": "精选模板",
-    "label.menu.global.settings": "全局设置",
-    "label.menu.infrastructure": "基础架构",
-    "label.menu.instances": "实例",
-    "label.menu.ipaddresses": "IP 地址",
-    "label.menu.isos": "ISO",
-    "label.menu.my.accounts": "我的帐户",
-    "label.menu.my.instances": "我的实例",
-    "label.menu.my.isos": "我的 ISO",
-    "label.menu.my.templates": "我的模板",
-    "label.menu.network": "网络",
-    "label.menu.network.offerings": "网络方案",
-    "label.menu.physical.resources": "物理资源",
-    "label.menu.regions": "地理区域",
-    "label.menu.running.instances": "正在运行的实例",
-    "label.menu.security.groups": "安全组",
-    "label.menu.service.offerings": "服务方案",
-    "label.menu.snapshots": "快照",
-    "label.menu.sshkeypair": "SSH 密钥对",
-    "label.menu.stopped.instances": "已停止的实例",
-    "label.menu.storage": "存储",
-    "label.menu.system": "系统",
-    "label.menu.system.service.offerings": "系统方案",
-    "label.menu.system.vms": "系统 VM",
-    "label.menu.templates": "模板",
-    "label.menu.virtual.appliances": "虚拟设备",
-    "label.menu.virtual.resources": "虚拟资源",
-    "label.menu.volumes": "卷",
-    "label.menu.vpc.offerings": "VPC 方案",
-    "label.metrics": "Metrics",
-    "label.metrics.allocated": "已分配",
-    "label.metrics.clusters": "群集",
-    "label.metrics.cpu.allocated": "CPU Allocation",
-    "label.metrics.cpu.max.dev": "Deviation",
-    "label.metrics.cpu.total": "Total",
-    "label.metrics.cpu.usage": "CPU Usage",
-    "label.metrics.cpu.used.avg": "已使用",
-    "label.metrics.disk": "Disk",
-    "label.metrics.disk.allocated": "已分配",
-    "label.metrics.disk.iops.total": "IOPS",
-    "label.metrics.disk.read": "Read",
-    "label.metrics.disk.size": "大小",
-    "label.metrics.disk.storagetype": "类型",
-    "label.metrics.disk.total": "Total",
-    "label.metrics.disk.unallocated": "Unallocated",
-    "label.metrics.disk.usage": "Disk Usage",
-    "label.metrics.disk.used": "已使用",
-    "label.metrics.disk.write": "Write",
-    "label.metrics.hosts": "主机",
-    "label.metrics.memory.allocated": "Mem Allocation",
-    "label.metrics.memory.max.dev": "Deviation",
-    "label.metrics.memory.total": "Total",
-    "label.metrics.memory.usage": "Mem Usage",
-    "label.metrics.memory.used.avg": "已使用",
-    "label.metrics.name": "名称",
-    "label.metrics.network.read": "Read",
-    "label.metrics.network.usage": "Network Usage",
-    "label.metrics.network.write": "Write",
-    "label.metrics.num.cpu.cores": "Cores",
-    "label.metrics.outofbandmanagementpowerstate": "Power State",
-    "label.metrics.property": "Property",
-    "label.metrics.scope": "范围",
-    "label.metrics.state": "状态",
-    "label.metrics.storagepool": "存储池",
-    "label.metrics.vm.name": "VM Name",
-    "label.migrate.instance.to": "迁移实例至",
-    "label.migrate.instance.to.host": "将实例迁移到其他主机",
-    "label.migrate.instance.to.ps": "将实例迁移到其他主存储",
-    "label.migrate.lb.vm": "迁移 LB VM",
-    "label.migrate.router.to": "迁移路由器至",
-    "label.migrate.systemvm.to": "迁移系统 VM 至",
-    "label.migrate.to.host": "迁移到主机",
-    "label.migrate.to.storage": "迁移到存储",
-    "label.migrate.volume": "迁移卷",
-    "label.migrate.volume.to.primary.storage": "将卷迁移到其他主存储",
-    "label.migrate.volume.newDiskOffering": "Replace disk offering?",
-    "label.migrate.volume.newDiskOffering.desc": "This option allows administrators to replace the old disk offering, using one that better suits the new placement of the volume.",
-    "label.min.instances": "最小实例数",
-    "label.min.past.the.hr": "分 每小时",
-    "label.minimum": "最小值",
-    "label.minute.past.hour": "分钟时",
-    "label.minutes.past.hour": "分 (每小时)",
-    "label.mode": "模式",
-    "label.monday": "星期一",
-    "label.monthly": "每月",
-    "label.more.templates": "更多模板",
-    "label.move.down.row": "向下移动一行",
-    "label.move.to.bottom": "移至底部",
-    "label.move.to.top": "移至顶部",
-    "label.move.up.row": "向上移动一行",
-    "label.my.account": "我的帐户",
-    "label.my.network": "我的网络",
-    "label.my.templates": "我的模板",
-    "label.na": "无",
-    "label.name": "名称",
-    "label.name.lower": "名称",
-    "label.name.optional": "名称(可选)",
-    "label.nat.port.range": "NAT 端口范围",
-    "label.netScaler": "NetScaler",
-    "label.netmask": "网络掩码",
-    "label.netscaler.details": "NetScaler 详细信息",
-    "label.network": "网络",
-    "label.network.ACL": "网络 ACL",
-    "label.network.ACL.total": "网络 ACL 总数",
-    "label.network.ACLs": "网络 ACL",
-    "label.network.addVM": "将网络添加到 VM",
-    "label.network.cidr": "网络 CIDR",
-    "label.network.desc": "网络描述",
-    "label.network.details": "网络详情",
-    "label.network.device": "网络设备",
-    "label.network.device.type": "网络设备类型",
-    "label.network.domain": "网络域",
-    "label.network.domain.text": "网络域",
-    "label.network.id": "网络 ID",
-    "label.network.label.display.for.blank.value": "使用默认网关",
-    "label.network.limits": "网络限制",
-    "label.network.name": "网络名称",
-    "label.network.offering": "网络方案",
-    "label.network.offering.details": "网络方案详情",
-    "label.network.offering.display.text": "网络方案显示文本",
-    "label.network.offering.id": "网络方案 ID",
-    "label.network.offering.name": "网络方案名称",
-    "label.network.rate": "网络速率(MB/秒)",
-    "label.network.rate.megabytes": "网络速率(MB/秒)",
-    "label.network.read": "网络读取量",
-    "label.network.service.providers": "网络服务提供程序",
-    "label.network.type": "网络类型",
-    "label.network.write": "网络写入量",
-    "label.networking.and.security": "网络连接与安全",
-    "label.networks": "网络",
-    "label.new": "新建",
-    "label.new.password": "新密码",
-    "label.current.password": "Current Password",
-    "label.new.project": "新建项目",
-    "label.new.ssh.key.pair": "新SSH密钥对",
-    "label.new.vm": "新建 VM",
-    "label.next": "下一步",
-    "label.nexusVswitch": "Nexus 1000v",
-    "label.nfs": "NFS",
-    "label.nfs.server": "NFS 服务器",
-    "label.nfs.storage": "NFS 存储",
-    "label.nic.adapter.type": "NIC 适配器类型",
-    "label.nicira.controller.address": "控制器地址",
-    "label.nicira.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
-    "label.nicira.l3gatewayserviceuuid": "L3 Gateway Service UUID",
-    "label.nicira.nvp.details": "Nicira NVP 详细信息",
-    "label.nicira.transportzoneuuid": "传输资源域 UUID",
-    "label.nics": "NIC",
-    "label.no": "否",
-    "label.no.actions": "无可用操作",
-    "label.no.alerts": "无最近发出的警报",
-    "label.no.data": "无可显示的数据",
-    "label.no.errors": "无最近出现的错误",
-    "label.no.grouping": "(未分组)",
-    "label.no.isos": "无可用 ISO",
-    "label.no.items": "无可用项目",
-    "label.no.security.groups": "无可用安全组",
-    "label.no.thanks": "不,谢谢",
-    "label.none": "无",
-    "label.not.found": "未找到",
-    "label.notifications": "通知",
-    "label.num.cpu.cores": "CPU 内核数",
-    "label.number.of.clusters": "群集数量",
-    "label.number.of.cpu.sockets": "CPU 插槽数",
-    "label.number.of.hosts": "主机数量",
-    "label.number.of.pods": "提供点数量",
-    "label.number.of.system.vms": "系统 VM 数",
-    "label.number.of.virtual.routers": "虚拟路由器数",
-    "label.number.of.zones": "资源域数量",
-    "label.numretries": "重试次数",
-    "label.ocfs2": "OCFS2",
-    "label.of.month": "月",
-    "label.offer.ha": "提供高可用性",
-    "label.ok": "确定",
-    "label.openDaylight": "OpenDaylight",
-    "label.opendaylight.controller": "OpenDaylight 控制器",
-    "label.opendaylight.controllerdetail": "OpenDaylight 控制器详细信息",
-    "label.opendaylight.controllers": "OpenDaylight 控制器",
-    "label.operator": "运算符",
-    "label.optional": "可选",
-    "label.order": "排序",
-    "label.os.preference": "操作系统首选项",
-    "label.os.type": "操作系统类型",
-    "label.other": "其他",
-    "label.outofbandmanagement": "Out-of-band Management",
-    "label.outofbandmanagement.action": "操作",
-    "label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
-    "label.outofbandmanagement.address": "Address",
-    "label.outofbandmanagement.changepassword": "Change Out-of-band Management Password",
-    "label.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "label.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "label.outofbandmanagement.driver": "Driver",
-    "label.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "label.outofbandmanagement.password": "密码",
-    "label.outofbandmanagement.port": "端口",
-    "label.outofbandmanagement.reenterpassword": "Re-enter Password",
-    "label.outofbandmanagement.username": "用户名",
-    "label.override.guest.traffic": "替代来宾流量",
-    "label.override.public.traffic": "替代公共流量",
-    "label.ovm.traffic.label": "OVM 流量标签",
-    "label.ovm3.cluster": "本地集群",
-    "label.ovm3.pool": "原生池",
-    "label.ovm3.traffic.label": "OVM3 traffic label",
-    "label.ovm3.vip": "主虚拟IP",
-    "label.ovs": "OVS",
-    "label.owned.public.ips": "拥有的公用 IP 地址数",
-    "label.owner.account": "所有者帐户",
-    "label.owner.domain": "所有者域",
-    "label.palo.alto.details": "Palo Alto 详细信息",
-    "label.parent.domain": "父域",
-    "label.passive": "被动",
-    "label.password": "密码",
-    "label.password.enabled": "已启用密码",
-    "label.password.lower": "密码",
-    "label.password.reset.confirm": "密码已重置为",
-    "label.path": "路径",
-    "label.perfect.forward.secrecy": "完全正向保密",
-    "label.permission": "Permission",
-    "label.persistent": "永久",
-    "label.physical.network": "物理网络",
-    "label.physical.network.ID": "物理网络 ID",
-    "label.physical.network.name": "物理网络名称",
-    "label.ping.path": "Ping 路径",
-    "label.planner.mode": "规划器模式",
-    "label.please.complete.the.following.fields": "请完成以下内容",
-    "label.please.specify.netscaler.info": "请指定 NetScaler 信息",
-    "label.please.wait": "请稍候",
-    "label.plugin.details": "插件详细信息",
-    "label.plugins": "插件",
-    "label.pod": "提供点",
-    "label.pod.dedicated": "提供点已专用",
-    "label.pod.name": "提供点名称",
-    "label.pods": "提供点",
-    "label.polling.interval.sec": "轮询时间间隔(秒)",
-    "label.port": "端口",
-    "label.port.forwarding": "端口转发",
-    "label.port.forwarding.policies": "端口转发策略",
-    "label.port.range": "端口范围",
-    "label.portable.ip": "可移植 IP",
-    "label.portable.ip.range.details": "可移植 IP 范围详细信息",
-    "label.portable.ip.ranges": "可移植 IP 范围",
-    "label.portable.ips": "可移植 IP",
-    "label.powerstate": "Power State",
-    "label.prev": "上一页",
-    "label.previous": "上一步",
-    "label.primary.allocated": "已分配的主存储",
-    "label.primary.network": "主网络",
-    "label.primary.storage": "主存储",
-    "label.primary.storage.count": "主存储池",
-    "label.primary.storage.limits": "主存储限制(GiB)",
-    "label.primary.used": "已使用的主存储",
-    "label.private.Gateway": "专用网关",
-    "label.private.interface": "专用接口",
-    "label.private.ip": "专用 IP 地址",
-    "label.private.ip.range": "专用 IP 范围",
-    "label.private.ips": "专用 IP 地址",
-    "label.private.key": "私钥",
-    "label.private.network": "专用网络",
-    "label.private.port": "专用端口",
-    "label.private.zone": "专用资源域",
-    "label.privatekey": "PKCS#8 私钥",
-    "label.profile": "配置文件",
-    "label.project": "项目",
-    "label.project.dashboard": "项目控制板",
-    "label.project.id": "项目 ID",
-    "label.project.invite": "邀请加入项目",
-    "label.project.name": "项目名称",
-    "label.project.view": "项目视图",
-    "label.projects": "项目",
-    "label.protocol": "协议",
-    "label.protocol.number": "协议编号",
-    "label.protocol.number.short" : "#Protocol",
-    "label.provider": "提供程序",
-    "label.providers": "提供程序",
-    "label.public": "公用",
-    "label.public.interface": "公用接口",
-    "label.public.ip": "公用 IP 地址",
-    "label.public.ips": "公用 IP 地址",
-    "label.public.key": "公钥",
-    "label.public.lb": "公共负载均衡器",
-    "label.public.load.balancer.provider": "公用负载平衡器提供程序",
-    "label.public.network": "公用网络",
-    "label.public.port": "公用端口",
-    "label.public.traffic": "公共流量",
-    "label.public.traffic.vswitch.name": "公共流量虚拟交换机名称",
-    "label.public.traffic.vswitch.type": "公共流量虚拟交换机类型",
-    "label.public.zone": "公用资源域",
-    "label.purpose": "目的",
-    "label.qos.type": "QoS 类型",
-    "label.quickview": "快速查看",
-    "label.quiesce.vm": "静默 VM",
-    "label.quiet.time.sec": "安静时间(秒)",
-    "label.quota.add.credits": "Add Credits",
-    "label.quota.balance": "Balance",
-    "label.quota.configuration": "Quota Configuration",
-    "label.quota.configure": "Configure Quota",
-    "label.quota.credit": "Credit",
-    "label.quota.credits": "Credits",
-    "label.quota.date": "日期",
-    "label.quota.dates": "Update Dates",
-    "label.quota.description": "Quota Description",
-    "label.quota.email.body": "Body",
-    "label.quota.email.lastupdated": "Last Update",
-    "label.quota.email.subject": "Subject",
-    "label.quota.email.template": "Email Template",
-    "label.quota.enddate": "End Date",
-    "label.quota.endquota": "End Quota",
-    "label.quota.enforcequota": "Enforce Quota",
-    "label.quota.fullsummary": "所有帐户",
-    "label.quota.minbalance": "Min Balance",
-    "label.quota.remove": "Remove Quota",
-    "label.quota.startdate": "Start Date",
-    "label.quota.startquota": "Start Quota",
-    "label.quota.state": "状态",
-    "label.quota.statement": "Statement",
-    "label.quota.statement.balance": "Quota Balance",
-    "label.quota.statement.bydates": "Statement",
-    "label.quota.statement.quota": "Quota Usage",
-    "label.quota.statement.tariff": "Quota Tariff",
-    "label.quota.summary": "Summary",
-    "label.quota.tariff": "Tariff",
-    "label.quota.tariff.edit": "Edit Tariff",
-    "label.quota.tariff.effectivedate": "Effective Date",
-    "label.quota.tariff.value": "Tariff Value",
-    "label.quota.total": "Total",
-    "label.quota.totalusage": "Total Usage",
-    "label.quota.type.name": "Usage Type",
-    "label.quota.type.unit": "Usage Unit",
-    "label.quota.usage": "Quota Consumption",
-    "label.quota.value": "Quota Value",
-    "label.rbd": "RBD",
-    "label.rbd.id": "Cephx 用户",
-    "label.rbd.monitor": "Ceph 监视器",
-    "label.rbd.pool": "Ceph 池",
-    "label.rbd.secret": "Cephx 密钥",
-    "label.reboot": "重新启动",
-    "label.recent.errors": "最近出现的错误",
-    "label.recover.vm": "恢复 VM",
-    "label.redundant.router": "冗余路由器",
-    "label.redundant.router.capability": "冗余路由器功能",
-    "label.redundant.state": "冗余状态",
-    "label.redundant.vpc": "冗余VPC",
-    "label.refresh": "刷新",
-    "label.refresh.blades": "刷新刀片式服务器",
-    "label.region": "地理区域",
-    "label.region.details": "地理区域详情",
-    "label.regionlevelvpc": "地理区域级 VPC",
-    "label.reinstall.vm": "重新安装 VM",
-    "label.related": "相关联",
-    "label.release.account": "从帐户中释放",
-    "label.release.account.lowercase": "从帐户中释放",
-    "label.release.dedicated.cluster": "释放专用群集",
-    "label.release.dedicated.host": "释放专用主机",
-    "label.release.dedicated.pod": "释放专用提供点",
-    "label.release.dedicated.vlan.range": "释放专用 VLAN 范围",
-    "label.release.dedicated.zone": "释放专用资源域",
-    "label.remind.later": "以后提醒我",
-    "label.remove.ACL": "删除 ACL",
-    "label.remove.egress.rule": "删除出口规则",
-    "label.remove.from.load.balancer": "正在从负载平衡器中删除实例",
-    "label.remove.ingress.rule": "删除入口规则",
-    "label.remove.ip.range": "删除 IP 范围",
-    "label.remove.ldap": "删除 LDAP",
-    "label.remove.network.offering": "删除网络方案",
-    "label.remove.pf": "删除端口转发规则",
-    "label.remove.project.account": "从项目中删除帐户",
-    "label.remove.region": "删除地理区域",
-    "label.remove.rule": "删除规则",
-    "label.remove.ssh.key.pair": "删除密钥对",
-    "label.remove.static.nat.rule": "删除静态 NAT 规则",
-    "label.remove.static.route": "删除静态路由",
-    "label.remove.this.physical.network": "删除此物理网络",
-    "label.remove.tier": "删除层",
-    "label.remove.vm.from.lb": "从负载平衡器规则中删除 VM",
-    "label.remove.vm.load.balancer": "从负载平衡器中删除 VM",
-    "label.remove.vmware.datacenter": "删除 VMware 数据中心",
-    "label.remove.vpc": "删除 VPC",
-    "label.remove.vpc.offering": "删除 VPC 方案",
-    "label.removing": "正在删除",
-    "label.removing.user": "正在删除用户",
-    "label.reource.id": "资源 ID",
-    "label.replace.acl": "替换 ACL",
-    "label.replace.acl.list": "替换 ACL 列表",
-    "label.required": "必填项",
-    "label.requires.upgrade": "需要升级",
-    "label.reserved.ip.range": "预留 IP 范围",
-    "label.reserved.system.gateway": "预留的系统网关",
-    "label.reserved.system.ip": "预留的系统 IP",
-    "label.reserved.system.netmask": "预留的系统网络掩码",
-    "label.reset.VPN.connection": "重置 VPN 连接",
-    "label.reset.ssh.key.pair": "重置SSH密钥对",
-    "label.reset.ssh.key.pair.on.vm": "重置实例的SSH密钥对",
-    "label.resetVM": "重置 VM",
-    "label.resize.new.offering.id": "新方案",
-    "label.resize.new.size": "新建大小(GB)",
-    "label.resize.shrink.ok": "是否确实要缩小卷大小",
-    "label.resource": "资源",
-    "label.resource.limit.exceeded": "已超出资源限制",
-    "label.resource.limits": "资源限制",
-    "label.resource.name": "资源名称",
-    "label.resource.state": "资源状态",
-    "label.resources": "资源",
-    "label.response.timeout.in.sec": "响应超时(秒)",
-    "label.restart.network": "重新启动网络",
-    "label.restart.required": "需要重新启动",
-    "label.restart.vpc": "重新启动 VPC",
-    "label.restore": "还原",
-    "label.retry.interval": "重试时间间隔",
-    "label.review": "核对",
-    "label.revoke.project.invite": "撤销邀请",
-    "label.role": "角色",
-    "label.roles": "角色",
-    "label.roletype": "Role Type",
-    "label.root.certificate": "根证书",
-    "label.root.disk.controller": "根磁盘控制器",
-    "label.root.disk.offering": "根磁盘方案",
-    "label.root.disk.size": "Root disk size (GB)",
-    "label.router.vm.scaled.up": "已扩展路由器 VM",
-    "label.routing": "正在路由",
-    "label.routing.host": "正在路由主机",
-    "label.rule": "规则",
-    "label.rule.number.short": "#Rule",
-    "label.rule.number": "规则编号",
-    "label.rules": "规则",
-    "label.running.vms": "正在运行的 VM",
-    "label.s3.access_key": "访问密钥",
-    "label.s3.bucket": "存储桶",
-    "label.s3.connection_timeout": "连接超时",
-    "label.s3.endpoint": "端点",
-    "label.s3.max_error_retry": "最大错误重试次数",
-    "label.s3.nfs.path": "S3 NFS 路径",
-    "label.s3.nfs.server": "S3 NFS 服务器",
-    "label.s3.secret_key": "密钥",
-    "label.s3.socket_timeout": "套接字超时",
-    "label.s3.use_https": "使用 HTTPS",
-    "label.saml.enable": "批准 SAML SSO",
-    "label.saml.entity": "认证方式",
-    "label.saturday": "星期六",
-    "label.save": "保存",
-    "label.save.and.continue": "保存并继续",
-    "label.save.changes": "保存修改",
-    "label.saving.processing": "正在保存...",
-    "label.scale.up.policy": "扩展策略",
-    "label.scaledown.policy": "减缩策略",
-    "label.scaleup.policy": "扩展策略",
-    "label.scope": "范围",
-    "label.search": "搜索",
-    "label.secondary.ips": "二级 IPs",
-    "label.secondary.isolated.vlan.id": "二级隔离 VLAN ID",
-    "label.secondary.staging.store": "二级暂存存储",
-    "label.secondary.staging.store.details": "二级暂存存储详细信息",
-    "label.secondary.storage": "二级存储",
-    "label.secondary.storage.count": "二级存储池",
-    "label.secondary.storage.details": "二级存储详细信息",
-    "label.secondary.storage.limits": "二级存储限制(GiB)",
-    "label.secondary.storage.vm": "二级存储 VM",
-    "label.secondary.used": "已使用的二级存储",
-    "label.secret.key": "密钥",
-    "label.security.group": "安全组",
-    "label.security.group.name": "安全组名称",
-    "label.security.groups": "安全组",
-    "label.security.groups.enabled": "已启用安全组",
-    "label.select": "选择",
-    "label.select-view": "选择视图",
-    "label.select.a.template": "选择一个模板",
-    "label.select.a.zone": "选择一个资源域",
-    "label.select.instance": "选择实例",
-    "label.select.instance.to.attach.volume.to": "选择要将卷附加到的实例",
-    "label.select.host": "选择主机",
-    "label.select.iso.or.template": "选择 ISO 或模板",
-    "label.select.offering": "选择方案",
-    "label.select.project": "选择项目",
-    "label.select.region": "选择地理区域",
-    "label.select.template": "选择模板",
-    "label.select.tier": "选择层",
-    "label.select.vm.for.static.nat": "为静态 NAT 选择 VM",
-    "label.sent": "已发送",
-    "label.server": "服务器",
-    "label.service.capabilities": "服务功能",
-    "label.service.offering": "服务方案",
-    "label.service.offering.details": "服务方案详情",
-    "label.service.state": "服务状态",
-    "label.services": "服务",
-    "label.session.expired": "会话已过期",
-    "label.set.default.NIC": "设置默认 NIC",
-    "label.set.reservation": "Set reservation",
-    "label.set.reservation.desc": "(optional) Please specify an account to be associated with this IP range.<br/><br/>System VMs: Enable dedication of public IP range for SSVM and CPVM, account field disabled. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'",
-    "label.set.up.zone.type": "设置资源域类型",
-    "label.settings": "设置",
-    "label.setup": "设置",
-    "label.setup.network": "配置网络",
-    "label.setup.zone": "配置区域",
-    "label.shared": "已共享",
-    "label.show.advanced.settings": "显示高级设置",
-    "label.show.ingress.rule": "显示入口规则",
-    "label.shutdown.provider": "关闭提供程序",
-    "label.simplified.chinese.keyboard": "简体中文键盘",
-    "label.site.to.site.VPN": "点对点 VPN",
-    "label.size": "大小",
-    "label.skip.guide": "我以前使用过 CloudStack,跳过此指南",
-    "label.smb.domain": "SMB 域",
-    "label.smb.password": "SMB 密码",
-    "label.smb.username": "SMB 用户名",
-    "label.snapshot": "快照",
-    "label.snapshot.limits": "快照限制",
-    "label.snapshot.name": "快照名称",
-    "label.snapshot.s": "快照",
-    "label.snapshot.schedule": "设置重现快照",
-    "label.snapshots": "快照",
-    "label.sockets": "CPU 插槽",
-    "label.source.ip.address": "源 IP 地址",
-    "label.source.nat": "源 NAT",
-    "label.source.nat.supported": "支持 SourceNAT",
-    "label.source.port": "源端口",
-    "label.specify.IP.ranges": "指定 IP 范围",
-    "label.specify.vlan": "指定 VLAN",
-    "label.specify.vxlan": "指定 VXLAN",
-    "label.srx": "SRX",
-    "label.srx.details": "SRX 详细信息",
-    "label.ssh.key.pair": "SSH密钥对",
-    "label.ssh.key.pair.details": "SSH密钥对详情",
-    "label.ssh.key.pairs": "SSH密钥对",
-    "label.standard.us.keyboard": "标准(US)键盘",
-    "label.start.IP": "起始 IP",
-    "label.start.lb.vm": "启动 LB VM",
-    "label.start.port": "起始端口",
-    "label.start.reserved.system.IP": "起始预留系统 IP",
-    "label.start.vlan": "起始 VLAN",
-    "label.start.vxlan": "起始 VXLAN",
-    "label.state": "状态",
-    "label.suitability": "适应性",
-    "label.static.nat": "静态 NAT",
-    "label.static.nat.enabled": "已启用静态 NAT",
-    "label.static.nat.to": "静态 NAT 目标",
-    "label.static.nat.vm.details": "静态 NAT VM 详情",
-    "label.static.routes": "静态路由器",
-    "label.statistics": "统计数据",
-    "label.status": "状态",
-    "label.step.1": "步骤 1",
-    "label.step.1.title": "步骤 1: <strong>选择一个模板</strong>",
-    "label.step.2": "步骤 2",
-    "label.step.2.title": "步骤 2: <strong>服务方案</strong>",
-    "label.step.3": "步骤 3",
-    "label.step.3.title": "步骤 3: <strong id=\"step3_label\">选择一种磁盘方案</strong>",
-    "label.step.4": "步骤 4",
-    "label.step.4.title": "步骤 4: <strong>网络</strong>",
-    "label.step.5": "步骤 5",
-    "label.step.5.title": "步骤 5: <strong>核对</strong>",
-    "label.stickiness": "粘性",
-    "label.stickiness.method": "粘性方法",
-    "label.sticky.cookie-name": "Cookie 名称",
-    "label.sticky.domain": "域",
-    "label.sticky.expire": "过期日期",
-    "label.sticky.holdtime": "持续时间",
-    "label.sticky.indirect": "indirect",
-    "label.sticky.length": "长度",
-    "label.sticky.mode": "模式",
-    "label.sticky.name": "粘性名称",
-    "label.sticky.nocache": "nocache",
-    "label.sticky.postonly": "postonly",
-    "label.sticky.prefix": "prefix",
-    "label.sticky.request-learn": "request-learn",
-    "label.sticky.tablesize": "表大小",
-    "label.stop": "停止",
-    "label.stop.lb.vm": "停止 LB VM",
-    "label.stopped.vms": "已停止的 VM",
-    "label.storage": "存储",
-    "label.storage.pool": "存储池",
-    "label.storage.tags": "存储标签",
-    "label.storage.traffic": "存储流量",
-    "label.storage.type": "存储类型",
-    "label.subdomain.access": "子域访问",
-    "label.submit": "提交",
-    "label.submitted.by": "[提交者: <span id=\"submitted_by\"></span>]",
-    "label.succeeded": "成功",
-    "label.sunday": "星期日",
-    "label.super.cidr.for.guest.networks": "来宾网络的超级 CIDR",
-    "label.supported.services": "支持的服务",
-    "label.supported.source.NAT.type": "支持的源 NAT 类型",
-    "label.supportsstrechedl2subnet": "支持扩展二级子网",
-    "label.supportspublicaccess": "Supports Public Access",
-    "label.suspend.project": "暂停项目",
-    "label.switch.type": "交换机类型",
-    "label.system.capacity": "系统容量",
-    "label.system.offering": "系统方案",
-    "label.system.offering.for.router": "路由器的系统方案",
-    "label.system.service.offering": "系统服务方案",
-    "label.system.service.offering.details": "系统服务方案详情",
-    "label.system.vm": "系统 VM",
-    "label.system.vm.details": "系统 VM 详细信息",
-    "label.system.vm.scaled.up": "已扩展系统 VM",
-    "label.system.vm.type": "系统 VM 类型",
-    "label.system.vms": "系统 VM",
-    "label.system.wide.capacity": "整个系统的容量",
-    "label.tag.key": "标记密钥",
-    "label.tag.value": "标记值",
-    "label.tagged": "已标记",
-    "label.tags": "标签",
-    "label.target.iqn": "目标 IQN",
-    "label.task.completed": "已完成任务",
-    "label.template": "模板",
-    "label.template.limits": "模板限制",
-    "label.tftp.root.directory": "Tftp 根目录",
-    "label.theme.default": "默认主题",
-    "label.theme.grey": "自定义 - 灰色",
-    "label.theme.lightblue": "自定义 - 淡蓝色",
-    "label.threshold": "阈值",
-    "label.thursday": "星期四",
-    "label.tier": "层",
-    "label.tier.details": "层详细信息",
-    "label.time": "时间",
-    "label.time.colon": "时间:",
-    "label.time.zone": "时区",
-    "label.timeout": "超时",
-    "label.timeout.in.second ": " 超时(秒)",
-    "label.timezone": "时区",
-    "label.timezone.colon": "时区",
-    "label.token": "令牌",
-    "label.total.CPU": "CPU 总量",
-    "label.total.cpu": "CPU 总量",
-    "label.total.hosts": "总主机数",
-    "label.total.memory": "内存总量",
-    "label.total.of.ip": "IP地址总数",
-    "label.total.of.vm": "总 VM 数",
-    "label.total.storage": "存储总量",
-    "label.total.virtual.routers": "虚拟路由器总数",
-    "label.total.virtual.routers.upgrade": "需要升级的虚拟路由器总数",
-    "label.total.vms": "总 VM 数",
-    "label.traffic.label": "流量标签",
-    "label.traffic.type": "流量类型",
-    "label.traffic.types": "流量类型",
-    "label.tuesday": "星期二",
-    "label.type": "类型",
-    "label.type.id": "类型 ID",
-    "label.type.lower": "类型",
-    "label.ucs": "UCS",
-    "label.uk.keyboard": "美式键盘",
-    "label.unavailable": "不可用",
-    "label.unhealthy.threshold": "不正常阈值",
-    "label.unlimited": "无限制",
-    "label.untagged": "已取消标记",
-    "label.update.project.resources": "更新项目资源",
-    "label.update.ssl": " SSL 证书",
-    "label.update.ssl.cert": " SSL 证书",
-    "label.updating": "正在更新",
-    "label.upgrade.required": "需要升级",
-    "label.upgrade.router.newer.template": "升级路由器以使用更新的模板",
-    "label.upload": "上载",
-    "label.upload.from.local": "通过本地上传",
-    "label.upload.template.from.local": "通过本地上传模板",
-    "label.upload.volume": "上载卷",
-    "label.upload.volume.from.local": "通过本地上传卷",
-    "label.upload.volume.from.url": "通过URL上传卷",
-    "label.url": "URL",
-    "label.usage.interface": "使用界面",
-    "label.usage.sanity.result": "使用健全性检查结果",
-    "label.usage.server": "使用服务器",
-    "label.usage.type": "Usage Type",
-    "label.usage.unit": "Unit",
-    "label.use.vm.ip": "使用 VM IP:",
-    "label.use.vm.ips": "使用 VM IP",
-    "label.used": "已使用",
-    "label.user": "用户",
-    "label.user.data": "用户数据",
-    "label.user.details": "用户详情",
-    "label.user.vm": "用户 VM",
-    "label.username": "用户名",
-    "label.username.lower": "用户名",
-    "label.users": "用户",
-    "label.vSwitch.type": "vSwitch 类型",
-    "label.value": "值",
-    "label.vcdcname": "vCenter DC 名称",
-    "label.vcenter": "vCenter",
-    "label.vcenter.cluster": "vCenter 群集",
-    "label.vcenter.datacenter": "vCenter 数据中心",
-    "label.vcenter.datastore": "vCenter 数据存储",
-    "label.vcenter.host": "vCenter 主机",
-    "label.vcenter.password": "vCenter 密码",
-    "label.vcenter.username": "vCenter 用户名",
-    "label.vcipaddress": "vCenter IP 地址",
-    "label.version": "版本",
-    "label.vgpu": "VGPU",
-    "label.vgpu.max.resolution": "最大分辨率",
-    "label.vgpu.max.vgpu.per.gpu": "每个 GPU 的 vGPU 数",
-    "label.vgpu.remaining.capacity": "剩余容量",
-    "label.vgpu.type": "vGPU 类型",
-    "label.vgpu.video.ram": "视频 RAM",
-    "label.view": "查看",
-    "label.view.all": "查看全部",
-    "label.view.console": "查看控制台",
-    "label.view.more": "查看更多",
-    "label.view.secondary.ips": "查看二级 IP",
-    "label.viewing": "查看",
-    "label.virtual.appliance": "虚拟设备",
-    "label.virtual.appliance.details": "虚拟设备详细信息",
-    "label.virtual.appliances": "虚拟设备",
-    "label.virtual.machine": "虚拟机",
-    "label.virtual.machines": "虚拟机",
-    "label.virtual.network": "虚拟网络",
-    "label.virtual.networking": "虚拟网络连接",
-    "label.virtual.router": "虚拟路由器",
-    "label.virtual.routers": "虚拟路由器",
-    "label.virtual.routers.group.account": "虚拟路由器(按帐户分组)",
-    "label.virtual.routers.group.cluster": "虚拟路由器(按群集分组)",
-    "label.virtual.routers.group.pod": "虚拟路由器(按提供点分组)",
-    "label.virtual.routers.group.zone": "虚拟路由器(按资源域分组)",
-    "label.vlan": "VLAN/VNI",
-    "label.vlan.id": "VLAN/VNI ID",
-    "label.vlan.only": "VLAN",
-    "label.vlan.range": "VLAN/VNI 范围",
-    "label.vlan.range.details": "VLAN 范围详细信息",
-    "label.vlan.ranges": "VLAN 范围",
-    "label.vlan.vni.range": "VLAN/VNI 范围",
-    "label.vlan.vni.ranges": "VLAN/VNI 范围",
-    "label.vm.add": "添加实例",
-    "label.vm.destroy": "销毁",
-    "label.vm.display.name": "VM 显示名称",
-    "label.vm.id": "VM ID",
-    "label.vm.ip": "VM IP 地址",
-    "label.vm.name": "VM 名称",
-    "label.vm.password": "VM 的密码",
-    "label.vm.reboot": "重新启动",
-    "label.vm.start": "启动",
-    "label.vm.state": "VM 状态",
-    "label.vm.stop": "停止",
-    "label.vmfs": "VMFS",
-    "label.vms": "VM",
-    "label.vmsnapshot": "VM 快照",
-    "label.vmsnapshot.current": "最新版本",
-    "label.vmsnapshot.memory": "快照内存",
-    "label.vmsnapshot.parentname": "父名称",
-    "label.vmsnapshot.type": "类型",
-    "label.vmware.datacenter.id": "VMware 数据中心 ID",
-    "label.vmware.datacenter.name": "VMware 数据中心名称",
-    "label.vmware.datacenter.vcenter": "VMware 数据中心 vCenter",
-    "label.vmware.traffic.label": "VMware 流量标签",
-    "label.vnet": "VLAN/VNI",
-    "label.vnet.id": "VLAN/VNI ID",
-    "label.vnmc": "VNMC",
-    "label.vnmc.devices": "VNMC 设备",
-    "label.volatile": "可变",
-    "label.volgroup": "卷组",
-    "label.volume": "卷",
-    "label.volume.details": "卷详细信息",
-    "label.volume.limits": "卷限制",
-    "label.volume.migrated": "卷已迁移",
-    "label.volume.name": "卷名称",
-    "label.volumes": "卷",
-    "label.vpc": "VPC",
-    "label.vpc.distributedvpcrouter": "分布式 VPC 路由器",
-    "label.vpc.id": "VPC ID",
-    "label.vpc.offering": "VPC 方案",
-    "label.vpc.offering.details": "VPC 方案详细信息",
-    "label.vpc.router.details": "VPC 路由器详细信息",
-    "label.vpc.supportsregionlevelvpc": "支持地理区域级 VPC",
-    "label.vpc.virtual.router": "VPC 虚拟路由器",
-    "label.vpn": "VPN",
-    "label.vpn.customer.gateway": "VPN 客户网关",
-    "label.vpn.force.encapsulation": "Force UDP Encapsulation of ESP Packets",
-    "label.vsmctrlvlanid": "控制 VLAN ID",
-    "label.vsmpktvlanid": "数据包 VLAN ID",
-    "label.vsmstoragevlanid": "存储 VLAN ID",
-    "label.vsphere.managed": "由 vSphere 管理",
-    "label.vswitch.name": "vSwitch 名称",
-    "label.vxlan": "VXLAN",
-    "label.vxlan.id": "VXLAN ID",
-    "label.vxlan.range": "VXLAN 范围",
-    "label.waiting": "正在等待",
-    "label.warn": "警告",
-    "label.warn.upper": "警告",
-    "label.warning": "警告",
-    "label.wednesday": "星期三",
-    "label.weekly": "每周",
-    "label.welcome": "欢迎",
-    "label.welcome.cloud.console": "欢迎使用管理控制台",
-    "label.what.is.cloudstack": "什么是 CloudStack&#8482?",
-    "label.xenserver.tools.version.61.plus": "原始 XS 版本为 6.1+",
-    "label.xenserver.traffic.label": "XenServer 流量标签",
-    "label.yes": "是",
-    "label.zone": "资源域",
-    "label.zone.dedicated": "资源域已专用",
-    "label.zone.details": "资源域详细信息",
-    "label.zone.id": "资源域 ID",
-    "label.zone.lower": "资源域",
-    "label.zone.name": "区域名称",
-    "label.zone.step.1.title": "步骤 1: <strong>选择一个网络</strong>",
-    "label.zone.step.2.title": "步骤 2: <strong>添加一个资源域</strong>",
-    "label.zone.step.3.title": "步骤 3: <strong>添加一个提供点</strong>",
-    "label.zone.step.4.title": "步骤 4: <strong>添加一个 IP 范围</strong>",
-    "label.zone.type": "资源域类型",
-    "label.zone.wide": "整个资源域",
-    "label.zoneWizard.trafficType.guest": "来宾: 最终用户虚拟机之间的流量",
-    "label.zoneWizard.trafficType.management": "管理: CloudStack 的内部资源(包括与管理服务器通信的任何组件,例如主机和 CloudStack 系统 VM)之间的流量",
-    "label.zoneWizard.trafficType.public": "公用: 云中 Internet 与虚拟机之间的流量。",
-    "label.zoneWizard.trafficType.storage": "存储: 主存储服务器与二级存储服务器(例如 VM 模板与快照)之间的流量",
-    "label.zones": "资源域",
-    "managed.state": "托管状态",
-    "message.XSTools61plus.update.failed": "无法更新“原始 XS 版本为 6.1+”字段。错误:",
-    "message.Zone.creation.complete": "已完成创建资源域",
-    "message.acquire.ip.nic": "请确认您确实要获取此 NIC 的新二级 IP。<br/>注意: 您需要在虚拟机内部手动配置新获取的二级 IP。",
-    "message.acquire.new.ip": "请确认您确实要为此网络获取一个新 IP。",
-    "message.acquire.new.ip.vpc": "请确认您确实要为此 VPC 获取一个新 IP。",
-    "message.acquire.public.ip": "请选择一个要从中获取新 IP 的资源域。",
-    "message.action.cancel.maintenance": "已成功取消维护您的主机。此过程可能需要长达几分钟时间。",
-    "message.action.cancel.maintenance.mode": "请确认您确实要取消此维护模式。",
-    "message.action.change.service.warning.for.instance": "必须先禁用您的实例,然后再尝试更改其当前的服务方案。",
-    "message.action.change.service.warning.for.router": "必须先停止您的路由器,然后再尝试更改其当前的服务方案。",
-    "message.action.delete.ISO": "请确认您确实要删除此 ISO。",
-    "message.action.delete.ISO.for.all.zones": "此 ISO 由所有资源域使用。请确认您确实要将其从所有资源域中删除。",
-    "message.action.delete.cluster": "请确认您确实要删除此群集。",
-    "message.action.delete.disk.offering": "请确认您确实要删除此磁盘方案。",
-    "message.action.delete.domain": "请确认您确实要删除此域。",
-    "message.action.delete.external.firewall": "请确认您确实要删除此外部防火墙。警告: 如果您计划重新添加同一个外部防火墙,则必须在设备上重置使用数据。",
-    "message.action.delete.external.load.balancer": "请确认您确实要删除此外部负载平衡器。警告: 如果您计划重新添加同一个外部负载平衡器,则必须在设备上重置使用数据。",
-    "message.action.delete.ingress.rule": "请确认您确实要删除此入口规则。",
-    "message.action.delete.network": "请确认您确实要删除此网络。",
-    "message.action.delete.nexusVswitch": "请确认您确实要删除此 Nexus 1000v",
-    "message.action.delete.nic": "请确认您确实要移除此 NIC,此操作还将从 VM 中移除关联的网络。",
-    "message.action.delete.physical.network": "请确认您确实要删除此物理网络",
-    "message.action.delete.pod": "请确认您确实要删除此提供点。",
-    "message.action.delete.primary.storage": "请确认您确实要删除此主存储。",
-    "message.action.delete.secondary.storage": "请确认您确实要删除此二级存储。",
-    "message.action.delete.security.group": "请确认您确实要删除此安全组。",
-    "message.action.delete.service.offering": "请确认您确实要删除此服务方案。",
-    "message.action.delete.snapshot": "请确认您确实要删除此快照。",
-    "message.action.delete.system.service.offering": "请确认您确实要删除此系统服务方案。",
-    "message.action.delete.template": "请确认您确实要删除此模板。",
-    "message.action.delete.template.for.all.zones": "此模板由所有资源域使用。请确认您确实要将其从所有资源域中删除。",
-    "message.action.delete.volume": "请确认您确实要删除此卷。",
-    "message.action.delete.zone": "请确认您确实要删除此资源域。",
-    "message.action.destroy.instance": "请确认您确实要销毁此实例。",
-    "message.action.destroy.systemvm": "请确认您确实要销毁此系统 VM。",
-    "message.action.destroy.volume":"你确定要销毁这个卷吗?",
-    "message.action.disable.cluster": "请确认您确实要禁用此群集。",
-    "message.action.disable.nexusVswitch": "请确认您确实要禁用此 Nexus 1000v",
-    "message.action.disable.physical.network": "请确认您确实要禁用此物理网络。",
-    "message.action.disable.pod": "请确认您确实要禁用此提供点。",
-    "message.action.disable.static.NAT": "请确认您确实要禁用静态 NAT。",
-    "message.action.disable.zone": "请确认您确实要禁用此资源域。",
-    "message.action.download.iso": "请确认您确实要下载此 ISO。",
-    "message.action.download.template": "请确认您确实要下载此模板。",
-    "message.action.downloading.template": "正在下载模板。",
-    "message.action.enable.cluster": "请确认您确实要启用此群集。",
-    "message.action.enable.maintenance": "已成功准备好维护您的主机。此过程可能需要长达几分钟或更长时间,具体取决于当前此主机上的 VM 数量。",
-    "message.action.enable.nexusVswitch": "请确认您确实要启用此 Nexus 1000v",
-    "message.action.enable.physical.network": "请确认您确实要启用此物理网络。",
-    "message.action.enable.pod": "请确认您确实要启用此提供点。",
-    "message.action.enable.zone": "请确认您确实要启用此资源域。",
-    "message.action.expunge.instance": "请确认您确实要删除此实例。",
-    "message.action.force.reconnect": "已成功强制重新连接您的主机。此过程可能需要长达几分钟时间。",
-    "message.action.host.enable.maintenance.mode": "启用维护模式会导致将此主机上正在运行的所有实例实时迁移到任何可用的主机。",
-    "message.action.instance.reset.password": "请确认您确实要更改此虚拟机的 ROOT 用户密码。",
-    "message.action.manage.cluster": "请确认您确实要托管此群集。",
-    "message.action.primarystorage.enable.maintenance.mode": "警告: 将主存储置于维护模式将导致使用主存储中的卷的所有 VM 停止运行。是否要继续?",
-    "message.action.reboot.instance": "请确认您确实要重新启动此实例。",
-    "message.action.reboot.router": "此虚拟路由器提供的所有服务都将中断。请确认您确实要重新启动此路由器。",
-    "message.action.reboot.systemvm": "请确认您确实要重新启动此系统 VM。",
-    "message.action.recover.volume":"你确定要恢复这个卷吗?",
-    "message.action.release.ip": "请确认您确实要释放此 IP。",
-    "message.action.remove.host": "请确认您确实要删除此主机。",
-    "message.action.reset.password.off": "您的实例当前不支持此功能。",
-    "message.action.reset.password.warning": "必须先停止您的实例,然后再尝试更改其当前的密码。",
-    "message.action.restore.instance": "请确认您确实要还原此实例。",
-    "message.action.revert.snapshot": "请确认您确实要将拥有的卷还原为此快照。",
-    "message.action.start.instance": "请确认您确实要启动此实例。",
-    "message.action.start.router": "请确认您确实要启动此路由器。",
-    "message.action.start.systemvm": "请确认您确实要启动此系统 VM。",
-    "message.action.stop.instance": "请确认您确实要停止此实例。",
-    "message.action.stop.router": "此虚拟路由器提供的所有服务都将中断。请确认您确实要停止此路由器。",
-    "message.action.stop.systemvm": "请确认您确实要停止此系统 VM。",
-    "message.action.take.snapshot": "请确认您确实要创建此卷的快照。",
-    "message.action.snapshot.fromsnapshot":"请确认您要对此虚拟机快照制作快照。",
-    "message.action.unmanage.cluster": "请确认您确实要取消托管此群集。",
-    "message.action.vmsnapshot.create": "Please confirm that you want to take a snapshot of this instance. <br>Please notice that the instance will be paused during the snapshoting, and resumed after snapshotting, if it runs on KVM.",
-    "message.action.vmsnapshot.delete": "请确认您确实要删除此 VM 快照。",
-    "message.action.vmsnapshot.revert": "还原 VM 快照",
-    "message.activate.project": "是否确实要激活此项目?",
-    "message.add.VPN.gateway": "请确认您确实要添加 VPN 网关",
-    "message.add.cluster": "向资源域 <b><span id=\"zone_name\"></span></b>、提供点 <b><span id=\"pod_name\"></span></b> 中添加一个虚拟机管理程序托管的群集",
-    "message.add.cluster.zone": "向资源域 <b><span id=\"zone_name\"></span></b> 中添加一个虚拟机管理程序托管的群集",
-    "message.add.disk.offering": "请指定以下参数以添加一个新的磁盘方案",
-    "message.add.domain": "请指定要在此域下创建的子域",
-    "message.add.firewall": "向资源域中添加一个防火墙",
-    "message.add.guest.network": "请确认您确实要添加一个来宾网络",
-    "message.add.host": "请指定以下参数以添加一台新主机",
-    "message.add.ip.range": "向资源域中的公用网络添加一个 IP 范围",
-    "message.add.ip.range.direct.network": "向资源域 <b><span id=\"zone_name\"></span></b> 中的直接网络 <b><span id=\"directnetwork_name\"></span></b> 添加一个 IP 范围",
-    "message.add.ip.range.to.pod": "<p>向提供点添加一个 IP 范围: <b><span id=\"pod_name_label\"></span></b></p>",
-    "message.add.load.balancer": "向资源域中添加一个负载平衡器",
-    "message.add.load.balancer.under.ip": "已在以下 IP 下添加负载平衡器规则:",
-    "message.add.network": "为资源域 <b><span id=\"zone_name\"></span></b> 添加一个新网络",
-    "message.add.new.gateway.to.vpc": "请指定将新网关添加到此 VPC 所需的信息。",
-    "message.add.pod": "为资源域 <b><span id=\"add_pod_zone_name\"></span></b> 添加一个新提供点",
-    "message.add.pod.during.zone.creation": "每个资源域中必须包含一个或多个提供点,现在我们将添加第一个提供点。提供点中包含主机和主存储服务器,您将在随后的某个步骤中添加这些主机和服务器。首先,请为 CloudStack 的内部管理流量配置一个预留 IP 地址范围。预留的 IP 范围对云中的每个资源域来说必须唯一。",
-    "message.add.primary": "请指定以下参数以添加一个新主存储",
-    "message.add.primary.storage": "为资源域 <b><span id=\"add_pod_zone_name\"></span></b>、提供点 <b><span id=\"pod_name\"></span></b> 添加一个新主存储",
-    "message.add.region": "请指定添加新地理区域所需的信息。",
-    "message.add.secondary.storage": "为资源域 <b><span id=\"zone_name\"></span></b> 添加一个新存储",
-    "message.add.service.offering": "请填写以下数据以添加一个新计算方案。",
-    "message.add.system.service.offering": "请填写以下数据以添加一个新的系统服务方案。",
-    "message.add.template": "请输入以下数据以创建新模板",
-    "message.add.volume": "请填写以下数据以添加一个新卷。",
-    "message.added.vpc.offering": "添加 VPC 方案",
-    "message.adding.Netscaler.device": "正在添加 NetScaler 设备",
-    "message.adding.Netscaler.provider": "正在添加 NetScaler 提供程序",
-    "message.adding.host": "正在添加主机",
-    "message.additional.networks.desc": "请选择虚拟机要连接到的其他网络。",
-    "message.admin.guide.read": "对于基于 VMware 的 VM,请先阅读管理指南中的动态扩展部分,然后再进行扩展。是否要继续?,",
-    "message.advanced.mode.desc": "如果要启用 VLAN 支持,请选择此网络模式。此网络模式在允许管理员提供防火墙、VPN 或负载平衡器支持等自定义网络方案以及启用直接网络连接与虚拟网络连接等方面提供了最大的灵活性。",
-    "message.advanced.security.group": "如果要使用安全组提供来宾 VM 隔离,请选择此模式。",
-    "message.advanced.virtual": "如果要使用整个资源域的 VLAN 提供来宾 VM 隔离,请选择此模式。",
-    "message.after.enable.s3": "已配置 S3 支持的二级存储。注意: 退出此页面后,您将无法再次重新配置 S3。",
-    "message.after.enable.swift": "已配置 SWIFT。注意: 退出此页面后,您将无法再次重新配置 SWIFT。",
-    "message.alert.state.detected": "检测到警报状态",
-    "message.allow.vpn.access": "请输入要允许进行 VPN 访问的用户的用户名和密码。",
-    "message.apply.snapshot.policy": "您已成功更新当前的快照策略。",
-    "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
-    "message.attach.iso.confirm": "请确认您确实要将此 ISO 附加到此虚拟实例。",
-    "message.attach.volume": "请填写以下数据以附加一个新卷。如果要将磁盘卷附加到基于 Windows 的虚拟机,需要重新启动此实例才能显示已连接的磁盘。",
-    "message.basic.mode.desc": "如果您<b>*<u>不</u>*</b>希望启用任何 VLAN 支持,请选择此网络模式。将直接从此网络中为在此网络模式下创建的所有虚拟机实例分配一个 IP,并使用安全组提供安全性和隔离。",
-    "message.change.ipaddress": "Please confirm that you would like to change the IP address for this NIC on VM.",
-    "message.change.offering.confirm": "请确认您确实要更改此虚拟实例的服务方案。",
-    "message.change.password": "请更改您的密码。",
-    "message.cluster.dedicated": "群集已专用",
-    "message.cluster.dedication.released": "已释放专用群集",
-    "message.configure.all.traffic.types": "您有多个物理网络,请单击“编辑”按钮为每种流量类型配置标签。",
-    "message.configure.firewall.rules.allow.traffic": "配置允许通信的规则",
-    "message.configure.firewall.rules.block.traffic": "配置拒绝通信的规则",
-    "message.configure.ldap": "请确认您确实要配置 LDAP。",
-    "message.configuring.guest.traffic": "正在配置来宾流量",
-    "message.configuring.physical.networks": "正在配置物理网络",
-    "message.configuring.public.traffic": "正在配置公共流量",
-    "message.configuring.storage.traffic": "正在配置存储流量",
-    "message.confirm.action.force.reconnect": "请确认您确实要强制重新连接此主机。",
-    "message.confirm.add.vnmc.provider": "请确认您确实要添加 VNMC 提供程序。",
-    "message.confirm.archive.alert": "请确认您确实要存档此警报。",
-    "message.confirm.archive.event": "请确认您确实要存档此事件。",
-    "message.confirm.archive.selected.alerts": "请确认您确实要存档选定警报",
-    "message.confirm.archive.selected.events": "请确认您确实要存档选定事件",
-    "message.confirm.attach.disk": "是否确实要附加磁盘?",
-    "message.confirm.create.volume": "是否确实要创建卷?",
-    "message.confirm.current.guest.CIDR.unchanged": "是否要使当前来宾网络 CIDR 保持不变?",
-    "message.confirm.dedicate.cluster.domain.account": "是否确实要将此群集专用于域/帐户?",
-    "message.confirm.dedicate.host.domain.account": "是否确实要将此主机专用于域/帐户?",
-    "message.confirm.dedicate.pod.domain.account": "是否确实要将此提供点专用于域/帐户?",
-    "message.confirm.dedicate.zone": "是否要将此资源域专用于域/帐户?",
-    "message.confirm.delete.BigSwitchBcf": "请确认您确实要删除此BigSwitch BCF 控制器",
-    "message.confirm.delete.BrocadeVcs": "请确认您确实要删除 Brocade Vcs 交换机",
-    "message.confirm.delete.F5": "请确认您确实要删除 F5",
-    "message.confirm.delete.NetScaler": "请确认您确实要删除 NetScaler",
-    "message.confirm.delete.PA": "请确认您确实要删除 Palo Alto",
-    "message.confirm.delete.SRX": "请确认您确实要删除 SRX",
-    "message.confirm.delete.acl.list": "是否确实要删除此 ACL 列表?",
-    "message.confirm.delete.alert": "是否确实要删除此警报?",
-    "message.confirm.delete.baremetal.rack.configuration": "请确认您确实要删除 Baremetal Rack 配置",
-    "message.confirm.delete.ciscoASA1000v": "请确认您确实要删除 CiscoASA1000v",
-    "message.confirm.delete.ciscovnmc.resource": "请确认您确实要删除 Cisco VNMC 资源",
-    "message.confirm.delete.internal.lb": "请确认您确实要删除内部负载平衡器",
-    "message.confirm.delete.secondary.staging.store": "请确认您确实要删除二级暂存存储。",
-    "message.confirm.delete.ucs.manager": "请确认您确实要删除 UCS Manager",
-    "message.confirm.destroy.router": "请确认您确实要销毁此路由器",
-    "message.confirm.disable.host": "请确认您确实要禁用主机",
-    "message.confirm.disable.network.offering": "是否确实要禁用此网络方案?",
-    "message.confirm.disable.provider": "请确认您确实要禁用此提供程序",
-    "message.confirm.disable.vnmc.provider": "请确认您确实要禁用 VNMC 提供程序。",
-    "message.confirm.disable.vpc.offering": "是否确实要禁用此 VPC 方案?",
-    "message.confirm.enable.host": "请确认您确实要启用主机",
-    "message.confirm.enable.network.offering": "是否确实要启用此网络方案?",
-    "message.confirm.enable.provider": "请确认您确实要启用此提供程序",
-    "message.confirm.enable.vnmc.provider": "请确认您确实要启用 VNMC 提供程序。",
-    "message.confirm.enable.vpc.offering": "是否确实要启用此 VPC 方案?",
-    "message.confirm.force.update": "Do you want to make a force update?",
-    "message.confirm.join.project": "请确认您确实要加入此项目。",
-    "message.confirm.migrate.volume": "是否要迁移此卷?",
-    "message.confirm.refresh.blades": "请确认您确实要刷新刀片式服务器。",
-    "message.confirm.release.dedicate.vlan.range": "请确认您确实要释放专用 VLAN 范围",
-    "message.confirm.release.dedicated.cluster": "是否要释放此专用群集?",
-    "message.confirm.release.dedicated.host": "是否要释放此专用主机?",
-    "message.confirm.release.dedicated.pod": "是否要释放此专用提供点?",
-    "message.confirm.release.dedicated.zone": "是否要释放此专用资源域?",
-    "message.confirm.remove.IP.range": "请确认您确实要删除此 IP 范围。",
-    "message.confirm.remove.event": "是否确实要删除此事件?",
-    "message.confirm.remove.load.balancer": "请确认您确实要从负载平衡器中删除 VM",
-    "message.confirm.remove.network.offering": "是否确实要删除此网络方案?",
-    "message.confirm.remove.selected.alerts": "请确认您确实要删除选定警报",
-    "message.confirm.remove.selected.events": "请确认您确实要删除选定事件",
-    "message.confirm.remove.vmware.datacenter": "请确认您确实要删除 VMware 数据中心",
-    "message.confirm.remove.vpc.offering": "是否确实要删除此 VPC 方案?",
-    "message.confirm.replace.acl.new.one": "是否要将此 ACL 替换为新 ACL?",
-    "message.confirm.scale.up.router.vm": "是否确实要扩展路由器 VM?",
-    "message.confirm.scale.up.system.vm": "是否确实要扩展系统 VM?",
-    "message.confirm.shutdown.provider": "请确认您确实要关闭此提供程序",
-    "message.confirm.start.lb.vm": "请确认您确实要启动 LB VM",
-    "message.confirm.stop.lb.vm": "请确认您确实要停止 LB VM",
-    "message.confirm.upgrade.router.newer.template": "请确认您确实要升级路由器以使用更新的模板",
-    "message.confirm.upgrade.routers.account.newtemplate": "请确认您确实要升级此帐户中的所有路由器以使用更新的模板",
-    "message.confirm.upgrade.routers.cluster.newtemplate": "请确认您确实要升级此群集中的所有路由器以使用更新的模板",
-    "message.confirm.upgrade.routers.newtemplate": "请确认您确实要升级此资源域中的所有路由器以使用更新的模板",
-    "message.confirm.upgrade.routers.pod.newtemplate": "请确认您确实要升级此提供点中的所有路由器以使用更新的模板",
-    "message.copy.iso.confirm": "请确认您确实要将 ISO 复制到",
-    "message.copy.template": "将模板 <b id=\"copy_template_name_text\">XXX</b> 从资源域 <b id=\"copy_template_source_zone_text\"></b> 复制到",
-    "message.copy.template.confirm": "是否确实要复制模板?",
-    "message.create.template": "是否确实要创建模板?",
-    "message.create.template.vm": "基于模板 <b id=\"p_name\"></b> 创建 VM",
-    "message.create.template.volume": "请先指定以下信息,然后再创建磁盘卷 <b><span id=\"volume_name\"></span></b> 的模板。创建模板可能需要几分钟到更长的时间,具体取决于磁盘卷的大小。",
-    "message.creating.cluster": "正在创建群集",
-    "message.creating.guest.network": "正在创建来宾网络",
-    "message.creating.physical.networks": "正在创建物理网络",
-    "message.creating.pod": "正在创建提供点",
-    "message.creating.primary.storage": "正在创建主存储",
-    "message.creating.secondary.storage": "正在创建二级存储",
-    "message.creating.systemVM": "正在创建系统 VM (此操作可能需要一些时间)",
-    "message.creating.zone": "正在创建资源域",
-    "message.decline.invitation": "是否确实要拒绝此项目邀请?",
-    "message.dedicate.zone": "正在将资源域专用",
-    "message.dedicated.zone.released": "已释放专用资源域",
-    "message.delete.VPN.connection": "请确认您确实要删除 VPN 连接",
-    "message.delete.VPN.customer.gateway": "请确认您确实要删除此 VPN 客户网关",
-    "message.delete.VPN.gateway": "请确认您确实要删除此 VPN 网关",
-    "message.delete.account": "请确认您确实要删除此帐户。",
-    "message.delete.affinity.group": "请确认您确实要删除此关联性组。",
-    "message.delete.gateway": "请确认您确实要删除此网关",
-    "message.delete.project": "是否确实要删除此项目?",
-    "message.delete.user": "请确认您确实要删除此用户。",
-    "message.desc.add.new.lb.sticky.rule": "添加新负载均衡粘滞规则",
-    "message.desc.advanced.zone": "适用于更加复杂的网络拓扑。此网络模式在定义来宾网络并提供防火墙、VPN 或负载平衡器支持等自定义网络方案方面提供了最大的灵活性。",
-    "message.desc.basic.zone": "提供一个网络,将直接从此网络中为每个 VM 实例分配一个 IP。可以通过安全组等第 3 层方式提供来宾隔离(IP 地址源过滤)。",
-    "message.desc.cluster": "每个提供点中必须包含一个或多个群集,现在我们将添加第一个群集。群集提供了一种编组主机的方法。群集中的所有主机都具有相同的硬件,运行相同的虚拟机管理程序,位于相同的子网中,并访问相同的共享存储。每个群集由一个或多个主机以及一个或多个主存储服务器组成。",
-    "message.desc.create.ssh.key.pair": "请填写以下内容以创建或生成一个ssh密钥对.<br><br>(1) 如果公钥已配置, cloudstack 将注册此公钥. 您可以通过您的私钥来访问.<br><br>(2)如果公钥未配置,cloudstack将创建新的密钥对,请复制并保存私钥,cloudstack将不会替您保存<br>",
-    "message.desc.created.ssh.key.pair": "已生成的SSH密钥对",
-    "message.desc.host": "每个群集中必须至少包含一个主机以供来宾 VM 在上面运行,现在我们将添加第一个主机。要使主机在 CloudStack 中运行,必须在此主机上安装虚拟机管理程序软件,为其分配一个 IP 地址,并确保将其连接到 CloudStack 管理服务器。<br/><br/>请提供主机的 DNS 或 IP 地址、用户名(通常为 root)和密码,以及用于对主机进行分类的任何标签。",
-    "message.desc.primary.storage": "每个群集中必须包含一个或多个主存储服务器,现在我们将添加第一个主存储服务器。主存储中包含在群集中的主机上运行的所有 VM 的磁盘卷。请使用底层虚拟机管理程序支持的符合标准的协议。",
-    "message.desc.reset.ssh.key.pair": "请指定您想添加到这个VM中的SSH密钥对.请注意,如果启用了密码管理,超级用户口令将会被重置。",
-    "message.desc.secondary.storage": "每个资源域中必须至少包含一个 NFS 或二级存储服务器,现在我们将添加第一个 NFS 或二级存储服务器。二级存储用于存储 VM 模板、ISO 映像和 VM 磁盘卷快照。此服务器必须对资源域中的所有服务器可用。<br/><br/>请提供 IP 地址和导出路径。",
-    "message.desc.zone": "资源域是 CloudStack 中最大的组织单位,一个资源域通常与一个数据中心相对应。资源域可提供物理隔离和冗余。一个资源域由一个或多个提供点以及由资源域中的所有提供点共享的一个二级存储服务器组成,其中每个提供点中包含多个主机和主存储服务器。",
-    "message.detach.disk": "是否确实要取消附加此磁盘?",
-    "message.detach.iso.confirm": "请确认您确实要从此虚拟机中取消附加此 ISO。",
-    "message.disable.account": "请确认您确实要禁用此帐户。禁用后,此帐户的所有用户将不再有权访问各自的云资源。所有正在运行的虚拟机将立即关闭。",
-    "message.disable.snapshot.policy": "您已成功禁用当前的快照策略。",
-    "message.disable.user": "请确认您确实要禁用此用户。",
-    "message.disable.vpn": "是否确实要禁用 VPN?",
-    "message.disable.vpn.access": "请确认您确实要禁用远程访问 VPN。",
-    "message.disabling.network.offering": "正在禁用网络方案",
-    "message.disabling.vpc.offering": "正在禁用 VPC 方案",
-    "message.disallowed.characters": "禁用字符: <,>",
-    "message.download.ISO": "请单击 <a href=\"#\">00000</a> 下载 ISO",
-    "message.download.template": "请单击 <a href=\"#\">00000</a> 下载模板",
-    "message.download.volume": "请单击 <a href=\"#\">00000</a> 下载卷",
-    "message.download.volume.confirm": "请确认您确实要下载此卷",
-    "message.edit.account": "编辑(“-1”表示对要创建的资源数量没有任何限制)",
-    "message.edit.confirm": "在点击“保存”前请先确认您所做的更改。",
-    "message.edit.limits": "请指定对以下资源的限制。“-1”表示不限制要创建的资源数。",
-    "message.edit.traffic.type": "请指定您希望与此流量类型关联的流量标签。",
-    "message.enable.account": "请确认您确实要启用此帐户。",
-    "message.enable.user": "请确认您确实要启用此用户。",
-    "message.enable.vpn": "请确认您确实要对此 IP 地址启用远程访问 VPN。",
-    "message.enable.vpn.access": "当前已对此 IP 地址禁用了 VPN。是否要启用 VPN 访问?",
-    "message.enabled.vpn": "您的远程访问 VPN 当前已启用,可以通过 IP 进行访问",
-    "message.enabled.vpn.ip.sec": "您的 IPSec 预共享密钥",
-    "message.enabling.network.offering": "正在启用网络方案",
-    "message.enabling.security.group.provider": "正在启用安全组提供程序",
-    "message.enabling.vpc.offering": "正在启用 VPC 方案",
-    "message.enabling.zone": "正在启用资源域",
-    "message.enabling.zone.dots": "正在启用资源域...",
-    "message.enter.seperated.list.multiple.cidrs": "如果存在多个 CIDR,请输入用逗号分隔的 CIDR 列表",
-    "message.enter.token": "请输入您在邀请电子邮件中收到的令牌。",
-    "message.generate.keys": "请确认您确实要为此用户生成新密钥。",
-    "message.gslb.delete.confirm": "请确认您确实要删除此 GSLB",
-    "message.gslb.lb.remove.confirm": "请确认您确实要从 GSLB 中删除负载平衡",
-    "message.guest.traffic.in.advanced.zone": "来宾网络流量是指最终用户虚拟机之间的通信。指定一个 VLAN ID 范围可传送每个物理网络的来宾流量。",
-    "message.guest.traffic.in.basic.zone": "来宾网络流量是指最终用户虚拟机之间的通信。应指定一个 CloudStack 可以分配给来宾 VM 的 IP 地址范围。请确保此范围与预留的系统 IP 范围不重叠。",
-    "message.host.dedicated": "主机已专用",
-    "message.host.dedication.released": "已释放专用主机",
-    "message.installWizard.click.retry": "请单击此按钮重新尝试启动。",
-    "message.installWizard.copy.whatIsACluster": "群集提供了一种编组主机的方法。群集中的所有主机都具有相同的硬件,运行相同的虚拟机管理程序,位于同一子网中,并访问相同的共享存储。可以实时将虚拟机实例(VM)从一台主机迁移到同一群集内的其他主机,而无需中断向用户提供服务。群集是 CloudStack&#8482; 部署中的第三大组织单位。群集包含在提供点中,提供点包含在资源域中。<br/><br/>CloudStack&#8482; 允许云部署中存在多个群集,但对于基本安装,我们只需要一个群集。",
-    "message.installWizard.copy.whatIsAHost": "主机是指一台计算机。主机提供运行来宾虚拟机的计算资源。每台主机上都安装有虚拟机管理程序软件,用于管理来宾 VM (裸机主机除外,将在“高级安装指南”中讨论这一特殊案例)。例如,启用了 KVM 的 Linux 服务器、Citrix XenServer 服务器和 ESXi 服务器都可用作主机。在基本安装中,我们将使用一台运行 XenServer 的主机。<br/><br/>主机是 CloudStack&#8482; 部署中最小的组织单位。主机包含在群集中,群集包含在提供点中,提供点包含在资源域中。",
-    "message.installWizard.copy.whatIsAPod": "一个提供点通常代表一个机架。同一提供点中的主机位于同一子网中。<br/><br/>提供点是 CloudStack&#8482; 部署中的第二大组织单位。提供点包含在资源域中。每个资源域中可以包含一个或多个提供点;在基本安装中,您的资源域中将仅包含一个提供点。",
-    "message.installWizard.copy.whatIsAZone": "资源域是 CloudStack&#8482; 部署中最大的组织单位。虽然允许一个数据中心中存在多个资源域,但是一个资源域通常与一个数据中心相对应。将基础架构编组到资源域中的好处是可以提供物理隔离和冗余。例如,每个资源域都可以拥有各自的电源供应和网络上行方案,并且各资源域可以在地理位置上相隔很远(虽然并非必须相隔很远)。",
-    "message.installWizard.copy.whatIsCloudStack": "CloudStack&#8482 是一个软件平台,可将计算资源集中在一起以构建公有、私有和混合基础设施即服务(IaaS)云。CloudStack&#8482 负责管理组成云基础架构的网络、存储和计算节点。使用 CloudStack&#8482 可以部署、管理和配置云计算环境。<br/><br/>CloudStack&#8482 通过扩展商用硬件上运行的每个虚拟机映像的范围,提供了一个实时可用的云基础架构软件堆栈用于以服务方式交付虚拟数据中心,即交付构建、部署和管理多层次和多租户云应用程序必需的所有组件。开源版本和 Premium 版本都已可用,且提供的功能几乎完全相同。",
-    "message.installWizard.copy.whatIsPrimaryStorage": "CloudStack&#8482; 云基础架构使用以下两种类型的存储: 主存储和二级存储。这两种类型的存储可以是 iSCSI 或 NFS 服务器,也可以是本地磁盘。<br/><br/><strong>主存储</strong>与群集相关联,用于存储该群集中的主机上正在运行的所有 VM 对应的每个来宾 VM 的磁盘卷。主存储服务器通常位于靠近主机的位置。",
-    "message.installWizard.copy.whatIsSecondaryStorage": "二级存储与资源域相关联,用于存储以下项目:<ul><li>模板 - 可用于启动 VM 并可以包含其他配置信息(例如,已安装的应用程序)的操作系统映像</li><li>ISO 映像 - 可重新启动或不可重新启动的操作系统映像</li><li>磁盘卷快照 - 已保存的 VM 数据副本,可用于执行数据恢复或创建新模板</ul>",
-    "message.installWizard.now.building": "现在正在构建您的云...",
-    "message.installWizard.tooltip.addCluster.name": "群集的名称。此名称可以是您选择的文本,且未由 CloudStack 使用。",
-    "message.installWizard.tooltip.addHost.hostname": "主机的 DNS 名称或 IP 地址。",
-    "message.installWizard.tooltip.addHost.password": "此为上述用户的密码(来自 XenServer 安装)。",
-    "message.installWizard.tooltip.addHost.username": "通常为 root。",
-    "message.installWizard.tooltip.addPod.name": "提供点的名称",
-    "message.installWizard.tooltip.addPod.reservedSystemEndIp": "此为 CloudStack 用于管理二级存储 VM 和控制台代理 VM 的专用网络中的 IP 范围。这些 IP 地址来自与计算服务器相同的子网。",
-    "message.installWizard.tooltip.addPod.reservedSystemGateway": "该提供点中的主机网关。",
-    "message.installWizard.tooltip.addPod.reservedSystemNetmask": "来宾将要使用的子网上正在使用的网络掩码。",
-    "message.installWizard.tooltip.addPod.reservedSystemStartIp": "此为 CloudStack 用于管理二级存储 VM 和控制台代理 VM 的专用网络中的 IP 范围。这些 IP 地址来自与计算服务器相同的子网。",
-    "message.installWizard.tooltip.addPrimaryStorage.name": "存储设备的名称。",
-    "message.installWizard.tooltip.addPrimaryStorage.path": "(适用于 NFS)在 NFS 中,此路径为服务器的导出路径。路径(针对 SharedMountPoint)。对于 KVM,此路径为装载了二级存储的每个主机上的路径。例如,/mnt/primary。",
-    "message.installWizard.tooltip.addPrimaryStorage.server": "(适用于 NFS、iSCSI 或 PreSetup)存储设备的 IP 地址或 DNS 名称。",
-    "message.installWizard.tooltip.addSecondaryStorage.nfsServer": "托管二级存储的 NFS 服务器的 IP 地址",
-    "message.installWizard.tooltip.addSecondaryStorage.path": "导出路径(位于上述指定服务器上)",
-    "message.installWizard.tooltip.addZone.dns1": "这些服务器是供此资源域中的来宾 VM 使用的 DNS 服务器,将通过您稍后要添加的公用网络进行访问。此资源域的公用 IP 地址必须路由到在此处指定的 DNS 服务器。",
-    "message.installWizard.tooltip.addZone.dns2": "这些服务器是供此资源域中的来宾 VM 使用的 DNS 服务器,将通过您稍后要添加的公用网络进行访问。此资源域的公用 IP 地址必须路由到在此处指定的 DNS 服务器。",
-    "message.installWizard.tooltip.addZone.internaldns1": "这些服务器是供此资源域中的系统 VM 使用的 DNS 服务器,将通过系统 VM 的专用网络接口进行访问。您为提供点提供的专用 IP 地址必须路由到在此处指定的 DNS 服务器。",
-    "message.installWizard.tooltip.addZone.internaldns2": "这些服务器是供此资源域中的系统 VM 使用的 DNS 服务器,将通过系统 VM 的专用网络接口进行访问。您为提供点提供的专用 IP 地址必须路由到在此处指定的 DNS 服务器。",
-    "message.installWizard.tooltip.addZone.name": "资源域名称",
-    "message.installWizard.tooltip.configureGuestTraffic.description": "您的网络说明",
-    "message.installWizard.tooltip.configureGuestTraffic.guestEndIp": "能够分配给此资源域中的来宾的 IP 地址范围。如果使用一个 NIC,这些 IP 应位于与提供点 CIDR 相同的  CIDR 中。",
-    "message.installWizard.tooltip.configureGuestTraffic.guestGateway": "来宾应使用的网关",
-    "message.installWizard.tooltip.configureGuestTraffic.guestNetmask": "来宾应使用的子网上正在使用的网络掩码",
-    "message.installWizard.tooltip.configureGuestTraffic.guestStartIp": "能够分配给此资源域中的来宾的 IP 地址范围。如果使用一个 NIC,这些 IP 应位于与提供点 CIDR 相同的  CIDR 中。",
-    "message.installWizard.tooltip.configureGuestTraffic.name": "您的网络名称",
-    "message.instance.scaled.up.confirm": "是否确实要扩展您的实例?",
-    "message.instanceWizard.noTemplates": "您没有任何可用模板;请添加一个兼容的模板,然后重新启动实例向导。",
-    "message.ip.address.changed": "您的 IP 地址可能已发生变化;是否要刷新此列表? 请注意,刷新此列表时,“详细信息”窗格将关闭。",
-    "message.iso.desc": "磁盘映像,其中包含操作系统的数据或可启动介质",
-    "message.join.project": "您现在已加入了一个项目。请切换到“项目视图”以查看项目。",
-    "message.launch.vm.on.private.network": "是否要在您的私人专用网络中启动实例?",
-    "message.launch.zone": "资源域已准备就绪,可随时启动;请继续执行下一步骤。",
-    "message.ldap.group.import": "All The users from the given group name will be imported",
-    "message.link.domain.to.ldap": "为此域开启 LDAP 同步",
-    "message.listView.subselect.multi": "(按住 Ctrl/Cmd 并单击)",
-    "message.lock.account": "请确认您确实要锁定此帐户。通过锁定此帐户,此帐户的所有用户将不再能够管理各自的云资源,但仍然可以访问现有资源。",
-    "message.migrate.instance.confirm": "请确认要将虚拟实例迁移到的主机。",
-    "message.migrate.instance.to.host": "请确认您确实要将实例迁移到其他主机。",
-    "message.migrate.instance.select.host": "选择用于迁移的主机",
-    "message.migrate.instance.to.ps": "请确认您确实要将实例迁移到其他主存储。",
-    "message.migrate.router.confirm": "请确认您要将路由器迁移到的主机:",
-    "message.migrate.systemvm.confirm": "请确认您要将系统 VM 迁移到的主机:",
-    "message.migrate.volume": "请确认您确实要将卷迁移到其他主存储。",
-    "message.network.addVM.desc": "请指定要将此 VM 添加到的网络。将为此网络添加一个新 NIC。",
-    "message.network.addVMNIC": "请确认您确实要为此网络添加一个新 VM NIC。",
-    "message.network.remote.access.vpn.configuration": "远程访问VPN配置已经产生,但无法应用。请检查网络连接状况,然后重新尝试。",
-    "message.new.user": "请指定以下信息以向帐户中添加一个新用户",
-    "message.no.affinity.groups": "您没有任何关联性组。请继续执行下一步操作。",
-    "message.no.host.available": "没有可用于迁移的主机",
-    "message.no.more.hosts.available": "没有可用于迁移的主机",
-    "message.no.network.support": "您选择的虚拟机管理程序 vSphere 没有任何其他网络功能。请继续执行步骤 5。",
-    "message.no.network.support.configuration.not.true": "您的所有资源域都未启用安全组,因此无其他网络功能。请继续执行步骤 5。",
-    "message.no.projects": "您没有任何项目。<br/>请从“项目”部分中创建一个新项目。",
-    "message.no.projects.adminOnly": "您没有任何项目。<br/>请要求管理员创建一个新项目。",
-    "message.number.clusters": "<h2>群集<span>数</span></h2>",
-    "message.number.hosts": "<h2>主机<span>数</span></h2>",
-    "message.number.pods": "<h2>提供点<span>数</span></h2>",
-    "message.number.storage": "<h2>主存储卷<span>数</span></h2>",
-    "message.number.zones": "<h2>资源域<span>数</span></h2>",
-    "message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
-    "message.outofbandmanagement.changepassword": "Change Out-of-band Management password",
-    "message.outofbandmanagement.configure": "Configure Out-of-band Management",
-    "message.outofbandmanagement.disable": "Disable Out-of-band Management",
-    "message.outofbandmanagement.enable": "Enable Out-of-band Management",
-    "message.outofbandmanagement.issue": "Issue Out-of-band Management Power Action",
-    "message.password.has.been.reset.to": "密码已重置为",
-    "message.password.of.the.vm.has.been.reset.to": "实例的密码以重置为",
-    "message.pending.projects.1": "您有待定项目邀请:",
-    "message.pending.projects.2": "要查看,请转至“项目”部分,然后从下拉列表中选择“邀请”。",
-    "message.please.add.at.lease.one.traffic.range": "请至少添加一个流量范围。",
-    "message.please.confirm.remove.ssh.key.pair": "请确认您确实要删除此SSH密钥对",
-    "message.please.proceed": "请继续执行下个步骤。",
-    "message.please.select.a.configuration.for.your.zone": "请为您的资源域选择一种配置。",
-    "message.please.select.a.different.public.and.management.network.before.removing": "请先选择其他公用管理网络,然后再删除",
-    "message.please.select.networks": "请为您的虚拟机选择网络。",
-    "message.please.select.ssh.key.pair.use.with.this.vm": "请为此实例选择一个密钥对",
-    "message.please.wait.while.zone.is.being.created": "正在创建资源域,请稍候;此操作可能需要一段时间才能完成...",
-    "message.pod.dedication.released": "已释放专用提供点",
-    "message.portable.ip.delete.confirm": "请确认您确实要删除可移植 IP 范围",
-    "message.project.invite.sent": "发送给用户的邀请;用户接受邀请后,将加入到项目中",
-    "message.public.traffic.in.advanced.zone": "云中的 VM 访问 Internet 时将生成公共流量,但必须分配可公开访问的 IP 才能实现。最终用户可以使用 CloudStack UI 获取这些 IP,以在其来宾网络与公用网络之间执行 NAT。<br/><br/>请至少为 Internet 流量提供一个 IP 地址范围。",
-    "message.public.traffic.in.basic.zone": "云中的 VM 访问 Internet 或通过 Internet 向客户端提供服务时将生成公共流量,但必须分配可公开访问的 IP 才能实现。创建实例时,将把这一组公用 IP 中的 IP (来宾 IP 地址除外)分配给此实例。静态 1-1 NAT 将在公用 IP 与来宾 IP 之间自动设置。最终用户还可以使用 CloudStack UI 获取其他 IP,以在其实例与公用 IP 之间执行静态 NAT。",
-    "message.question.are.you.sure.you.want.to.add": "您确定要添加",
-    "message.read.admin.guide.scaling.up": "开始扩展之前,请阅读管理指南中的动态扩展部分。",
-    "message.recover.vm": "请确认您确实要恢复此 VM。",
-    "message.redirecting.region": "正在重定向到地理区域...",
-    "message.reinstall.vm": "注意: 请谨慎操作。这将导致从模板重新安装 VM,并且引导磁盘上存储的数据将丢失。额外的数据卷(如果存在)将无法访问。",
-    "message.remove.ldap": "是否确实要删除 LDAP 配置?",
-    "message.remove.region": "是否确实要从此管理服务器中删除此地理区域?",
-    "message.remove.vpc": "请确认您确实要删除 VPC",
-    "message.remove.vpn.access": "请确认您确实要删除以下用户的 VPN 访问。",
-    "message.removed.ssh.key.pair": "已移除的SSH密钥对",
-    "message.reset.VPN.connection": "请确认您确实要重置 VPN 连接",
-    "message.reset.password.warning.notPasswordEnabled": "创建此实例的模板时未启用密码",
-    "message.reset.password.warning.notStopped": "必须先停止您的实例,才能尝试更改其当前密码",
-    "message.restart.mgmt.server": "请重新启动管理服务器以使您的新设置生效。",
-    "message.restart.mgmt.usage.server": "请重新启动管理服务器和使用服务器以使您的新设置生效。",
-    "message.restart.network": "此网络提供的所有服务都将中断。请确认您确实要重新启动此网络。",
-    "message.restart.vpc": "请确认您确实要重新启动 VPC",
-    "message.restart.vpc.remark": "请确定您要重启VPC  <p><small><i> 警告: 重启非冗余的VPC将会导致网络中断,直至VPC重启完成</i>.</small></p>",
-    "message.restoreVM": "是否要还原此 VM?",
-    "message.role.update.fail": "Failed updating rule permission",
-    "message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
-    "message.security.group.usage": "(<strong>按住 Ctrl 键并单击鼠标</strong>可选择所有适用的安全组)",
-    "message.select.a.zone": "一个资源域通常与一个数据中心相对应。多个资源域可以提供物理隔离和冗余,有助于使云更加可靠。",
-    "message.select.affinity.groups": "请选择您希望此 VM 所属的任何关联性组:",
-    "message.select.instance": "请选择一个实例。",
-    "message.select.iso": "请为您的新虚拟实例选择一个 ISO。",
-    "message.select.item": "请选择一个项目。",
-    "message.select.security.groups": "请为您的新 VM 选择安全组",
-    "message.select.template": "请为您的新虚拟实例选择一个模板。",
-    "message.select.tier": "请选择一个层",
-    "message.set.default.NIC": "请确认您确实要将此 NIC 设置为此 VM 的默认 NIC。",
-    "message.set.default.NIC.manual": "请立即手动更新此 VM 上的默认 NIC。",
-    "message.setup.physical.network.during.zone.creation": "添加高级资源域时,需要设置一个或多个物理网络。每个网络都与虚拟机管理程序中的一个 NIC 相对应。每个物理网络中可以包含一种或多种流量类型,并对这些流量类型可能的组合方式设置了某些限制。<br/><br/><strong>可以将一种或多种流量类型拖放</strong>到每个物理网络中。",
-    "message.setup.physical.network.during.zone.creation.basic": "添加基础资源域时,可以设置一个物理网络,此网络应与虚拟机管理程序中的 NIC 相对应。此网络可以承载多种流量类型。<br/><br/>此外,还可以将其他流量类型<strong>拖放</strong>到此物理网络。",
-    "message.setup.successful": "已成功设置云!",
-    "message.snapshot.schedule": "可以通过从以下可用选项中进行选择并应用您的策略首选项来设置重现快照计划",
-    "message.specifiy.tag.key.value": "请指定标记密钥和值",
-    "message.specify.url": "请指定 URL",
-    "message.step.1.continue": "请选择一个模板或 ISO 以继续",
-    "message.step.1.desc": "请为您的新虚拟实例选择一个模板。还可以选择一个可将 ISO 映像安装到其中的空模板。",
-    "message.step.2.continue": "请选择一种服务方案以继续",
-    "message.step.3.continue": "请选择一个磁盘方案以继续",
-    "message.step.4.continue": "请至少选择一个网络以继续",
-    "message.step.4.desc": "请选择虚拟实例要连接到的主网络。",
-    "message.storage.traffic": "CloudStack 内部资源(包括与管理服务器通信的任何组件,例如主机和 CloudStack 系统 VM)之间的流量。请在此处配置存储流量。",
-    "message.suspend.project": "是否确实要暂停此项目?",
-    "message.systems.vms.ready": "系统 VM 已就绪。",
-    "message.template.copying": "正在复制模板。",
-    "message.template.desc": "操作系统映像,可用于启动 VM",
-    "message.tier.required": "“层”为必填项",
-    "message.tooltip.dns.1": "供资源域中的 VM 使用的 DNS 服务器名称。资源域的公用 IP 地址必须路由到此服务器。",
-    "message.tooltip.dns.2": "供资源域中的 VM 使用的二级 DNS 服务器名称。资源域的公用 IP 地址必须路由到此服务器。",
-    "message.tooltip.internal.dns.1": "供资源域中的 CloudStack 内部系统 VM 使用的 DNS 服务器名称。提供点的专用 IP 地址必须路由到此服务器。",
-    "message.tooltip.internal.dns.2": "供资源域中的 CloudStack 内部系统 VM 使用的 DNS 服务器名称。提供点的专用 IP 地址必须路由到此服务器。",
-    "message.tooltip.network.domain": "DNS 后缀,将为由来宾 VM 访问的网络创建一个自定义域名。",
-    "message.tooltip.pod.name": "此提供点的名称。",
-    "message.tooltip.reserved.system.gateway": "提供点中的主机网关。",
-    "message.tooltip.reserved.system.netmask": "用于定义提供点子网的网络前缀。请使用 CIDR 符号。",
-    "message.tooltip.zone.name": "资源域名称。",
-    "message.update.os.preference": "请为此主机选择一个操作系统首选项。首先将具有相似首选项的所有虚拟实例分配至此主机,然后再选择其他实例。",
-    "message.update.resource.count": "请确认您确实要更新此帐户的资源数。",
-    "message.update.ssl": "请提交一个 X.509 兼容的新 SSL 证书,以便将其更新到每个控制台代理和二级存储虚拟实例:",
-    "message.update.ssl.failed": "无法更新 SSL 证书。",
-    "message.update.ssl.succeeded": "已成功更新 SSL 证书",
-    "message.validate.URL": "请输入有效的 URL。",
-    "message.validate.accept": "请输入一个带有有效扩展名的值。",
-    "message.validate.creditcard": "请输入一个有效的信用卡卡号。",
-    "message.validate.date": "请输入有效的日期。",
-    "message.validate.date.ISO": "请输入有效的日期(ISO)。",
-    "message.validate.digits": "请仅输入数字。",
-    "message.validate.email.address": "请输入一个有效的电子邮件地址。",
-    "message.validate.equalto": "请重新输入相同的值。",
-    "message.validate.fieldrequired": "此字段为必填字段。",
-    "message.validate.fixfield": "请修复此字段。",
-    "message.validate.instance.name": "实例名称不得超过 63 个字符。仅允许使用 ASCII 字母 a - z 或 A - Z、数字 0 - 9 以及连字符。实例名称必须以字母开头并以字母或数字结束。",
-    "message.validate.invalid.characters": "查找到无效字符,请更正。",
-    "message.validate.max": "请输入一个小于或等于 {0} 的值。",
-    "message.validate.maxlength": "请最多输入 {0} 个字符。",
-    "message.validate.minlength": "请至少输入 {0} 个字符。",
-    "message.validate.number": "请输入一个有效数字。",
-    "message.validate.range": "请输入一个介于 {0} 到 {1} 之间的值。",
-    "message.validate.range.length": "请输入一个长度介于 {0} 到 {1} 之间的值。",
-    "message.virtual.network.desc": "您的帐户的专用虚拟网络。广播域包含在 VLAN 中,并且所有公用网络访问都由虚拟路由器路由出去。",
-    "message.vm.create.template.confirm": "创建模板将自动重新启动 VM。",
-    "message.vm.review.launch": "请先核对以下信息,确认您的虚拟实例正确无误,然后再启动。",
-    "message.vnmc.available.list": "提供程序列表中未提供 VNMC。",
-    "message.vnmc.not.available.list": "提供程序列表中未提供 VNMC。",
-    "message.volume.create.template.confirm": "请确认您确实要为此磁盘卷创建一个模板。创建模板可能需要几分钟到更长的时间,具体取决于卷的大小。",
-    "message.waiting.for.builtin.templates.to.load": "正在等待加载内置模板...",
-    "message.you.must.have.at.least.one.physical.network": "您必须至少拥有一个物理网络",
-    "message.your.cloudstack.is.ready": "您的 CloudStack 已就绪!",
-    "message.zone.creation.complete.would.you.like.to.enable.this.zone": "已完成创建资源域。是否要启用此资源域?",
-    "message.zone.no.network.selection": "所选资源域无任何网络选项。",
-    "message.zone.step.1.desc": "请为您的资源域选择一种网络模式。",
-    "message.zone.step.2.desc": "请输入以下信息以添加一个新资源域",
-    "message.zone.step.3.desc": "请输入以下信息以添加一个新提供点",
-    "message.zoneWizard.enable.local.storage": "警告: 如果为此资源域启用了本地存储,则必须执行以下操作,具体取决于您希望启动系统 VM 的位置:<br/><br/>1. 如果需要在共享主存储中启动系统 VM,则必须在完成创建后将共享主存储添加到此资源域。<br/><br/>2. 如果需要在本地主存储中启动系统 VM,则必须在启用此资源域之前将 system.vm.use.local.storage 设置为 true。<br/><br/><br/>是否要继续?",
-    "messgae.validate.min": "请输入一个大于或等于 {0} 的值。",
-    "mode": "模式",
-    "network.rate": "网络速率",
-    "notification.reboot.instance": "重新启动实例",
-    "notification.start.instance": "启动实例",
-    "notification.stop.instance": "停止实例",
-    "side.by.side": "并行",
-    "state.Accepted": "已接受",
-    "state.Active": "活动",
-    "state.Allocated": "已分配",
-    "state.Allocating": "正在分配",
-    "state.BackedUp": "已备份",
-    "state.BackingUp": "正在备份",
-    "state.Completed": "已完成",
-    "state.Creating": "正在创建",
-    "state.Declined": "已拒绝",
-    "state.Destroyed": "已销毁",
-    "state.Disabled": "已禁用",
-    "state.Enabled": "已启用",
-    "state.Error": "错误",
-    "state.Expunging": "正在删除",
-    "state.Migrating": "正在迁移",
-    "state.Pending": "待定",
-    "state.Ready": "已就绪",
-    "state.Running": "正在运行",
-    "state.Starting": "正在启动",
-    "state.Stopped": "已停止",
-    "state.Stopping": "正在停止",
-    "state.Suspended": "已暂停",
-    "state.detached": "已取消附加",
-    "title.upload.volume": "上传卷",
-    "ui.listView.filters.all": "全部",
-    "ui.listView.filters.mine": "本用户"
-};
diff --git a/ui/legacy/lib/date.js b/ui/legacy/lib/date.js
deleted file mode 100644
index e5bf9cf..0000000
--- a/ui/legacy/lib/date.js
+++ /dev/null
@@ -1,125 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// the License.  You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-Date.prototype.setISO8601 = function(dString){
-
-	var regexp = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)(:)?(\d\d)(\.\d+)?(Z|([+-])(\d\d)(:)?(\d\d))/;
-
-	if (dString.toString().match(new RegExp(regexp))) {
-	var d = dString.match(new RegExp(regexp));
-	var offset = 0;
-
-	this.setUTCDate(1);
-	this.setUTCFullYear(parseInt(d[1],10));
-	this.setUTCMonth(parseInt(d[3],10) - 1);
-	this.setUTCDate(parseInt(d[5],10));
-	this.setUTCHours(parseInt(d[7],10));
-	this.setUTCMinutes(parseInt(d[9],10));
-	this.setUTCSeconds(parseInt(d[11],10));
-	if (d[12])
-	this.setUTCMilliseconds(parseFloat(d[12]) * 1000);
-	else
-	this.setUTCMilliseconds(0);
-	if (d[13] != 'Z') {
-	offset = (d[15] * 60) + parseInt(d[17],10);
-	offset *= ((d[14] == '-') ? -1 : 1);
-	this.setTime(this.getTime() - offset * 60 * 1000);
-	}
-	}
-	else {
-	this.setTime(Date.parse(dString));
-	}
-	return this;
-};
-
-//***** vmops (begin) ***************************************************************
-
-/* 
-This is a hack/temporary solution that lacks calculation of Daylight Saving Time. 
-We'll fix the problem by getting datetime in a specified timezone (including Daylight Saving Time) from server-side in next release.
-*/
-Date.prototype.getTimePlusTimezoneOffset = function(timezoneOffset) {
-    var milliseconds = this.getTime();  
-    var s1  = new Date(milliseconds + (timezoneOffset * 60 * 60 * 1000)).toUTCString(); //e.g. "Tue, 08 Jun 2010 19:13:49 GMT", "Tue, 25 May 2010 12:07:01 UTC"    
-    var s2 = s1.substring(s1.indexOf(", ")+2);                                          //e.g. "08 Jun 2010 19:13:49 GMT", "25 May 2010 12:07:01 UTC"   
-    var s3 = s2.substring(0,s2.length-4);                                               //e.g. "08 Jun 2010 19:13:49", "25 May 2010 12:10:16"	
-    return s3;
-}
-
-//***** vmops (end) *****************************************************************
-
-Date.prototype.format = function(format) {
-	var returnStr = '';
-	var replace = Date.replaceChars;
-	for (var i = 0; i < format.length; i++) {
-		var curChar = format.charAt(i);
-		if (replace[curChar]) {
-			returnStr += replace[curChar].call(this);
-		} else {
-			returnStr += curChar;
-		}
-	}
-	return returnStr;
-};
-Date.replaceChars = {
-	shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-	longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-	shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-	longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-	
-	// Day
-	d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
-	D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
-	j: function() { return this.getDate(); },
-	l: function() { return Date.replaceChars.longDays[this.getDay()]; },
-	N: function() { return this.getDay() + 1; },
-	S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
-	w: function() { return this.getDay(); },
-	z: function() { return "Not Yet Supported"; },
-	// Week
-	W: function() { return "Not Yet Supported"; },
-	// Month
-	F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
-	m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); },
-	M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
-	n: function() { return this.getMonth() + 1; },
-	t: function() { return "Not Yet Supported"; },
-	// Year
-	L: function() { return "Not Yet Supported"; },
-	o: function() { return "Not Supported"; },
-	Y: function() { return this.getFullYear(); },
-	y: function() { return ('' + this.getFullYear()).substr(2); },
-	// Time
-	a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
-	A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
-	B: function() { return "Not Yet Supported"; },
-	g: function() { return this.getHours() % 12 || 12; },
-	G: function() { return this.getHours(); },
-	h: function() { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); },
-	H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
-	i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
-	s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
-	// Timezone
-	e: function() { return "Not Yet Supported"; },
-	I: function() { return "Not Supported"; },
-	O: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + '00'; },
-	T: function() { var m = this.getMonth(); this.setMonth(0); var result = this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/, '$1'); this.setMonth(m); return result;},
-	Z: function() { return -this.getTimezoneOffset() * 60; },
-	// Full Date/Time
-	c: function() { return "Not Yet Supported"; },
-	r: function() { return this.toString(); },
-	U: function() { return this.getTime() / 1000; }
-};
diff --git a/ui/legacy/lib/excanvas.js b/ui/legacy/lib/excanvas.js
deleted file mode 100644
index c40d6f7..0000000
--- a/ui/legacy/lib/excanvas.js
+++ /dev/null
@@ -1,1427 +0,0 @@
-// Copyright 2006 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-// Known Issues:
-//
-// * Patterns only support repeat.
-// * Radial gradient are not implemented. The VML version of these look very
-//   different from the canvas one.
-// * Clipping paths are not implemented.
-// * Coordsize. The width and height attribute have higher priority than the
-//   width and height style values which isn't correct.
-// * Painting mode isn't implemented.
-// * Canvas width/height should is using content-box by default. IE in
-//   Quirks mode will draw the canvas using border-box. Either change your
-//   doctype to HTML5
-//   (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
-//   or use Box Sizing Behavior from WebFX
-//   (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
-// * Non uniform scaling does not correctly scale strokes.
-// * Filling very large shapes (above 5000 points) is buggy.
-// * Optimize. There is always room for speed improvements.
-
-// Only add this code if we do not already have a canvas implementation
-if (!document.createElement('canvas').getContext) {
-
-(function() {
-
-  // alias some functions to make (compiled) code shorter
-  var m = Math;
-  var mr = m.round;
-  var ms = m.sin;
-  var mc = m.cos;
-  var abs = m.abs;
-  var sqrt = m.sqrt;
-
-  // this is used for sub pixel precision
-  var Z = 10;
-  var Z2 = Z / 2;
-
-  /**
-   * This funtion is assigned to the <canvas> elements as element.getContext().
-   * @this {HTMLElement}
-   * @return {CanvasRenderingContext2D_}
-   */
-  function getContext() {
-    return this.context_ ||
-        (this.context_ = new CanvasRenderingContext2D_(this));
-  }
-
-  var slice = Array.prototype.slice;
-
-  /**
-   * Binds a function to an object. The returned function will always use the
-   * passed in {@code obj} as {@code this}.
-   *
-   * Example:
-   *
-   *   g = bind(f, obj, a, b)
-   *   g(c, d) // will do f.call(obj, a, b, c, d)
-   *
-   * @param {Function} f The function to bind the object to
-   * @param {Object} obj The object that should act as this when the function
-   *     is called
-   * @param {*} var_args Rest arguments that will be used as the initial
-   *     arguments when the function is called
-   * @return {Function} A new function that has bound this
-   */
-  function bind(f, obj, var_args) {
-    var a = slice.call(arguments, 2);
-    return function() {
-      return f.apply(obj, a.concat(slice.call(arguments)));
-    };
-  }
-
-  function encodeHtmlAttribute(s) {
-    return String(s).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
-  }
-
-  function addNamespacesAndStylesheet(doc) {
-    // create xmlns
-    if (!doc.namespaces['g_vml_']) {
-      doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml',
-                         '#default#VML');
-
-    }
-    if (!doc.namespaces['g_o_']) {
-      doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office',
-                         '#default#VML');
-    }
-
-    // Setup default CSS.  Only add one style sheet per document
-    if (!doc.styleSheets['ex_canvas_']) {
-      var ss = doc.createStyleSheet();
-      ss.owningElement.id = 'ex_canvas_';
-      ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +
-          // default size is 300x150 in Gecko and Opera
-          'text-align:left;width:300px;height:150px}';
-    }
-  }
-
-  // Add namespaces and stylesheet at startup.
-  addNamespacesAndStylesheet(document);
-
-  var G_vmlCanvasManager_ = {
-    init: function(opt_doc) {
-      if (/MSIE/.test(navigator.userAgent) && !window.opera) {
-        var doc = opt_doc || document;
-        // Create a dummy element so that IE will allow canvas elements to be
-        // recognized.
-        doc.createElement('canvas');
-        doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));
-      }
-    },
-
-    init_: function(doc) {
-      // find all canvas elements
-      var els = doc.getElementsByTagName('canvas');
-      for (var i = 0; i < els.length; i++) {
-        this.initElement(els[i]);
-      }
-    },
-
-    /**
-     * Public initializes a canvas element so that it can be used as canvas
-     * element from now on. This is called automatically before the page is
-     * loaded but if you are creating elements using createElement you need to
-     * make sure this is called on the element.
-     * @param {HTMLElement} el The canvas element to initialize.
-     * @return {HTMLElement} the element that was created.
-     */
-    initElement: function(el) {
-      if (!el.getContext) {
-        el.getContext = getContext;
-
-        // Add namespaces and stylesheet to document of the element.
-        addNamespacesAndStylesheet(el.ownerDocument);
-
-        // Remove fallback content. There is no way to hide text nodes so we
-        // just remove all childNodes. We could hide all elements and remove
-        // text nodes but who really cares about the fallback content.
-        el.innerHTML = '';
-
-        // do not use inline function because that will leak memory
-        el.attachEvent('onpropertychange', onPropertyChange);
-        el.attachEvent('onresize', onResize);
-
-        var attrs = el.attributes;
-        if (attrs.width && attrs.width.specified) {
-          // TODO: use runtimeStyle and coordsize
-          // el.getContext().setWidth_(attrs.width.nodeValue);
-          el.style.width = attrs.width.nodeValue + 'px';
-        } else {
-          el.width = el.clientWidth;
-        }
-        if (attrs.height && attrs.height.specified) {
-          // TODO: use runtimeStyle and coordsize
-          // el.getContext().setHeight_(attrs.height.nodeValue);
-          el.style.height = attrs.height.nodeValue + 'px';
-        } else {
-          el.height = el.clientHeight;
-        }
-        //el.getContext().setCoordsize_()
-      }
-      return el;
-    }
-  };
-
-  function onPropertyChange(e) {
-    var el = e.srcElement;
-
-    switch (e.propertyName) {
-      case 'width':
-        el.getContext().clearRect();
-        el.style.width = el.attributes.width.nodeValue + 'px';
-        // In IE8 this does not trigger onresize.
-        el.firstChild.style.width =  el.clientWidth + 'px';
-        break;
-      case 'height':
-        el.getContext().clearRect();
-        el.style.height = el.attributes.height.nodeValue + 'px';
-        el.firstChild.style.height = el.clientHeight + 'px';
-        break;
-    }
-  }
-
-  function onResize(e) {
-    var el = e.srcElement;
-    if (el.firstChild) {
-      el.firstChild.style.width =  el.clientWidth + 'px';
-      el.firstChild.style.height = el.clientHeight + 'px';
-    }
-  }
-
-  G_vmlCanvasManager_.init();
-
-  // precompute "00" to "FF"
-  var decToHex = [];
-  for (var i = 0; i < 16; i++) {
-    for (var j = 0; j < 16; j++) {
-      decToHex[i * 16 + j] = i.toString(16) + j.toString(16);
-    }
-  }
-
-  function createMatrixIdentity() {
-    return [
-      [1, 0, 0],
-      [0, 1, 0],
-      [0, 0, 1]
-    ];
-  }
-
-  function matrixMultiply(m1, m2) {
-    var result = createMatrixIdentity();
-
-    for (var x = 0; x < 3; x++) {
-      for (var y = 0; y < 3; y++) {
-        var sum = 0;
-
-        for (var z = 0; z < 3; z++) {
-          sum += m1[x][z] * m2[z][y];
-        }
-
-        result[x][y] = sum;
-      }
-    }
-    return result;
-  }
-
-  function copyState(o1, o2) {
-    o2.fillStyle     = o1.fillStyle;
-    o2.lineCap       = o1.lineCap;
-    o2.lineJoin      = o1.lineJoin;
-    o2.lineWidth     = o1.lineWidth;
-    o2.miterLimit    = o1.miterLimit;
-    o2.shadowBlur    = o1.shadowBlur;
-    o2.shadowColor   = o1.shadowColor;
-    o2.shadowOffsetX = o1.shadowOffsetX;
-    o2.shadowOffsetY = o1.shadowOffsetY;
-    o2.strokeStyle   = o1.strokeStyle;
-    o2.globalAlpha   = o1.globalAlpha;
-    o2.font          = o1.font;
-    o2.textAlign     = o1.textAlign;
-    o2.textBaseline  = o1.textBaseline;
-    o2.arcScaleX_    = o1.arcScaleX_;
-    o2.arcScaleY_    = o1.arcScaleY_;
-    o2.lineScale_    = o1.lineScale_;
-  }
-
-  var colorData = {
-    aliceblue: '#F0F8FF',
-    antiquewhite: '#FAEBD7',
-    aquamarine: '#7FFFD4',
-    azure: '#F0FFFF',
-    beige: '#F5F5DC',
-    bisque: '#FFE4C4',
-    black: '#000000',
-    blanchedalmond: '#FFEBCD',
-    blueviolet: '#8A2BE2',
-    brown: '#A52A2A',
-    burlywood: '#DEB887',
-    cadetblue: '#5F9EA0',
-    chartreuse: '#7FFF00',
-    chocolate: '#D2691E',
-    coral: '#FF7F50',
-    cornflowerblue: '#6495ED',
-    cornsilk: '#FFF8DC',
-    crimson: '#DC143C',
-    cyan: '#00FFFF',
-    darkblue: '#00008B',
-    darkcyan: '#008B8B',
-    darkgoldenrod: '#B8860B',
-    darkgray: '#A9A9A9',
-    darkgreen: '#006400',
-    darkgrey: '#A9A9A9',
-    darkkhaki: '#BDB76B',
-    darkmagenta: '#8B008B',
-    darkolivegreen: '#556B2F',
-    darkorange: '#FF8C00',
-    darkorchid: '#9932CC',
-    darkred: '#8B0000',
-    darksalmon: '#E9967A',
-    darkseagreen: '#8FBC8F',
-    darkslateblue: '#483D8B',
-    darkslategray: '#2F4F4F',
-    darkslategrey: '#2F4F4F',
-    darkturquoise: '#00CED1',
-    darkviolet: '#9400D3',
-    deeppink: '#FF1493',
-    deepskyblue: '#00BFFF',
-    dimgray: '#696969',
-    dimgrey: '#696969',
-    dodgerblue: '#1E90FF',
-    firebrick: '#B22222',
-    floralwhite: '#FFFAF0',
-    forestgreen: '#228B22',
-    gainsboro: '#DCDCDC',
-    ghostwhite: '#F8F8FF',
-    gold: '#FFD700',
-    goldenrod: '#DAA520',
-    grey: '#808080',
-    greenyellow: '#ADFF2F',
-    honeydew: '#F0FFF0',
-    hotpink: '#FF69B4',
-    indianred: '#CD5C5C',
-    indigo: '#4B0082',
-    ivory: '#FFFFF0',
-    khaki: '#F0E68C',
-    lavender: '#E6E6FA',
-    lavenderblush: '#FFF0F5',
-    lawngreen: '#7CFC00',
-    lemonchiffon: '#FFFACD',
-    lightblue: '#ADD8E6',
-    lightcoral: '#F08080',
-    lightcyan: '#E0FFFF',
-    lightgoldenrodyellow: '#FAFAD2',
-    lightgreen: '#90EE90',
-    lightgrey: '#D3D3D3',
-    lightpink: '#FFB6C1',
-    lightsalmon: '#FFA07A',
-    lightseagreen: '#20B2AA',
-    lightskyblue: '#87CEFA',
-    lightslategray: '#778899',
-    lightslategrey: '#778899',
-    lightsteelblue: '#B0C4DE',
-    lightyellow: '#FFFFE0',
-    limegreen: '#32CD32',
-    linen: '#FAF0E6',
-    magenta: '#FF00FF',
-    mediumaquamarine: '#66CDAA',
-    mediumblue: '#0000CD',
-    mediumorchid: '#BA55D3',
-    mediumpurple: '#9370DB',
-    mediumseagreen: '#3CB371',
-    mediumslateblue: '#7B68EE',
-    mediumspringgreen: '#00FA9A',
-    mediumturquoise: '#48D1CC',
-    mediumvioletred: '#C71585',
-    midnightblue: '#191970',
-    mintcream: '#F5FFFA',
-    mistyrose: '#FFE4E1',
-    moccasin: '#FFE4B5',
-    navajowhite: '#FFDEAD',
-    oldlace: '#FDF5E6',
-    olivedrab: '#6B8E23',
-    orange: '#FFA500',
-    orangered: '#FF4500',
-    orchid: '#DA70D6',
-    palegoldenrod: '#EEE8AA',
-    palegreen: '#98FB98',
-    paleturquoise: '#AFEEEE',
-    palevioletred: '#DB7093',
-    papayawhip: '#FFEFD5',
-    peachpuff: '#FFDAB9',
-    peru: '#CD853F',
-    pink: '#FFC0CB',
-    plum: '#DDA0DD',
-    powderblue: '#B0E0E6',
-    rosybrown: '#BC8F8F',
-    royalblue: '#4169E1',
-    saddlebrown: '#8B4513',
-    salmon: '#FA8072',
-    sandybrown: '#F4A460',
-    seagreen: '#2E8B57',
-    seashell: '#FFF5EE',
-    sienna: '#A0522D',
-    skyblue: '#87CEEB',
-    slateblue: '#6A5ACD',
-    slategray: '#708090',
-    slategrey: '#708090',
-    snow: '#FFFAFA',
-    springgreen: '#00FF7F',
-    steelblue: '#4682B4',
-    tan: '#D2B48C',
-    thistle: '#D8BFD8',
-    tomato: '#FF6347',
-    turquoise: '#40E0D0',
-    violet: '#EE82EE',
-    wheat: '#F5DEB3',
-    whitesmoke: '#F5F5F5',
-    yellowgreen: '#9ACD32'
-  };
-
-
-  function getRgbHslContent(styleString) {
-    var start = styleString.indexOf('(', 3);
-    var end = styleString.indexOf(')', start + 1);
-    var parts = styleString.substring(start + 1, end).split(',');
-    // add alpha if needed
-    if (parts.length == 4 && styleString.substr(3, 1) == 'a') {
-      alpha = Number(parts[3]);
-    } else {
-      parts[3] = 1;
-    }
-    return parts;
-  }
-
-  function percent(s) {
-    return parseFloat(s) / 100;
-  }
-
-  function clamp(v, min, max) {
-    return Math.min(max, Math.max(min, v));
-  }
-
-  function hslToRgb(parts){
-    var r, g, b;
-    h = parseFloat(parts[0]) / 360 % 360;
-    if (h < 0)
-      h++;
-    s = clamp(percent(parts[1]), 0, 1);
-    l = clamp(percent(parts[2]), 0, 1);
-    if (s == 0) {
-      r = g = b = l; // achromatic
-    } else {
-      var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
-      var p = 2 * l - q;
-      r = hueToRgb(p, q, h + 1 / 3);
-      g = hueToRgb(p, q, h);
-      b = hueToRgb(p, q, h - 1 / 3);
-    }
-
-    return '#' + decToHex[Math.floor(r * 255)] +
-        decToHex[Math.floor(g * 255)] +
-        decToHex[Math.floor(b * 255)];
-  }
-
-  function hueToRgb(m1, m2, h) {
-    if (h < 0)
-      h++;
-    if (h > 1)
-      h--;
-
-    if (6 * h < 1)
-      return m1 + (m2 - m1) * 6 * h;
-    else if (2 * h < 1)
-      return m2;
-    else if (3 * h < 2)
-      return m1 + (m2 - m1) * (2 / 3 - h) * 6;
-    else
-      return m1;
-  }
-
-  function processStyle(styleString) {
-    var str, alpha = 1;
-
-    styleString = String(styleString);
-    if (styleString.charAt(0) == '#') {
-      str = styleString;
-    } else if (/^rgb/.test(styleString)) {
-      var parts = getRgbHslContent(styleString);
-      var str = '#', n;
-      for (var i = 0; i < 3; i++) {
-        if (parts[i].indexOf('%') != -1) {
-          n = Math.floor(percent(parts[i]) * 255);
-        } else {
-          n = Number(parts[i]);
-        }
-        str += decToHex[clamp(n, 0, 255)];
-      }
-      alpha = parts[3];
-    } else if (/^hsl/.test(styleString)) {
-      var parts = getRgbHslContent(styleString);
-      str = hslToRgb(parts);
-      alpha = parts[3];
-    } else {
-      str = colorData[styleString] || styleString;
-    }
-    return {color: str, alpha: alpha};
-  }
-
-  var DEFAULT_STYLE = {
-    style: 'normal',
-    variant: 'normal',
-    weight: 'normal',
-    size: 10,
-    family: 'sans-serif'
-  };
-
-  // Internal text style cache
-  var fontStyleCache = {};
-
-  function processFontStyle(styleString) {
-    if (fontStyleCache[styleString]) {
-      return fontStyleCache[styleString];
-    }
-
-    var el = document.createElement('div');
-    var style = el.style;
-    try {
-      style.font = styleString;
-    } catch (ex) {
-      // Ignore failures to set to invalid font.
-    }
-
-    return fontStyleCache[styleString] = {
-      style: style.fontStyle || DEFAULT_STYLE.style,
-      variant: style.fontVariant || DEFAULT_STYLE.variant,
-      weight: style.fontWeight || DEFAULT_STYLE.weight,
-      size: style.fontSize || DEFAULT_STYLE.size,
-      family: style.fontFamily || DEFAULT_STYLE.family
-    };
-  }
-
-  function getComputedStyle(style, element) {
-    var computedStyle = {};
-
-    for (var p in style) {
-      computedStyle[p] = style[p];
-    }
-
-    // Compute the size
-    var canvasFontSize = parseFloat(element.currentStyle.fontSize),
-        fontSize = parseFloat(style.size);
-
-    if (typeof style.size == 'number') {
-      computedStyle.size = style.size;
-    } else if (style.size.indexOf('px') != -1) {
-      computedStyle.size = fontSize;
-    } else if (style.size.indexOf('em') != -1) {
-      computedStyle.size = canvasFontSize * fontSize;
-    } else if(style.size.indexOf('%') != -1) {
-      computedStyle.size = (canvasFontSize / 100) * fontSize;
-    } else if (style.size.indexOf('pt') != -1) {
-      computedStyle.size = fontSize / .75;
-    } else {
-      computedStyle.size = canvasFontSize;
-    }
-
-    // Different scaling between normal text and VML text. This was found using
-    // trial and error to get the same size as non VML text.
-    computedStyle.size *= 0.981;
-
-    return computedStyle;
-  }
-
-  function buildStyle(style) {
-    return style.style + ' ' + style.variant + ' ' + style.weight + ' ' +
-        style.size + 'px ' + style.family;
-  }
-
-  function processLineCap(lineCap) {
-    switch (lineCap) {
-      case 'butt':
-        return 'flat';
-      case 'round':
-        return 'round';
-      case 'square':
-      default:
-        return 'square';
-    }
-  }
-
-  /**
-   * This class implements CanvasRenderingContext2D interface as described by
-   * the WHATWG.
-   * @param {HTMLElement} surfaceElement The element that the 2D context should
-   * be associated with
-   */
-  function CanvasRenderingContext2D_(surfaceElement) {
-    this.m_ = createMatrixIdentity();
-
-    this.mStack_ = [];
-    this.aStack_ = [];
-    this.currentPath_ = [];
-
-    // Canvas context properties
-    this.strokeStyle = '#000';
-    this.fillStyle = '#000';
-
-    this.lineWidth = 1;
-    this.lineJoin = 'miter';
-    this.lineCap = 'butt';
-    this.miterLimit = Z * 1;
-    this.globalAlpha = 1;
-    this.font = '10px sans-serif';
-    this.textAlign = 'left';
-    this.textBaseline = 'alphabetic';
-    this.canvas = surfaceElement;
-
-    var el = surfaceElement.ownerDocument.createElement('div');
-    el.style.width =  surfaceElement.clientWidth + 'px';
-    el.style.height = surfaceElement.clientHeight + 'px';
-    el.style.overflow = 'hidden';
-    el.style.position = 'absolute';
-    surfaceElement.appendChild(el);
-
-    this.element_ = el;
-    this.arcScaleX_ = 1;
-    this.arcScaleY_ = 1;
-    this.lineScale_ = 1;
-  }
-
-  var contextPrototype = CanvasRenderingContext2D_.prototype;
-  contextPrototype.clearRect = function() {
-    if (this.textMeasureEl_) {
-      this.textMeasureEl_.removeNode(true);
-      this.textMeasureEl_ = null;
-    }
-    this.element_.innerHTML = '';
-  };
-
-  contextPrototype.beginPath = function() {
-    // TODO: Branch current matrix so that save/restore has no effect
-    //       as per safari docs.
-    this.currentPath_ = [];
-  };
-
-  contextPrototype.moveTo = function(aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});
-    this.currentX_ = p.x;
-    this.currentY_ = p.y;
-  };
-
-  contextPrototype.lineTo = function(aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});
-
-    this.currentX_ = p.x;
-    this.currentY_ = p.y;
-  };
-
-  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
-                                            aCP2x, aCP2y,
-                                            aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    var cp1 = this.getCoords_(aCP1x, aCP1y);
-    var cp2 = this.getCoords_(aCP2x, aCP2y);
-    bezierCurveTo(this, cp1, cp2, p);
-  };
-
-  // Helper function that takes the already fixed cordinates.
-  function bezierCurveTo(self, cp1, cp2, p) {
-    self.currentPath_.push({
-      type: 'bezierCurveTo',
-      cp1x: cp1.x,
-      cp1y: cp1.y,
-      cp2x: cp2.x,
-      cp2y: cp2.y,
-      x: p.x,
-      y: p.y
-    });
-    self.currentX_ = p.x;
-    self.currentY_ = p.y;
-  }
-
-  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
-    // the following is lifted almost directly from
-    // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
-
-    var cp = this.getCoords_(aCPx, aCPy);
-    var p = this.getCoords_(aX, aY);
-
-    var cp1 = {
-      x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
-      y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
-    };
-    var cp2 = {
-      x: cp1.x + (p.x - this.currentX_) / 3.0,
-      y: cp1.y + (p.y - this.currentY_) / 3.0
-    };
-
-    bezierCurveTo(this, cp1, cp2, p);
-  };
-
-  contextPrototype.arc = function(aX, aY, aRadius,
-                                  aStartAngle, aEndAngle, aClockwise) {
-    aRadius *= Z;
-    var arcType = aClockwise ? 'at' : 'wa';
-
-    var xStart = aX + mc(aStartAngle) * aRadius - Z2;
-    var yStart = aY + ms(aStartAngle) * aRadius - Z2;
-
-    var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
-    var yEnd = aY + ms(aEndAngle) * aRadius - Z2;
-
-    // IE won't render arches drawn counter clockwise if xStart == xEnd.
-    if (xStart == xEnd && !aClockwise) {
-      xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
-                       // that can be represented in binary
-    }
-
-    var p = this.getCoords_(aX, aY);
-    var pStart = this.getCoords_(xStart, yStart);
-    var pEnd = this.getCoords_(xEnd, yEnd);
-
-    this.currentPath_.push({type: arcType,
-                           x: p.x,
-                           y: p.y,
-                           radius: aRadius,
-                           xStart: pStart.x,
-                           yStart: pStart.y,
-                           xEnd: pEnd.x,
-                           yEnd: pEnd.y});
-
-  };
-
-  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-  };
-
-  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
-    var oldPath = this.currentPath_;
-    this.beginPath();
-
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-    this.stroke();
-
-    this.currentPath_ = oldPath;
-  };
-
-  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
-    var oldPath = this.currentPath_;
-    this.beginPath();
-
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-    this.fill();
-
-    this.currentPath_ = oldPath;
-  };
-
-  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
-    var gradient = new CanvasGradient_('gradient');
-    gradient.x0_ = aX0;
-    gradient.y0_ = aY0;
-    gradient.x1_ = aX1;
-    gradient.y1_ = aY1;
-    return gradient;
-  };
-
-  contextPrototype.createRadialGradient = function(aX0, aY0, aR0,
-                                                   aX1, aY1, aR1) {
-    var gradient = new CanvasGradient_('gradientradial');
-    gradient.x0_ = aX0;
-    gradient.y0_ = aY0;
-    gradient.r0_ = aR0;
-    gradient.x1_ = aX1;
-    gradient.y1_ = aY1;
-    gradient.r1_ = aR1;
-    return gradient;
-  };
-
-  contextPrototype.drawImage = function(image, var_args) {
-    var dx, dy, dw, dh, sx, sy, sw, sh;
-
-    // to find the original width we overide the width and height
-    var oldRuntimeWidth = image.runtimeStyle.width;
-    var oldRuntimeHeight = image.runtimeStyle.height;
-    image.runtimeStyle.width = 'auto';
-    image.runtimeStyle.height = 'auto';
-
-    // get the original size
-    var w = image.width;
-    var h = image.height;
-
-    // and remove overides
-    image.runtimeStyle.width = oldRuntimeWidth;
-    image.runtimeStyle.height = oldRuntimeHeight;
-
-    if (arguments.length == 3) {
-      dx = arguments[1];
-      dy = arguments[2];
-      sx = sy = 0;
-      sw = dw = w;
-      sh = dh = h;
-    } else if (arguments.length == 5) {
-      dx = arguments[1];
-      dy = arguments[2];
-      dw = arguments[3];
-      dh = arguments[4];
-      sx = sy = 0;
-      sw = w;
-      sh = h;
-    } else if (arguments.length == 9) {
-      sx = arguments[1];
-      sy = arguments[2];
-      sw = arguments[3];
-      sh = arguments[4];
-      dx = arguments[5];
-      dy = arguments[6];
-      dw = arguments[7];
-      dh = arguments[8];
-    } else {
-      throw Error('Invalid number of arguments');
-    }
-
-    var d = this.getCoords_(dx, dy);
-
-    var w2 = sw / 2;
-    var h2 = sh / 2;
-
-    var vmlStr = [];
-
-    var W = 10;
-    var H = 10;
-
-    // For some reason that I've now forgotten, using divs didn't work
-    vmlStr.push(' <g_vml_:group',
-                ' coordsize="', Z * W, ',', Z * H, '"',
-                ' coordorigin="0,0"' ,
-                ' style="width:', W, 'px;height:', H, 'px;position:absolute;');
-
-    // If filters are necessary (rotation exists), create them
-    // filters are bog-slow, so only create them if abbsolutely necessary
-    // The following check doesn't account for skews (which don't exist
-    // in the canvas spec (yet) anyway.
-
-    if (this.m_[0][0] != 1 || this.m_[0][1] ||
-        this.m_[1][1] != 1 || this.m_[1][0]) {
-      var filter = [];
-
-      // Note the 12/21 reversal
-      filter.push('M11=', this.m_[0][0], ',',
-                  'M12=', this.m_[1][0], ',',
-                  'M21=', this.m_[0][1], ',',
-                  'M22=', this.m_[1][1], ',',
-                  'Dx=', mr(d.x / Z), ',',
-                  'Dy=', mr(d.y / Z), '');
-
-      // Bounding box calculation (need to minimize displayed area so that
-      // filters don't waste time on unused pixels.
-      var max = d;
-      var c2 = this.getCoords_(dx + dw, dy);
-      var c3 = this.getCoords_(dx, dy + dh);
-      var c4 = this.getCoords_(dx + dw, dy + dh);
-
-      max.x = m.max(max.x, c2.x, c3.x, c4.x);
-      max.y = m.max(max.y, c2.y, c3.y, c4.y);
-
-      vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z),
-                  'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(',
-                  filter.join(''), ", sizingmethod='clip');");
-
-    } else {
-      vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;');
-    }
-
-    vmlStr.push(' ">' ,
-                '<g_vml_:image src="', image.src, '"',
-                ' style="width:', Z * dw, 'px;',
-                ' height:', Z * dh, 'px"',
-                ' cropleft="', sx / w, '"',
-                ' croptop="', sy / h, '"',
-                ' cropright="', (w - sx - sw) / w, '"',
-                ' cropbottom="', (h - sy - sh) / h, '"',
-                ' />',
-                '</g_vml_:group>');
-
-    this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''));
-  };
-
-  contextPrototype.stroke = function(aFill) {
-    var W = 10;
-    var H = 10;
-    // Divide the shape into chunks if it's too long because IE has a limit
-    // somewhere for how long a VML shape can be. This simple division does
-    // not work with fills, only strokes, unfortunately.
-    var chunkSize = 5000;
-
-    var min = {x: null, y: null};
-    var max = {x: null, y: null};
-
-    for (var j = 0; j < this.currentPath_.length; j += chunkSize) {
-      var lineStr = [];
-      var lineOpen = false;
-
-      lineStr.push('<g_vml_:shape',
-                   ' filled="', !!aFill, '"',
-                   ' style="position:absolute;width:', W, 'px;height:', H, 'px;"',
-                   ' coordorigin="0,0"',
-                   ' coordsize="', Z * W, ',', Z * H, '"',
-                   ' stroked="', !aFill, '"',
-                   ' path="');
-
-      var newSeq = false;
-
-      for (var i = j; i < Math.min(j + chunkSize, this.currentPath_.length); i++) {
-        if (i % chunkSize == 0 && i > 0) { // move into position for next chunk
-          lineStr.push(' m ', mr(this.currentPath_[i-1].x), ',', mr(this.currentPath_[i-1].y));
-        }
-
-        var p = this.currentPath_[i];
-        var c;
-
-        switch (p.type) {
-          case 'moveTo':
-            c = p;
-            lineStr.push(' m ', mr(p.x), ',', mr(p.y));
-            break;
-          case 'lineTo':
-            lineStr.push(' l ', mr(p.x), ',', mr(p.y));
-            break;
-          case 'close':
-            lineStr.push(' x ');
-            p = null;
-            break;
-          case 'bezierCurveTo':
-            lineStr.push(' c ',
-                         mr(p.cp1x), ',', mr(p.cp1y), ',',
-                         mr(p.cp2x), ',', mr(p.cp2y), ',',
-                         mr(p.x), ',', mr(p.y));
-            break;
-          case 'at':
-          case 'wa':
-            lineStr.push(' ', p.type, ' ',
-                         mr(p.x - this.arcScaleX_ * p.radius), ',',
-                         mr(p.y - this.arcScaleY_ * p.radius), ' ',
-                         mr(p.x + this.arcScaleX_ * p.radius), ',',
-                         mr(p.y + this.arcScaleY_ * p.radius), ' ',
-                         mr(p.xStart), ',', mr(p.yStart), ' ',
-                         mr(p.xEnd), ',', mr(p.yEnd));
-            break;
-        }
-  
-  
-        // TODO: Following is broken for curves due to
-        //       move to proper paths.
-  
-        // Figure out dimensions so we can do gradient fills
-        // properly
-        if (p) {
-          if (min.x == null || p.x < min.x) {
-            min.x = p.x;
-          }
-          if (max.x == null || p.x > max.x) {
-            max.x = p.x;
-          }
-          if (min.y == null || p.y < min.y) {
-            min.y = p.y;
-          }
-          if (max.y == null || p.y > max.y) {
-            max.y = p.y;
-          }
-        }
-      }
-      lineStr.push(' ">');
-  
-      if (!aFill) {
-        appendStroke(this, lineStr);
-      } else {
-        appendFill(this, lineStr, min, max);
-      }
-  
-      lineStr.push('</g_vml_:shape>');
-  
-      this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
-    }
-  };
-
-  function appendStroke(ctx, lineStr) {
-    var a = processStyle(ctx.strokeStyle);
-    var color = a.color;
-    var opacity = a.alpha * ctx.globalAlpha;
-    var lineWidth = ctx.lineScale_ * ctx.lineWidth;
-
-    // VML cannot correctly render a line if the width is less than 1px.
-    // In that case, we dilute the color to make the line look thinner.
-    if (lineWidth < 1) {
-      opacity *= lineWidth;
-    }
-
-    lineStr.push(
-      '<g_vml_:stroke',
-      ' opacity="', opacity, '"',
-      ' joinstyle="', ctx.lineJoin, '"',
-      ' miterlimit="', ctx.miterLimit, '"',
-      ' endcap="', processLineCap(ctx.lineCap), '"',
-      ' weight="', lineWidth, 'px"',
-      ' color="', color, '" />'
-    );
-  }
-
-  function appendFill(ctx, lineStr, min, max) {
-    var fillStyle = ctx.fillStyle;
-    var arcScaleX = ctx.arcScaleX_;
-    var arcScaleY = ctx.arcScaleY_;
-    var width = max.x - min.x;
-    var height = max.y - min.y;
-    if (fillStyle instanceof CanvasGradient_) {
-      // TODO: Gradients transformed with the transformation matrix.
-      var angle = 0;
-      var focus = {x: 0, y: 0};
-
-      // additional offset
-      var shift = 0;
-      // scale factor for offset
-      var expansion = 1;
-
-      if (fillStyle.type_ == 'gradient') {
-        var x0 = fillStyle.x0_ / arcScaleX;
-        var y0 = fillStyle.y0_ / arcScaleY;
-        var x1 = fillStyle.x1_ / arcScaleX;
-        var y1 = fillStyle.y1_ / arcScaleY;
-        var p0 = ctx.getCoords_(x0, y0);
-        var p1 = ctx.getCoords_(x1, y1);
-        var dx = p1.x - p0.x;
-        var dy = p1.y - p0.y;
-        angle = Math.atan2(dx, dy) * 180 / Math.PI;
-
-        // The angle should be a non-negative number.
-        if (angle < 0) {
-          angle += 360;
-        }
-
-        // Very small angles produce an unexpected result because they are
-        // converted to a scientific notation string.
-        if (angle < 1e-6) {
-          angle = 0;
-        }
-      } else {
-        var p0 = ctx.getCoords_(fillStyle.x0_, fillStyle.y0_);
-        focus = {
-          x: (p0.x - min.x) / width,
-          y: (p0.y - min.y) / height
-        };
-
-        width  /= arcScaleX * Z;
-        height /= arcScaleY * Z;
-        var dimension = m.max(width, height);
-        shift = 2 * fillStyle.r0_ / dimension;
-        expansion = 2 * fillStyle.r1_ / dimension - shift;
-      }
-
-      // We need to sort the color stops in ascending order by offset,
-      // otherwise IE won't interpret it correctly.
-      var stops = fillStyle.colors_;
-      stops.sort(function(cs1, cs2) {
-        return cs1.offset - cs2.offset;
-      });
-
-      var length = stops.length;
-      var color1 = stops[0].color;
-      var color2 = stops[length - 1].color;
-      var opacity1 = stops[0].alpha * ctx.globalAlpha;
-      var opacity2 = stops[length - 1].alpha * ctx.globalAlpha;
-
-      var colors = [];
-      for (var i = 0; i < length; i++) {
-        var stop = stops[i];
-        colors.push(stop.offset * expansion + shift + ' ' + stop.color);
-      }
-
-      // When colors attribute is used, the meanings of opacity and o:opacity2
-      // are reversed.
-      lineStr.push('<g_vml_:fill type="', fillStyle.type_, '"',
-                   ' method="none" focus="100%"',
-                   ' color="', color1, '"',
-                   ' color2="', color2, '"',
-                   ' colors="', colors.join(','), '"',
-                   ' opacity="', opacity2, '"',
-                   ' g_o_:opacity2="', opacity1, '"',
-                   ' angle="', angle, '"',
-                   ' focusposition="', focus.x, ',', focus.y, '" />');
-    } else if (fillStyle instanceof CanvasPattern_) {
-      if (width && height) {
-        var deltaLeft = -min.x;
-        var deltaTop = -min.y;
-        lineStr.push('<g_vml_:fill',
-                     ' position="',
-                     deltaLeft / width * arcScaleX * arcScaleX, ',',
-                     deltaTop / height * arcScaleY * arcScaleY, '"',
-                     ' type="tile"',
-                     // TODO: Figure out the correct size to fit the scale.
-                     //' size="', w, 'px ', h, 'px"',
-                     ' src="', fillStyle.src_, '" />');
-       }
-    } else {
-      var a = processStyle(ctx.fillStyle);
-      var color = a.color;
-      var opacity = a.alpha * ctx.globalAlpha;
-      lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity,
-                   '" />');
-    }
-  }
-
-  contextPrototype.fill = function() {
-    this.stroke(true);
-  };
-
-  contextPrototype.closePath = function() {
-    this.currentPath_.push({type: 'close'});
-  };
-
-  /**
-   * @private
-   */
-  contextPrototype.getCoords_ = function(aX, aY) {
-    var m = this.m_;
-    return {
-      x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
-      y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
-    };
-  };
-
-  contextPrototype.save = function() {
-    var o = {};
-    copyState(this, o);
-    this.aStack_.push(o);
-    this.mStack_.push(this.m_);
-    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
-  };
-
-  contextPrototype.restore = function() {
-    if (this.aStack_.length) {
-      copyState(this.aStack_.pop(), this);
-      this.m_ = this.mStack_.pop();
-    }
-  };
-
-  function matrixIsFinite(m) {
-    return isFinite(m[0][0]) && isFinite(m[0][1]) &&
-        isFinite(m[1][0]) && isFinite(m[1][1]) &&
-        isFinite(m[2][0]) && isFinite(m[2][1]);
-  }
-
-  function setM(ctx, m, updateLineScale) {
-    if (!matrixIsFinite(m)) {
-      return;
-    }
-    ctx.m_ = m;
-
-    if (updateLineScale) {
-      // Get the line scale.
-      // Determinant of this.m_ means how much the area is enlarged by the
-      // transformation. So its square root can be used as a scale factor
-      // for width.
-      var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
-      ctx.lineScale_ = sqrt(abs(det));
-    }
-  }
-
-  contextPrototype.translate = function(aX, aY) {
-    var m1 = [
-      [1,  0,  0],
-      [0,  1,  0],
-      [aX, aY, 1]
-    ];
-
-    setM(this, matrixMultiply(m1, this.m_), false);
-  };
-
-  contextPrototype.rotate = function(aRot) {
-    var c = mc(aRot);
-    var s = ms(aRot);
-
-    var m1 = [
-      [c,  s, 0],
-      [-s, c, 0],
-      [0,  0, 1]
-    ];
-
-    setM(this, matrixMultiply(m1, this.m_), false);
-  };
-
-  contextPrototype.scale = function(aX, aY) {
-    this.arcScaleX_ *= aX;
-    this.arcScaleY_ *= aY;
-    var m1 = [
-      [aX, 0,  0],
-      [0,  aY, 0],
-      [0,  0,  1]
-    ];
-
-    setM(this, matrixMultiply(m1, this.m_), true);
-  };
-
-  contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) {
-    var m1 = [
-      [m11, m12, 0],
-      [m21, m22, 0],
-      [dx,  dy,  1]
-    ];
-
-    setM(this, matrixMultiply(m1, this.m_), true);
-  };
-
-  contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
-    var m = [
-      [m11, m12, 0],
-      [m21, m22, 0],
-      [dx,  dy,  1]
-    ];
-
-    setM(this, m, true);
-  };
-
-  /**
-   * The text drawing function.
-   * The maxWidth argument isn't taken in account, since no browser supports
-   * it yet.
-   */
-  contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) {
-    var m = this.m_,
-        delta = 1000,
-        left = 0,
-        right = delta,
-        offset = {x: 0, y: 0},
-        lineStr = [];
-
-    var fontStyle = getComputedStyle(processFontStyle(this.font),
-                                     this.element_);
-
-    var fontStyleString = buildStyle(fontStyle);
-
-    var elementStyle = this.element_.currentStyle;
-    var textAlign = this.textAlign.toLowerCase();
-    switch (textAlign) {
-      case 'left':
-      case 'center':
-      case 'right':
-        break;
-      case 'end':
-        textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left';
-        break;
-      case 'start':
-        textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left';
-        break;
-      default:
-        textAlign = 'left';
-    }
-
-    // 1.75 is an arbitrary number, as there is no info about the text baseline
-    switch (this.textBaseline) {
-      case 'hanging':
-      case 'top':
-        offset.y = fontStyle.size / 1.75;
-        break;
-      case 'middle':
-        break;
-      default:
-      case null:
-      case 'alphabetic':
-      case 'ideographic':
-      case 'bottom':
-        offset.y = -fontStyle.size / 2.25;
-        break;
-    }
-
-    switch(textAlign) {
-      case 'right':
-        left = delta;
-        right = 0.05;
-        break;
-      case 'center':
-        left = right = delta / 2;
-        break;
-    }
-
-    var d = this.getCoords_(x + offset.x, y + offset.y);
-
-    lineStr.push('<g_vml_:line from="', -left ,' 0" to="', right ,' 0.05" ',
-                 ' coordsize="100 100" coordorigin="0 0"',
-                 ' filled="', !stroke, '" stroked="', !!stroke,
-                 '" style="position:absolute;width:1px;height:1px;">');
-
-    if (stroke) {
-      appendStroke(this, lineStr);
-    } else {
-      // TODO: Fix the min and max params.
-      appendFill(this, lineStr, {x: -left, y: 0},
-                 {x: right, y: fontStyle.size});
-    }
-
-    var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' +
-                m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0';
-
-    var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z);
-
-    lineStr.push('<g_vml_:skew on="t" matrix="', skewM ,'" ',
-                 ' offset="', skewOffset, '" origin="', left ,' 0" />',
-                 '<g_vml_:path textpathok="true" />',
-                 '<g_vml_:textpath on="true" string="',
-                 encodeHtmlAttribute(text),
-                 '" style="v-text-align:', textAlign,
-                 ';font:', encodeHtmlAttribute(fontStyleString),
-                 '" /></g_vml_:line>');
-
-    this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
-  };
-
-  contextPrototype.fillText = function(text, x, y, maxWidth) {
-    this.drawText_(text, x, y, maxWidth, false);
-  };
-
-  contextPrototype.strokeText = function(text, x, y, maxWidth) {
-    this.drawText_(text, x, y, maxWidth, true);
-  };
-
-  contextPrototype.measureText = function(text) {
-    if (!this.textMeasureEl_) {
-      var s = '<span style="position:absolute;' +
-          'top:-20000px;left:0;padding:0;margin:0;border:none;' +
-          'white-space:pre;"></span>';
-      this.element_.insertAdjacentHTML('beforeEnd', s);
-      this.textMeasureEl_ = this.element_.lastChild;
-    }
-    var doc = this.element_.ownerDocument;
-    this.textMeasureEl_.innerHTML = '';
-    this.textMeasureEl_.style.font = this.font;
-    // Don't use innerHTML or innerText because they allow markup/whitespace.
-    this.textMeasureEl_.appendChild(doc.createTextNode(text));
-    return {width: this.textMeasureEl_.offsetWidth};
-  };
-
-  /******** STUBS ********/
-  contextPrototype.clip = function() {
-    // TODO: Implement
-  };
-
-  contextPrototype.arcTo = function() {
-    // TODO: Implement
-  };
-
-  contextPrototype.createPattern = function(image, repetition) {
-    return new CanvasPattern_(image, repetition);
-  };
-
-  // Gradient / Pattern Stubs
-  function CanvasGradient_(aType) {
-    this.type_ = aType;
-    this.x0_ = 0;
-    this.y0_ = 0;
-    this.r0_ = 0;
-    this.x1_ = 0;
-    this.y1_ = 0;
-    this.r1_ = 0;
-    this.colors_ = [];
-  }
-
-  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
-    aColor = processStyle(aColor);
-    this.colors_.push({offset: aOffset,
-                       color: aColor.color,
-                       alpha: aColor.alpha});
-  };
-
-  function CanvasPattern_(image, repetition) {
-    assertImageIsValid(image);
-    switch (repetition) {
-      case 'repeat':
-      case null:
-      case '':
-        this.repetition_ = 'repeat';
-        break
-      case 'repeat-x':
-      case 'repeat-y':
-      case 'no-repeat':
-        this.repetition_ = repetition;
-        break;
-      default:
-        throwException('SYNTAX_ERR');
-    }
-
-    this.src_ = image.src;
-    this.width_ = image.width;
-    this.height_ = image.height;
-  }
-
-  function throwException(s) {
-    throw new DOMException_(s);
-  }
-
-  function assertImageIsValid(img) {
-    if (!img || img.nodeType != 1 || img.tagName != 'IMG') {
-      throwException('TYPE_MISMATCH_ERR');
-    }
-    if (img.readyState != 'complete') {
-      throwException('INVALID_STATE_ERR');
-    }
-  }
-
-  function DOMException_(s) {
-    this.code = this[s];
-    this.message = s +': DOM Exception ' + this.code;
-  }
-  var p = DOMException_.prototype = new Error;
-  p.INDEX_SIZE_ERR = 1;
-  p.DOMSTRING_SIZE_ERR = 2;
-  p.HIERARCHY_REQUEST_ERR = 3;
-  p.WRONG_DOCUMENT_ERR = 4;
-  p.INVALID_CHARACTER_ERR = 5;
-  p.NO_DATA_ALLOWED_ERR = 6;
-  p.NO_MODIFICATION_ALLOWED_ERR = 7;
-  p.NOT_FOUND_ERR = 8;
-  p.NOT_SUPPORTED_ERR = 9;
-  p.INUSE_ATTRIBUTE_ERR = 10;
-  p.INVALID_STATE_ERR = 11;
-  p.SYNTAX_ERR = 12;
-  p.INVALID_MODIFICATION_ERR = 13;
-  p.NAMESPACE_ERR = 14;
-  p.INVALID_ACCESS_ERR = 15;
-  p.VALIDATION_ERR = 16;
-  p.TYPE_MISMATCH_ERR = 17;
-
-  // set up externs
-  G_vmlCanvasManager = G_vmlCanvasManager_;
-  CanvasRenderingContext2D = CanvasRenderingContext2D_;
-  CanvasGradient = CanvasGradient_;
-  CanvasPattern = CanvasPattern_;
-  DOMException = DOMException_;
-})();
-
-} // if
diff --git a/ui/legacy/lib/flot/jquery.colorhelpers.js b/ui/legacy/lib/flot/jquery.colorhelpers.js
deleted file mode 100644
index 7a0414e..0000000
--- a/ui/legacy/lib/flot/jquery.colorhelpers.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/* Plugin for jQuery for working with colors.
- * 
- * Version 1.1.
- * 
- * Inspiration from jQuery color animation plugin by John Resig.
- *
- * Released under the MIT license by Ole Laursen, October 2009.
- *
- * Examples:
- *
- *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
- *   var c = $.color.extract($("#mydiv"), 'background-color');
- *   console.log(c.r, c.g, c.b, c.a);
- *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
- *
- * Note that .scale() and .add() return the same modified object
- * instead of making a new one.
- *
- * V. 1.1: Fix error handling so e.g. parsing an empty string does
- * produce a color rather than just crashing.
- */
-
-(function($) {
-  $.color = {};
-
-  // construct color object with some convenient chainable helpers
-  $.color.make = function (r, g, b, a) {
-    var o = {};
-    o.r = r || 0;
-    o.g = g || 0;
-    o.b = b || 0;
-    o.a = a != null ? a : 1;
-
-    o.add = function (c, d) {
-      for (var i = 0; i < c.length; ++i)
-        o[c.charAt(i)] += d;
-      return o.normalize();
-    };
-
-    o.scale = function (c, f) {
-      for (var i = 0; i < c.length; ++i)
-        o[c.charAt(i)] *= f;
-      return o.normalize();
-    };
-
-    o.toString = function () {
-      if (o.a >= 1.0) {
-        return "rgb("+[o.r, o.g, o.b].join(",")+")";
-      } else {
-        return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")";
-      }
-    };
-
-    o.normalize = function () {
-      function clamp(min, value, max) {
-        return value < min ? min: (value > max ? max: value);
-      }
-
-      o.r = clamp(0, parseInt(o.r), 255);
-      o.g = clamp(0, parseInt(o.g), 255);
-      o.b = clamp(0, parseInt(o.b), 255);
-      o.a = clamp(0, o.a, 1);
-      return o;
-    };
-
-    o.clone = function () {
-      return $.color.make(o.r, o.b, o.g, o.a);
-    };
-
-    return o.normalize();
-  }
-
-  // extract CSS color property from element, going up in the DOM
-  // if it's "transparent"
-  $.color.extract = function (elem, css) {
-    var c;
-
-    do {
-      c = elem.css(css).toLowerCase();
-      // keep going until we find an element that has color, or
-      // we hit the body or root (have no parent)
-      if (c != '' && c != 'transparent')
-        break;
-      elem = elem.parent();
-    } while (elem.length && !$.nodeName(elem.get(0), "body"));
-
-    // catch Safari's way of signalling transparent
-    if (c == "rgba(0, 0, 0, 0)")
-      c = "transparent";
-
-    return $.color.parse(c);
-  }
-
-  // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"),
-  // returns color object, if parsing failed, you get black (0, 0,
-  // 0) out
-  $.color.parse = function (str) {
-    var res, m = $.color.make;
-
-    // Look for rgb(num,num,num)
-    if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))
-      return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10));
-
-    // Look for rgba(num,num,num,num)
-    if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))
-      return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4]));
-
-    // Look for rgb(num%,num%,num%)
-    if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))
-      return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55);
-
-    // Look for rgba(num%,num%,num%,num)
-    if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))
-      return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4]));
-
-    // Look for #a0b1c2
-    if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))
-      return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16));
-
-    // Look for #fff
-    if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))
-      return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16));
-
-    // Otherwise, we're most likely dealing with a named color
-    var name = $.trim(str).toLowerCase();
-    if (name == "transparent")
-      return m(255, 255, 255, 0);
-    else {
-      // default to black
-      res = lookupColors[name] || [0, 0, 0];
-      return m(res[0], res[1], res[2]);
-    }
-  }
-
-  var lookupColors = {
-    aqua:[0,255,255],
-    azure:[240,255,255],
-    beige:[245,245,220],
-    black:[0,0,0],
-    blue:[0,0,255],
-    brown:[165,42,42],
-    cyan:[0,255,255],
-    darkblue:[0,0,139],
-    darkcyan:[0,139,139],
-    darkgrey:[169,169,169],
-    darkgreen:[0,100,0],
-    darkkhaki:[189,183,107],
-    darkmagenta:[139,0,139],
-    darkolivegreen:[85,107,47],
-    darkorange:[255,140,0],
-    darkorchid:[153,50,204],
-    darkred:[139,0,0],
-    darksalmon:[233,150,122],
-    darkviolet:[148,0,211],
-    fuchsia:[255,0,255],
-    gold:[255,215,0],
-    green:[0,128,0],
-    indigo:[75,0,130],
-    khaki:[240,230,140],
-    lightblue:[173,216,230],
-    lightcyan:[224,255,255],
-    lightgreen:[144,238,144],
-    lightgrey:[211,211,211],
-    lightpink:[255,182,193],
-    lightyellow:[255,255,224],
-    lime:[0,255,0],
-    magenta:[255,0,255],
-    maroon:[128,0,0],
-    navy:[0,0,128],
-    olive:[128,128,0],
-    orange:[255,165,0],
-    pink:[255,192,203],
-    purple:[128,0,128],
-    violet:[128,0,128],
-    red:[255,0,0],
-    silver:[192,192,192],
-    white:[255,255,255],
-    yellow:[255,255,0]
-  };
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.crosshair.js b/ui/legacy/lib/flot/jquery.flot.crosshair.js
deleted file mode 100644
index eb12405..0000000
--- a/ui/legacy/lib/flot/jquery.flot.crosshair.js
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Flot plugin for showing crosshairs when the mouse hovers over the plot.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin supports these options:
-
-	crosshair: {
-		mode: null or "x" or "y" or "xy"
-		color: color
-		lineWidth: number
-	}
-
-Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical
-crosshair that lets you trace the values on the x axis, "y" enables a
-horizontal crosshair and "xy" enables them both. "color" is the color of the
-crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of
-the drawn lines (default is 1).
-
-The plugin also adds four public methods:
-
-  - setCrosshair( pos )
-
-    Set the position of the crosshair. Note that this is cleared if the user
-    moves the mouse. "pos" is in coordinates of the plot and should be on the
-    form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple
-    axes), which is coincidentally the same format as what you get from a
-    "plothover" event. If "pos" is null, the crosshair is cleared.
-
-  - clearCrosshair()
-
-    Clear the crosshair.
-
-  - lockCrosshair(pos)
-
-    Cause the crosshair to lock to the current location, no longer updating if
-    the user moves the mouse. Optionally supply a position (passed on to
-    setCrosshair()) to move it to.
-
-    Example usage:
-
-	var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
-	$("#graph").bind( "plothover", function ( evt, position, item ) {
-		if ( item ) {
-			// Lock the crosshair to the data point being hovered
-			myFlot.lockCrosshair({
-				x: item.datapoint[ 0 ],
-				y: item.datapoint[ 1 ]
-			});
-		} else {
-			// Return normal crosshair operation
-			myFlot.unlockCrosshair();
-		}
-	});
-
-  - unlockCrosshair()
-
-    Free the crosshair to move again after locking it.
-*/
-
-(function ($) {
-  var options = {
-    crosshair: {
-      mode: null, // one of null, "x", "y" or "xy",
-      color: "rgba(170, 0, 0, 0.80)",
-      lineWidth: 1
-    }
-  };
-
-  function init(plot) {
-    // position of crosshair in pixels
-    var crosshair = { x: -1, y: -1, locked: false };
-
-    plot.setCrosshair = function setCrosshair(pos) {
-      if (!pos)
-        crosshair.x = -1;
-      else {
-        var o = plot.p2c(pos);
-        crosshair.x = Math.max(0, Math.min(o.left, plot.width()));
-        crosshair.y = Math.max(0, Math.min(o.top, plot.height()));
-      }
-
-      plot.triggerRedrawOverlay();
-    };
-
-    plot.clearCrosshair = plot.setCrosshair; // passes null for pos
-
-    plot.lockCrosshair = function lockCrosshair(pos) {
-      if (pos)
-        plot.setCrosshair(pos);
-      crosshair.locked = true;
-    };
-
-    plot.unlockCrosshair = function unlockCrosshair() {
-      crosshair.locked = false;
-    };
-
-    function onMouseOut(e) {
-      if (crosshair.locked)
-        return;
-
-      if (crosshair.x != -1) {
-        crosshair.x = -1;
-        plot.triggerRedrawOverlay();
-      }
-    }
-
-    function onMouseMove(e) {
-      if (crosshair.locked)
-        return;
-
-      if (plot.getSelection && plot.getSelection()) {
-        crosshair.x = -1; // hide the crosshair while selecting
-        return;
-      }
-
-      var offset = plot.offset();
-      crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));
-      crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));
-      plot.triggerRedrawOverlay();
-    }
-
-    plot.hooks.bindEvents.push(function (plot, eventHolder) {
-      if (!plot.getOptions().crosshair.mode)
-        return;
-
-      eventHolder.mouseout(onMouseOut);
-      eventHolder.mousemove(onMouseMove);
-    });
-
-    plot.hooks.drawOverlay.push(function (plot, ctx) {
-      var c = plot.getOptions().crosshair;
-      if (!c.mode)
-        return;
-
-      var plotOffset = plot.getPlotOffset();
-
-      ctx.save();
-      ctx.translate(plotOffset.left, plotOffset.top);
-
-      if (crosshair.x != -1) {
-        var adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0;
-
-        ctx.strokeStyle = c.color;
-        ctx.lineWidth = c.lineWidth;
-        ctx.lineJoin = "round";
-
-        ctx.beginPath();
-        if (c.mode.indexOf("x") != -1) {
-          var drawX = Math.floor(crosshair.x) + adj;
-          ctx.moveTo(drawX, 0);
-          ctx.lineTo(drawX, plot.height());
-        }
-        if (c.mode.indexOf("y") != -1) {
-          var drawY = Math.floor(crosshair.y) + adj;
-          ctx.moveTo(0, drawY);
-          ctx.lineTo(plot.width(), drawY);
-        }
-        ctx.stroke();
-      }
-      ctx.restore();
-    });
-
-    plot.hooks.shutdown.push(function (plot, eventHolder) {
-      eventHolder.unbind("mouseout", onMouseOut);
-      eventHolder.unbind("mousemove", onMouseMove);
-    });
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: 'crosshair',
-    version: '1.0'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.fillbetween.js b/ui/legacy/lib/flot/jquery.flot.fillbetween.js
deleted file mode 100644
index c89d336..0000000
--- a/ui/legacy/lib/flot/jquery.flot.fillbetween.js
+++ /dev/null
@@ -1,226 +0,0 @@
-/* Flot plugin for computing bottoms for filled line and bar charts.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The case: you've got two series that you want to fill the area between. In Flot
-terms, you need to use one as the fill bottom of the other. You can specify the
-bottom of each data point as the third coordinate manually, or you can use this
-plugin to compute it for you.
-
-In order to name the other series, you need to give it an id, like this:
-
-	var dataset = [
-		{ data: [ ... ], id: "foo" } ,         // use default bottom
-		{ data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom
-	];
-
-	$.plot($("#placeholder"), dataset, { lines: { show: true, fill: true }});
-
-As a convenience, if the id given is a number that doesn't appear as an id in
-the series, it is interpreted as the index in the array instead (so fillBetween:
-0 can also mean the first series).
-
-Internally, the plugin modifies the datapoints in each series. For line series,
-extra data points might be inserted through interpolation. Note that at points
-where the bottom line is not defined (due to a null point or start/end of line),
-the current line will show a gap too. The algorithm comes from the
-jquery.flot.stack.js plugin, possibly some code could be shared.
-
-*/
-
-(function ( $ ) {
-
-  var options = {
-    series: {
-      fillBetween: null	// or number
-    }
-  };
-
-  function init( plot ) {
-
-    function findBottomSeries( s, allseries ) {
-
-      var i;
-
-      for ( i = 0; i < allseries.length; ++i ) {
-        if ( allseries[ i ].id === s.fillBetween ) {
-          return allseries[ i ];
-        }
-      }
-
-      if ( typeof s.fillBetween === "number" ) {
-        if ( s.fillBetween < 0 || s.fillBetween >= allseries.length ) {
-          return null;
-        }
-        return allseries[ s.fillBetween ];
-      }
-
-      return null;
-    }
-
-    function computeFillBottoms( plot, s, datapoints ) {
-
-      if ( s.fillBetween == null ) {
-        return;
-      }
-
-      var other = findBottomSeries( s, plot.getData() );
-
-      if ( !other ) {
-        return;
-      }
-
-      var ps = datapoints.pointsize,
-          points = datapoints.points,
-          otherps = other.datapoints.pointsize,
-          otherpoints = other.datapoints.points,
-          newpoints = [],
-          px, py, intery, qx, qy, bottom,
-          withlines = s.lines.show,
-          withbottom = ps > 2 && datapoints.format[2].y,
-          withsteps = withlines && s.lines.steps,
-          fromgap = true,
-          i = 0,
-          j = 0,
-          l, m;
-
-      while ( true ) {
-
-        if ( i >= points.length ) {
-          break;
-        }
-
-        l = newpoints.length;
-
-        if ( points[ i ] == null ) {
-
-          // copy gaps
-
-          for ( m = 0; m < ps; ++m ) {
-            newpoints.push( points[ i + m ] );
-          }
-
-          i += ps;
-
-        } else if ( j >= otherpoints.length ) {
-
-          // for lines, we can't use the rest of the points
-
-          if ( !withlines ) {
-            for ( m = 0; m < ps; ++m ) {
-              newpoints.push( points[ i + m ] );
-            }
-          }
-
-          i += ps;
-
-        } else if ( otherpoints[ j ] == null ) {
-
-          // oops, got a gap
-
-          for ( m = 0; m < ps; ++m ) {
-            newpoints.push( null );
-          }
-
-          fromgap = true;
-          j += otherps;
-
-        } else {
-
-          // cases where we actually got two points
-
-          px = points[ i ];
-          py = points[ i + 1 ];
-          qx = otherpoints[ j ];
-          qy = otherpoints[ j + 1 ];
-          bottom = 0;
-
-          if ( px === qx ) {
-
-            for ( m = 0; m < ps; ++m ) {
-              newpoints.push( points[ i + m ] );
-            }
-
-            //newpoints[ l + 1 ] += qy;
-            bottom = qy;
-
-            i += ps;
-            j += otherps;
-
-          } else if ( px > qx ) {
-
-            // we got past point below, might need to
-            // insert interpolated extra point
-
-            if ( withlines && i > 0 && points[ i - ps ] != null ) {
-              intery = py + ( points[ i - ps + 1 ] - py ) * ( qx - px ) / ( points[ i - ps ] - px );
-              newpoints.push( qx );
-              newpoints.push( intery );
-              for ( m = 2; m < ps; ++m ) {
-                newpoints.push( points[ i + m ] );
-              }
-              bottom = qy;
-            }
-
-            j += otherps;
-
-          } else { // px < qx
-
-            // if we come from a gap, we just skip this point
-
-            if ( fromgap && withlines ) {
-              i += ps;
-              continue;
-            }
-
-            for ( m = 0; m < ps; ++m ) {
-              newpoints.push( points[ i + m ] );
-            }
-
-            // we might be able to interpolate a point below,
-            // this can give us a better y
-
-            if ( withlines && j > 0 && otherpoints[ j - otherps ] != null ) {
-              bottom = qy + ( otherpoints[ j - otherps + 1 ] - qy ) * ( px - qx ) / ( otherpoints[ j - otherps ] - qx );
-            }
-
-            //newpoints[l + 1] += bottom;
-
-            i += ps;
-          }
-
-          fromgap = false;
-
-          if ( l !== newpoints.length && withbottom ) {
-            newpoints[ l + 2 ] = bottom;
-          }
-        }
-
-        // maintain the line steps invariant
-
-        if ( withsteps && l !== newpoints.length && l > 0 &&
-            newpoints[ l ] !== null &&
-            newpoints[ l ] !== newpoints[ l - ps ] &&
-            newpoints[ l + 1 ] !== newpoints[ l - ps + 1 ] ) {
-          for (m = 0; m < ps; ++m) {
-            newpoints[ l + ps + m ] = newpoints[ l + m ];
-          }
-          newpoints[ l + 1 ] = newpoints[ l - ps + 1 ];
-        }
-      }
-
-      datapoints.points = newpoints;
-    }
-
-    plot.hooks.processDatapoints.push( computeFillBottoms );
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: "fillbetween",
-    version: "1.0"
-  });
-
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.image.js b/ui/legacy/lib/flot/jquery.flot.image.js
deleted file mode 100644
index 3527076..0000000
--- a/ui/legacy/lib/flot/jquery.flot.image.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/* Flot plugin for plotting images.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and
-(x2, y2) are where you intend the two opposite corners of the image to end up
-in the plot. Image must be a fully loaded Javascript image (you can make one
-with new Image()). If the image is not complete, it's skipped when plotting.
-
-There are two helpers included for retrieving images. The easiest work the way
-that you put in URLs instead of images in the data, like this:
-
-	[ "myimage.png", 0, 0, 10, 10 ]
-
-Then call $.plot.image.loadData( data, options, callback ) where data and
-options are the same as you pass in to $.plot. This loads the images, replaces
-the URLs in the data with the corresponding images and calls "callback" when
-all images are loaded (or failed loading). In the callback, you can then call
-$.plot with the data set. See the included example.
-
-A more low-level helper, $.plot.image.load(urls, callback) is also included.
-Given a list of URLs, it calls callback with an object mapping from URL to
-Image object when all images are loaded or have failed loading.
-
-The plugin supports these options:
-
-	series: {
-		images: {
-			show: boolean
-			anchor: "corner" or "center"
-			alpha: [ 0, 1 ]
-		}
-	}
-
-They can be specified for a specific series:
-
-	$.plot( $("#placeholder"), [{
-		data: [ ... ],
-		images: { ... }
-	])
-
-Note that because the data format is different from usual data points, you
-can't use images with anything else in a specific data series.
-
-Setting "anchor" to "center" causes the pixels in the image to be anchored at
-the corner pixel centers inside of at the pixel corners, effectively letting
-half a pixel stick out to each side in the plot.
-
-A possible future direction could be support for tiling for large images (like
-Google Maps).
-
-*/
-
-(function ($) {
-  var options = {
-    series: {
-      images: {
-        show: false,
-        alpha: 1,
-        anchor: "corner" // or "center"
-      }
-    }
-  };
-
-  $.plot.image = {};
-
-  $.plot.image.loadDataImages = function (series, options, callback) {
-    var urls = [], points = [];
-
-    var defaultShow = options.series.images.show;
-
-    $.each(series, function (i, s) {
-      if (!(defaultShow || s.images.show))
-        return;
-
-      if (s.data)
-        s = s.data;
-
-      $.each(s, function (i, p) {
-        if (typeof p[0] == "string") {
-          urls.push(p[0]);
-          points.push(p);
-        }
-      });
-    });
-
-    $.plot.image.load(urls, function (loadedImages) {
-      $.each(points, function (i, p) {
-        var url = p[0];
-        if (loadedImages[url])
-          p[0] = loadedImages[url];
-      });
-
-      callback();
-    });
-  }
-
-  $.plot.image.load = function (urls, callback) {
-    var missing = urls.length, loaded = {};
-    if (missing == 0)
-      callback({});
-
-    $.each(urls, function (i, url) {
-      var handler = function () {
-        --missing;
-
-        loaded[url] = this;
-
-        if (missing == 0)
-          callback(loaded);
-      };
-
-      $('<img />').load(handler).error(handler).attr('src', url);
-    });
-  };
-
-  function drawSeries(plot, ctx, series) {
-    var plotOffset = plot.getPlotOffset();
-
-    if (!series.images || !series.images.show)
-      return;
-
-    var points = series.datapoints.points,
-        ps = series.datapoints.pointsize;
-
-    for (var i = 0; i < points.length; i += ps) {
-      var img = points[i],
-          x1 = points[i + 1], y1 = points[i + 2],
-          x2 = points[i + 3], y2 = points[i + 4],
-          xaxis = series.xaxis, yaxis = series.yaxis,
-          tmp;
-
-      // actually we should check img.complete, but it
-      // appears to be a somewhat unreliable indicator in
-      // IE6 (false even after load event)
-      if (!img || img.width <= 0 || img.height <= 0)
-        continue;
-
-      if (x1 > x2) {
-        tmp = x2;
-        x2 = x1;
-        x1 = tmp;
-      }
-      if (y1 > y2) {
-        tmp = y2;
-        y2 = y1;
-        y1 = tmp;
-      }
-
-      // if the anchor is at the center of the pixel, expand the
-      // image by 1/2 pixel in each direction
-      if (series.images.anchor == "center") {
-        tmp = 0.5 * (x2-x1) / (img.width - 1);
-        x1 -= tmp;
-        x2 += tmp;
-        tmp = 0.5 * (y2-y1) / (img.height - 1);
-        y1 -= tmp;
-        y2 += tmp;
-      }
-
-      // clip
-      if (x1 == x2 || y1 == y2 ||
-          x1 >= xaxis.max || x2 <= xaxis.min ||
-          y1 >= yaxis.max || y2 <= yaxis.min)
-        continue;
-
-      var sx1 = 0, sy1 = 0, sx2 = img.width, sy2 = img.height;
-      if (x1 < xaxis.min) {
-        sx1 += (sx2 - sx1) * (xaxis.min - x1) / (x2 - x1);
-        x1 = xaxis.min;
-      }
-
-      if (x2 > xaxis.max) {
-        sx2 += (sx2 - sx1) * (xaxis.max - x2) / (x2 - x1);
-        x2 = xaxis.max;
-      }
-
-      if (y1 < yaxis.min) {
-        sy2 += (sy1 - sy2) * (yaxis.min - y1) / (y2 - y1);
-        y1 = yaxis.min;
-      }
-
-      if (y2 > yaxis.max) {
-        sy1 += (sy1 - sy2) * (yaxis.max - y2) / (y2 - y1);
-        y2 = yaxis.max;
-      }
-
-      x1 = xaxis.p2c(x1);
-      x2 = xaxis.p2c(x2);
-      y1 = yaxis.p2c(y1);
-      y2 = yaxis.p2c(y2);
-
-      // the transformation may have swapped us
-      if (x1 > x2) {
-        tmp = x2;
-        x2 = x1;
-        x1 = tmp;
-      }
-      if (y1 > y2) {
-        tmp = y2;
-        y2 = y1;
-        y1 = tmp;
-      }
-
-      tmp = ctx.globalAlpha;
-      ctx.globalAlpha *= series.images.alpha;
-      ctx.drawImage(img,
-          sx1, sy1, sx2 - sx1, sy2 - sy1,
-          x1 + plotOffset.left, y1 + plotOffset.top,
-          x2 - x1, y2 - y1);
-      ctx.globalAlpha = tmp;
-    }
-  }
-
-  function processRawData(plot, series, data, datapoints) {
-    if (!series.images.show)
-      return;
-
-    // format is Image, x1, y1, x2, y2 (opposite corners)
-    datapoints.format = [
-      { required: true },
-      { x: true, number: true, required: true },
-      { y: true, number: true, required: true },
-      { x: true, number: true, required: true },
-      { y: true, number: true, required: true }
-    ];
-  }
-
-  function init(plot) {
-    plot.hooks.processRawData.push(processRawData);
-    plot.hooks.drawSeries.push(drawSeries);
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: 'image',
-    version: '1.1'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.js b/ui/legacy/lib/flot/jquery.flot.js
deleted file mode 100644
index d156da9..0000000
--- a/ui/legacy/lib/flot/jquery.flot.js
+++ /dev/null
@@ -1,3168 +0,0 @@
-/* Javascript plotting library for jQuery, version 0.8.3.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-*/
-
-// first an inline dependency, jquery.colorhelpers.js, we inline it here
-// for convenience
-
-/* Plugin for jQuery for working with colors.
- *
- * Version 1.1.
- *
- * Inspiration from jQuery color animation plugin by John Resig.
- *
- * Released under the MIT license by Ole Laursen, October 2009.
- *
- * Examples:
- *
- *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
- *   var c = $.color.extract($("#mydiv"), 'background-color');
- *   console.log(c.r, c.g, c.b, c.a);
- *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
- *
- * Note that .scale() and .add() return the same modified object
- * instead of making a new one.
- *
- * V. 1.1: Fix error handling so e.g. parsing an empty string does
- * produce a color rather than just crashing.
- */
-(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
-
-// the actual Flot code
-(function($) {
-
-  // Cache the prototype hasOwnProperty for faster access
-
-  var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-  // A shim to provide 'detach' to jQuery versions prior to 1.4.  Using a DOM
-  // operation produces the same effect as detach, i.e. removing the element
-  // without touching its jQuery data.
-
-  // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.
-
-  if (!$.fn.detach) {
-    $.fn.detach = function() {
-      return this.each(function() {
-        if (this.parentNode) {
-          this.parentNode.removeChild( this );
-        }
-      });
-    };
-  }
-
-  ///////////////////////////////////////////////////////////////////////////
-  // The Canvas object is a wrapper around an HTML5 <canvas> tag.
-  //
-  // @constructor
-  // @param {string} cls List of classes to apply to the canvas.
-  // @param {element} container Element onto which to append the canvas.
-  //
-  // Requiring a container is a little iffy, but unfortunately canvas
-  // operations don't work unless the canvas is attached to the DOM.
-
-  function Canvas(cls, container) {
-
-    var element = container.children("." + cls)[0];
-
-    if (element == null) {
-
-      element = document.createElement("canvas");
-      element.className = cls;
-
-      $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 })
-          .appendTo(container);
-
-      // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas
-
-      if (!element.getContext) {
-        if (window.G_vmlCanvasManager) {
-          element = window.G_vmlCanvasManager.initElement(element);
-        } else {
-          throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
-        }
-      }
-    }
-
-    this.element = element;
-
-    var context = this.context = element.getContext("2d");
-
-    // Determine the screen's ratio of physical to device-independent
-    // pixels.  This is the ratio between the canvas width that the browser
-    // advertises and the number of pixels actually present in that space.
-
-    // The iPhone 4, for example, has a device-independent width of 320px,
-    // but its screen is actually 640px wide.  It therefore has a pixel
-    // ratio of 2, while most normal devices have a ratio of 1.
-
-    var devicePixelRatio = window.devicePixelRatio || 1,
-        backingStoreRatio =
-            context.webkitBackingStorePixelRatio ||
-            context.mozBackingStorePixelRatio ||
-            context.msBackingStorePixelRatio ||
-            context.oBackingStorePixelRatio ||
-            context.backingStorePixelRatio || 1;
-
-    this.pixelRatio = devicePixelRatio / backingStoreRatio;
-
-    // Size the canvas to match the internal dimensions of its container
-
-    this.resize(container.width(), container.height());
-
-    // Collection of HTML div layers for text overlaid onto the canvas
-
-    this.textContainer = null;
-    this.text = {};
-
-    // Cache of text fragments and metrics, so we can avoid expensively
-    // re-calculating them when the plot is re-rendered in a loop.
-
-    this._textCache = {};
-  }
-
-  // Resizes the canvas to the given dimensions.
-  //
-  // @param {number} width New width of the canvas, in pixels.
-  // @param {number} width New height of the canvas, in pixels.
-
-  Canvas.prototype.resize = function(width, height) {
-
-    if (width <= 0 || height <= 0) {
-      throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
-    }
-
-    var element = this.element,
-        context = this.context,
-        pixelRatio = this.pixelRatio;
-
-    // Resize the canvas, increasing its density based on the display's
-    // pixel ratio; basically giving it more pixels without increasing the
-    // size of its element, to take advantage of the fact that retina
-    // displays have that many more pixels in the same advertised space.
-
-    // Resizing should reset the state (excanvas seems to be buggy though)
-
-    if (this.width != width) {
-      element.width = width * pixelRatio;
-      element.style.width = width + "px";
-      this.width = width;
-    }
-
-    if (this.height != height) {
-      element.height = height * pixelRatio;
-      element.style.height = height + "px";
-      this.height = height;
-    }
-
-    // Save the context, so we can reset in case we get replotted.  The
-    // restore ensure that we're really back at the initial state, and
-    // should be safe even if we haven't saved the initial state yet.
-
-    context.restore();
-    context.save();
-
-    // Scale the coordinate space to match the display density; so even though we
-    // may have twice as many pixels, we still want lines and other drawing to
-    // appear at the same size; the extra pixels will just make them crisper.
-
-    context.scale(pixelRatio, pixelRatio);
-  };
-
-  // Clears the entire canvas area, not including any overlaid HTML text
-
-  Canvas.prototype.clear = function() {
-    this.context.clearRect(0, 0, this.width, this.height);
-  };
-
-  // Finishes rendering the canvas, including managing the text overlay.
-
-  Canvas.prototype.render = function() {
-
-    var cache = this._textCache;
-
-    // For each text layer, add elements marked as active that haven't
-    // already been rendered, and remove those that are no longer active.
-
-    for (var layerKey in cache) {
-      if (hasOwnProperty.call(cache, layerKey)) {
-
-        var layer = this.getTextLayer(layerKey),
-            layerCache = cache[layerKey];
-
-        layer.hide();
-
-        for (var styleKey in layerCache) {
-          if (hasOwnProperty.call(layerCache, styleKey)) {
-            var styleCache = layerCache[styleKey];
-            for (var key in styleCache) {
-              if (hasOwnProperty.call(styleCache, key)) {
-
-                var positions = styleCache[key].positions;
-
-                for (var i = 0, position; position = positions[i]; i++) {
-                  if (position.active) {
-                    if (!position.rendered) {
-                      layer.append(position.element);
-                      position.rendered = true;
-                    }
-                  } else {
-                    positions.splice(i--, 1);
-                    if (position.rendered) {
-                      position.element.detach();
-                    }
-                  }
-                }
-
-                if (positions.length == 0) {
-                  delete styleCache[key];
-                }
-              }
-            }
-          }
-        }
-
-        layer.show();
-      }
-    }
-  };
-
-  // Creates (if necessary) and returns the text overlay container.
-  //
-  // @param {string} classes String of space-separated CSS classes used to
-  //     uniquely identify the text layer.
-  // @return {object} The jQuery-wrapped text-layer div.
-
-  Canvas.prototype.getTextLayer = function(classes) {
-
-    var layer = this.text[classes];
-
-    // Create the text layer if it doesn't exist
-
-    if (layer == null) {
-
-      // Create the text layer container, if it doesn't exist
-
-      if (this.textContainer == null) {
-        this.textContainer = $("<div class='flot-text'></div>")
-            .css({
-              position: "absolute",
-              top: 0,
-              left: 0,
-              bottom: 0,
-              right: 0,
-              'font-size': "smaller",
-              color: "#545454"
-            })
-            .insertAfter(this.element);
-      }
-
-      layer = this.text[classes] = $("<div></div>")
-          .addClass(classes)
-          .css({
-            position: "absolute",
-            top: 0,
-            left: 0,
-            bottom: 0,
-            right: 0
-          })
-          .appendTo(this.textContainer);
-    }
-
-    return layer;
-  };
-
-  // Creates (if necessary) and returns a text info object.
-  //
-  // The object looks like this:
-  //
-  // {
-  //     width: Width of the text's wrapper div.
-  //     height: Height of the text's wrapper div.
-  //     element: The jQuery-wrapped HTML div containing the text.
-  //     positions: Array of positions at which this text is drawn.
-  // }
-  //
-  // The positions array contains objects that look like this:
-  //
-  // {
-  //     active: Flag indicating whether the text should be visible.
-  //     rendered: Flag indicating whether the text is currently visible.
-  //     element: The jQuery-wrapped HTML div containing the text.
-  //     x: X coordinate at which to draw the text.
-  //     y: Y coordinate at which to draw the text.
-  // }
-  //
-  // Each position after the first receives a clone of the original element.
-  //
-  // The idea is that that the width, height, and general 'identity' of the
-  // text is constant no matter where it is placed; the placements are a
-  // secondary property.
-  //
-  // Canvas maintains a cache of recently-used text info objects; getTextInfo
-  // either returns the cached element or creates a new entry.
-  //
-  // @param {string} layer A string of space-separated CSS classes uniquely
-  //     identifying the layer containing this text.
-  // @param {string} text Text string to retrieve info for.
-  // @param {(string|object)=} font Either a string of space-separated CSS
-  //     classes or a font-spec object, defining the text's font and style.
-  // @param {number=} angle Angle at which to rotate the text, in degrees.
-  //     Angle is currently unused, it will be implemented in the future.
-  // @param {number=} width Maximum width of the text before it wraps.
-  // @return {object} a text info object.
-
-  Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
-
-    var textStyle, layerCache, styleCache, info;
-
-    // Cast the value to a string, in case we were given a number or such
-
-    text = "" + text;
-
-    // If the font is a font-spec object, generate a CSS font definition
-
-    if (typeof font === "object") {
-      textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family;
-    } else {
-      textStyle = font;
-    }
-
-    // Retrieve (or create) the cache for the text's layer and styles
-
-    layerCache = this._textCache[layer];
-
-    if (layerCache == null) {
-      layerCache = this._textCache[layer] = {};
-    }
-
-    styleCache = layerCache[textStyle];
-
-    if (styleCache == null) {
-      styleCache = layerCache[textStyle] = {};
-    }
-
-    info = styleCache[text];
-
-    // If we can't find a matching element in our cache, create a new one
-
-    if (info == null) {
-
-      var element = $("<div></div>").html(text)
-          .css({
-            position: "absolute",
-            'max-width': width,
-            top: -9999
-          })
-          .appendTo(this.getTextLayer(layer));
-
-      if (typeof font === "object") {
-        element.css({
-          font: textStyle,
-          color: font.color
-        });
-      } else if (typeof font === "string") {
-        element.addClass(font);
-      }
-
-      info = styleCache[text] = {
-        width: element.outerWidth(true),
-        height: element.outerHeight(true),
-        element: element,
-        positions: []
-      };
-
-      element.detach();
-    }
-
-    return info;
-  };
-
-  // Adds a text string to the canvas text overlay.
-  //
-  // The text isn't drawn immediately; it is marked as rendering, which will
-  // result in its addition to the canvas on the next render pass.
-  //
-  // @param {string} layer A string of space-separated CSS classes uniquely
-  //     identifying the layer containing this text.
-  // @param {number} x X coordinate at which to draw the text.
-  // @param {number} y Y coordinate at which to draw the text.
-  // @param {string} text Text string to draw.
-  // @param {(string|object)=} font Either a string of space-separated CSS
-  //     classes or a font-spec object, defining the text's font and style.
-  // @param {number=} angle Angle at which to rotate the text, in degrees.
-  //     Angle is currently unused, it will be implemented in the future.
-  // @param {number=} width Maximum width of the text before it wraps.
-  // @param {string=} halign Horizontal alignment of the text; either "left",
-  //     "center" or "right".
-  // @param {string=} valign Vertical alignment of the text; either "top",
-  //     "middle" or "bottom".
-
-  Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
-
-    var info = this.getTextInfo(layer, text, font, angle, width),
-        positions = info.positions;
-
-    // Tweak the div's position to match the text's alignment
-
-    if (halign == "center") {
-      x -= info.width / 2;
-    } else if (halign == "right") {
-      x -= info.width;
-    }
-
-    if (valign == "middle") {
-      y -= info.height / 2;
-    } else if (valign == "bottom") {
-      y -= info.height;
-    }
-
-    // Determine whether this text already exists at this position.
-    // If so, mark it for inclusion in the next render pass.
-
-    for (var i = 0, position; position = positions[i]; i++) {
-      if (position.x == x && position.y == y) {
-        position.active = true;
-        return;
-      }
-    }
-
-    // If the text doesn't exist at this position, create a new entry
-
-    // For the very first position we'll re-use the original element,
-    // while for subsequent ones we'll clone it.
-
-    position = {
-      active: true,
-      rendered: false,
-      element: positions.length ? info.element.clone() : info.element,
-      x: x,
-      y: y
-    };
-
-    positions.push(position);
-
-    // Move the element to its final position within the container
-
-    position.element.css({
-      top: Math.round(y),
-      left: Math.round(x),
-      'text-align': halign	// In case the text wraps
-    });
-  };
-
-  // Removes one or more text strings from the canvas text overlay.
-  //
-  // If no parameters are given, all text within the layer is removed.
-  //
-  // Note that the text is not immediately removed; it is simply marked as
-  // inactive, which will result in its removal on the next render pass.
-  // This avoids the performance penalty for 'clear and redraw' behavior,
-  // where we potentially get rid of all text on a layer, but will likely
-  // add back most or all of it later, as when redrawing axes, for example.
-  //
-  // @param {string} layer A string of space-separated CSS classes uniquely
-  //     identifying the layer containing this text.
-  // @param {number=} x X coordinate of the text.
-  // @param {number=} y Y coordinate of the text.
-  // @param {string=} text Text string to remove.
-  // @param {(string|object)=} font Either a string of space-separated CSS
-  //     classes or a font-spec object, defining the text's font and style.
-  // @param {number=} angle Angle at which the text is rotated, in degrees.
-  //     Angle is currently unused, it will be implemented in the future.
-
-  Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
-    if (text == null) {
-      var layerCache = this._textCache[layer];
-      if (layerCache != null) {
-        for (var styleKey in layerCache) {
-          if (hasOwnProperty.call(layerCache, styleKey)) {
-            var styleCache = layerCache[styleKey];
-            for (var key in styleCache) {
-              if (hasOwnProperty.call(styleCache, key)) {
-                var positions = styleCache[key].positions;
-                for (var i = 0, position; position = positions[i]; i++) {
-                  position.active = false;
-                }
-              }
-            }
-          }
-        }
-      }
-    } else {
-      var positions = this.getTextInfo(layer, text, font, angle).positions;
-      for (var i = 0, position; position = positions[i]; i++) {
-        if (position.x == x && position.y == y) {
-          position.active = false;
-        }
-      }
-    }
-  };
-
-  ///////////////////////////////////////////////////////////////////////////
-  // The top-level container for the entire plot.
-
-  function Plot(placeholder, data_, options_, plugins) {
-    // data is on the form:
-    //   [ series1, series2 ... ]
-    // where series is either just the data as [ [x1, y1], [x2, y2], ... ]
-    // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
-
-    var series = [],
-        options = {
-          // the color theme used for graphs
-          colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
-          legend: {
-            show: true,
-            noColumns: 1, // number of colums in legend table
-            labelFormatter: null, // fn: string -> string
-            labelBoxBorderColor: "#ccc", // border color for the little label boxes
-            container: null, // container (as jQuery object) to put legend in, null means default on top of graph
-            position: "ne", // position of default legend container within plot
-            margin: 5, // distance from grid edge to default legend container within plot
-            backgroundColor: null, // null means auto-detect
-            backgroundOpacity: 0.85, // set to 0 to avoid background
-            sorted: null    // default to no legend sorting
-          },
-          xaxis: {
-            show: null, // null = auto-detect, true = always, false = never
-            position: "bottom", // or "top"
-            mode: null, // null or "time"
-            font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
-            color: null, // base color, labels, ticks
-            tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
-            transform: null, // null or f: number -> number to transform axis
-            inverseTransform: null, // if transform is set, this should be the inverse function
-            min: null, // min. value to show, null means set automatically
-            max: null, // max. value to show, null means set automatically
-            autoscaleMargin: null, // margin in % to add if auto-setting min/max
-            ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
-            tickFormatter: null, // fn: number -> string
-            labelWidth: null, // size of tick labels in pixels
-            labelHeight: null,
-            reserveSpace: null, // whether to reserve space even if axis isn't shown
-            tickLength: null, // size in pixels of ticks, or "full" for whole line
-            alignTicksWithAxis: null, // axis number or null for no sync
-            tickDecimals: null, // no. of decimals, null means auto
-            tickSize: null, // number or [number, "unit"]
-            minTickSize: null // number or [number, "unit"]
-          },
-          yaxis: {
-            autoscaleMargin: 0.02,
-            position: "left" // or "right"
-          },
-          xaxes: [],
-          yaxes: [],
-          series: {
-            points: {
-              show: false,
-              radius: 3,
-              lineWidth: 2, // in pixels
-              fill: true,
-              fillColor: "#ffffff",
-              symbol: "circle" // or callback
-            },
-            lines: {
-              // we don't put in show: false so we can see
-              // whether lines were actively disabled
-              lineWidth: 2, // in pixels
-              fill: false,
-              fillColor: null,
-              steps: false
-              // Omit 'zero', so we can later default its value to
-              // match that of the 'fill' option.
-            },
-            bars: {
-              show: false,
-              lineWidth: 2, // in pixels
-              barWidth: 1, // in units of the x axis
-              fill: true,
-              fillColor: null,
-              align: "left", // "left", "right", or "center"
-              horizontal: false,
-              zero: true
-            },
-            shadowSize: 3,
-            highlightColor: null
-          },
-          grid: {
-            show: true,
-            aboveData: false,
-            color: "#545454", // primary color used for outline and labels
-            backgroundColor: null, // null for transparent, else color
-            borderColor: null, // set if different from the grid color
-            tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
-            margin: 0, // distance from the canvas edge to the grid
-            labelMargin: 5, // in pixels
-            axisMargin: 8, // in pixels
-            borderWidth: 2, // in pixels
-            minBorderMargin: null, // in pixels, null means taken from points radius
-            markings: null, // array of ranges or fn: axes -> array of ranges
-            markingsColor: "#f4f4f4",
-            markingsLineWidth: 2,
-            // interactive stuff
-            clickable: false,
-            hoverable: false,
-            autoHighlight: true, // highlight in case mouse is near
-            mouseActiveRadius: 10 // how far the mouse can be away to activate an item
-          },
-          interaction: {
-            redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
-          },
-          hooks: {}
-        },
-        surface = null,     // the canvas for the plot itself
-        overlay = null,     // canvas for interactive stuff on top of plot
-        eventHolder = null, // jQuery object that events should be bound to
-        ctx = null, octx = null,
-        xaxes = [], yaxes = [],
-        plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
-        plotWidth = 0, plotHeight = 0,
-        hooks = {
-          processOptions: [],
-          processRawData: [],
-          processDatapoints: [],
-          processOffset: [],
-          drawBackground: [],
-          drawSeries: [],
-          draw: [],
-          bindEvents: [],
-          drawOverlay: [],
-          shutdown: []
-        },
-        plot = this;
-
-    // public functions
-    plot.setData = setData;
-    plot.setupGrid = setupGrid;
-    plot.draw = draw;
-    plot.getPlaceholder = function() { return placeholder; };
-    plot.getCanvas = function() { return surface.element; };
-    plot.getPlotOffset = function() { return plotOffset; };
-    plot.width = function () { return plotWidth; };
-    plot.height = function () { return plotHeight; };
-    plot.offset = function () {
-      var o = eventHolder.offset();
-      o.left += plotOffset.left;
-      o.top += plotOffset.top;
-      return o;
-    };
-    plot.getData = function () { return series; };
-    plot.getAxes = function () {
-      var res = {}, i;
-      $.each(xaxes.concat(yaxes), function (_, axis) {
-        if (axis)
-          res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;
-      });
-      return res;
-    };
-    plot.getXAxes = function () { return xaxes; };
-    plot.getYAxes = function () { return yaxes; };
-    plot.c2p = canvasToAxisCoords;
-    plot.p2c = axisToCanvasCoords;
-    plot.getOptions = function () { return options; };
-    plot.highlight = highlight;
-    plot.unhighlight = unhighlight;
-    plot.triggerRedrawOverlay = triggerRedrawOverlay;
-    plot.pointOffset = function(point) {
-      return {
-        left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
-        top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
-      };
-    };
-    plot.shutdown = shutdown;
-    plot.destroy = function () {
-      shutdown();
-      placeholder.removeData("plot").empty();
-
-      series = [];
-      options = null;
-      surface = null;
-      overlay = null;
-      eventHolder = null;
-      ctx = null;
-      octx = null;
-      xaxes = [];
-      yaxes = [];
-      hooks = null;
-      highlights = [];
-      plot = null;
-    };
-    plot.resize = function () {
-      var width = placeholder.width(),
-          height = placeholder.height();
-      surface.resize(width, height);
-      overlay.resize(width, height);
-    };
-
-    // public attributes
-    plot.hooks = hooks;
-
-    // initialize
-    initPlugins(plot);
-    parseOptions(options_);
-    setupCanvases();
-    setData(data_);
-    setupGrid();
-    draw();
-    bindEvents();
-
-
-    function executeHooks(hook, args) {
-      args = [plot].concat(args);
-      for (var i = 0; i < hook.length; ++i)
-        hook[i].apply(this, args);
-    }
-
-    function initPlugins() {
-
-      // References to key classes, allowing plugins to modify them
-
-      var classes = {
-        Canvas: Canvas
-      };
-
-      for (var i = 0; i < plugins.length; ++i) {
-        var p = plugins[i];
-        p.init(plot, classes);
-        if (p.options)
-          $.extend(true, options, p.options);
-      }
-    }
-
-    function parseOptions(opts) {
-
-      $.extend(true, options, opts);
-
-      // $.extend merges arrays, rather than replacing them.  When less
-      // colors are provided than the size of the default palette, we
-      // end up with those colors plus the remaining defaults, which is
-      // not expected behavior; avoid it by replacing them here.
-
-      if (opts && opts.colors) {
-        options.colors = opts.colors;
-      }
-
-      if (options.xaxis.color == null)
-        options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
-      if (options.yaxis.color == null)
-        options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
-
-      if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility
-        options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;
-      if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility
-        options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;
-
-      if (options.grid.borderColor == null)
-        options.grid.borderColor = options.grid.color;
-      if (options.grid.tickColor == null)
-        options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();
-
-      // Fill in defaults for axis options, including any unspecified
-      // font-spec fields, if a font-spec was provided.
-
-      // If no x/y axis options were provided, create one of each anyway,
-      // since the rest of the code assumes that they exist.
-
-      var i, axisOptions, axisCount,
-          fontSize = placeholder.css("font-size"),
-          fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13,
-          fontDefaults = {
-            style: placeholder.css("font-style"),
-            size: Math.round(0.8 * fontSizeDefault),
-            variant: placeholder.css("font-variant"),
-            weight: placeholder.css("font-weight"),
-            family: placeholder.css("font-family")
-          };
-
-      axisCount = options.xaxes.length || 1;
-      for (i = 0; i < axisCount; ++i) {
-
-        axisOptions = options.xaxes[i];
-        if (axisOptions && !axisOptions.tickColor) {
-          axisOptions.tickColor = axisOptions.color;
-        }
-
-        axisOptions = $.extend(true, {}, options.xaxis, axisOptions);
-        options.xaxes[i] = axisOptions;
-
-        if (axisOptions.font) {
-          axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
-          if (!axisOptions.font.color) {
-            axisOptions.font.color = axisOptions.color;
-          }
-          if (!axisOptions.font.lineHeight) {
-            axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
-          }
-        }
-      }
-
-      axisCount = options.yaxes.length || 1;
-      for (i = 0; i < axisCount; ++i) {
-
-        axisOptions = options.yaxes[i];
-        if (axisOptions && !axisOptions.tickColor) {
-          axisOptions.tickColor = axisOptions.color;
-        }
-
-        axisOptions = $.extend(true, {}, options.yaxis, axisOptions);
-        options.yaxes[i] = axisOptions;
-
-        if (axisOptions.font) {
-          axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
-          if (!axisOptions.font.color) {
-            axisOptions.font.color = axisOptions.color;
-          }
-          if (!axisOptions.font.lineHeight) {
-            axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
-          }
-        }
-      }
-
-      // backwards compatibility, to be removed in future
-      if (options.xaxis.noTicks && options.xaxis.ticks == null)
-        options.xaxis.ticks = options.xaxis.noTicks;
-      if (options.yaxis.noTicks && options.yaxis.ticks == null)
-        options.yaxis.ticks = options.yaxis.noTicks;
-      if (options.x2axis) {
-        options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);
-        options.xaxes[1].position = "top";
-        // Override the inherit to allow the axis to auto-scale
-        if (options.x2axis.min == null) {
-          options.xaxes[1].min = null;
-        }
-        if (options.x2axis.max == null) {
-          options.xaxes[1].max = null;
-        }
-      }
-      if (options.y2axis) {
-        options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);
-        options.yaxes[1].position = "right";
-        // Override the inherit to allow the axis to auto-scale
-        if (options.y2axis.min == null) {
-          options.yaxes[1].min = null;
-        }
-        if (options.y2axis.max == null) {
-          options.yaxes[1].max = null;
-        }
-      }
-      if (options.grid.coloredAreas)
-        options.grid.markings = options.grid.coloredAreas;
-      if (options.grid.coloredAreasColor)
-        options.grid.markingsColor = options.grid.coloredAreasColor;
-      if (options.lines)
-        $.extend(true, options.series.lines, options.lines);
-      if (options.points)
-        $.extend(true, options.series.points, options.points);
-      if (options.bars)
-        $.extend(true, options.series.bars, options.bars);
-      if (options.shadowSize != null)
-        options.series.shadowSize = options.shadowSize;
-      if (options.highlightColor != null)
-        options.series.highlightColor = options.highlightColor;
-
-      // save options on axes for future reference
-      for (i = 0; i < options.xaxes.length; ++i)
-        getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];
-      for (i = 0; i < options.yaxes.length; ++i)
-        getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];
-
-      // add hooks from options
-      for (var n in hooks)
-        if (options.hooks[n] && options.hooks[n].length)
-          hooks[n] = hooks[n].concat(options.hooks[n]);
-
-      executeHooks(hooks.processOptions, [options]);
-    }
-
-    function setData(d) {
-      series = parseData(d);
-      fillInSeriesOptions();
-      processData();
-    }
-
-    function parseData(d) {
-      var res = [];
-      for (var i = 0; i < d.length; ++i) {
-        var s = $.extend(true, {}, options.series);
-
-        if (d[i].data != null) {
-          s.data = d[i].data; // move the data instead of deep-copy
-          delete d[i].data;
-
-          $.extend(true, s, d[i]);
-
-          d[i].data = s.data;
-        }
-        else
-          s.data = d[i];
-        res.push(s);
-      }
-
-      return res;
-    }
-
-    function axisNumber(obj, coord) {
-      var a = obj[coord + "axis"];
-      if (typeof a == "object") // if we got a real axis, extract number
-        a = a.n;
-      if (typeof a != "number")
-        a = 1; // default to first axis
-      return a;
-    }
-
-    function allAxes() {
-      // return flat array without annoying null entries
-      return $.grep(xaxes.concat(yaxes), function (a) { return a; });
-    }
-
-    function canvasToAxisCoords(pos) {
-      // return an object with x/y corresponding to all used axes
-      var res = {}, i, axis;
-      for (i = 0; i < xaxes.length; ++i) {
-        axis = xaxes[i];
-        if (axis && axis.used)
-          res["x" + axis.n] = axis.c2p(pos.left);
-      }
-
-      for (i = 0; i < yaxes.length; ++i) {
-        axis = yaxes[i];
-        if (axis && axis.used)
-          res["y" + axis.n] = axis.c2p(pos.top);
-      }
-
-      if (res.x1 !== undefined)
-        res.x = res.x1;
-      if (res.y1 !== undefined)
-        res.y = res.y1;
-
-      return res;
-    }
-
-    function axisToCanvasCoords(pos) {
-      // get canvas coords from the first pair of x/y found in pos
-      var res = {}, i, axis, key;
-
-      for (i = 0; i < xaxes.length; ++i) {
-        axis = xaxes[i];
-        if (axis && axis.used) {
-          key = "x" + axis.n;
-          if (pos[key] == null && axis.n == 1)
-            key = "x";
-
-          if (pos[key] != null) {
-            res.left = axis.p2c(pos[key]);
-            break;
-          }
-        }
-      }
-
-      for (i = 0; i < yaxes.length; ++i) {
-        axis = yaxes[i];
-        if (axis && axis.used) {
-          key = "y" + axis.n;
-          if (pos[key] == null && axis.n == 1)
-            key = "y";
-
-          if (pos[key] != null) {
-            res.top = axis.p2c(pos[key]);
-            break;
-          }
-        }
-      }
-
-      return res;
-    }
-
-    function getOrCreateAxis(axes, number) {
-      if (!axes[number - 1])
-        axes[number - 1] = {
-          n: number, // save the number for future reference
-          direction: axes == xaxes ? "x" : "y",
-          options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)
-        };
-
-      return axes[number - 1];
-    }
-
-    function fillInSeriesOptions() {
-
-      var neededColors = series.length, maxIndex = -1, i;
-
-      // Subtract the number of series that already have fixed colors or
-      // color indexes from the number that we still need to generate.
-
-      for (i = 0; i < series.length; ++i) {
-        var sc = series[i].color;
-        if (sc != null) {
-          neededColors--;
-          if (typeof sc == "number" && sc > maxIndex) {
-            maxIndex = sc;
-          }
-        }
-      }
-
-      // If any of the series have fixed color indexes, then we need to
-      // generate at least as many colors as the highest index.
-
-      if (neededColors <= maxIndex) {
-        neededColors = maxIndex + 1;
-      }
-
-      // Generate all the colors, using first the option colors and then
-      // variations on those colors once they're exhausted.
-
-      var c, colors = [], colorPool = options.colors,
-          colorPoolSize = colorPool.length, variation = 0;
-
-      for (i = 0; i < neededColors; i++) {
-
-        c = $.color.parse(colorPool[i % colorPoolSize] || "#666");
-
-        // Each time we exhaust the colors in the pool we adjust
-        // a scaling factor used to produce more variations on
-        // those colors. The factor alternates negative/positive
-        // to produce lighter/darker colors.
-
-        // Reset the variation after every few cycles, or else
-        // it will end up producing only white or black colors.
-
-        if (i % colorPoolSize == 0 && i) {
-          if (variation >= 0) {
-            if (variation < 0.5) {
-              variation = -variation - 0.2;
-            } else variation = 0;
-          } else variation = -variation;
-        }
-
-        colors[i] = c.scale('rgb', 1 + variation);
-      }
-
-      // Finalize the series options, filling in their colors
-
-      var colori = 0, s;
-      for (i = 0; i < series.length; ++i) {
-        s = series[i];
-
-        // assign colors
-        if (s.color == null) {
-          s.color = colors[colori].toString();
-          ++colori;
-        }
-        else if (typeof s.color == "number")
-          s.color = colors[s.color].toString();
-
-        // turn on lines automatically in case nothing is set
-        if (s.lines.show == null) {
-          var v, show = true;
-          for (v in s)
-            if (s[v] && s[v].show) {
-              show = false;
-              break;
-            }
-          if (show)
-            s.lines.show = true;
-        }
-
-        // If nothing was provided for lines.zero, default it to match
-        // lines.fill, since areas by default should extend to zero.
-
-        if (s.lines.zero == null) {
-          s.lines.zero = !!s.lines.fill;
-        }
-
-        // setup axes
-        s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));
-        s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));
-      }
-    }
-
-    function processData() {
-      var topSentry = Number.POSITIVE_INFINITY,
-          bottomSentry = Number.NEGATIVE_INFINITY,
-          fakeInfinity = Number.MAX_VALUE,
-          i, j, k, m, length,
-          s, points, ps, x, y, axis, val, f, p,
-          data, format;
-
-      function updateAxis(axis, min, max) {
-        if (min < axis.datamin && min != -fakeInfinity)
-          axis.datamin = min;
-        if (max > axis.datamax && max != fakeInfinity)
-          axis.datamax = max;
-      }
-
-      $.each(allAxes(), function (_, axis) {
-        // init axis
-        axis.datamin = topSentry;
-        axis.datamax = bottomSentry;
-        axis.used = false;
-      });
-
-      for (i = 0; i < series.length; ++i) {
-        s = series[i];
-        s.datapoints = { points: [] };
-
-        executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
-      }
-
-      // first pass: clean and copy data
-      for (i = 0; i < series.length; ++i) {
-        s = series[i];
-
-        data = s.data;
-        format = s.datapoints.format;
-
-        if (!format) {
-          format = [];
-          // find out how to copy
-          format.push({ x: true, number: true, required: true });
-          format.push({ y: true, number: true, required: true });
-
-          if (s.bars.show || (s.lines.show && s.lines.fill)) {
-            var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
-            format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
-            if (s.bars.horizontal) {
-              delete format[format.length - 1].y;
-              format[format.length - 1].x = true;
-            }
-          }
-
-          s.datapoints.format = format;
-        }
-
-        if (s.datapoints.pointsize != null)
-          continue; // already filled in
-
-        s.datapoints.pointsize = format.length;
-
-        ps = s.datapoints.pointsize;
-        points = s.datapoints.points;
-
-        var insertSteps = s.lines.show && s.lines.steps;
-        s.xaxis.used = s.yaxis.used = true;
-
-        for (j = k = 0; j < data.length; ++j, k += ps) {
-          p = data[j];
-
-          var nullify = p == null;
-          if (!nullify) {
-            for (m = 0; m < ps; ++m) {
-              val = p[m];
-              f = format[m];
-
-              if (f) {
-                if (f.number && val != null) {
-                  val = +val; // convert to number
-                  if (isNaN(val))
-                    val = null;
-                  else if (val == Infinity)
-                    val = fakeInfinity;
-                  else if (val == -Infinity)
-                    val = -fakeInfinity;
-                }
-
-                if (val == null) {
-                  if (f.required)
-                    nullify = true;
-
-                  if (f.defaultValue != null)
-                    val = f.defaultValue;
-                }
-              }
-
-              points[k + m] = val;
-            }
-          }
-
-          if (nullify) {
-            for (m = 0; m < ps; ++m) {
-              val = points[k + m];
-              if (val != null) {
-                f = format[m];
-                // extract min/max info
-                if (f.autoscale !== false) {
-                  if (f.x) {
-                    updateAxis(s.xaxis, val, val);
-                  }
-                  if (f.y) {
-                    updateAxis(s.yaxis, val, val);
-                  }
-                }
-              }
-              points[k + m] = null;
-            }
-          }
-          else {
-            // a little bit of line specific stuff that
-            // perhaps shouldn't be here, but lacking
-            // better means...
-            if (insertSteps && k > 0
-                && points[k - ps] != null
-                && points[k - ps] != points[k]
-                && points[k - ps + 1] != points[k + 1]) {
-              // copy the point to make room for a middle point
-              for (m = 0; m < ps; ++m)
-                points[k + ps + m] = points[k + m];
-
-              // middle point has same y
-              points[k + 1] = points[k - ps + 1];
-
-              // we've added a point, better reflect that
-              k += ps;
-            }
-          }
-        }
-      }
-
-      // give the hooks a chance to run
-      for (i = 0; i < series.length; ++i) {
-        s = series[i];
-
-        executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
-      }
-
-      // second pass: find datamax/datamin for auto-scaling
-      for (i = 0; i < series.length; ++i) {
-        s = series[i];
-        points = s.datapoints.points;
-        ps = s.datapoints.pointsize;
-        format = s.datapoints.format;
-
-        var xmin = topSentry, ymin = topSentry,
-            xmax = bottomSentry, ymax = bottomSentry;
-
-        for (j = 0; j < points.length; j += ps) {
-          if (points[j] == null)
-            continue;
-
-          for (m = 0; m < ps; ++m) {
-            val = points[j + m];
-            f = format[m];
-            if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)
-              continue;
-
-            if (f.x) {
-              if (val < xmin)
-                xmin = val;
-              if (val > xmax)
-                xmax = val;
-            }
-            if (f.y) {
-              if (val < ymin)
-                ymin = val;
-              if (val > ymax)
-                ymax = val;
-            }
-          }
-        }
-
-        if (s.bars.show) {
-          // make sure we got room for the bar on the dancing floor
-          var delta;
-
-          switch (s.bars.align) {
-            case "left":
-              delta = 0;
-              break;
-            case "right":
-              delta = -s.bars.barWidth;
-              break;
-            default:
-              delta = -s.bars.barWidth / 2;
-          }
-
-          if (s.bars.horizontal) {
-            ymin += delta;
-            ymax += delta + s.bars.barWidth;
-          }
-          else {
-            xmin += delta;
-            xmax += delta + s.bars.barWidth;
-          }
-        }
-
-        updateAxis(s.xaxis, xmin, xmax);
-        updateAxis(s.yaxis, ymin, ymax);
-      }
-
-      $.each(allAxes(), function (_, axis) {
-        if (axis.datamin == topSentry)
-          axis.datamin = null;
-        if (axis.datamax == bottomSentry)
-          axis.datamax = null;
-      });
-    }
-
-    function setupCanvases() {
-
-      // Make sure the placeholder is clear of everything except canvases
-      // from a previous plot in this container that we'll try to re-use.
-
-      placeholder.css("padding", 0) // padding messes up the positioning
-          .children().filter(function(){
-        return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base');
-      }).remove();
-
-      if (placeholder.css("position") == 'static')
-        placeholder.css("position", "relative"); // for positioning labels and overlay
-
-      surface = new Canvas("flot-base", placeholder);
-      overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features
-
-      ctx = surface.context;
-      octx = overlay.context;
-
-      // define which element we're listening for events on
-      eventHolder = $(overlay.element).unbind();
-
-      // If we're re-using a plot object, shut down the old one
-
-      var existing = placeholder.data("plot");
-
-      if (existing) {
-        existing.shutdown();
-        overlay.clear();
-      }
-
-      // save in case we get replotted
-      placeholder.data("plot", plot);
-    }
-
-    function bindEvents() {
-      // bind events
-      if (options.grid.hoverable) {
-        eventHolder.mousemove(onMouseMove);
-
-        // Use bind, rather than .mouseleave, because we officially
-        // still support jQuery 1.2.6, which doesn't define a shortcut
-        // for mouseenter or mouseleave.  This was a bug/oversight that
-        // was fixed somewhere around 1.3.x.  We can return to using
-        // .mouseleave when we drop support for 1.2.6.
-
-        eventHolder.bind("mouseleave", onMouseLeave);
-      }
-
-      if (options.grid.clickable)
-        eventHolder.click(onClick);
-
-      executeHooks(hooks.bindEvents, [eventHolder]);
-    }
-
-    function shutdown() {
-      if (redrawTimeout)
-        clearTimeout(redrawTimeout);
-
-      eventHolder.unbind("mousemove", onMouseMove);
-      eventHolder.unbind("mouseleave", onMouseLeave);
-      eventHolder.unbind("click", onClick);
-
-      executeHooks(hooks.shutdown, [eventHolder]);
-    }
-
-    function setTransformationHelpers(axis) {
-      // set helper functions on the axis, assumes plot area
-      // has been computed already
-
-      function identity(x) { return x; }
-
-      var s, m, t = axis.options.transform || identity,
-          it = axis.options.inverseTransform;
-
-      // precompute how much the axis is scaling a point
-      // in canvas space
-      if (axis.direction == "x") {
-        s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));
-        m = Math.min(t(axis.max), t(axis.min));
-      }
-      else {
-        s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));
-        s = -s;
-        m = Math.max(t(axis.max), t(axis.min));
-      }
-
-      // data point to canvas coordinate
-      if (t == identity) // slight optimization
-        axis.p2c = function (p) { return (p - m) * s; };
-      else
-        axis.p2c = function (p) { return (t(p) - m) * s; };
-      // canvas coordinate to data point
-      if (!it)
-        axis.c2p = function (c) { return m + c / s; };
-      else
-        axis.c2p = function (c) { return it(m + c / s); };
-    }
-
-    function measureTickLabels(axis) {
-
-      var opts = axis.options,
-          ticks = axis.ticks || [],
-          labelWidth = opts.labelWidth || 0,
-          labelHeight = opts.labelHeight || 0,
-          maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null),
-          legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
-          layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
-          font = opts.font || "flot-tick-label tickLabel";
-
-      for (var i = 0; i < ticks.length; ++i) {
-
-        var t = ticks[i];
-
-        if (!t.label)
-          continue;
-
-        var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);
-
-        labelWidth = Math.max(labelWidth, info.width);
-        labelHeight = Math.max(labelHeight, info.height);
-      }
-
-      axis.labelWidth = opts.labelWidth || labelWidth;
-      axis.labelHeight = opts.labelHeight || labelHeight;
-    }
-
-    function allocateAxisBoxFirstPhase(axis) {
-      // find the bounding box of the axis by looking at label
-      // widths/heights and ticks, make room by diminishing the
-      // plotOffset; this first phase only looks at one
-      // dimension per axis, the other dimension depends on the
-      // other axes so will have to wait
-
-      var lw = axis.labelWidth,
-          lh = axis.labelHeight,
-          pos = axis.options.position,
-          isXAxis = axis.direction === "x",
-          tickLength = axis.options.tickLength,
-          axisMargin = options.grid.axisMargin,
-          padding = options.grid.labelMargin,
-          innermost = true,
-          outermost = true,
-          first = true,
-          found = false;
-
-      // Determine the axis's position in its direction and on its side
-
-      $.each(isXAxis ? xaxes : yaxes, function(i, a) {
-        if (a && (a.show || a.reserveSpace)) {
-          if (a === axis) {
-            found = true;
-          } else if (a.options.position === pos) {
-            if (found) {
-              outermost = false;
-            } else {
-              innermost = false;
-            }
-          }
-          if (!found) {
-            first = false;
-          }
-        }
-      });
-
-      // The outermost axis on each side has no margin
-
-      if (outermost) {
-        axisMargin = 0;
-      }
-
-      // The ticks for the first axis in each direction stretch across
-
-      if (tickLength == null) {
-        tickLength = first ? "full" : 5;
-      }
-
-      if (!isNaN(+tickLength))
-        padding += +tickLength;
-
-      if (isXAxis) {
-        lh += padding;
-
-        if (pos == "bottom") {
-          plotOffset.bottom += lh + axisMargin;
-          axis.box = { top: surface.height - plotOffset.bottom, height: lh };
-        }
-        else {
-          axis.box = { top: plotOffset.top + axisMargin, height: lh };
-          plotOffset.top += lh + axisMargin;
-        }
-      }
-      else {
-        lw += padding;
-
-        if (pos == "left") {
-          axis.box = { left: plotOffset.left + axisMargin, width: lw };
-          plotOffset.left += lw + axisMargin;
-        }
-        else {
-          plotOffset.right += lw + axisMargin;
-          axis.box = { left: surface.width - plotOffset.right, width: lw };
-        }
-      }
-
-      // save for future reference
-      axis.position = pos;
-      axis.tickLength = tickLength;
-      axis.box.padding = padding;
-      axis.innermost = innermost;
-    }
-
-    function allocateAxisBoxSecondPhase(axis) {
-      // now that all axis boxes have been placed in one
-      // dimension, we can set the remaining dimension coordinates
-      if (axis.direction == "x") {
-        axis.box.left = plotOffset.left - axis.labelWidth / 2;
-        axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;
-      }
-      else {
-        axis.box.top = plotOffset.top - axis.labelHeight / 2;
-        axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;
-      }
-    }
-
-    function adjustLayoutForThingsStickingOut() {
-      // possibly adjust plot offset to ensure everything stays
-      // inside the canvas and isn't clipped off
-
-      var minMargin = options.grid.minBorderMargin,
-          axis, i;
-
-      // check stuff from the plot (FIXME: this should just read
-      // a value from the series, otherwise it's impossible to
-      // customize)
-      if (minMargin == null) {
-        minMargin = 0;
-        for (i = 0; i < series.length; ++i)
-          minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
-      }
-
-      var margins = {
-        left: minMargin,
-        right: minMargin,
-        top: minMargin,
-        bottom: minMargin
-      };
-
-      // check axis labels, note we don't check the actual
-      // labels but instead use the overall width/height to not
-      // jump as much around with replots
-      $.each(allAxes(), function (_, axis) {
-        if (axis.reserveSpace && axis.ticks && axis.ticks.length) {
-          if (axis.direction === "x") {
-            margins.left = Math.max(margins.left, axis.labelWidth / 2);
-            margins.right = Math.max(margins.right, axis.labelWidth / 2);
-          } else {
-            margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);
-            margins.top = Math.max(margins.top, axis.labelHeight / 2);
-          }
-        }
-      });
-
-      plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));
-      plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));
-      plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));
-      plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));
-    }
-
-    function setupGrid() {
-      var i, axes = allAxes(), showGrid = options.grid.show;
-
-      // Initialize the plot's offset from the edge of the canvas
-
-      for (var a in plotOffset) {
-        var margin = options.grid.margin || 0;
-        plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0;
-      }
-
-      executeHooks(hooks.processOffset, [plotOffset]);
-
-      // If the grid is visible, add its border width to the offset
-
-      for (var a in plotOffset) {
-        if(typeof(options.grid.borderWidth) == "object") {
-          plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
-        }
-        else {
-          plotOffset[a] += showGrid ? options.grid.borderWidth : 0;
-        }
-      }
-
-      $.each(axes, function (_, axis) {
-        var axisOpts = axis.options;
-        axis.show = axisOpts.show == null ? axis.used : axisOpts.show;
-        axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;
-        setRange(axis);
-      });
-
-      if (showGrid) {
-
-        var allocatedAxes = $.grep(axes, function (axis) {
-          return axis.show || axis.reserveSpace;
-        });
-
-        $.each(allocatedAxes, function (_, axis) {
-          // make the ticks
-          setupTickGeneration(axis);
-          setTicks(axis);
-          snapRangeToTicks(axis, axis.ticks);
-          // find labelWidth/Height for axis
-          measureTickLabels(axis);
-        });
-
-        // with all dimensions calculated, we can compute the
-        // axis bounding boxes, start from the outside
-        // (reverse order)
-        for (i = allocatedAxes.length - 1; i >= 0; --i)
-          allocateAxisBoxFirstPhase(allocatedAxes[i]);
-
-        // make sure we've got enough space for things that
-        // might stick out
-        adjustLayoutForThingsStickingOut();
-
-        $.each(allocatedAxes, function (_, axis) {
-          allocateAxisBoxSecondPhase(axis);
-        });
-      }
-
-      plotWidth = surface.width - plotOffset.left - plotOffset.right;
-      plotHeight = surface.height - plotOffset.bottom - plotOffset.top;
-
-      // now we got the proper plot dimensions, we can compute the scaling
-      $.each(axes, function (_, axis) {
-        setTransformationHelpers(axis);
-      });
-
-      if (showGrid) {
-        drawAxisLabels();
-      }
-
-      insertLegend();
-    }
-
-    function setRange(axis) {
-      var opts = axis.options,
-          min = +(opts.min != null ? opts.min : axis.datamin),
-          max = +(opts.max != null ? opts.max : axis.datamax),
-          delta = max - min;
-
-      if (delta == 0.0) {
-        // degenerate case
-        var widen = max == 0 ? 1 : 0.01;
-
-        if (opts.min == null)
-          min -= widen;
-        // always widen max if we couldn't widen min to ensure we
-        // don't fall into min == max which doesn't work
-        if (opts.max == null || opts.min != null)
-          max += widen;
-      }
-      else {
-        // consider autoscaling
-        var margin = opts.autoscaleMargin;
-        if (margin != null) {
-          if (opts.min == null) {
-            min -= delta * margin;
-            // make sure we don't go below zero if all values
-            // are positive
-            if (min < 0 && axis.datamin != null && axis.datamin >= 0)
-              min = 0;
-          }
-          if (opts.max == null) {
-            max += delta * margin;
-            if (max > 0 && axis.datamax != null && axis.datamax <= 0)
-              max = 0;
-          }
-        }
-      }
-      axis.min = min;
-      axis.max = max;
-    }
-
-    function setupTickGeneration(axis) {
-      var opts = axis.options;
-
-      // estimate number of ticks
-      var noTicks;
-      if (typeof opts.ticks == "number" && opts.ticks > 0)
-        noTicks = opts.ticks;
-      else
-      // heuristic based on the model a*sqrt(x) fitted to
-      // some data points that seemed reasonable
-        noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height);
-
-      var delta = (axis.max - axis.min) / noTicks,
-          dec = -Math.floor(Math.log(delta) / Math.LN10),
-          maxDec = opts.tickDecimals;
-
-      if (maxDec != null && dec > maxDec) {
-        dec = maxDec;
-      }
-
-      var magn = Math.pow(10, -dec),
-          norm = delta / magn, // norm is between 1.0 and 10.0
-          size;
-
-      if (norm < 1.5) {
-        size = 1;
-      } else if (norm < 3) {
-        size = 2;
-        // special case for 2.5, requires an extra decimal
-        if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
-          size = 2.5;
-          ++dec;
-        }
-      } else if (norm < 7.5) {
-        size = 5;
-      } else {
-        size = 10;
-      }
-
-      size *= magn;
-
-      if (opts.minTickSize != null && size < opts.minTickSize) {
-        size = opts.minTickSize;
-      }
-
-      axis.delta = delta;
-      axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);
-      axis.tickSize = opts.tickSize || size;
-
-      // Time mode was moved to a plug-in in 0.8, and since so many people use it
-      // we'll add an especially friendly reminder to make sure they included it.
-
-      if (opts.mode == "time" && !axis.tickGenerator) {
-        throw new Error("Time mode requires the flot.time plugin.");
-      }
-
-      // Flot supports base-10 axes; any other mode else is handled by a plug-in,
-      // like flot.time.js.
-
-      if (!axis.tickGenerator) {
-
-        axis.tickGenerator = function (axis) {
-
-          var ticks = [],
-              start = floorInBase(axis.min, axis.tickSize),
-              i = 0,
-              v = Number.NaN,
-              prev;
-
-          do {
-            prev = v;
-            v = start + i * axis.tickSize;
-            ticks.push(v);
-            ++i;
-          } while (v < axis.max && v != prev);
-          return ticks;
-        };
-
-        axis.tickFormatter = function (value, axis) {
-
-          var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;
-          var formatted = "" + Math.round(value * factor) / factor;
-
-          // If tickDecimals was specified, ensure that we have exactly that
-          // much precision; otherwise default to the value's own precision.
-
-          if (axis.tickDecimals != null) {
-            var decimal = formatted.indexOf(".");
-            var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;
-            if (precision < axis.tickDecimals) {
-              return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
-            }
-          }
-
-          return formatted;
-        };
-      }
-
-      if ($.isFunction(opts.tickFormatter))
-        axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };
-
-      if (opts.alignTicksWithAxis != null) {
-        var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];
-        if (otherAxis && otherAxis.used && otherAxis != axis) {
-          // consider snapping min/max to outermost nice ticks
-          var niceTicks = axis.tickGenerator(axis);
-          if (niceTicks.length > 0) {
-            if (opts.min == null)
-              axis.min = Math.min(axis.min, niceTicks[0]);
-            if (opts.max == null && niceTicks.length > 1)
-              axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);
-          }
-
-          axis.tickGenerator = function (axis) {
-            // copy ticks, scaled to this axis
-            var ticks = [], v, i;
-            for (i = 0; i < otherAxis.ticks.length; ++i) {
-              v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);
-              v = axis.min + v * (axis.max - axis.min);
-              ticks.push(v);
-            }
-            return ticks;
-          };
-
-          // we might need an extra decimal since forced
-          // ticks don't necessarily fit naturally
-          if (!axis.mode && opts.tickDecimals == null) {
-            var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),
-                ts = axis.tickGenerator(axis);
-
-            // only proceed if the tick interval rounded
-            // with an extra decimal doesn't give us a
-            // zero at end
-            if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))
-              axis.tickDecimals = extraDec;
-          }
-        }
-      }
-    }
-
-    function setTicks(axis) {
-      var oticks = axis.options.ticks, ticks = [];
-      if (oticks == null || (typeof oticks == "number" && oticks > 0))
-        ticks = axis.tickGenerator(axis);
-      else if (oticks) {
-        if ($.isFunction(oticks))
-        // generate the ticks
-          ticks = oticks(axis);
-        else
-          ticks = oticks;
-      }
-
-      // clean up/labelify the supplied ticks, copy them over
-      var i, v;
-      axis.ticks = [];
-      for (i = 0; i < ticks.length; ++i) {
-        var label = null;
-        var t = ticks[i];
-        if (typeof t == "object") {
-          v = +t[0];
-          if (t.length > 1)
-            label = t[1];
-        }
-        else
-          v = +t;
-        if (label == null)
-          label = axis.tickFormatter(v, axis);
-        if (!isNaN(v))
-          axis.ticks.push({ v: v, label: label });
-      }
-    }
-
-    function snapRangeToTicks(axis, ticks) {
-      if (axis.options.autoscaleMargin && ticks.length > 0) {
-        // snap to ticks
-        if (axis.options.min == null)
-          axis.min = Math.min(axis.min, ticks[0].v);
-        if (axis.options.max == null && ticks.length > 1)
-          axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);
-      }
-    }
-
-    function draw() {
-
-      surface.clear();
-
-      executeHooks(hooks.drawBackground, [ctx]);
-
-      var grid = options.grid;
-
-      // draw background, if any
-      if (grid.show && grid.backgroundColor)
-        drawBackground();
-
-      if (grid.show && !grid.aboveData) {
-        drawGrid();
-      }
-
-      for (var i = 0; i < series.length; ++i) {
-        executeHooks(hooks.drawSeries, [ctx, series[i]]);
-        drawSeries(series[i]);
-      }
-
-      executeHooks(hooks.draw, [ctx]);
-
-      if (grid.show && grid.aboveData) {
-        drawGrid();
-      }
-
-      surface.render();
-
-      // A draw implies that either the axes or data have changed, so we
-      // should probably update the overlay highlights as well.
-
-      triggerRedrawOverlay();
-    }
-
-    function extractRange(ranges, coord) {
-      var axis, from, to, key, axes = allAxes();
-
-      for (var i = 0; i < axes.length; ++i) {
-        axis = axes[i];
-        if (axis.direction == coord) {
-          key = coord + axis.n + "axis";
-          if (!ranges[key] && axis.n == 1)
-            key = coord + "axis"; // support x1axis as xaxis
-          if (ranges[key]) {
-            from = ranges[key].from;
-            to = ranges[key].to;
-            break;
-          }
-        }
-      }
-
-      // backwards-compat stuff - to be removed in future
-      if (!ranges[key]) {
-        axis = coord == "x" ? xaxes[0] : yaxes[0];
-        from = ranges[coord + "1"];
-        to = ranges[coord + "2"];
-      }
-
-      // auto-reverse as an added bonus
-      if (from != null && to != null && from > to) {
-        var tmp = from;
-        from = to;
-        to = tmp;
-      }
-
-      return { from: from, to: to, axis: axis };
-    }
-
-    function drawBackground() {
-      ctx.save();
-      ctx.translate(plotOffset.left, plotOffset.top);
-
-      ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
-      ctx.fillRect(0, 0, plotWidth, plotHeight);
-      ctx.restore();
-    }
-
-    function drawGrid() {
-      var i, axes, bw, bc;
-
-      ctx.save();
-      ctx.translate(plotOffset.left, plotOffset.top);
-
-      // draw markings
-      var markings = options.grid.markings;
-      if (markings) {
-        if ($.isFunction(markings)) {
-          axes = plot.getAxes();
-          // xmin etc. is backwards compatibility, to be
-          // removed in the future
-          axes.xmin = axes.xaxis.min;
-          axes.xmax = axes.xaxis.max;
-          axes.ymin = axes.yaxis.min;
-          axes.ymax = axes.yaxis.max;
-
-          markings = markings(axes);
-        }
-
-        for (i = 0; i < markings.length; ++i) {
-          var m = markings[i],
-              xrange = extractRange(m, "x"),
-              yrange = extractRange(m, "y");
-
-          // fill in missing
-          if (xrange.from == null)
-            xrange.from = xrange.axis.min;
-          if (xrange.to == null)
-            xrange.to = xrange.axis.max;
-          if (yrange.from == null)
-            yrange.from = yrange.axis.min;
-          if (yrange.to == null)
-            yrange.to = yrange.axis.max;
-
-          // clip
-          if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
-              yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
-            continue;
-
-          xrange.from = Math.max(xrange.from, xrange.axis.min);
-          xrange.to = Math.min(xrange.to, xrange.axis.max);
-          yrange.from = Math.max(yrange.from, yrange.axis.min);
-          yrange.to = Math.min(yrange.to, yrange.axis.max);
-
-          var xequal = xrange.from === xrange.to,
-              yequal = yrange.from === yrange.to;
-
-          if (xequal && yequal) {
-            continue;
-          }
-
-          // then draw
-          xrange.from = Math.floor(xrange.axis.p2c(xrange.from));
-          xrange.to = Math.floor(xrange.axis.p2c(xrange.to));
-          yrange.from = Math.floor(yrange.axis.p2c(yrange.from));
-          yrange.to = Math.floor(yrange.axis.p2c(yrange.to));
-
-          if (xequal || yequal) {
-            var lineWidth = m.lineWidth || options.grid.markingsLineWidth,
-                subPixel = lineWidth % 2 ? 0.5 : 0;
-            ctx.beginPath();
-            ctx.strokeStyle = m.color || options.grid.markingsColor;
-            ctx.lineWidth = lineWidth;
-            if (xequal) {
-              ctx.moveTo(xrange.to + subPixel, yrange.from);
-              ctx.lineTo(xrange.to + subPixel, yrange.to);
-            } else {
-              ctx.moveTo(xrange.from, yrange.to + subPixel);
-              ctx.lineTo(xrange.to, yrange.to + subPixel);
-            }
-            ctx.stroke();
-          } else {
-            ctx.fillStyle = m.color || options.grid.markingsColor;
-            ctx.fillRect(xrange.from, yrange.to,
-                xrange.to - xrange.from,
-                yrange.from - yrange.to);
-          }
-        }
-      }
-
-      // draw the ticks
-      axes = allAxes();
-      bw = options.grid.borderWidth;
-
-      for (var j = 0; j < axes.length; ++j) {
-        var axis = axes[j], box = axis.box,
-            t = axis.tickLength, x, y, xoff, yoff;
-        if (!axis.show || axis.ticks.length == 0)
-          continue;
-
-        ctx.lineWidth = 1;
-
-        // find the edges
-        if (axis.direction == "x") {
-          x = 0;
-          if (t == "full")
-            y = (axis.position == "top" ? 0 : plotHeight);
-          else
-            y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);
-        }
-        else {
-          y = 0;
-          if (t == "full")
-            x = (axis.position == "left" ? 0 : plotWidth);
-          else
-            x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);
-        }
-
-        // draw tick bar
-        if (!axis.innermost) {
-          ctx.strokeStyle = axis.options.color;
-          ctx.beginPath();
-          xoff = yoff = 0;
-          if (axis.direction == "x")
-            xoff = plotWidth + 1;
-          else
-            yoff = plotHeight + 1;
-
-          if (ctx.lineWidth == 1) {
-            if (axis.direction == "x") {
-              y = Math.floor(y) + 0.5;
-            } else {
-              x = Math.floor(x) + 0.5;
-            }
-          }
-
-          ctx.moveTo(x, y);
-          ctx.lineTo(x + xoff, y + yoff);
-          ctx.stroke();
-        }
-
-        // draw ticks
-
-        ctx.strokeStyle = axis.options.tickColor;
-
-        ctx.beginPath();
-        for (i = 0; i < axis.ticks.length; ++i) {
-          var v = axis.ticks[i].v;
-
-          xoff = yoff = 0;
-
-          if (isNaN(v) || v < axis.min || v > axis.max
-              // skip those lying on the axes if we got a border
-              || (t == "full"
-                  && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0)
-                  && (v == axis.min || v == axis.max)))
-            continue;
-
-          if (axis.direction == "x") {
-            x = axis.p2c(v);
-            yoff = t == "full" ? -plotHeight : t;
-
-            if (axis.position == "top")
-              yoff = -yoff;
-          }
-          else {
-            y = axis.p2c(v);
-            xoff = t == "full" ? -plotWidth : t;
-
-            if (axis.position == "left")
-              xoff = -xoff;
-          }
-
-          if (ctx.lineWidth == 1) {
-            if (axis.direction == "x")
-              x = Math.floor(x) + 0.5;
-            else
-              y = Math.floor(y) + 0.5;
-          }
-
-          ctx.moveTo(x, y);
-          ctx.lineTo(x + xoff, y + yoff);
-        }
-
-        ctx.stroke();
-      }
-
-
-      // draw border
-      if (bw) {
-        // If either borderWidth or borderColor is an object, then draw the border
-        // line by line instead of as one rectangle
-        bc = options.grid.borderColor;
-        if(typeof bw == "object" || typeof bc == "object") {
-          if (typeof bw !== "object") {
-            bw = {top: bw, right: bw, bottom: bw, left: bw};
-          }
-          if (typeof bc !== "object") {
-            bc = {top: bc, right: bc, bottom: bc, left: bc};
-          }
-
-          if (bw.top > 0) {
-            ctx.strokeStyle = bc.top;
-            ctx.lineWidth = bw.top;
-            ctx.beginPath();
-            ctx.moveTo(0 - bw.left, 0 - bw.top/2);
-            ctx.lineTo(plotWidth, 0 - bw.top/2);
-            ctx.stroke();
-          }
-
-          if (bw.right > 0) {
-            ctx.strokeStyle = bc.right;
-            ctx.lineWidth = bw.right;
-            ctx.beginPath();
-            ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);
-            ctx.lineTo(plotWidth + bw.right / 2, plotHeight);
-            ctx.stroke();
-          }
-
-          if (bw.bottom > 0) {
-            ctx.strokeStyle = bc.bottom;
-            ctx.lineWidth = bw.bottom;
-            ctx.beginPath();
-            ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);
-            ctx.lineTo(0, plotHeight + bw.bottom / 2);
-            ctx.stroke();
-          }
-
-          if (bw.left > 0) {
-            ctx.strokeStyle = bc.left;
-            ctx.lineWidth = bw.left;
-            ctx.beginPath();
-            ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
-            ctx.lineTo(0- bw.left/2, 0);
-            ctx.stroke();
-          }
-        }
-        else {
-          ctx.lineWidth = bw;
-          ctx.strokeStyle = options.grid.borderColor;
-          ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
-        }
-      }
-
-      ctx.restore();
-    }
-
-    function drawAxisLabels() {
-
-      $.each(allAxes(), function (_, axis) {
-        var box = axis.box,
-            legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
-            layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
-            font = axis.options.font || "flot-tick-label tickLabel",
-            tick, x, y, halign, valign;
-
-        // Remove text before checking for axis.show and ticks.length;
-        // otherwise plugins, like flot-tickrotor, that draw their own
-        // tick labels will end up with both theirs and the defaults.
-
-        surface.removeText(layer);
-
-        if (!axis.show || axis.ticks.length == 0)
-          return;
-
-        for (var i = 0; i < axis.ticks.length; ++i) {
-
-          tick = axis.ticks[i];
-          if (!tick.label || tick.v < axis.min || tick.v > axis.max)
-            continue;
-
-          if (axis.direction == "x") {
-            halign = "center";
-            x = plotOffset.left + axis.p2c(tick.v);
-            if (axis.position == "bottom") {
-              y = box.top + box.padding;
-            } else {
-              y = box.top + box.height - box.padding;
-              valign = "bottom";
-            }
-          } else {
-            valign = "middle";
-            y = plotOffset.top + axis.p2c(tick.v);
-            if (axis.position == "left") {
-              x = box.left + box.width - box.padding;
-              halign = "right";
-            } else {
-              x = box.left + box.padding;
-            }
-          }
-
-          surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);
-        }
-      });
-    }
-
-    function drawSeries(series) {
-      if (series.lines.show)
-        drawSeriesLines(series);
-      if (series.bars.show)
-        drawSeriesBars(series);
-      if (series.points.show)
-        drawSeriesPoints(series);
-    }
-
-    function drawSeriesLines(series) {
-      function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
-        var points = datapoints.points,
-            ps = datapoints.pointsize,
-            prevx = null, prevy = null;
-
-        ctx.beginPath();
-        for (var i = ps; i < points.length; i += ps) {
-          var x1 = points[i - ps], y1 = points[i - ps + 1],
-              x2 = points[i], y2 = points[i + 1];
-
-          if (x1 == null || x2 == null)
-            continue;
-
-          // clip with ymin
-          if (y1 <= y2 && y1 < axisy.min) {
-            if (y2 < axisy.min)
-              continue;   // line segment is outside
-            // compute new intersection point
-            x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y1 = axisy.min;
-          }
-          else if (y2 <= y1 && y2 < axisy.min) {
-            if (y1 < axisy.min)
-              continue;
-            x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y2 = axisy.min;
-          }
-
-          // clip with ymax
-          if (y1 >= y2 && y1 > axisy.max) {
-            if (y2 > axisy.max)
-              continue;
-            x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y1 = axisy.max;
-          }
-          else if (y2 >= y1 && y2 > axisy.max) {
-            if (y1 > axisy.max)
-              continue;
-            x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y2 = axisy.max;
-          }
-
-          // clip with xmin
-          if (x1 <= x2 && x1 < axisx.min) {
-            if (x2 < axisx.min)
-              continue;
-            y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x1 = axisx.min;
-          }
-          else if (x2 <= x1 && x2 < axisx.min) {
-            if (x1 < axisx.min)
-              continue;
-            y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x2 = axisx.min;
-          }
-
-          // clip with xmax
-          if (x1 >= x2 && x1 > axisx.max) {
-            if (x2 > axisx.max)
-              continue;
-            y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x1 = axisx.max;
-          }
-          else if (x2 >= x1 && x2 > axisx.max) {
-            if (x1 > axisx.max)
-              continue;
-            y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x2 = axisx.max;
-          }
-
-          if (x1 != prevx || y1 != prevy)
-            ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
-
-          prevx = x2;
-          prevy = y2;
-          ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
-        }
-        ctx.stroke();
-      }
-
-      function plotLineArea(datapoints, axisx, axisy) {
-        var points = datapoints.points,
-            ps = datapoints.pointsize,
-            bottom = Math.min(Math.max(0, axisy.min), axisy.max),
-            i = 0, top, areaOpen = false,
-            ypos = 1, segmentStart = 0, segmentEnd = 0;
-
-        // we process each segment in two turns, first forward
-        // direction to sketch out top, then once we hit the
-        // end we go backwards to sketch the bottom
-        while (true) {
-          if (ps > 0 && i > points.length + ps)
-            break;
-
-          i += ps; // ps is negative if going backwards
-
-          var x1 = points[i - ps],
-              y1 = points[i - ps + ypos],
-              x2 = points[i], y2 = points[i + ypos];
-
-          if (areaOpen) {
-            if (ps > 0 && x1 != null && x2 == null) {
-              // at turning point
-              segmentEnd = i;
-              ps = -ps;
-              ypos = 2;
-              continue;
-            }
-
-            if (ps < 0 && i == segmentStart + ps) {
-              // done with the reverse sweep
-              ctx.fill();
-              areaOpen = false;
-              ps = -ps;
-              ypos = 1;
-              i = segmentStart = segmentEnd + ps;
-              continue;
-            }
-          }
-
-          if (x1 == null || x2 == null)
-            continue;
-
-          // clip x values
-
-          // clip with xmin
-          if (x1 <= x2 && x1 < axisx.min) {
-            if (x2 < axisx.min)
-              continue;
-            y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x1 = axisx.min;
-          }
-          else if (x2 <= x1 && x2 < axisx.min) {
-            if (x1 < axisx.min)
-              continue;
-            y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x2 = axisx.min;
-          }
-
-          // clip with xmax
-          if (x1 >= x2 && x1 > axisx.max) {
-            if (x2 > axisx.max)
-              continue;
-            y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x1 = axisx.max;
-          }
-          else if (x2 >= x1 && x2 > axisx.max) {
-            if (x1 > axisx.max)
-              continue;
-            y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
-            x2 = axisx.max;
-          }
-
-          if (!areaOpen) {
-            // open area
-            ctx.beginPath();
-            ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
-            areaOpen = true;
-          }
-
-          // now first check the case where both is outside
-          if (y1 >= axisy.max && y2 >= axisy.max) {
-            ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
-            ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
-            continue;
-          }
-          else if (y1 <= axisy.min && y2 <= axisy.min) {
-            ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
-            ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
-            continue;
-          }
-
-          // else it's a bit more complicated, there might
-          // be a flat maxed out rectangle first, then a
-          // triangular cutout or reverse; to find these
-          // keep track of the current x values
-          var x1old = x1, x2old = x2;
-
-          // clip the y values, without shortcutting, we
-          // go through all cases in turn
-
-          // clip with ymin
-          if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
-            x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y1 = axisy.min;
-          }
-          else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
-            x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y2 = axisy.min;
-          }
-
-          // clip with ymax
-          if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
-            x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y1 = axisy.max;
-          }
-          else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
-            x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
-            y2 = axisy.max;
-          }
-
-          // if the x value was changed we got a rectangle
-          // to fill
-          if (x1 != x1old) {
-            ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));
-            // it goes to (x1, y1), but we fill that below
-          }
-
-          // fill triangular section, this sometimes result
-          // in redundant points if (x1, y1) hasn't changed
-          // from previous line to, but we just ignore that
-          ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
-          ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
-
-          // fill the other rectangle if it's there
-          if (x2 != x2old) {
-            ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
-            ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));
-          }
-        }
-      }
-
-      ctx.save();
-      ctx.translate(plotOffset.left, plotOffset.top);
-      ctx.lineJoin = "round";
-
-      var lw = series.lines.lineWidth,
-          sw = series.shadowSize;
-      // FIXME: consider another form of shadow when filling is turned on
-      if (lw > 0 && sw > 0) {
-        // draw shadow as a thick and thin line with transparency
-        ctx.lineWidth = sw;
-        ctx.strokeStyle = "rgba(0,0,0,0.1)";
-        // position shadow at angle from the mid of line
-        var angle = Math.PI/18;
-        plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
-        ctx.lineWidth = sw/2;
-        plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
-      }
-
-      ctx.lineWidth = lw;
-      ctx.strokeStyle = series.color;
-      var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
-      if (fillStyle) {
-        ctx.fillStyle = fillStyle;
-        plotLineArea(series.datapoints, series.xaxis, series.yaxis);
-      }
-
-      if (lw > 0)
-        plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
-      ctx.restore();
-    }
-
-    function drawSeriesPoints(series) {
-      function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {
-        var points = datapoints.points, ps = datapoints.pointsize;
-
-        for (var i = 0; i < points.length; i += ps) {
-          var x = points[i], y = points[i + 1];
-          if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
-            continue;
-
-          ctx.beginPath();
-          x = axisx.p2c(x);
-          y = axisy.p2c(y) + offset;
-          if (symbol == "circle")
-            ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);
-          else
-            symbol(ctx, x, y, radius, shadow);
-          ctx.closePath();
-
-          if (fillStyle) {
-            ctx.fillStyle = fillStyle;
-            ctx.fill();
-          }
-          ctx.stroke();
-        }
-      }
-
-      ctx.save();
-      ctx.translate(plotOffset.left, plotOffset.top);
-
-      var lw = series.points.lineWidth,
-          sw = series.shadowSize,
-          radius = series.points.radius,
-          symbol = series.points.symbol;
-
-      // If the user sets the line width to 0, we change it to a very
-      // small value. A line width of 0 seems to force the default of 1.
-      // Doing the conditional here allows the shadow setting to still be
-      // optional even with a lineWidth of 0.
-
-      if( lw == 0 )
-        lw = 0.0001;
-
-      if (lw > 0 && sw > 0) {
-        // draw shadow in two steps
-        var w = sw / 2;
-        ctx.lineWidth = w;
-        ctx.strokeStyle = "rgba(0,0,0,0.1)";
-        plotPoints(series.datapoints, radius, null, w + w/2, true,
-            series.xaxis, series.yaxis, symbol);
-
-        ctx.strokeStyle = "rgba(0,0,0,0.2)";
-        plotPoints(series.datapoints, radius, null, w/2, true,
-            series.xaxis, series.yaxis, symbol);
-      }
-
-      ctx.lineWidth = lw;
-      ctx.strokeStyle = series.color;
-      plotPoints(series.datapoints, radius,
-          getFillStyle(series.points, series.color), 0, false,
-          series.xaxis, series.yaxis, symbol);
-      ctx.restore();
-    }
-
-    function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
-      var left, right, bottom, top,
-          drawLeft, drawRight, drawTop, drawBottom,
-          tmp;
-
-      // in horizontal mode, we start the bar from the left
-      // instead of from the bottom so it appears to be
-      // horizontal rather than vertical
-      if (horizontal) {
-        drawBottom = drawRight = drawTop = true;
-        drawLeft = false;
-        left = b;
-        right = x;
-        top = y + barLeft;
-        bottom = y + barRight;
-
-        // account for negative bars
-        if (right < left) {
-          tmp = right;
-          right = left;
-          left = tmp;
-          drawLeft = true;
-          drawRight = false;
-        }
-      }
-      else {
-        drawLeft = drawRight = drawTop = true;
-        drawBottom = false;
-        left = x + barLeft;
-        right = x + barRight;
-        bottom = b;
-        top = y;
-
-        // account for negative bars
-        if (top < bottom) {
-          tmp = top;
-          top = bottom;
-          bottom = tmp;
-          drawBottom = true;
-          drawTop = false;
-        }
-      }
-
-      // clip
-      if (right < axisx.min || left > axisx.max ||
-          top < axisy.min || bottom > axisy.max)
-        return;
-
-      if (left < axisx.min) {
-        left = axisx.min;
-        drawLeft = false;
-      }
-
-      if (right > axisx.max) {
-        right = axisx.max;
-        drawRight = false;
-      }
-
-      if (bottom < axisy.min) {
-        bottom = axisy.min;
-        drawBottom = false;
-      }
-
-      if (top > axisy.max) {
-        top = axisy.max;
-        drawTop = false;
-      }
-
-      left = axisx.p2c(left);
-      bottom = axisy.p2c(bottom);
-      right = axisx.p2c(right);
-      top = axisy.p2c(top);
-
-      // fill the bar
-      if (fillStyleCallback) {
-        c.fillStyle = fillStyleCallback(bottom, top);
-        c.fillRect(left, top, right - left, bottom - top)
-      }
-
-      // draw outline
-      if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {
-        c.beginPath();
-
-        // FIXME: inline moveTo is buggy with excanvas
-        c.moveTo(left, bottom);
-        if (drawLeft)
-          c.lineTo(left, top);
-        else
-          c.moveTo(left, top);
-        if (drawTop)
-          c.lineTo(right, top);
-        else
-          c.moveTo(right, top);
-        if (drawRight)
-          c.lineTo(right, bottom);
-        else
-          c.moveTo(right, bottom);
-        if (drawBottom)
-          c.lineTo(left, bottom);
-        else
-          c.moveTo(left, bottom);
-        c.stroke();
-      }
-    }
-
-    function drawSeriesBars(series) {
-      function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
-        var points = datapoints.points, ps = datapoints.pointsize;
-
-        for (var i = 0; i < points.length; i += ps) {
-          if (points[i] == null)
-            continue;
-          drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
-        }
-      }
-
-      ctx.save();
-      ctx.translate(plotOffset.left, plotOffset.top);
-
-      // FIXME: figure out a way to add shadows (for instance along the right edge)
-      ctx.lineWidth = series.bars.lineWidth;
-      ctx.strokeStyle = series.color;
-
-      var barLeft;
-
-      switch (series.bars.align) {
-        case "left":
-          barLeft = 0;
-          break;
-        case "right":
-          barLeft = -series.bars.barWidth;
-          break;
-        default:
-          barLeft = -series.bars.barWidth / 2;
-      }
-
-      var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
-      plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
-      ctx.restore();
-    }
-
-    function getFillStyle(filloptions, seriesColor, bottom, top) {
-      var fill = filloptions.fill;
-      if (!fill)
-        return null;
-
-      if (filloptions.fillColor)
-        return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
-
-      var c = $.color.parse(seriesColor);
-      c.a = typeof fill == "number" ? fill : 0.4;
-      c.normalize();
-      return c.toString();
-    }
-
-    function insertLegend() {
-
-      if (options.legend.container != null) {
-        $(options.legend.container).html("");
-      } else {
-        placeholder.find(".legend").remove();
-      }
-
-      if (!options.legend.show) {
-        return;
-      }
-
-      var fragments = [], entries = [], rowStarted = false,
-          lf = options.legend.labelFormatter, s, label;
-
-      // Build a list of legend entries, with each having a label and a color
-
-      for (var i = 0; i < series.length; ++i) {
-        s = series[i];
-        if (s.label) {
-          label = lf ? lf(s.label, s) : s.label;
-          if (label) {
-            entries.push({
-              label: label,
-              color: s.color
-            });
-          }
-        }
-      }
-
-      // Sort the legend using either the default or a custom comparator
-
-      if (options.legend.sorted) {
-        if ($.isFunction(options.legend.sorted)) {
-          entries.sort(options.legend.sorted);
-        } else if (options.legend.sorted == "reverse") {
-          entries.reverse();
-        } else {
-          var ascending = options.legend.sorted != "descending";
-          entries.sort(function(a, b) {
-            return a.label == b.label ? 0 : (
-                (a.label < b.label) != ascending ? 1 : -1   // Logical XOR
-            );
-          });
-        }
-      }
-
-      // Generate markup for the list of entries, in their final order
-
-      for (var i = 0; i < entries.length; ++i) {
-
-        var entry = entries[i];
-
-        if (i % options.legend.noColumns == 0) {
-          if (rowStarted)
-            fragments.push('</tr>');
-          fragments.push('<tr>');
-          rowStarted = true;
-        }
-
-        fragments.push(
-            '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' +
-            '<td class="legendLabel">' + entry.label + '</td>'
-        );
-      }
-
-      if (rowStarted)
-        fragments.push('</tr>');
-
-      if (fragments.length == 0)
-        return;
-
-      var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
-      if (options.legend.container != null)
-        $(options.legend.container).html(table);
-      else {
-        var pos = "",
-            p = options.legend.position,
-            m = options.legend.margin;
-        if (m[0] == null)
-          m = [m, m];
-        if (p.charAt(0) == "n")
-          pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
-        else if (p.charAt(0) == "s")
-          pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
-        if (p.charAt(1) == "e")
-          pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
-        else if (p.charAt(1) == "w")
-          pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
-        var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
-        if (options.legend.backgroundOpacity != 0.0) {
-          // put in the transparent background
-          // separately to avoid blended labels and
-          // label boxes
-          var c = options.legend.backgroundColor;
-          if (c == null) {
-            c = options.grid.backgroundColor;
-            if (c && typeof c == "string")
-              c = $.color.parse(c);
-            else
-              c = $.color.extract(legend, 'background-color');
-            c.a = 1;
-            c = c.toString();
-          }
-          var div = legend.children();
-          $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
-        }
-      }
-    }
-
-
-    // interactive features
-
-    var highlights = [],
-        redrawTimeout = null;
-
-    // returns the data item the mouse is over, or null if none is found
-    function findNearbyItem(mouseX, mouseY, seriesFilter) {
-      var maxDistance = options.grid.mouseActiveRadius,
-          smallestDistance = maxDistance * maxDistance + 1,
-          item = null, foundPoint = false, i, j, ps;
-
-      for (i = series.length - 1; i >= 0; --i) {
-        if (!seriesFilter(series[i]))
-          continue;
-
-        var s = series[i],
-            axisx = s.xaxis,
-            axisy = s.yaxis,
-            points = s.datapoints.points,
-            mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
-            my = axisy.c2p(mouseY),
-            maxx = maxDistance / axisx.scale,
-            maxy = maxDistance / axisy.scale;
-
-        ps = s.datapoints.pointsize;
-        // with inverse transforms, we can't use the maxx/maxy
-        // optimization, sadly
-        if (axisx.options.inverseTransform)
-          maxx = Number.MAX_VALUE;
-        if (axisy.options.inverseTransform)
-          maxy = Number.MAX_VALUE;
-
-        if (s.lines.show || s.points.show) {
-          for (j = 0; j < points.length; j += ps) {
-            var x = points[j], y = points[j + 1];
-            if (x == null)
-              continue;
-
-            // For points and lines, the cursor must be within a
-            // certain distance to the data point
-            if (x - mx > maxx || x - mx < -maxx ||
-                y - my > maxy || y - my < -maxy)
-              continue;
-
-            // We have to calculate distances in pixels, not in
-            // data units, because the scales of the axes may be different
-            var dx = Math.abs(axisx.p2c(x) - mouseX),
-                dy = Math.abs(axisy.p2c(y) - mouseY),
-                dist = dx * dx + dy * dy; // we save the sqrt
-
-            // use <= to ensure last point takes precedence
-            // (last generally means on top of)
-            if (dist < smallestDistance) {
-              smallestDistance = dist;
-              item = [i, j / ps];
-            }
-          }
-        }
-
-        if (s.bars.show && !item) { // no other point can be nearby
-
-          var barLeft, barRight;
-
-          switch (s.bars.align) {
-            case "left":
-              barLeft = 0;
-              break;
-            case "right":
-              barLeft = -s.bars.barWidth;
-              break;
-            default:
-              barLeft = -s.bars.barWidth / 2;
-          }
-
-          barRight = barLeft + s.bars.barWidth;
-
-          for (j = 0; j < points.length; j += ps) {
-            var x = points[j], y = points[j + 1], b = points[j + 2];
-            if (x == null)
-              continue;
-
-            // for a bar graph, the cursor must be inside the bar
-            if (series[i].bars.horizontal ?
-                (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&
-                    my >= y + barLeft && my <= y + barRight) :
-                (mx >= x + barLeft && mx <= x + barRight &&
-                    my >= Math.min(b, y) && my <= Math.max(b, y)))
-              item = [i, j / ps];
-          }
-        }
-      }
-
-      if (item) {
-        i = item[0];
-        j = item[1];
-        ps = series[i].datapoints.pointsize;
-
-        return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
-          dataIndex: j,
-          series: series[i],
-          seriesIndex: i };
-      }
-
-      return null;
-    }
-
-    function onMouseMove(e) {
-      if (options.grid.hoverable)
-        triggerClickHoverEvent("plothover", e,
-            function (s) { return s["hoverable"] != false; });
-    }
-
-    function onMouseLeave(e) {
-      if (options.grid.hoverable)
-        triggerClickHoverEvent("plothover", e,
-            function (s) { return false; });
-    }
-
-    function onClick(e) {
-      triggerClickHoverEvent("plotclick", e,
-          function (s) { return s["clickable"] != false; });
-    }
-
-    // trigger click or hover event (they send the same parameters
-    // so we share their code)
-    function triggerClickHoverEvent(eventname, event, seriesFilter) {
-      var offset = eventHolder.offset(),
-          canvasX = event.pageX - offset.left - plotOffset.left,
-          canvasY = event.pageY - offset.top - plotOffset.top,
-          pos = canvasToAxisCoords({ left: canvasX, top: canvasY });
-
-      pos.pageX = event.pageX;
-      pos.pageY = event.pageY;
-
-      var item = findNearbyItem(canvasX, canvasY, seriesFilter);
-
-      if (item) {
-        // fill in mouse pos for any listeners out there
-        item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);
-        item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);
-      }
-
-      if (options.grid.autoHighlight) {
-        // clear auto-highlights
-        for (var i = 0; i < highlights.length; ++i) {
-          var h = highlights[i];
-          if (h.auto == eventname &&
-              !(item && h.series == item.series &&
-                  h.point[0] == item.datapoint[0] &&
-                  h.point[1] == item.datapoint[1]))
-            unhighlight(h.series, h.point);
-        }
-
-        if (item)
-          highlight(item.series, item.datapoint, eventname);
-      }
-
-      placeholder.trigger(eventname, [ pos, item ]);
-    }
-
-    function triggerRedrawOverlay() {
-      var t = options.interaction.redrawOverlayInterval;
-      if (t == -1) {      // skip event queue
-        drawOverlay();
-        return;
-      }
-
-      if (!redrawTimeout)
-        redrawTimeout = setTimeout(drawOverlay, t);
-    }
-
-    function drawOverlay() {
-      redrawTimeout = null;
-
-      // draw highlights
-      octx.save();
-      overlay.clear();
-      octx.translate(plotOffset.left, plotOffset.top);
-
-      var i, hi;
-      for (i = 0; i < highlights.length; ++i) {
-        hi = highlights[i];
-
-        if (hi.series.bars.show)
-          drawBarHighlight(hi.series, hi.point);
-        else
-          drawPointHighlight(hi.series, hi.point);
-      }
-      octx.restore();
-
-      executeHooks(hooks.drawOverlay, [octx]);
-    }
-
-    function highlight(s, point, auto) {
-      if (typeof s == "number")
-        s = series[s];
-
-      if (typeof point == "number") {
-        var ps = s.datapoints.pointsize;
-        point = s.datapoints.points.slice(ps * point, ps * (point + 1));
-      }
-
-      var i = indexOfHighlight(s, point);
-      if (i == -1) {
-        highlights.push({ series: s, point: point, auto: auto });
-
-        triggerRedrawOverlay();
-      }
-      else if (!auto)
-        highlights[i].auto = false;
-    }
-
-    function unhighlight(s, point) {
-      if (s == null && point == null) {
-        highlights = [];
-        triggerRedrawOverlay();
-        return;
-      }
-
-      if (typeof s == "number")
-        s = series[s];
-
-      if (typeof point == "number") {
-        var ps = s.datapoints.pointsize;
-        point = s.datapoints.points.slice(ps * point, ps * (point + 1));
-      }
-
-      var i = indexOfHighlight(s, point);
-      if (i != -1) {
-        highlights.splice(i, 1);
-
-        triggerRedrawOverlay();
-      }
-    }
-
-    function indexOfHighlight(s, p) {
-      for (var i = 0; i < highlights.length; ++i) {
-        var h = highlights[i];
-        if (h.series == s && h.point[0] == p[0]
-            && h.point[1] == p[1])
-          return i;
-      }
-      return -1;
-    }
-
-    function drawPointHighlight(series, point) {
-      var x = point[0], y = point[1],
-          axisx = series.xaxis, axisy = series.yaxis,
-          highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();
-
-      if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
-        return;
-
-      var pointRadius = series.points.radius + series.points.lineWidth / 2;
-      octx.lineWidth = pointRadius;
-      octx.strokeStyle = highlightColor;
-      var radius = 1.5 * pointRadius;
-      x = axisx.p2c(x);
-      y = axisy.p2c(y);
-
-      octx.beginPath();
-      if (series.points.symbol == "circle")
-        octx.arc(x, y, radius, 0, 2 * Math.PI, false);
-      else
-        series.points.symbol(octx, x, y, radius, false);
-      octx.closePath();
-      octx.stroke();
-    }
-
-    function drawBarHighlight(series, point) {
-      var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
-          fillStyle = highlightColor,
-          barLeft;
-
-      switch (series.bars.align) {
-        case "left":
-          barLeft = 0;
-          break;
-        case "right":
-          barLeft = -series.bars.barWidth;
-          break;
-        default:
-          barLeft = -series.bars.barWidth / 2;
-      }
-
-      octx.lineWidth = series.bars.lineWidth;
-      octx.strokeStyle = highlightColor;
-
-      drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
-          function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
-    }
-
-    function getColorOrGradient(spec, bottom, top, defaultColor) {
-      if (typeof spec == "string")
-        return spec;
-      else {
-        // assume this is a gradient spec; IE currently only
-        // supports a simple vertical gradient properly, so that's
-        // what we support too
-        var gradient = ctx.createLinearGradient(0, top, 0, bottom);
-
-        for (var i = 0, l = spec.colors.length; i < l; ++i) {
-          var c = spec.colors[i];
-          if (typeof c != "string") {
-            var co = $.color.parse(defaultColor);
-            if (c.brightness != null)
-              co = co.scale('rgb', c.brightness);
-            if (c.opacity != null)
-              co.a *= c.opacity;
-            c = co.toString();
-          }
-          gradient.addColorStop(i / (l - 1), c);
-        }
-
-        return gradient;
-      }
-    }
-  }
-
-  // Add the plot function to the top level of the jQuery object
-
-  $.plot = function(placeholder, data, options) {
-    //var t0 = new Date();
-    var plot = new Plot($(placeholder), data, options, $.plot.plugins);
-    //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
-    return plot;
-  };
-
-  $.plot.version = "0.8.3";
-
-  $.plot.plugins = [];
-
-  // Also add the plot function as a chainable property
-
-  $.fn.plot = function(data, options) {
-    return this.each(function() {
-      $.plot(this, data, options);
-    });
-  };
-
-  // round to nearby lower multiple of base
-  function floorInBase(n, base) {
-    return base * Math.floor(n / base);
-  }
-
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.navigate.js b/ui/legacy/lib/flot/jquery.flot.navigate.js
deleted file mode 100644
index c96bc7e..0000000
--- a/ui/legacy/lib/flot/jquery.flot.navigate.js
+++ /dev/null
@@ -1,346 +0,0 @@
-/* Flot plugin for adding the ability to pan and zoom the plot.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The default behaviour is double click and scrollwheel up/down to zoom in, drag
-to pan. The plugin defines plot.zoom({ center }), plot.zoomOut() and
-plot.pan( offset ) so you easily can add custom controls. It also fires
-"plotpan" and "plotzoom" events, useful for synchronizing plots.
-
-The plugin supports these options:
-
-	zoom: {
-		interactive: false
-		trigger: "dblclick" // or "click" for single click
-		amount: 1.5         // 2 = 200% (zoom in), 0.5 = 50% (zoom out)
-	}
-
-	pan: {
-		interactive: false
-		cursor: "move"      // CSS mouse cursor value used when dragging, e.g. "pointer"
-		frameRate: 20
-	}
-
-	xaxis, yaxis, x2axis, y2axis: {
-		zoomRange: null  // or [ number, number ] (min range, max range) or false
-		panRange: null   // or [ number, number ] (min, max) or false
-	}
-
-"interactive" enables the built-in drag/click behaviour. If you enable
-interactive for pan, then you'll have a basic plot that supports moving
-around; the same for zoom.
-
-"amount" specifies the default amount to zoom in (so 1.5 = 150%) relative to
-the current viewport.
-
-"cursor" is a standard CSS mouse cursor string used for visual feedback to the
-user when dragging.
-
-"frameRate" specifies the maximum number of times per second the plot will
-update itself while the user is panning around on it (set to null to disable
-intermediate pans, the plot will then not update until the mouse button is
-released).
-
-"zoomRange" is the interval in which zooming can happen, e.g. with zoomRange:
-[1, 100] the zoom will never scale the axis so that the difference between min
-and max is smaller than 1 or larger than 100. You can set either end to null
-to ignore, e.g. [1, null]. If you set zoomRange to false, zooming on that axis
-will be disabled.
-
-"panRange" confines the panning to stay within a range, e.g. with panRange:
-[-10, 20] panning stops at -10 in one end and at 20 in the other. Either can
-be null, e.g. [-10, null]. If you set panRange to false, panning on that axis
-will be disabled.
-
-Example API usage:
-
-	plot = $.plot(...);
-
-	// zoom default amount in on the pixel ( 10, 20 )
-	plot.zoom({ center: { left: 10, top: 20 } });
-
-	// zoom out again
-	plot.zoomOut({ center: { left: 10, top: 20 } });
-
-	// zoom 200% in on the pixel (10, 20)
-	plot.zoom({ amount: 2, center: { left: 10, top: 20 } });
-
-	// pan 100 pixels to the left and 20 down
-	plot.pan({ left: -100, top: 20 })
-
-Here, "center" specifies where the center of the zooming should happen. Note
-that this is defined in pixel space, not the space of the data points (you can
-use the p2c helpers on the axes in Flot to help you convert between these).
-
-"amount" is the amount to zoom the viewport relative to the current range, so
-1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out). You
-can set the default in the options.
-
-*/
-
-// First two dependencies, jquery.event.drag.js and
-// jquery.mousewheel.js, we put them inline here to save people the
-// effort of downloading them.
-
-/*
-jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
-Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt
-*/
-(function(a){function e(h){var k,j=this,l=h.data||{};if(l.elem)j=h.dragTarget=l.elem,h.dragProxy=d.proxy||j,h.cursorOffsetX=l.pageX-l.left,h.cursorOffsetY=l.pageY-l.top,h.offsetX=h.pageX-h.cursorOffsetX,h.offsetY=h.pageY-h.cursorOffsetY;else if(d.dragging||l.which>0&&h.which!=l.which||a(h.target).is(l.not))return;switch(h.type){case"mousedown":return a.extend(l,a(j).offset(),{elem:j,target:h.target,pageX:h.pageX,pageY:h.pageY}),b.add(document,"mousemove mouseup",e,l),i(j,!1),d.dragging=null,!1;case!d.dragging&&"mousemove":if(g(h.pageX-l.pageX)+g(h.pageY-l.pageY)<l.distance)break;h.target=l.target,k=f(h,"dragstart",j),k!==!1&&(d.dragging=j,d.proxy=h.dragProxy=a(k||j)[0]);case"mousemove":if(d.dragging){if(k=f(h,"drag",j),c.drop&&(c.drop.allowed=k!==!1,c.drop.handler(h)),k!==!1)break;h.type="mouseup"}case"mouseup":b.remove(document,"mousemove mouseup",e),d.dragging&&(c.drop&&c.drop.handler(h),f(h,"dragend",j)),i(j,!0),d.dragging=d.proxy=l.elem=!1}return!0}function f(b,c,d){b.type=c;var e=a.event.dispatch.call(d,b);return e===!1?!1:e||b.result}function g(a){return Math.pow(a,2)}function h(){return d.dragging===!1}function i(a,b){a&&(a.unselectable=b?"off":"on",a.onselectstart=function(){return b},a.style&&(a.style.MozUserSelect=b?"":"none"))}a.fn.drag=function(a,b,c){return b&&this.bind("dragstart",a),c&&this.bind("dragend",c),a?this.bind("drag",b?b:a):this.trigger("drag")};var b=a.event,c=b.special,d=c.drag={not:":input",distance:0,which:1,dragging:!1,setup:function(c){c=a.extend({distance:d.distance,which:d.which,not:d.not},c||{}),c.distance=g(c.distance),b.add(this,"mousedown",e,c),this.attachEvent&&this.attachEvent("ondragstart",h)},teardown:function(){b.remove(this,"mousedown",e),this===d.dragging&&(d.dragging=d.proxy=!1),i(this,!0),this.detachEvent&&this.detachEvent("ondragstart",h)}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}}})(jQuery);
-
-/* jquery.mousewheel.min.js
- * Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
- * Licensed under the MIT License (LICENSE.txt).
- * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
- * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
- * Thanks to: Seamus Leahy for adding deltaX and deltaY
- *
- * Version: 3.0.6
- *
- * Requires: 1.2.2+
- */
-(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;void 0!==b.axis&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);void 0!==b.wheelDeltaY&&(g=b.wheelDeltaY/120);void 0!==b.wheelDeltaX&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,!1);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,!1);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
-
-
-
-
-(function ($) {
-  var options = {
-    xaxis: {
-      zoomRange: null, // or [number, number] (min range, max range)
-      panRange: null // or [number, number] (min, max)
-    },
-    zoom: {
-      interactive: false,
-      trigger: "dblclick", // or "click" for single click
-      amount: 1.5 // how much to zoom relative to current position, 2 = 200% (zoom in), 0.5 = 50% (zoom out)
-    },
-    pan: {
-      interactive: false,
-      cursor: "move",
-      frameRate: 20
-    }
-  };
-
-  function init(plot) {
-    function onZoomClick(e, zoomOut) {
-      var c = plot.offset();
-      c.left = e.pageX - c.left;
-      c.top = e.pageY - c.top;
-      if (zoomOut)
-        plot.zoomOut({ center: c });
-      else
-        plot.zoom({ center: c });
-    }
-
-    function onMouseWheel(e, delta) {
-      e.preventDefault();
-      onZoomClick(e, delta < 0);
-      return false;
-    }
-
-    var prevCursor = 'default', prevPageX = 0, prevPageY = 0,
-        panTimeout = null;
-
-    function onDragStart(e) {
-      if (e.which != 1)  // only accept left-click
-        return false;
-      var c = plot.getPlaceholder().css('cursor');
-      if (c)
-        prevCursor = c;
-      plot.getPlaceholder().css('cursor', plot.getOptions().pan.cursor);
-      prevPageX = e.pageX;
-      prevPageY = e.pageY;
-    }
-
-    function onDrag(e) {
-      var frameRate = plot.getOptions().pan.frameRate;
-      if (panTimeout || !frameRate)
-        return;
-
-      panTimeout = setTimeout(function () {
-        plot.pan({ left: prevPageX - e.pageX,
-          top: prevPageY - e.pageY });
-        prevPageX = e.pageX;
-        prevPageY = e.pageY;
-
-        panTimeout = null;
-      }, 1 / frameRate * 1000);
-    }
-
-    function onDragEnd(e) {
-      if (panTimeout) {
-        clearTimeout(panTimeout);
-        panTimeout = null;
-      }
-
-      plot.getPlaceholder().css('cursor', prevCursor);
-      plot.pan({ left: prevPageX - e.pageX,
-        top: prevPageY - e.pageY });
-    }
-
-    function bindEvents(plot, eventHolder) {
-      var o = plot.getOptions();
-      if (o.zoom.interactive) {
-        eventHolder[o.zoom.trigger](onZoomClick);
-        eventHolder.mousewheel(onMouseWheel);
-      }
-
-      if (o.pan.interactive) {
-        eventHolder.bind("dragstart", { distance: 10 }, onDragStart);
-        eventHolder.bind("drag", onDrag);
-        eventHolder.bind("dragend", onDragEnd);
-      }
-    }
-
-    plot.zoomOut = function (args) {
-      if (!args)
-        args = {};
-
-      if (!args.amount)
-        args.amount = plot.getOptions().zoom.amount;
-
-      args.amount = 1 / args.amount;
-      plot.zoom(args);
-    };
-
-    plot.zoom = function (args) {
-      if (!args)
-        args = {};
-
-      var c = args.center,
-          amount = args.amount || plot.getOptions().zoom.amount,
-          w = plot.width(), h = plot.height();
-
-      if (!c)
-        c = { left: w / 2, top: h / 2 };
-
-      var xf = c.left / w,
-          yf = c.top / h,
-          minmax = {
-            x: {
-              min: c.left - xf * w / amount,
-              max: c.left + (1 - xf) * w / amount
-            },
-            y: {
-              min: c.top - yf * h / amount,
-              max: c.top + (1 - yf) * h / amount
-            }
-          };
-
-      $.each(plot.getAxes(), function(_, axis) {
-        var opts = axis.options,
-            min = minmax[axis.direction].min,
-            max = minmax[axis.direction].max,
-            zr = opts.zoomRange,
-            pr = opts.panRange;
-
-        if (zr === false) // no zooming on this axis
-          return;
-
-        min = axis.c2p(min);
-        max = axis.c2p(max);
-        if (min > max) {
-          // make sure min < max
-          var tmp = min;
-          min = max;
-          max = tmp;
-        }
-
-        //Check that we are in panRange
-        if (pr) {
-          if (pr[0] != null && min < pr[0]) {
-            min = pr[0];
-          }
-          if (pr[1] != null && max > pr[1]) {
-            max = pr[1];
-          }
-        }
-
-        var range = max - min;
-        if (zr &&
-            ((zr[0] != null && range < zr[0] && amount >1) ||
-                (zr[1] != null && range > zr[1] && amount <1)))
-          return;
-
-        opts.min = min;
-        opts.max = max;
-      });
-
-      plot.setupGrid();
-      plot.draw();
-
-      if (!args.preventEvent)
-        plot.getPlaceholder().trigger("plotzoom", [ plot, args ]);
-    };
-
-    plot.pan = function (args) {
-      var delta = {
-        x: +args.left,
-        y: +args.top
-      };
-
-      if (isNaN(delta.x))
-        delta.x = 0;
-      if (isNaN(delta.y))
-        delta.y = 0;
-
-      $.each(plot.getAxes(), function (_, axis) {
-        var opts = axis.options,
-            min, max, d = delta[axis.direction];
-
-        min = axis.c2p(axis.p2c(axis.min) + d),
-            max = axis.c2p(axis.p2c(axis.max) + d);
-
-        var pr = opts.panRange;
-        if (pr === false) // no panning on this axis
-          return;
-
-        if (pr) {
-          // check whether we hit the wall
-          if (pr[0] != null && pr[0] > min) {
-            d = pr[0] - min;
-            min += d;
-            max += d;
-          }
-
-          if (pr[1] != null && pr[1] < max) {
-            d = pr[1] - max;
-            min += d;
-            max += d;
-          }
-        }
-
-        opts.min = min;
-        opts.max = max;
-      });
-
-      plot.setupGrid();
-      plot.draw();
-
-      if (!args.preventEvent)
-        plot.getPlaceholder().trigger("plotpan", [ plot, args ]);
-    };
-
-    function shutdown(plot, eventHolder) {
-      eventHolder.unbind(plot.getOptions().zoom.trigger, onZoomClick);
-      eventHolder.unbind("mousewheel", onMouseWheel);
-      eventHolder.unbind("dragstart", onDragStart);
-      eventHolder.unbind("drag", onDrag);
-      eventHolder.unbind("dragend", onDragEnd);
-      if (panTimeout)
-        clearTimeout(panTimeout);
-    }
-
-    plot.hooks.bindEvents.push(bindEvents);
-    plot.hooks.shutdown.push(shutdown);
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: 'navigate',
-    version: '1.3'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.pie.js b/ui/legacy/lib/flot/jquery.flot.pie.js
deleted file mode 100644
index cc5c25d..0000000
--- a/ui/legacy/lib/flot/jquery.flot.pie.js
+++ /dev/null
@@ -1,820 +0,0 @@
-/* Flot plugin for rendering pie charts.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin assumes that each series has a single data value, and that each
-value is a positive integer or zero.  Negative numbers don't make sense for a
-pie chart, and have unpredictable results.  The values do NOT need to be
-passed in as percentages; the plugin will calculate the total and per-slice
-percentages internally.
-
-* Created by Brian Medendorp
-
-* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars
-
-The plugin supports these options:
-
-	series: {
-		pie: {
-			show: true/false
-			radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'
-			innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect
-			startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result
-			tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)
-			offset: {
-				top: integer value to move the pie up or down
-				left: integer value to move the pie left or right, or 'auto'
-			},
-			stroke: {
-				color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')
-				width: integer pixel width of the stroke
-			},
-			label: {
-				show: true/false, or 'auto'
-				formatter:  a user-defined function that modifies the text/style of the label text
-				radius: 0-1 for percentage of fullsize, or a specified pixel length
-				background: {
-					color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')
-					opacity: 0-1
-				},
-				threshold: 0-1 for the percentage value at which to hide labels (if they're too small)
-			},
-			combine: {
-				threshold: 0-1 for the percentage value at which to combine slices (if they're too small)
-				color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined
-				label: any text value of what the combined slice should be labeled
-			}
-			highlight: {
-				opacity: 0-1
-			}
-		}
-	}
-
-More detail and specific examples can be found in the included HTML file.
-
-*/
-
-(function($) {
-
-  // Maximum redraw attempts when fitting labels within the plot
-
-  var REDRAW_ATTEMPTS = 10;
-
-  // Factor by which to shrink the pie when fitting labels within the plot
-
-  var REDRAW_SHRINK = 0.95;
-
-  function init(plot) {
-
-    var canvas = null,
-        target = null,
-        options = null,
-        maxRadius = null,
-        centerLeft = null,
-        centerTop = null,
-        processed = false,
-        ctx = null;
-
-    // interactive variables
-
-    var highlights = [];
-
-    // add hook to determine if pie plugin in enabled, and then perform necessary operations
-
-    plot.hooks.processOptions.push(function(plot, options) {
-      if (options.series.pie.show) {
-
-        options.grid.show = false;
-
-        // set labels.show
-
-        if (options.series.pie.label.show == "auto") {
-          if (options.legend.show) {
-            options.series.pie.label.show = false;
-          } else {
-            options.series.pie.label.show = true;
-          }
-        }
-
-        // set radius
-
-        if (options.series.pie.radius == "auto") {
-          if (options.series.pie.label.show) {
-            options.series.pie.radius = 3/4;
-          } else {
-            options.series.pie.radius = 1;
-          }
-        }
-
-        // ensure sane tilt
-
-        if (options.series.pie.tilt > 1) {
-          options.series.pie.tilt = 1;
-        } else if (options.series.pie.tilt < 0) {
-          options.series.pie.tilt = 0;
-        }
-      }
-    });
-
-    plot.hooks.bindEvents.push(function(plot, eventHolder) {
-      var options = plot.getOptions();
-      if (options.series.pie.show) {
-        if (options.grid.hoverable) {
-          eventHolder.unbind("mousemove").mousemove(onMouseMove);
-        }
-        if (options.grid.clickable) {
-          eventHolder.unbind("click").click(onClick);
-        }
-      }
-    });
-
-    plot.hooks.processDatapoints.push(function(plot, series, data, datapoints) {
-      var options = plot.getOptions();
-      if (options.series.pie.show) {
-        processDatapoints(plot, series, data, datapoints);
-      }
-    });
-
-    plot.hooks.drawOverlay.push(function(plot, octx) {
-      var options = plot.getOptions();
-      if (options.series.pie.show) {
-        drawOverlay(plot, octx);
-      }
-    });
-
-    plot.hooks.draw.push(function(plot, newCtx) {
-      var options = plot.getOptions();
-      if (options.series.pie.show) {
-        draw(plot, newCtx);
-      }
-    });
-
-    function processDatapoints(plot, series, datapoints) {
-      if (!processed)	{
-        processed = true;
-        canvas = plot.getCanvas();
-        target = $(canvas).parent();
-        options = plot.getOptions();
-        plot.setData(combine(plot.getData()));
-      }
-    }
-
-    function combine(data) {
-
-      var total = 0,
-          combined = 0,
-          numCombined = 0,
-          color = options.series.pie.combine.color,
-          newdata = [];
-
-      // Fix up the raw data from Flot, ensuring the data is numeric
-
-      for (var i = 0; i < data.length; ++i) {
-
-        var value = data[i].data;
-
-        // If the data is an array, we'll assume that it's a standard
-        // Flot x-y pair, and are concerned only with the second value.
-
-        // Note how we use the original array, rather than creating a
-        // new one; this is more efficient and preserves any extra data
-        // that the user may have stored in higher indexes.
-
-        if ($.isArray(value) && value.length == 1) {
-          value = value[0];
-        }
-
-        if ($.isArray(value)) {
-          // Equivalent to $.isNumeric() but compatible with jQuery < 1.7
-          if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) {
-            value[1] = +value[1];
-          } else {
-            value[1] = 0;
-          }
-        } else if (!isNaN(parseFloat(value)) && isFinite(value)) {
-          value = [1, +value];
-        } else {
-          value = [1, 0];
-        }
-
-        data[i].data = [value];
-      }
-
-      // Sum up all the slices, so we can calculate percentages for each
-
-      for (var i = 0; i < data.length; ++i) {
-        total += data[i].data[0][1];
-      }
-
-      // Count the number of slices with percentages below the combine
-      // threshold; if it turns out to be just one, we won't combine.
-
-      for (var i = 0; i < data.length; ++i) {
-        var value = data[i].data[0][1];
-        if (value / total <= options.series.pie.combine.threshold) {
-          combined += value;
-          numCombined++;
-          if (!color) {
-            color = data[i].color;
-          }
-        }
-      }
-
-      for (var i = 0; i < data.length; ++i) {
-        var value = data[i].data[0][1];
-        if (numCombined < 2 || value / total > options.series.pie.combine.threshold) {
-          newdata.push(
-              $.extend(data[i], {     /* extend to allow keeping all other original data values
-						                           and using them e.g. in labelFormatter. */
-                data: [[1, value]],
-                color: data[i].color,
-                label: data[i].label,
-                angle: value * Math.PI * 2 / total,
-                percent: value / (total / 100)
-              })
-          );
-        }
-      }
-
-      if (numCombined > 1) {
-        newdata.push({
-          data: [[1, combined]],
-          color: color,
-          label: options.series.pie.combine.label,
-          angle: combined * Math.PI * 2 / total,
-          percent: combined / (total / 100)
-        });
-      }
-
-      return newdata;
-    }
-
-    function draw(plot, newCtx) {
-
-      if (!target) {
-        return; // if no series were passed
-      }
-
-      var canvasWidth = plot.getPlaceholder().width(),
-          canvasHeight = plot.getPlaceholder().height(),
-          legendWidth = target.children().filter(".legend").children().width() || 0;
-
-      ctx = newCtx;
-
-      // WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE!
-
-      // When combining smaller slices into an 'other' slice, we need to
-      // add a new series.  Since Flot gives plugins no way to modify the
-      // list of series, the pie plugin uses a hack where the first call
-      // to processDatapoints results in a call to setData with the new
-      // list of series, then subsequent processDatapoints do nothing.
-
-      // The plugin-global 'processed' flag is used to control this hack;
-      // it starts out false, and is set to true after the first call to
-      // processDatapoints.
-
-      // Unfortunately this turns future setData calls into no-ops; they
-      // call processDatapoints, the flag is true, and nothing happens.
-
-      // To fix this we'll set the flag back to false here in draw, when
-      // all series have been processed, so the next sequence of calls to
-      // processDatapoints once again starts out with a slice-combine.
-      // This is really a hack; in 0.9 we need to give plugins a proper
-      // way to modify series before any processing begins.
-
-      processed = false;
-
-      // calculate maximum radius and center point
-
-      maxRadius =  Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2;
-      centerTop = canvasHeight / 2 + options.series.pie.offset.top;
-      centerLeft = canvasWidth / 2;
-
-      if (options.series.pie.offset.left == "auto") {
-        if (options.legend.position.match("w")) {
-          centerLeft += legendWidth / 2;
-        } else {
-          centerLeft -= legendWidth / 2;
-        }
-        if (centerLeft < maxRadius) {
-          centerLeft = maxRadius;
-        } else if (centerLeft > canvasWidth - maxRadius) {
-          centerLeft = canvasWidth - maxRadius;
-        }
-      } else {
-        centerLeft += options.series.pie.offset.left;
-      }
-
-      var slices = plot.getData(),
-          attempts = 0;
-
-      // Keep shrinking the pie's radius until drawPie returns true,
-      // indicating that all the labels fit, or we try too many times.
-
-      do {
-        if (attempts > 0) {
-          maxRadius *= REDRAW_SHRINK;
-        }
-        attempts += 1;
-        clear();
-        if (options.series.pie.tilt <= 0.8) {
-          drawShadow();
-        }
-      } while (!drawPie() && attempts < REDRAW_ATTEMPTS)
-
-      if (attempts >= REDRAW_ATTEMPTS) {
-        clear();
-        target.prepend("<div class='error'>Could not draw pie with labels contained inside canvas</div>");
-      }
-
-      if (plot.setSeries && plot.insertLegend) {
-        plot.setSeries(slices);
-        plot.insertLegend();
-      }
-
-      // we're actually done at this point, just defining internal functions at this point
-
-      function clear() {
-        ctx.clearRect(0, 0, canvasWidth, canvasHeight);
-        target.children().filter(".pieLabel, .pieLabelBackground").remove();
-      }
-
-      function drawShadow() {
-
-        var shadowLeft = options.series.pie.shadow.left;
-        var shadowTop = options.series.pie.shadow.top;
-        var edge = 10;
-        var alpha = options.series.pie.shadow.alpha;
-        var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
-
-        if (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) {
-          return;	// shadow would be outside canvas, so don't draw it
-        }
-
-        ctx.save();
-        ctx.translate(shadowLeft,shadowTop);
-        ctx.globalAlpha = alpha;
-        ctx.fillStyle = "#000";
-
-        // center and rotate to starting position
-
-        ctx.translate(centerLeft,centerTop);
-        ctx.scale(1, options.series.pie.tilt);
-
-        //radius -= edge;
-
-        for (var i = 1; i <= edge; i++) {
-          ctx.beginPath();
-          ctx.arc(0, 0, radius, 0, Math.PI * 2, false);
-          ctx.fill();
-          radius -= i;
-        }
-
-        ctx.restore();
-      }
-
-      function drawPie() {
-
-        var startAngle = Math.PI * options.series.pie.startAngle;
-        var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
-
-        // center and rotate to starting position
-
-        ctx.save();
-        ctx.translate(centerLeft,centerTop);
-        ctx.scale(1, options.series.pie.tilt);
-        //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera
-
-        // draw slices
-
-        ctx.save();
-        var currentAngle = startAngle;
-        for (var i = 0; i < slices.length; ++i) {
-          slices[i].startAngle = currentAngle;
-          drawSlice(slices[i].angle, slices[i].color, true);
-        }
-        ctx.restore();
-
-        // draw slice outlines
-
-        if (options.series.pie.stroke.width > 0) {
-          ctx.save();
-          ctx.lineWidth = options.series.pie.stroke.width;
-          currentAngle = startAngle;
-          for (var i = 0; i < slices.length; ++i) {
-            drawSlice(slices[i].angle, options.series.pie.stroke.color, false);
-          }
-          ctx.restore();
-        }
-
-        // draw donut hole
-
-        drawDonutHole(ctx);
-
-        ctx.restore();
-
-        // Draw the labels, returning true if they fit within the plot
-
-        if (options.series.pie.label.show) {
-          return drawLabels();
-        } else return true;
-
-        function drawSlice(angle, color, fill) {
-
-          if (angle <= 0 || isNaN(angle)) {
-            return;
-          }
-
-          if (fill) {
-            ctx.fillStyle = color;
-          } else {
-            ctx.strokeStyle = color;
-            ctx.lineJoin = "round";
-          }
-
-          ctx.beginPath();
-          if (Math.abs(angle - Math.PI * 2) > 0.000000001) {
-            ctx.moveTo(0, 0); // Center of the pie
-          }
-
-          //ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera
-          ctx.arc(0, 0, radius,currentAngle, currentAngle + angle / 2, false);
-          ctx.arc(0, 0, radius,currentAngle + angle / 2, currentAngle + angle, false);
-          ctx.closePath();
-          //ctx.rotate(angle); // This doesn't work properly in Opera
-          currentAngle += angle;
-
-          if (fill) {
-            ctx.fill();
-          } else {
-            ctx.stroke();
-          }
-        }
-
-        function drawLabels() {
-
-          var currentAngle = startAngle;
-          var radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius;
-
-          for (var i = 0; i < slices.length; ++i) {
-            if (slices[i].percent >= options.series.pie.label.threshold * 100) {
-              if (!drawLabel(slices[i], currentAngle, i)) {
-                return false;
-              }
-            }
-            currentAngle += slices[i].angle;
-          }
-
-          return true;
-
-          function drawLabel(slice, startAngle, index) {
-
-            if (slice.data[0][1] == 0) {
-              return true;
-            }
-
-            // format label text
-
-            var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;
-
-            if (lf) {
-              text = lf(slice.label, slice);
-            } else {
-              text = slice.label;
-            }
-
-            if (plf) {
-              text = plf(text, slice);
-            }
-
-            var halfAngle = ((startAngle + slice.angle) + startAngle) / 2;
-            var x = centerLeft + Math.round(Math.cos(halfAngle) * radius);
-            var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;
-
-            var html = "<span class='pieLabel' id='pieLabel" + index + "' style='position:absolute;top:" + y + "px;left:" + x + "px;'>" + text + "</span>";
-            target.append(html);
-
-            var label = target.children("#pieLabel" + index);
-            var labelTop = (y - label.height() / 2);
-            var labelLeft = (x - label.width() / 2);
-
-            label.css("top", labelTop);
-            label.css("left", labelLeft);
-
-            // check to make sure that the label is not outside the canvas
-
-            if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) {
-              return false;
-            }
-
-            if (options.series.pie.label.background.opacity != 0) {
-
-              // put in the transparent background separately to avoid blended labels and label boxes
-
-              var c = options.series.pie.label.background.color;
-
-              if (c == null) {
-                c = slice.color;
-              }
-
-              var pos = "top:" + labelTop + "px;left:" + labelLeft + "px;";
-              $("<div class='pieLabelBackground' style='position:absolute;width:" + label.width() + "px;height:" + label.height() + "px;" + pos + "background-color:" + c + ";'></div>")
-                  .css("opacity", options.series.pie.label.background.opacity)
-                  .insertBefore(label);
-            }
-
-            return true;
-          } // end individual label function
-        } // end drawLabels function
-      } // end drawPie function
-    } // end draw function
-
-    // Placed here because it needs to be accessed from multiple locations
-
-    function drawDonutHole(layer) {
-      if (options.series.pie.innerRadius > 0) {
-
-        // subtract the center
-
-        layer.save();
-        var innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;
-        layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color
-        layer.beginPath();
-        layer.fillStyle = options.series.pie.stroke.color;
-        layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
-        layer.fill();
-        layer.closePath();
-        layer.restore();
-
-        // add inner stroke
-
-        layer.save();
-        layer.beginPath();
-        layer.strokeStyle = options.series.pie.stroke.color;
-        layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
-        layer.stroke();
-        layer.closePath();
-        layer.restore();
-
-        // TODO: add extra shadow inside hole (with a mask) if the pie is tilted.
-      }
-    }
-
-    //-- Additional Interactive related functions --
-
-    function isPointInPoly(poly, pt) {
-      for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
-        ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1]))
-        && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
-        && (c = !c);
-      return c;
-    }
-
-    function findNearbySlice(mouseX, mouseY) {
-
-      var slices = plot.getData(),
-          options = plot.getOptions(),
-          radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius,
-          x, y;
-
-      for (var i = 0; i < slices.length; ++i) {
-
-        var s = slices[i];
-
-        if (s.pie.show) {
-
-          ctx.save();
-          ctx.beginPath();
-          ctx.moveTo(0, 0); // Center of the pie
-          //ctx.scale(1, options.series.pie.tilt);	// this actually seems to break everything when here.
-          ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false);
-          ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false);
-          ctx.closePath();
-          x = mouseX - centerLeft;
-          y = mouseY - centerTop;
-
-          if (ctx.isPointInPath) {
-            if (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) {
-              ctx.restore();
-              return {
-                datapoint: [s.percent, s.data],
-                dataIndex: 0,
-                series: s,
-                seriesIndex: i
-              };
-            }
-          } else {
-
-            // excanvas for IE doesn;t support isPointInPath, this is a workaround.
-
-            var p1X = radius * Math.cos(s.startAngle),
-                p1Y = radius * Math.sin(s.startAngle),
-                p2X = radius * Math.cos(s.startAngle + s.angle / 4),
-                p2Y = radius * Math.sin(s.startAngle + s.angle / 4),
-                p3X = radius * Math.cos(s.startAngle + s.angle / 2),
-                p3Y = radius * Math.sin(s.startAngle + s.angle / 2),
-                p4X = radius * Math.cos(s.startAngle + s.angle / 1.5),
-                p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5),
-                p5X = radius * Math.cos(s.startAngle + s.angle),
-                p5Y = radius * Math.sin(s.startAngle + s.angle),
-                arrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]],
-                arrPoint = [x, y];
-
-            // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt?
-
-            if (isPointInPoly(arrPoly, arrPoint)) {
-              ctx.restore();
-              return {
-                datapoint: [s.percent, s.data],
-                dataIndex: 0,
-                series: s,
-                seriesIndex: i
-              };
-            }
-          }
-
-          ctx.restore();
-        }
-      }
-
-      return null;
-    }
-
-    function onMouseMove(e) {
-      triggerClickHoverEvent("plothover", e);
-    }
-
-    function onClick(e) {
-      triggerClickHoverEvent("plotclick", e);
-    }
-
-    // trigger click or hover event (they send the same parameters so we share their code)
-
-    function triggerClickHoverEvent(eventname, e) {
-
-      var offset = plot.offset();
-      var canvasX = parseInt(e.pageX - offset.left);
-      var canvasY =  parseInt(e.pageY - offset.top);
-      var item = findNearbySlice(canvasX, canvasY);
-
-      if (options.grid.autoHighlight) {
-
-        // clear auto-highlights
-
-        for (var i = 0; i < highlights.length; ++i) {
-          var h = highlights[i];
-          if (h.auto == eventname && !(item && h.series == item.series)) {
-            unhighlight(h.series);
-          }
-        }
-      }
-
-      // highlight the slice
-
-      if (item) {
-        highlight(item.series, eventname);
-      }
-
-      // trigger any hover bind events
-
-      var pos = { pageX: e.pageX, pageY: e.pageY };
-      target.trigger(eventname, [pos, item]);
-    }
-
-    function highlight(s, auto) {
-      //if (typeof s == "number") {
-      //	s = series[s];
-      //}
-
-      var i = indexOfHighlight(s);
-
-      if (i == -1) {
-        highlights.push({ series: s, auto: auto });
-        plot.triggerRedrawOverlay();
-      } else if (!auto) {
-        highlights[i].auto = false;
-      }
-    }
-
-    function unhighlight(s) {
-      if (s == null) {
-        highlights = [];
-        plot.triggerRedrawOverlay();
-      }
-
-      //if (typeof s == "number") {
-      //	s = series[s];
-      //}
-
-      var i = indexOfHighlight(s);
-
-      if (i != -1) {
-        highlights.splice(i, 1);
-        plot.triggerRedrawOverlay();
-      }
-    }
-
-    function indexOfHighlight(s) {
-      for (var i = 0; i < highlights.length; ++i) {
-        var h = highlights[i];
-        if (h.series == s)
-          return i;
-      }
-      return -1;
-    }
-
-    function drawOverlay(plot, octx) {
-
-      var options = plot.getOptions();
-
-      var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
-
-      octx.save();
-      octx.translate(centerLeft, centerTop);
-      octx.scale(1, options.series.pie.tilt);
-
-      for (var i = 0; i < highlights.length; ++i) {
-        drawHighlight(highlights[i].series);
-      }
-
-      drawDonutHole(octx);
-
-      octx.restore();
-
-      function drawHighlight(series) {
-
-        if (series.angle <= 0 || isNaN(series.angle)) {
-          return;
-        }
-
-        //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString();
-        octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor
-        octx.beginPath();
-        if (Math.abs(series.angle - Math.PI * 2) > 0.000000001) {
-          octx.moveTo(0, 0); // Center of the pie
-        }
-        octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false);
-        octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false);
-        octx.closePath();
-        octx.fill();
-      }
-    }
-  } // end init (plugin body)
-
-  // define pie specific options and their default values
-
-  var options = {
-    series: {
-      pie: {
-        show: false,
-        radius: "auto",	// actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value)
-        innerRadius: 0, /* for donut */
-        startAngle: 3/2,
-        tilt: 1,
-        shadow: {
-          left: 5,	// shadow left offset
-          top: 15,	// shadow top offset
-          alpha: 0.02	// shadow alpha
-        },
-        offset: {
-          top: 0,
-          left: "auto"
-        },
-        stroke: {
-          color: "#fff",
-          width: 1
-        },
-        label: {
-          show: "auto",
-          formatter: function(label, slice) {
-            return "<div style='font-size:x-small;text-align:center;padding:2px;color:" + slice.color + ";'>" + label + "<br/>" + Math.round(slice.percent) + "%</div>";
-          },	// formatter function
-          radius: 1,	// radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value)
-          background: {
-            color: null,
-            opacity: 0
-          },
-          threshold: 0	// percentage at which to hide the label (i.e. the slice is too narrow)
-        },
-        combine: {
-          threshold: -1,	// percentage at which to combine little slices into one larger slice
-          color: null,	// color to give the new slice (auto-generated if null)
-          label: "Other"	// label to give the new slice
-        },
-        highlight: {
-          //color: "#fff",		// will add this functionality once parseColor is available
-          opacity: 0.5
-        }
-      }
-    }
-  };
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: "pie",
-    version: "1.1"
-  });
-
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.resize.js b/ui/legacy/lib/flot/jquery.flot.resize.js
deleted file mode 100644
index b9d9c44..0000000
--- a/ui/legacy/lib/flot/jquery.flot.resize.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Flot plugin for automatically redrawing plots as the placeholder resizes.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-It works by listening for changes on the placeholder div (through the jQuery
-resize event plugin) - if the size changes, it will redraw the plot.
-
-There are no options. If you need to disable the plugin for some plots, you
-can just fix the size of their placeholders.
-
-*/
-
-/* Inline dependency:
- * jQuery resize event - v1.1 - 3/14/2010
- * http://benalman.com/projects/jquery-resize-plugin/
- *
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-(function($,e,t){"$:nomunge";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this);
-
-(function ($) {
-  var options = { }; // no options
-
-  function init(plot) {
-    function onResize() {
-      var placeholder = plot.getPlaceholder();
-
-      // somebody might have hidden us and we can't plot
-      // when we don't have the dimensions
-      if (placeholder.width() == 0 || placeholder.height() == 0)
-        return;
-
-      plot.resize();
-      plot.setupGrid();
-      plot.draw();
-    }
-
-    function bindEvents(plot, eventHolder) {
-      plot.getPlaceholder().resize(onResize);
-    }
-
-    function shutdown(plot, eventHolder) {
-      plot.getPlaceholder().unbind("resize", onResize);
-    }
-
-    plot.hooks.bindEvents.push(bindEvents);
-    plot.hooks.shutdown.push(shutdown);
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: 'resize',
-    version: '1.0'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.selection.js b/ui/legacy/lib/flot/jquery.flot.selection.js
deleted file mode 100644
index 2608dd7..0000000
--- a/ui/legacy/lib/flot/jquery.flot.selection.js
+++ /dev/null
@@ -1,360 +0,0 @@
-/* Flot plugin for selecting regions of a plot.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin supports these options:
-
-selection: {
-	mode: null or "x" or "y" or "xy",
-	color: color,
-	shape: "round" or "miter" or "bevel",
-	minSize: number of pixels
-}
-
-Selection support is enabled by setting the mode to one of "x", "y" or "xy".
-In "x" mode, the user will only be able to specify the x range, similarly for
-"y" mode. For "xy", the selection becomes a rectangle where both ranges can be
-specified. "color" is color of the selection (if you need to change the color
-later on, you can get to it with plot.getOptions().selection.color). "shape"
-is the shape of the corners of the selection.
-
-"minSize" is the minimum size a selection can be in pixels. This value can
-be customized to determine the smallest size a selection can be and still
-have the selection rectangle be displayed. When customizing this value, the
-fact that it refers to pixels, not axis units must be taken into account.
-Thus, for example, if there is a bar graph in time mode with BarWidth set to 1
-minute, setting "minSize" to 1 will not make the minimum selection size 1
-minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent
-"plotunselected" events from being fired when the user clicks the mouse without
-dragging.
-
-When selection support is enabled, a "plotselected" event will be emitted on
-the DOM element you passed into the plot function. The event handler gets a
-parameter with the ranges selected on the axes, like this:
-
-	placeholder.bind( "plotselected", function( event, ranges ) {
-		alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to)
-		// similar for yaxis - with multiple axes, the extra ones are in
-		// x2axis, x3axis, ...
-	});
-
-The "plotselected" event is only fired when the user has finished making the
-selection. A "plotselecting" event is fired during the process with the same
-parameters as the "plotselected" event, in case you want to know what's
-happening while it's happening,
-
-A "plotunselected" event with no arguments is emitted when the user clicks the
-mouse to remove the selection. As stated above, setting "minSize" to 0 will
-destroy this behavior.
-
-The plugin allso adds the following methods to the plot object:
-
-- setSelection( ranges, preventEvent )
-
-  Set the selection rectangle. The passed in ranges is on the same form as
-  returned in the "plotselected" event. If the selection mode is "x", you
-  should put in either an xaxis range, if the mode is "y" you need to put in
-  an yaxis range and both xaxis and yaxis if the selection mode is "xy", like
-  this:
-
-	setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });
-
-  setSelection will trigger the "plotselected" event when called. If you don't
-  want that to happen, e.g. if you're inside a "plotselected" handler, pass
-  true as the second parameter. If you are using multiple axes, you can
-  specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of
-  xaxis, the plugin picks the first one it sees.
-
-- clearSelection( preventEvent )
-
-  Clear the selection rectangle. Pass in true to avoid getting a
-  "plotunselected" event.
-
-- getSelection()
-
-  Returns the current selection in the same format as the "plotselected"
-  event. If there's currently no selection, the function returns null.
-
-*/
-
-(function ($) {
-  function init(plot) {
-    var selection = {
-      first: { x: -1, y: -1}, second: { x: -1, y: -1},
-      show: false,
-      active: false
-    };
-
-    // FIXME: The drag handling implemented here should be
-    // abstracted out, there's some similar code from a library in
-    // the navigation plugin, this should be massaged a bit to fit
-    // the Flot cases here better and reused. Doing this would
-    // make this plugin much slimmer.
-    var savedhandlers = {};
-
-    var mouseUpHandler = null;
-
-    function onMouseMove(e) {
-      if (selection.active) {
-        updateSelection(e);
-
-        plot.getPlaceholder().trigger("plotselecting", [ getSelection() ]);
-      }
-    }
-
-    function onMouseDown(e) {
-      if (e.which != 1)  // only accept left-click
-        return;
-
-      // cancel out any text selections
-      document.body.focus();
-
-      // prevent text selection and drag in old-school browsers
-      if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) {
-        savedhandlers.onselectstart = document.onselectstart;
-        document.onselectstart = function () { return false; };
-      }
-      if (document.ondrag !== undefined && savedhandlers.ondrag == null) {
-        savedhandlers.ondrag = document.ondrag;
-        document.ondrag = function () { return false; };
-      }
-
-      setSelectionPos(selection.first, e);
-
-      selection.active = true;
-
-      // this is a bit silly, but we have to use a closure to be
-      // able to whack the same handler again
-      mouseUpHandler = function (e) { onMouseUp(e); };
-
-      $(document).one("mouseup", mouseUpHandler);
-    }
-
-    function onMouseUp(e) {
-      mouseUpHandler = null;
-
-      // revert drag stuff for old-school browsers
-      if (document.onselectstart !== undefined)
-        document.onselectstart = savedhandlers.onselectstart;
-      if (document.ondrag !== undefined)
-        document.ondrag = savedhandlers.ondrag;
-
-      // no more dragging
-      selection.active = false;
-      updateSelection(e);
-
-      if (selectionIsSane())
-        triggerSelectedEvent();
-      else {
-        // this counts as a clear
-        plot.getPlaceholder().trigger("plotunselected", [ ]);
-        plot.getPlaceholder().trigger("plotselecting", [ null ]);
-      }
-
-      return false;
-    }
-
-    function getSelection() {
-      if (!selectionIsSane())
-        return null;
-
-      if (!selection.show) return null;
-
-      var r = {}, c1 = selection.first, c2 = selection.second;
-      $.each(plot.getAxes(), function (name, axis) {
-        if (axis.used) {
-          var p1 = axis.c2p(c1[axis.direction]), p2 = axis.c2p(c2[axis.direction]);
-          r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) };
-        }
-      });
-      return r;
-    }
-
-    function triggerSelectedEvent() {
-      var r = getSelection();
-
-      plot.getPlaceholder().trigger("plotselected", [ r ]);
-
-      // backwards-compat stuff, to be removed in future
-      if (r.xaxis && r.yaxis)
-        plot.getPlaceholder().trigger("selected", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]);
-    }
-
-    function clamp(min, value, max) {
-      return value < min ? min: (value > max ? max: value);
-    }
-
-    function setSelectionPos(pos, e) {
-      var o = plot.getOptions();
-      var offset = plot.getPlaceholder().offset();
-      var plotOffset = plot.getPlotOffset();
-      pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width());
-      pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height());
-
-      if (o.selection.mode == "y")
-        pos.x = pos == selection.first ? 0 : plot.width();
-
-      if (o.selection.mode == "x")
-        pos.y = pos == selection.first ? 0 : plot.height();
-    }
-
-    function updateSelection(pos) {
-      if (pos.pageX == null)
-        return;
-
-      setSelectionPos(selection.second, pos);
-      if (selectionIsSane()) {
-        selection.show = true;
-        plot.triggerRedrawOverlay();
-      }
-      else
-        clearSelection(true);
-    }
-
-    function clearSelection(preventEvent) {
-      if (selection.show) {
-        selection.show = false;
-        plot.triggerRedrawOverlay();
-        if (!preventEvent)
-          plot.getPlaceholder().trigger("plotunselected", [ ]);
-      }
-    }
-
-    // function taken from markings support in Flot
-    function extractRange(ranges, coord) {
-      var axis, from, to, key, axes = plot.getAxes();
-
-      for (var k in axes) {
-        axis = axes[k];
-        if (axis.direction == coord) {
-          key = coord + axis.n + "axis";
-          if (!ranges[key] && axis.n == 1)
-            key = coord + "axis"; // support x1axis as xaxis
-          if (ranges[key]) {
-            from = ranges[key].from;
-            to = ranges[key].to;
-            break;
-          }
-        }
-      }
-
-      // backwards-compat stuff - to be removed in future
-      if (!ranges[key]) {
-        axis = coord == "x" ? plot.getXAxes()[0] : plot.getYAxes()[0];
-        from = ranges[coord + "1"];
-        to = ranges[coord + "2"];
-      }
-
-      // auto-reverse as an added bonus
-      if (from != null && to != null && from > to) {
-        var tmp = from;
-        from = to;
-        to = tmp;
-      }
-
-      return { from: from, to: to, axis: axis };
-    }
-
-    function setSelection(ranges, preventEvent) {
-      var axis, range, o = plot.getOptions();
-
-      if (o.selection.mode == "y") {
-        selection.first.x = 0;
-        selection.second.x = plot.width();
-      }
-      else {
-        range = extractRange(ranges, "x");
-
-        selection.first.x = range.axis.p2c(range.from);
-        selection.second.x = range.axis.p2c(range.to);
-      }
-
-      if (o.selection.mode == "x") {
-        selection.first.y = 0;
-        selection.second.y = plot.height();
-      }
-      else {
-        range = extractRange(ranges, "y");
-
-        selection.first.y = range.axis.p2c(range.from);
-        selection.second.y = range.axis.p2c(range.to);
-      }
-
-      selection.show = true;
-      plot.triggerRedrawOverlay();
-      if (!preventEvent && selectionIsSane())
-        triggerSelectedEvent();
-    }
-
-    function selectionIsSane() {
-      var minSize = plot.getOptions().selection.minSize;
-      return Math.abs(selection.second.x - selection.first.x) >= minSize &&
-          Math.abs(selection.second.y - selection.first.y) >= minSize;
-    }
-
-    plot.clearSelection = clearSelection;
-    plot.setSelection = setSelection;
-    plot.getSelection = getSelection;
-
-    plot.hooks.bindEvents.push(function(plot, eventHolder) {
-      var o = plot.getOptions();
-      if (o.selection.mode != null) {
-        eventHolder.mousemove(onMouseMove);
-        eventHolder.mousedown(onMouseDown);
-      }
-    });
-
-
-    plot.hooks.drawOverlay.push(function (plot, ctx) {
-      // draw selection
-      if (selection.show && selectionIsSane()) {
-        var plotOffset = plot.getPlotOffset();
-        var o = plot.getOptions();
-
-        ctx.save();
-        ctx.translate(plotOffset.left, plotOffset.top);
-
-        var c = $.color.parse(o.selection.color);
-
-        ctx.strokeStyle = c.scale('a', 0.8).toString();
-        ctx.lineWidth = 1;
-        ctx.lineJoin = o.selection.shape;
-        ctx.fillStyle = c.scale('a', 0.4).toString();
-
-        var x = Math.min(selection.first.x, selection.second.x) + 0.5,
-            y = Math.min(selection.first.y, selection.second.y) + 0.5,
-            w = Math.abs(selection.second.x - selection.first.x) - 1,
-            h = Math.abs(selection.second.y - selection.first.y) - 1;
-
-        ctx.fillRect(x, y, w, h);
-        ctx.strokeRect(x, y, w, h);
-
-        ctx.restore();
-      }
-    });
-
-    plot.hooks.shutdown.push(function (plot, eventHolder) {
-      eventHolder.unbind("mousemove", onMouseMove);
-      eventHolder.unbind("mousedown", onMouseDown);
-
-      if (mouseUpHandler)
-        $(document).unbind("mouseup", mouseUpHandler);
-    });
-
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: {
-      selection: {
-        mode: null, // one of null, "x", "y" or "xy"
-        color: "#e8cfac",
-        shape: "round", // one of "round", "miter", or "bevel"
-        minSize: 5 // minimum number of pixels
-      }
-    },
-    name: 'selection',
-    version: '1.1'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.stack.js b/ui/legacy/lib/flot/jquery.flot.stack.js
deleted file mode 100644
index 08e6052..0000000
--- a/ui/legacy/lib/flot/jquery.flot.stack.js
+++ /dev/null
@@ -1,188 +0,0 @@
-/* Flot plugin for stacking data sets rather than overlyaing them.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin assumes the data is sorted on x (or y if stacking horizontally).
-For line charts, it is assumed that if a line has an undefined gap (from a
-null point), then the line above it should have the same gap - insert zeros
-instead of "null" if you want another behaviour. This also holds for the start
-and end of the chart. Note that stacking a mix of positive and negative values
-in most instances doesn't make sense (so it looks weird).
-
-Two or more series are stacked when their "stack" attribute is set to the same
-key (which can be any number or string or just "true"). To specify the default
-stack, you can set the stack option like this:
-
-	series: {
-		stack: null/false, true, or a key (number/string)
-	}
-
-You can also specify it for a single series, like this:
-
-	$.plot( $("#placeholder"), [{
-		data: [ ... ],
-		stack: true
-	}])
-
-The stacking order is determined by the order of the data series in the array
-(later series end up on top of the previous).
-
-Internally, the plugin modifies the datapoints in each series, adding an
-offset to the y value. For line series, extra data points are inserted through
-interpolation. If there's a second y value, it's also adjusted (e.g for bar
-charts or filled areas).
-
-*/
-
-(function ($) {
-  var options = {
-    series: { stack: null } // or number/string
-  };
-
-  function init(plot) {
-    function findMatchingSeries(s, allseries) {
-      var res = null;
-      for (var i = 0; i < allseries.length; ++i) {
-        if (s == allseries[i])
-          break;
-
-        if (allseries[i].stack == s.stack)
-          res = allseries[i];
-      }
-
-      return res;
-    }
-
-    function stackData(plot, s, datapoints) {
-      if (s.stack == null || s.stack === false)
-        return;
-
-      var other = findMatchingSeries(s, plot.getData());
-      if (!other)
-        return;
-
-      var ps = datapoints.pointsize,
-          points = datapoints.points,
-          otherps = other.datapoints.pointsize,
-          otherpoints = other.datapoints.points,
-          newpoints = [],
-          px, py, intery, qx, qy, bottom,
-          withlines = s.lines.show,
-          horizontal = s.bars.horizontal,
-          withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y),
-          withsteps = withlines && s.lines.steps,
-          fromgap = true,
-          keyOffset = horizontal ? 1 : 0,
-          accumulateOffset = horizontal ? 0 : 1,
-          i = 0, j = 0, l, m;
-
-      while (true) {
-        if (i >= points.length)
-          break;
-
-        l = newpoints.length;
-
-        if (points[i] == null) {
-          // copy gaps
-          for (m = 0; m < ps; ++m)
-            newpoints.push(points[i + m]);
-          i += ps;
-        }
-        else if (j >= otherpoints.length) {
-          // for lines, we can't use the rest of the points
-          if (!withlines) {
-            for (m = 0; m < ps; ++m)
-              newpoints.push(points[i + m]);
-          }
-          i += ps;
-        }
-        else if (otherpoints[j] == null) {
-          // oops, got a gap
-          for (m = 0; m < ps; ++m)
-            newpoints.push(null);
-          fromgap = true;
-          j += otherps;
-        }
-        else {
-          // cases where we actually got two points
-          px = points[i + keyOffset];
-          py = points[i + accumulateOffset];
-          qx = otherpoints[j + keyOffset];
-          qy = otherpoints[j + accumulateOffset];
-          bottom = 0;
-
-          if (px == qx) {
-            for (m = 0; m < ps; ++m)
-              newpoints.push(points[i + m]);
-
-            newpoints[l + accumulateOffset] += qy;
-            bottom = qy;
-
-            i += ps;
-            j += otherps;
-          }
-          else if (px > qx) {
-            // we got past point below, might need to
-            // insert interpolated extra point
-            if (withlines && i > 0 && points[i - ps] != null) {
-              intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px);
-              newpoints.push(qx);
-              newpoints.push(intery + qy);
-              for (m = 2; m < ps; ++m)
-                newpoints.push(points[i + m]);
-              bottom = qy;
-            }
-
-            j += otherps;
-          }
-          else { // px < qx
-            if (fromgap && withlines) {
-              // if we come from a gap, we just skip this point
-              i += ps;
-              continue;
-            }
-
-            for (m = 0; m < ps; ++m)
-              newpoints.push(points[i + m]);
-
-            // we might be able to interpolate a point below,
-            // this can give us a better y
-            if (withlines && j > 0 && otherpoints[j - otherps] != null)
-              bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx);
-
-            newpoints[l + accumulateOffset] += bottom;
-
-            i += ps;
-          }
-
-          fromgap = false;
-
-          if (l != newpoints.length && withbottom)
-            newpoints[l + 2] += bottom;
-        }
-
-        // maintain the line steps invariant
-        if (withsteps && l != newpoints.length && l > 0
-            && newpoints[l] != null
-            && newpoints[l] != newpoints[l - ps]
-            && newpoints[l + 1] != newpoints[l - ps + 1]) {
-          for (m = 0; m < ps; ++m)
-            newpoints[l + ps + m] = newpoints[l + m];
-          newpoints[l + 1] = newpoints[l - ps + 1];
-        }
-      }
-
-      datapoints.points = newpoints;
-    }
-
-    plot.hooks.processDatapoints.push(stackData);
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: 'stack',
-    version: '1.2'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.symbol.js b/ui/legacy/lib/flot/jquery.flot.symbol.js
deleted file mode 100644
index f6a1f2d..0000000
--- a/ui/legacy/lib/flot/jquery.flot.symbol.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Flot plugin that adds some extra symbols for plotting points.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The symbols are accessed as strings through the standard symbol options:
-
-	series: {
-		points: {
-			symbol: "square" // or "diamond", "triangle", "cross"
-		}
-	}
-
-*/
-
-(function ($) {
-  function processRawData(plot, series, datapoints) {
-    // we normalize the area of each symbol so it is approximately the
-    // same as a circle of the given radius
-
-    var handlers = {
-      square: function (ctx, x, y, radius, shadow) {
-        // pi * r^2 = (2s)^2  =>  s = r * sqrt(pi)/2
-        var size = radius * Math.sqrt(Math.PI) / 2;
-        ctx.rect(x - size, y - size, size + size, size + size);
-      },
-      diamond: function (ctx, x, y, radius, shadow) {
-        // pi * r^2 = 2s^2  =>  s = r * sqrt(pi/2)
-        var size = radius * Math.sqrt(Math.PI / 2);
-        ctx.moveTo(x - size, y);
-        ctx.lineTo(x, y - size);
-        ctx.lineTo(x + size, y);
-        ctx.lineTo(x, y + size);
-        ctx.lineTo(x - size, y);
-      },
-      triangle: function (ctx, x, y, radius, shadow) {
-        // pi * r^2 = 1/2 * s^2 * sin (pi / 3)  =>  s = r * sqrt(2 * pi / sin(pi / 3))
-        var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3));
-        var height = size * Math.sin(Math.PI / 3);
-        ctx.moveTo(x - size/2, y + height/2);
-        ctx.lineTo(x + size/2, y + height/2);
-        if (!shadow) {
-          ctx.lineTo(x, y - height/2);
-          ctx.lineTo(x - size/2, y + height/2);
-        }
-      },
-      cross: function (ctx, x, y, radius, shadow) {
-        // pi * r^2 = (2s)^2  =>  s = r * sqrt(pi)/2
-        var size = radius * Math.sqrt(Math.PI) / 2;
-        ctx.moveTo(x - size, y - size);
-        ctx.lineTo(x + size, y + size);
-        ctx.moveTo(x - size, y + size);
-        ctx.lineTo(x + size, y - size);
-      }
-    };
-
-    var s = series.points.symbol;
-    if (handlers[s])
-      series.points.symbol = handlers[s];
-  }
-
-  function init(plot) {
-    plot.hooks.processDatapoints.push(processRawData);
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    name: 'symbols',
-    version: '1.0'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/flot/jquery.flot.threshold.js b/ui/legacy/lib/flot/jquery.flot.threshold.js
deleted file mode 100644
index 7e3b753..0000000
--- a/ui/legacy/lib/flot/jquery.flot.threshold.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/* Flot plugin for thresholding data.
-
-Copyright (c) 2007-2014 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin supports these options:
-
-	series: {
-		threshold: {
-			below: number
-			color: colorspec
-		}
-	}
-
-It can also be applied to a single series, like this:
-
-	$.plot( $("#placeholder"), [{
-		data: [ ... ],
-		threshold: { ... }
-	}])
-
-An array can be passed for multiple thresholding, like this:
-
-	threshold: [{
-		below: number1
-		color: color1
-	},{
-		below: number2
-		color: color2
-	}]
-
-These multiple threshold objects can be passed in any order since they are
-sorted by the processing function.
-
-The data points below "below" are drawn with the specified color. This makes
-it easy to mark points below 0, e.g. for budget data.
-
-Internally, the plugin works by splitting the data into two series, above and
-below the threshold. The extra series below the threshold will have its label
-cleared and the special "originSeries" attribute set to the original series.
-You may need to check for this in hover events.
-
-*/
-
-(function ($) {
-  var options = {
-    series: { threshold: null } // or { below: number, color: color spec}
-  };
-
-  function init(plot) {
-    function thresholdData(plot, s, datapoints, below, color) {
-      var ps = datapoints.pointsize, i, x, y, p, prevp,
-          thresholded = $.extend({}, s); // note: shallow copy
-
-      thresholded.datapoints = { points: [], pointsize: ps, format: datapoints.format };
-      thresholded.label = null;
-      thresholded.color = color;
-      thresholded.threshold = null;
-      thresholded.originSeries = s;
-      thresholded.data = [];
-
-      var origpoints = datapoints.points,
-          addCrossingPoints = s.lines.show;
-
-      var threspoints = [];
-      var newpoints = [];
-      var m;
-
-      for (i = 0; i < origpoints.length; i += ps) {
-        x = origpoints[i];
-        y = origpoints[i + 1];
-
-        prevp = p;
-        if (y < below)
-          p = threspoints;
-        else
-          p = newpoints;
-
-        if (addCrossingPoints && prevp != p && x != null
-            && i > 0 && origpoints[i - ps] != null) {
-          var interx = x + (below - y) * (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]);
-          prevp.push(interx);
-          prevp.push(below);
-          for (m = 2; m < ps; ++m)
-            prevp.push(origpoints[i + m]);
-
-          p.push(null); // start new segment
-          p.push(null);
-          for (m = 2; m < ps; ++m)
-            p.push(origpoints[i + m]);
-          p.push(interx);
-          p.push(below);
-          for (m = 2; m < ps; ++m)
-            p.push(origpoints[i + m]);
-        }
-
-        p.push(x);
-        p.push(y);
-        for (m = 2; m < ps; ++m)
-          p.push(origpoints[i + m]);
-      }
-
-      datapoints.points = newpoints;
-      thresholded.datapoints.points = threspoints;
-
-      if (thresholded.datapoints.points.length > 0) {
-        var origIndex = $.inArray(s, plot.getData());
-        // Insert newly-generated series right after original one (to prevent it from becoming top-most)
-        plot.getData().splice(origIndex + 1, 0, thresholded);
-      }
-
-      // FIXME: there are probably some edge cases left in bars
-    }
-
-    function processThresholds(plot, s, datapoints) {
-      if (!s.threshold)
-        return;
-
-      if (s.threshold instanceof Array) {
-        s.threshold.sort(function(a, b) {
-          return a.below - b.below;
-        });
-
-        $(s.threshold).each(function(i, th) {
-          thresholdData(plot, s, datapoints, th.below, th.color);
-        });
-      }
-      else {
-        thresholdData(plot, s, datapoints, s.threshold.below, s.threshold.color);
-      }
-    }
-
-    plot.hooks.processDatapoints.push(processThresholds);
-  }
-
-  $.plot.plugins.push({
-    init: init,
-    options: options,
-    name: 'threshold',
-    version: '1.2'
-  });
-})(jQuery);
diff --git a/ui/legacy/lib/jquery-ui/css/jquery-ui.css b/ui/legacy/lib/jquery-ui/css/jquery-ui.css
deleted file mode 100644
index c6c63b0..0000000
--- a/ui/legacy/lib/jquery-ui/css/jquery-ui.css
+++ /dev/null
@@ -1,1151 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2019-02-01
-* http://jqueryui.com
-* Includes: draggable.css, selectable.css, sortable.css, core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-draggable-handle {
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-selectable {
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-selectable-helper {
-	position: absolute;
-	z-index: 100;
-	border: 1px dotted black;
-}
-.ui-sortable-handle {
-	-ms-touch-action: none;
-	touch-action: none;
-}
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
-	display: none;
-}
-.ui-helper-hidden-accessible {
-	border: 0;
-	clip: rect(0 0 0 0);
-	height: 1px;
-	margin: -1px;
-	overflow: hidden;
-	padding: 0;
-	position: absolute;
-	width: 1px;
-}
-.ui-helper-reset {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	outline: 0;
-	line-height: 1.3;
-	text-decoration: none;
-	font-size: 100%;
-	list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
-	content: "";
-	display: table;
-	border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
-	clear: both;
-}
-.ui-helper-zfix {
-	width: 100%;
-	height: 100%;
-	top: 0;
-	left: 0;
-	position: absolute;
-	opacity: 0;
-	filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
-	z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
-	cursor: default !important;
-	pointer-events: none;
-}
-
-
-/* Icons
-----------------------------------*/
-.ui-icon {
-	display: inline-block;
-	vertical-align: middle;
-	margin-top: -.25em;
-	position: relative;
-	text-indent: -99999px;
-	overflow: hidden;
-	background-repeat: no-repeat;
-}
-
-.ui-widget-icon-block {
-	left: 50%;
-	margin-left: -8px;
-	display: block;
-}
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
-	position: fixed;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-}
-.ui-accordion .ui-accordion-header {
-	display: block;
-	cursor: pointer;
-	position: relative;
-	margin: 2px 0 0 0;
-	padding: .5em .5em .5em .7em;
-	font-size: 100%;
-}
-.ui-accordion .ui-accordion-content {
-	padding: 1em 2.2em;
-	border-top: 0;
-	overflow: auto;
-}
-.ui-autocomplete {
-	position: absolute;
-	top: 0;
-	left: 0;
-	cursor: default;
-}
-.ui-menu {
-	list-style: none;
-	padding: 0;
-	margin: 0;
-	display: block;
-	outline: 0;
-}
-.ui-menu .ui-menu {
-	position: absolute;
-}
-.ui-menu .ui-menu-item {
-	margin: 0;
-	cursor: pointer;
-	/* support: IE10, see #8844 */
-	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-item-wrapper {
-	position: relative;
-	padding: 3px 1em 3px .4em;
-}
-.ui-menu .ui-menu-divider {
-	margin: 5px 0;
-	height: 0;
-	font-size: 0;
-	line-height: 0;
-	border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
-	margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
-	position: relative;
-}
-.ui-menu-icons .ui-menu-item-wrapper {
-	padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
-	position: absolute;
-	top: 0;
-	bottom: 0;
-	left: .2em;
-	margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
-	left: auto;
-	right: 0;
-}
-.ui-button {
-	padding: .4em 1em;
-	display: inline-block;
-	position: relative;
-	line-height: normal;
-	margin-right: .1em;
-	cursor: pointer;
-	vertical-align: middle;
-	text-align: center;
-	-webkit-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-
-	/* Support: IE <= 11 */
-	overflow: visible;
-}
-
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
-	text-decoration: none;
-}
-
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
-	width: 2em;
-	box-sizing: border-box;
-	text-indent: -9999px;
-	white-space: nowrap;
-}
-
-/* no icon support for input elements */
-input.ui-button.ui-button-icon-only {
-	text-indent: 0;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon {
-	position: absolute;
-	top: 50%;
-	left: 50%;
-	margin-top: -8px;
-	margin-left: -8px;
-}
-
-.ui-button.ui-icon-notext .ui-icon {
-	padding: 0;
-	width: 2.1em;
-	height: 2.1em;
-	text-indent: -9999px;
-	white-space: nowrap;
-
-}
-
-input.ui-button.ui-icon-notext .ui-icon {
-	width: auto;
-	height: auto;
-	text-indent: 0;
-	white-space: normal;
-	padding: .4em 1em;
-}
-
-/* workarounds */
-/* Support: Firefox 5 - 40 */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
-	border: 0;
-	padding: 0;
-}
-.ui-controlgroup {
-	vertical-align: middle;
-	display: inline-block;
-}
-.ui-controlgroup > .ui-controlgroup-item {
-	float: left;
-	margin-left: 0;
-	margin-right: 0;
-}
-.ui-controlgroup > .ui-controlgroup-item:focus,
-.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
-	z-index: 9999;
-}
-.ui-controlgroup-vertical > .ui-controlgroup-item {
-	display: block;
-	float: none;
-	width: 100%;
-	margin-top: 0;
-	margin-bottom: 0;
-	text-align: left;
-}
-.ui-controlgroup-vertical .ui-controlgroup-item {
-	box-sizing: border-box;
-}
-.ui-controlgroup .ui-controlgroup-label {
-	padding: .4em 1em;
-}
-.ui-controlgroup .ui-controlgroup-label span {
-	font-size: 80%;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
-	border-left: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
-	border-top: none;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
-	border-right: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
-	border-bottom: none;
-}
-
-/* Spinner specific style fixes */
-.ui-controlgroup-vertical .ui-spinner-input {
-
-	/* Support: IE8 only, Android < 4.4 only */
-	width: 75%;
-	width: calc( 100% - 2.4em );
-}
-.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
-	border-top-style: solid;
-}
-
-.ui-checkboxradio-label .ui-icon-background {
-	box-shadow: inset 1px 1px 1px #ccc;
-	border-radius: .12em;
-	border: none;
-}
-.ui-checkboxradio-radio-label .ui-icon-background {
-	width: 16px;
-	height: 16px;
-	border-radius: 1em;
-	overflow: visible;
-	border: none;
-}
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
-	background-image: none;
-	width: 8px;
-	height: 8px;
-	border-width: 4px;
-	border-style: solid;
-}
-.ui-checkboxradio-disabled {
-	pointer-events: none;
-}
-.ui-datepicker {
-	width: 17em;
-	padding: .2em .2em 0;
-	display: none;
-}
-.ui-datepicker .ui-datepicker-header {
-	position: relative;
-	padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
-	position: absolute;
-	top: 2px;
-	width: 1.8em;
-	height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
-	top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
-	left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
-	right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
-	left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
-	right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
-	display: block;
-	position: absolute;
-	left: 50%;
-	margin-left: -8px;
-	top: 50%;
-	margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
-	margin: 0 2.3em;
-	line-height: 1.8em;
-	text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
-	font-size: 1em;
-	margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
-	width: 45%;
-}
-.ui-datepicker table {
-	width: 100%;
-	font-size: .9em;
-	border-collapse: collapse;
-	margin: 0 0 .4em;
-}
-.ui-datepicker th {
-	padding: .7em .3em;
-	text-align: center;
-	font-weight: bold;
-	border: 0;
-}
-.ui-datepicker td {
-	border: 0;
-	padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
-	display: block;
-	padding: .2em;
-	text-align: right;
-	text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
-	background-image: none;
-	margin: .7em 0 0 0;
-	padding: 0 .2em;
-	border-left: 0;
-	border-right: 0;
-	border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
-	float: right;
-	margin: .5em .2em .4em;
-	cursor: pointer;
-	padding: .2em .6em .3em .6em;
-	width: auto;
-	overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
-	float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
-	width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
-	float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
-	width: 95%;
-	margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
-	width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
-	width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
-	width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
-	border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
-	clear: left;
-}
-.ui-datepicker-row-break {
-	clear: both;
-	width: 100%;
-	font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
-	direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
-	right: 2px;
-	left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
-	left: 2px;
-	right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
-	right: 1px;
-	left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
-	left: 1px;
-	right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
-	clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
-	float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
-	float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
-	border-right-width: 0;
-	border-left-width: 1px;
-}
-
-/* Icons */
-.ui-datepicker .ui-icon {
-	display: block;
-	text-indent: -99999px;
-	overflow: hidden;
-	background-repeat: no-repeat;
-	left: .5em;
-	top: .3em;
-}
-.ui-progressbar {
-	height: 2em;
-	text-align: left;
-	overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
-	margin: -1px;
-	height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
-	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
-	height: 100%;
-	filter: alpha(opacity=25); /* support: IE8 */
-	opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
-	background-image: none;
-}
-.ui-selectmenu-menu {
-	padding: 0;
-	margin: 0;
-	position: absolute;
-	top: 0;
-	left: 0;
-	display: none;
-}
-.ui-selectmenu-menu .ui-menu {
-	overflow: auto;
-	overflow-x: hidden;
-	padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
-	font-size: 1em;
-	font-weight: bold;
-	line-height: 1.5;
-	padding: 2px 0.4em;
-	margin: 0.5em 0 0 0;
-	height: auto;
-	border: 0;
-}
-.ui-selectmenu-open {
-	display: block;
-}
-.ui-selectmenu-text {
-	display: block;
-	margin-right: 20px;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-.ui-selectmenu-button.ui-button {
-	text-align: left;
-	white-space: nowrap;
-	width: 14em;
-}
-.ui-selectmenu-icon.ui-icon {
-	float: right;
-	margin-top: 0;
-}
-.ui-slider {
-	position: relative;
-	text-align: left;
-}
-.ui-slider .ui-slider-handle {
-	position: absolute;
-	z-index: 2;
-	width: 1.2em;
-	height: 1.2em;
-	cursor: default;
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.ui-slider .ui-slider-range {
-	position: absolute;
-	z-index: 1;
-	font-size: .7em;
-	display: block;
-	border: 0;
-	background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
-	filter: inherit;
-}
-
-.ui-slider-horizontal {
-	height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
-	top: -.3em;
-	margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
-	top: 0;
-	height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
-	left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
-	right: 0;
-}
-
-.ui-slider-vertical {
-	width: .8em;
-	height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
-	left: -.3em;
-	margin-left: 0;
-	margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
-	left: 0;
-	width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
-	bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
-	top: 0;
-}
-.ui-spinner {
-	position: relative;
-	display: inline-block;
-	overflow: hidden;
-	padding: 0;
-	vertical-align: middle;
-}
-.ui-spinner-input {
-	border: none;
-	background: none;
-	color: inherit;
-	padding: .222em 0;
-	margin: .2em 0;
-	vertical-align: middle;
-	margin-left: .4em;
-	margin-right: 2em;
-}
-.ui-spinner-button {
-	width: 1.6em;
-	height: 50%;
-	font-size: .5em;
-	padding: 0;
-	margin: 0;
-	text-align: center;
-	position: absolute;
-	cursor: default;
-	display: block;
-	overflow: hidden;
-	right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
-	border-top-style: none;
-	border-bottom-style: none;
-	border-right-style: none;
-}
-.ui-spinner-up {
-	top: 0;
-}
-.ui-spinner-down {
-	bottom: 0;
-}
-.ui-tabs {
-	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-	padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
-	margin: 0;
-	padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
-	list-style: none;
-	float: left;
-	position: relative;
-	top: 0;
-	margin: 1px .2em 0 0;
-	border-bottom-width: 0;
-	padding: 0;
-	white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
-	float: left;
-	padding: .5em 1em;
-	text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
-	margin-bottom: -1px;
-	padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
-	cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
-	cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
-	display: block;
-	border-width: 0;
-	padding: 1em 1.4em;
-	background: none;
-}
-.ui-tooltip {
-	padding: 8px;
-	position: absolute;
-	z-index: 9999;
-	max-width: 300px;
-}
-body .ui-tooltip {
-	border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
-	font-family: Arial,Helvetica,sans-serif;
-	font-size: 1em;
-}
-.ui-widget .ui-widget {
-	font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
-	font-family: Arial,Helvetica,sans-serif;
-	font-size: 1em;
-}
-.ui-widget.ui-widget-content {
-	border: 1px solid #c5c5c5;
-}
-.ui-widget-content {
-	border: 1px solid #dddddd;
-	background: #ffffff;
-	color: #333333;
-}
-.ui-widget-content a {
-	color: #333333;
-}
-.ui-widget-header {
-	border: 1px solid #dddddd;
-	background: #e9e9e9;
-	color: #333333;
-	font-weight: bold;
-}
-.ui-widget-header a {
-	color: #333333;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default,
-.ui-button,
-
-/* We use html here because we need a greater specificity to make sure disabled
-works properly when clicked or hovered */
-html .ui-button.ui-state-disabled:hover,
-html .ui-button.ui-state-disabled:active {
-	border: 1px solid #c5c5c5;
-	background: #f6f6f6;
-	font-weight: normal;
-	color: #454545;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited,
-a.ui-button,
-a:link.ui-button,
-a:visited.ui-button,
-.ui-button {
-	color: #454545;
-	text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus,
-.ui-button:hover,
-.ui-button:focus {
-	border: 1px solid #cccccc;
-	background: #ededed;
-	font-weight: normal;
-	color: #2b2b2b;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited,
-a.ui-button:hover,
-a.ui-button:focus {
-	color: #2b2b2b;
-	text-decoration: none;
-}
-
-.ui-visual-focus {
-	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active,
-a.ui-button:active,
-.ui-button:active,
-.ui-button.ui-state-active:hover {
-	border: 1px solid #003eff;
-	background: #007fff;
-	font-weight: normal;
-	color: #ffffff;
-}
-.ui-icon-background,
-.ui-state-active .ui-icon-background {
-	border: #003eff;
-	background-color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
-	color: #ffffff;
-	text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
-	border: 1px solid #dad55e;
-	background: #fffa90;
-	color: #777620;
-}
-.ui-state-checked {
-	border: 1px solid #dad55e;
-	background: #fffa90;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
-	color: #777620;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
-	border: 1px solid #f1a899;
-	background: #fddfdf;
-	color: #5f3f3f;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
-	color: #5f3f3f;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
-	color: #5f3f3f;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
-	font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
-	opacity: .7;
-	filter:Alpha(Opacity=70); /* support: IE8 */
-	font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
-	opacity: .35;
-	filter:Alpha(Opacity=35); /* support: IE8 */
-	background-image: none;
-}
-.ui-state-disabled .ui-icon {
-	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
-	width: 16px;
-	height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
-	background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-widget-header .ui-icon {
-	background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon,
-.ui-button:hover .ui-icon,
-.ui-button:focus .ui-icon {
-	background-image: url("images/ui-icons_555555_256x240.png");
-}
-.ui-state-active .ui-icon,
-.ui-button:active .ui-icon {
-	background-image: url("images/ui-icons_ffffff_256x240.png");
-}
-.ui-state-highlight .ui-icon,
-.ui-button .ui-state-highlight.ui-icon {
-	background-image: url("images/ui-icons_777620_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
-	background-image: url("images/ui-icons_cc0000_256x240.png");
-}
-.ui-button .ui-icon {
-	background-image: url("images/ui-icons_777777_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-caret-1-n { background-position: 0 0; }
-.ui-icon-caret-1-ne { background-position: -16px 0; }
-.ui-icon-caret-1-e { background-position: -32px 0; }
-.ui-icon-caret-1-se { background-position: -48px 0; }
-.ui-icon-caret-1-s { background-position: -65px 0; }
-.ui-icon-caret-1-sw { background-position: -80px 0; }
-.ui-icon-caret-1-w { background-position: -96px 0; }
-.ui-icon-caret-1-nw { background-position: -112px 0; }
-.ui-icon-caret-2-n-s { background-position: -128px 0; }
-.ui-icon-caret-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -65px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -65px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
-	border-top-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
-	border-top-right-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
-	border-bottom-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
-	border-bottom-right-radius: 3px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
-	background: #aaaaaa;
-	opacity: .3;
-	filter: Alpha(Opacity=30); /* support: IE8 */
-}
-.ui-widget-shadow {
-	-webkit-box-shadow: 0px 0px 5px #666666;
-	box-shadow: 0px 0px 5px #666666;
-}
diff --git a/ui/legacy/lib/jquery-ui/js/jquery-ui.js b/ui/legacy/lib/jquery-ui/js/jquery-ui.js
deleted file mode 100644
index 0213552..0000000
--- a/ui/legacy/lib/jquery-ui/js/jquery-ui.js
+++ /dev/null
@@ -1,18706 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2016-09-14
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "jquery" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery );
-	}
-}(function( $ ) {
-
-$.ui = $.ui || {};
-
-var version = $.ui.version = "1.12.1";
-
-
-/*!
- * jQuery UI Widget 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Widget
-//>>group: Core
-//>>description: Provides a factory for creating stateful widgets with a common API.
-//>>docs: http://api.jqueryui.com/jQuery.widget/
-//>>demos: http://jqueryui.com/widget/
-
-
-
-var widgetUuid = 0;
-var widgetSlice = Array.prototype.slice;
-
-$.cleanData = ( function( orig ) {
-	return function( elems ) {
-		var events, elem, i;
-		for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
-			try {
-
-				// Only trigger remove when necessary to save time
-				events = $._data( elem, "events" );
-				if ( events && events.remove ) {
-					$( elem ).triggerHandler( "remove" );
-				}
-
-			// Http://bugs.jquery.com/ticket/8235
-			} catch ( e ) {}
-		}
-		orig( elems );
-	};
-} )( $.cleanData );
-
-$.widget = function( name, base, prototype ) {
-	var existingConstructor, constructor, basePrototype;
-
-	// ProxiedPrototype allows the provided prototype to remain unmodified
-	// so that it can be used as a mixin for multiple widgets (#8876)
-	var proxiedPrototype = {};
-
-	var namespace = name.split( "." )[ 0 ];
-	name = name.split( "." )[ 1 ];
-	var fullName = namespace + "-" + name;
-
-	if ( !prototype ) {
-		prototype = base;
-		base = $.Widget;
-	}
-
-	if ( $.isArray( prototype ) ) {
-		prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
-	}
-
-	// Create selector for plugin
-	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
-		return !!$.data( elem, fullName );
-	};
-
-	$[ namespace ] = $[ namespace ] || {};
-	existingConstructor = $[ namespace ][ name ];
-	constructor = $[ namespace ][ name ] = function( options, element ) {
-
-		// Allow instantiation without "new" keyword
-		if ( !this._createWidget ) {
-			return new constructor( options, element );
-		}
-
-		// Allow instantiation without initializing for simple inheritance
-		// must use "new" keyword (the code above always passes args)
-		if ( arguments.length ) {
-			this._createWidget( options, element );
-		}
-	};
-
-	// Extend with the existing constructor to carry over any static properties
-	$.extend( constructor, existingConstructor, {
-		version: prototype.version,
-
-		// Copy the object used to create the prototype in case we need to
-		// redefine the widget later
-		_proto: $.extend( {}, prototype ),
-
-		// Track widgets that inherit from this widget in case this widget is
-		// redefined after a widget inherits from it
-		_childConstructors: []
-	} );
-
-	basePrototype = new base();
-
-	// We need to make the options hash a property directly on the new instance
-	// otherwise we'll modify the options hash on the prototype that we're
-	// inheriting from
-	basePrototype.options = $.widget.extend( {}, basePrototype.options );
-	$.each( prototype, function( prop, value ) {
-		if ( !$.isFunction( value ) ) {
-			proxiedPrototype[ prop ] = value;
-			return;
-		}
-		proxiedPrototype[ prop ] = ( function() {
-			function _super() {
-				return base.prototype[ prop ].apply( this, arguments );
-			}
-
-			function _superApply( args ) {
-				return base.prototype[ prop ].apply( this, args );
-			}
-
-			return function() {
-				var __super = this._super;
-				var __superApply = this._superApply;
-				var returnValue;
-
-				this._super = _super;
-				this._superApply = _superApply;
-
-				returnValue = value.apply( this, arguments );
-
-				this._super = __super;
-				this._superApply = __superApply;
-
-				return returnValue;
-			};
-		} )();
-	} );
-	constructor.prototype = $.widget.extend( basePrototype, {
-
-		// TODO: remove support for widgetEventPrefix
-		// always use the name + a colon as the prefix, e.g., draggable:start
-		// don't prefix for widgets that aren't DOM-based
-		widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
-	}, proxiedPrototype, {
-		constructor: constructor,
-		namespace: namespace,
-		widgetName: name,
-		widgetFullName: fullName
-	} );
-
-	// If this widget is being redefined then we need to find all widgets that
-	// are inheriting from it and redefine all of them so that they inherit from
-	// the new version of this widget. We're essentially trying to replace one
-	// level in the prototype chain.
-	if ( existingConstructor ) {
-		$.each( existingConstructor._childConstructors, function( i, child ) {
-			var childPrototype = child.prototype;
-
-			// Redefine the child widget using the same prototype that was
-			// originally used, but inherit from the new version of the base
-			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
-				child._proto );
-		} );
-
-		// Remove the list of existing child constructors from the old constructor
-		// so the old child constructors can be garbage collected
-		delete existingConstructor._childConstructors;
-	} else {
-		base._childConstructors.push( constructor );
-	}
-
-	$.widget.bridge( name, constructor );
-
-	return constructor;
-};
-
-$.widget.extend = function( target ) {
-	var input = widgetSlice.call( arguments, 1 );
-	var inputIndex = 0;
-	var inputLength = input.length;
-	var key;
-	var value;
-
-	for ( ; inputIndex < inputLength; inputIndex++ ) {
-		for ( key in input[ inputIndex ] ) {
-			value = input[ inputIndex ][ key ];
-			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
-
-				// Clone objects
-				if ( $.isPlainObject( value ) ) {
-					target[ key ] = $.isPlainObject( target[ key ] ) ?
-						$.widget.extend( {}, target[ key ], value ) :
-
-						// Don't extend strings, arrays, etc. with objects
-						$.widget.extend( {}, value );
-
-				// Copy everything else by reference
-				} else {
-					target[ key ] = value;
-				}
-			}
-		}
-	}
-	return target;
-};
-
-$.widget.bridge = function( name, object ) {
-	var fullName = object.prototype.widgetFullName || name;
-	$.fn[ name ] = function( options ) {
-		var isMethodCall = typeof options === "string";
-		var args = widgetSlice.call( arguments, 1 );
-		var returnValue = this;
-
-		if ( isMethodCall ) {
-
-			// If this is an empty collection, we need to have the instance method
-			// return undefined instead of the jQuery instance
-			if ( !this.length && options === "instance" ) {
-				returnValue = undefined;
-			} else {
-				this.each( function() {
-					var methodValue;
-					var instance = $.data( this, fullName );
-
-					if ( options === "instance" ) {
-						returnValue = instance;
-						return false;
-					}
-
-					if ( !instance ) {
-						return $.error( "cannot call methods on " + name +
-							" prior to initialization; " +
-							"attempted to call method '" + options + "'" );
-					}
-
-					if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
-						return $.error( "no such method '" + options + "' for " + name +
-							" widget instance" );
-					}
-
-					methodValue = instance[ options ].apply( instance, args );
-
-					if ( methodValue !== instance && methodValue !== undefined ) {
-						returnValue = methodValue && methodValue.jquery ?
-							returnValue.pushStack( methodValue.get() ) :
-							methodValue;
-						return false;
-					}
-				} );
-			}
-		} else {
-
-			// Allow multiple hashes to be passed on init
-			if ( args.length ) {
-				options = $.widget.extend.apply( null, [ options ].concat( args ) );
-			}
-
-			this.each( function() {
-				var instance = $.data( this, fullName );
-				if ( instance ) {
-					instance.option( options || {} );
-					if ( instance._init ) {
-						instance._init();
-					}
-				} else {
-					$.data( this, fullName, new object( options, this ) );
-				}
-			} );
-		}
-
-		return returnValue;
-	};
-};
-
-$.Widget = function( /* options, element */ ) {};
-$.Widget._childConstructors = [];
-
-$.Widget.prototype = {
-	widgetName: "widget",
-	widgetEventPrefix: "",
-	defaultElement: "<div>",
-
-	options: {
-		classes: {},
-		disabled: false,
-
-		// Callbacks
-		create: null
-	},
-
-	_createWidget: function( options, element ) {
-		element = $( element || this.defaultElement || this )[ 0 ];
-		this.element = $( element );
-		this.uuid = widgetUuid++;
-		this.eventNamespace = "." + this.widgetName + this.uuid;
-
-		this.bindings = $();
-		this.hoverable = $();
-		this.focusable = $();
-		this.classesElementLookup = {};
-
-		if ( element !== this ) {
-			$.data( element, this.widgetFullName, this );
-			this._on( true, this.element, {
-				remove: function( event ) {
-					if ( event.target === element ) {
-						this.destroy();
-					}
-				}
-			} );
-			this.document = $( element.style ?
-
-				// Element within the document
-				element.ownerDocument :
-
-				// Element is window or document
-				element.document || element );
-			this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
-		}
-
-		this.options = $.widget.extend( {},
-			this.options,
-			this._getCreateOptions(),
-			options );
-
-		this._create();
-
-		if ( this.options.disabled ) {
-			this._setOptionDisabled( this.options.disabled );
-		}
-
-		this._trigger( "create", null, this._getCreateEventData() );
-		this._init();
-	},
-
-	_getCreateOptions: function() {
-		return {};
-	},
-
-	_getCreateEventData: $.noop,
-
-	_create: $.noop,
-
-	_init: $.noop,
-
-	destroy: function() {
-		var that = this;
-
-		this._destroy();
-		$.each( this.classesElementLookup, function( key, value ) {
-			that._removeClass( value, key );
-		} );
-
-		// We can probably remove the unbind calls in 2.0
-		// all event bindings should go through this._on()
-		this.element
-			.off( this.eventNamespace )
-			.removeData( this.widgetFullName );
-		this.widget()
-			.off( this.eventNamespace )
-			.removeAttr( "aria-disabled" );
-
-		// Clean up events and states
-		this.bindings.off( this.eventNamespace );
-	},
-
-	_destroy: $.noop,
-
-	widget: function() {
-		return this.element;
-	},
-
-	option: function( key, value ) {
-		var options = key;
-		var parts;
-		var curOption;
-		var i;
-
-		if ( arguments.length === 0 ) {
-
-			// Don't return a reference to the internal hash
-			return $.widget.extend( {}, this.options );
-		}
-
-		if ( typeof key === "string" ) {
-
-			// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
-			options = {};
-			parts = key.split( "." );
-			key = parts.shift();
-			if ( parts.length ) {
-				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
-				for ( i = 0; i < parts.length - 1; i++ ) {
-					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
-					curOption = curOption[ parts[ i ] ];
-				}
-				key = parts.pop();
-				if ( arguments.length === 1 ) {
-					return curOption[ key ] === undefined ? null : curOption[ key ];
-				}
-				curOption[ key ] = value;
-			} else {
-				if ( arguments.length === 1 ) {
-					return this.options[ key ] === undefined ? null : this.options[ key ];
-				}
-				options[ key ] = value;
-			}
-		}
-
-		this._setOptions( options );
-
-		return this;
-	},
-
-	_setOptions: function( options ) {
-		var key;
-
-		for ( key in options ) {
-			this._setOption( key, options[ key ] );
-		}
-
-		return this;
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "classes" ) {
-			this._setOptionClasses( value );
-		}
-
-		this.options[ key ] = value;
-
-		if ( key === "disabled" ) {
-			this._setOptionDisabled( value );
-		}
-
-		return this;
-	},
-
-	_setOptionClasses: function( value ) {
-		var classKey, elements, currentElements;
-
-		for ( classKey in value ) {
-			currentElements = this.classesElementLookup[ classKey ];
-			if ( value[ classKey ] === this.options.classes[ classKey ] ||
-					!currentElements ||
-					!currentElements.length ) {
-				continue;
-			}
-
-			// We are doing this to create a new jQuery object because the _removeClass() call
-			// on the next line is going to destroy the reference to the current elements being
-			// tracked. We need to save a copy of this collection so that we can add the new classes
-			// below.
-			elements = $( currentElements.get() );
-			this._removeClass( currentElements, classKey );
-
-			// We don't use _addClass() here, because that uses this.options.classes
-			// for generating the string of classes. We want to use the value passed in from
-			// _setOption(), this is the new value of the classes option which was passed to
-			// _setOption(). We pass this value directly to _classes().
-			elements.addClass( this._classes( {
-				element: elements,
-				keys: classKey,
-				classes: value,
-				add: true
-			} ) );
-		}
-	},
-
-	_setOptionDisabled: function( value ) {
-		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
-
-		// If the widget is becoming disabled, then nothing is interactive
-		if ( value ) {
-			this._removeClass( this.hoverable, null, "ui-state-hover" );
-			this._removeClass( this.focusable, null, "ui-state-focus" );
-		}
-	},
-
-	enable: function() {
-		return this._setOptions( { disabled: false } );
-	},
-
-	disable: function() {
-		return this._setOptions( { disabled: true } );
-	},
-
-	_classes: function( options ) {
-		var full = [];
-		var that = this;
-
-		options = $.extend( {
-			element: this.element,
-			classes: this.options.classes || {}
-		}, options );
-
-		function processClassString( classes, checkOption ) {
-			var current, i;
-			for ( i = 0; i < classes.length; i++ ) {
-				current = that.classesElementLookup[ classes[ i ] ] || $();
-				if ( options.add ) {
-					current = $( $.unique( current.get().concat( options.element.get() ) ) );
-				} else {
-					current = $( current.not( options.element ).get() );
-				}
-				that.classesElementLookup[ classes[ i ] ] = current;
-				full.push( classes[ i ] );
-				if ( checkOption && options.classes[ classes[ i ] ] ) {
-					full.push( options.classes[ classes[ i ] ] );
-				}
-			}
-		}
-
-		this._on( options.element, {
-			"remove": "_untrackClassesElement"
-		} );
-
-		if ( options.keys ) {
-			processClassString( options.keys.match( /\S+/g ) || [], true );
-		}
-		if ( options.extra ) {
-			processClassString( options.extra.match( /\S+/g ) || [] );
-		}
-
-		return full.join( " " );
-	},
-
-	_untrackClassesElement: function( event ) {
-		var that = this;
-		$.each( that.classesElementLookup, function( key, value ) {
-			if ( $.inArray( event.target, value ) !== -1 ) {
-				that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
-			}
-		} );
-	},
-
-	_removeClass: function( element, keys, extra ) {
-		return this._toggleClass( element, keys, extra, false );
-	},
-
-	_addClass: function( element, keys, extra ) {
-		return this._toggleClass( element, keys, extra, true );
-	},
-
-	_toggleClass: function( element, keys, extra, add ) {
-		add = ( typeof add === "boolean" ) ? add : extra;
-		var shift = ( typeof element === "string" || element === null ),
-			options = {
-				extra: shift ? keys : extra,
-				keys: shift ? element : keys,
-				element: shift ? this.element : element,
-				add: add
-			};
-		options.element.toggleClass( this._classes( options ), add );
-		return this;
-	},
-
-	_on: function( suppressDisabledCheck, element, handlers ) {
-		var delegateElement;
-		var instance = this;
-
-		// No suppressDisabledCheck flag, shuffle arguments
-		if ( typeof suppressDisabledCheck !== "boolean" ) {
-			handlers = element;
-			element = suppressDisabledCheck;
-			suppressDisabledCheck = false;
-		}
-
-		// No element argument, shuffle and use this.element
-		if ( !handlers ) {
-			handlers = element;
-			element = this.element;
-			delegateElement = this.widget();
-		} else {
-			element = delegateElement = $( element );
-			this.bindings = this.bindings.add( element );
-		}
-
-		$.each( handlers, function( event, handler ) {
-			function handlerProxy() {
-
-				// Allow widgets to customize the disabled handling
-				// - disabled as an array instead of boolean
-				// - disabled class as method for disabling individual parts
-				if ( !suppressDisabledCheck &&
-						( instance.options.disabled === true ||
-						$( this ).hasClass( "ui-state-disabled" ) ) ) {
-					return;
-				}
-				return ( typeof handler === "string" ? instance[ handler ] : handler )
-					.apply( instance, arguments );
-			}
-
-			// Copy the guid so direct unbinding works
-			if ( typeof handler !== "string" ) {
-				handlerProxy.guid = handler.guid =
-					handler.guid || handlerProxy.guid || $.guid++;
-			}
-
-			var match = event.match( /^([\w:-]*)\s*(.*)$/ );
-			var eventName = match[ 1 ] + instance.eventNamespace;
-			var selector = match[ 2 ];
-
-			if ( selector ) {
-				delegateElement.on( eventName, selector, handlerProxy );
-			} else {
-				element.on( eventName, handlerProxy );
-			}
-		} );
-	},
-
-	_off: function( element, eventName ) {
-		eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
-			this.eventNamespace;
-		element.off( eventName ).off( eventName );
-
-		// Clear the stack to avoid memory leaks (#10056)
-		this.bindings = $( this.bindings.not( element ).get() );
-		this.focusable = $( this.focusable.not( element ).get() );
-		this.hoverable = $( this.hoverable.not( element ).get() );
-	},
-
-	_delay: function( handler, delay ) {
-		function handlerProxy() {
-			return ( typeof handler === "string" ? instance[ handler ] : handler )
-				.apply( instance, arguments );
-		}
-		var instance = this;
-		return setTimeout( handlerProxy, delay || 0 );
-	},
-
-	_hoverable: function( element ) {
-		this.hoverable = this.hoverable.add( element );
-		this._on( element, {
-			mouseenter: function( event ) {
-				this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
-			},
-			mouseleave: function( event ) {
-				this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
-			}
-		} );
-	},
-
-	_focusable: function( element ) {
-		this.focusable = this.focusable.add( element );
-		this._on( element, {
-			focusin: function( event ) {
-				this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
-			},
-			focusout: function( event ) {
-				this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
-			}
-		} );
-	},
-
-	_trigger: function( type, event, data ) {
-		var prop, orig;
-		var callback = this.options[ type ];
-
-		data = data || {};
-		event = $.Event( event );
-		event.type = ( type === this.widgetEventPrefix ?
-			type :
-			this.widgetEventPrefix + type ).toLowerCase();
-
-		// The original event may come from any element
-		// so we need to reset the target on the new event
-		event.target = this.element[ 0 ];
-
-		// Copy original event properties over to the new event
-		orig = event.originalEvent;
-		if ( orig ) {
-			for ( prop in orig ) {
-				if ( !( prop in event ) ) {
-					event[ prop ] = orig[ prop ];
-				}
-			}
-		}
-
-		this.element.trigger( event, data );
-		return !( $.isFunction( callback ) &&
-			callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
-			event.isDefaultPrevented() );
-	}
-};
-
-$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
-	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
-		if ( typeof options === "string" ) {
-			options = { effect: options };
-		}
-
-		var hasOptions;
-		var effectName = !options ?
-			method :
-			options === true || typeof options === "number" ?
-				defaultEffect :
-				options.effect || defaultEffect;
-
-		options = options || {};
-		if ( typeof options === "number" ) {
-			options = { duration: options };
-		}
-
-		hasOptions = !$.isEmptyObject( options );
-		options.complete = callback;
-
-		if ( options.delay ) {
-			element.delay( options.delay );
-		}
-
-		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
-			element[ method ]( options );
-		} else if ( effectName !== method && element[ effectName ] ) {
-			element[ effectName ]( options.duration, options.easing, callback );
-		} else {
-			element.queue( function( next ) {
-				$( this )[ method ]();
-				if ( callback ) {
-					callback.call( element[ 0 ] );
-				}
-				next();
-			} );
-		}
-	};
-} );
-
-var widget = $.widget;
-
-
-/*!
- * jQuery UI Position 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/position/
- */
-
-//>>label: Position
-//>>group: Core
-//>>description: Positions elements relative to other elements.
-//>>docs: http://api.jqueryui.com/position/
-//>>demos: http://jqueryui.com/position/
-
-
-( function() {
-var cachedScrollbarWidth,
-	max = Math.max,
-	abs = Math.abs,
-	rhorizontal = /left|center|right/,
-	rvertical = /top|center|bottom/,
-	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
-	rposition = /^\w+/,
-	rpercent = /%$/,
-	_position = $.fn.position;
-
-function getOffsets( offsets, width, height ) {
-	return [
-		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
-		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
-	];
-}
-
-function parseCss( element, property ) {
-	return parseInt( $.css( element, property ), 10 ) || 0;
-}
-
-function getDimensions( elem ) {
-	var raw = elem[ 0 ];
-	if ( raw.nodeType === 9 ) {
-		return {
-			width: elem.width(),
-			height: elem.height(),
-			offset: { top: 0, left: 0 }
-		};
-	}
-	if ( $.isWindow( raw ) ) {
-		return {
-			width: elem.width(),
-			height: elem.height(),
-			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
-		};
-	}
-	if ( raw.preventDefault ) {
-		return {
-			width: 0,
-			height: 0,
-			offset: { top: raw.pageY, left: raw.pageX }
-		};
-	}
-	return {
-		width: elem.outerWidth(),
-		height: elem.outerHeight(),
-		offset: elem.offset()
-	};
-}
-
-$.position = {
-	scrollbarWidth: function() {
-		if ( cachedScrollbarWidth !== undefined ) {
-			return cachedScrollbarWidth;
-		}
-		var w1, w2,
-			div = $( "<div " +
-				"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
-				"<div style='height:100px;width:auto;'></div></div>" ),
-			innerDiv = div.children()[ 0 ];
-
-		$( "body" ).append( div );
-		w1 = innerDiv.offsetWidth;
-		div.css( "overflow", "scroll" );
-
-		w2 = innerDiv.offsetWidth;
-
-		if ( w1 === w2 ) {
-			w2 = div[ 0 ].clientWidth;
-		}
-
-		div.remove();
-
-		return ( cachedScrollbarWidth = w1 - w2 );
-	},
-	getScrollInfo: function( within ) {
-		var overflowX = within.isWindow || within.isDocument ? "" :
-				within.element.css( "overflow-x" ),
-			overflowY = within.isWindow || within.isDocument ? "" :
-				within.element.css( "overflow-y" ),
-			hasOverflowX = overflowX === "scroll" ||
-				( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
-			hasOverflowY = overflowY === "scroll" ||
-				( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
-		return {
-			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
-			height: hasOverflowX ? $.position.scrollbarWidth() : 0
-		};
-	},
-	getWithinInfo: function( element ) {
-		var withinElement = $( element || window ),
-			isWindow = $.isWindow( withinElement[ 0 ] ),
-			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
-			hasOffset = !isWindow && !isDocument;
-		return {
-			element: withinElement,
-			isWindow: isWindow,
-			isDocument: isDocument,
-			offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
-			scrollLeft: withinElement.scrollLeft(),
-			scrollTop: withinElement.scrollTop(),
-			width: withinElement.outerWidth(),
-			height: withinElement.outerHeight()
-		};
-	}
-};
-
-$.fn.position = function( options ) {
-	if ( !options || !options.of ) {
-		return _position.apply( this, arguments );
-	}
-
-	// Make a copy, we don't want to modify arguments
-	options = $.extend( {}, options );
-
-	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
-		target = $( options.of ),
-		within = $.position.getWithinInfo( options.within ),
-		scrollInfo = $.position.getScrollInfo( within ),
-		collision = ( options.collision || "flip" ).split( " " ),
-		offsets = {};
-
-	dimensions = getDimensions( target );
-	if ( target[ 0 ].preventDefault ) {
-
-		// Force left top to allow flipping
-		options.at = "left top";
-	}
-	targetWidth = dimensions.width;
-	targetHeight = dimensions.height;
-	targetOffset = dimensions.offset;
-
-	// Clone to reuse original targetOffset later
-	basePosition = $.extend( {}, targetOffset );
-
-	// Force my and at to have valid horizontal and vertical positions
-	// if a value is missing or invalid, it will be converted to center
-	$.each( [ "my", "at" ], function() {
-		var pos = ( options[ this ] || "" ).split( " " ),
-			horizontalOffset,
-			verticalOffset;
-
-		if ( pos.length === 1 ) {
-			pos = rhorizontal.test( pos[ 0 ] ) ?
-				pos.concat( [ "center" ] ) :
-				rvertical.test( pos[ 0 ] ) ?
-					[ "center" ].concat( pos ) :
-					[ "center", "center" ];
-		}
-		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
-		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
-
-		// Calculate offsets
-		horizontalOffset = roffset.exec( pos[ 0 ] );
-		verticalOffset = roffset.exec( pos[ 1 ] );
-		offsets[ this ] = [
-			horizontalOffset ? horizontalOffset[ 0 ] : 0,
-			verticalOffset ? verticalOffset[ 0 ] : 0
-		];
-
-		// Reduce to just the positions without the offsets
-		options[ this ] = [
-			rposition.exec( pos[ 0 ] )[ 0 ],
-			rposition.exec( pos[ 1 ] )[ 0 ]
-		];
-	} );
-
-	// Normalize collision option
-	if ( collision.length === 1 ) {
-		collision[ 1 ] = collision[ 0 ];
-	}
-
-	if ( options.at[ 0 ] === "right" ) {
-		basePosition.left += targetWidth;
-	} else if ( options.at[ 0 ] === "center" ) {
-		basePosition.left += targetWidth / 2;
-	}
-
-	if ( options.at[ 1 ] === "bottom" ) {
-		basePosition.top += targetHeight;
-	} else if ( options.at[ 1 ] === "center" ) {
-		basePosition.top += targetHeight / 2;
-	}
-
-	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
-	basePosition.left += atOffset[ 0 ];
-	basePosition.top += atOffset[ 1 ];
-
-	return this.each( function() {
-		var collisionPosition, using,
-			elem = $( this ),
-			elemWidth = elem.outerWidth(),
-			elemHeight = elem.outerHeight(),
-			marginLeft = parseCss( this, "marginLeft" ),
-			marginTop = parseCss( this, "marginTop" ),
-			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
-				scrollInfo.width,
-			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
-				scrollInfo.height,
-			position = $.extend( {}, basePosition ),
-			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
-
-		if ( options.my[ 0 ] === "right" ) {
-			position.left -= elemWidth;
-		} else if ( options.my[ 0 ] === "center" ) {
-			position.left -= elemWidth / 2;
-		}
-
-		if ( options.my[ 1 ] === "bottom" ) {
-			position.top -= elemHeight;
-		} else if ( options.my[ 1 ] === "center" ) {
-			position.top -= elemHeight / 2;
-		}
-
-		position.left += myOffset[ 0 ];
-		position.top += myOffset[ 1 ];
-
-		collisionPosition = {
-			marginLeft: marginLeft,
-			marginTop: marginTop
-		};
-
-		$.each( [ "left", "top" ], function( i, dir ) {
-			if ( $.ui.position[ collision[ i ] ] ) {
-				$.ui.position[ collision[ i ] ][ dir ]( position, {
-					targetWidth: targetWidth,
-					targetHeight: targetHeight,
-					elemWidth: elemWidth,
-					elemHeight: elemHeight,
-					collisionPosition: collisionPosition,
-					collisionWidth: collisionWidth,
-					collisionHeight: collisionHeight,
-					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
-					my: options.my,
-					at: options.at,
-					within: within,
-					elem: elem
-				} );
-			}
-		} );
-
-		if ( options.using ) {
-
-			// Adds feedback as second argument to using callback, if present
-			using = function( props ) {
-				var left = targetOffset.left - position.left,
-					right = left + targetWidth - elemWidth,
-					top = targetOffset.top - position.top,
-					bottom = top + targetHeight - elemHeight,
-					feedback = {
-						target: {
-							element: target,
-							left: targetOffset.left,
-							top: targetOffset.top,
-							width: targetWidth,
-							height: targetHeight
-						},
-						element: {
-							element: elem,
-							left: position.left,
-							top: position.top,
-							width: elemWidth,
-							height: elemHeight
-						},
-						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
-						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
-					};
-				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
-					feedback.horizontal = "center";
-				}
-				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
-					feedback.vertical = "middle";
-				}
-				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
-					feedback.important = "horizontal";
-				} else {
-					feedback.important = "vertical";
-				}
-				options.using.call( this, props, feedback );
-			};
-		}
-
-		elem.offset( $.extend( position, { using: using } ) );
-	} );
-};
-
-$.ui.position = {
-	fit: {
-		left: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
-				outerWidth = within.width,
-				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
-				overLeft = withinOffset - collisionPosLeft,
-				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
-				newOverRight;
-
-			// Element is wider than within
-			if ( data.collisionWidth > outerWidth ) {
-
-				// Element is initially over the left side of within
-				if ( overLeft > 0 && overRight <= 0 ) {
-					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
-						withinOffset;
-					position.left += overLeft - newOverRight;
-
-				// Element is initially over right side of within
-				} else if ( overRight > 0 && overLeft <= 0 ) {
-					position.left = withinOffset;
-
-				// Element is initially over both left and right sides of within
-				} else {
-					if ( overLeft > overRight ) {
-						position.left = withinOffset + outerWidth - data.collisionWidth;
-					} else {
-						position.left = withinOffset;
-					}
-				}
-
-			// Too far left -> align with left edge
-			} else if ( overLeft > 0 ) {
-				position.left += overLeft;
-
-			// Too far right -> align with right edge
-			} else if ( overRight > 0 ) {
-				position.left -= overRight;
-
-			// Adjust based on position and margin
-			} else {
-				position.left = max( position.left - collisionPosLeft, position.left );
-			}
-		},
-		top: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
-				outerHeight = data.within.height,
-				collisionPosTop = position.top - data.collisionPosition.marginTop,
-				overTop = withinOffset - collisionPosTop,
-				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
-				newOverBottom;
-
-			// Element is taller than within
-			if ( data.collisionHeight > outerHeight ) {
-
-				// Element is initially over the top of within
-				if ( overTop > 0 && overBottom <= 0 ) {
-					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
-						withinOffset;
-					position.top += overTop - newOverBottom;
-
-				// Element is initially over bottom of within
-				} else if ( overBottom > 0 && overTop <= 0 ) {
-					position.top = withinOffset;
-
-				// Element is initially over both top and bottom of within
-				} else {
-					if ( overTop > overBottom ) {
-						position.top = withinOffset + outerHeight - data.collisionHeight;
-					} else {
-						position.top = withinOffset;
-					}
-				}
-
-			// Too far up -> align with top
-			} else if ( overTop > 0 ) {
-				position.top += overTop;
-
-			// Too far down -> align with bottom edge
-			} else if ( overBottom > 0 ) {
-				position.top -= overBottom;
-
-			// Adjust based on position and margin
-			} else {
-				position.top = max( position.top - collisionPosTop, position.top );
-			}
-		}
-	},
-	flip: {
-		left: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.offset.left + within.scrollLeft,
-				outerWidth = within.width,
-				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
-				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
-				overLeft = collisionPosLeft - offsetLeft,
-				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
-				myOffset = data.my[ 0 ] === "left" ?
-					-data.elemWidth :
-					data.my[ 0 ] === "right" ?
-						data.elemWidth :
-						0,
-				atOffset = data.at[ 0 ] === "left" ?
-					data.targetWidth :
-					data.at[ 0 ] === "right" ?
-						-data.targetWidth :
-						0,
-				offset = -2 * data.offset[ 0 ],
-				newOverRight,
-				newOverLeft;
-
-			if ( overLeft < 0 ) {
-				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
-					outerWidth - withinOffset;
-				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
-					position.left += myOffset + atOffset + offset;
-				}
-			} else if ( overRight > 0 ) {
-				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
-					atOffset + offset - offsetLeft;
-				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
-					position.left += myOffset + atOffset + offset;
-				}
-			}
-		},
-		top: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.offset.top + within.scrollTop,
-				outerHeight = within.height,
-				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
-				collisionPosTop = position.top - data.collisionPosition.marginTop,
-				overTop = collisionPosTop - offsetTop,
-				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
-				top = data.my[ 1 ] === "top",
-				myOffset = top ?
-					-data.elemHeight :
-					data.my[ 1 ] === "bottom" ?
-						data.elemHeight :
-						0,
-				atOffset = data.at[ 1 ] === "top" ?
-					data.targetHeight :
-					data.at[ 1 ] === "bottom" ?
-						-data.targetHeight :
-						0,
-				offset = -2 * data.offset[ 1 ],
-				newOverTop,
-				newOverBottom;
-			if ( overTop < 0 ) {
-				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
-					outerHeight - withinOffset;
-				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
-					position.top += myOffset + atOffset + offset;
-				}
-			} else if ( overBottom > 0 ) {
-				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
-					offset - offsetTop;
-				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
-					position.top += myOffset + atOffset + offset;
-				}
-			}
-		}
-	},
-	flipfit: {
-		left: function() {
-			$.ui.position.flip.left.apply( this, arguments );
-			$.ui.position.fit.left.apply( this, arguments );
-		},
-		top: function() {
-			$.ui.position.flip.top.apply( this, arguments );
-			$.ui.position.fit.top.apply( this, arguments );
-		}
-	}
-};
-
-} )();
-
-var position = $.ui.position;
-
-
-/*!
- * jQuery UI :data 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :data Selector
-//>>group: Core
-//>>description: Selects elements which have data stored under the specified key.
-//>>docs: http://api.jqueryui.com/data-selector/
-
-
-var data = $.extend( $.expr[ ":" ], {
-	data: $.expr.createPseudo ?
-		$.expr.createPseudo( function( dataName ) {
-			return function( elem ) {
-				return !!$.data( elem, dataName );
-			};
-		} ) :
-
-		// Support: jQuery <1.8
-		function( elem, i, match ) {
-			return !!$.data( elem, match[ 3 ] );
-		}
-} );
-
-/*!
- * jQuery UI Disable Selection 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: disableSelection
-//>>group: Core
-//>>description: Disable selection of text content within the set of matched elements.
-//>>docs: http://api.jqueryui.com/disableSelection/
-
-// This file is deprecated
-
-
-var disableSelection = $.fn.extend( {
-	disableSelection: ( function() {
-		var eventType = "onselectstart" in document.createElement( "div" ) ?
-			"selectstart" :
-			"mousedown";
-
-		return function() {
-			return this.on( eventType + ".ui-disableSelection", function( event ) {
-				event.preventDefault();
-			} );
-		};
-	} )(),
-
-	enableSelection: function() {
-		return this.off( ".ui-disableSelection" );
-	}
-} );
-
-
-/*!
- * jQuery UI Effects 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Effects Core
-//>>group: Effects
-// jscs:disable maximumLineLength
-//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/category/effects-core/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var dataSpace = "ui-effects-",
-	dataSpaceStyle = "ui-effects-style",
-	dataSpaceAnimated = "ui-effects-animated",
-
-	// Create a local jQuery because jQuery Color relies on it and the
-	// global may not exist with AMD and a custom build (#10199)
-	jQuery = $;
-
-$.effects = {
-	effect: {}
-};
-
-/*!
- * jQuery Color Animations v2.1.2
- * https://github.com/jquery/jquery-color
- *
- * Copyright 2014 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * Date: Wed Jan 16 08:47:09 2013 -0600
- */
-( function( jQuery, undefined ) {
-
-	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
-		"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
-
-	// Plusequals test for += 100 -= 100
-	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
-
-	// A set of RE's that can match strings and generate color tuples.
-	stringParsers = [ {
-			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
-			parse: function( execResult ) {
-				return [
-					execResult[ 1 ],
-					execResult[ 2 ],
-					execResult[ 3 ],
-					execResult[ 4 ]
-				];
-			}
-		}, {
-			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
-			parse: function( execResult ) {
-				return [
-					execResult[ 1 ] * 2.55,
-					execResult[ 2 ] * 2.55,
-					execResult[ 3 ] * 2.55,
-					execResult[ 4 ]
-				];
-			}
-		}, {
-
-			// This regex ignores A-F because it's compared against an already lowercased string
-			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
-			parse: function( execResult ) {
-				return [
-					parseInt( execResult[ 1 ], 16 ),
-					parseInt( execResult[ 2 ], 16 ),
-					parseInt( execResult[ 3 ], 16 )
-				];
-			}
-		}, {
-
-			// This regex ignores A-F because it's compared against an already lowercased string
-			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
-			parse: function( execResult ) {
-				return [
-					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
-					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
-					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
-				];
-			}
-		}, {
-			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
-			space: "hsla",
-			parse: function( execResult ) {
-				return [
-					execResult[ 1 ],
-					execResult[ 2 ] / 100,
-					execResult[ 3 ] / 100,
-					execResult[ 4 ]
-				];
-			}
-		} ],
-
-	// JQuery.Color( )
-	color = jQuery.Color = function( color, green, blue, alpha ) {
-		return new jQuery.Color.fn.parse( color, green, blue, alpha );
-	},
-	spaces = {
-		rgba: {
-			props: {
-				red: {
-					idx: 0,
-					type: "byte"
-				},
-				green: {
-					idx: 1,
-					type: "byte"
-				},
-				blue: {
-					idx: 2,
-					type: "byte"
-				}
-			}
-		},
-
-		hsla: {
-			props: {
-				hue: {
-					idx: 0,
-					type: "degrees"
-				},
-				saturation: {
-					idx: 1,
-					type: "percent"
-				},
-				lightness: {
-					idx: 2,
-					type: "percent"
-				}
-			}
-		}
-	},
-	propTypes = {
-		"byte": {
-			floor: true,
-			max: 255
-		},
-		"percent": {
-			max: 1
-		},
-		"degrees": {
-			mod: 360,
-			floor: true
-		}
-	},
-	support = color.support = {},
-
-	// Element for support tests
-	supportElem = jQuery( "<p>" )[ 0 ],
-
-	// Colors = jQuery.Color.names
-	colors,
-
-	// Local aliases of functions called often
-	each = jQuery.each;
-
-// Determine rgba support immediately
-supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
-support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
-
-// Define cache name and alpha properties
-// for rgba and hsla spaces
-each( spaces, function( spaceName, space ) {
-	space.cache = "_" + spaceName;
-	space.props.alpha = {
-		idx: 3,
-		type: "percent",
-		def: 1
-	};
-} );
-
-function clamp( value, prop, allowEmpty ) {
-	var type = propTypes[ prop.type ] || {};
-
-	if ( value == null ) {
-		return ( allowEmpty || !prop.def ) ? null : prop.def;
-	}
-
-	// ~~ is an short way of doing floor for positive numbers
-	value = type.floor ? ~~value : parseFloat( value );
-
-	// IE will pass in empty strings as value for alpha,
-	// which will hit this case
-	if ( isNaN( value ) ) {
-		return prop.def;
-	}
-
-	if ( type.mod ) {
-
-		// We add mod before modding to make sure that negatives values
-		// get converted properly: -10 -> 350
-		return ( value + type.mod ) % type.mod;
-	}
-
-	// For now all property types without mod have min and max
-	return 0 > value ? 0 : type.max < value ? type.max : value;
-}
-
-function stringParse( string ) {
-	var inst = color(),
-		rgba = inst._rgba = [];
-
-	string = string.toLowerCase();
-
-	each( stringParsers, function( i, parser ) {
-		var parsed,
-			match = parser.re.exec( string ),
-			values = match && parser.parse( match ),
-			spaceName = parser.space || "rgba";
-
-		if ( values ) {
-			parsed = inst[ spaceName ]( values );
-
-			// If this was an rgba parse the assignment might happen twice
-			// oh well....
-			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
-			rgba = inst._rgba = parsed._rgba;
-
-			// Exit each( stringParsers ) here because we matched
-			return false;
-		}
-	} );
-
-	// Found a stringParser that handled it
-	if ( rgba.length ) {
-
-		// If this came from a parsed string, force "transparent" when alpha is 0
-		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
-		if ( rgba.join() === "0,0,0,0" ) {
-			jQuery.extend( rgba, colors.transparent );
-		}
-		return inst;
-	}
-
-	// Named colors
-	return colors[ string ];
-}
-
-color.fn = jQuery.extend( color.prototype, {
-	parse: function( red, green, blue, alpha ) {
-		if ( red === undefined ) {
-			this._rgba = [ null, null, null, null ];
-			return this;
-		}
-		if ( red.jquery || red.nodeType ) {
-			red = jQuery( red ).css( green );
-			green = undefined;
-		}
-
-		var inst = this,
-			type = jQuery.type( red ),
-			rgba = this._rgba = [];
-
-		// More than 1 argument specified - assume ( red, green, blue, alpha )
-		if ( green !== undefined ) {
-			red = [ red, green, blue, alpha ];
-			type = "array";
-		}
-
-		if ( type === "string" ) {
-			return this.parse( stringParse( red ) || colors._default );
-		}
-
-		if ( type === "array" ) {
-			each( spaces.rgba.props, function( key, prop ) {
-				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
-			} );
-			return this;
-		}
-
-		if ( type === "object" ) {
-			if ( red instanceof color ) {
-				each( spaces, function( spaceName, space ) {
-					if ( red[ space.cache ] ) {
-						inst[ space.cache ] = red[ space.cache ].slice();
-					}
-				} );
-			} else {
-				each( spaces, function( spaceName, space ) {
-					var cache = space.cache;
-					each( space.props, function( key, prop ) {
-
-						// If the cache doesn't exist, and we know how to convert
-						if ( !inst[ cache ] && space.to ) {
-
-							// If the value was null, we don't need to copy it
-							// if the key was alpha, we don't need to copy it either
-							if ( key === "alpha" || red[ key ] == null ) {
-								return;
-							}
-							inst[ cache ] = space.to( inst._rgba );
-						}
-
-						// This is the only case where we allow nulls for ALL properties.
-						// call clamp with alwaysAllowEmpty
-						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
-					} );
-
-					// Everything defined but alpha?
-					if ( inst[ cache ] &&
-							jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
-
-						// Use the default of 1
-						inst[ cache ][ 3 ] = 1;
-						if ( space.from ) {
-							inst._rgba = space.from( inst[ cache ] );
-						}
-					}
-				} );
-			}
-			return this;
-		}
-	},
-	is: function( compare ) {
-		var is = color( compare ),
-			same = true,
-			inst = this;
-
-		each( spaces, function( _, space ) {
-			var localCache,
-				isCache = is[ space.cache ];
-			if ( isCache ) {
-				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
-				each( space.props, function( _, prop ) {
-					if ( isCache[ prop.idx ] != null ) {
-						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
-						return same;
-					}
-				} );
-			}
-			return same;
-		} );
-		return same;
-	},
-	_space: function() {
-		var used = [],
-			inst = this;
-		each( spaces, function( spaceName, space ) {
-			if ( inst[ space.cache ] ) {
-				used.push( spaceName );
-			}
-		} );
-		return used.pop();
-	},
-	transition: function( other, distance ) {
-		var end = color( other ),
-			spaceName = end._space(),
-			space = spaces[ spaceName ],
-			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
-			start = startColor[ space.cache ] || space.to( startColor._rgba ),
-			result = start.slice();
-
-		end = end[ space.cache ];
-		each( space.props, function( key, prop ) {
-			var index = prop.idx,
-				startValue = start[ index ],
-				endValue = end[ index ],
-				type = propTypes[ prop.type ] || {};
-
-			// If null, don't override start value
-			if ( endValue === null ) {
-				return;
-			}
-
-			// If null - use end
-			if ( startValue === null ) {
-				result[ index ] = endValue;
-			} else {
-				if ( type.mod ) {
-					if ( endValue - startValue > type.mod / 2 ) {
-						startValue += type.mod;
-					} else if ( startValue - endValue > type.mod / 2 ) {
-						startValue -= type.mod;
-					}
-				}
-				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
-			}
-		} );
-		return this[ spaceName ]( result );
-	},
-	blend: function( opaque ) {
-
-		// If we are already opaque - return ourself
-		if ( this._rgba[ 3 ] === 1 ) {
-			return this;
-		}
-
-		var rgb = this._rgba.slice(),
-			a = rgb.pop(),
-			blend = color( opaque )._rgba;
-
-		return color( jQuery.map( rgb, function( v, i ) {
-			return ( 1 - a ) * blend[ i ] + a * v;
-		} ) );
-	},
-	toRgbaString: function() {
-		var prefix = "rgba(",
-			rgba = jQuery.map( this._rgba, function( v, i ) {
-				return v == null ? ( i > 2 ? 1 : 0 ) : v;
-			} );
-
-		if ( rgba[ 3 ] === 1 ) {
-			rgba.pop();
-			prefix = "rgb(";
-		}
-
-		return prefix + rgba.join() + ")";
-	},
-	toHslaString: function() {
-		var prefix = "hsla(",
-			hsla = jQuery.map( this.hsla(), function( v, i ) {
-				if ( v == null ) {
-					v = i > 2 ? 1 : 0;
-				}
-
-				// Catch 1 and 2
-				if ( i && i < 3 ) {
-					v = Math.round( v * 100 ) + "%";
-				}
-				return v;
-			} );
-
-		if ( hsla[ 3 ] === 1 ) {
-			hsla.pop();
-			prefix = "hsl(";
-		}
-		return prefix + hsla.join() + ")";
-	},
-	toHexString: function( includeAlpha ) {
-		var rgba = this._rgba.slice(),
-			alpha = rgba.pop();
-
-		if ( includeAlpha ) {
-			rgba.push( ~~( alpha * 255 ) );
-		}
-
-		return "#" + jQuery.map( rgba, function( v ) {
-
-			// Default to 0 when nulls exist
-			v = ( v || 0 ).toString( 16 );
-			return v.length === 1 ? "0" + v : v;
-		} ).join( "" );
-	},
-	toString: function() {
-		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
-	}
-} );
-color.fn.parse.prototype = color.fn;
-
-// Hsla conversions adapted from:
-// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
-
-function hue2rgb( p, q, h ) {
-	h = ( h + 1 ) % 1;
-	if ( h * 6 < 1 ) {
-		return p + ( q - p ) * h * 6;
-	}
-	if ( h * 2 < 1 ) {
-		return q;
-	}
-	if ( h * 3 < 2 ) {
-		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
-	}
-	return p;
-}
-
-spaces.hsla.to = function( rgba ) {
-	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
-		return [ null, null, null, rgba[ 3 ] ];
-	}
-	var r = rgba[ 0 ] / 255,
-		g = rgba[ 1 ] / 255,
-		b = rgba[ 2 ] / 255,
-		a = rgba[ 3 ],
-		max = Math.max( r, g, b ),
-		min = Math.min( r, g, b ),
-		diff = max - min,
-		add = max + min,
-		l = add * 0.5,
-		h, s;
-
-	if ( min === max ) {
-		h = 0;
-	} else if ( r === max ) {
-		h = ( 60 * ( g - b ) / diff ) + 360;
-	} else if ( g === max ) {
-		h = ( 60 * ( b - r ) / diff ) + 120;
-	} else {
-		h = ( 60 * ( r - g ) / diff ) + 240;
-	}
-
-	// Chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
-	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
-	if ( diff === 0 ) {
-		s = 0;
-	} else if ( l <= 0.5 ) {
-		s = diff / add;
-	} else {
-		s = diff / ( 2 - add );
-	}
-	return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
-};
-
-spaces.hsla.from = function( hsla ) {
-	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
-		return [ null, null, null, hsla[ 3 ] ];
-	}
-	var h = hsla[ 0 ] / 360,
-		s = hsla[ 1 ],
-		l = hsla[ 2 ],
-		a = hsla[ 3 ],
-		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
-		p = 2 * l - q;
-
-	return [
-		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
-		Math.round( hue2rgb( p, q, h ) * 255 ),
-		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
-		a
-	];
-};
-
-each( spaces, function( spaceName, space ) {
-	var props = space.props,
-		cache = space.cache,
-		to = space.to,
-		from = space.from;
-
-	// Makes rgba() and hsla()
-	color.fn[ spaceName ] = function( value ) {
-
-		// Generate a cache for this space if it doesn't exist
-		if ( to && !this[ cache ] ) {
-			this[ cache ] = to( this._rgba );
-		}
-		if ( value === undefined ) {
-			return this[ cache ].slice();
-		}
-
-		var ret,
-			type = jQuery.type( value ),
-			arr = ( type === "array" || type === "object" ) ? value : arguments,
-			local = this[ cache ].slice();
-
-		each( props, function( key, prop ) {
-			var val = arr[ type === "object" ? key : prop.idx ];
-			if ( val == null ) {
-				val = local[ prop.idx ];
-			}
-			local[ prop.idx ] = clamp( val, prop );
-		} );
-
-		if ( from ) {
-			ret = color( from( local ) );
-			ret[ cache ] = local;
-			return ret;
-		} else {
-			return color( local );
-		}
-	};
-
-	// Makes red() green() blue() alpha() hue() saturation() lightness()
-	each( props, function( key, prop ) {
-
-		// Alpha is included in more than one space
-		if ( color.fn[ key ] ) {
-			return;
-		}
-		color.fn[ key ] = function( value ) {
-			var vtype = jQuery.type( value ),
-				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
-				local = this[ fn ](),
-				cur = local[ prop.idx ],
-				match;
-
-			if ( vtype === "undefined" ) {
-				return cur;
-			}
-
-			if ( vtype === "function" ) {
-				value = value.call( this, cur );
-				vtype = jQuery.type( value );
-			}
-			if ( value == null && prop.empty ) {
-				return this;
-			}
-			if ( vtype === "string" ) {
-				match = rplusequals.exec( value );
-				if ( match ) {
-					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
-				}
-			}
-			local[ prop.idx ] = value;
-			return this[ fn ]( local );
-		};
-	} );
-} );
-
-// Add cssHook and .fx.step function for each named hook.
-// accept a space separated string of properties
-color.hook = function( hook ) {
-	var hooks = hook.split( " " );
-	each( hooks, function( i, hook ) {
-		jQuery.cssHooks[ hook ] = {
-			set: function( elem, value ) {
-				var parsed, curElem,
-					backgroundColor = "";
-
-				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" ||
-						( parsed = stringParse( value ) ) ) ) {
-					value = color( parsed || value );
-					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
-						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
-						while (
-							( backgroundColor === "" || backgroundColor === "transparent" ) &&
-							curElem && curElem.style
-						) {
-							try {
-								backgroundColor = jQuery.css( curElem, "backgroundColor" );
-								curElem = curElem.parentNode;
-							} catch ( e ) {
-							}
-						}
-
-						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
-							backgroundColor :
-							"_default" );
-					}
-
-					value = value.toRgbaString();
-				}
-				try {
-					elem.style[ hook ] = value;
-				} catch ( e ) {
-
-					// Wrapped to prevent IE from throwing errors on "invalid" values like
-					// 'auto' or 'inherit'
-				}
-			}
-		};
-		jQuery.fx.step[ hook ] = function( fx ) {
-			if ( !fx.colorInit ) {
-				fx.start = color( fx.elem, hook );
-				fx.end = color( fx.end );
-				fx.colorInit = true;
-			}
-			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
-		};
-	} );
-
-};
-
-color.hook( stepHooks );
-
-jQuery.cssHooks.borderColor = {
-	expand: function( value ) {
-		var expanded = {};
-
-		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
-			expanded[ "border" + part + "Color" ] = value;
-		} );
-		return expanded;
-	}
-};
-
-// Basic color names only.
-// Usage of any of the other color names requires adding yourself or including
-// jquery.color.svg-names.js.
-colors = jQuery.Color.names = {
-
-	// 4.1. Basic color keywords
-	aqua: "#00ffff",
-	black: "#000000",
-	blue: "#0000ff",
-	fuchsia: "#ff00ff",
-	gray: "#808080",
-	green: "#008000",
-	lime: "#00ff00",
-	maroon: "#800000",
-	navy: "#000080",
-	olive: "#808000",
-	purple: "#800080",
-	red: "#ff0000",
-	silver: "#c0c0c0",
-	teal: "#008080",
-	white: "#ffffff",
-	yellow: "#ffff00",
-
-	// 4.2.3. "transparent" color keyword
-	transparent: [ null, null, null, 0 ],
-
-	_default: "#ffffff"
-};
-
-} )( jQuery );
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-( function() {
-
-var classAnimationActions = [ "add", "remove", "toggle" ],
-	shorthandStyles = {
-		border: 1,
-		borderBottom: 1,
-		borderColor: 1,
-		borderLeft: 1,
-		borderRight: 1,
-		borderTop: 1,
-		borderWidth: 1,
-		margin: 1,
-		padding: 1
-	};
-
-$.each(
-	[ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
-	function( _, prop ) {
-		$.fx.step[ prop ] = function( fx ) {
-			if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
-				jQuery.style( fx.elem, prop, fx.end );
-				fx.setAttr = true;
-			}
-		};
-	}
-);
-
-function getElementStyles( elem ) {
-	var key, len,
-		style = elem.ownerDocument.defaultView ?
-			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
-			elem.currentStyle,
-		styles = {};
-
-	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
-		len = style.length;
-		while ( len-- ) {
-			key = style[ len ];
-			if ( typeof style[ key ] === "string" ) {
-				styles[ $.camelCase( key ) ] = style[ key ];
-			}
-		}
-
-	// Support: Opera, IE <9
-	} else {
-		for ( key in style ) {
-			if ( typeof style[ key ] === "string" ) {
-				styles[ key ] = style[ key ];
-			}
-		}
-	}
-
-	return styles;
-}
-
-function styleDifference( oldStyle, newStyle ) {
-	var diff = {},
-		name, value;
-
-	for ( name in newStyle ) {
-		value = newStyle[ name ];
-		if ( oldStyle[ name ] !== value ) {
-			if ( !shorthandStyles[ name ] ) {
-				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
-					diff[ name ] = value;
-				}
-			}
-		}
-	}
-
-	return diff;
-}
-
-// Support: jQuery <1.8
-if ( !$.fn.addBack ) {
-	$.fn.addBack = function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-		);
-	};
-}
-
-$.effects.animateClass = function( value, duration, easing, callback ) {
-	var o = $.speed( duration, easing, callback );
-
-	return this.queue( function() {
-		var animated = $( this ),
-			baseClass = animated.attr( "class" ) || "",
-			applyClassChange,
-			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
-
-		// Map the animated objects to store the original styles.
-		allAnimations = allAnimations.map( function() {
-			var el = $( this );
-			return {
-				el: el,
-				start: getElementStyles( this )
-			};
-		} );
-
-		// Apply class change
-		applyClassChange = function() {
-			$.each( classAnimationActions, function( i, action ) {
-				if ( value[ action ] ) {
-					animated[ action + "Class" ]( value[ action ] );
-				}
-			} );
-		};
-		applyClassChange();
-
-		// Map all animated objects again - calculate new styles and diff
-		allAnimations = allAnimations.map( function() {
-			this.end = getElementStyles( this.el[ 0 ] );
-			this.diff = styleDifference( this.start, this.end );
-			return this;
-		} );
-
-		// Apply original class
-		animated.attr( "class", baseClass );
-
-		// Map all animated objects again - this time collecting a promise
-		allAnimations = allAnimations.map( function() {
-			var styleInfo = this,
-				dfd = $.Deferred(),
-				opts = $.extend( {}, o, {
-					queue: false,
-					complete: function() {
-						dfd.resolve( styleInfo );
-					}
-				} );
-
-			this.el.animate( this.diff, opts );
-			return dfd.promise();
-		} );
-
-		// Once all animations have completed:
-		$.when.apply( $, allAnimations.get() ).done( function() {
-
-			// Set the final class
-			applyClassChange();
-
-			// For each animated element,
-			// clear all css properties that were animated
-			$.each( arguments, function() {
-				var el = this.el;
-				$.each( this.diff, function( key ) {
-					el.css( key, "" );
-				} );
-			} );
-
-			// This is guarnteed to be there if you use jQuery.speed()
-			// it also handles dequeuing the next anim...
-			o.complete.call( animated[ 0 ] );
-		} );
-	} );
-};
-
-$.fn.extend( {
-	addClass: ( function( orig ) {
-		return function( classNames, speed, easing, callback ) {
-			return speed ?
-				$.effects.animateClass.call( this,
-					{ add: classNames }, speed, easing, callback ) :
-				orig.apply( this, arguments );
-		};
-	} )( $.fn.addClass ),
-
-	removeClass: ( function( orig ) {
-		return function( classNames, speed, easing, callback ) {
-			return arguments.length > 1 ?
-				$.effects.animateClass.call( this,
-					{ remove: classNames }, speed, easing, callback ) :
-				orig.apply( this, arguments );
-		};
-	} )( $.fn.removeClass ),
-
-	toggleClass: ( function( orig ) {
-		return function( classNames, force, speed, easing, callback ) {
-			if ( typeof force === "boolean" || force === undefined ) {
-				if ( !speed ) {
-
-					// Without speed parameter
-					return orig.apply( this, arguments );
-				} else {
-					return $.effects.animateClass.call( this,
-						( force ? { add: classNames } : { remove: classNames } ),
-						speed, easing, callback );
-				}
-			} else {
-
-				// Without force parameter
-				return $.effects.animateClass.call( this,
-					{ toggle: classNames }, force, speed, easing );
-			}
-		};
-	} )( $.fn.toggleClass ),
-
-	switchClass: function( remove, add, speed, easing, callback ) {
-		return $.effects.animateClass.call( this, {
-			add: add,
-			remove: remove
-		}, speed, easing, callback );
-	}
-} );
-
-} )();
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-( function() {
-
-if ( $.expr && $.expr.filters && $.expr.filters.animated ) {
-	$.expr.filters.animated = ( function( orig ) {
-		return function( elem ) {
-			return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
-		};
-	} )( $.expr.filters.animated );
-}
-
-if ( $.uiBackCompat !== false ) {
-	$.extend( $.effects, {
-
-		// Saves a set of properties in a data storage
-		save: function( element, set ) {
-			var i = 0, length = set.length;
-			for ( ; i < length; i++ ) {
-				if ( set[ i ] !== null ) {
-					element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
-				}
-			}
-		},
-
-		// Restores a set of previously saved properties from a data storage
-		restore: function( element, set ) {
-			var val, i = 0, length = set.length;
-			for ( ; i < length; i++ ) {
-				if ( set[ i ] !== null ) {
-					val = element.data( dataSpace + set[ i ] );
-					element.css( set[ i ], val );
-				}
-			}
-		},
-
-		setMode: function( el, mode ) {
-			if ( mode === "toggle" ) {
-				mode = el.is( ":hidden" ) ? "show" : "hide";
-			}
-			return mode;
-		},
-
-		// Wraps the element around a wrapper that copies position properties
-		createWrapper: function( element ) {
-
-			// If the element is already wrapped, return it
-			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
-				return element.parent();
-			}
-
-			// Wrap the element
-			var props = {
-					width: element.outerWidth( true ),
-					height: element.outerHeight( true ),
-					"float": element.css( "float" )
-				},
-				wrapper = $( "<div></div>" )
-					.addClass( "ui-effects-wrapper" )
-					.css( {
-						fontSize: "100%",
-						background: "transparent",
-						border: "none",
-						margin: 0,
-						padding: 0
-					} ),
-
-				// Store the size in case width/height are defined in % - Fixes #5245
-				size = {
-					width: element.width(),
-					height: element.height()
-				},
-				active = document.activeElement;
-
-			// Support: Firefox
-			// Firefox incorrectly exposes anonymous content
-			// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
-			try {
-				active.id;
-			} catch ( e ) {
-				active = document.body;
-			}
-
-			element.wrap( wrapper );
-
-			// Fixes #7595 - Elements lose focus when wrapped.
-			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-				$( active ).trigger( "focus" );
-			}
-
-			// Hotfix for jQuery 1.4 since some change in wrap() seems to actually
-			// lose the reference to the wrapped element
-			wrapper = element.parent();
-
-			// Transfer positioning properties to the wrapper
-			if ( element.css( "position" ) === "static" ) {
-				wrapper.css( { position: "relative" } );
-				element.css( { position: "relative" } );
-			} else {
-				$.extend( props, {
-					position: element.css( "position" ),
-					zIndex: element.css( "z-index" )
-				} );
-				$.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
-					props[ pos ] = element.css( pos );
-					if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
-						props[ pos ] = "auto";
-					}
-				} );
-				element.css( {
-					position: "relative",
-					top: 0,
-					left: 0,
-					right: "auto",
-					bottom: "auto"
-				} );
-			}
-			element.css( size );
-
-			return wrapper.css( props ).show();
-		},
-
-		removeWrapper: function( element ) {
-			var active = document.activeElement;
-
-			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
-				element.parent().replaceWith( element );
-
-				// Fixes #7595 - Elements lose focus when wrapped.
-				if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-					$( active ).trigger( "focus" );
-				}
-			}
-
-			return element;
-		}
-	} );
-}
-
-$.extend( $.effects, {
-	version: "1.12.1",
-
-	define: function( name, mode, effect ) {
-		if ( !effect ) {
-			effect = mode;
-			mode = "effect";
-		}
-
-		$.effects.effect[ name ] = effect;
-		$.effects.effect[ name ].mode = mode;
-
-		return effect;
-	},
-
-	scaledDimensions: function( element, percent, direction ) {
-		if ( percent === 0 ) {
-			return {
-				height: 0,
-				width: 0,
-				outerHeight: 0,
-				outerWidth: 0
-			};
-		}
-
-		var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
-			y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
-
-		return {
-			height: element.height() * y,
-			width: element.width() * x,
-			outerHeight: element.outerHeight() * y,
-			outerWidth: element.outerWidth() * x
-		};
-
-	},
-
-	clipToBox: function( animation ) {
-		return {
-			width: animation.clip.right - animation.clip.left,
-			height: animation.clip.bottom - animation.clip.top,
-			left: animation.clip.left,
-			top: animation.clip.top
-		};
-	},
-
-	// Injects recently queued functions to be first in line (after "inprogress")
-	unshift: function( element, queueLength, count ) {
-		var queue = element.queue();
-
-		if ( queueLength > 1 ) {
-			queue.splice.apply( queue,
-				[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
-		}
-		element.dequeue();
-	},
-
-	saveStyle: function( element ) {
-		element.data( dataSpaceStyle, element[ 0 ].style.cssText );
-	},
-
-	restoreStyle: function( element ) {
-		element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
-		element.removeData( dataSpaceStyle );
-	},
-
-	mode: function( element, mode ) {
-		var hidden = element.is( ":hidden" );
-
-		if ( mode === "toggle" ) {
-			mode = hidden ? "show" : "hide";
-		}
-		if ( hidden ? mode === "hide" : mode === "show" ) {
-			mode = "none";
-		}
-		return mode;
-	},
-
-	// Translates a [top,left] array into a baseline value
-	getBaseline: function( origin, original ) {
-		var y, x;
-
-		switch ( origin[ 0 ] ) {
-		case "top":
-			y = 0;
-			break;
-		case "middle":
-			y = 0.5;
-			break;
-		case "bottom":
-			y = 1;
-			break;
-		default:
-			y = origin[ 0 ] / original.height;
-		}
-
-		switch ( origin[ 1 ] ) {
-		case "left":
-			x = 0;
-			break;
-		case "center":
-			x = 0.5;
-			break;
-		case "right":
-			x = 1;
-			break;
-		default:
-			x = origin[ 1 ] / original.width;
-		}
-
-		return {
-			x: x,
-			y: y
-		};
-	},
-
-	// Creates a placeholder element so that the original element can be made absolute
-	createPlaceholder: function( element ) {
-		var placeholder,
-			cssPosition = element.css( "position" ),
-			position = element.position();
-
-		// Lock in margins first to account for form elements, which
-		// will change margin if you explicitly set height
-		// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
-		// Support: Safari
-		element.css( {
-			marginTop: element.css( "marginTop" ),
-			marginBottom: element.css( "marginBottom" ),
-			marginLeft: element.css( "marginLeft" ),
-			marginRight: element.css( "marginRight" )
-		} )
-		.outerWidth( element.outerWidth() )
-		.outerHeight( element.outerHeight() );
-
-		if ( /^(static|relative)/.test( cssPosition ) ) {
-			cssPosition = "absolute";
-
-			placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
-
-				// Convert inline to inline block to account for inline elements
-				// that turn to inline block based on content (like img)
-				display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
-					"inline-block" :
-					"block",
-				visibility: "hidden",
-
-				// Margins need to be set to account for margin collapse
-				marginTop: element.css( "marginTop" ),
-				marginBottom: element.css( "marginBottom" ),
-				marginLeft: element.css( "marginLeft" ),
-				marginRight: element.css( "marginRight" ),
-				"float": element.css( "float" )
-			} )
-			.outerWidth( element.outerWidth() )
-			.outerHeight( element.outerHeight() )
-			.addClass( "ui-effects-placeholder" );
-
-			element.data( dataSpace + "placeholder", placeholder );
-		}
-
-		element.css( {
-			position: cssPosition,
-			left: position.left,
-			top: position.top
-		} );
-
-		return placeholder;
-	},
-
-	removePlaceholder: function( element ) {
-		var dataKey = dataSpace + "placeholder",
-				placeholder = element.data( dataKey );
-
-		if ( placeholder ) {
-			placeholder.remove();
-			element.removeData( dataKey );
-		}
-	},
-
-	// Removes a placeholder if it exists and restores
-	// properties that were modified during placeholder creation
-	cleanUp: function( element ) {
-		$.effects.restoreStyle( element );
-		$.effects.removePlaceholder( element );
-	},
-
-	setTransition: function( element, list, factor, value ) {
-		value = value || {};
-		$.each( list, function( i, x ) {
-			var unit = element.cssUnit( x );
-			if ( unit[ 0 ] > 0 ) {
-				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
-			}
-		} );
-		return value;
-	}
-} );
-
-// Return an effect options object for the given parameters:
-function _normalizeArguments( effect, options, speed, callback ) {
-
-	// Allow passing all options as the first parameter
-	if ( $.isPlainObject( effect ) ) {
-		options = effect;
-		effect = effect.effect;
-	}
-
-	// Convert to an object
-	effect = { effect: effect };
-
-	// Catch (effect, null, ...)
-	if ( options == null ) {
-		options = {};
-	}
-
-	// Catch (effect, callback)
-	if ( $.isFunction( options ) ) {
-		callback = options;
-		speed = null;
-		options = {};
-	}
-
-	// Catch (effect, speed, ?)
-	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
-		callback = speed;
-		speed = options;
-		options = {};
-	}
-
-	// Catch (effect, options, callback)
-	if ( $.isFunction( speed ) ) {
-		callback = speed;
-		speed = null;
-	}
-
-	// Add options to effect
-	if ( options ) {
-		$.extend( effect, options );
-	}
-
-	speed = speed || options.duration;
-	effect.duration = $.fx.off ? 0 :
-		typeof speed === "number" ? speed :
-		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
-		$.fx.speeds._default;
-
-	effect.complete = callback || options.complete;
-
-	return effect;
-}
-
-function standardAnimationOption( option ) {
-
-	// Valid standard speeds (nothing, number, named speed)
-	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
-		return true;
-	}
-
-	// Invalid strings - treat as "normal" speed
-	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
-		return true;
-	}
-
-	// Complete callback
-	if ( $.isFunction( option ) ) {
-		return true;
-	}
-
-	// Options hash (but not naming an effect)
-	if ( typeof option === "object" && !option.effect ) {
-		return true;
-	}
-
-	// Didn't match any standard API
-	return false;
-}
-
-$.fn.extend( {
-	effect: function( /* effect, options, speed, callback */ ) {
-		var args = _normalizeArguments.apply( this, arguments ),
-			effectMethod = $.effects.effect[ args.effect ],
-			defaultMode = effectMethod.mode,
-			queue = args.queue,
-			queueName = queue || "fx",
-			complete = args.complete,
-			mode = args.mode,
-			modes = [],
-			prefilter = function( next ) {
-				var el = $( this ),
-					normalizedMode = $.effects.mode( el, mode ) || defaultMode;
-
-				// Sentinel for duck-punching the :animated psuedo-selector
-				el.data( dataSpaceAnimated, true );
-
-				// Save effect mode for later use,
-				// we can't just call $.effects.mode again later,
-				// as the .show() below destroys the initial state
-				modes.push( normalizedMode );
-
-				// See $.uiBackCompat inside of run() for removal of defaultMode in 1.13
-				if ( defaultMode && ( normalizedMode === "show" ||
-						( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
-					el.show();
-				}
-
-				if ( !defaultMode || normalizedMode !== "none" ) {
-					$.effects.saveStyle( el );
-				}
-
-				if ( $.isFunction( next ) ) {
-					next();
-				}
-			};
-
-		if ( $.fx.off || !effectMethod ) {
-
-			// Delegate to the original method (e.g., .show()) if possible
-			if ( mode ) {
-				return this[ mode ]( args.duration, complete );
-			} else {
-				return this.each( function() {
-					if ( complete ) {
-						complete.call( this );
-					}
-				} );
-			}
-		}
-
-		function run( next ) {
-			var elem = $( this );
-
-			function cleanup() {
-				elem.removeData( dataSpaceAnimated );
-
-				$.effects.cleanUp( elem );
-
-				if ( args.mode === "hide" ) {
-					elem.hide();
-				}
-
-				done();
-			}
-
-			function done() {
-				if ( $.isFunction( complete ) ) {
-					complete.call( elem[ 0 ] );
-				}
-
-				if ( $.isFunction( next ) ) {
-					next();
-				}
-			}
-
-			// Override mode option on a per element basis,
-			// as toggle can be either show or hide depending on element state
-			args.mode = modes.shift();
-
-			if ( $.uiBackCompat !== false && !defaultMode ) {
-				if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
-
-					// Call the core method to track "olddisplay" properly
-					elem[ mode ]();
-					done();
-				} else {
-					effectMethod.call( elem[ 0 ], args, done );
-				}
-			} else {
-				if ( args.mode === "none" ) {
-
-					// Call the core method to track "olddisplay" properly
-					elem[ mode ]();
-					done();
-				} else {
-					effectMethod.call( elem[ 0 ], args, cleanup );
-				}
-			}
-		}
-
-		// Run prefilter on all elements first to ensure that
-		// any showing or hiding happens before placeholder creation,
-		// which ensures that any layout changes are correctly captured.
-		return queue === false ?
-			this.each( prefilter ).each( run ) :
-			this.queue( queueName, prefilter ).queue( queueName, run );
-	},
-
-	show: ( function( orig ) {
-		return function( option ) {
-			if ( standardAnimationOption( option ) ) {
-				return orig.apply( this, arguments );
-			} else {
-				var args = _normalizeArguments.apply( this, arguments );
-				args.mode = "show";
-				return this.effect.call( this, args );
-			}
-		};
-	} )( $.fn.show ),
-
-	hide: ( function( orig ) {
-		return function( option ) {
-			if ( standardAnimationOption( option ) ) {
-				return orig.apply( this, arguments );
-			} else {
-				var args = _normalizeArguments.apply( this, arguments );
-				args.mode = "hide";
-				return this.effect.call( this, args );
-			}
-		};
-	} )( $.fn.hide ),
-
-	toggle: ( function( orig ) {
-		return function( option ) {
-			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
-				return orig.apply( this, arguments );
-			} else {
-				var args = _normalizeArguments.apply( this, arguments );
-				args.mode = "toggle";
-				return this.effect.call( this, args );
-			}
-		};
-	} )( $.fn.toggle ),
-
-	cssUnit: function( key ) {
-		var style = this.css( key ),
-			val = [];
-
-		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
-			if ( style.indexOf( unit ) > 0 ) {
-				val = [ parseFloat( style ), unit ];
-			}
-		} );
-		return val;
-	},
-
-	cssClip: function( clipObj ) {
-		if ( clipObj ) {
-			return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
-				clipObj.bottom + "px " + clipObj.left + "px)" );
-		}
-		return parseClip( this.css( "clip" ), this );
-	},
-
-	transfer: function( options, done ) {
-		var element = $( this ),
-			target = $( options.to ),
-			targetFixed = target.css( "position" ) === "fixed",
-			body = $( "body" ),
-			fixTop = targetFixed ? body.scrollTop() : 0,
-			fixLeft = targetFixed ? body.scrollLeft() : 0,
-			endPosition = target.offset(),
-			animation = {
-				top: endPosition.top - fixTop,
-				left: endPosition.left - fixLeft,
-				height: target.innerHeight(),
-				width: target.innerWidth()
-			},
-			startPosition = element.offset(),
-			transfer = $( "<div class='ui-effects-transfer'></div>" )
-				.appendTo( "body" )
-				.addClass( options.className )
-				.css( {
-					top: startPosition.top - fixTop,
-					left: startPosition.left - fixLeft,
-					height: element.innerHeight(),
-					width: element.innerWidth(),
-					position: targetFixed ? "fixed" : "absolute"
-				} )
-				.animate( animation, options.duration, options.easing, function() {
-					transfer.remove();
-					if ( $.isFunction( done ) ) {
-						done();
-					}
-				} );
-	}
-} );
-
-function parseClip( str, element ) {
-		var outerWidth = element.outerWidth(),
-			outerHeight = element.outerHeight(),
-			clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
-			values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
-
-		return {
-			top: parseFloat( values[ 1 ] ) || 0,
-			right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
-			bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
-			left: parseFloat( values[ 4 ] ) || 0
-		};
-}
-
-$.fx.step.clip = function( fx ) {
-	if ( !fx.clipInit ) {
-		fx.start = $( fx.elem ).cssClip();
-		if ( typeof fx.end === "string" ) {
-			fx.end = parseClip( fx.end, fx.elem );
-		}
-		fx.clipInit = true;
-	}
-
-	$( fx.elem ).cssClip( {
-		top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
-		right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
-		bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
-		left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
-	} );
-};
-
-} )();
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-( function() {
-
-// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
-	baseEasings[ name ] = function( p ) {
-		return Math.pow( p, i + 2 );
-	};
-} );
-
-$.extend( baseEasings, {
-	Sine: function( p ) {
-		return 1 - Math.cos( p * Math.PI / 2 );
-	},
-	Circ: function( p ) {
-		return 1 - Math.sqrt( 1 - p * p );
-	},
-	Elastic: function( p ) {
-		return p === 0 || p === 1 ? p :
-			-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
-	},
-	Back: function( p ) {
-		return p * p * ( 3 * p - 2 );
-	},
-	Bounce: function( p ) {
-		var pow2,
-			bounce = 4;
-
-		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
-		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
-	}
-} );
-
-$.each( baseEasings, function( name, easeIn ) {
-	$.easing[ "easeIn" + name ] = easeIn;
-	$.easing[ "easeOut" + name ] = function( p ) {
-		return 1 - easeIn( 1 - p );
-	};
-	$.easing[ "easeInOut" + name ] = function( p ) {
-		return p < 0.5 ?
-			easeIn( p * 2 ) / 2 :
-			1 - easeIn( p * -2 + 2 ) / 2;
-	};
-} );
-
-} )();
-
-var effect = $.effects;
-
-
-/*!
- * jQuery UI Effects Blind 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Blind Effect
-//>>group: Effects
-//>>description: Blinds the element.
-//>>docs: http://api.jqueryui.com/blind-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) {
-	var map = {
-			up: [ "bottom", "top" ],
-			vertical: [ "bottom", "top" ],
-			down: [ "top", "bottom" ],
-			left: [ "right", "left" ],
-			horizontal: [ "right", "left" ],
-			right: [ "left", "right" ]
-		},
-		element = $( this ),
-		direction = options.direction || "up",
-		start = element.cssClip(),
-		animate = { clip: $.extend( {}, start ) },
-		placeholder = $.effects.createPlaceholder( element );
-
-	animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
-
-	if ( options.mode === "show" ) {
-		element.cssClip( animate.clip );
-		if ( placeholder ) {
-			placeholder.css( $.effects.clipToBox( animate ) );
-		}
-
-		animate.clip = start;
-	}
-
-	if ( placeholder ) {
-		placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
-	}
-
-	element.animate( animate, {
-		queue: false,
-		duration: options.duration,
-		easing: options.easing,
-		complete: done
-	} );
-} );
-
-
-/*!
- * jQuery UI Effects Bounce 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Bounce Effect
-//>>group: Effects
-//>>description: Bounces an element horizontally or vertically n times.
-//>>docs: http://api.jqueryui.com/bounce-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) {
-	var upAnim, downAnim, refValue,
-		element = $( this ),
-
-		// Defaults:
-		mode = options.mode,
-		hide = mode === "hide",
-		show = mode === "show",
-		direction = options.direction || "up",
-		distance = options.distance,
-		times = options.times || 5,
-
-		// Number of internal animations
-		anims = times * 2 + ( show || hide ? 1 : 0 ),
-		speed = options.duration / anims,
-		easing = options.easing,
-
-		// Utility:
-		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
-		motion = ( direction === "up" || direction === "left" ),
-		i = 0,
-
-		queuelen = element.queue().length;
-
-	$.effects.createPlaceholder( element );
-
-	refValue = element.css( ref );
-
-	// Default distance for the BIGGEST bounce is the outer Distance / 3
-	if ( !distance ) {
-		distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
-	}
-
-	if ( show ) {
-		downAnim = { opacity: 1 };
-		downAnim[ ref ] = refValue;
-
-		// If we are showing, force opacity 0 and set the initial position
-		// then do the "first" animation
-		element
-			.css( "opacity", 0 )
-			.css( ref, motion ? -distance * 2 : distance * 2 )
-			.animate( downAnim, speed, easing );
-	}
-
-	// Start at the smallest distance if we are hiding
-	if ( hide ) {
-		distance = distance / Math.pow( 2, times - 1 );
-	}
-
-	downAnim = {};
-	downAnim[ ref ] = refValue;
-
-	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
-	for ( ; i < times; i++ ) {
-		upAnim = {};
-		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
-		element
-			.animate( upAnim, speed, easing )
-			.animate( downAnim, speed, easing );
-
-		distance = hide ? distance * 2 : distance / 2;
-	}
-
-	// Last Bounce when Hiding
-	if ( hide ) {
-		upAnim = { opacity: 0 };
-		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
-		element.animate( upAnim, speed, easing );
-	}
-
-	element.queue( done );
-
-	$.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Clip 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Clip Effect
-//>>group: Effects
-//>>description: Clips the element on and off like an old TV.
-//>>docs: http://api.jqueryui.com/clip-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) {
-	var start,
-		animate = {},
-		element = $( this ),
-		direction = options.direction || "vertical",
-		both = direction === "both",
-		horizontal = both || direction === "horizontal",
-		vertical = both || direction === "vertical";
-
-	start = element.cssClip();
-	animate.clip = {
-		top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
-		right: horizontal ? ( start.right - start.left ) / 2 : start.right,
-		bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
-		left: horizontal ? ( start.right - start.left ) / 2 : start.left
-	};
-
-	$.effects.createPlaceholder( element );
-
-	if ( options.mode === "show" ) {
-		element.cssClip( animate.clip );
-		animate.clip = start;
-	}
-
-	element.animate( animate, {
-		queue: false,
-		duration: options.duration,
-		easing: options.easing,
-		complete: done
-	} );
-
-} );
-
-
-/*!
- * jQuery UI Effects Drop 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Drop Effect
-//>>group: Effects
-//>>description: Moves an element in one direction and hides it at the same time.
-//>>docs: http://api.jqueryui.com/drop-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) {
-
-	var distance,
-		element = $( this ),
-		mode = options.mode,
-		show = mode === "show",
-		direction = options.direction || "left",
-		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
-		motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
-		oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
-		animation = {
-			opacity: 0
-		};
-
-	$.effects.createPlaceholder( element );
-
-	distance = options.distance ||
-		element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
-
-	animation[ ref ] = motion + distance;
-
-	if ( show ) {
-		element.css( animation );
-
-		animation[ ref ] = oppositeMotion + distance;
-		animation.opacity = 1;
-	}
-
-	// Animate
-	element.animate( animation, {
-		queue: false,
-		duration: options.duration,
-		easing: options.easing,
-		complete: done
-	} );
-} );
-
-
-/*!
- * jQuery UI Effects Explode 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Explode Effect
-//>>group: Effects
-// jscs:disable maximumLineLength
-//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/explode-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) {
-
-	var i, j, left, top, mx, my,
-		rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
-		cells = rows,
-		element = $( this ),
-		mode = options.mode,
-		show = mode === "show",
-
-		// Show and then visibility:hidden the element before calculating offset
-		offset = element.show().css( "visibility", "hidden" ).offset(),
-
-		// Width and height of a piece
-		width = Math.ceil( element.outerWidth() / cells ),
-		height = Math.ceil( element.outerHeight() / rows ),
-		pieces = [];
-
-	// Children animate complete:
-	function childComplete() {
-		pieces.push( this );
-		if ( pieces.length === rows * cells ) {
-			animComplete();
-		}
-	}
-
-	// Clone the element for each row and cell.
-	for ( i = 0; i < rows; i++ ) { // ===>
-		top = offset.top + i * height;
-		my = i - ( rows - 1 ) / 2;
-
-		for ( j = 0; j < cells; j++ ) { // |||
-			left = offset.left + j * width;
-			mx = j - ( cells - 1 ) / 2;
-
-			// Create a clone of the now hidden main element that will be absolute positioned
-			// within a wrapper div off the -left and -top equal to size of our pieces
-			element
-				.clone()
-				.appendTo( "body" )
-				.wrap( "<div></div>" )
-				.css( {
-					position: "absolute",
-					visibility: "visible",
-					left: -j * width,
-					top: -i * height
-				} )
-
-				// Select the wrapper - make it overflow: hidden and absolute positioned based on
-				// where the original was located +left and +top equal to the size of pieces
-				.parent()
-					.addClass( "ui-effects-explode" )
-					.css( {
-						position: "absolute",
-						overflow: "hidden",
-						width: width,
-						height: height,
-						left: left + ( show ? mx * width : 0 ),
-						top: top + ( show ? my * height : 0 ),
-						opacity: show ? 0 : 1
-					} )
-					.animate( {
-						left: left + ( show ? 0 : mx * width ),
-						top: top + ( show ? 0 : my * height ),
-						opacity: show ? 1 : 0
-					}, options.duration || 500, options.easing, childComplete );
-		}
-	}
-
-	function animComplete() {
-		element.css( {
-			visibility: "visible"
-		} );
-		$( pieces ).remove();
-		done();
-	}
-} );
-
-
-/*!
- * jQuery UI Effects Fade 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Fade Effect
-//>>group: Effects
-//>>description: Fades the element.
-//>>docs: http://api.jqueryui.com/fade-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) {
-	var show = options.mode === "show";
-
-	$( this )
-		.css( "opacity", show ? 0 : 1 )
-		.animate( {
-			opacity: show ? 1 : 0
-		}, {
-			queue: false,
-			duration: options.duration,
-			easing: options.easing,
-			complete: done
-		} );
-} );
-
-
-/*!
- * jQuery UI Effects Fold 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Fold Effect
-//>>group: Effects
-//>>description: Folds an element first horizontally and then vertically.
-//>>docs: http://api.jqueryui.com/fold-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) {
-
-	// Create element
-	var element = $( this ),
-		mode = options.mode,
-		show = mode === "show",
-		hide = mode === "hide",
-		size = options.size || 15,
-		percent = /([0-9]+)%/.exec( size ),
-		horizFirst = !!options.horizFirst,
-		ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
-		duration = options.duration / 2,
-
-		placeholder = $.effects.createPlaceholder( element ),
-
-		start = element.cssClip(),
-		animation1 = { clip: $.extend( {}, start ) },
-		animation2 = { clip: $.extend( {}, start ) },
-
-		distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
-
-		queuelen = element.queue().length;
-
-	if ( percent ) {
-		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
-	}
-	animation1.clip[ ref[ 0 ] ] = size;
-	animation2.clip[ ref[ 0 ] ] = size;
-	animation2.clip[ ref[ 1 ] ] = 0;
-
-	if ( show ) {
-		element.cssClip( animation2.clip );
-		if ( placeholder ) {
-			placeholder.css( $.effects.clipToBox( animation2 ) );
-		}
-
-		animation2.clip = start;
-	}
-
-	// Animate
-	element
-		.queue( function( next ) {
-			if ( placeholder ) {
-				placeholder
-					.animate( $.effects.clipToBox( animation1 ), duration, options.easing )
-					.animate( $.effects.clipToBox( animation2 ), duration, options.easing );
-			}
-
-			next();
-		} )
-		.animate( animation1, duration, options.easing )
-		.animate( animation2, duration, options.easing )
-		.queue( done );
-
-	$.effects.unshift( element, queuelen, 4 );
-} );
-
-
-/*!
- * jQuery UI Effects Highlight 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Highlight Effect
-//>>group: Effects
-//>>description: Highlights the background of an element in a defined color for a custom duration.
-//>>docs: http://api.jqueryui.com/highlight-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) {
-	var element = $( this ),
-		animation = {
-			backgroundColor: element.css( "backgroundColor" )
-		};
-
-	if ( options.mode === "hide" ) {
-		animation.opacity = 0;
-	}
-
-	$.effects.saveStyle( element );
-
-	element
-		.css( {
-			backgroundImage: "none",
-			backgroundColor: options.color || "#ffff99"
-		} )
-		.animate( animation, {
-			queue: false,
-			duration: options.duration,
-			easing: options.easing,
-			complete: done
-		} );
-} );
-
-
-/*!
- * jQuery UI Effects Size 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Size Effect
-//>>group: Effects
-//>>description: Resize an element to a specified width and height.
-//>>docs: http://api.jqueryui.com/size-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectSize = $.effects.define( "size", function( options, done ) {
-
-	// Create element
-	var baseline, factor, temp,
-		element = $( this ),
-
-		// Copy for children
-		cProps = [ "fontSize" ],
-		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
-		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
-
-		// Set options
-		mode = options.mode,
-		restore = mode !== "effect",
-		scale = options.scale || "both",
-		origin = options.origin || [ "middle", "center" ],
-		position = element.css( "position" ),
-		pos = element.position(),
-		original = $.effects.scaledDimensions( element ),
-		from = options.from || original,
-		to = options.to || $.effects.scaledDimensions( element, 0 );
-
-	$.effects.createPlaceholder( element );
-
-	if ( mode === "show" ) {
-		temp = from;
-		from = to;
-		to = temp;
-	}
-
-	// Set scaling factor
-	factor = {
-		from: {
-			y: from.height / original.height,
-			x: from.width / original.width
-		},
-		to: {
-			y: to.height / original.height,
-			x: to.width / original.width
-		}
-	};
-
-	// Scale the css box
-	if ( scale === "box" || scale === "both" ) {
-
-		// Vertical props scaling
-		if ( factor.from.y !== factor.to.y ) {
-			from = $.effects.setTransition( element, vProps, factor.from.y, from );
-			to = $.effects.setTransition( element, vProps, factor.to.y, to );
-		}
-
-		// Horizontal props scaling
-		if ( factor.from.x !== factor.to.x ) {
-			from = $.effects.setTransition( element, hProps, factor.from.x, from );
-			to = $.effects.setTransition( element, hProps, factor.to.x, to );
-		}
-	}
-
-	// Scale the content
-	if ( scale === "content" || scale === "both" ) {
-
-		// Vertical props scaling
-		if ( factor.from.y !== factor.to.y ) {
-			from = $.effects.setTransition( element, cProps, factor.from.y, from );
-			to = $.effects.setTransition( element, cProps, factor.to.y, to );
-		}
-	}
-
-	// Adjust the position properties based on the provided origin points
-	if ( origin ) {
-		baseline = $.effects.getBaseline( origin, original );
-		from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
-		from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
-		to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
-		to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
-	}
-	element.css( from );
-
-	// Animate the children if desired
-	if ( scale === "content" || scale === "both" ) {
-
-		vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
-		hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
-
-		// Only animate children with width attributes specified
-		// TODO: is this right? should we include anything with css width specified as well
-		element.find( "*[width]" ).each( function() {
-			var child = $( this ),
-				childOriginal = $.effects.scaledDimensions( child ),
-				childFrom = {
-					height: childOriginal.height * factor.from.y,
-					width: childOriginal.width * factor.from.x,
-					outerHeight: childOriginal.outerHeight * factor.from.y,
-					outerWidth: childOriginal.outerWidth * factor.from.x
-				},
-				childTo = {
-					height: childOriginal.height * factor.to.y,
-					width: childOriginal.width * factor.to.x,
-					outerHeight: childOriginal.height * factor.to.y,
-					outerWidth: childOriginal.width * factor.to.x
-				};
-
-			// Vertical props scaling
-			if ( factor.from.y !== factor.to.y ) {
-				childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
-				childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
-			}
-
-			// Horizontal props scaling
-			if ( factor.from.x !== factor.to.x ) {
-				childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
-				childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
-			}
-
-			if ( restore ) {
-				$.effects.saveStyle( child );
-			}
-
-			// Animate children
-			child.css( childFrom );
-			child.animate( childTo, options.duration, options.easing, function() {
-
-				// Restore children
-				if ( restore ) {
-					$.effects.restoreStyle( child );
-				}
-			} );
-		} );
-	}
-
-	// Animate
-	element.animate( to, {
-		queue: false,
-		duration: options.duration,
-		easing: options.easing,
-		complete: function() {
-
-			var offset = element.offset();
-
-			if ( to.opacity === 0 ) {
-				element.css( "opacity", from.opacity );
-			}
-
-			if ( !restore ) {
-				element
-					.css( "position", position === "static" ? "relative" : position )
-					.offset( offset );
-
-				// Need to save style here so that automatic style restoration
-				// doesn't restore to the original styles from before the animation.
-				$.effects.saveStyle( element );
-			}
-
-			done();
-		}
-	} );
-
-} );
-
-
-/*!
- * jQuery UI Effects Scale 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Scale Effect
-//>>group: Effects
-//>>description: Grows or shrinks an element and its content.
-//>>docs: http://api.jqueryui.com/scale-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
-
-	// Create element
-	var el = $( this ),
-		mode = options.mode,
-		percent = parseInt( options.percent, 10 ) ||
-			( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
-
-		newOptions = $.extend( true, {
-			from: $.effects.scaledDimensions( el ),
-			to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
-			origin: options.origin || [ "middle", "center" ]
-		}, options );
-
-	// Fade option to support puff
-	if ( options.fade ) {
-		newOptions.from.opacity = 1;
-		newOptions.to.opacity = 0;
-	}
-
-	$.effects.effect.size.call( this, newOptions, done );
-} );
-
-
-/*!
- * jQuery UI Effects Puff 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Puff Effect
-//>>group: Effects
-//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
-//>>docs: http://api.jqueryui.com/puff-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) {
-	var newOptions = $.extend( true, {}, options, {
-		fade: true,
-		percent: parseInt( options.percent, 10 ) || 150
-	} );
-
-	$.effects.effect.scale.call( this, newOptions, done );
-} );
-
-
-/*!
- * jQuery UI Effects Pulsate 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Pulsate Effect
-//>>group: Effects
-//>>description: Pulsates an element n times by changing the opacity to zero and back.
-//>>docs: http://api.jqueryui.com/pulsate-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) {
-	var element = $( this ),
-		mode = options.mode,
-		show = mode === "show",
-		hide = mode === "hide",
-		showhide = show || hide,
-
-		// Showing or hiding leaves off the "last" animation
-		anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
-		duration = options.duration / anims,
-		animateTo = 0,
-		i = 1,
-		queuelen = element.queue().length;
-
-	if ( show || !element.is( ":visible" ) ) {
-		element.css( "opacity", 0 ).show();
-		animateTo = 1;
-	}
-
-	// Anims - 1 opacity "toggles"
-	for ( ; i < anims; i++ ) {
-		element.animate( { opacity: animateTo }, duration, options.easing );
-		animateTo = 1 - animateTo;
-	}
-
-	element.animate( { opacity: animateTo }, duration, options.easing );
-
-	element.queue( done );
-
-	$.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Shake 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Shake Effect
-//>>group: Effects
-//>>description: Shakes an element horizontally or vertically n times.
-//>>docs: http://api.jqueryui.com/shake-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
-
-	var i = 1,
-		element = $( this ),
-		direction = options.direction || "left",
-		distance = options.distance || 20,
-		times = options.times || 3,
-		anims = times * 2 + 1,
-		speed = Math.round( options.duration / anims ),
-		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
-		positiveMotion = ( direction === "up" || direction === "left" ),
-		animation = {},
-		animation1 = {},
-		animation2 = {},
-
-		queuelen = element.queue().length;
-
-	$.effects.createPlaceholder( element );
-
-	// Animation
-	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
-	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
-	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
-
-	// Animate
-	element.animate( animation, speed, options.easing );
-
-	// Shakes
-	for ( ; i < times; i++ ) {
-		element
-			.animate( animation1, speed, options.easing )
-			.animate( animation2, speed, options.easing );
-	}
-
-	element
-		.animate( animation1, speed, options.easing )
-		.animate( animation, speed / 2, options.easing )
-		.queue( done );
-
-	$.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Slide 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Slide Effect
-//>>group: Effects
-//>>description: Slides an element in and out of the viewport.
-//>>docs: http://api.jqueryui.com/slide-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) {
-	var startClip, startRef,
-		element = $( this ),
-		map = {
-			up: [ "bottom", "top" ],
-			down: [ "top", "bottom" ],
-			left: [ "right", "left" ],
-			right: [ "left", "right" ]
-		},
-		mode = options.mode,
-		direction = options.direction || "left",
-		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
-		positiveMotion = ( direction === "up" || direction === "left" ),
-		distance = options.distance ||
-			element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
-		animation = {};
-
-	$.effects.createPlaceholder( element );
-
-	startClip = element.cssClip();
-	startRef = element.position()[ ref ];
-
-	// Define hide animation
-	animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
-	animation.clip = element.cssClip();
-	animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
-
-	// Reverse the animation if we're showing
-	if ( mode === "show" ) {
-		element.cssClip( animation.clip );
-		element.css( ref, animation[ ref ] );
-		animation.clip = startClip;
-		animation[ ref ] = startRef;
-	}
-
-	// Actually animate
-	element.animate( animation, {
-		queue: false,
-		duration: options.duration,
-		easing: options.easing,
-		complete: done
-	} );
-} );
-
-
-/*!
- * jQuery UI Effects Transfer 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Transfer Effect
-//>>group: Effects
-//>>description: Displays a transfer effect from one element to another.
-//>>docs: http://api.jqueryui.com/transfer-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effect;
-if ( $.uiBackCompat !== false ) {
-	effect = $.effects.define( "transfer", function( options, done ) {
-		$( this ).transfer( options, done );
-	} );
-}
-var effectsEffectTransfer = effect;
-
-
-/*!
- * jQuery UI Focusable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :focusable Selector
-//>>group: Core
-//>>description: Selects elements which can be focused.
-//>>docs: http://api.jqueryui.com/focusable-selector/
-
-
-
-// Selectors
-$.ui.focusable = function( element, hasTabindex ) {
-	var map, mapName, img, focusableIfVisible, fieldset,
-		nodeName = element.nodeName.toLowerCase();
-
-	if ( "area" === nodeName ) {
-		map = element.parentNode;
-		mapName = map.name;
-		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
-			return false;
-		}
-		img = $( "img[usemap='#" + mapName + "']" );
-		return img.length > 0 && img.is( ":visible" );
-	}
-
-	if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
-		focusableIfVisible = !element.disabled;
-
-		if ( focusableIfVisible ) {
-
-			// Form controls within a disabled fieldset are disabled.
-			// However, controls within the fieldset's legend do not get disabled.
-			// Since controls generally aren't placed inside legends, we skip
-			// this portion of the check.
-			fieldset = $( element ).closest( "fieldset" )[ 0 ];
-			if ( fieldset ) {
-				focusableIfVisible = !fieldset.disabled;
-			}
-		}
-	} else if ( "a" === nodeName ) {
-		focusableIfVisible = element.href || hasTabindex;
-	} else {
-		focusableIfVisible = hasTabindex;
-	}
-
-	return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
-};
-
-// Support: IE 8 only
-// IE 8 doesn't resolve inherit to visible/hidden for computed values
-function visible( element ) {
-	var visibility = element.css( "visibility" );
-	while ( visibility === "inherit" ) {
-		element = element.parent();
-		visibility = element.css( "visibility" );
-	}
-	return visibility !== "hidden";
-}
-
-$.extend( $.expr[ ":" ], {
-	focusable: function( element ) {
-		return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
-	}
-} );
-
-var focusable = $.ui.focusable;
-
-
-
-
-// Support: IE8 Only
-// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
-// with a string, so we need to find the proper form.
-var form = $.fn.form = function() {
-	return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
-};
-
-
-/*!
- * jQuery UI Form Reset Mixin 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Form Reset Mixin
-//>>group: Core
-//>>description: Refresh input widgets when their form is reset
-//>>docs: http://api.jqueryui.com/form-reset-mixin/
-
-
-
-var formResetMixin = $.ui.formResetMixin = {
-	_formResetHandler: function() {
-		var form = $( this );
-
-		// Wait for the form reset to actually happen before refreshing
-		setTimeout( function() {
-			var instances = form.data( "ui-form-reset-instances" );
-			$.each( instances, function() {
-				this.refresh();
-			} );
-		} );
-	},
-
-	_bindFormResetHandler: function() {
-		this.form = this.element.form();
-		if ( !this.form.length ) {
-			return;
-		}
-
-		var instances = this.form.data( "ui-form-reset-instances" ) || [];
-		if ( !instances.length ) {
-
-			// We don't use _on() here because we use a single event handler per form
-			this.form.on( "reset.ui-form-reset", this._formResetHandler );
-		}
-		instances.push( this );
-		this.form.data( "ui-form-reset-instances", instances );
-	},
-
-	_unbindFormResetHandler: function() {
-		if ( !this.form.length ) {
-			return;
-		}
-
-		var instances = this.form.data( "ui-form-reset-instances" );
-		instances.splice( $.inArray( this, instances ), 1 );
-		if ( instances.length ) {
-			this.form.data( "ui-form-reset-instances", instances );
-		} else {
-			this.form
-				.removeData( "ui-form-reset-instances" )
-				.off( "reset.ui-form-reset" );
-		}
-	}
-};
-
-
-/*!
- * jQuery UI Support for jQuery core 1.7.x 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- */
-
-//>>label: jQuery 1.7 Support
-//>>group: Core
-//>>description: Support version 1.7.x of jQuery core
-
-
-
-// Support: jQuery 1.7 only
-// Not a great way to check versions, but since we only support 1.7+ and only
-// need to detect <1.8, this is a simple check that should suffice. Checking
-// for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0
-// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting
-// 1.7 anymore). See #11197 for why we're not using feature detection.
-if ( $.fn.jquery.substring( 0, 3 ) === "1.7" ) {
-
-	// Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight()
-	// Unlike jQuery Core 1.8+, these only support numeric values to set the
-	// dimensions in pixels
-	$.each( [ "Width", "Height" ], function( i, name ) {
-		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-			type = name.toLowerCase(),
-			orig = {
-				innerWidth: $.fn.innerWidth,
-				innerHeight: $.fn.innerHeight,
-				outerWidth: $.fn.outerWidth,
-				outerHeight: $.fn.outerHeight
-			};
-
-		function reduce( elem, size, border, margin ) {
-			$.each( side, function() {
-				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
-				if ( border ) {
-					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
-				}
-				if ( margin ) {
-					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
-				}
-			} );
-			return size;
-		}
-
-		$.fn[ "inner" + name ] = function( size ) {
-			if ( size === undefined ) {
-				return orig[ "inner" + name ].call( this );
-			}
-
-			return this.each( function() {
-				$( this ).css( type, reduce( this, size ) + "px" );
-			} );
-		};
-
-		$.fn[ "outer" + name ] = function( size, margin ) {
-			if ( typeof size !== "number" ) {
-				return orig[ "outer" + name ].call( this, size );
-			}
-
-			return this.each( function() {
-				$( this ).css( type, reduce( this, size, true, margin ) + "px" );
-			} );
-		};
-	} );
-
-	$.fn.addBack = function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-		);
-	};
-}
-
-;
-/*!
- * jQuery UI Keycode 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Keycode
-//>>group: Core
-//>>description: Provide keycodes as keynames
-//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
-
-
-var keycode = $.ui.keyCode = {
-	BACKSPACE: 8,
-	COMMA: 188,
-	DELETE: 46,
-	DOWN: 40,
-	END: 35,
-	ENTER: 13,
-	ESCAPE: 27,
-	HOME: 36,
-	LEFT: 37,
-	PAGE_DOWN: 34,
-	PAGE_UP: 33,
-	PERIOD: 190,
-	RIGHT: 39,
-	SPACE: 32,
-	TAB: 9,
-	UP: 38
-};
-
-
-
-
-// Internal use only
-var escapeSelector = $.ui.escapeSelector = ( function() {
-	var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
-	return function( selector ) {
-		return selector.replace( selectorEscape, "\\$1" );
-	};
-} )();
-
-
-/*!
- * jQuery UI Labels 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: labels
-//>>group: Core
-//>>description: Find all the labels associated with a given input
-//>>docs: http://api.jqueryui.com/labels/
-
-
-
-var labels = $.fn.labels = function() {
-	var ancestor, selector, id, labels, ancestors;
-
-	// Check control.labels first
-	if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
-		return this.pushStack( this[ 0 ].labels );
-	}
-
-	// Support: IE <= 11, FF <= 37, Android <= 2.3 only
-	// Above browsers do not support control.labels. Everything below is to support them
-	// as well as document fragments. control.labels does not work on document fragments
-	labels = this.eq( 0 ).parents( "label" );
-
-	// Look for the label based on the id
-	id = this.attr( "id" );
-	if ( id ) {
-
-		// We don't search against the document in case the element
-		// is disconnected from the DOM
-		ancestor = this.eq( 0 ).parents().last();
-
-		// Get a full set of top level ancestors
-		ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
-
-		// Create a selector for the label based on the id
-		selector = "label[for='" + $.ui.escapeSelector( id ) + "']";
-
-		labels = labels.add( ancestors.find( selector ).addBack( selector ) );
-
-	}
-
-	// Return whatever we have found for labels
-	return this.pushStack( labels );
-};
-
-
-/*!
- * jQuery UI Scroll Parent 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: scrollParent
-//>>group: Core
-//>>description: Get the closest ancestor element that is scrollable.
-//>>docs: http://api.jqueryui.com/scrollParent/
-
-
-
-var scrollParent = $.fn.scrollParent = function( includeHidden ) {
-	var position = this.css( "position" ),
-		excludeStaticParent = position === "absolute",
-		overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
-		scrollParent = this.parents().filter( function() {
-			var parent = $( this );
-			if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
-				return false;
-			}
-			return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
-				parent.css( "overflow-x" ) );
-		} ).eq( 0 );
-
-	return position === "fixed" || !scrollParent.length ?
-		$( this[ 0 ].ownerDocument || document ) :
-		scrollParent;
-};
-
-
-/*!
- * jQuery UI Tabbable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :tabbable Selector
-//>>group: Core
-//>>description: Selects elements which can be tabbed to.
-//>>docs: http://api.jqueryui.com/tabbable-selector/
-
-
-
-var tabbable = $.extend( $.expr[ ":" ], {
-	tabbable: function( element ) {
-		var tabIndex = $.attr( element, "tabindex" ),
-			hasTabindex = tabIndex != null;
-		return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
-	}
-} );
-
-
-/*!
- * jQuery UI Unique ID 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: uniqueId
-//>>group: Core
-//>>description: Functions to generate and remove uniqueId's
-//>>docs: http://api.jqueryui.com/uniqueId/
-
-
-
-var uniqueId = $.fn.extend( {
-	uniqueId: ( function() {
-		var uuid = 0;
-
-		return function() {
-			return this.each( function() {
-				if ( !this.id ) {
-					this.id = "ui-id-" + ( ++uuid );
-				}
-			} );
-		};
-	} )(),
-
-	removeUniqueId: function() {
-		return this.each( function() {
-			if ( /^ui-id-\d+$/.test( this.id ) ) {
-				$( this ).removeAttr( "id" );
-			}
-		} );
-	}
-} );
-
-
-/*!
- * jQuery UI Accordion 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Accordion
-//>>group: Widgets
-// jscs:disable maximumLineLength
-//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/accordion/
-//>>demos: http://jqueryui.com/accordion/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/accordion.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsAccordion = $.widget( "ui.accordion", {
-	version: "1.12.1",
-	options: {
-		active: 0,
-		animate: {},
-		classes: {
-			"ui-accordion-header": "ui-corner-top",
-			"ui-accordion-header-collapsed": "ui-corner-all",
-			"ui-accordion-content": "ui-corner-bottom"
-		},
-		collapsible: false,
-		event: "click",
-		header: "> li > :first-child, > :not(li):even",
-		heightStyle: "auto",
-		icons: {
-			activeHeader: "ui-icon-triangle-1-s",
-			header: "ui-icon-triangle-1-e"
-		},
-
-		// Callbacks
-		activate: null,
-		beforeActivate: null
-	},
-
-	hideProps: {
-		borderTopWidth: "hide",
-		borderBottomWidth: "hide",
-		paddingTop: "hide",
-		paddingBottom: "hide",
-		height: "hide"
-	},
-
-	showProps: {
-		borderTopWidth: "show",
-		borderBottomWidth: "show",
-		paddingTop: "show",
-		paddingBottom: "show",
-		height: "show"
-	},
-
-	_create: function() {
-		var options = this.options;
-
-		this.prevShow = this.prevHide = $();
-		this._addClass( "ui-accordion", "ui-widget ui-helper-reset" );
-		this.element.attr( "role", "tablist" );
-
-		// Don't allow collapsible: false and active: false / null
-		if ( !options.collapsible && ( options.active === false || options.active == null ) ) {
-			options.active = 0;
-		}
-
-		this._processPanels();
-
-		// handle negative values
-		if ( options.active < 0 ) {
-			options.active += this.headers.length;
-		}
-		this._refresh();
-	},
-
-	_getCreateEventData: function() {
-		return {
-			header: this.active,
-			panel: !this.active.length ? $() : this.active.next()
-		};
-	},
-
-	_createIcons: function() {
-		var icon, children,
-			icons = this.options.icons;
-
-		if ( icons ) {
-			icon = $( "<span>" );
-			this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header );
-			icon.prependTo( this.headers );
-			children = this.active.children( ".ui-accordion-header-icon" );
-			this._removeClass( children, icons.header )
-				._addClass( children, null, icons.activeHeader )
-				._addClass( this.headers, "ui-accordion-icons" );
-		}
-	},
-
-	_destroyIcons: function() {
-		this._removeClass( this.headers, "ui-accordion-icons" );
-		this.headers.children( ".ui-accordion-header-icon" ).remove();
-	},
-
-	_destroy: function() {
-		var contents;
-
-		// Clean up main element
-		this.element.removeAttr( "role" );
-
-		// Clean up headers
-		this.headers
-			.removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" )
-			.removeUniqueId();
-
-		this._destroyIcons();
-
-		// Clean up content panels
-		contents = this.headers.next()
-			.css( "display", "" )
-			.removeAttr( "role aria-hidden aria-labelledby" )
-			.removeUniqueId();
-
-		if ( this.options.heightStyle !== "content" ) {
-			contents.css( "height", "" );
-		}
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "active" ) {
-
-			// _activate() will handle invalid values and update this.options
-			this._activate( value );
-			return;
-		}
-
-		if ( key === "event" ) {
-			if ( this.options.event ) {
-				this._off( this.headers, this.options.event );
-			}
-			this._setupEvents( value );
-		}
-
-		this._super( key, value );
-
-		// Setting collapsible: false while collapsed; open first panel
-		if ( key === "collapsible" && !value && this.options.active === false ) {
-			this._activate( 0 );
-		}
-
-		if ( key === "icons" ) {
-			this._destroyIcons();
-			if ( value ) {
-				this._createIcons();
-			}
-		}
-	},
-
-	_setOptionDisabled: function( value ) {
-		this._super( value );
-
-		this.element.attr( "aria-disabled", value );
-
-		// Support: IE8 Only
-		// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
-		// so we need to add the disabled class to the headers and panels
-		this._toggleClass( null, "ui-state-disabled", !!value );
-		this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled",
-			!!value );
-	},
-
-	_keydown: function( event ) {
-		if ( event.altKey || event.ctrlKey ) {
-			return;
-		}
-
-		var keyCode = $.ui.keyCode,
-			length = this.headers.length,
-			currentIndex = this.headers.index( event.target ),
-			toFocus = false;
-
-		switch ( event.keyCode ) {
-		case keyCode.RIGHT:
-		case keyCode.DOWN:
-			toFocus = this.headers[ ( currentIndex + 1 ) % length ];
-			break;
-		case keyCode.LEFT:
-		case keyCode.UP:
-			toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
-			break;
-		case keyCode.SPACE:
-		case keyCode.ENTER:
-			this._eventHandler( event );
-			break;
-		case keyCode.HOME:
-			toFocus = this.headers[ 0 ];
-			break;
-		case keyCode.END:
-			toFocus = this.headers[ length - 1 ];
-			break;
-		}
-
-		if ( toFocus ) {
-			$( event.target ).attr( "tabIndex", -1 );
-			$( toFocus ).attr( "tabIndex", 0 );
-			$( toFocus ).trigger( "focus" );
-			event.preventDefault();
-		}
-	},
-
-	_panelKeyDown: function( event ) {
-		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
-			$( event.currentTarget ).prev().trigger( "focus" );
-		}
-	},
-
-	refresh: function() {
-		var options = this.options;
-		this._processPanels();
-
-		// Was collapsed or no panel
-		if ( ( options.active === false && options.collapsible === true ) ||
-				!this.headers.length ) {
-			options.active = false;
-			this.active = $();
-
-		// active false only when collapsible is true
-		} else if ( options.active === false ) {
-			this._activate( 0 );
-
-		// was active, but active panel is gone
-		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
-
-			// all remaining panel are disabled
-			if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) {
-				options.active = false;
-				this.active = $();
-
-			// activate previous panel
-			} else {
-				this._activate( Math.max( 0, options.active - 1 ) );
-			}
-
-		// was active, active panel still exists
-		} else {
-
-			// make sure active index is correct
-			options.active = this.headers.index( this.active );
-		}
-
-		this._destroyIcons();
-
-		this._refresh();
-	},
-
-	_processPanels: function() {
-		var prevHeaders = this.headers,
-			prevPanels = this.panels;
-
-		this.headers = this.element.find( this.options.header );
-		this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed",
-			"ui-state-default" );
-
-		this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide();
-		this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" );
-
-		// Avoid memory leaks (#10056)
-		if ( prevPanels ) {
-			this._off( prevHeaders.not( this.headers ) );
-			this._off( prevPanels.not( this.panels ) );
-		}
-	},
-
-	_refresh: function() {
-		var maxHeight,
-			options = this.options,
-			heightStyle = options.heightStyle,
-			parent = this.element.parent();
-
-		this.active = this._findActive( options.active );
-		this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" )
-			._removeClass( this.active, "ui-accordion-header-collapsed" );
-		this._addClass( this.active.next(), "ui-accordion-content-active" );
-		this.active.next().show();
-
-		this.headers
-			.attr( "role", "tab" )
-			.each( function() {
-				var header = $( this ),
-					headerId = header.uniqueId().attr( "id" ),
-					panel = header.next(),
-					panelId = panel.uniqueId().attr( "id" );
-				header.attr( "aria-controls", panelId );
-				panel.attr( "aria-labelledby", headerId );
-			} )
-			.next()
-				.attr( "role", "tabpanel" );
-
-		this.headers
-			.not( this.active )
-				.attr( {
-					"aria-selected": "false",
-					"aria-expanded": "false",
-					tabIndex: -1
-				} )
-				.next()
-					.attr( {
-						"aria-hidden": "true"
-					} )
-					.hide();
-
-		// Make sure at least one header is in the tab order
-		if ( !this.active.length ) {
-			this.headers.eq( 0 ).attr( "tabIndex", 0 );
-		} else {
-			this.active.attr( {
-				"aria-selected": "true",
-				"aria-expanded": "true",
-				tabIndex: 0
-			} )
-				.next()
-					.attr( {
-						"aria-hidden": "false"
-					} );
-		}
-
-		this._createIcons();
-
-		this._setupEvents( options.event );
-
-		if ( heightStyle === "fill" ) {
-			maxHeight = parent.height();
-			this.element.siblings( ":visible" ).each( function() {
-				var elem = $( this ),
-					position = elem.css( "position" );
-
-				if ( position === "absolute" || position === "fixed" ) {
-					return;
-				}
-				maxHeight -= elem.outerHeight( true );
-			} );
-
-			this.headers.each( function() {
-				maxHeight -= $( this ).outerHeight( true );
-			} );
-
-			this.headers.next()
-				.each( function() {
-					$( this ).height( Math.max( 0, maxHeight -
-						$( this ).innerHeight() + $( this ).height() ) );
-				} )
-				.css( "overflow", "auto" );
-		} else if ( heightStyle === "auto" ) {
-			maxHeight = 0;
-			this.headers.next()
-				.each( function() {
-					var isVisible = $( this ).is( ":visible" );
-					if ( !isVisible ) {
-						$( this ).show();
-					}
-					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
-					if ( !isVisible ) {
-						$( this ).hide();
-					}
-				} )
-				.height( maxHeight );
-		}
-	},
-
-	_activate: function( index ) {
-		var active = this._findActive( index )[ 0 ];
-
-		// Trying to activate the already active panel
-		if ( active === this.active[ 0 ] ) {
-			return;
-		}
-
-		// Trying to collapse, simulate a click on the currently active header
-		active = active || this.active[ 0 ];
-
-		this._eventHandler( {
-			target: active,
-			currentTarget: active,
-			preventDefault: $.noop
-		} );
-	},
-
-	_findActive: function( selector ) {
-		return typeof selector === "number" ? this.headers.eq( selector ) : $();
-	},
-
-	_setupEvents: function( event ) {
-		var events = {
-			keydown: "_keydown"
-		};
-		if ( event ) {
-			$.each( event.split( " " ), function( index, eventName ) {
-				events[ eventName ] = "_eventHandler";
-			} );
-		}
-
-		this._off( this.headers.add( this.headers.next() ) );
-		this._on( this.headers, events );
-		this._on( this.headers.next(), { keydown: "_panelKeyDown" } );
-		this._hoverable( this.headers );
-		this._focusable( this.headers );
-	},
-
-	_eventHandler: function( event ) {
-		var activeChildren, clickedChildren,
-			options = this.options,
-			active = this.active,
-			clicked = $( event.currentTarget ),
-			clickedIsActive = clicked[ 0 ] === active[ 0 ],
-			collapsing = clickedIsActive && options.collapsible,
-			toShow = collapsing ? $() : clicked.next(),
-			toHide = active.next(),
-			eventData = {
-				oldHeader: active,
-				oldPanel: toHide,
-				newHeader: collapsing ? $() : clicked,
-				newPanel: toShow
-			};
-
-		event.preventDefault();
-
-		if (
-
-				// click on active header, but not collapsible
-				( clickedIsActive && !options.collapsible ) ||
-
-				// allow canceling activation
-				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
-			return;
-		}
-
-		options.active = collapsing ? false : this.headers.index( clicked );
-
-		// When the call to ._toggle() comes after the class changes
-		// it causes a very odd bug in IE 8 (see #6720)
-		this.active = clickedIsActive ? $() : clicked;
-		this._toggle( eventData );
-
-		// Switch classes
-		// corner classes on the previously active header stay after the animation
-		this._removeClass( active, "ui-accordion-header-active", "ui-state-active" );
-		if ( options.icons ) {
-			activeChildren = active.children( ".ui-accordion-header-icon" );
-			this._removeClass( activeChildren, null, options.icons.activeHeader )
-				._addClass( activeChildren, null, options.icons.header );
-		}
-
-		if ( !clickedIsActive ) {
-			this._removeClass( clicked, "ui-accordion-header-collapsed" )
-				._addClass( clicked, "ui-accordion-header-active", "ui-state-active" );
-			if ( options.icons ) {
-				clickedChildren = clicked.children( ".ui-accordion-header-icon" );
-				this._removeClass( clickedChildren, null, options.icons.header )
-					._addClass( clickedChildren, null, options.icons.activeHeader );
-			}
-
-			this._addClass( clicked.next(), "ui-accordion-content-active" );
-		}
-	},
-
-	_toggle: function( data ) {
-		var toShow = data.newPanel,
-			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
-
-		// Handle activating a panel during the animation for another activation
-		this.prevShow.add( this.prevHide ).stop( true, true );
-		this.prevShow = toShow;
-		this.prevHide = toHide;
-
-		if ( this.options.animate ) {
-			this._animate( toShow, toHide, data );
-		} else {
-			toHide.hide();
-			toShow.show();
-			this._toggleComplete( data );
-		}
-
-		toHide.attr( {
-			"aria-hidden": "true"
-		} );
-		toHide.prev().attr( {
-			"aria-selected": "false",
-			"aria-expanded": "false"
-		} );
-
-		// if we're switching panels, remove the old header from the tab order
-		// if we're opening from collapsed state, remove the previous header from the tab order
-		// if we're collapsing, then keep the collapsing header in the tab order
-		if ( toShow.length && toHide.length ) {
-			toHide.prev().attr( {
-				"tabIndex": -1,
-				"aria-expanded": "false"
-			} );
-		} else if ( toShow.length ) {
-			this.headers.filter( function() {
-				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
-			} )
-				.attr( "tabIndex", -1 );
-		}
-
-		toShow
-			.attr( "aria-hidden", "false" )
-			.prev()
-				.attr( {
-					"aria-selected": "true",
-					"aria-expanded": "true",
-					tabIndex: 0
-				} );
-	},
-
-	_animate: function( toShow, toHide, data ) {
-		var total, easing, duration,
-			that = this,
-			adjust = 0,
-			boxSizing = toShow.css( "box-sizing" ),
-			down = toShow.length &&
-				( !toHide.length || ( toShow.index() < toHide.index() ) ),
-			animate = this.options.animate || {},
-			options = down && animate.down || animate,
-			complete = function() {
-				that._toggleComplete( data );
-			};
-
-		if ( typeof options === "number" ) {
-			duration = options;
-		}
-		if ( typeof options === "string" ) {
-			easing = options;
-		}
-
-		// fall back from options to animation in case of partial down settings
-		easing = easing || options.easing || animate.easing;
-		duration = duration || options.duration || animate.duration;
-
-		if ( !toHide.length ) {
-			return toShow.animate( this.showProps, duration, easing, complete );
-		}
-		if ( !toShow.length ) {
-			return toHide.animate( this.hideProps, duration, easing, complete );
-		}
-
-		total = toShow.show().outerHeight();
-		toHide.animate( this.hideProps, {
-			duration: duration,
-			easing: easing,
-			step: function( now, fx ) {
-				fx.now = Math.round( now );
-			}
-		} );
-		toShow
-			.hide()
-			.animate( this.showProps, {
-				duration: duration,
-				easing: easing,
-				complete: complete,
-				step: function( now, fx ) {
-					fx.now = Math.round( now );
-					if ( fx.prop !== "height" ) {
-						if ( boxSizing === "content-box" ) {
-							adjust += fx.now;
-						}
-					} else if ( that.options.heightStyle !== "content" ) {
-						fx.now = Math.round( total - toHide.outerHeight() - adjust );
-						adjust = 0;
-					}
-				}
-			} );
-	},
-
-	_toggleComplete: function( data ) {
-		var toHide = data.oldPanel,
-			prev = toHide.prev();
-
-		this._removeClass( toHide, "ui-accordion-content-active" );
-		this._removeClass( prev, "ui-accordion-header-active" )
-			._addClass( prev, "ui-accordion-header-collapsed" );
-
-		// Work around for rendering bug in IE (#5421)
-		if ( toHide.length ) {
-			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
-		}
-		this._trigger( "activate", null, data );
-	}
-} );
-
-
-
-var safeActiveElement = $.ui.safeActiveElement = function( document ) {
-	var activeElement;
-
-	// Support: IE 9 only
-	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
-	try {
-		activeElement = document.activeElement;
-	} catch ( error ) {
-		activeElement = document.body;
-	}
-
-	// Support: IE 9 - 11 only
-	// IE may return null instead of an element
-	// Interestingly, this only seems to occur when NOT in an iframe
-	if ( !activeElement ) {
-		activeElement = document.body;
-	}
-
-	// Support: IE 11 only
-	// IE11 returns a seemingly empty object in some cases when accessing
-	// document.activeElement from an <iframe>
-	if ( !activeElement.nodeName ) {
-		activeElement = document.body;
-	}
-
-	return activeElement;
-};
-
-
-/*!
- * jQuery UI Menu 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Menu
-//>>group: Widgets
-//>>description: Creates nestable menus.
-//>>docs: http://api.jqueryui.com/menu/
-//>>demos: http://jqueryui.com/menu/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/menu.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsMenu = $.widget( "ui.menu", {
-	version: "1.12.1",
-	defaultElement: "<ul>",
-	delay: 300,
-	options: {
-		icons: {
-			submenu: "ui-icon-caret-1-e"
-		},
-		items: "> *",
-		menus: "ul",
-		position: {
-			my: "left top",
-			at: "right top"
-		},
-		role: "menu",
-
-		// Callbacks
-		blur: null,
-		focus: null,
-		select: null
-	},
-
-	_create: function() {
-		this.activeMenu = this.element;
-
-		// Flag used to prevent firing of the click handler
-		// as the event bubbles up through nested menus
-		this.mouseHandled = false;
-		this.element
-			.uniqueId()
-			.attr( {
-				role: this.options.role,
-				tabIndex: 0
-			} );
-
-		this._addClass( "ui-menu", "ui-widget ui-widget-content" );
-		this._on( {
-
-			// Prevent focus from sticking to links inside menu after clicking
-			// them (focus should always stay on UL during navigation).
-			"mousedown .ui-menu-item": function( event ) {
-				event.preventDefault();
-			},
-			"click .ui-menu-item": function( event ) {
-				var target = $( event.target );
-				var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
-				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
-					this.select( event );
-
-					// Only set the mouseHandled flag if the event will bubble, see #9469.
-					if ( !event.isPropagationStopped() ) {
-						this.mouseHandled = true;
-					}
-
-					// Open submenu on click
-					if ( target.has( ".ui-menu" ).length ) {
-						this.expand( event );
-					} else if ( !this.element.is( ":focus" ) &&
-							active.closest( ".ui-menu" ).length ) {
-
-						// Redirect focus to the menu
-						this.element.trigger( "focus", [ true ] );
-
-						// If the active item is on the top level, let it stay active.
-						// Otherwise, blur the active item since it is no longer visible.
-						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
-							clearTimeout( this.timer );
-						}
-					}
-				}
-			},
-			"mouseenter .ui-menu-item": function( event ) {
-
-				// Ignore mouse events while typeahead is active, see #10458.
-				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
-				// is over an item in the menu
-				if ( this.previousFilter ) {
-					return;
-				}
-
-				var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
-					target = $( event.currentTarget );
-
-				// Ignore bubbled events on parent items, see #11641
-				if ( actualTarget[ 0 ] !== target[ 0 ] ) {
-					return;
-				}
-
-				// Remove ui-state-active class from siblings of the newly focused menu item
-				// to avoid a jump caused by adjacent elements both having a class with a border
-				this._removeClass( target.siblings().children( ".ui-state-active" ),
-					null, "ui-state-active" );
-				this.focus( event, target );
-			},
-			mouseleave: "collapseAll",
-			"mouseleave .ui-menu": "collapseAll",
-			focus: function( event, keepActiveItem ) {
-
-				// If there's already an active item, keep it active
-				// If not, activate the first item
-				var item = this.active || this.element.find( this.options.items ).eq( 0 );
-
-				if ( !keepActiveItem ) {
-					this.focus( event, item );
-				}
-			},
-			blur: function( event ) {
-				this._delay( function() {
-					var notContained = !$.contains(
-						this.element[ 0 ],
-						$.ui.safeActiveElement( this.document[ 0 ] )
-					);
-					if ( notContained ) {
-						this.collapseAll( event );
-					}
-				} );
-			},
-			keydown: "_keydown"
-		} );
-
-		this.refresh();
-
-		// Clicks outside of a menu collapse any open menus
-		this._on( this.document, {
-			click: function( event ) {
-				if ( this._closeOnDocumentClick( event ) ) {
-					this.collapseAll( event );
-				}
-
-				// Reset the mouseHandled flag
-				this.mouseHandled = false;
-			}
-		} );
-	},
-
-	_destroy: function() {
-		var items = this.element.find( ".ui-menu-item" )
-				.removeAttr( "role aria-disabled" ),
-			submenus = items.children( ".ui-menu-item-wrapper" )
-				.removeUniqueId()
-				.removeAttr( "tabIndex role aria-haspopup" );
-
-		// Destroy (sub)menus
-		this.element
-			.removeAttr( "aria-activedescendant" )
-			.find( ".ui-menu" ).addBack()
-				.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
-					"tabIndex" )
-				.removeUniqueId()
-				.show();
-
-		submenus.children().each( function() {
-			var elem = $( this );
-			if ( elem.data( "ui-menu-submenu-caret" ) ) {
-				elem.remove();
-			}
-		} );
-	},
-
-	_keydown: function( event ) {
-		var match, prev, character, skip,
-			preventDefault = true;
-
-		switch ( event.keyCode ) {
-		case $.ui.keyCode.PAGE_UP:
-			this.previousPage( event );
-			break;
-		case $.ui.keyCode.PAGE_DOWN:
-			this.nextPage( event );
-			break;
-		case $.ui.keyCode.HOME:
-			this._move( "first", "first", event );
-			break;
-		case $.ui.keyCode.END:
-			this._move( "last", "last", event );
-			break;
-		case $.ui.keyCode.UP:
-			this.previous( event );
-			break;
-		case $.ui.keyCode.DOWN:
-			this.next( event );
-			break;
-		case $.ui.keyCode.LEFT:
-			this.collapse( event );
-			break;
-		case $.ui.keyCode.RIGHT:
-			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
-				this.expand( event );
-			}
-			break;
-		case $.ui.keyCode.ENTER:
-		case $.ui.keyCode.SPACE:
-			this._activate( event );
-			break;
-		case $.ui.keyCode.ESCAPE:
-			this.collapse( event );
-			break;
-		default:
-			preventDefault = false;
-			prev = this.previousFilter || "";
-			skip = false;
-
-			// Support number pad values
-			character = event.keyCode >= 96 && event.keyCode <= 105 ?
-				( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
-
-			clearTimeout( this.filterTimer );
-
-			if ( character === prev ) {
-				skip = true;
-			} else {
-				character = prev + character;
-			}
-
-			match = this._filterMenuItems( character );
-			match = skip && match.index( this.active.next() ) !== -1 ?
-				this.active.nextAll( ".ui-menu-item" ) :
-				match;
-
-			// If no matches on the current filter, reset to the last character pressed
-			// to move down the menu to the first item that starts with that character
-			if ( !match.length ) {
-				character = String.fromCharCode( event.keyCode );
-				match = this._filterMenuItems( character );
-			}
-
-			if ( match.length ) {
-				this.focus( event, match );
-				this.previousFilter = character;
-				this.filterTimer = this._delay( function() {
-					delete this.previousFilter;
-				}, 1000 );
-			} else {
-				delete this.previousFilter;
-			}
-		}
-
-		if ( preventDefault ) {
-			event.preventDefault();
-		}
-	},
-
-	_activate: function( event ) {
-		if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
-			if ( this.active.children( "[aria-haspopup='true']" ).length ) {
-				this.expand( event );
-			} else {
-				this.select( event );
-			}
-		}
-	},
-
-	refresh: function() {
-		var menus, items, newSubmenus, newItems, newWrappers,
-			that = this,
-			icon = this.options.icons.submenu,
-			submenus = this.element.find( this.options.menus );
-
-		this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
-
-		// Initialize nested menus
-		newSubmenus = submenus.filter( ":not(.ui-menu)" )
-			.hide()
-			.attr( {
-				role: this.options.role,
-				"aria-hidden": "true",
-				"aria-expanded": "false"
-			} )
-			.each( function() {
-				var menu = $( this ),
-					item = menu.prev(),
-					submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
-
-				that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
-				item
-					.attr( "aria-haspopup", "true" )
-					.prepend( submenuCaret );
-				menu.attr( "aria-labelledby", item.attr( "id" ) );
-			} );
-
-		this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
-
-		menus = submenus.add( this.element );
-		items = menus.find( this.options.items );
-
-		// Initialize menu-items containing spaces and/or dashes only as dividers
-		items.not( ".ui-menu-item" ).each( function() {
-			var item = $( this );
-			if ( that._isDivider( item ) ) {
-				that._addClass( item, "ui-menu-divider", "ui-widget-content" );
-			}
-		} );
-
-		// Don't refresh list items that are already adapted
-		newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
-		newWrappers = newItems.children()
-			.not( ".ui-menu" )
-				.uniqueId()
-				.attr( {
-					tabIndex: -1,
-					role: this._itemRole()
-				} );
-		this._addClass( newItems, "ui-menu-item" )
-			._addClass( newWrappers, "ui-menu-item-wrapper" );
-
-		// Add aria-disabled attribute to any disabled menu item
-		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
-
-		// If the active item has been removed, blur the menu
-		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
-			this.blur();
-		}
-	},
-
-	_itemRole: function() {
-		return {
-			menu: "menuitem",
-			listbox: "option"
-		}[ this.options.role ];
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "icons" ) {
-			var icons = this.element.find( ".ui-menu-icon" );
-			this._removeClass( icons, null, this.options.icons.submenu )
-				._addClass( icons, null, value.submenu );
-		}
-		this._super( key, value );
-	},
-
-	_setOptionDisabled: function( value ) {
-		this._super( value );
-
-		this.element.attr( "aria-disabled", String( value ) );
-		this._toggleClass( null, "ui-state-disabled", !!value );
-	},
-
-	focus: function( event, item ) {
-		var nested, focused, activeParent;
-		this.blur( event, event && event.type === "focus" );
-
-		this._scrollIntoView( item );
-
-		this.active = item.first();
-
-		focused = this.active.children( ".ui-menu-item-wrapper" );
-		this._addClass( focused, null, "ui-state-active" );
-
-		// Only update aria-activedescendant if there's a role
-		// otherwise we assume focus is managed elsewhere
-		if ( this.options.role ) {
-			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
-		}
-
-		// Highlight active parent menu item, if any
-		activeParent = this.active
-			.parent()
-				.closest( ".ui-menu-item" )
-					.children( ".ui-menu-item-wrapper" );
-		this._addClass( activeParent, null, "ui-state-active" );
-
-		if ( event && event.type === "keydown" ) {
-			this._close();
-		} else {
-			this.timer = this._delay( function() {
-				this._close();
-			}, this.delay );
-		}
-
-		nested = item.children( ".ui-menu" );
-		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
-			this._startOpening( nested );
-		}
-		this.activeMenu = item.parent();
-
-		this._trigger( "focus", event, { item: item } );
-	},
-
-	_scrollIntoView: function( item ) {
-		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
-		if ( this._hasScroll() ) {
-			borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
-			paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
-			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
-			scroll = this.activeMenu.scrollTop();
-			elementHeight = this.activeMenu.height();
-			itemHeight = item.outerHeight();
-
-			if ( offset < 0 ) {
-				this.activeMenu.scrollTop( scroll + offset );
-			} else if ( offset + itemHeight > elementHeight ) {
-				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
-			}
-		}
-	},
-
-	blur: function( event, fromFocus ) {
-		if ( !fromFocus ) {
-			clearTimeout( this.timer );
-		}
-
-		if ( !this.active ) {
-			return;
-		}
-
-		this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
-			null, "ui-state-active" );
-
-		this._trigger( "blur", event, { item: this.active } );
-		this.active = null;
-	},
-
-	_startOpening: function( submenu ) {
-		clearTimeout( this.timer );
-
-		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
-		// shift in the submenu position when mousing over the caret icon
-		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
-			return;
-		}
-
-		this.timer = this._delay( function() {
-			this._close();
-			this._open( submenu );
-		}, this.delay );
-	},
-
-	_open: function( submenu ) {
-		var position = $.extend( {
-			of: this.active
-		}, this.options.position );
-
-		clearTimeout( this.timer );
-		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
-			.hide()
-			.attr( "aria-hidden", "true" );
-
-		submenu
-			.show()
-			.removeAttr( "aria-hidden" )
-			.attr( "aria-expanded", "true" )
-			.position( position );
-	},
-
-	collapseAll: function( event, all ) {
-		clearTimeout( this.timer );
-		this.timer = this._delay( function() {
-
-			// If we were passed an event, look for the submenu that contains the event
-			var currentMenu = all ? this.element :
-				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
-
-			// If we found no valid submenu ancestor, use the main menu to close all
-			// sub menus anyway
-			if ( !currentMenu.length ) {
-				currentMenu = this.element;
-			}
-
-			this._close( currentMenu );
-
-			this.blur( event );
-
-			// Work around active item staying active after menu is blurred
-			this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
-
-			this.activeMenu = currentMenu;
-		}, this.delay );
-	},
-
-	// With no arguments, closes the currently active menu - if nothing is active
-	// it closes all menus.  If passed an argument, it will search for menus BELOW
-	_close: function( startMenu ) {
-		if ( !startMenu ) {
-			startMenu = this.active ? this.active.parent() : this.element;
-		}
-
-		startMenu.find( ".ui-menu" )
-			.hide()
-			.attr( "aria-hidden", "true" )
-			.attr( "aria-expanded", "false" );
-	},
-
-	_closeOnDocumentClick: function( event ) {
-		return !$( event.target ).closest( ".ui-menu" ).length;
-	},
-
-	_isDivider: function( item ) {
-
-		// Match hyphen, em dash, en dash
-		return !/[^\-\u2014\u2013\s]/.test( item.text() );
-	},
-
-	collapse: function( event ) {
-		var newItem = this.active &&
-			this.active.parent().closest( ".ui-menu-item", this.element );
-		if ( newItem && newItem.length ) {
-			this._close();
-			this.focus( event, newItem );
-		}
-	},
-
-	expand: function( event ) {
-		var newItem = this.active &&
-			this.active
-				.children( ".ui-menu " )
-					.find( this.options.items )
-						.first();
-
-		if ( newItem && newItem.length ) {
-			this._open( newItem.parent() );
-
-			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
-			this._delay( function() {
-				this.focus( event, newItem );
-			} );
-		}
-	},
-
-	next: function( event ) {
-		this._move( "next", "first", event );
-	},
-
-	previous: function( event ) {
-		this._move( "prev", "last", event );
-	},
-
-	isFirstItem: function() {
-		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
-	},
-
-	isLastItem: function() {
-		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
-	},
-
-	_move: function( direction, filter, event ) {
-		var next;
-		if ( this.active ) {
-			if ( direction === "first" || direction === "last" ) {
-				next = this.active
-					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
-					.eq( -1 );
-			} else {
-				next = this.active
-					[ direction + "All" ]( ".ui-menu-item" )
-					.eq( 0 );
-			}
-		}
-		if ( !next || !next.length || !this.active ) {
-			next = this.activeMenu.find( this.options.items )[ filter ]();
-		}
-
-		this.focus( event, next );
-	},
-
-	nextPage: function( event ) {
-		var item, base, height;
-
-		if ( !this.active ) {
-			this.next( event );
-			return;
-		}
-		if ( this.isLastItem() ) {
-			return;
-		}
-		if ( this._hasScroll() ) {
-			base = this.active.offset().top;
-			height = this.element.height();
-			this.active.nextAll( ".ui-menu-item" ).each( function() {
-				item = $( this );
-				return item.offset().top - base - height < 0;
-			} );
-
-			this.focus( event, item );
-		} else {
-			this.focus( event, this.activeMenu.find( this.options.items )
-				[ !this.active ? "first" : "last" ]() );
-		}
-	},
-
-	previousPage: function( event ) {
-		var item, base, height;
-		if ( !this.active ) {
-			this.next( event );
-			return;
-		}
-		if ( this.isFirstItem() ) {
-			return;
-		}
-		if ( this._hasScroll() ) {
-			base = this.active.offset().top;
-			height = this.element.height();
-			this.active.prevAll( ".ui-menu-item" ).each( function() {
-				item = $( this );
-				return item.offset().top - base + height > 0;
-			} );
-
-			this.focus( event, item );
-		} else {
-			this.focus( event, this.activeMenu.find( this.options.items ).first() );
-		}
-	},
-
-	_hasScroll: function() {
-		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
-	},
-
-	select: function( event ) {
-
-		// TODO: It should never be possible to not have an active item at this
-		// point, but the tests don't trigger mouseenter before click.
-		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
-		var ui = { item: this.active };
-		if ( !this.active.has( ".ui-menu" ).length ) {
-			this.collapseAll( event, true );
-		}
-		this._trigger( "select", event, ui );
-	},
-
-	_filterMenuItems: function( character ) {
-		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
-			regex = new RegExp( "^" + escapedCharacter, "i" );
-
-		return this.activeMenu
-			.find( this.options.items )
-
-				// Only match on items, not dividers or other content (#10571)
-				.filter( ".ui-menu-item" )
-					.filter( function() {
-						return regex.test(
-							$.trim( $( this ).children( ".ui-menu-item-wrapper" ).text() ) );
-					} );
-	}
-} );
-
-
-/*!
- * jQuery UI Autocomplete 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Autocomplete
-//>>group: Widgets
-//>>description: Lists suggested words as the user is typing.
-//>>docs: http://api.jqueryui.com/autocomplete/
-//>>demos: http://jqueryui.com/autocomplete/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/autocomplete.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.autocomplete", {
-	version: "1.12.1",
-	defaultElement: "<input>",
-	options: {
-		appendTo: null,
-		autoFocus: false,
-		delay: 300,
-		minLength: 1,
-		position: {
-			my: "left top",
-			at: "left bottom",
-			collision: "none"
-		},
-		source: null,
-
-		// Callbacks
-		change: null,
-		close: null,
-		focus: null,
-		open: null,
-		response: null,
-		search: null,
-		select: null
-	},
-
-	requestIndex: 0,
-	pending: 0,
-
-	_create: function() {
-
-		// Some browsers only repeat keydown events, not keypress events,
-		// so we use the suppressKeyPress flag to determine if we've already
-		// handled the keydown event. #7269
-		// Unfortunately the code for & in keypress is the same as the up arrow,
-		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
-		// events when we know the keydown event was used to modify the
-		// search term. #7799
-		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
-			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
-			isTextarea = nodeName === "textarea",
-			isInput = nodeName === "input";
-
-		// Textareas are always multi-line
-		// Inputs are always single-line, even if inside a contentEditable element
-		// IE also treats inputs as contentEditable
-		// All other element types are determined by whether or not they're contentEditable
-		this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
-
-		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
-		this.isNewMenu = true;
-
-		this._addClass( "ui-autocomplete-input" );
-		this.element.attr( "autocomplete", "off" );
-
-		this._on( this.element, {
-			keydown: function( event ) {
-				if ( this.element.prop( "readOnly" ) ) {
-					suppressKeyPress = true;
-					suppressInput = true;
-					suppressKeyPressRepeat = true;
-					return;
-				}
-
-				suppressKeyPress = false;
-				suppressInput = false;
-				suppressKeyPressRepeat = false;
-				var keyCode = $.ui.keyCode;
-				switch ( event.keyCode ) {
-				case keyCode.PAGE_UP:
-					suppressKeyPress = true;
-					this._move( "previousPage", event );
-					break;
-				case keyCode.PAGE_DOWN:
-					suppressKeyPress = true;
-					this._move( "nextPage", event );
-					break;
-				case keyCode.UP:
-					suppressKeyPress = true;
-					this._keyEvent( "previous", event );
-					break;
-				case keyCode.DOWN:
-					suppressKeyPress = true;
-					this._keyEvent( "next", event );
-					break;
-				case keyCode.ENTER:
-
-					// when menu is open and has focus
-					if ( this.menu.active ) {
-
-						// #6055 - Opera still allows the keypress to occur
-						// which causes forms to submit
-						suppressKeyPress = true;
-						event.preventDefault();
-						this.menu.select( event );
-					}
-					break;
-				case keyCode.TAB:
-					if ( this.menu.active ) {
-						this.menu.select( event );
-					}
-					break;
-				case keyCode.ESCAPE:
-					if ( this.menu.element.is( ":visible" ) ) {
-						if ( !this.isMultiLine ) {
-							this._value( this.term );
-						}
-						this.close( event );
-
-						// Different browsers have different default behavior for escape
-						// Single press can mean undo or clear
-						// Double press in IE means clear the whole form
-						event.preventDefault();
-					}
-					break;
-				default:
-					suppressKeyPressRepeat = true;
-
-					// search timeout should be triggered before the input value is changed
-					this._searchTimeout( event );
-					break;
-				}
-			},
-			keypress: function( event ) {
-				if ( suppressKeyPress ) {
-					suppressKeyPress = false;
-					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
-						event.preventDefault();
-					}
-					return;
-				}
-				if ( suppressKeyPressRepeat ) {
-					return;
-				}
-
-				// Replicate some key handlers to allow them to repeat in Firefox and Opera
-				var keyCode = $.ui.keyCode;
-				switch ( event.keyCode ) {
-				case keyCode.PAGE_UP:
-					this._move( "previousPage", event );
-					break;
-				case keyCode.PAGE_DOWN:
-					this._move( "nextPage", event );
-					break;
-				case keyCode.UP:
-					this._keyEvent( "previous", event );
-					break;
-				case keyCode.DOWN:
-					this._keyEvent( "next", event );
-					break;
-				}
-			},
-			input: function( event ) {
-				if ( suppressInput ) {
-					suppressInput = false;
-					event.preventDefault();
-					return;
-				}
-				this._searchTimeout( event );
-			},
-			focus: function() {
-				this.selectedItem = null;
-				this.previous = this._value();
-			},
-			blur: function( event ) {
-				if ( this.cancelBlur ) {
-					delete this.cancelBlur;
-					return;
-				}
-
-				clearTimeout( this.searching );
-				this.close( event );
-				this._change( event );
-			}
-		} );
-
-		this._initSource();
-		this.menu = $( "<ul>" )
-			.appendTo( this._appendTo() )
-			.menu( {
-
-				// disable ARIA support, the live region takes care of that
-				role: null
-			} )
-			.hide()
-			.menu( "instance" );
-
-		this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
-		this._on( this.menu.element, {
-			mousedown: function( event ) {
-
-				// prevent moving focus out of the text field
-				event.preventDefault();
-
-				// IE doesn't prevent moving focus even with event.preventDefault()
-				// so we set a flag to know when we should ignore the blur event
-				this.cancelBlur = true;
-				this._delay( function() {
-					delete this.cancelBlur;
-
-					// Support: IE 8 only
-					// Right clicking a menu item or selecting text from the menu items will
-					// result in focus moving out of the input. However, we've already received
-					// and ignored the blur event because of the cancelBlur flag set above. So
-					// we restore focus to ensure that the menu closes properly based on the user's
-					// next actions.
-					if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
-						this.element.trigger( "focus" );
-					}
-				} );
-			},
-			menufocus: function( event, ui ) {
-				var label, item;
-
-				// support: Firefox
-				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
-				if ( this.isNewMenu ) {
-					this.isNewMenu = false;
-					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
-						this.menu.blur();
-
-						this.document.one( "mousemove", function() {
-							$( event.target ).trigger( event.originalEvent );
-						} );
-
-						return;
-					}
-				}
-
-				item = ui.item.data( "ui-autocomplete-item" );
-				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
-
-					// use value to match what will end up in the input, if it was a key event
-					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
-						this._value( item.value );
-					}
-				}
-
-				// Announce the value in the liveRegion
-				label = ui.item.attr( "aria-label" ) || item.value;
-				if ( label && $.trim( label ).length ) {
-					this.liveRegion.children().hide();
-					$( "<div>" ).text( label ).appendTo( this.liveRegion );
-				}
-			},
-			menuselect: function( event, ui ) {
-				var item = ui.item.data( "ui-autocomplete-item" ),
-					previous = this.previous;
-
-				// Only trigger when focus was lost (click on menu)
-				if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
-					this.element.trigger( "focus" );
-					this.previous = previous;
-
-					// #6109 - IE triggers two focus events and the second
-					// is asynchronous, so we need to reset the previous
-					// term synchronously and asynchronously :-(
-					this._delay( function() {
-						this.previous = previous;
-						this.selectedItem = item;
-					} );
-				}
-
-				if ( false !== this._trigger( "select", event, { item: item } ) ) {
-					this._value( item.value );
-				}
-
-				// reset the term after the select event
-				// this allows custom select handling to work properly
-				this.term = this._value();
-
-				this.close( event );
-				this.selectedItem = item;
-			}
-		} );
-
-		this.liveRegion = $( "<div>", {
-			role: "status",
-			"aria-live": "assertive",
-			"aria-relevant": "additions"
-		} )
-			.appendTo( this.document[ 0 ].body );
-
-		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
-
-		// Turning off autocomplete prevents the browser from remembering the
-		// value when navigating through history, so we re-enable autocomplete
-		// if the page is unloaded before the widget is destroyed. #7790
-		this._on( this.window, {
-			beforeunload: function() {
-				this.element.removeAttr( "autocomplete" );
-			}
-		} );
-	},
-
-	_destroy: function() {
-		clearTimeout( this.searching );
-		this.element.removeAttr( "autocomplete" );
-		this.menu.element.remove();
-		this.liveRegion.remove();
-	},
-
-	_setOption: function( key, value ) {
-		this._super( key, value );
-		if ( key === "source" ) {
-			this._initSource();
-		}
-		if ( key === "appendTo" ) {
-			this.menu.element.appendTo( this._appendTo() );
-		}
-		if ( key === "disabled" && value && this.xhr ) {
-			this.xhr.abort();
-		}
-	},
-
-	_isEventTargetInWidget: function( event ) {
-		var menuElement = this.menu.element[ 0 ];
-
-		return event.target === this.element[ 0 ] ||
-			event.target === menuElement ||
-			$.contains( menuElement, event.target );
-	},
-
-	_closeOnClickOutside: function( event ) {
-		if ( !this._isEventTargetInWidget( event ) ) {
-			this.close();
-		}
-	},
-
-	_appendTo: function() {
-		var element = this.options.appendTo;
-
-		if ( element ) {
-			element = element.jquery || element.nodeType ?
-				$( element ) :
-				this.document.find( element ).eq( 0 );
-		}
-
-		if ( !element || !element[ 0 ] ) {
-			element = this.element.closest( ".ui-front, dialog" );
-		}
-
-		if ( !element.length ) {
-			element = this.document[ 0 ].body;
-		}
-
-		return element;
-	},
-
-	_initSource: function() {
-		var array, url,
-			that = this;
-		if ( $.isArray( this.options.source ) ) {
-			array = this.options.source;
-			this.source = function( request, response ) {
-				response( $.ui.autocomplete.filter( array, request.term ) );
-			};
-		} else if ( typeof this.options.source === "string" ) {
-			url = this.options.source;
-			this.source = function( request, response ) {
-				if ( that.xhr ) {
-					that.xhr.abort();
-				}
-				that.xhr = $.ajax( {
-					url: url,
-					data: request,
-					dataType: "json",
-					success: function( data ) {
-						response( data );
-					},
-					error: function() {
-						response( [] );
-					}
-				} );
-			};
-		} else {
-			this.source = this.options.source;
-		}
-	},
-
-	_searchTimeout: function( event ) {
-		clearTimeout( this.searching );
-		this.searching = this._delay( function() {
-
-			// Search if the value has changed, or if the user retypes the same value (see #7434)
-			var equalValues = this.term === this._value(),
-				menuVisible = this.menu.element.is( ":visible" ),
-				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
-
-			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
-				this.selectedItem = null;
-				this.search( null, event );
-			}
-		}, this.options.delay );
-	},
-
-	search: function( value, event ) {
-		value = value != null ? value : this._value();
-
-		// Always save the actual value, not the one passed as an argument
-		this.term = this._value();
-
-		if ( value.length < this.options.minLength ) {
-			return this.close( event );
-		}
-
-		if ( this._trigger( "search", event ) === false ) {
-			return;
-		}
-
-		return this._search( value );
-	},
-
-	_search: function( value ) {
-		this.pending++;
-		this._addClass( "ui-autocomplete-loading" );
-		this.cancelSearch = false;
-
-		this.source( { term: value }, this._response() );
-	},
-
-	_response: function() {
-		var index = ++this.requestIndex;
-
-		return $.proxy( function( content ) {
-			if ( index === this.requestIndex ) {
-				this.__response( content );
-			}
-
-			this.pending--;
-			if ( !this.pending ) {
-				this._removeClass( "ui-autocomplete-loading" );
-			}
-		}, this );
-	},
-
-	__response: function( content ) {
-		if ( content ) {
-			content = this._normalize( content );
-		}
-		this._trigger( "response", null, { content: content } );
-		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
-			this._suggest( content );
-			this._trigger( "open" );
-		} else {
-
-			// use ._close() instead of .close() so we don't cancel future searches
-			this._close();
-		}
-	},
-
-	close: function( event ) {
-		this.cancelSearch = true;
-		this._close( event );
-	},
-
-	_close: function( event ) {
-
-		// Remove the handler that closes the menu on outside clicks
-		this._off( this.document, "mousedown" );
-
-		if ( this.menu.element.is( ":visible" ) ) {
-			this.menu.element.hide();
-			this.menu.blur();
-			this.isNewMenu = true;
-			this._trigger( "close", event );
-		}
-	},
-
-	_change: function( event ) {
-		if ( this.previous !== this._value() ) {
-			this._trigger( "change", event, { item: this.selectedItem } );
-		}
-	},
-
-	_normalize: function( items ) {
-
-		// assume all items have the right format when the first item is complete
-		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
-			return items;
-		}
-		return $.map( items, function( item ) {
-			if ( typeof item === "string" ) {
-				return {
-					label: item,
-					value: item
-				};
-			}
-			return $.extend( {}, item, {
-				label: item.label || item.value,
-				value: item.value || item.label
-			} );
-		} );
-	},
-
-	_suggest: function( items ) {
-		var ul = this.menu.element.empty();
-		this._renderMenu( ul, items );
-		this.isNewMenu = true;
-		this.menu.refresh();
-
-		// Size and position menu
-		ul.show();
-		this._resizeMenu();
-		ul.position( $.extend( {
-			of: this.element
-		}, this.options.position ) );
-
-		if ( this.options.autoFocus ) {
-			this.menu.next();
-		}
-
-		// Listen for interactions outside of the widget (#6642)
-		this._on( this.document, {
-			mousedown: "_closeOnClickOutside"
-		} );
-	},
-
-	_resizeMenu: function() {
-		var ul = this.menu.element;
-		ul.outerWidth( Math.max(
-
-			// Firefox wraps long text (possibly a rounding bug)
-			// so we add 1px to avoid the wrapping (#7513)
-			ul.width( "" ).outerWidth() + 1,
-			this.element.outerWidth()
-		) );
-	},
-
-	_renderMenu: function( ul, items ) {
-		var that = this;
-		$.each( items, function( index, item ) {
-			that._renderItemData( ul, item );
-		} );
-	},
-
-	_renderItemData: function( ul, item ) {
-		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
-	},
-
-	_renderItem: function( ul, item ) {
-		return $( "<li>" )
-			.append( $( "<div>" ).text( item.label ) )
-			.appendTo( ul );
-	},
-
-	_move: function( direction, event ) {
-		if ( !this.menu.element.is( ":visible" ) ) {
-			this.search( null, event );
-			return;
-		}
-		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
-				this.menu.isLastItem() && /^next/.test( direction ) ) {
-
-			if ( !this.isMultiLine ) {
-				this._value( this.term );
-			}
-
-			this.menu.blur();
-			return;
-		}
-		this.menu[ direction ]( event );
-	},
-
-	widget: function() {
-		return this.menu.element;
-	},
-
-	_value: function() {
-		return this.valueMethod.apply( this.element, arguments );
-	},
-
-	_keyEvent: function( keyEvent, event ) {
-		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
-			this._move( keyEvent, event );
-
-			// Prevents moving cursor to beginning/end of the text field in some browsers
-			event.preventDefault();
-		}
-	},
-
-	// Support: Chrome <=50
-	// We should be able to just use this.element.prop( "isContentEditable" )
-	// but hidden elements always report false in Chrome.
-	// https://code.google.com/p/chromium/issues/detail?id=313082
-	_isContentEditable: function( element ) {
-		if ( !element.length ) {
-			return false;
-		}
-
-		var editable = element.prop( "contentEditable" );
-
-		if ( editable === "inherit" ) {
-		  return this._isContentEditable( element.parent() );
-		}
-
-		return editable === "true";
-	}
-} );
-
-$.extend( $.ui.autocomplete, {
-	escapeRegex: function( value ) {
-		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
-	},
-	filter: function( array, term ) {
-		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
-		return $.grep( array, function( value ) {
-			return matcher.test( value.label || value.value || value );
-		} );
-	}
-} );
-
-// Live region extension, adding a `messages` option
-// NOTE: This is an experimental API. We are still investigating
-// a full solution for string manipulation and internationalization.
-$.widget( "ui.autocomplete", $.ui.autocomplete, {
-	options: {
-		messages: {
-			noResults: "No search results.",
-			results: function( amount ) {
-				return amount + ( amount > 1 ? " results are" : " result is" ) +
-					" available, use up and down arrow keys to navigate.";
-			}
-		}
-	},
-
-	__response: function( content ) {
-		var message;
-		this._superApply( arguments );
-		if ( this.options.disabled || this.cancelSearch ) {
-			return;
-		}
-		if ( content && content.length ) {
-			message = this.options.messages.results( content.length );
-		} else {
-			message = this.options.messages.noResults;
-		}
-		this.liveRegion.children().hide();
-		$( "<div>" ).text( message ).appendTo( this.liveRegion );
-	}
-} );
-
-var widgetsAutocomplete = $.ui.autocomplete;
-
-
-/*!
- * jQuery UI Controlgroup 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Controlgroup
-//>>group: Widgets
-//>>description: Visually groups form control widgets
-//>>docs: http://api.jqueryui.com/controlgroup/
-//>>demos: http://jqueryui.com/controlgroup/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/controlgroup.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
-
-var widgetsControlgroup = $.widget( "ui.controlgroup", {
-	version: "1.12.1",
-	defaultElement: "<div>",
-	options: {
-		direction: "horizontal",
-		disabled: null,
-		onlyVisible: true,
-		items: {
-			"button": "input[type=button], input[type=submit], input[type=reset], button, a",
-			"controlgroupLabel": ".ui-controlgroup-label",
-			"checkboxradio": "input[type='checkbox'], input[type='radio']",
-			"selectmenu": "select",
-			"spinner": ".ui-spinner-input"
-		}
-	},
-
-	_create: function() {
-		this._enhance();
-	},
-
-	// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
-	_enhance: function() {
-		this.element.attr( "role", "toolbar" );
-		this.refresh();
-	},
-
-	_destroy: function() {
-		this._callChildMethod( "destroy" );
-		this.childWidgets.removeData( "ui-controlgroup-data" );
-		this.element.removeAttr( "role" );
-		if ( this.options.items.controlgroupLabel ) {
-			this.element
-				.find( this.options.items.controlgroupLabel )
-				.find( ".ui-controlgroup-label-contents" )
-				.contents().unwrap();
-		}
-	},
-
-	_initWidgets: function() {
-		var that = this,
-			childWidgets = [];
-
-		// First we iterate over each of the items options
-		$.each( this.options.items, function( widget, selector ) {
-			var labels;
-			var options = {};
-
-			// Make sure the widget has a selector set
-			if ( !selector ) {
-				return;
-			}
-
-			if ( widget === "controlgroupLabel" ) {
-				labels = that.element.find( selector );
-				labels.each( function() {
-					var element = $( this );
-
-					if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
-						return;
-					}
-					element.contents()
-						.wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
-				} );
-				that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
-				childWidgets = childWidgets.concat( labels.get() );
-				return;
-			}
-
-			// Make sure the widget actually exists
-			if ( !$.fn[ widget ] ) {
-				return;
-			}
-
-			// We assume everything is in the middle to start because we can't determine
-			// first / last elements until all enhancments are done.
-			if ( that[ "_" + widget + "Options" ] ) {
-				options = that[ "_" + widget + "Options" ]( "middle" );
-			} else {
-				options = { classes: {} };
-			}
-
-			// Find instances of this widget inside controlgroup and init them
-			that.element
-				.find( selector )
-				.each( function() {
-					var element = $( this );
-					var instance = element[ widget ]( "instance" );
-
-					// We need to clone the default options for this type of widget to avoid
-					// polluting the variable options which has a wider scope than a single widget.
-					var instanceOptions = $.widget.extend( {}, options );
-
-					// If the button is the child of a spinner ignore it
-					// TODO: Find a more generic solution
-					if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
-						return;
-					}
-
-					// Create the widget if it doesn't exist
-					if ( !instance ) {
-						instance = element[ widget ]()[ widget ]( "instance" );
-					}
-					if ( instance ) {
-						instanceOptions.classes =
-							that._resolveClassesValues( instanceOptions.classes, instance );
-					}
-					element[ widget ]( instanceOptions );
-
-					// Store an instance of the controlgroup to be able to reference
-					// from the outermost element for changing options and refresh
-					var widgetElement = element[ widget ]( "widget" );
-					$.data( widgetElement[ 0 ], "ui-controlgroup-data",
-						instance ? instance : element[ widget ]( "instance" ) );
-
-					childWidgets.push( widgetElement[ 0 ] );
-				} );
-		} );
-
-		this.childWidgets = $( $.unique( childWidgets ) );
-		this._addClass( this.childWidgets, "ui-controlgroup-item" );
-	},
-
-	_callChildMethod: function( method ) {
-		this.childWidgets.each( function() {
-			var element = $( this ),
-				data = element.data( "ui-controlgroup-data" );
-			if ( data && data[ method ] ) {
-				data[ method ]();
-			}
-		} );
-	},
-
-	_updateCornerClass: function( element, position ) {
-		var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
-		var add = this._buildSimpleOptions( position, "label" ).classes.label;
-
-		this._removeClass( element, null, remove );
-		this._addClass( element, null, add );
-	},
-
-	_buildSimpleOptions: function( position, key ) {
-		var direction = this.options.direction === "vertical";
-		var result = {
-			classes: {}
-		};
-		result.classes[ key ] = {
-			"middle": "",
-			"first": "ui-corner-" + ( direction ? "top" : "left" ),
-			"last": "ui-corner-" + ( direction ? "bottom" : "right" ),
-			"only": "ui-corner-all"
-		}[ position ];
-
-		return result;
-	},
-
-	_spinnerOptions: function( position ) {
-		var options = this._buildSimpleOptions( position, "ui-spinner" );
-
-		options.classes[ "ui-spinner-up" ] = "";
-		options.classes[ "ui-spinner-down" ] = "";
-
-		return options;
-	},
-
-	_buttonOptions: function( position ) {
-		return this._buildSimpleOptions( position, "ui-button" );
-	},
-
-	_checkboxradioOptions: function( position ) {
-		return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
-	},
-
-	_selectmenuOptions: function( position ) {
-		var direction = this.options.direction === "vertical";
-		return {
-			width: direction ? "auto" : false,
-			classes: {
-				middle: {
-					"ui-selectmenu-button-open": "",
-					"ui-selectmenu-button-closed": ""
-				},
-				first: {
-					"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
-					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
-				},
-				last: {
-					"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
-					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
-				},
-				only: {
-					"ui-selectmenu-button-open": "ui-corner-top",
-					"ui-selectmenu-button-closed": "ui-corner-all"
-				}
-
-			}[ position ]
-		};
-	},
-
-	_resolveClassesValues: function( classes, instance ) {
-		var result = {};
-		$.each( classes, function( key ) {
-			var current = instance.options.classes[ key ] || "";
-			current = $.trim( current.replace( controlgroupCornerRegex, "" ) );
-			result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
-		} );
-		return result;
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "direction" ) {
-			this._removeClass( "ui-controlgroup-" + this.options.direction );
-		}
-
-		this._super( key, value );
-		if ( key === "disabled" ) {
-			this._callChildMethod( value ? "disable" : "enable" );
-			return;
-		}
-
-		this.refresh();
-	},
-
-	refresh: function() {
-		var children,
-			that = this;
-
-		this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
-
-		if ( this.options.direction === "horizontal" ) {
-			this._addClass( null, "ui-helper-clearfix" );
-		}
-		this._initWidgets();
-
-		children = this.childWidgets;
-
-		// We filter here because we need to track all childWidgets not just the visible ones
-		if ( this.options.onlyVisible ) {
-			children = children.filter( ":visible" );
-		}
-
-		if ( children.length ) {
-
-			// We do this last because we need to make sure all enhancment is done
-			// before determining first and last
-			$.each( [ "first", "last" ], function( index, value ) {
-				var instance = children[ value ]().data( "ui-controlgroup-data" );
-
-				if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
-					var options = that[ "_" + instance.widgetName + "Options" ](
-						children.length === 1 ? "only" : value
-					);
-					options.classes = that._resolveClassesValues( options.classes, instance );
-					instance.element[ instance.widgetName ]( options );
-				} else {
-					that._updateCornerClass( children[ value ](), value );
-				}
-			} );
-
-			// Finally call the refresh method on each of the child widgets.
-			this._callChildMethod( "refresh" );
-		}
-	}
-} );
-
-/*!
- * jQuery UI Checkboxradio 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Checkboxradio
-//>>group: Widgets
-//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
-//>>docs: http://api.jqueryui.com/checkboxradio/
-//>>demos: http://jqueryui.com/checkboxradio/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/button.css
-//>>css.structure: ../../themes/base/checkboxradio.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
-	version: "1.12.1",
-	options: {
-		disabled: null,
-		label: null,
-		icon: true,
-		classes: {
-			"ui-checkboxradio-label": "ui-corner-all",
-			"ui-checkboxradio-icon": "ui-corner-all"
-		}
-	},
-
-	_getCreateOptions: function() {
-		var disabled, labels;
-		var that = this;
-		var options = this._super() || {};
-
-		// We read the type here, because it makes more sense to throw a element type error first,
-		// rather then the error for lack of a label. Often if its the wrong type, it
-		// won't have a label (e.g. calling on a div, btn, etc)
-		this._readType();
-
-		labels = this.element.labels();
-
-		// If there are multiple labels, use the last one
-		this.label = $( labels[ labels.length - 1 ] );
-		if ( !this.label.length ) {
-			$.error( "No label found for checkboxradio widget" );
-		}
-
-		this.originalLabel = "";
-
-		// We need to get the label text but this may also need to make sure it does not contain the
-		// input itself.
-		this.label.contents().not( this.element[ 0 ] ).each( function() {
-
-			// The label contents could be text, html, or a mix. We concat each element to get a
-			// string representation of the label, without the input as part of it.
-			that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
-		} );
-
-		// Set the label option if we found label text
-		if ( this.originalLabel ) {
-			options.label = this.originalLabel;
-		}
-
-		disabled = this.element[ 0 ].disabled;
-		if ( disabled != null ) {
-			options.disabled = disabled;
-		}
-		return options;
-	},
-
-	_create: function() {
-		var checked = this.element[ 0 ].checked;
-
-		this._bindFormResetHandler();
-
-		if ( this.options.disabled == null ) {
-			this.options.disabled = this.element[ 0 ].disabled;
-		}
-
-		this._setOption( "disabled", this.options.disabled );
-		this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
-		this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
-
-		if ( this.type === "radio" ) {
-			this._addClass( this.label, "ui-checkboxradio-radio-label" );
-		}
-
-		if ( this.options.label && this.options.label !== this.originalLabel ) {
-			this._updateLabel();
-		} else if ( this.originalLabel ) {
-			this.options.label = this.originalLabel;
-		}
-
-		this._enhance();
-
-		if ( checked ) {
-			this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
-			if ( this.icon ) {
-				this._addClass( this.icon, null, "ui-state-hover" );
-			}
-		}
-
-		this._on( {
-			change: "_toggleClasses",
-			focus: function() {
-				this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
-			},
-			blur: function() {
-				this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
-			}
-		} );
-	},
-
-	_readType: function() {
-		var nodeName = this.element[ 0 ].nodeName.toLowerCase();
-		this.type = this.element[ 0 ].type;
-		if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
-			$.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
-				" and element.type=" + this.type );
-		}
-	},
-
-	// Support jQuery Mobile enhanced option
-	_enhance: function() {
-		this._updateIcon( this.element[ 0 ].checked );
-	},
-
-	widget: function() {
-		return this.label;
-	},
-
-	_getRadioGroup: function() {
-		var group;
-		var name = this.element[ 0 ].name;
-		var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";
-
-		if ( !name ) {
-			return $( [] );
-		}
-
-		if ( this.form.length ) {
-			group = $( this.form[ 0 ].elements ).filter( nameSelector );
-		} else {
-
-			// Not inside a form, check all inputs that also are not inside a form
-			group = $( nameSelector ).filter( function() {
-				return $( this ).form().length === 0;
-			} );
-		}
-
-		return group.not( this.element );
-	},
-
-	_toggleClasses: function() {
-		var checked = this.element[ 0 ].checked;
-		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
-
-		if ( this.options.icon && this.type === "checkbox" ) {
-			this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
-				._toggleClass( this.icon, null, "ui-icon-blank", !checked );
-		}
-
-		if ( this.type === "radio" ) {
-			this._getRadioGroup()
-				.each( function() {
-					var instance = $( this ).checkboxradio( "instance" );
-
-					if ( instance ) {
-						instance._removeClass( instance.label,
-							"ui-checkboxradio-checked", "ui-state-active" );
-					}
-				} );
-		}
-	},
-
-	_destroy: function() {
-		this._unbindFormResetHandler();
-
-		if ( this.icon ) {
-			this.icon.remove();
-			this.iconSpace.remove();
-		}
-	},
-
-	_setOption: function( key, value ) {
-
-		// We don't allow the value to be set to nothing
-		if ( key === "label" && !value ) {
-			return;
-		}
-
-		this._super( key, value );
-
-		if ( key === "disabled" ) {
-			this._toggleClass( this.label, null, "ui-state-disabled", value );
-			this.element[ 0 ].disabled = value;
-
-			// Don't refresh when setting disabled
-			return;
-		}
-		this.refresh();
-	},
-
-	_updateIcon: function( checked ) {
-		var toAdd = "ui-icon ui-icon-background ";
-
-		if ( this.options.icon ) {
-			if ( !this.icon ) {
-				this.icon = $( "<span>" );
-				this.iconSpace = $( "<span> </span>" );
-				this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
-			}
-
-			if ( this.type === "checkbox" ) {
-				toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
-				this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
-			} else {
-				toAdd += "ui-icon-blank";
-			}
-			this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
-			if ( !checked ) {
-				this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
-			}
-			this.icon.prependTo( this.label ).after( this.iconSpace );
-		} else if ( this.icon !== undefined ) {
-			this.icon.remove();
-			this.iconSpace.remove();
-			delete this.icon;
-		}
-	},
-
-	_updateLabel: function() {
-
-		// Remove the contents of the label ( minus the icon, icon space, and input )
-		var contents = this.label.contents().not( this.element[ 0 ] );
-		if ( this.icon ) {
-			contents = contents.not( this.icon[ 0 ] );
-		}
-		if ( this.iconSpace ) {
-			contents = contents.not( this.iconSpace[ 0 ] );
-		}
-		contents.remove();
-
-		this.label.append( this.options.label );
-	},
-
-	refresh: function() {
-		var checked = this.element[ 0 ].checked,
-			isDisabled = this.element[ 0 ].disabled;
-
-		this._updateIcon( checked );
-		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
-		if ( this.options.label !== null ) {
-			this._updateLabel();
-		}
-
-		if ( isDisabled !== this.options.disabled ) {
-			this._setOptions( { "disabled": isDisabled } );
-		}
-	}
-
-} ] );
-
-var widgetsCheckboxradio = $.ui.checkboxradio;
-
-
-/*!
- * jQuery UI Button 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Button
-//>>group: Widgets
-//>>description: Enhances a form with themeable buttons.
-//>>docs: http://api.jqueryui.com/button/
-//>>demos: http://jqueryui.com/button/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/button.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.button", {
-	version: "1.12.1",
-	defaultElement: "<button>",
-	options: {
-		classes: {
-			"ui-button": "ui-corner-all"
-		},
-		disabled: null,
-		icon: null,
-		iconPosition: "beginning",
-		label: null,
-		showLabel: true
-	},
-
-	_getCreateOptions: function() {
-		var disabled,
-
-			// This is to support cases like in jQuery Mobile where the base widget does have
-			// an implementation of _getCreateOptions
-			options = this._super() || {};
-
-		this.isInput = this.element.is( "input" );
-
-		disabled = this.element[ 0 ].disabled;
-		if ( disabled != null ) {
-			options.disabled = disabled;
-		}
-
-		this.originalLabel = this.isInput ? this.element.val() : this.element.html();
-		if ( this.originalLabel ) {
-			options.label = this.originalLabel;
-		}
-
-		return options;
-	},
-
-	_create: function() {
-		if ( !this.option.showLabel & !this.options.icon ) {
-			this.options.showLabel = true;
-		}
-
-		// We have to check the option again here even though we did in _getCreateOptions,
-		// because null may have been passed on init which would override what was set in
-		// _getCreateOptions
-		if ( this.options.disabled == null ) {
-			this.options.disabled = this.element[ 0 ].disabled || false;
-		}
-
-		this.hasTitle = !!this.element.attr( "title" );
-
-		// Check to see if the label needs to be set or if its already correct
-		if ( this.options.label && this.options.label !== this.originalLabel ) {
-			if ( this.isInput ) {
-				this.element.val( this.options.label );
-			} else {
-				this.element.html( this.options.label );
-			}
-		}
-		this._addClass( "ui-button", "ui-widget" );
-		this._setOption( "disabled", this.options.disabled );
-		this._enhance();
-
-		if ( this.element.is( "a" ) ) {
-			this._on( {
-				"keyup": function( event ) {
-					if ( event.keyCode === $.ui.keyCode.SPACE ) {
-						event.preventDefault();
-
-						// Support: PhantomJS <= 1.9, IE 8 Only
-						// If a native click is available use it so we actually cause navigation
-						// otherwise just trigger a click event
-						if ( this.element[ 0 ].click ) {
-							this.element[ 0 ].click();
-						} else {
-							this.element.trigger( "click" );
-						}
-					}
-				}
-			} );
-		}
-	},
-
-	_enhance: function() {
-		if ( !this.element.is( "button" ) ) {
-			this.element.attr( "role", "button" );
-		}
-
-		if ( this.options.icon ) {
-			this._updateIcon( "icon", this.options.icon );
-			this._updateTooltip();
-		}
-	},
-
-	_updateTooltip: function() {
-		this.title = this.element.attr( "title" );
-
-		if ( !this.options.showLabel && !this.title ) {
-			this.element.attr( "title", this.options.label );
-		}
-	},
-
-	_updateIcon: function( option, value ) {
-		var icon = option !== "iconPosition",
-			position = icon ? this.options.iconPosition : value,
-			displayBlock = position === "top" || position === "bottom";
-
-		// Create icon
-		if ( !this.icon ) {
-			this.icon = $( "<span>" );
-
-			this._addClass( this.icon, "ui-button-icon", "ui-icon" );
-
-			if ( !this.options.showLabel ) {
-				this._addClass( "ui-button-icon-only" );
-			}
-		} else if ( icon ) {
-
-			// If we are updating the icon remove the old icon class
-			this._removeClass( this.icon, null, this.options.icon );
-		}
-
-		// If we are updating the icon add the new icon class
-		if ( icon ) {
-			this._addClass( this.icon, null, value );
-		}
-
-		this._attachIcon( position );
-
-		// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
-		// the iconSpace if there is one.
-		if ( displayBlock ) {
-			this._addClass( this.icon, null, "ui-widget-icon-block" );
-			if ( this.iconSpace ) {
-				this.iconSpace.remove();
-			}
-		} else {
-
-			// Position is beginning or end so remove the ui-widget-icon-block class and add the
-			// space if it does not exist
-			if ( !this.iconSpace ) {
-				this.iconSpace = $( "<span> </span>" );
-				this._addClass( this.iconSpace, "ui-button-icon-space" );
-			}
-			this._removeClass( this.icon, null, "ui-wiget-icon-block" );
-			this._attachIconSpace( position );
-		}
-	},
-
-	_destroy: function() {
-		this.element.removeAttr( "role" );
-
-		if ( this.icon ) {
-			this.icon.remove();
-		}
-		if ( this.iconSpace ) {
-			this.iconSpace.remove();
-		}
-		if ( !this.hasTitle ) {
-			this.element.removeAttr( "title" );
-		}
-	},
-
-	_attachIconSpace: function( iconPosition ) {
-		this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
-	},
-
-	_attachIcon: function( iconPosition ) {
-		this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
-	},
-
-	_setOptions: function( options ) {
-		var newShowLabel = options.showLabel === undefined ?
-				this.options.showLabel :
-				options.showLabel,
-			newIcon = options.icon === undefined ? this.options.icon : options.icon;
-
-		if ( !newShowLabel && !newIcon ) {
-			options.showLabel = true;
-		}
-		this._super( options );
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "icon" ) {
-			if ( value ) {
-				this._updateIcon( key, value );
-			} else if ( this.icon ) {
-				this.icon.remove();
-				if ( this.iconSpace ) {
-					this.iconSpace.remove();
-				}
-			}
-		}
-
-		if ( key === "iconPosition" ) {
-			this._updateIcon( key, value );
-		}
-
-		// Make sure we can't end up with a button that has neither text nor icon
-		if ( key === "showLabel" ) {
-				this._toggleClass( "ui-button-icon-only", null, !value );
-				this._updateTooltip();
-		}
-
-		if ( key === "label" ) {
-			if ( this.isInput ) {
-				this.element.val( value );
-			} else {
-
-				// If there is an icon, append it, else nothing then append the value
-				// this avoids removal of the icon when setting label text
-				this.element.html( value );
-				if ( this.icon ) {
-					this._attachIcon( this.options.iconPosition );
-					this._attachIconSpace( this.options.iconPosition );
-				}
-			}
-		}
-
-		this._super( key, value );
-
-		if ( key === "disabled" ) {
-			this._toggleClass( null, "ui-state-disabled", value );
-			this.element[ 0 ].disabled = value;
-			if ( value ) {
-				this.element.blur();
-			}
-		}
-	},
-
-	refresh: function() {
-
-		// Make sure to only check disabled if its an element that supports this otherwise
-		// check for the disabled class to determine state
-		var isDisabled = this.element.is( "input, button" ) ?
-			this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
-
-		if ( isDisabled !== this.options.disabled ) {
-			this._setOptions( { disabled: isDisabled } );
-		}
-
-		this._updateTooltip();
-	}
-} );
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-
-	// Text and Icons options
-	$.widget( "ui.button", $.ui.button, {
-		options: {
-			text: true,
-			icons: {
-				primary: null,
-				secondary: null
-			}
-		},
-
-		_create: function() {
-			if ( this.options.showLabel && !this.options.text ) {
-				this.options.showLabel = this.options.text;
-			}
-			if ( !this.options.showLabel && this.options.text ) {
-				this.options.text = this.options.showLabel;
-			}
-			if ( !this.options.icon && ( this.options.icons.primary ||
-					this.options.icons.secondary ) ) {
-				if ( this.options.icons.primary ) {
-					this.options.icon = this.options.icons.primary;
-				} else {
-					this.options.icon = this.options.icons.secondary;
-					this.options.iconPosition = "end";
-				}
-			} else if ( this.options.icon ) {
-				this.options.icons.primary = this.options.icon;
-			}
-			this._super();
-		},
-
-		_setOption: function( key, value ) {
-			if ( key === "text" ) {
-				this._super( "showLabel", value );
-				return;
-			}
-			if ( key === "showLabel" ) {
-				this.options.text = value;
-			}
-			if ( key === "icon" ) {
-				this.options.icons.primary = value;
-			}
-			if ( key === "icons" ) {
-				if ( value.primary ) {
-					this._super( "icon", value.primary );
-					this._super( "iconPosition", "beginning" );
-				} else if ( value.secondary ) {
-					this._super( "icon", value.secondary );
-					this._super( "iconPosition", "end" );
-				}
-			}
-			this._superApply( arguments );
-		}
-	} );
-
-	$.fn.button = ( function( orig ) {
-		return function() {
-			if ( !this.length || ( this.length && this[ 0 ].tagName !== "INPUT" ) ||
-					( this.length && this[ 0 ].tagName === "INPUT" && (
-						this.attr( "type" ) !== "checkbox" && this.attr( "type" ) !== "radio"
-					) ) ) {
-				return orig.apply( this, arguments );
-			}
-			if ( !$.ui.checkboxradio ) {
-				$.error( "Checkboxradio widget missing" );
-			}
-			if ( arguments.length === 0 ) {
-				return this.checkboxradio( {
-					"icon": false
-				} );
-			}
-			return this.checkboxradio.apply( this, arguments );
-		};
-	} )( $.fn.button );
-
-	$.fn.buttonset = function() {
-		if ( !$.ui.controlgroup ) {
-			$.error( "Controlgroup widget missing" );
-		}
-		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
-			return this.controlgroup.apply( this,
-				[ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
-		}
-		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
-			return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
-		}
-		if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
-			arguments[ 0 ].items = {
-				button: arguments[ 0 ].items
-			};
-		}
-		return this.controlgroup.apply( this, arguments );
-	};
-}
-
-var widgetsButton = $.ui.button;
-
-
-// jscs:disable maximumLineLength
-/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
-/*!
- * jQuery UI Datepicker 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Datepicker
-//>>group: Widgets
-//>>description: Displays a calendar from an input or inline for selecting dates.
-//>>docs: http://api.jqueryui.com/datepicker/
-//>>demos: http://jqueryui.com/datepicker/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/datepicker.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.extend( $.ui, { datepicker: { version: "1.12.1" } } );
-
-var datepicker_instActive;
-
-function datepicker_getZindex( elem ) {
-	var position, value;
-	while ( elem.length && elem[ 0 ] !== document ) {
-
-		// Ignore z-index if position is set to a value where z-index is ignored by the browser
-		// This makes behavior of this function consistent across browsers
-		// WebKit always returns auto if the element is positioned
-		position = elem.css( "position" );
-		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
-
-			// IE returns 0 when zIndex is not specified
-			// other browsers return a string
-			// we ignore the case of nested elements with an explicit value of 0
-			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
-			value = parseInt( elem.css( "zIndex" ), 10 );
-			if ( !isNaN( value ) && value !== 0 ) {
-				return value;
-			}
-		}
-		elem = elem.parent();
-	}
-
-	return 0;
-}
-/* Date picker manager.
-   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
-   Settings for (groups of) date pickers are maintained in an instance object,
-   allowing multiple different settings on the same page. */
-
-function Datepicker() {
-	this._curInst = null; // The current instance in use
-	this._keyEvent = false; // If the last event was a key event
-	this._disabledInputs = []; // List of date picker inputs that have been disabled
-	this._datepickerShowing = false; // True if the popup picker is showing , false if not
-	this._inDialog = false; // True if showing within a "dialog", false if not
-	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
-	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
-	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
-	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
-	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
-	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
-	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
-	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
-	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
-	this.regional = []; // Available regional settings, indexed by language code
-	this.regional[ "" ] = { // Default regional settings
-		closeText: "Done", // Display text for close link
-		prevText: "Prev", // Display text for previous month link
-		nextText: "Next", // Display text for next month link
-		currentText: "Today", // Display text for current month link
-		monthNames: [ "January","February","March","April","May","June",
-			"July","August","September","October","November","December" ], // Names of months for drop-down and formatting
-		monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
-		dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
-		dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
-		dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], // Column headings for days starting at Sunday
-		weekHeader: "Wk", // Column header for week of the year
-		dateFormat: "mm/dd/yy", // See format options on parseDate
-		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
-		isRTL: false, // True if right-to-left language, false if left-to-right
-		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
-		yearSuffix: "" // Additional text to append to the year in the month headers
-	};
-	this._defaults = { // Global defaults for all the date picker instances
-		showOn: "focus", // "focus" for popup on focus,
-			// "button" for trigger button, or "both" for either
-		showAnim: "fadeIn", // Name of jQuery animation for popup
-		showOptions: {}, // Options for enhanced animations
-		defaultDate: null, // Used when field is blank: actual date,
-			// +/-number for offset from today, null for today
-		appendText: "", // Display text following the input box, e.g. showing the format
-		buttonText: "...", // Text for trigger button
-		buttonImage: "", // URL for trigger button image
-		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
-		hideIfNoPrevNext: false, // True to hide next/previous month links
-			// if not applicable, false to just disable them
-		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
-		gotoCurrent: false, // True if today link goes back to current selection instead
-		changeMonth: false, // True if month can be selected directly, false if only prev/next
-		changeYear: false, // True if year can be selected directly, false if only prev/next
-		yearRange: "c-10:c+10", // Range of years to display in drop-down,
-			// either relative to today's year (-nn:+nn), relative to currently displayed year
-			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
-		showOtherMonths: false, // True to show dates in other months, false to leave blank
-		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
-		showWeek: false, // True to show week of the year, false to not show it
-		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
-			// takes a Date and returns the number of the week for it
-		shortYearCutoff: "+10", // Short year values < this are in the current century,
-			// > this are in the previous century,
-			// string value starting with "+" for current year + value
-		minDate: null, // The earliest selectable date, or null for no limit
-		maxDate: null, // The latest selectable date, or null for no limit
-		duration: "fast", // Duration of display/closure
-		beforeShowDay: null, // Function that takes a date and returns an array with
-			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
-			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
-		beforeShow: null, // Function that takes an input field and
-			// returns a set of custom settings for the date picker
-		onSelect: null, // Define a callback function when a date is selected
-		onChangeMonthYear: null, // Define a callback function when the month or year is changed
-		onClose: null, // Define a callback function when the datepicker is closed
-		numberOfMonths: 1, // Number of months to show at a time
-		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
-		stepMonths: 1, // Number of months to step back/forward
-		stepBigMonths: 12, // Number of months to step back/forward for the big links
-		altField: "", // Selector for an alternate field to store selected dates into
-		altFormat: "", // The date format to use for the alternate field
-		constrainInput: true, // The input is constrained by the current date format
-		showButtonPanel: false, // True to show button panel, false to not show it
-		autoSize: false, // True to size the input for the date format, false to leave as is
-		disabled: false // The initial disabled state
-	};
-	$.extend( this._defaults, this.regional[ "" ] );
-	this.regional.en = $.extend( true, {}, this.regional[ "" ] );
-	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
-	this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
-}
-
-$.extend( Datepicker.prototype, {
-	/* Class name added to elements to indicate already configured with a date picker. */
-	markerClassName: "hasDatepicker",
-
-	//Keep track of the maximum number of rows displayed (see #7043)
-	maxRows: 4,
-
-	// TODO rename to "widget" when switching to widget factory
-	_widgetDatepicker: function() {
-		return this.dpDiv;
-	},
-
-	/* Override the default settings for all instances of the date picker.
-	 * @param  settings  object - the new settings to use as defaults (anonymous object)
-	 * @return the manager object
-	 */
-	setDefaults: function( settings ) {
-		datepicker_extendRemove( this._defaults, settings || {} );
-		return this;
-	},
-
-	/* Attach the date picker to a jQuery selection.
-	 * @param  target	element - the target input field or division or span
-	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
-	 */
-	_attachDatepicker: function( target, settings ) {
-		var nodeName, inline, inst;
-		nodeName = target.nodeName.toLowerCase();
-		inline = ( nodeName === "div" || nodeName === "span" );
-		if ( !target.id ) {
-			this.uuid += 1;
-			target.id = "dp" + this.uuid;
-		}
-		inst = this._newInst( $( target ), inline );
-		inst.settings = $.extend( {}, settings || {} );
-		if ( nodeName === "input" ) {
-			this._connectDatepicker( target, inst );
-		} else if ( inline ) {
-			this._inlineDatepicker( target, inst );
-		}
-	},
-
-	/* Create a new instance object. */
-	_newInst: function( target, inline ) {
-		var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
-		return { id: id, input: target, // associated target
-			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
-			drawMonth: 0, drawYear: 0, // month being drawn
-			inline: inline, // is datepicker inline or not
-			dpDiv: ( !inline ? this.dpDiv : // presentation div
-			datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
-	},
-
-	/* Attach the date picker to an input field. */
-	_connectDatepicker: function( target, inst ) {
-		var input = $( target );
-		inst.append = $( [] );
-		inst.trigger = $( [] );
-		if ( input.hasClass( this.markerClassName ) ) {
-			return;
-		}
-		this._attachments( input, inst );
-		input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
-			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
-		this._autoSize( inst );
-		$.data( target, "datepicker", inst );
-
-		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
-		if ( inst.settings.disabled ) {
-			this._disableDatepicker( target );
-		}
-	},
-
-	/* Make attachments based on settings. */
-	_attachments: function( input, inst ) {
-		var showOn, buttonText, buttonImage,
-			appendText = this._get( inst, "appendText" ),
-			isRTL = this._get( inst, "isRTL" );
-
-		if ( inst.append ) {
-			inst.append.remove();
-		}
-		if ( appendText ) {
-			inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + "</span>" );
-			input[ isRTL ? "before" : "after" ]( inst.append );
-		}
-
-		input.off( "focus", this._showDatepicker );
-
-		if ( inst.trigger ) {
-			inst.trigger.remove();
-		}
-
-		showOn = this._get( inst, "showOn" );
-		if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
-			input.on( "focus", this._showDatepicker );
-		}
-		if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
-			buttonText = this._get( inst, "buttonText" );
-			buttonImage = this._get( inst, "buttonImage" );
-			inst.trigger = $( this._get( inst, "buttonImageOnly" ) ?
-				$( "<img/>" ).addClass( this._triggerClass ).
-					attr( { src: buttonImage, alt: buttonText, title: buttonText } ) :
-				$( "<button type='button'></button>" ).addClass( this._triggerClass ).
-					html( !buttonImage ? buttonText : $( "<img/>" ).attr(
-					{ src:buttonImage, alt:buttonText, title:buttonText } ) ) );
-			input[ isRTL ? "before" : "after" ]( inst.trigger );
-			inst.trigger.on( "click", function() {
-				if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
-					$.datepicker._hideDatepicker();
-				} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
-					$.datepicker._hideDatepicker();
-					$.datepicker._showDatepicker( input[ 0 ] );
-				} else {
-					$.datepicker._showDatepicker( input[ 0 ] );
-				}
-				return false;
-			} );
-		}
-	},
-
-	/* Apply the maximum length for the date format. */
-	_autoSize: function( inst ) {
-		if ( this._get( inst, "autoSize" ) && !inst.inline ) {
-			var findMax, max, maxI, i,
-				date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
-				dateFormat = this._get( inst, "dateFormat" );
-
-			if ( dateFormat.match( /[DM]/ ) ) {
-				findMax = function( names ) {
-					max = 0;
-					maxI = 0;
-					for ( i = 0; i < names.length; i++ ) {
-						if ( names[ i ].length > max ) {
-							max = names[ i ].length;
-							maxI = i;
-						}
-					}
-					return maxI;
-				};
-				date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
-					"monthNames" : "monthNamesShort" ) ) ) );
-				date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
-					"dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
-			}
-			inst.input.attr( "size", this._formatDate( inst, date ).length );
-		}
-	},
-
-	/* Attach an inline date picker to a div. */
-	_inlineDatepicker: function( target, inst ) {
-		var divSpan = $( target );
-		if ( divSpan.hasClass( this.markerClassName ) ) {
-			return;
-		}
-		divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
-		$.data( target, "datepicker", inst );
-		this._setDate( inst, this._getDefaultDate( inst ), true );
-		this._updateDatepicker( inst );
-		this._updateAlternate( inst );
-
-		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
-		if ( inst.settings.disabled ) {
-			this._disableDatepicker( target );
-		}
-
-		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
-		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
-		inst.dpDiv.css( "display", "block" );
-	},
-
-	/* Pop-up the date picker in a "dialog" box.
-	 * @param  input element - ignored
-	 * @param  date	string or Date - the initial date to display
-	 * @param  onSelect  function - the function to call when a date is selected
-	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
-	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
-	 *					event - with x/y coordinates or
-	 *					leave empty for default (screen centre)
-	 * @return the manager object
-	 */
-	_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
-		var id, browserWidth, browserHeight, scrollX, scrollY,
-			inst = this._dialogInst; // internal instance
-
-		if ( !inst ) {
-			this.uuid += 1;
-			id = "dp" + this.uuid;
-			this._dialogInput = $( "<input type='text' id='" + id +
-				"' style='position: absolute; top: -100px; width: 0px;'/>" );
-			this._dialogInput.on( "keydown", this._doKeyDown );
-			$( "body" ).append( this._dialogInput );
-			inst = this._dialogInst = this._newInst( this._dialogInput, false );
-			inst.settings = {};
-			$.data( this._dialogInput[ 0 ], "datepicker", inst );
-		}
-		datepicker_extendRemove( inst.settings, settings || {} );
-		date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
-		this._dialogInput.val( date );
-
-		this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
-		if ( !this._pos ) {
-			browserWidth = document.documentElement.clientWidth;
-			browserHeight = document.documentElement.clientHeight;
-			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
-			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
-			this._pos = // should use actual width/height below
-				[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
-		}
-
-		// Move input on screen for focus, but hidden behind dialog
-		this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
-		inst.settings.onSelect = onSelect;
-		this._inDialog = true;
-		this.dpDiv.addClass( this._dialogClass );
-		this._showDatepicker( this._dialogInput[ 0 ] );
-		if ( $.blockUI ) {
-			$.blockUI( this.dpDiv );
-		}
-		$.data( this._dialogInput[ 0 ], "datepicker", inst );
-		return this;
-	},
-
-	/* Detach a datepicker from its control.
-	 * @param  target	element - the target input field or division or span
-	 */
-	_destroyDatepicker: function( target ) {
-		var nodeName,
-			$target = $( target ),
-			inst = $.data( target, "datepicker" );
-
-		if ( !$target.hasClass( this.markerClassName ) ) {
-			return;
-		}
-
-		nodeName = target.nodeName.toLowerCase();
-		$.removeData( target, "datepicker" );
-		if ( nodeName === "input" ) {
-			inst.append.remove();
-			inst.trigger.remove();
-			$target.removeClass( this.markerClassName ).
-				off( "focus", this._showDatepicker ).
-				off( "keydown", this._doKeyDown ).
-				off( "keypress", this._doKeyPress ).
-				off( "keyup", this._doKeyUp );
-		} else if ( nodeName === "div" || nodeName === "span" ) {
-			$target.removeClass( this.markerClassName ).empty();
-		}
-
-		if ( datepicker_instActive === inst ) {
-			datepicker_instActive = null;
-		}
-	},
-
-	/* Enable the date picker to a jQuery selection.
-	 * @param  target	element - the target input field or division or span
-	 */
-	_enableDatepicker: function( target ) {
-		var nodeName, inline,
-			$target = $( target ),
-			inst = $.data( target, "datepicker" );
-
-		if ( !$target.hasClass( this.markerClassName ) ) {
-			return;
-		}
-
-		nodeName = target.nodeName.toLowerCase();
-		if ( nodeName === "input" ) {
-			target.disabled = false;
-			inst.trigger.filter( "button" ).
-				each( function() { this.disabled = false; } ).end().
-				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
-		} else if ( nodeName === "div" || nodeName === "span" ) {
-			inline = $target.children( "." + this._inlineClass );
-			inline.children().removeClass( "ui-state-disabled" );
-			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
-				prop( "disabled", false );
-		}
-		this._disabledInputs = $.map( this._disabledInputs,
-			function( value ) { return ( value === target ? null : value ); } ); // delete entry
-	},
-
-	/* Disable the date picker to a jQuery selection.
-	 * @param  target	element - the target input field or division or span
-	 */
-	_disableDatepicker: function( target ) {
-		var nodeName, inline,
-			$target = $( target ),
-			inst = $.data( target, "datepicker" );
-
-		if ( !$target.hasClass( this.markerClassName ) ) {
-			return;
-		}
-
-		nodeName = target.nodeName.toLowerCase();
-		if ( nodeName === "input" ) {
-			target.disabled = true;
-			inst.trigger.filter( "button" ).
-				each( function() { this.disabled = true; } ).end().
-				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
-		} else if ( nodeName === "div" || nodeName === "span" ) {
-			inline = $target.children( "." + this._inlineClass );
-			inline.children().addClass( "ui-state-disabled" );
-			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
-				prop( "disabled", true );
-		}
-		this._disabledInputs = $.map( this._disabledInputs,
-			function( value ) { return ( value === target ? null : value ); } ); // delete entry
-		this._disabledInputs[ this._disabledInputs.length ] = target;
-	},
-
-	/* Is the first field in a jQuery collection disabled as a datepicker?
-	 * @param  target	element - the target input field or division or span
-	 * @return boolean - true if disabled, false if enabled
-	 */
-	_isDisabledDatepicker: function( target ) {
-		if ( !target ) {
-			return false;
-		}
-		for ( var i = 0; i < this._disabledInputs.length; i++ ) {
-			if ( this._disabledInputs[ i ] === target ) {
-				return true;
-			}
-		}
-		return false;
-	},
-
-	/* Retrieve the instance data for the target control.
-	 * @param  target  element - the target input field or division or span
-	 * @return  object - the associated instance data
-	 * @throws  error if a jQuery problem getting data
-	 */
-	_getInst: function( target ) {
-		try {
-			return $.data( target, "datepicker" );
-		}
-		catch ( err ) {
-			throw "Missing instance data for this datepicker";
-		}
-	},
-
-	/* Update or retrieve the settings for a date picker attached to an input field or division.
-	 * @param  target  element - the target input field or division or span
-	 * @param  name	object - the new settings to update or
-	 *				string - the name of the setting to change or retrieve,
-	 *				when retrieving also "all" for all instance settings or
-	 *				"defaults" for all global defaults
-	 * @param  value   any - the new value for the setting
-	 *				(omit if above is an object or to retrieve a value)
-	 */
-	_optionDatepicker: function( target, name, value ) {
-		var settings, date, minDate, maxDate,
-			inst = this._getInst( target );
-
-		if ( arguments.length === 2 && typeof name === "string" ) {
-			return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
-				( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
-				this._get( inst, name ) ) : null ) );
-		}
-
-		settings = name || {};
-		if ( typeof name === "string" ) {
-			settings = {};
-			settings[ name ] = value;
-		}
-
-		if ( inst ) {
-			if ( this._curInst === inst ) {
-				this._hideDatepicker();
-			}
-
-			date = this._getDateDatepicker( target, true );
-			minDate = this._getMinMaxDate( inst, "min" );
-			maxDate = this._getMinMaxDate( inst, "max" );
-			datepicker_extendRemove( inst.settings, settings );
-
-			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
-			if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
-				inst.settings.minDate = this._formatDate( inst, minDate );
-			}
-			if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
-				inst.settings.maxDate = this._formatDate( inst, maxDate );
-			}
-			if ( "disabled" in settings ) {
-				if ( settings.disabled ) {
-					this._disableDatepicker( target );
-				} else {
-					this._enableDatepicker( target );
-				}
-			}
-			this._attachments( $( target ), inst );
-			this._autoSize( inst );
-			this._setDate( inst, date );
-			this._updateAlternate( inst );
-			this._updateDatepicker( inst );
-		}
-	},
-
-	// Change method deprecated
-	_changeDatepicker: function( target, name, value ) {
-		this._optionDatepicker( target, name, value );
-	},
-
-	/* Redraw the date picker attached to an input field or division.
-	 * @param  target  element - the target input field or division or span
-	 */
-	_refreshDatepicker: function( target ) {
-		var inst = this._getInst( target );
-		if ( inst ) {
-			this._updateDatepicker( inst );
-		}
-	},
-
-	/* Set the dates for a jQuery selection.
-	 * @param  target element - the target input field or division or span
-	 * @param  date	Date - the new date
-	 */
-	_setDateDatepicker: function( target, date ) {
-		var inst = this._getInst( target );
-		if ( inst ) {
-			this._setDate( inst, date );
-			this._updateDatepicker( inst );
-			this._updateAlternate( inst );
-		}
-	},
-
-	/* Get the date(s) for the first entry in a jQuery selection.
-	 * @param  target element - the target input field or division or span
-	 * @param  noDefault boolean - true if no default date is to be used
-	 * @return Date - the current date
-	 */
-	_getDateDatepicker: function( target, noDefault ) {
-		var inst = this._getInst( target );
-		if ( inst && !inst.inline ) {
-			this._setDateFromField( inst, noDefault );
-		}
-		return ( inst ? this._getDate( inst ) : null );
-	},
-
-	/* Handle keystrokes. */
-	_doKeyDown: function( event ) {
-		var onSelect, dateStr, sel,
-			inst = $.datepicker._getInst( event.target ),
-			handled = true,
-			isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
-
-		inst._keyEvent = true;
-		if ( $.datepicker._datepickerShowing ) {
-			switch ( event.keyCode ) {
-				case 9: $.datepicker._hideDatepicker();
-						handled = false;
-						break; // hide on tab out
-				case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
-									$.datepicker._currentClass + ")", inst.dpDiv );
-						if ( sel[ 0 ] ) {
-							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
-						}
-
-						onSelect = $.datepicker._get( inst, "onSelect" );
-						if ( onSelect ) {
-							dateStr = $.datepicker._formatDate( inst );
-
-							// Trigger custom callback
-							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
-						} else {
-							$.datepicker._hideDatepicker();
-						}
-
-						return false; // don't submit the form
-				case 27: $.datepicker._hideDatepicker();
-						break; // hide on escape
-				case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-							-$.datepicker._get( inst, "stepBigMonths" ) :
-							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						break; // previous month/year on page up/+ ctrl
-				case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-							+$.datepicker._get( inst, "stepBigMonths" ) :
-							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						break; // next month/year on page down/+ ctrl
-				case 35: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._clearDate( event.target );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // clear on ctrl or command +end
-				case 36: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._gotoToday( event.target );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // current on ctrl or command +home
-				case 37: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
-
-						// -1 day on ctrl or command +left
-						if ( event.originalEvent.altKey ) {
-							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-								-$.datepicker._get( inst, "stepBigMonths" ) :
-								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						}
-
-						// next month/year on alt +left on Mac
-						break;
-				case 38: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, -7, "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // -1 week on ctrl or command +up
-				case 39: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
-
-						// +1 day on ctrl or command +right
-						if ( event.originalEvent.altKey ) {
-							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-								+$.datepicker._get( inst, "stepBigMonths" ) :
-								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						}
-
-						// next month/year on alt +right
-						break;
-				case 40: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, +7, "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // +1 week on ctrl or command +down
-				default: handled = false;
-			}
-		} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
-			$.datepicker._showDatepicker( this );
-		} else {
-			handled = false;
-		}
-
-		if ( handled ) {
-			event.preventDefault();
-			event.stopPropagation();
-		}
-	},
-
-	/* Filter entered characters - based on date format. */
-	_doKeyPress: function( event ) {
-		var chars, chr,
-			inst = $.datepicker._getInst( event.target );
-
-		if ( $.datepicker._get( inst, "constrainInput" ) ) {
-			chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
-			chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
-			return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
-		}
-	},
-
-	/* Synchronise manual entry and field/alternate field. */
-	_doKeyUp: function( event ) {
-		var date,
-			inst = $.datepicker._getInst( event.target );
-
-		if ( inst.input.val() !== inst.lastVal ) {
-			try {
-				date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
-					( inst.input ? inst.input.val() : null ),
-					$.datepicker._getFormatConfig( inst ) );
-
-				if ( date ) { // only if valid
-					$.datepicker._setDateFromField( inst );
-					$.datepicker._updateAlternate( inst );
-					$.datepicker._updateDatepicker( inst );
-				}
-			}
-			catch ( err ) {
-			}
-		}
-		return true;
-	},
-
-	/* Pop-up the date picker for a given input field.
-	 * If false returned from beforeShow event handler do not show.
-	 * @param  input  element - the input field attached to the date picker or
-	 *					event - if triggered by focus
-	 */
-	_showDatepicker: function( input ) {
-		input = input.target || input;
-		if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
-			input = $( "input", input.parentNode )[ 0 ];
-		}
-
-		if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
-			return;
-		}
-
-		var inst, beforeShow, beforeShowSettings, isFixed,
-			offset, showAnim, duration;
-
-		inst = $.datepicker._getInst( input );
-		if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
-			$.datepicker._curInst.dpDiv.stop( true, true );
-			if ( inst && $.datepicker._datepickerShowing ) {
-				$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
-			}
-		}
-
-		beforeShow = $.datepicker._get( inst, "beforeShow" );
-		beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
-		if ( beforeShowSettings === false ) {
-			return;
-		}
-		datepicker_extendRemove( inst.settings, beforeShowSettings );
-
-		inst.lastVal = null;
-		$.datepicker._lastInput = input;
-		$.datepicker._setDateFromField( inst );
-
-		if ( $.datepicker._inDialog ) { // hide cursor
-			input.value = "";
-		}
-		if ( !$.datepicker._pos ) { // position below input
-			$.datepicker._pos = $.datepicker._findPos( input );
-			$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
-		}
-
-		isFixed = false;
-		$( input ).parents().each( function() {
-			isFixed |= $( this ).css( "position" ) === "fixed";
-			return !isFixed;
-		} );
-
-		offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
-		$.datepicker._pos = null;
-
-		//to avoid flashes on Firefox
-		inst.dpDiv.empty();
-
-		// determine sizing offscreen
-		inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
-		$.datepicker._updateDatepicker( inst );
-
-		// fix width for dynamic number of date pickers
-		// and adjust position before showing
-		offset = $.datepicker._checkOffset( inst, offset, isFixed );
-		inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
-			"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
-			left: offset.left + "px", top: offset.top + "px" } );
-
-		if ( !inst.inline ) {
-			showAnim = $.datepicker._get( inst, "showAnim" );
-			duration = $.datepicker._get( inst, "duration" );
-			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
-			$.datepicker._datepickerShowing = true;
-
-			if ( $.effects && $.effects.effect[ showAnim ] ) {
-				inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
-			} else {
-				inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
-			}
-
-			if ( $.datepicker._shouldFocusInput( inst ) ) {
-				inst.input.trigger( "focus" );
-			}
-
-			$.datepicker._curInst = inst;
-		}
-	},
-
-	/* Generate the date picker content. */
-	_updateDatepicker: function( inst ) {
-		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
-		datepicker_instActive = inst; // for delegate hover events
-		inst.dpDiv.empty().append( this._generateHTML( inst ) );
-		this._attachHandlers( inst );
-
-		var origyearshtml,
-			numMonths = this._getNumberOfMonths( inst ),
-			cols = numMonths[ 1 ],
-			width = 17,
-			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
-
-		if ( activeCell.length > 0 ) {
-			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
-		}
-
-		inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
-		if ( cols > 1 ) {
-			inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
-		}
-		inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
-			"Class" ]( "ui-datepicker-multi" );
-		inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
-			"Class" ]( "ui-datepicker-rtl" );
-
-		if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
-			inst.input.trigger( "focus" );
-		}
-
-		// Deffered render of the years select (to avoid flashes on Firefox)
-		if ( inst.yearshtml ) {
-			origyearshtml = inst.yearshtml;
-			setTimeout( function() {
-
-				//assure that inst.yearshtml didn't change.
-				if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
-					inst.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( inst.yearshtml );
-				}
-				origyearshtml = inst.yearshtml = null;
-			}, 0 );
-		}
-	},
-
-	// #6694 - don't focus the input if it's already focused
-	// this breaks the change event in IE
-	// Support: IE and jQuery <1.9
-	_shouldFocusInput: function( inst ) {
-		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
-	},
-
-	/* Check positioning to remain on screen. */
-	_checkOffset: function( inst, offset, isFixed ) {
-		var dpWidth = inst.dpDiv.outerWidth(),
-			dpHeight = inst.dpDiv.outerHeight(),
-			inputWidth = inst.input ? inst.input.outerWidth() : 0,
-			inputHeight = inst.input ? inst.input.outerHeight() : 0,
-			viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
-			viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
-
-		offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
-		offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
-		offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
-
-		// Now check if datepicker is showing outside window viewport - move to a better place if so.
-		offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
-			Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
-		offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
-			Math.abs( dpHeight + inputHeight ) : 0 );
-
-		return offset;
-	},
-
-	/* Find an object's position on the screen. */
-	_findPos: function( obj ) {
-		var position,
-			inst = this._getInst( obj ),
-			isRTL = this._get( inst, "isRTL" );
-
-		while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
-			obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
-		}
-
-		position = $( obj ).offset();
-		return [ position.left, position.top ];
-	},
-
-	/* Hide the date picker from view.
-	 * @param  input  element - the input field attached to the date picker
-	 */
-	_hideDatepicker: function( input ) {
-		var showAnim, duration, postProcess, onClose,
-			inst = this._curInst;
-
-		if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
-			return;
-		}
-
-		if ( this._datepickerShowing ) {
-			showAnim = this._get( inst, "showAnim" );
-			duration = this._get( inst, "duration" );
-			postProcess = function() {
-				$.datepicker._tidyDialog( inst );
-			};
-
-			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
-			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
-				inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
-			} else {
-				inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
-					( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
-			}
-
-			if ( !showAnim ) {
-				postProcess();
-			}
-			this._datepickerShowing = false;
-
-			onClose = this._get( inst, "onClose" );
-			if ( onClose ) {
-				onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
-			}
-
-			this._lastInput = null;
-			if ( this._inDialog ) {
-				this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
-				if ( $.blockUI ) {
-					$.unblockUI();
-					$( "body" ).append( this.dpDiv );
-				}
-			}
-			this._inDialog = false;
-		}
-	},
-
-	/* Tidy up after a dialog display. */
-	_tidyDialog: function( inst ) {
-		inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
-	},
-
-	/* Close date picker if clicked elsewhere. */
-	_checkExternalClick: function( event ) {
-		if ( !$.datepicker._curInst ) {
-			return;
-		}
-
-		var $target = $( event.target ),
-			inst = $.datepicker._getInst( $target[ 0 ] );
-
-		if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
-				$target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
-				!$target.hasClass( $.datepicker.markerClassName ) &&
-				!$target.closest( "." + $.datepicker._triggerClass ).length &&
-				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
-			( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
-				$.datepicker._hideDatepicker();
-		}
-	},
-
-	/* Adjust one of the date sub-fields. */
-	_adjustDate: function( id, offset, period ) {
-		var target = $( id ),
-			inst = this._getInst( target[ 0 ] );
-
-		if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
-			return;
-		}
-		this._adjustInstDate( inst, offset +
-			( period === "M" ? this._get( inst, "showCurrentAtPos" ) : 0 ), // undo positioning
-			period );
-		this._updateDatepicker( inst );
-	},
-
-	/* Action for current link. */
-	_gotoToday: function( id ) {
-		var date,
-			target = $( id ),
-			inst = this._getInst( target[ 0 ] );
-
-		if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
-			inst.selectedDay = inst.currentDay;
-			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
-			inst.drawYear = inst.selectedYear = inst.currentYear;
-		} else {
-			date = new Date();
-			inst.selectedDay = date.getDate();
-			inst.drawMonth = inst.selectedMonth = date.getMonth();
-			inst.drawYear = inst.selectedYear = date.getFullYear();
-		}
-		this._notifyChange( inst );
-		this._adjustDate( target );
-	},
-
-	/* Action for selecting a new month/year. */
-	_selectMonthYear: function( id, select, period ) {
-		var target = $( id ),
-			inst = this._getInst( target[ 0 ] );
-
-		inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
-		inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
-			parseInt( select.options[ select.selectedIndex ].value, 10 );
-
-		this._notifyChange( inst );
-		this._adjustDate( target );
-	},
-
-	/* Action for selecting a day. */
-	_selectDay: function( id, month, year, td ) {
-		var inst,
-			target = $( id );
-
-		if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
-			return;
-		}
-
-		inst = this._getInst( target[ 0 ] );
-		inst.selectedDay = inst.currentDay = $( "a", td ).html();
-		inst.selectedMonth = inst.currentMonth = month;
-		inst.selectedYear = inst.currentYear = year;
-		this._selectDate( id, this._formatDate( inst,
-			inst.currentDay, inst.currentMonth, inst.currentYear ) );
-	},
-
-	/* Erase the input field and hide the date picker. */
-	_clearDate: function( id ) {
-		var target = $( id );
-		this._selectDate( target, "" );
-	},
-
-	/* Update the input field with the selected date. */
-	_selectDate: function( id, dateStr ) {
-		var onSelect,
-			target = $( id ),
-			inst = this._getInst( target[ 0 ] );
-
-		dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
-		if ( inst.input ) {
-			inst.input.val( dateStr );
-		}
-		this._updateAlternate( inst );
-
-		onSelect = this._get( inst, "onSelect" );
-		if ( onSelect ) {
-			onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
-		} else if ( inst.input ) {
-			inst.input.trigger( "change" ); // fire the change event
-		}
-
-		if ( inst.inline ) {
-			this._updateDatepicker( inst );
-		} else {
-			this._hideDatepicker();
-			this._lastInput = inst.input[ 0 ];
-			if ( typeof( inst.input[ 0 ] ) !== "object" ) {
-				inst.input.trigger( "focus" ); // restore focus
-			}
-			this._lastInput = null;
-		}
-	},
-
-	/* Update any alternate field to synchronise with the main field. */
-	_updateAlternate: function( inst ) {
-		var altFormat, date, dateStr,
-			altField = this._get( inst, "altField" );
-
-		if ( altField ) { // update alternate field too
-			altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
-			date = this._getDate( inst );
-			dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
-			$( altField ).val( dateStr );
-		}
-	},
-
-	/* Set as beforeShowDay function to prevent selection of weekends.
-	 * @param  date  Date - the date to customise
-	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
-	 */
-	noWeekends: function( date ) {
-		var day = date.getDay();
-		return [ ( day > 0 && day < 6 ), "" ];
-	},
-
-	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
-	 * @param  date  Date - the date to get the week for
-	 * @return  number - the number of the week within the year that contains this date
-	 */
-	iso8601Week: function( date ) {
-		var time,
-			checkDate = new Date( date.getTime() );
-
-		// Find Thursday of this week starting on Monday
-		checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
-
-		time = checkDate.getTime();
-		checkDate.setMonth( 0 ); // Compare with Jan 1
-		checkDate.setDate( 1 );
-		return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
-	},
-
-	/* Parse a string value into a date object.
-	 * See formatDate below for the possible formats.
-	 *
-	 * @param  format string - the expected format of the date
-	 * @param  value string - the date in the above format
-	 * @param  settings Object - attributes include:
-	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
-	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
-	 *					dayNames		string[7] - names of the days from Sunday (optional)
-	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
-	 *					monthNames		string[12] - names of the months (optional)
-	 * @return  Date - the extracted date value or null if value is blank
-	 */
-	parseDate: function( format, value, settings ) {
-		if ( format == null || value == null ) {
-			throw "Invalid arguments";
-		}
-
-		value = ( typeof value === "object" ? value.toString() : value + "" );
-		if ( value === "" ) {
-			return null;
-		}
-
-		var iFormat, dim, extra,
-			iValue = 0,
-			shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
-			shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
-				new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
-			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
-			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
-			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
-			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
-			year = -1,
-			month = -1,
-			day = -1,
-			doy = -1,
-			literal = false,
-			date,
-
-			// Check whether a format character is doubled
-			lookAhead = function( match ) {
-				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
-				if ( matches ) {
-					iFormat++;
-				}
-				return matches;
-			},
-
-			// Extract a number from the string value
-			getNumber = function( match ) {
-				var isDoubled = lookAhead( match ),
-					size = ( match === "@" ? 14 : ( match === "!" ? 20 :
-					( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
-					minSize = ( match === "y" ? size : 1 ),
-					digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
-					num = value.substring( iValue ).match( digits );
-				if ( !num ) {
-					throw "Missing number at position " + iValue;
-				}
-				iValue += num[ 0 ].length;
-				return parseInt( num[ 0 ], 10 );
-			},
-
-			// Extract a name from the string value and convert to an index
-			getName = function( match, shortNames, longNames ) {
-				var index = -1,
-					names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
-						return [ [ k, v ] ];
-					} ).sort( function( a, b ) {
-						return -( a[ 1 ].length - b[ 1 ].length );
-					} );
-
-				$.each( names, function( i, pair ) {
-					var name = pair[ 1 ];
-					if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
-						index = pair[ 0 ];
-						iValue += name.length;
-						return false;
-					}
-				} );
-				if ( index !== -1 ) {
-					return index + 1;
-				} else {
-					throw "Unknown name at position " + iValue;
-				}
-			},
-
-			// Confirm that a literal character matches the string value
-			checkLiteral = function() {
-				if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
-					throw "Unexpected literal at position " + iValue;
-				}
-				iValue++;
-			};
-
-		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
-			if ( literal ) {
-				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
-					literal = false;
-				} else {
-					checkLiteral();
-				}
-			} else {
-				switch ( format.charAt( iFormat ) ) {
-					case "d":
-						day = getNumber( "d" );
-						break;
-					case "D":
-						getName( "D", dayNamesShort, dayNames );
-						break;
-					case "o":
-						doy = getNumber( "o" );
-						break;
-					case "m":
-						month = getNumber( "m" );
-						break;
-					case "M":
-						month = getName( "M", monthNamesShort, monthNames );
-						break;
-					case "y":
-						year = getNumber( "y" );
-						break;
-					case "@":
-						date = new Date( getNumber( "@" ) );
-						year = date.getFullYear();
-						month = date.getMonth() + 1;
-						day = date.getDate();
-						break;
-					case "!":
-						date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
-						year = date.getFullYear();
-						month = date.getMonth() + 1;
-						day = date.getDate();
-						break;
-					case "'":
-						if ( lookAhead( "'" ) ) {
-							checkLiteral();
-						} else {
-							literal = true;
-						}
-						break;
-					default:
-						checkLiteral();
-				}
-			}
-		}
-
-		if ( iValue < value.length ) {
-			extra = value.substr( iValue );
-			if ( !/^\s+/.test( extra ) ) {
-				throw "Extra/unparsed characters found in date: " + extra;
-			}
-		}
-
-		if ( year === -1 ) {
-			year = new Date().getFullYear();
-		} else if ( year < 100 ) {
-			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
-				( year <= shortYearCutoff ? 0 : -100 );
-		}
-
-		if ( doy > -1 ) {
-			month = 1;
-			day = doy;
-			do {
-				dim = this._getDaysInMonth( year, month - 1 );
-				if ( day <= dim ) {
-					break;
-				}
-				month++;
-				day -= dim;
-			} while ( true );
-		}
-
-		date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
-		if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
-			throw "Invalid date"; // E.g. 31/02/00
-		}
-		return date;
-	},
-
-	/* Standard date formats. */
-	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
-	COOKIE: "D, dd M yy",
-	ISO_8601: "yy-mm-dd",
-	RFC_822: "D, d M y",
-	RFC_850: "DD, dd-M-y",
-	RFC_1036: "D, d M y",
-	RFC_1123: "D, d M yy",
-	RFC_2822: "D, d M yy",
-	RSS: "D, d M y", // RFC 822
-	TICKS: "!",
-	TIMESTAMP: "@",
-	W3C: "yy-mm-dd", // ISO 8601
-
-	_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
-		Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
-
-	/* Format a date object into a string value.
-	 * The format can be combinations of the following:
-	 * d  - day of month (no leading zero)
-	 * dd - day of month (two digit)
-	 * o  - day of year (no leading zeros)
-	 * oo - day of year (three digit)
-	 * D  - day name short
-	 * DD - day name long
-	 * m  - month of year (no leading zero)
-	 * mm - month of year (two digit)
-	 * M  - month name short
-	 * MM - month name long
-	 * y  - year (two digit)
-	 * yy - year (four digit)
-	 * @ - Unix timestamp (ms since 01/01/1970)
-	 * ! - Windows ticks (100ns since 01/01/0001)
-	 * "..." - literal text
-	 * '' - single quote
-	 *
-	 * @param  format string - the desired format of the date
-	 * @param  date Date - the date value to format
-	 * @param  settings Object - attributes include:
-	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
-	 *					dayNames		string[7] - names of the days from Sunday (optional)
-	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
-	 *					monthNames		string[12] - names of the months (optional)
-	 * @return  string - the date in the above format
-	 */
-	formatDate: function( format, date, settings ) {
-		if ( !date ) {
-			return "";
-		}
-
-		var iFormat,
-			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
-			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
-			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
-			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
-
-			// Check whether a format character is doubled
-			lookAhead = function( match ) {
-				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
-				if ( matches ) {
-					iFormat++;
-				}
-				return matches;
-			},
-
-			// Format a number, with leading zero if necessary
-			formatNumber = function( match, value, len ) {
-				var num = "" + value;
-				if ( lookAhead( match ) ) {
-					while ( num.length < len ) {
-						num = "0" + num;
-					}
-				}
-				return num;
-			},
-
-			// Format a name, short or long as requested
-			formatName = function( match, value, shortNames, longNames ) {
-				return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
-			},
-			output = "",
-			literal = false;
-
-		if ( date ) {
-			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
-				if ( literal ) {
-					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
-						literal = false;
-					} else {
-						output += format.charAt( iFormat );
-					}
-				} else {
-					switch ( format.charAt( iFormat ) ) {
-						case "d":
-							output += formatNumber( "d", date.getDate(), 2 );
-							break;
-						case "D":
-							output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
-							break;
-						case "o":
-							output += formatNumber( "o",
-								Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
-							break;
-						case "m":
-							output += formatNumber( "m", date.getMonth() + 1, 2 );
-							break;
-						case "M":
-							output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
-							break;
-						case "y":
-							output += ( lookAhead( "y" ) ? date.getFullYear() :
-								( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
-							break;
-						case "@":
-							output += date.getTime();
-							break;
-						case "!":
-							output += date.getTime() * 10000 + this._ticksTo1970;
-							break;
-						case "'":
-							if ( lookAhead( "'" ) ) {
-								output += "'";
-							} else {
-								literal = true;
-							}
-							break;
-						default:
-							output += format.charAt( iFormat );
-					}
-				}
-			}
-		}
-		return output;
-	},
-
-	/* Extract all possible characters from the date format. */
-	_possibleChars: function( format ) {
-		var iFormat,
-			chars = "",
-			literal = false,
-
-			// Check whether a format character is doubled
-			lookAhead = function( match ) {
-				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
-				if ( matches ) {
-					iFormat++;
-				}
-				return matches;
-			};
-
-		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
-			if ( literal ) {
-				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
-					literal = false;
-				} else {
-					chars += format.charAt( iFormat );
-				}
-			} else {
-				switch ( format.charAt( iFormat ) ) {
-					case "d": case "m": case "y": case "@":
-						chars += "0123456789";
-						break;
-					case "D": case "M":
-						return null; // Accept anything
-					case "'":
-						if ( lookAhead( "'" ) ) {
-							chars += "'";
-						} else {
-							literal = true;
-						}
-						break;
-					default:
-						chars += format.charAt( iFormat );
-				}
-			}
-		}
-		return chars;
-	},
-
-	/* Get a setting value, defaulting if necessary. */
-	_get: function( inst, name ) {
-		return inst.settings[ name ] !== undefined ?
-			inst.settings[ name ] : this._defaults[ name ];
-	},
-
-	/* Parse existing date and initialise date picker. */
-	_setDateFromField: function( inst, noDefault ) {
-		if ( inst.input.val() === inst.lastVal ) {
-			return;
-		}
-
-		var dateFormat = this._get( inst, "dateFormat" ),
-			dates = inst.lastVal = inst.input ? inst.input.val() : null,
-			defaultDate = this._getDefaultDate( inst ),
-			date = defaultDate,
-			settings = this._getFormatConfig( inst );
-
-		try {
-			date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
-		} catch ( event ) {
-			dates = ( noDefault ? "" : dates );
-		}
-		inst.selectedDay = date.getDate();
-		inst.drawMonth = inst.selectedMonth = date.getMonth();
-		inst.drawYear = inst.selectedYear = date.getFullYear();
-		inst.currentDay = ( dates ? date.getDate() : 0 );
-		inst.currentMonth = ( dates ? date.getMonth() : 0 );
-		inst.currentYear = ( dates ? date.getFullYear() : 0 );
-		this._adjustInstDate( inst );
-	},
-
-	/* Retrieve the default date shown on opening. */
-	_getDefaultDate: function( inst ) {
-		return this._restrictMinMax( inst,
-			this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
-	},
-
-	/* A date may be specified as an exact value or a relative one. */
-	_determineDate: function( inst, date, defaultDate ) {
-		var offsetNumeric = function( offset ) {
-				var date = new Date();
-				date.setDate( date.getDate() + offset );
-				return date;
-			},
-			offsetString = function( offset ) {
-				try {
-					return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
-						offset, $.datepicker._getFormatConfig( inst ) );
-				}
-				catch ( e ) {
-
-					// Ignore
-				}
-
-				var date = ( offset.toLowerCase().match( /^c/ ) ?
-					$.datepicker._getDate( inst ) : null ) || new Date(),
-					year = date.getFullYear(),
-					month = date.getMonth(),
-					day = date.getDate(),
-					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
-					matches = pattern.exec( offset );
-
-				while ( matches ) {
-					switch ( matches[ 2 ] || "d" ) {
-						case "d" : case "D" :
-							day += parseInt( matches[ 1 ], 10 ); break;
-						case "w" : case "W" :
-							day += parseInt( matches[ 1 ], 10 ) * 7; break;
-						case "m" : case "M" :
-							month += parseInt( matches[ 1 ], 10 );
-							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
-							break;
-						case "y": case "Y" :
-							year += parseInt( matches[ 1 ], 10 );
-							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
-							break;
-					}
-					matches = pattern.exec( offset );
-				}
-				return new Date( year, month, day );
-			},
-			newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
-				( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
-
-		newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
-		if ( newDate ) {
-			newDate.setHours( 0 );
-			newDate.setMinutes( 0 );
-			newDate.setSeconds( 0 );
-			newDate.setMilliseconds( 0 );
-		}
-		return this._daylightSavingAdjust( newDate );
-	},
-
-	/* Handle switch to/from daylight saving.
-	 * Hours may be non-zero on daylight saving cut-over:
-	 * > 12 when midnight changeover, but then cannot generate
-	 * midnight datetime, so jump to 1AM, otherwise reset.
-	 * @param  date  (Date) the date to check
-	 * @return  (Date) the corrected date
-	 */
-	_daylightSavingAdjust: function( date ) {
-		if ( !date ) {
-			return null;
-		}
-		date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
-		return date;
-	},
-
-	/* Set the date(s) directly. */
-	_setDate: function( inst, date, noChange ) {
-		var clear = !date,
-			origMonth = inst.selectedMonth,
-			origYear = inst.selectedYear,
-			newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
-
-		inst.selectedDay = inst.currentDay = newDate.getDate();
-		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
-		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
-		if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
-			this._notifyChange( inst );
-		}
-		this._adjustInstDate( inst );
-		if ( inst.input ) {
-			inst.input.val( clear ? "" : this._formatDate( inst ) );
-		}
-	},
-
-	/* Retrieve the date(s) directly. */
-	_getDate: function( inst ) {
-		var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
-			this._daylightSavingAdjust( new Date(
-			inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
-			return startDate;
-	},
-
-	/* Attach the onxxx handlers.  These are declared statically so
-	 * they work with static code transformers like Caja.
-	 */
-	_attachHandlers: function( inst ) {
-		var stepMonths = this._get( inst, "stepMonths" ),
-			id = "#" + inst.id.replace( /\\\\/g, "\\" );
-		inst.dpDiv.find( "[data-handler]" ).map( function() {
-			var handler = {
-				prev: function() {
-					$.datepicker._adjustDate( id, -stepMonths, "M" );
-				},
-				next: function() {
-					$.datepicker._adjustDate( id, +stepMonths, "M" );
-				},
-				hide: function() {
-					$.datepicker._hideDatepicker();
-				},
-				today: function() {
-					$.datepicker._gotoToday( id );
-				},
-				selectDay: function() {
-					$.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
-					return false;
-				},
-				selectMonth: function() {
-					$.datepicker._selectMonthYear( id, this, "M" );
-					return false;
-				},
-				selectYear: function() {
-					$.datepicker._selectMonthYear( id, this, "Y" );
-					return false;
-				}
-			};
-			$( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
-		} );
-	},
-
-	/* Generate the HTML for the current state of the date picker. */
-	_generateHTML: function( inst ) {
-		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
-			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
-			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
-			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
-			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
-			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
-			tempDate = new Date(),
-			today = this._daylightSavingAdjust(
-				new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
-			isRTL = this._get( inst, "isRTL" ),
-			showButtonPanel = this._get( inst, "showButtonPanel" ),
-			hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
-			navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
-			numMonths = this._getNumberOfMonths( inst ),
-			showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
-			stepMonths = this._get( inst, "stepMonths" ),
-			isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
-			currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
-				new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
-			minDate = this._getMinMaxDate( inst, "min" ),
-			maxDate = this._getMinMaxDate( inst, "max" ),
-			drawMonth = inst.drawMonth - showCurrentAtPos,
-			drawYear = inst.drawYear;
-
-		if ( drawMonth < 0 ) {
-			drawMonth += 12;
-			drawYear--;
-		}
-		if ( maxDate ) {
-			maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
-				maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
-			maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
-			while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
-				drawMonth--;
-				if ( drawMonth < 0 ) {
-					drawMonth = 11;
-					drawYear--;
-				}
-			}
-		}
-		inst.drawMonth = drawMonth;
-		inst.drawYear = drawYear;
-
-		prevText = this._get( inst, "prevText" );
-		prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
-			this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
-			this._getFormatConfig( inst ) ) );
-
-		prev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?
-			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
-			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" :
-			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" ) );
-
-		nextText = this._get( inst, "nextText" );
-		nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
-			this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
-			this._getFormatConfig( inst ) ) );
-
-		next = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?
-			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
-			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" :
-			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" ) );
-
-		currentText = this._get( inst, "currentText" );
-		gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
-		currentText = ( !navigationAsDateFormat ? currentText :
-			this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
-
-		controls = ( !inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
-			this._get( inst, "closeText" ) + "</button>" : "" );
-
-		buttonPanel = ( showButtonPanel ) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + ( isRTL ? controls : "" ) +
-			( this._isInRange( inst, gotoDate ) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
-			">" + currentText + "</button>" : "" ) + ( isRTL ? "" : controls ) + "</div>" : "";
-
-		firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
-		firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
-
-		showWeek = this._get( inst, "showWeek" );
-		dayNames = this._get( inst, "dayNames" );
-		dayNamesMin = this._get( inst, "dayNamesMin" );
-		monthNames = this._get( inst, "monthNames" );
-		monthNamesShort = this._get( inst, "monthNamesShort" );
-		beforeShowDay = this._get( inst, "beforeShowDay" );
-		showOtherMonths = this._get( inst, "showOtherMonths" );
-		selectOtherMonths = this._get( inst, "selectOtherMonths" );
-		defaultDate = this._getDefaultDate( inst );
-		html = "";
-
-		for ( row = 0; row < numMonths[ 0 ]; row++ ) {
-			group = "";
-			this.maxRows = 4;
-			for ( col = 0; col < numMonths[ 1 ]; col++ ) {
-				selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
-				cornerClass = " ui-corner-all";
-				calender = "";
-				if ( isMultiMonth ) {
-					calender += "<div class='ui-datepicker-group";
-					if ( numMonths[ 1 ] > 1 ) {
-						switch ( col ) {
-							case 0: calender += " ui-datepicker-group-first";
-								cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
-							case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
-								cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
-							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
-						}
-					}
-					calender += "'>";
-				}
-				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
-					( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
-					( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
-					this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
-					row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
-					"</div><table class='ui-datepicker-calendar'><thead>" +
-					"<tr>";
-				thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
-				for ( dow = 0; dow < 7; dow++ ) { // days of the week
-					day = ( dow + firstDay ) % 7;
-					thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
-						"<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
-				}
-				calender += thead + "</tr></thead><tbody>";
-				daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
-				if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
-					inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
-				}
-				leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
-				curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
-				numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
-				this.maxRows = numRows;
-				printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
-				for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
-					calender += "<tr>";
-					tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
-						this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
-					for ( dow = 0; dow < 7; dow++ ) { // create date picker days
-						daySettings = ( beforeShowDay ?
-							beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
-						otherMonth = ( printDate.getMonth() !== drawMonth );
-						unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
-							( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
-						tbody += "<td class='" +
-							( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
-							( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
-							( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
-							( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
-
-							// or defaultDate is current printedDate and defaultDate is selectedDate
-							" " + this._dayOverClass : "" ) + // highlight selected day
-							( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
-							( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
-							( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
-							( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
-							( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
-							( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
-							( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
-							( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
-							( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
-							( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
-							( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
-							"' href='#'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
-						printDate.setDate( printDate.getDate() + 1 );
-						printDate = this._daylightSavingAdjust( printDate );
-					}
-					calender += tbody + "</tr>";
-				}
-				drawMonth++;
-				if ( drawMonth > 11 ) {
-					drawMonth = 0;
-					drawYear++;
-				}
-				calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
-							( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
-				group += calender;
-			}
-			html += group;
-		}
-		html += buttonPanel;
-		inst._keyEvent = false;
-		return html;
-	},
-
-	/* Generate the month and year header. */
-	_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
-			secondary, monthNames, monthNamesShort ) {
-
-		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
-			changeMonth = this._get( inst, "changeMonth" ),
-			changeYear = this._get( inst, "changeYear" ),
-			showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
-			html = "<div class='ui-datepicker-title'>",
-			monthHtml = "";
-
-		// Month selection
-		if ( secondary || !changeMonth ) {
-			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
-		} else {
-			inMinYear = ( minDate && minDate.getFullYear() === drawYear );
-			inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
-			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
-			for ( month = 0; month < 12; month++ ) {
-				if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
-					monthHtml += "<option value='" + month + "'" +
-						( month === drawMonth ? " selected='selected'" : "" ) +
-						">" + monthNamesShort[ month ] + "</option>";
-				}
-			}
-			monthHtml += "</select>";
-		}
-
-		if ( !showMonthAfterYear ) {
-			html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
-		}
-
-		// Year selection
-		if ( !inst.yearshtml ) {
-			inst.yearshtml = "";
-			if ( secondary || !changeYear ) {
-				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
-			} else {
-
-				// determine range of years to display
-				years = this._get( inst, "yearRange" ).split( ":" );
-				thisYear = new Date().getFullYear();
-				determineYear = function( value ) {
-					var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
-						( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
-						parseInt( value, 10 ) ) );
-					return ( isNaN( year ) ? thisYear : year );
-				};
-				year = determineYear( years[ 0 ] );
-				endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
-				year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
-				endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
-				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
-				for ( ; year <= endYear; year++ ) {
-					inst.yearshtml += "<option value='" + year + "'" +
-						( year === drawYear ? " selected='selected'" : "" ) +
-						">" + year + "</option>";
-				}
-				inst.yearshtml += "</select>";
-
-				html += inst.yearshtml;
-				inst.yearshtml = null;
-			}
-		}
-
-		html += this._get( inst, "yearSuffix" );
-		if ( showMonthAfterYear ) {
-			html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
-		}
-		html += "</div>"; // Close datepicker_header
-		return html;
-	},
-
-	/* Adjust one of the date sub-fields. */
-	_adjustInstDate: function( inst, offset, period ) {
-		var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
-			month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
-			day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
-			date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
-
-		inst.selectedDay = date.getDate();
-		inst.drawMonth = inst.selectedMonth = date.getMonth();
-		inst.drawYear = inst.selectedYear = date.getFullYear();
-		if ( period === "M" || period === "Y" ) {
-			this._notifyChange( inst );
-		}
-	},
-
-	/* Ensure a date is within any min/max bounds. */
-	_restrictMinMax: function( inst, date ) {
-		var minDate = this._getMinMaxDate( inst, "min" ),
-			maxDate = this._getMinMaxDate( inst, "max" ),
-			newDate = ( minDate && date < minDate ? minDate : date );
-		return ( maxDate && newDate > maxDate ? maxDate : newDate );
-	},
-
-	/* Notify change of month/year. */
-	_notifyChange: function( inst ) {
-		var onChange = this._get( inst, "onChangeMonthYear" );
-		if ( onChange ) {
-			onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
-				[ inst.selectedYear, inst.selectedMonth + 1, inst ] );
-		}
-	},
-
-	/* Determine the number of months to show. */
-	_getNumberOfMonths: function( inst ) {
-		var numMonths = this._get( inst, "numberOfMonths" );
-		return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
-	},
-
-	/* Determine the current maximum date - ensure no time components are set. */
-	_getMinMaxDate: function( inst, minMax ) {
-		return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
-	},
-
-	/* Find the number of days in a given month. */
-	_getDaysInMonth: function( year, month ) {
-		return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
-	},
-
-	/* Find the day of the week of the first of a month. */
-	_getFirstDayOfMonth: function( year, month ) {
-		return new Date( year, month, 1 ).getDay();
-	},
-
-	/* Determines if we should allow a "next/prev" month display change. */
-	_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
-		var numMonths = this._getNumberOfMonths( inst ),
-			date = this._daylightSavingAdjust( new Date( curYear,
-			curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
-
-		if ( offset < 0 ) {
-			date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
-		}
-		return this._isInRange( inst, date );
-	},
-
-	/* Is the given date in the accepted range? */
-	_isInRange: function( inst, date ) {
-		var yearSplit, currentYear,
-			minDate = this._getMinMaxDate( inst, "min" ),
-			maxDate = this._getMinMaxDate( inst, "max" ),
-			minYear = null,
-			maxYear = null,
-			years = this._get( inst, "yearRange" );
-			if ( years ) {
-				yearSplit = years.split( ":" );
-				currentYear = new Date().getFullYear();
-				minYear = parseInt( yearSplit[ 0 ], 10 );
-				maxYear = parseInt( yearSplit[ 1 ], 10 );
-				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
-					minYear += currentYear;
-				}
-				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
-					maxYear += currentYear;
-				}
-			}
-
-		return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
-			( !maxDate || date.getTime() <= maxDate.getTime() ) &&
-			( !minYear || date.getFullYear() >= minYear ) &&
-			( !maxYear || date.getFullYear() <= maxYear ) );
-	},
-
-	/* Provide the configuration settings for formatting/parsing. */
-	_getFormatConfig: function( inst ) {
-		var shortYearCutoff = this._get( inst, "shortYearCutoff" );
-		shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
-			new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
-		return { shortYearCutoff: shortYearCutoff,
-			dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
-			monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
-	},
-
-	/* Format the given date for display. */
-	_formatDate: function( inst, day, month, year ) {
-		if ( !day ) {
-			inst.currentDay = inst.selectedDay;
-			inst.currentMonth = inst.selectedMonth;
-			inst.currentYear = inst.selectedYear;
-		}
-		var date = ( day ? ( typeof day === "object" ? day :
-			this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
-			this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
-		return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
-	}
-} );
-
-/*
- * Bind hover events for datepicker elements.
- * Done via delegate so the binding only occurs once in the lifetime of the parent div.
- * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */
-function datepicker_bindHover( dpDiv ) {
-	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
-	return dpDiv.on( "mouseout", selector, function() {
-			$( this ).removeClass( "ui-state-hover" );
-			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
-				$( this ).removeClass( "ui-datepicker-prev-hover" );
-			}
-			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
-				$( this ).removeClass( "ui-datepicker-next-hover" );
-			}
-		} )
-		.on( "mouseover", selector, datepicker_handleMouseover );
-}
-
-function datepicker_handleMouseover() {
-	if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
-		$( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
-		$( this ).addClass( "ui-state-hover" );
-		if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
-			$( this ).addClass( "ui-datepicker-prev-hover" );
-		}
-		if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
-			$( this ).addClass( "ui-datepicker-next-hover" );
-		}
-	}
-}
-
-/* jQuery extend now ignores nulls! */
-function datepicker_extendRemove( target, props ) {
-	$.extend( target, props );
-	for ( var name in props ) {
-		if ( props[ name ] == null ) {
-			target[ name ] = props[ name ];
-		}
-	}
-	return target;
-}
-
-/* Invoke the datepicker functionality.
-   @param  options  string - a command, optionally followed by additional parameters or
-					Object - settings for attaching new datepicker functionality
-   @return  jQuery object */
-$.fn.datepicker = function( options ) {
-
-	/* Verify an empty collection wasn't passed - Fixes #6976 */
-	if ( !this.length ) {
-		return this;
-	}
-
-	/* Initialise the date picker. */
-	if ( !$.datepicker.initialized ) {
-		$( document ).on( "mousedown", $.datepicker._checkExternalClick );
-		$.datepicker.initialized = true;
-	}
-
-	/* Append datepicker main container to body if not exist. */
-	if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
-		$( "body" ).append( $.datepicker.dpDiv );
-	}
-
-	var otherArgs = Array.prototype.slice.call( arguments, 1 );
-	if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
-		return $.datepicker[ "_" + options + "Datepicker" ].
-			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
-	}
-	if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
-		return $.datepicker[ "_" + options + "Datepicker" ].
-			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
-	}
-	return this.each( function() {
-		typeof options === "string" ?
-			$.datepicker[ "_" + options + "Datepicker" ].
-				apply( $.datepicker, [ this ].concat( otherArgs ) ) :
-			$.datepicker._attachDatepicker( this, options );
-	} );
-};
-
-$.datepicker = new Datepicker(); // singleton instance
-$.datepicker.initialized = false;
-$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.12.1";
-
-var widgetsDatepicker = $.datepicker;
-
-
-
-
-// This file is deprecated
-var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
-
-/*!
- * jQuery UI Mouse 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Mouse
-//>>group: Widgets
-//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
-//>>docs: http://api.jqueryui.com/mouse/
-
-
-
-var mouseHandled = false;
-$( document ).on( "mouseup", function() {
-	mouseHandled = false;
-} );
-
-var widgetsMouse = $.widget( "ui.mouse", {
-	version: "1.12.1",
-	options: {
-		cancel: "input, textarea, button, select, option",
-		distance: 1,
-		delay: 0
-	},
-	_mouseInit: function() {
-		var that = this;
-
-		this.element
-			.on( "mousedown." + this.widgetName, function( event ) {
-				return that._mouseDown( event );
-			} )
-			.on( "click." + this.widgetName, function( event ) {
-				if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
-					$.removeData( event.target, that.widgetName + ".preventClickEvent" );
-					event.stopImmediatePropagation();
-					return false;
-				}
-			} );
-
-		this.started = false;
-	},
-
-	// TODO: make sure destroying one instance of mouse doesn't mess with
-	// other instances of mouse
-	_mouseDestroy: function() {
-		this.element.off( "." + this.widgetName );
-		if ( this._mouseMoveDelegate ) {
-			this.document
-				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
-				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
-		}
-	},
-
-	_mouseDown: function( event ) {
-
-		// don't let more than one widget handle mouseStart
-		if ( mouseHandled ) {
-			return;
-		}
-
-		this._mouseMoved = false;
-
-		// We may have missed mouseup (out of window)
-		( this._mouseStarted && this._mouseUp( event ) );
-
-		this._mouseDownEvent = event;
-
-		var that = this,
-			btnIsLeft = ( event.which === 1 ),
-
-			// event.target.nodeName works around a bug in IE 8 with
-			// disabled inputs (#7620)
-			elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
-				$( event.target ).closest( this.options.cancel ).length : false );
-		if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
-			return true;
-		}
-
-		this.mouseDelayMet = !this.options.delay;
-		if ( !this.mouseDelayMet ) {
-			this._mouseDelayTimer = setTimeout( function() {
-				that.mouseDelayMet = true;
-			}, this.options.delay );
-		}
-
-		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
-			this._mouseStarted = ( this._mouseStart( event ) !== false );
-			if ( !this._mouseStarted ) {
-				event.preventDefault();
-				return true;
-			}
-		}
-
-		// Click event may never have fired (Gecko & Opera)
-		if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
-			$.removeData( event.target, this.widgetName + ".preventClickEvent" );
-		}
-
-		// These delegates are required to keep context
-		this._mouseMoveDelegate = function( event ) {
-			return that._mouseMove( event );
-		};
-		this._mouseUpDelegate = function( event ) {
-			return that._mouseUp( event );
-		};
-
-		this.document
-			.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
-			.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
-		event.preventDefault();
-
-		mouseHandled = true;
-		return true;
-	},
-
-	_mouseMove: function( event ) {
-
-		// Only check for mouseups outside the document if you've moved inside the document
-		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
-		// fire a mousemove event if content is placed under the cursor. See #7778
-		// Support: IE <9
-		if ( this._mouseMoved ) {
-
-			// IE mouseup check - mouseup happened when mouse was out of window
-			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
-					!event.button ) {
-				return this._mouseUp( event );
-
-			// Iframe mouseup check - mouseup occurred in another document
-			} else if ( !event.which ) {
-
-				// Support: Safari <=8 - 9
-				// Safari sets which to 0 if you press any of the following keys
-				// during a drag (#14461)
-				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
-						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
-					this.ignoreMissingWhich = true;
-				} else if ( !this.ignoreMissingWhich ) {
-					return this._mouseUp( event );
-				}
-			}
-		}
-
-		if ( event.which || event.button ) {
-			this._mouseMoved = true;
-		}
-
-		if ( this._mouseStarted ) {
-			this._mouseDrag( event );
-			return event.preventDefault();
-		}
-
-		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
-			this._mouseStarted =
-				( this._mouseStart( this._mouseDownEvent, event ) !== false );
-			( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
-		}
-
-		return !this._mouseStarted;
-	},
-
-	_mouseUp: function( event ) {
-		this.document
-			.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
-			.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
-		if ( this._mouseStarted ) {
-			this._mouseStarted = false;
-
-			if ( event.target === this._mouseDownEvent.target ) {
-				$.data( event.target, this.widgetName + ".preventClickEvent", true );
-			}
-
-			this._mouseStop( event );
-		}
-
-		if ( this._mouseDelayTimer ) {
-			clearTimeout( this._mouseDelayTimer );
-			delete this._mouseDelayTimer;
-		}
-
-		this.ignoreMissingWhich = false;
-		mouseHandled = false;
-		event.preventDefault();
-	},
-
-	_mouseDistanceMet: function( event ) {
-		return ( Math.max(
-				Math.abs( this._mouseDownEvent.pageX - event.pageX ),
-				Math.abs( this._mouseDownEvent.pageY - event.pageY )
-			) >= this.options.distance
-		);
-	},
-
-	_mouseDelayMet: function( /* event */ ) {
-		return this.mouseDelayMet;
-	},
-
-	// These are placeholder methods, to be overriden by extending plugin
-	_mouseStart: function( /* event */ ) {},
-	_mouseDrag: function( /* event */ ) {},
-	_mouseStop: function( /* event */ ) {},
-	_mouseCapture: function( /* event */ ) { return true; }
-} );
-
-
-
-
-// $.ui.plugin is deprecated. Use $.widget() extensions instead.
-var plugin = $.ui.plugin = {
-	add: function( module, option, set ) {
-		var i,
-			proto = $.ui[ module ].prototype;
-		for ( i in set ) {
-			proto.plugins[ i ] = proto.plugins[ i ] || [];
-			proto.plugins[ i ].push( [ option, set[ i ] ] );
-		}
-	},
-	call: function( instance, name, args, allowDisconnected ) {
-		var i,
-			set = instance.plugins[ name ];
-
-		if ( !set ) {
-			return;
-		}
-
-		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
-				instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
-			return;
-		}
-
-		for ( i = 0; i < set.length; i++ ) {
-			if ( instance.options[ set[ i ][ 0 ] ] ) {
-				set[ i ][ 1 ].apply( instance.element, args );
-			}
-		}
-	}
-};
-
-
-
-var safeBlur = $.ui.safeBlur = function( element ) {
-
-	// Support: IE9 - 10 only
-	// If the <body> is blurred, IE will switch windows, see #9420
-	if ( element && element.nodeName.toLowerCase() !== "body" ) {
-		$( element ).trigger( "blur" );
-	}
-};
-
-
-/*!
- * jQuery UI Draggable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Draggable
-//>>group: Interactions
-//>>description: Enables dragging functionality for any element.
-//>>docs: http://api.jqueryui.com/draggable/
-//>>demos: http://jqueryui.com/draggable/
-//>>css.structure: ../../themes/base/draggable.css
-
-
-
-$.widget( "ui.draggable", $.ui.mouse, {
-	version: "1.12.1",
-	widgetEventPrefix: "drag",
-	options: {
-		addClasses: true,
-		appendTo: "parent",
-		axis: false,
-		connectToSortable: false,
-		containment: false,
-		cursor: "auto",
-		cursorAt: false,
-		grid: false,
-		handle: false,
-		helper: "original",
-		iframeFix: false,
-		opacity: false,
-		refreshPositions: false,
-		revert: false,
-		revertDuration: 500,
-		scope: "default",
-		scroll: true,
-		scrollSensitivity: 20,
-		scrollSpeed: 20,
-		snap: false,
-		snapMode: "both",
-		snapTolerance: 20,
-		stack: false,
-		zIndex: false,
-
-		// Callbacks
-		drag: null,
-		start: null,
-		stop: null
-	},
-	_create: function() {
-
-		if ( this.options.helper === "original" ) {
-			this._setPositionRelative();
-		}
-		if ( this.options.addClasses ) {
-			this._addClass( "ui-draggable" );
-		}
-		this._setHandleClassName();
-
-		this._mouseInit();
-	},
-
-	_setOption: function( key, value ) {
-		this._super( key, value );
-		if ( key === "handle" ) {
-			this._removeHandleClassName();
-			this._setHandleClassName();
-		}
-	},
-
-	_destroy: function() {
-		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
-			this.destroyOnClear = true;
-			return;
-		}
-		this._removeHandleClassName();
-		this._mouseDestroy();
-	},
-
-	_mouseCapture: function( event ) {
-		var o = this.options;
-
-		// Among others, prevent a drag on a resizable-handle
-		if ( this.helper || o.disabled ||
-				$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
-			return false;
-		}
-
-		//Quit if we're not on a valid handle
-		this.handle = this._getHandle( event );
-		if ( !this.handle ) {
-			return false;
-		}
-
-		this._blurActiveElement( event );
-
-		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
-
-		return true;
-
-	},
-
-	_blockFrames: function( selector ) {
-		this.iframeBlocks = this.document.find( selector ).map( function() {
-			var iframe = $( this );
-
-			return $( "<div>" )
-				.css( "position", "absolute" )
-				.appendTo( iframe.parent() )
-				.outerWidth( iframe.outerWidth() )
-				.outerHeight( iframe.outerHeight() )
-				.offset( iframe.offset() )[ 0 ];
-		} );
-	},
-
-	_unblockFrames: function() {
-		if ( this.iframeBlocks ) {
-			this.iframeBlocks.remove();
-			delete this.iframeBlocks;
-		}
-	},
-
-	_blurActiveElement: function( event ) {
-		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
-			target = $( event.target );
-
-		// Don't blur if the event occurred on an element that is within
-		// the currently focused element
-		// See #10527, #12472
-		if ( target.closest( activeElement ).length ) {
-			return;
-		}
-
-		// Blur any element that currently has focus, see #4261
-		$.ui.safeBlur( activeElement );
-	},
-
-	_mouseStart: function( event ) {
-
-		var o = this.options;
-
-		//Create and append the visible helper
-		this.helper = this._createHelper( event );
-
-		this._addClass( this.helper, "ui-draggable-dragging" );
-
-		//Cache the helper size
-		this._cacheHelperProportions();
-
-		//If ddmanager is used for droppables, set the global draggable
-		if ( $.ui.ddmanager ) {
-			$.ui.ddmanager.current = this;
-		}
-
-		/*
-		 * - Position generation -
-		 * This block generates everything position related - it's the core of draggables.
-		 */
-
-		//Cache the margins of the original element
-		this._cacheMargins();
-
-		//Store the helper's css position
-		this.cssPosition = this.helper.css( "position" );
-		this.scrollParent = this.helper.scrollParent( true );
-		this.offsetParent = this.helper.offsetParent();
-		this.hasFixedAncestor = this.helper.parents().filter( function() {
-				return $( this ).css( "position" ) === "fixed";
-			} ).length > 0;
-
-		//The element's absolute position on the page minus margins
-		this.positionAbs = this.element.offset();
-		this._refreshOffsets( event );
-
-		//Generate the original position
-		this.originalPosition = this.position = this._generatePosition( event, false );
-		this.originalPageX = event.pageX;
-		this.originalPageY = event.pageY;
-
-		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
-		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
-
-		//Set a containment if given in the options
-		this._setContainment();
-
-		//Trigger event + callbacks
-		if ( this._trigger( "start", event ) === false ) {
-			this._clear();
-			return false;
-		}
-
-		//Recache the helper size
-		this._cacheHelperProportions();
-
-		//Prepare the droppable offsets
-		if ( $.ui.ddmanager && !o.dropBehaviour ) {
-			$.ui.ddmanager.prepareOffsets( this, event );
-		}
-
-		// Execute the drag once - this causes the helper not to be visible before getting its
-		// correct position
-		this._mouseDrag( event, true );
-
-		// If the ddmanager is used for droppables, inform the manager that dragging has started
-		// (see #5003)
-		if ( $.ui.ddmanager ) {
-			$.ui.ddmanager.dragStart( this, event );
-		}
-
-		return true;
-	},
-
-	_refreshOffsets: function( event ) {
-		this.offset = {
-			top: this.positionAbs.top - this.margins.top,
-			left: this.positionAbs.left - this.margins.left,
-			scroll: false,
-			parent: this._getParentOffset(),
-			relative: this._getRelativeOffset()
-		};
-
-		this.offset.click = {
-			left: event.pageX - this.offset.left,
-			top: event.pageY - this.offset.top
-		};
-	},
-
-	_mouseDrag: function( event, noPropagation ) {
-
-		// reset any necessary cached properties (see #5009)
-		if ( this.hasFixedAncestor ) {
-			this.offset.parent = this._getParentOffset();
-		}
-
-		//Compute the helpers position
-		this.position = this._generatePosition( event, true );
-		this.positionAbs = this._convertPositionTo( "absolute" );
-
-		//Call plugins and callbacks and use the resulting position if something is returned
-		if ( !noPropagation ) {
-			var ui = this._uiHash();
-			if ( this._trigger( "drag", event, ui ) === false ) {
-				this._mouseUp( new $.Event( "mouseup", event ) );
-				return false;
-			}
-			this.position = ui.position;
-		}
-
-		this.helper[ 0 ].style.left = this.position.left + "px";
-		this.helper[ 0 ].style.top = this.position.top + "px";
-
-		if ( $.ui.ddmanager ) {
-			$.ui.ddmanager.drag( this, event );
-		}
-
-		return false;
-	},
-
-	_mouseStop: function( event ) {
-
-		//If we are using droppables, inform the manager about the drop
-		var that = this,
-			dropped = false;
-		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
-			dropped = $.ui.ddmanager.drop( this, event );
-		}
-
-		//if a drop comes from outside (a sortable)
-		if ( this.dropped ) {
-			dropped = this.dropped;
-			this.dropped = false;
-		}
-
-		if ( ( this.options.revert === "invalid" && !dropped ) ||
-				( this.options.revert === "valid" && dropped ) ||
-				this.options.revert === true || ( $.isFunction( this.options.revert ) &&
-				this.options.revert.call( this.element, dropped ) )
-		) {
-			$( this.helper ).animate(
-				this.originalPosition,
-				parseInt( this.options.revertDuration, 10 ),
-				function() {
-					if ( that._trigger( "stop", event ) !== false ) {
-						that._clear();
-					}
-				}
-			);
-		} else {
-			if ( this._trigger( "stop", event ) !== false ) {
-				this._clear();
-			}
-		}
-
-		return false;
-	},
-
-	_mouseUp: function( event ) {
-		this._unblockFrames();
-
-		// If the ddmanager is used for droppables, inform the manager that dragging has stopped
-		// (see #5003)
-		if ( $.ui.ddmanager ) {
-			$.ui.ddmanager.dragStop( this, event );
-		}
-
-		// Only need to focus if the event occurred on the draggable itself, see #10527
-		if ( this.handleElement.is( event.target ) ) {
-
-			// The interaction is over; whether or not the click resulted in a drag,
-			// focus the element
-			this.element.trigger( "focus" );
-		}
-
-		return $.ui.mouse.prototype._mouseUp.call( this, event );
-	},
-
-	cancel: function() {
-
-		if ( this.helper.is( ".ui-draggable-dragging" ) ) {
-			this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
-		} else {
-			this._clear();
-		}
-
-		return this;
-
-	},
-
-	_getHandle: function( event ) {
-		return this.options.handle ?
-			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
-			true;
-	},
-
-	_setHandleClassName: function() {
-		this.handleElement = this.options.handle ?
-			this.element.find( this.options.handle ) : this.element;
-		this._addClass( this.handleElement, "ui-draggable-handle" );
-	},
-
-	_removeHandleClassName: function() {
-		this._removeClass( this.handleElement, "ui-draggable-handle" );
-	},
-
-	_createHelper: function( event ) {
-
-		var o = this.options,
-			helperIsFunction = $.isFunction( o.helper ),
-			helper = helperIsFunction ?
-				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
-				( o.helper === "clone" ?
-					this.element.clone().removeAttr( "id" ) :
-					this.element );
-
-		if ( !helper.parents( "body" ).length ) {
-			helper.appendTo( ( o.appendTo === "parent" ?
-				this.element[ 0 ].parentNode :
-				o.appendTo ) );
-		}
-
-		// Http://bugs.jqueryui.com/ticket/9446
-		// a helper function can return the original element
-		// which wouldn't have been set to relative in _create
-		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
-			this._setPositionRelative();
-		}
-
-		if ( helper[ 0 ] !== this.element[ 0 ] &&
-				!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
-			helper.css( "position", "absolute" );
-		}
-
-		return helper;
-
-	},
-
-	_setPositionRelative: function() {
-		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
-			this.element[ 0 ].style.position = "relative";
-		}
-	},
-
-	_adjustOffsetFromHelper: function( obj ) {
-		if ( typeof obj === "string" ) {
-			obj = obj.split( " " );
-		}
-		if ( $.isArray( obj ) ) {
-			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
-		}
-		if ( "left" in obj ) {
-			this.offset.click.left = obj.left + this.margins.left;
-		}
-		if ( "right" in obj ) {
-			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-		}
-		if ( "top" in obj ) {
-			this.offset.click.top = obj.top + this.margins.top;
-		}
-		if ( "bottom" in obj ) {
-			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-		}
-	},
-
-	_isRootNode: function( element ) {
-		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
-	},
-
-	_getParentOffset: function() {
-
-		//Get the offsetParent and cache its position
-		var po = this.offsetParent.offset(),
-			document = this.document[ 0 ];
-
-		// This is a special case where we need to modify a offset calculated on start, since the
-		// following happened:
-		// 1. The position of the helper is absolute, so it's position is calculated based on the
-		// next positioned parent
-		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
-		// the document, which means that the scroll is included in the initial calculation of the
-		// offset of the parent, and never recalculated upon drag
-		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
-				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
-			po.left += this.scrollParent.scrollLeft();
-			po.top += this.scrollParent.scrollTop();
-		}
-
-		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
-			po = { top: 0, left: 0 };
-		}
-
-		return {
-			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
-			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
-		};
-
-	},
-
-	_getRelativeOffset: function() {
-		if ( this.cssPosition !== "relative" ) {
-			return { top: 0, left: 0 };
-		}
-
-		var p = this.element.position(),
-			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
-
-		return {
-			top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
-				( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
-			left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
-				( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
-		};
-
-	},
-
-	_cacheMargins: function() {
-		this.margins = {
-			left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
-			top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
-			right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
-			bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
-		};
-	},
-
-	_cacheHelperProportions: function() {
-		this.helperProportions = {
-			width: this.helper.outerWidth(),
-			height: this.helper.outerHeight()
-		};
-	},
-
-	_setContainment: function() {
-
-		var isUserScrollable, c, ce,
-			o = this.options,
-			document = this.document[ 0 ];
-
-		this.relativeContainer = null;
-
-		if ( !o.containment ) {
-			this.containment = null;
-			return;
-		}
-
-		if ( o.containment === "window" ) {
-			this.containment = [
-				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
-				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
-				$( window ).scrollLeft() + $( window ).width() -
-					this.helperProportions.width - this.margins.left,
-				$( window ).scrollTop() +
-					( $( window ).height() || document.body.parentNode.scrollHeight ) -
-					this.helperProportions.height - this.margins.top
-			];
-			return;
-		}
-
-		if ( o.containment === "document" ) {
-			this.containment = [
-				0,
-				0,
-				$( document ).width() - this.helperProportions.width - this.margins.left,
-				( $( document ).height() || document.body.parentNode.scrollHeight ) -
-					this.helperProportions.height - this.margins.top
-			];
-			return;
-		}
-
-		if ( o.containment.constructor === Array ) {
-			this.containment = o.containment;
-			return;
-		}
-
-		if ( o.containment === "parent" ) {
-			o.containment = this.helper[ 0 ].parentNode;
-		}
-
-		c = $( o.containment );
-		ce = c[ 0 ];
-
-		if ( !ce ) {
-			return;
-		}
-
-		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
-
-		this.containment = [
-			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
-				( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
-			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
-				( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
-			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
-				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
-				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
-				this.helperProportions.width -
-				this.margins.left -
-				this.margins.right,
-			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
-				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
-				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
-				this.helperProportions.height -
-				this.margins.top -
-				this.margins.bottom
-		];
-		this.relativeContainer = c;
-	},
-
-	_convertPositionTo: function( d, pos ) {
-
-		if ( !pos ) {
-			pos = this.position;
-		}
-
-		var mod = d === "absolute" ? 1 : -1,
-			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
-
-		return {
-			top: (
-
-				// The absolute mouse position
-				pos.top	+
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.top * mod +
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.top * mod -
-				( ( this.cssPosition === "fixed" ?
-					-this.offset.scroll.top :
-					( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
-			),
-			left: (
-
-				// The absolute mouse position
-				pos.left +
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.left * mod +
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.left * mod	-
-				( ( this.cssPosition === "fixed" ?
-					-this.offset.scroll.left :
-					( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
-			)
-		};
-
-	},
-
-	_generatePosition: function( event, constrainPosition ) {
-
-		var containment, co, top, left,
-			o = this.options,
-			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
-			pageX = event.pageX,
-			pageY = event.pageY;
-
-		// Cache the scroll
-		if ( !scrollIsRootNode || !this.offset.scroll ) {
-			this.offset.scroll = {
-				top: this.scrollParent.scrollTop(),
-				left: this.scrollParent.scrollLeft()
-			};
-		}
-
-		/*
-		 * - Position constraining -
-		 * Constrain the position to a mix of grid, containment.
-		 */
-
-		// If we are not dragging yet, we won't check for options
-		if ( constrainPosition ) {
-			if ( this.containment ) {
-				if ( this.relativeContainer ) {
-					co = this.relativeContainer.offset();
-					containment = [
-						this.containment[ 0 ] + co.left,
-						this.containment[ 1 ] + co.top,
-						this.containment[ 2 ] + co.left,
-						this.containment[ 3 ] + co.top
-					];
-				} else {
-					containment = this.containment;
-				}
-
-				if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
-					pageX = containment[ 0 ] + this.offset.click.left;
-				}
-				if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
-					pageY = containment[ 1 ] + this.offset.click.top;
-				}
-				if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
-					pageX = containment[ 2 ] + this.offset.click.left;
-				}
-				if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
-					pageY = containment[ 3 ] + this.offset.click.top;
-				}
-			}
-
-			if ( o.grid ) {
-
-				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
-				// argument errors in IE (see ticket #6950)
-				top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
-					this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
-				pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
-					top - this.offset.click.top > containment[ 3 ] ) ?
-						top :
-						( ( top - this.offset.click.top >= containment[ 1 ] ) ?
-							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
-
-				left = o.grid[ 0 ] ? this.originalPageX +
-					Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
-					this.originalPageX;
-				pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
-					left - this.offset.click.left > containment[ 2 ] ) ?
-						left :
-						( ( left - this.offset.click.left >= containment[ 0 ] ) ?
-							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
-			}
-
-			if ( o.axis === "y" ) {
-				pageX = this.originalPageX;
-			}
-
-			if ( o.axis === "x" ) {
-				pageY = this.originalPageY;
-			}
-		}
-
-		return {
-			top: (
-
-				// The absolute mouse position
-				pageY -
-
-				// Click offset (relative to the element)
-				this.offset.click.top -
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.top -
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.top +
-				( this.cssPosition === "fixed" ?
-					-this.offset.scroll.top :
-					( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
-			),
-			left: (
-
-				// The absolute mouse position
-				pageX -
-
-				// Click offset (relative to the element)
-				this.offset.click.left -
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.left -
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.left +
-				( this.cssPosition === "fixed" ?
-					-this.offset.scroll.left :
-					( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
-			)
-		};
-
-	},
-
-	_clear: function() {
-		this._removeClass( this.helper, "ui-draggable-dragging" );
-		if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
-			this.helper.remove();
-		}
-		this.helper = null;
-		this.cancelHelperRemoval = false;
-		if ( this.destroyOnClear ) {
-			this.destroy();
-		}
-	},
-
-	// From now on bulk stuff - mainly helpers
-
-	_trigger: function( type, event, ui ) {
-		ui = ui || this._uiHash();
-		$.ui.plugin.call( this, type, [ event, ui, this ], true );
-
-		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
-		if ( /^(drag|start|stop)/.test( type ) ) {
-			this.positionAbs = this._convertPositionTo( "absolute" );
-			ui.offset = this.positionAbs;
-		}
-		return $.Widget.prototype._trigger.call( this, type, event, ui );
-	},
-
-	plugins: {},
-
-	_uiHash: function() {
-		return {
-			helper: this.helper,
-			position: this.position,
-			originalPosition: this.originalPosition,
-			offset: this.positionAbs
-		};
-	}
-
-} );
-
-$.ui.plugin.add( "draggable", "connectToSortable", {
-	start: function( event, ui, draggable ) {
-		var uiSortable = $.extend( {}, ui, {
-			item: draggable.element
-		} );
-
-		draggable.sortables = [];
-		$( draggable.options.connectToSortable ).each( function() {
-			var sortable = $( this ).sortable( "instance" );
-
-			if ( sortable && !sortable.options.disabled ) {
-				draggable.sortables.push( sortable );
-
-				// RefreshPositions is called at drag start to refresh the containerCache
-				// which is used in drag. This ensures it's initialized and synchronized
-				// with any changes that might have happened on the page since initialization.
-				sortable.refreshPositions();
-				sortable._trigger( "activate", event, uiSortable );
-			}
-		} );
-	},
-	stop: function( event, ui, draggable ) {
-		var uiSortable = $.extend( {}, ui, {
-			item: draggable.element
-		} );
-
-		draggable.cancelHelperRemoval = false;
-
-		$.each( draggable.sortables, function() {
-			var sortable = this;
-
-			if ( sortable.isOver ) {
-				sortable.isOver = 0;
-
-				// Allow this sortable to handle removing the helper
-				draggable.cancelHelperRemoval = true;
-				sortable.cancelHelperRemoval = false;
-
-				// Use _storedCSS To restore properties in the sortable,
-				// as this also handles revert (#9675) since the draggable
-				// may have modified them in unexpected ways (#8809)
-				sortable._storedCSS = {
-					position: sortable.placeholder.css( "position" ),
-					top: sortable.placeholder.css( "top" ),
-					left: sortable.placeholder.css( "left" )
-				};
-
-				sortable._mouseStop( event );
-
-				// Once drag has ended, the sortable should return to using
-				// its original helper, not the shared helper from draggable
-				sortable.options.helper = sortable.options._helper;
-			} else {
-
-				// Prevent this Sortable from removing the helper.
-				// However, don't set the draggable to remove the helper
-				// either as another connected Sortable may yet handle the removal.
-				sortable.cancelHelperRemoval = true;
-
-				sortable._trigger( "deactivate", event, uiSortable );
-			}
-		} );
-	},
-	drag: function( event, ui, draggable ) {
-		$.each( draggable.sortables, function() {
-			var innermostIntersecting = false,
-				sortable = this;
-
-			// Copy over variables that sortable's _intersectsWith uses
-			sortable.positionAbs = draggable.positionAbs;
-			sortable.helperProportions = draggable.helperProportions;
-			sortable.offset.click = draggable.offset.click;
-
-			if ( sortable._intersectsWith( sortable.containerCache ) ) {
-				innermostIntersecting = true;
-
-				$.each( draggable.sortables, function() {
-
-					// Copy over variables that sortable's _intersectsWith uses
-					this.positionAbs = draggable.positionAbs;
-					this.helperProportions = draggable.helperProportions;
-					this.offset.click = draggable.offset.click;
-
-					if ( this !== sortable &&
-							this._intersectsWith( this.containerCache ) &&
-							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
-						innermostIntersecting = false;
-					}
-
-					return innermostIntersecting;
-				} );
-			}
-
-			if ( innermostIntersecting ) {
-
-				// If it intersects, we use a little isOver variable and set it once,
-				// so that the move-in stuff gets fired only once.
-				if ( !sortable.isOver ) {
-					sortable.isOver = 1;
-
-					// Store draggable's parent in case we need to reappend to it later.
-					draggable._parent = ui.helper.parent();
-
-					sortable.currentItem = ui.helper
-						.appendTo( sortable.element )
-						.data( "ui-sortable-item", true );
-
-					// Store helper option to later restore it
-					sortable.options._helper = sortable.options.helper;
-
-					sortable.options.helper = function() {
-						return ui.helper[ 0 ];
-					};
-
-					// Fire the start events of the sortable with our passed browser event,
-					// and our own helper (so it doesn't create a new one)
-					event.target = sortable.currentItem[ 0 ];
-					sortable._mouseCapture( event, true );
-					sortable._mouseStart( event, true, true );
-
-					// Because the browser event is way off the new appended portlet,
-					// modify necessary variables to reflect the changes
-					sortable.offset.click.top = draggable.offset.click.top;
-					sortable.offset.click.left = draggable.offset.click.left;
-					sortable.offset.parent.left -= draggable.offset.parent.left -
-						sortable.offset.parent.left;
-					sortable.offset.parent.top -= draggable.offset.parent.top -
-						sortable.offset.parent.top;
-
-					draggable._trigger( "toSortable", event );
-
-					// Inform draggable that the helper is in a valid drop zone,
-					// used solely in the revert option to handle "valid/invalid".
-					draggable.dropped = sortable.element;
-
-					// Need to refreshPositions of all sortables in the case that
-					// adding to one sortable changes the location of the other sortables (#9675)
-					$.each( draggable.sortables, function() {
-						this.refreshPositions();
-					} );
-
-					// Hack so receive/update callbacks work (mostly)
-					draggable.currentItem = draggable.element;
-					sortable.fromOutside = draggable;
-				}
-
-				if ( sortable.currentItem ) {
-					sortable._mouseDrag( event );
-
-					// Copy the sortable's position because the draggable's can potentially reflect
-					// a relative position, while sortable is always absolute, which the dragged
-					// element has now become. (#8809)
-					ui.position = sortable.position;
-				}
-			} else {
-
-				// If it doesn't intersect with the sortable, and it intersected before,
-				// we fake the drag stop of the sortable, but make sure it doesn't remove
-				// the helper by using cancelHelperRemoval.
-				if ( sortable.isOver ) {
-
-					sortable.isOver = 0;
-					sortable.cancelHelperRemoval = true;
-
-					// Calling sortable's mouseStop would trigger a revert,
-					// so revert must be temporarily false until after mouseStop is called.
-					sortable.options._revert = sortable.options.revert;
-					sortable.options.revert = false;
-
-					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
-					sortable._mouseStop( event, true );
-
-					// Restore sortable behaviors that were modfied
-					// when the draggable entered the sortable area (#9481)
-					sortable.options.revert = sortable.options._revert;
-					sortable.options.helper = sortable.options._helper;
-
-					if ( sortable.placeholder ) {
-						sortable.placeholder.remove();
-					}
-
-					// Restore and recalculate the draggable's offset considering the sortable
-					// may have modified them in unexpected ways. (#8809, #10669)
-					ui.helper.appendTo( draggable._parent );
-					draggable._refreshOffsets( event );
-					ui.position = draggable._generatePosition( event, true );
-
-					draggable._trigger( "fromSortable", event );
-
-					// Inform draggable that the helper is no longer in a valid drop zone
-					draggable.dropped = false;
-
-					// Need to refreshPositions of all sortables just in case removing
-					// from one sortable changes the location of other sortables (#9675)
-					$.each( draggable.sortables, function() {
-						this.refreshPositions();
-					} );
-				}
-			}
-		} );
-	}
-} );
-
-$.ui.plugin.add( "draggable", "cursor", {
-	start: function( event, ui, instance ) {
-		var t = $( "body" ),
-			o = instance.options;
-
-		if ( t.css( "cursor" ) ) {
-			o._cursor = t.css( "cursor" );
-		}
-		t.css( "cursor", o.cursor );
-	},
-	stop: function( event, ui, instance ) {
-		var o = instance.options;
-		if ( o._cursor ) {
-			$( "body" ).css( "cursor", o._cursor );
-		}
-	}
-} );
-
-$.ui.plugin.add( "draggable", "opacity", {
-	start: function( event, ui, instance ) {
-		var t = $( ui.helper ),
-			o = instance.options;
-		if ( t.css( "opacity" ) ) {
-			o._opacity = t.css( "opacity" );
-		}
-		t.css( "opacity", o.opacity );
-	},
-	stop: function( event, ui, instance ) {
-		var o = instance.options;
-		if ( o._opacity ) {
-			$( ui.helper ).css( "opacity", o._opacity );
-		}
-	}
-} );
-
-$.ui.plugin.add( "draggable", "scroll", {
-	start: function( event, ui, i ) {
-		if ( !i.scrollParentNotHidden ) {
-			i.scrollParentNotHidden = i.helper.scrollParent( false );
-		}
-
-		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
-				i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
-			i.overflowOffset = i.scrollParentNotHidden.offset();
-		}
-	},
-	drag: function( event, ui, i  ) {
-
-		var o = i.options,
-			scrolled = false,
-			scrollParent = i.scrollParentNotHidden[ 0 ],
-			document = i.document[ 0 ];
-
-		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
-			if ( !o.axis || o.axis !== "x" ) {
-				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
-						o.scrollSensitivity ) {
-					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
-				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
-					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
-				}
-			}
-
-			if ( !o.axis || o.axis !== "y" ) {
-				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
-						o.scrollSensitivity ) {
-					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
-				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
-					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
-				}
-			}
-
-		} else {
-
-			if ( !o.axis || o.axis !== "x" ) {
-				if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
-					scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
-				} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
-						o.scrollSensitivity ) {
-					scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
-				}
-			}
-
-			if ( !o.axis || o.axis !== "y" ) {
-				if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
-					scrolled = $( document ).scrollLeft(
-						$( document ).scrollLeft() - o.scrollSpeed
-					);
-				} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
-						o.scrollSensitivity ) {
-					scrolled = $( document ).scrollLeft(
-						$( document ).scrollLeft() + o.scrollSpeed
-					);
-				}
-			}
-
-		}
-
-		if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
-			$.ui.ddmanager.prepareOffsets( i, event );
-		}
-
-	}
-} );
-
-$.ui.plugin.add( "draggable", "snap", {
-	start: function( event, ui, i ) {
-
-		var o = i.options;
-
-		i.snapElements = [];
-
-		$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
-			.each( function() {
-				var $t = $( this ),
-					$o = $t.offset();
-				if ( this !== i.element[ 0 ] ) {
-					i.snapElements.push( {
-						item: this,
-						width: $t.outerWidth(), height: $t.outerHeight(),
-						top: $o.top, left: $o.left
-					} );
-				}
-			} );
-
-	},
-	drag: function( event, ui, inst ) {
-
-		var ts, bs, ls, rs, l, r, t, b, i, first,
-			o = inst.options,
-			d = o.snapTolerance,
-			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
-			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
-
-		for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
-
-			l = inst.snapElements[ i ].left - inst.margins.left;
-			r = l + inst.snapElements[ i ].width;
-			t = inst.snapElements[ i ].top - inst.margins.top;
-			b = t + inst.snapElements[ i ].height;
-
-			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
-					!$.contains( inst.snapElements[ i ].item.ownerDocument,
-					inst.snapElements[ i ].item ) ) {
-				if ( inst.snapElements[ i ].snapping ) {
-					( inst.options.snap.release &&
-						inst.options.snap.release.call(
-							inst.element,
-							event,
-							$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
-						) );
-				}
-				inst.snapElements[ i ].snapping = false;
-				continue;
-			}
-
-			if ( o.snapMode !== "inner" ) {
-				ts = Math.abs( t - y2 ) <= d;
-				bs = Math.abs( b - y1 ) <= d;
-				ls = Math.abs( l - x2 ) <= d;
-				rs = Math.abs( r - x1 ) <= d;
-				if ( ts ) {
-					ui.position.top = inst._convertPositionTo( "relative", {
-						top: t - inst.helperProportions.height,
-						left: 0
-					} ).top;
-				}
-				if ( bs ) {
-					ui.position.top = inst._convertPositionTo( "relative", {
-						top: b,
-						left: 0
-					} ).top;
-				}
-				if ( ls ) {
-					ui.position.left = inst._convertPositionTo( "relative", {
-						top: 0,
-						left: l - inst.helperProportions.width
-					} ).left;
-				}
-				if ( rs ) {
-					ui.position.left = inst._convertPositionTo( "relative", {
-						top: 0,
-						left: r
-					} ).left;
-				}
-			}
-
-			first = ( ts || bs || ls || rs );
-
-			if ( o.snapMode !== "outer" ) {
-				ts = Math.abs( t - y1 ) <= d;
-				bs = Math.abs( b - y2 ) <= d;
-				ls = Math.abs( l - x1 ) <= d;
-				rs = Math.abs( r - x2 ) <= d;
-				if ( ts ) {
-					ui.position.top = inst._convertPositionTo( "relative", {
-						top: t,
-						left: 0
-					} ).top;
-				}
-				if ( bs ) {
-					ui.position.top = inst._convertPositionTo( "relative", {
-						top: b - inst.helperProportions.height,
-						left: 0
-					} ).top;
-				}
-				if ( ls ) {
-					ui.position.left = inst._convertPositionTo( "relative", {
-						top: 0,
-						left: l
-					} ).left;
-				}
-				if ( rs ) {
-					ui.position.left = inst._convertPositionTo( "relative", {
-						top: 0,
-						left: r - inst.helperProportions.width
-					} ).left;
-				}
-			}
-
-			if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
-				( inst.options.snap.snap &&
-					inst.options.snap.snap.call(
-						inst.element,
-						event,
-						$.extend( inst._uiHash(), {
-							snapItem: inst.snapElements[ i ].item
-						} ) ) );
-			}
-			inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
-
-		}
-
-	}
-} );
-
-$.ui.plugin.add( "draggable", "stack", {
-	start: function( event, ui, instance ) {
-		var min,
-			o = instance.options,
-			group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
-				return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
-					( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
-			} );
-
-		if ( !group.length ) { return; }
-
-		min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
-		$( group ).each( function( i ) {
-			$( this ).css( "zIndex", min + i );
-		} );
-		this.css( "zIndex", ( min + group.length ) );
-	}
-} );
-
-$.ui.plugin.add( "draggable", "zIndex", {
-	start: function( event, ui, instance ) {
-		var t = $( ui.helper ),
-			o = instance.options;
-
-		if ( t.css( "zIndex" ) ) {
-			o._zIndex = t.css( "zIndex" );
-		}
-		t.css( "zIndex", o.zIndex );
-	},
-	stop: function( event, ui, instance ) {
-		var o = instance.options;
-
-		if ( o._zIndex ) {
-			$( ui.helper ).css( "zIndex", o._zIndex );
-		}
-	}
-} );
-
-var widgetsDraggable = $.ui.draggable;
-
-
-/*!
- * jQuery UI Resizable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Resizable
-//>>group: Interactions
-//>>description: Enables resize functionality for any element.
-//>>docs: http://api.jqueryui.com/resizable/
-//>>demos: http://jqueryui.com/resizable/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/resizable.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.resizable", $.ui.mouse, {
-	version: "1.12.1",
-	widgetEventPrefix: "resize",
-	options: {
-		alsoResize: false,
-		animate: false,
-		animateDuration: "slow",
-		animateEasing: "swing",
-		aspectRatio: false,
-		autoHide: false,
-		classes: {
-			"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
-		},
-		containment: false,
-		ghost: false,
-		grid: false,
-		handles: "e,s,se",
-		helper: false,
-		maxHeight: null,
-		maxWidth: null,
-		minHeight: 10,
-		minWidth: 10,
-
-		// See #7960
-		zIndex: 90,
-
-		// Callbacks
-		resize: null,
-		start: null,
-		stop: null
-	},
-
-	_num: function( value ) {
-		return parseFloat( value ) || 0;
-	},
-
-	_isNumber: function( value ) {
-		return !isNaN( parseFloat( value ) );
-	},
-
-	_hasScroll: function( el, a ) {
-
-		if ( $( el ).css( "overflow" ) === "hidden" ) {
-			return false;
-		}
-
-		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
-			has = false;
-
-		if ( el[ scroll ] > 0 ) {
-			return true;
-		}
-
-		// TODO: determine which cases actually cause this to happen
-		// if the element doesn't have the scroll set, see if it's possible to
-		// set the scroll
-		el[ scroll ] = 1;
-		has = ( el[ scroll ] > 0 );
-		el[ scroll ] = 0;
-		return has;
-	},
-
-	_create: function() {
-
-		var margins,
-			o = this.options,
-			that = this;
-		this._addClass( "ui-resizable" );
-
-		$.extend( this, {
-			_aspectRatio: !!( o.aspectRatio ),
-			aspectRatio: o.aspectRatio,
-			originalElement: this.element,
-			_proportionallyResizeElements: [],
-			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
-		} );
-
-		// Wrap the element if it cannot hold child nodes
-		if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
-
-			this.element.wrap(
-				$( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ).css( {
-					position: this.element.css( "position" ),
-					width: this.element.outerWidth(),
-					height: this.element.outerHeight(),
-					top: this.element.css( "top" ),
-					left: this.element.css( "left" )
-				} )
-			);
-
-			this.element = this.element.parent().data(
-				"ui-resizable", this.element.resizable( "instance" )
-			);
-
-			this.elementIsWrapper = true;
-
-			margins = {
-				marginTop: this.originalElement.css( "marginTop" ),
-				marginRight: this.originalElement.css( "marginRight" ),
-				marginBottom: this.originalElement.css( "marginBottom" ),
-				marginLeft: this.originalElement.css( "marginLeft" )
-			};
-
-			this.element.css( margins );
-			this.originalElement.css( "margin", 0 );
-
-			// support: Safari
-			// Prevent Safari textarea resize
-			this.originalResizeStyle = this.originalElement.css( "resize" );
-			this.originalElement.css( "resize", "none" );
-
-			this._proportionallyResizeElements.push( this.originalElement.css( {
-				position: "static",
-				zoom: 1,
-				display: "block"
-			} ) );
-
-			// Support: IE9
-			// avoid IE jump (hard set the margin)
-			this.originalElement.css( margins );
-
-			this._proportionallyResize();
-		}
-
-		this._setupHandles();
-
-		if ( o.autoHide ) {
-			$( this.element )
-				.on( "mouseenter", function() {
-					if ( o.disabled ) {
-						return;
-					}
-					that._removeClass( "ui-resizable-autohide" );
-					that._handles.show();
-				} )
-				.on( "mouseleave", function() {
-					if ( o.disabled ) {
-						return;
-					}
-					if ( !that.resizing ) {
-						that._addClass( "ui-resizable-autohide" );
-						that._handles.hide();
-					}
-				} );
-		}
-
-		this._mouseInit();
-	},
-
-	_destroy: function() {
-
-		this._mouseDestroy();
-
-		var wrapper,
-			_destroy = function( exp ) {
-				$( exp )
-					.removeData( "resizable" )
-					.removeData( "ui-resizable" )
-					.off( ".resizable" )
-					.find( ".ui-resizable-handle" )
-						.remove();
-			};
-
-		// TODO: Unwrap at same DOM position
-		if ( this.elementIsWrapper ) {
-			_destroy( this.element );
-			wrapper = this.element;
-			this.originalElement.css( {
-				position: wrapper.css( "position" ),
-				width: wrapper.outerWidth(),
-				height: wrapper.outerHeight(),
-				top: wrapper.css( "top" ),
-				left: wrapper.css( "left" )
-			} ).insertAfter( wrapper );
-			wrapper.remove();
-		}
-
-		this.originalElement.css( "resize", this.originalResizeStyle );
-		_destroy( this.originalElement );
-
-		return this;
-	},
-
-	_setOption: function( key, value ) {
-		this._super( key, value );
-
-		switch ( key ) {
-		case "handles":
-			this._removeHandles();
-			this._setupHandles();
-			break;
-		default:
-			break;
-		}
-	},
-
-	_setupHandles: function() {
-		var o = this.options, handle, i, n, hname, axis, that = this;
-		this.handles = o.handles ||
-			( !$( ".ui-resizable-handle", this.element ).length ?
-				"e,s,se" : {
-					n: ".ui-resizable-n",
-					e: ".ui-resizable-e",
-					s: ".ui-resizable-s",
-					w: ".ui-resizable-w",
-					se: ".ui-resizable-se",
-					sw: ".ui-resizable-sw",
-					ne: ".ui-resizable-ne",
-					nw: ".ui-resizable-nw"
-				} );
-
-		this._handles = $();
-		if ( this.handles.constructor === String ) {
-
-			if ( this.handles === "all" ) {
-				this.handles = "n,e,s,w,se,sw,ne,nw";
-			}
-
-			n = this.handles.split( "," );
-			this.handles = {};
-
-			for ( i = 0; i < n.length; i++ ) {
-
-				handle = $.trim( n[ i ] );
-				hname = "ui-resizable-" + handle;
-				axis = $( "<div>" );
-				this._addClass( axis, "ui-resizable-handle " + hname );
-
-				axis.css( { zIndex: o.zIndex } );
-
-				this.handles[ handle ] = ".ui-resizable-" + handle;
-				this.element.append( axis );
-			}
-
-		}
-
-		this._renderAxis = function( target ) {
-
-			var i, axis, padPos, padWrapper;
-
-			target = target || this.element;
-
-			for ( i in this.handles ) {
-
-				if ( this.handles[ i ].constructor === String ) {
-					this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
-				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
-					this.handles[ i ] = $( this.handles[ i ] );
-					this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
-				}
-
-				if ( this.elementIsWrapper &&
-						this.originalElement[ 0 ]
-							.nodeName
-							.match( /^(textarea|input|select|button)$/i ) ) {
-					axis = $( this.handles[ i ], this.element );
-
-					padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
-						axis.outerHeight() :
-						axis.outerWidth();
-
-					padPos = [ "padding",
-						/ne|nw|n/.test( i ) ? "Top" :
-						/se|sw|s/.test( i ) ? "Bottom" :
-						/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
-
-					target.css( padPos, padWrapper );
-
-					this._proportionallyResize();
-				}
-
-				this._handles = this._handles.add( this.handles[ i ] );
-			}
-		};
-
-		// TODO: make renderAxis a prototype function
-		this._renderAxis( this.element );
-
-		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
-		this._handles.disableSelection();
-
-		this._handles.on( "mouseover", function() {
-			if ( !that.resizing ) {
-				if ( this.className ) {
-					axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
-				}
-				that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
-			}
-		} );
-
-		if ( o.autoHide ) {
-			this._handles.hide();
-			this._addClass( "ui-resizable-autohide" );
-		}
-	},
-
-	_removeHandles: function() {
-		this._handles.remove();
-	},
-
-	_mouseCapture: function( event ) {
-		var i, handle,
-			capture = false;
-
-		for ( i in this.handles ) {
-			handle = $( this.handles[ i ] )[ 0 ];
-			if ( handle === event.target || $.contains( handle, event.target ) ) {
-				capture = true;
-			}
-		}
-
-		return !this.options.disabled && capture;
-	},
-
-	_mouseStart: function( event ) {
-
-		var curleft, curtop, cursor,
-			o = this.options,
-			el = this.element;
-
-		this.resizing = true;
-
-		this._renderProxy();
-
-		curleft = this._num( this.helper.css( "left" ) );
-		curtop = this._num( this.helper.css( "top" ) );
-
-		if ( o.containment ) {
-			curleft += $( o.containment ).scrollLeft() || 0;
-			curtop += $( o.containment ).scrollTop() || 0;
-		}
-
-		this.offset = this.helper.offset();
-		this.position = { left: curleft, top: curtop };
-
-		this.size = this._helper ? {
-				width: this.helper.width(),
-				height: this.helper.height()
-			} : {
-				width: el.width(),
-				height: el.height()
-			};
-
-		this.originalSize = this._helper ? {
-				width: el.outerWidth(),
-				height: el.outerHeight()
-			} : {
-				width: el.width(),
-				height: el.height()
-			};
-
-		this.sizeDiff = {
-			width: el.outerWidth() - el.width(),
-			height: el.outerHeight() - el.height()
-		};
-
-		this.originalPosition = { left: curleft, top: curtop };
-		this.originalMousePosition = { left: event.pageX, top: event.pageY };
-
-		this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
-			o.aspectRatio :
-			( ( this.originalSize.width / this.originalSize.height ) || 1 );
-
-		cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
-		$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
-
-		this._addClass( "ui-resizable-resizing" );
-		this._propagate( "start", event );
-		return true;
-	},
-
-	_mouseDrag: function( event ) {
-
-		var data, props,
-			smp = this.originalMousePosition,
-			a = this.axis,
-			dx = ( event.pageX - smp.left ) || 0,
-			dy = ( event.pageY - smp.top ) || 0,
-			trigger = this._change[ a ];
-
-		this._updatePrevProperties();
-
-		if ( !trigger ) {
-			return false;
-		}
-
-		data = trigger.apply( this, [ event, dx, dy ] );
-
-		this._updateVirtualBoundaries( event.shiftKey );
-		if ( this._aspectRatio || event.shiftKey ) {
-			data = this._updateRatio( data, event );
-		}
-
-		data = this._respectSize( data, event );
-
-		this._updateCache( data );
-
-		this._propagate( "resize", event );
-
-		props = this._applyChanges();
-
-		if ( !this._helper && this._proportionallyResizeElements.length ) {
-			this._proportionallyResize();
-		}
-
-		if ( !$.isEmptyObject( props ) ) {
-			this._updatePrevProperties();
-			this._trigger( "resize", event, this.ui() );
-			this._applyChanges();
-		}
-
-		return false;
-	},
-
-	_mouseStop: function( event ) {
-
-		this.resizing = false;
-		var pr, ista, soffseth, soffsetw, s, left, top,
-			o = this.options, that = this;
-
-		if ( this._helper ) {
-
-			pr = this._proportionallyResizeElements;
-			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
-			soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
-			soffsetw = ista ? 0 : that.sizeDiff.width;
-
-			s = {
-				width: ( that.helper.width()  - soffsetw ),
-				height: ( that.helper.height() - soffseth )
-			};
-			left = ( parseFloat( that.element.css( "left" ) ) +
-				( that.position.left - that.originalPosition.left ) ) || null;
-			top = ( parseFloat( that.element.css( "top" ) ) +
-				( that.position.top - that.originalPosition.top ) ) || null;
-
-			if ( !o.animate ) {
-				this.element.css( $.extend( s, { top: top, left: left } ) );
-			}
-
-			that.helper.height( that.size.height );
-			that.helper.width( that.size.width );
-
-			if ( this._helper && !o.animate ) {
-				this._proportionallyResize();
-			}
-		}
-
-		$( "body" ).css( "cursor", "auto" );
-
-		this._removeClass( "ui-resizable-resizing" );
-
-		this._propagate( "stop", event );
-
-		if ( this._helper ) {
-			this.helper.remove();
-		}
-
-		return false;
-
-	},
-
-	_updatePrevProperties: function() {
-		this.prevPosition = {
-			top: this.position.top,
-			left: this.position.left
-		};
-		this.prevSize = {
-			width: this.size.width,
-			height: this.size.height
-		};
-	},
-
-	_applyChanges: function() {
-		var props = {};
-
-		if ( this.position.top !== this.prevPosition.top ) {
-			props.top = this.position.top + "px";
-		}
-		if ( this.position.left !== this.prevPosition.left ) {
-			props.left = this.position.left + "px";
-		}
-		if ( this.size.width !== this.prevSize.width ) {
-			props.width = this.size.width + "px";
-		}
-		if ( this.size.height !== this.prevSize.height ) {
-			props.height = this.size.height + "px";
-		}
-
-		this.helper.css( props );
-
-		return props;
-	},
-
-	_updateVirtualBoundaries: function( forceAspectRatio ) {
-		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
-			o = this.options;
-
-		b = {
-			minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
-			maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
-			minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
-			maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
-		};
-
-		if ( this._aspectRatio || forceAspectRatio ) {
-			pMinWidth = b.minHeight * this.aspectRatio;
-			pMinHeight = b.minWidth / this.aspectRatio;
-			pMaxWidth = b.maxHeight * this.aspectRatio;
-			pMaxHeight = b.maxWidth / this.aspectRatio;
-
-			if ( pMinWidth > b.minWidth ) {
-				b.minWidth = pMinWidth;
-			}
-			if ( pMinHeight > b.minHeight ) {
-				b.minHeight = pMinHeight;
-			}
-			if ( pMaxWidth < b.maxWidth ) {
-				b.maxWidth = pMaxWidth;
-			}
-			if ( pMaxHeight < b.maxHeight ) {
-				b.maxHeight = pMaxHeight;
-			}
-		}
-		this._vBoundaries = b;
-	},
-
-	_updateCache: function( data ) {
-		this.offset = this.helper.offset();
-		if ( this._isNumber( data.left ) ) {
-			this.position.left = data.left;
-		}
-		if ( this._isNumber( data.top ) ) {
-			this.position.top = data.top;
-		}
-		if ( this._isNumber( data.height ) ) {
-			this.size.height = data.height;
-		}
-		if ( this._isNumber( data.width ) ) {
-			this.size.width = data.width;
-		}
-	},
-
-	_updateRatio: function( data ) {
-
-		var cpos = this.position,
-			csize = this.size,
-			a = this.axis;
-
-		if ( this._isNumber( data.height ) ) {
-			data.width = ( data.height * this.aspectRatio );
-		} else if ( this._isNumber( data.width ) ) {
-			data.height = ( data.width / this.aspectRatio );
-		}
-
-		if ( a === "sw" ) {
-			data.left = cpos.left + ( csize.width - data.width );
-			data.top = null;
-		}
-		if ( a === "nw" ) {
-			data.top = cpos.top + ( csize.height - data.height );
-			data.left = cpos.left + ( csize.width - data.width );
-		}
-
-		return data;
-	},
-
-	_respectSize: function( data ) {
-
-		var o = this._vBoundaries,
-			a = this.axis,
-			ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
-			ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
-			isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
-			isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
-			dw = this.originalPosition.left + this.originalSize.width,
-			dh = this.originalPosition.top + this.originalSize.height,
-			cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
-		if ( isminw ) {
-			data.width = o.minWidth;
-		}
-		if ( isminh ) {
-			data.height = o.minHeight;
-		}
-		if ( ismaxw ) {
-			data.width = o.maxWidth;
-		}
-		if ( ismaxh ) {
-			data.height = o.maxHeight;
-		}
-
-		if ( isminw && cw ) {
-			data.left = dw - o.minWidth;
-		}
-		if ( ismaxw && cw ) {
-			data.left = dw - o.maxWidth;
-		}
-		if ( isminh && ch ) {
-			data.top = dh - o.minHeight;
-		}
-		if ( ismaxh && ch ) {
-			data.top = dh - o.maxHeight;
-		}
-
-		// Fixing jump error on top/left - bug #2330
-		if ( !data.width && !data.height && !data.left && data.top ) {
-			data.top = null;
-		} else if ( !data.width && !data.height && !data.top && data.left ) {
-			data.left = null;
-		}
-
-		return data;
-	},
-
-	_getPaddingPlusBorderDimensions: function( element ) {
-		var i = 0,
-			widths = [],
-			borders = [
-				element.css( "borderTopWidth" ),
-				element.css( "borderRightWidth" ),
-				element.css( "borderBottomWidth" ),
-				element.css( "borderLeftWidth" )
-			],
-			paddings = [
-				element.css( "paddingTop" ),
-				element.css( "paddingRight" ),
-				element.css( "paddingBottom" ),
-				element.css( "paddingLeft" )
-			];
-
-		for ( ; i < 4; i++ ) {
-			widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
-			widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
-		}
-
-		return {
-			height: widths[ 0 ] + widths[ 2 ],
-			width: widths[ 1 ] + widths[ 3 ]
-		};
-	},
-
-	_proportionallyResize: function() {
-
-		if ( !this._proportionallyResizeElements.length ) {
-			return;
-		}
-
-		var prel,
-			i = 0,
-			element = this.helper || this.element;
-
-		for ( ; i < this._proportionallyResizeElements.length; i++ ) {
-
-			prel = this._proportionallyResizeElements[ i ];
-
-			// TODO: Seems like a bug to cache this.outerDimensions
-			// considering that we are in a loop.
-			if ( !this.outerDimensions ) {
-				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
-			}
-
-			prel.css( {
-				height: ( element.height() - this.outerDimensions.height ) || 0,
-				width: ( element.width() - this.outerDimensions.width ) || 0
-			} );
-
-		}
-
-	},
-
-	_renderProxy: function() {
-
-		var el = this.element, o = this.options;
-		this.elementOffset = el.offset();
-
-		if ( this._helper ) {
-
-			this.helper = this.helper || $( "<div style='overflow:hidden;'></div>" );
-
-			this._addClass( this.helper, this._helper );
-			this.helper.css( {
-				width: this.element.outerWidth(),
-				height: this.element.outerHeight(),
-				position: "absolute",
-				left: this.elementOffset.left + "px",
-				top: this.elementOffset.top + "px",
-				zIndex: ++o.zIndex //TODO: Don't modify option
-			} );
-
-			this.helper
-				.appendTo( "body" )
-				.disableSelection();
-
-		} else {
-			this.helper = this.element;
-		}
-
-	},
-
-	_change: {
-		e: function( event, dx ) {
-			return { width: this.originalSize.width + dx };
-		},
-		w: function( event, dx ) {
-			var cs = this.originalSize, sp = this.originalPosition;
-			return { left: sp.left + dx, width: cs.width - dx };
-		},
-		n: function( event, dx, dy ) {
-			var cs = this.originalSize, sp = this.originalPosition;
-			return { top: sp.top + dy, height: cs.height - dy };
-		},
-		s: function( event, dx, dy ) {
-			return { height: this.originalSize.height + dy };
-		},
-		se: function( event, dx, dy ) {
-			return $.extend( this._change.s.apply( this, arguments ),
-				this._change.e.apply( this, [ event, dx, dy ] ) );
-		},
-		sw: function( event, dx, dy ) {
-			return $.extend( this._change.s.apply( this, arguments ),
-				this._change.w.apply( this, [ event, dx, dy ] ) );
-		},
-		ne: function( event, dx, dy ) {
-			return $.extend( this._change.n.apply( this, arguments ),
-				this._change.e.apply( this, [ event, dx, dy ] ) );
-		},
-		nw: function( event, dx, dy ) {
-			return $.extend( this._change.n.apply( this, arguments ),
-				this._change.w.apply( this, [ event, dx, dy ] ) );
-		}
-	},
-
-	_propagate: function( n, event ) {
-		$.ui.plugin.call( this, n, [ event, this.ui() ] );
-		( n !== "resize" && this._trigger( n, event, this.ui() ) );
-	},
-
-	plugins: {},
-
-	ui: function() {
-		return {
-			originalElement: this.originalElement,
-			element: this.element,
-			helper: this.helper,
-			position: this.position,
-			size: this.size,
-			originalSize: this.originalSize,
-			originalPosition: this.originalPosition
-		};
-	}
-
-} );
-
-/*
- * Resizable Extensions
- */
-
-$.ui.plugin.add( "resizable", "animate", {
-
-	stop: function( event ) {
-		var that = $( this ).resizable( "instance" ),
-			o = that.options,
-			pr = that._proportionallyResizeElements,
-			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
-			soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
-			soffsetw = ista ? 0 : that.sizeDiff.width,
-			style = {
-				width: ( that.size.width - soffsetw ),
-				height: ( that.size.height - soffseth )
-			},
-			left = ( parseFloat( that.element.css( "left" ) ) +
-				( that.position.left - that.originalPosition.left ) ) || null,
-			top = ( parseFloat( that.element.css( "top" ) ) +
-				( that.position.top - that.originalPosition.top ) ) || null;
-
-		that.element.animate(
-			$.extend( style, top && left ? { top: top, left: left } : {} ), {
-				duration: o.animateDuration,
-				easing: o.animateEasing,
-				step: function() {
-
-					var data = {
-						width: parseFloat( that.element.css( "width" ) ),
-						height: parseFloat( that.element.css( "height" ) ),
-						top: parseFloat( that.element.css( "top" ) ),
-						left: parseFloat( that.element.css( "left" ) )
-					};
-
-					if ( pr && pr.length ) {
-						$( pr[ 0 ] ).css( { width: data.width, height: data.height } );
-					}
-
-					// Propagating resize, and updating values for each animation step
-					that._updateCache( data );
-					that._propagate( "resize", event );
-
-				}
-			}
-		);
-	}
-
-} );
-
-$.ui.plugin.add( "resizable", "containment", {
-
-	start: function() {
-		var element, p, co, ch, cw, width, height,
-			that = $( this ).resizable( "instance" ),
-			o = that.options,
-			el = that.element,
-			oc = o.containment,
-			ce = ( oc instanceof $ ) ?
-				oc.get( 0 ) :
-				( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
-
-		if ( !ce ) {
-			return;
-		}
-
-		that.containerElement = $( ce );
-
-		if ( /document/.test( oc ) || oc === document ) {
-			that.containerOffset = {
-				left: 0,
-				top: 0
-			};
-			that.containerPosition = {
-				left: 0,
-				top: 0
-			};
-
-			that.parentData = {
-				element: $( document ),
-				left: 0,
-				top: 0,
-				width: $( document ).width(),
-				height: $( document ).height() || document.body.parentNode.scrollHeight
-			};
-		} else {
-			element = $( ce );
-			p = [];
-			$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
-				p[ i ] = that._num( element.css( "padding" + name ) );
-			} );
-
-			that.containerOffset = element.offset();
-			that.containerPosition = element.position();
-			that.containerSize = {
-				height: ( element.innerHeight() - p[ 3 ] ),
-				width: ( element.innerWidth() - p[ 1 ] )
-			};
-
-			co = that.containerOffset;
-			ch = that.containerSize.height;
-			cw = that.containerSize.width;
-			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
-			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
-
-			that.parentData = {
-				element: ce,
-				left: co.left,
-				top: co.top,
-				width: width,
-				height: height
-			};
-		}
-	},
-
-	resize: function( event ) {
-		var woset, hoset, isParent, isOffsetRelative,
-			that = $( this ).resizable( "instance" ),
-			o = that.options,
-			co = that.containerOffset,
-			cp = that.position,
-			pRatio = that._aspectRatio || event.shiftKey,
-			cop = {
-				top: 0,
-				left: 0
-			},
-			ce = that.containerElement,
-			continueResize = true;
-
-		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
-			cop = co;
-		}
-
-		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
-			that.size.width = that.size.width +
-				( that._helper ?
-					( that.position.left - co.left ) :
-					( that.position.left - cop.left ) );
-
-			if ( pRatio ) {
-				that.size.height = that.size.width / that.aspectRatio;
-				continueResize = false;
-			}
-			that.position.left = o.helper ? co.left : 0;
-		}
-
-		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
-			that.size.height = that.size.height +
-				( that._helper ?
-					( that.position.top - co.top ) :
-					that.position.top );
-
-			if ( pRatio ) {
-				that.size.width = that.size.height * that.aspectRatio;
-				continueResize = false;
-			}
-			that.position.top = that._helper ? co.top : 0;
-		}
-
-		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
-		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
-
-		if ( isParent && isOffsetRelative ) {
-			that.offset.left = that.parentData.left + that.position.left;
-			that.offset.top = that.parentData.top + that.position.top;
-		} else {
-			that.offset.left = that.element.offset().left;
-			that.offset.top = that.element.offset().top;
-		}
-
-		woset = Math.abs( that.sizeDiff.width +
-			( that._helper ?
-				that.offset.left - cop.left :
-				( that.offset.left - co.left ) ) );
-
-		hoset = Math.abs( that.sizeDiff.height +
-			( that._helper ?
-				that.offset.top - cop.top :
-				( that.offset.top - co.top ) ) );
-
-		if ( woset + that.size.width >= that.parentData.width ) {
-			that.size.width = that.parentData.width - woset;
-			if ( pRatio ) {
-				that.size.height = that.size.width / that.aspectRatio;
-				continueResize = false;
-			}
-		}
-
-		if ( hoset + that.size.height >= that.parentData.height ) {
-			that.size.height = that.parentData.height - hoset;
-			if ( pRatio ) {
-				that.size.width = that.size.height * that.aspectRatio;
-				continueResize = false;
-			}
-		}
-
-		if ( !continueResize ) {
-			that.position.left = that.prevPosition.left;
-			that.position.top = that.prevPosition.top;
-			that.size.width = that.prevSize.width;
-			that.size.height = that.prevSize.height;
-		}
-	},
-
-	stop: function() {
-		var that = $( this ).resizable( "instance" ),
-			o = that.options,
-			co = that.containerOffset,
-			cop = that.containerPosition,
-			ce = that.containerElement,
-			helper = $( that.helper ),
-			ho = helper.offset(),
-			w = helper.outerWidth() - that.sizeDiff.width,
-			h = helper.outerHeight() - that.sizeDiff.height;
-
-		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
-			$( this ).css( {
-				left: ho.left - cop.left - co.left,
-				width: w,
-				height: h
-			} );
-		}
-
-		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
-			$( this ).css( {
-				left: ho.left - cop.left - co.left,
-				width: w,
-				height: h
-			} );
-		}
-	}
-} );
-
-$.ui.plugin.add( "resizable", "alsoResize", {
-
-	start: function() {
-		var that = $( this ).resizable( "instance" ),
-			o = that.options;
-
-		$( o.alsoResize ).each( function() {
-			var el = $( this );
-			el.data( "ui-resizable-alsoresize", {
-				width: parseFloat( el.width() ), height: parseFloat( el.height() ),
-				left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
-			} );
-		} );
-	},
-
-	resize: function( event, ui ) {
-		var that = $( this ).resizable( "instance" ),
-			o = that.options,
-			os = that.originalSize,
-			op = that.originalPosition,
-			delta = {
-				height: ( that.size.height - os.height ) || 0,
-				width: ( that.size.width - os.width ) || 0,
-				top: ( that.position.top - op.top ) || 0,
-				left: ( that.position.left - op.left ) || 0
-			};
-
-			$( o.alsoResize ).each( function() {
-				var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
-					css = el.parents( ui.originalElement[ 0 ] ).length ?
-							[ "width", "height" ] :
-							[ "width", "height", "top", "left" ];
-
-				$.each( css, function( i, prop ) {
-					var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
-					if ( sum && sum >= 0 ) {
-						style[ prop ] = sum || null;
-					}
-				} );
-
-				el.css( style );
-			} );
-	},
-
-	stop: function() {
-		$( this ).removeData( "ui-resizable-alsoresize" );
-	}
-} );
-
-$.ui.plugin.add( "resizable", "ghost", {
-
-	start: function() {
-
-		var that = $( this ).resizable( "instance" ), cs = that.size;
-
-		that.ghost = that.originalElement.clone();
-		that.ghost.css( {
-			opacity: 0.25,
-			display: "block",
-			position: "relative",
-			height: cs.height,
-			width: cs.width,
-			margin: 0,
-			left: 0,
-			top: 0
-		} );
-
-		that._addClass( that.ghost, "ui-resizable-ghost" );
-
-		// DEPRECATED
-		// TODO: remove after 1.12
-		if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
-
-			// Ghost option
-			that.ghost.addClass( this.options.ghost );
-		}
-
-		that.ghost.appendTo( that.helper );
-
-	},
-
-	resize: function() {
-		var that = $( this ).resizable( "instance" );
-		if ( that.ghost ) {
-			that.ghost.css( {
-				position: "relative",
-				height: that.size.height,
-				width: that.size.width
-			} );
-		}
-	},
-
-	stop: function() {
-		var that = $( this ).resizable( "instance" );
-		if ( that.ghost && that.helper ) {
-			that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
-		}
-	}
-
-} );
-
-$.ui.plugin.add( "resizable", "grid", {
-
-	resize: function() {
-		var outerDimensions,
-			that = $( this ).resizable( "instance" ),
-			o = that.options,
-			cs = that.size,
-			os = that.originalSize,
-			op = that.originalPosition,
-			a = that.axis,
-			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
-			gridX = ( grid[ 0 ] || 1 ),
-			gridY = ( grid[ 1 ] || 1 ),
-			ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
-			oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
-			newWidth = os.width + ox,
-			newHeight = os.height + oy,
-			isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
-			isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
-			isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
-			isMinHeight = o.minHeight && ( o.minHeight > newHeight );
-
-		o.grid = grid;
-
-		if ( isMinWidth ) {
-			newWidth += gridX;
-		}
-		if ( isMinHeight ) {
-			newHeight += gridY;
-		}
-		if ( isMaxWidth ) {
-			newWidth -= gridX;
-		}
-		if ( isMaxHeight ) {
-			newHeight -= gridY;
-		}
-
-		if ( /^(se|s|e)$/.test( a ) ) {
-			that.size.width = newWidth;
-			that.size.height = newHeight;
-		} else if ( /^(ne)$/.test( a ) ) {
-			that.size.width = newWidth;
-			that.size.height = newHeight;
-			that.position.top = op.top - oy;
-		} else if ( /^(sw)$/.test( a ) ) {
-			that.size.width = newWidth;
-			that.size.height = newHeight;
-			that.position.left = op.left - ox;
-		} else {
-			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
-				outerDimensions = that._getPaddingPlusBorderDimensions( this );
-			}
-
-			if ( newHeight - gridY > 0 ) {
-				that.size.height = newHeight;
-				that.position.top = op.top - oy;
-			} else {
-				newHeight = gridY - outerDimensions.height;
-				that.size.height = newHeight;
-				that.position.top = op.top + os.height - newHeight;
-			}
-			if ( newWidth - gridX > 0 ) {
-				that.size.width = newWidth;
-				that.position.left = op.left - ox;
-			} else {
-				newWidth = gridX - outerDimensions.width;
-				that.size.width = newWidth;
-				that.position.left = op.left + os.width - newWidth;
-			}
-		}
-	}
-
-} );
-
-var widgetsResizable = $.ui.resizable;
-
-
-/*!
- * jQuery UI Dialog 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Dialog
-//>>group: Widgets
-//>>description: Displays customizable dialog windows.
-//>>docs: http://api.jqueryui.com/dialog/
-//>>demos: http://jqueryui.com/dialog/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/dialog.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.dialog", {
-	version: "1.12.1",
-	options: {
-		appendTo: "body",
-		autoOpen: true,
-		buttons: [],
-		classes: {
-			"ui-dialog": "ui-corner-all",
-			"ui-dialog-titlebar": "ui-corner-all"
-		},
-		closeOnEscape: true,
-		closeText: "Close",
-		draggable: true,
-		hide: null,
-		height: "auto",
-		maxHeight: null,
-		maxWidth: null,
-		minHeight: 150,
-		minWidth: 150,
-		modal: false,
-		position: {
-			my: "center",
-			at: "center",
-			of: window,
-			collision: "fit",
-
-			// Ensure the titlebar is always visible
-			using: function( pos ) {
-				var topOffset = $( this ).css( pos ).offset().top;
-				if ( topOffset < 0 ) {
-					$( this ).css( "top", pos.top - topOffset );
-				}
-			}
-		},
-		resizable: true,
-		show: null,
-		title: null,
-		width: 300,
-
-		// Callbacks
-		beforeClose: null,
-		close: null,
-		drag: null,
-		dragStart: null,
-		dragStop: null,
-		focus: null,
-		open: null,
-		resize: null,
-		resizeStart: null,
-		resizeStop: null
-	},
-
-	sizeRelatedOptions: {
-		buttons: true,
-		height: true,
-		maxHeight: true,
-		maxWidth: true,
-		minHeight: true,
-		minWidth: true,
-		width: true
-	},
-
-	resizableRelatedOptions: {
-		maxHeight: true,
-		maxWidth: true,
-		minHeight: true,
-		minWidth: true
-	},
-
-	_create: function() {
-		this.originalCss = {
-			display: this.element[ 0 ].style.display,
-			width: this.element[ 0 ].style.width,
-			minHeight: this.element[ 0 ].style.minHeight,
-			maxHeight: this.element[ 0 ].style.maxHeight,
-			height: this.element[ 0 ].style.height
-		};
-		this.originalPosition = {
-			parent: this.element.parent(),
-			index: this.element.parent().children().index( this.element )
-		};
-		this.originalTitle = this.element.attr( "title" );
-		if ( this.options.title == null && this.originalTitle != null ) {
-			this.options.title = this.originalTitle;
-		}
-
-		// Dialogs can't be disabled
-		if ( this.options.disabled ) {
-			this.options.disabled = false;
-		}
-
-		this._createWrapper();
-
-		this.element
-			.show()
-			.removeAttr( "title" )
-			.appendTo( this.uiDialog );
-
-		this._addClass( "ui-dialog-content", "ui-widget-content" );
-
-		this._createTitlebar();
-		this._createButtonPane();
-
-		if ( this.options.draggable && $.fn.draggable ) {
-			this._makeDraggable();
-		}
-		if ( this.options.resizable && $.fn.resizable ) {
-			this._makeResizable();
-		}
-
-		this._isOpen = false;
-
-		this._trackFocus();
-	},
-
-	_init: function() {
-		if ( this.options.autoOpen ) {
-			this.open();
-		}
-	},
-
-	_appendTo: function() {
-		var element = this.options.appendTo;
-		if ( element && ( element.jquery || element.nodeType ) ) {
-			return $( element );
-		}
-		return this.document.find( element || "body" ).eq( 0 );
-	},
-
-	_destroy: function() {
-		var next,
-			originalPosition = this.originalPosition;
-
-		this._untrackInstance();
-		this._destroyOverlay();
-
-		this.element
-			.removeUniqueId()
-			.css( this.originalCss )
-
-			// Without detaching first, the following becomes really slow
-			.detach();
-
-		this.uiDialog.remove();
-
-		if ( this.originalTitle ) {
-			this.element.attr( "title", this.originalTitle );
-		}
-
-		next = originalPosition.parent.children().eq( originalPosition.index );
-
-		// Don't try to place the dialog next to itself (#8613)
-		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
-			next.before( this.element );
-		} else {
-			originalPosition.parent.append( this.element );
-		}
-	},
-
-	widget: function() {
-		return this.uiDialog;
-	},
-
-	disable: $.noop,
-	enable: $.noop,
-
-	close: function( event ) {
-		var that = this;
-
-		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
-			return;
-		}
-
-		this._isOpen = false;
-		this._focusedElement = null;
-		this._destroyOverlay();
-		this._untrackInstance();
-
-		if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
-
-			// Hiding a focused element doesn't trigger blur in WebKit
-			// so in case we have nothing to focus on, explicitly blur the active element
-			// https://bugs.webkit.org/show_bug.cgi?id=47182
-			$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
-		}
-
-		this._hide( this.uiDialog, this.options.hide, function() {
-			that._trigger( "close", event );
-		} );
-	},
-
-	isOpen: function() {
-		return this._isOpen;
-	},
-
-	moveToTop: function() {
-		this._moveToTop();
-	},
-
-	_moveToTop: function( event, silent ) {
-		var moved = false,
-			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
-				return +$( this ).css( "z-index" );
-			} ).get(),
-			zIndexMax = Math.max.apply( null, zIndices );
-
-		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
-			this.uiDialog.css( "z-index", zIndexMax + 1 );
-			moved = true;
-		}
-
-		if ( moved && !silent ) {
-			this._trigger( "focus", event );
-		}
-		return moved;
-	},
-
-	open: function() {
-		var that = this;
-		if ( this._isOpen ) {
-			if ( this._moveToTop() ) {
-				this._focusTabbable();
-			}
-			return;
-		}
-
-		this._isOpen = true;
-		this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
-
-		this._size();
-		this._position();
-		this._createOverlay();
-		this._moveToTop( null, true );
-
-		// Ensure the overlay is moved to the top with the dialog, but only when
-		// opening. The overlay shouldn't move after the dialog is open so that
-		// modeless dialogs opened after the modal dialog stack properly.
-		if ( this.overlay ) {
-			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
-		}
-
-		this._show( this.uiDialog, this.options.show, function() {
-			that._focusTabbable();
-			that._trigger( "focus" );
-		} );
-
-		// Track the dialog immediately upon openening in case a focus event
-		// somehow occurs outside of the dialog before an element inside the
-		// dialog is focused (#10152)
-		this._makeFocusTarget();
-
-		this._trigger( "open" );
-	},
-
-	_focusTabbable: function() {
-
-		// Set focus to the first match:
-		// 1. An element that was focused previously
-		// 2. First element inside the dialog matching [autofocus]
-		// 3. Tabbable element inside the content element
-		// 4. Tabbable element inside the buttonpane
-		// 5. The close button
-		// 6. The dialog itself
-		var hasFocus = this._focusedElement;
-		if ( !hasFocus ) {
-			hasFocus = this.element.find( "[autofocus]" );
-		}
-		if ( !hasFocus.length ) {
-			hasFocus = this.element.find( ":tabbable" );
-		}
-		if ( !hasFocus.length ) {
-			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
-		}
-		if ( !hasFocus.length ) {
-			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
-		}
-		if ( !hasFocus.length ) {
-			hasFocus = this.uiDialog;
-		}
-		hasFocus.eq( 0 ).trigger( "focus" );
-	},
-
-	_keepFocus: function( event ) {
-		function checkFocus() {
-			var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
-				isActive = this.uiDialog[ 0 ] === activeElement ||
-					$.contains( this.uiDialog[ 0 ], activeElement );
-			if ( !isActive ) {
-				this._focusTabbable();
-			}
-		}
-		event.preventDefault();
-		checkFocus.call( this );
-
-		// support: IE
-		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
-		// so we check again later
-		this._delay( checkFocus );
-	},
-
-	_createWrapper: function() {
-		this.uiDialog = $( "<div>" )
-			.hide()
-			.attr( {
-
-				// Setting tabIndex makes the div focusable
-				tabIndex: -1,
-				role: "dialog"
-			} )
-			.appendTo( this._appendTo() );
-
-		this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
-		this._on( this.uiDialog, {
-			keydown: function( event ) {
-				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-						event.keyCode === $.ui.keyCode.ESCAPE ) {
-					event.preventDefault();
-					this.close( event );
-					return;
-				}
-
-				// Prevent tabbing out of dialogs
-				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
-					return;
-				}
-				var tabbables = this.uiDialog.find( ":tabbable" ),
-					first = tabbables.filter( ":first" ),
-					last = tabbables.filter( ":last" );
-
-				if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
-						!event.shiftKey ) {
-					this._delay( function() {
-						first.trigger( "focus" );
-					} );
-					event.preventDefault();
-				} else if ( ( event.target === first[ 0 ] ||
-						event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
-					this._delay( function() {
-						last.trigger( "focus" );
-					} );
-					event.preventDefault();
-				}
-			},
-			mousedown: function( event ) {
-				if ( this._moveToTop( event ) ) {
-					this._focusTabbable();
-				}
-			}
-		} );
-
-		// We assume that any existing aria-describedby attribute means
-		// that the dialog content is marked up properly
-		// otherwise we brute force the content as the description
-		if ( !this.element.find( "[aria-describedby]" ).length ) {
-			this.uiDialog.attr( {
-				"aria-describedby": this.element.uniqueId().attr( "id" )
-			} );
-		}
-	},
-
-	_createTitlebar: function() {
-		var uiDialogTitle;
-
-		this.uiDialogTitlebar = $( "<div>" );
-		this._addClass( this.uiDialogTitlebar,
-			"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
-		this._on( this.uiDialogTitlebar, {
-			mousedown: function( event ) {
-
-				// Don't prevent click on close button (#8838)
-				// Focusing a dialog that is partially scrolled out of view
-				// causes the browser to scroll it into view, preventing the click event
-				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
-
-					// Dialog isn't getting focus when dragging (#8063)
-					this.uiDialog.trigger( "focus" );
-				}
-			}
-		} );
-
-		// Support: IE
-		// Use type="button" to prevent enter keypresses in textboxes from closing the
-		// dialog in IE (#9312)
-		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
-			.button( {
-				label: $( "<a>" ).text( this.options.closeText ).html(),
-				icon: "ui-icon-closethick",
-				showLabel: false
-			} )
-			.appendTo( this.uiDialogTitlebar );
-
-		this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
-		this._on( this.uiDialogTitlebarClose, {
-			click: function( event ) {
-				event.preventDefault();
-				this.close( event );
-			}
-		} );
-
-		uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
-		this._addClass( uiDialogTitle, "ui-dialog-title" );
-		this._title( uiDialogTitle );
-
-		this.uiDialogTitlebar.prependTo( this.uiDialog );
-
-		this.uiDialog.attr( {
-			"aria-labelledby": uiDialogTitle.attr( "id" )
-		} );
-	},
-
-	_title: function( title ) {
-		if ( this.options.title ) {
-			title.text( this.options.title );
-		} else {
-			title.html( "&#160;" );
-		}
-	},
-
-	_createButtonPane: function() {
-		this.uiDialogButtonPane = $( "<div>" );
-		this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
-			"ui-widget-content ui-helper-clearfix" );
-
-		this.uiButtonSet = $( "<div>" )
-			.appendTo( this.uiDialogButtonPane );
-		this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
-
-		this._createButtons();
-	},
-
-	_createButtons: function() {
-		var that = this,
-			buttons = this.options.buttons;
-
-		// If we already have a button pane, remove it
-		this.uiDialogButtonPane.remove();
-		this.uiButtonSet.empty();
-
-		if ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {
-			this._removeClass( this.uiDialog, "ui-dialog-buttons" );
-			return;
-		}
-
-		$.each( buttons, function( name, props ) {
-			var click, buttonOptions;
-			props = $.isFunction( props ) ?
-				{ click: props, text: name } :
-				props;
-
-			// Default to a non-submitting button
-			props = $.extend( { type: "button" }, props );
-
-			// Change the context for the click callback to be the main element
-			click = props.click;
-			buttonOptions = {
-				icon: props.icon,
-				iconPosition: props.iconPosition,
-				showLabel: props.showLabel,
-
-				// Deprecated options
-				icons: props.icons,
-				text: props.text
-			};
-
-			delete props.click;
-			delete props.icon;
-			delete props.iconPosition;
-			delete props.showLabel;
-
-			// Deprecated options
-			delete props.icons;
-			if ( typeof props.text === "boolean" ) {
-				delete props.text;
-			}
-
-			$( "<button></button>", props )
-				.button( buttonOptions )
-				.appendTo( that.uiButtonSet )
-				.on( "click", function() {
-					click.apply( that.element[ 0 ], arguments );
-				} );
-		} );
-		this._addClass( this.uiDialog, "ui-dialog-buttons" );
-		this.uiDialogButtonPane.appendTo( this.uiDialog );
-	},
-
-	_makeDraggable: function() {
-		var that = this,
-			options = this.options;
-
-		function filteredUi( ui ) {
-			return {
-				position: ui.position,
-				offset: ui.offset
-			};
-		}
-
-		this.uiDialog.draggable( {
-			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
-			handle: ".ui-dialog-titlebar",
-			containment: "document",
-			start: function( event, ui ) {
-				that._addClass( $( this ), "ui-dialog-dragging" );
-				that._blockFrames();
-				that._trigger( "dragStart", event, filteredUi( ui ) );
-			},
-			drag: function( event, ui ) {
-				that._trigger( "drag", event, filteredUi( ui ) );
-			},
-			stop: function( event, ui ) {
-				var left = ui.offset.left - that.document.scrollLeft(),
-					top = ui.offset.top - that.document.scrollTop();
-
-				options.position = {
-					my: "left top",
-					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
-						"top" + ( top >= 0 ? "+" : "" ) + top,
-					of: that.window
-				};
-				that._removeClass( $( this ), "ui-dialog-dragging" );
-				that._unblockFrames();
-				that._trigger( "dragStop", event, filteredUi( ui ) );
-			}
-		} );
-	},
-
-	_makeResizable: function() {
-		var that = this,
-			options = this.options,
-			handles = options.resizable,
-
-			// .ui-resizable has position: relative defined in the stylesheet
-			// but dialogs have to use absolute or fixed positioning
-			position = this.uiDialog.css( "position" ),
-			resizeHandles = typeof handles === "string" ?
-				handles :
-				"n,e,s,w,se,sw,ne,nw";
-
-		function filteredUi( ui ) {
-			return {
-				originalPosition: ui.originalPosition,
-				originalSize: ui.originalSize,
-				position: ui.position,
-				size: ui.size
-			};
-		}
-
-		this.uiDialog.resizable( {
-			cancel: ".ui-dialog-content",
-			containment: "document",
-			alsoResize: this.element,
-			maxWidth: options.maxWidth,
-			maxHeight: options.maxHeight,
-			minWidth: options.minWidth,
-			minHeight: this._minHeight(),
-			handles: resizeHandles,
-			start: function( event, ui ) {
-				that._addClass( $( this ), "ui-dialog-resizing" );
-				that._blockFrames();
-				that._trigger( "resizeStart", event, filteredUi( ui ) );
-			},
-			resize: function( event, ui ) {
-				that._trigger( "resize", event, filteredUi( ui ) );
-			},
-			stop: function( event, ui ) {
-				var offset = that.uiDialog.offset(),
-					left = offset.left - that.document.scrollLeft(),
-					top = offset.top - that.document.scrollTop();
-
-				options.height = that.uiDialog.height();
-				options.width = that.uiDialog.width();
-				options.position = {
-					my: "left top",
-					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
-						"top" + ( top >= 0 ? "+" : "" ) + top,
-					of: that.window
-				};
-				that._removeClass( $( this ), "ui-dialog-resizing" );
-				that._unblockFrames();
-				that._trigger( "resizeStop", event, filteredUi( ui ) );
-			}
-		} )
-			.css( "position", position );
-	},
-
-	_trackFocus: function() {
-		this._on( this.widget(), {
-			focusin: function( event ) {
-				this._makeFocusTarget();
-				this._focusedElement = $( event.target );
-			}
-		} );
-	},
-
-	_makeFocusTarget: function() {
-		this._untrackInstance();
-		this._trackingInstances().unshift( this );
-	},
-
-	_untrackInstance: function() {
-		var instances = this._trackingInstances(),
-			exists = $.inArray( this, instances );
-		if ( exists !== -1 ) {
-			instances.splice( exists, 1 );
-		}
-	},
-
-	_trackingInstances: function() {
-		var instances = this.document.data( "ui-dialog-instances" );
-		if ( !instances ) {
-			instances = [];
-			this.document.data( "ui-dialog-instances", instances );
-		}
-		return instances;
-	},
-
-	_minHeight: function() {
-		var options = this.options;
-
-		return options.height === "auto" ?
-			options.minHeight :
-			Math.min( options.minHeight, options.height );
-	},
-
-	_position: function() {
-
-		// Need to show the dialog to get the actual offset in the position plugin
-		var isVisible = this.uiDialog.is( ":visible" );
-		if ( !isVisible ) {
-			this.uiDialog.show();
-		}
-		this.uiDialog.position( this.options.position );
-		if ( !isVisible ) {
-			this.uiDialog.hide();
-		}
-	},
-
-	_setOptions: function( options ) {
-		var that = this,
-			resize = false,
-			resizableOptions = {};
-
-		$.each( options, function( key, value ) {
-			that._setOption( key, value );
-
-			if ( key in that.sizeRelatedOptions ) {
-				resize = true;
-			}
-			if ( key in that.resizableRelatedOptions ) {
-				resizableOptions[ key ] = value;
-			}
-		} );
-
-		if ( resize ) {
-			this._size();
-			this._position();
-		}
-		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
-			this.uiDialog.resizable( "option", resizableOptions );
-		}
-	},
-
-	_setOption: function( key, value ) {
-		var isDraggable, isResizable,
-			uiDialog = this.uiDialog;
-
-		if ( key === "disabled" ) {
-			return;
-		}
-
-		this._super( key, value );
-
-		if ( key === "appendTo" ) {
-			this.uiDialog.appendTo( this._appendTo() );
-		}
-
-		if ( key === "buttons" ) {
-			this._createButtons();
-		}
-
-		if ( key === "closeText" ) {
-			this.uiDialogTitlebarClose.button( {
-
-				// Ensure that we always pass a string
-				label: $( "<a>" ).text( "" + this.options.closeText ).html()
-			} );
-		}
-
-		if ( key === "draggable" ) {
-			isDraggable = uiDialog.is( ":data(ui-draggable)" );
-			if ( isDraggable && !value ) {
-				uiDialog.draggable( "destroy" );
-			}
-
-			if ( !isDraggable && value ) {
-				this._makeDraggable();
-			}
-		}
-
-		if ( key === "position" ) {
-			this._position();
-		}
-
-		if ( key === "resizable" ) {
-
-			// currently resizable, becoming non-resizable
-			isResizable = uiDialog.is( ":data(ui-resizable)" );
-			if ( isResizable && !value ) {
-				uiDialog.resizable( "destroy" );
-			}
-
-			// Currently resizable, changing handles
-			if ( isResizable && typeof value === "string" ) {
-				uiDialog.resizable( "option", "handles", value );
-			}
-
-			// Currently non-resizable, becoming resizable
-			if ( !isResizable && value !== false ) {
-				this._makeResizable();
-			}
-		}
-
-		if ( key === "title" ) {
-			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
-		}
-	},
-
-	_size: function() {
-
-		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
-		// divs will both have width and height set, so we need to reset them
-		var nonContentHeight, minContentHeight, maxContentHeight,
-			options = this.options;
-
-		// Reset content sizing
-		this.element.show().css( {
-			width: "auto",
-			minHeight: 0,
-			maxHeight: "none",
-			height: 0
-		} );
-
-		if ( options.minWidth > options.width ) {
-			options.width = options.minWidth;
-		}
-
-		// Reset wrapper sizing
-		// determine the height of all the non-content elements
-		nonContentHeight = this.uiDialog.css( {
-			height: "auto",
-			width: options.width
-		} )
-			.outerHeight();
-		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
-		maxContentHeight = typeof options.maxHeight === "number" ?
-			Math.max( 0, options.maxHeight - nonContentHeight ) :
-			"none";
-
-		if ( options.height === "auto" ) {
-			this.element.css( {
-				minHeight: minContentHeight,
-				maxHeight: maxContentHeight,
-				height: "auto"
-			} );
-		} else {
-			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
-		}
-
-		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
-			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
-		}
-	},
-
-	_blockFrames: function() {
-		this.iframeBlocks = this.document.find( "iframe" ).map( function() {
-			var iframe = $( this );
-
-			return $( "<div>" )
-				.css( {
-					position: "absolute",
-					width: iframe.outerWidth(),
-					height: iframe.outerHeight()
-				} )
-				.appendTo( iframe.parent() )
-				.offset( iframe.offset() )[ 0 ];
-		} );
-	},
-
-	_unblockFrames: function() {
-		if ( this.iframeBlocks ) {
-			this.iframeBlocks.remove();
-			delete this.iframeBlocks;
-		}
-	},
-
-	_allowInteraction: function( event ) {
-		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
-			return true;
-		}
-
-		// TODO: Remove hack when datepicker implements
-		// the .ui-front logic (#8989)
-		return !!$( event.target ).closest( ".ui-datepicker" ).length;
-	},
-
-	_createOverlay: function() {
-		if ( !this.options.modal ) {
-			return;
-		}
-
-		// We use a delay in case the overlay is created from an
-		// event that we're going to be cancelling (#2804)
-		var isOpening = true;
-		this._delay( function() {
-			isOpening = false;
-		} );
-
-		if ( !this.document.data( "ui-dialog-overlays" ) ) {
-
-			// Prevent use of anchors and inputs
-			// Using _on() for an event handler shared across many instances is
-			// safe because the dialogs stack and must be closed in reverse order
-			this._on( this.document, {
-				focusin: function( event ) {
-					if ( isOpening ) {
-						return;
-					}
-
-					if ( !this._allowInteraction( event ) ) {
-						event.preventDefault();
-						this._trackingInstances()[ 0 ]._focusTabbable();
-					}
-				}
-			} );
-		}
-
-		this.overlay = $( "<div>" )
-			.appendTo( this._appendTo() );
-
-		this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
-		this._on( this.overlay, {
-			mousedown: "_keepFocus"
-		} );
-		this.document.data( "ui-dialog-overlays",
-			( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
-	},
-
-	_destroyOverlay: function() {
-		if ( !this.options.modal ) {
-			return;
-		}
-
-		if ( this.overlay ) {
-			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
-
-			if ( !overlays ) {
-				this._off( this.document, "focusin" );
-				this.document.removeData( "ui-dialog-overlays" );
-			} else {
-				this.document.data( "ui-dialog-overlays", overlays );
-			}
-
-			this.overlay.remove();
-			this.overlay = null;
-		}
-	}
-} );
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
-	// Backcompat for dialogClass option
-	$.widget( "ui.dialog", $.ui.dialog, {
-		options: {
-			dialogClass: ""
-		},
-		_createWrapper: function() {
-			this._super();
-			this.uiDialog.addClass( this.options.dialogClass );
-		},
-		_setOption: function( key, value ) {
-			if ( key === "dialogClass" ) {
-				this.uiDialog
-					.removeClass( this.options.dialogClass )
-					.addClass( value );
-			}
-			this._superApply( arguments );
-		}
-	} );
-}
-
-var widgetsDialog = $.ui.dialog;
-
-
-/*!
- * jQuery UI Droppable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Droppable
-//>>group: Interactions
-//>>description: Enables drop targets for draggable elements.
-//>>docs: http://api.jqueryui.com/droppable/
-//>>demos: http://jqueryui.com/droppable/
-
-
-
-$.widget( "ui.droppable", {
-	version: "1.12.1",
-	widgetEventPrefix: "drop",
-	options: {
-		accept: "*",
-		addClasses: true,
-		greedy: false,
-		scope: "default",
-		tolerance: "intersect",
-
-		// Callbacks
-		activate: null,
-		deactivate: null,
-		drop: null,
-		out: null,
-		over: null
-	},
-	_create: function() {
-
-		var proportions,
-			o = this.options,
-			accept = o.accept;
-
-		this.isover = false;
-		this.isout = true;
-
-		this.accept = $.isFunction( accept ) ? accept : function( d ) {
-			return d.is( accept );
-		};
-
-		this.proportions = function( /* valueToWrite */ ) {
-			if ( arguments.length ) {
-
-				// Store the droppable's proportions
-				proportions = arguments[ 0 ];
-			} else {
-
-				// Retrieve or derive the droppable's proportions
-				return proportions ?
-					proportions :
-					proportions = {
-						width: this.element[ 0 ].offsetWidth,
-						height: this.element[ 0 ].offsetHeight
-					};
-			}
-		};
-
-		this._addToManager( o.scope );
-
-		o.addClasses && this._addClass( "ui-droppable" );
-
-	},
-
-	_addToManager: function( scope ) {
-
-		// Add the reference and positions to the manager
-		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
-		$.ui.ddmanager.droppables[ scope ].push( this );
-	},
-
-	_splice: function( drop ) {
-		var i = 0;
-		for ( ; i < drop.length; i++ ) {
-			if ( drop[ i ] === this ) {
-				drop.splice( i, 1 );
-			}
-		}
-	},
-
-	_destroy: function() {
-		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
-
-		this._splice( drop );
-	},
-
-	_setOption: function( key, value ) {
-
-		if ( key === "accept" ) {
-			this.accept = $.isFunction( value ) ? value : function( d ) {
-				return d.is( value );
-			};
-		} else if ( key === "scope" ) {
-			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
-
-			this._splice( drop );
-			this._addToManager( value );
-		}
-
-		this._super( key, value );
-	},
-
-	_activate: function( event ) {
-		var draggable = $.ui.ddmanager.current;
-
-		this._addActiveClass();
-		if ( draggable ) {
-			this._trigger( "activate", event, this.ui( draggable ) );
-		}
-	},
-
-	_deactivate: function( event ) {
-		var draggable = $.ui.ddmanager.current;
-
-		this._removeActiveClass();
-		if ( draggable ) {
-			this._trigger( "deactivate", event, this.ui( draggable ) );
-		}
-	},
-
-	_over: function( event ) {
-
-		var draggable = $.ui.ddmanager.current;
-
-		// Bail if draggable and droppable are same element
-		if ( !draggable || ( draggable.currentItem ||
-				draggable.element )[ 0 ] === this.element[ 0 ] ) {
-			return;
-		}
-
-		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
-				draggable.element ) ) ) {
-			this._addHoverClass();
-			this._trigger( "over", event, this.ui( draggable ) );
-		}
-
-	},
-
-	_out: function( event ) {
-
-		var draggable = $.ui.ddmanager.current;
-
-		// Bail if draggable and droppable are same element
-		if ( !draggable || ( draggable.currentItem ||
-				draggable.element )[ 0 ] === this.element[ 0 ] ) {
-			return;
-		}
-
-		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
-				draggable.element ) ) ) {
-			this._removeHoverClass();
-			this._trigger( "out", event, this.ui( draggable ) );
-		}
-
-	},
-
-	_drop: function( event, custom ) {
-
-		var draggable = custom || $.ui.ddmanager.current,
-			childrenIntersection = false;
-
-		// Bail if draggable and droppable are same element
-		if ( !draggable || ( draggable.currentItem ||
-				draggable.element )[ 0 ] === this.element[ 0 ] ) {
-			return false;
-		}
-
-		this.element
-			.find( ":data(ui-droppable)" )
-			.not( ".ui-draggable-dragging" )
-			.each( function() {
-				var inst = $( this ).droppable( "instance" );
-				if (
-					inst.options.greedy &&
-					!inst.options.disabled &&
-					inst.options.scope === draggable.options.scope &&
-					inst.accept.call(
-						inst.element[ 0 ], ( draggable.currentItem || draggable.element )
-					) &&
-					intersect(
-						draggable,
-						$.extend( inst, { offset: inst.element.offset() } ),
-						inst.options.tolerance, event
-					)
-				) {
-					childrenIntersection = true;
-					return false; }
-			} );
-		if ( childrenIntersection ) {
-			return false;
-		}
-
-		if ( this.accept.call( this.element[ 0 ],
-				( draggable.currentItem || draggable.element ) ) ) {
-			this._removeActiveClass();
-			this._removeHoverClass();
-
-			this._trigger( "drop", event, this.ui( draggable ) );
-			return this.element;
-		}
-
-		return false;
-
-	},
-
-	ui: function( c ) {
-		return {
-			draggable: ( c.currentItem || c.element ),
-			helper: c.helper,
-			position: c.position,
-			offset: c.positionAbs
-		};
-	},
-
-	// Extension points just to make backcompat sane and avoid duplicating logic
-	// TODO: Remove in 1.13 along with call to it below
-	_addHoverClass: function() {
-		this._addClass( "ui-droppable-hover" );
-	},
-
-	_removeHoverClass: function() {
-		this._removeClass( "ui-droppable-hover" );
-	},
-
-	_addActiveClass: function() {
-		this._addClass( "ui-droppable-active" );
-	},
-
-	_removeActiveClass: function() {
-		this._removeClass( "ui-droppable-active" );
-	}
-} );
-
-var intersect = $.ui.intersect = ( function() {
-	function isOverAxis( x, reference, size ) {
-		return ( x >= reference ) && ( x < ( reference + size ) );
-	}
-
-	return function( draggable, droppable, toleranceMode, event ) {
-
-		if ( !droppable.offset ) {
-			return false;
-		}
-
-		var x1 = ( draggable.positionAbs ||
-				draggable.position.absolute ).left + draggable.margins.left,
-			y1 = ( draggable.positionAbs ||
-				draggable.position.absolute ).top + draggable.margins.top,
-			x2 = x1 + draggable.helperProportions.width,
-			y2 = y1 + draggable.helperProportions.height,
-			l = droppable.offset.left,
-			t = droppable.offset.top,
-			r = l + droppable.proportions().width,
-			b = t + droppable.proportions().height;
-
-		switch ( toleranceMode ) {
-		case "fit":
-			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
-		case "intersect":
-			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
-				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
-				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
-				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
-		case "pointer":
-			return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
-				isOverAxis( event.pageX, l, droppable.proportions().width );
-		case "touch":
-			return (
-				( y1 >= t && y1 <= b ) || // Top edge touching
-				( y2 >= t && y2 <= b ) || // Bottom edge touching
-				( y1 < t && y2 > b ) // Surrounded vertically
-			) && (
-				( x1 >= l && x1 <= r ) || // Left edge touching
-				( x2 >= l && x2 <= r ) || // Right edge touching
-				( x1 < l && x2 > r ) // Surrounded horizontally
-			);
-		default:
-			return false;
-		}
-	};
-} )();
-
-/*
-	This manager tracks offsets of draggables and droppables
-*/
-$.ui.ddmanager = {
-	current: null,
-	droppables: { "default": [] },
-	prepareOffsets: function( t, event ) {
-
-		var i, j,
-			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
-			type = event ? event.type : null, // workaround for #2317
-			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
-
-		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
-
-			// No disabled and non-accepted
-			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
-					( t.currentItem || t.element ) ) ) ) {
-				continue;
-			}
-
-			// Filter out elements in the current dragged item
-			for ( j = 0; j < list.length; j++ ) {
-				if ( list[ j ] === m[ i ].element[ 0 ] ) {
-					m[ i ].proportions().height = 0;
-					continue droppablesLoop;
-				}
-			}
-
-			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
-			if ( !m[ i ].visible ) {
-				continue;
-			}
-
-			// Activate the droppable if used directly from draggables
-			if ( type === "mousedown" ) {
-				m[ i ]._activate.call( m[ i ], event );
-			}
-
-			m[ i ].offset = m[ i ].element.offset();
-			m[ i ].proportions( {
-				width: m[ i ].element[ 0 ].offsetWidth,
-				height: m[ i ].element[ 0 ].offsetHeight
-			} );
-
-		}
-
-	},
-	drop: function( draggable, event ) {
-
-		var dropped = false;
-
-		// Create a copy of the droppables in case the list changes during the drop (#9116)
-		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
-
-			if ( !this.options ) {
-				return;
-			}
-			if ( !this.options.disabled && this.visible &&
-					intersect( draggable, this, this.options.tolerance, event ) ) {
-				dropped = this._drop.call( this, event ) || dropped;
-			}
-
-			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
-					( draggable.currentItem || draggable.element ) ) ) {
-				this.isout = true;
-				this.isover = false;
-				this._deactivate.call( this, event );
-			}
-
-		} );
-		return dropped;
-
-	},
-	dragStart: function( draggable, event ) {
-
-		// Listen for scrolling so that if the dragging causes scrolling the position of the
-		// droppables can be recalculated (see #5003)
-		draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
-			if ( !draggable.options.refreshPositions ) {
-				$.ui.ddmanager.prepareOffsets( draggable, event );
-			}
-		} );
-	},
-	drag: function( draggable, event ) {
-
-		// If you have a highly dynamic page, you might try this option. It renders positions
-		// every time you move the mouse.
-		if ( draggable.options.refreshPositions ) {
-			$.ui.ddmanager.prepareOffsets( draggable, event );
-		}
-
-		// Run through all droppables and check their positions based on specific tolerance options
-		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
-
-			if ( this.options.disabled || this.greedyChild || !this.visible ) {
-				return;
-			}
-
-			var parentInstance, scope, parent,
-				intersects = intersect( draggable, this, this.options.tolerance, event ),
-				c = !intersects && this.isover ?
-					"isout" :
-					( intersects && !this.isover ? "isover" : null );
-			if ( !c ) {
-				return;
-			}
-
-			if ( this.options.greedy ) {
-
-				// find droppable parents with same scope
-				scope = this.options.scope;
-				parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
-					return $( this ).droppable( "instance" ).options.scope === scope;
-				} );
-
-				if ( parent.length ) {
-					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
-					parentInstance.greedyChild = ( c === "isover" );
-				}
-			}
-
-			// We just moved into a greedy child
-			if ( parentInstance && c === "isover" ) {
-				parentInstance.isover = false;
-				parentInstance.isout = true;
-				parentInstance._out.call( parentInstance, event );
-			}
-
-			this[ c ] = true;
-			this[ c === "isout" ? "isover" : "isout" ] = false;
-			this[ c === "isover" ? "_over" : "_out" ].call( this, event );
-
-			// We just moved out of a greedy child
-			if ( parentInstance && c === "isout" ) {
-				parentInstance.isout = false;
-				parentInstance.isover = true;
-				parentInstance._over.call( parentInstance, event );
-			}
-		} );
-
-	},
-	dragStop: function( draggable, event ) {
-		draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
-
-		// Call prepareOffsets one final time since IE does not fire return scroll events when
-		// overflow was caused by drag (see #5003)
-		if ( !draggable.options.refreshPositions ) {
-			$.ui.ddmanager.prepareOffsets( draggable, event );
-		}
-	}
-};
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
-	// Backcompat for activeClass and hoverClass options
-	$.widget( "ui.droppable", $.ui.droppable, {
-		options: {
-			hoverClass: false,
-			activeClass: false
-		},
-		_addActiveClass: function() {
-			this._super();
-			if ( this.options.activeClass ) {
-				this.element.addClass( this.options.activeClass );
-			}
-		},
-		_removeActiveClass: function() {
-			this._super();
-			if ( this.options.activeClass ) {
-				this.element.removeClass( this.options.activeClass );
-			}
-		},
-		_addHoverClass: function() {
-			this._super();
-			if ( this.options.hoverClass ) {
-				this.element.addClass( this.options.hoverClass );
-			}
-		},
-		_removeHoverClass: function() {
-			this._super();
-			if ( this.options.hoverClass ) {
-				this.element.removeClass( this.options.hoverClass );
-			}
-		}
-	} );
-}
-
-var widgetsDroppable = $.ui.droppable;
-
-
-/*!
- * jQuery UI Progressbar 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Progressbar
-//>>group: Widgets
-// jscs:disable maximumLineLength
-//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/progressbar/
-//>>demos: http://jqueryui.com/progressbar/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/progressbar.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsProgressbar = $.widget( "ui.progressbar", {
-	version: "1.12.1",
-	options: {
-		classes: {
-			"ui-progressbar": "ui-corner-all",
-			"ui-progressbar-value": "ui-corner-left",
-			"ui-progressbar-complete": "ui-corner-right"
-		},
-		max: 100,
-		value: 0,
-
-		change: null,
-		complete: null
-	},
-
-	min: 0,
-
-	_create: function() {
-
-		// Constrain initial value
-		this.oldValue = this.options.value = this._constrainedValue();
-
-		this.element.attr( {
-
-			// Only set static values; aria-valuenow and aria-valuemax are
-			// set inside _refreshValue()
-			role: "progressbar",
-			"aria-valuemin": this.min
-		} );
-		this._addClass( "ui-progressbar", "ui-widget ui-widget-content" );
-
-		this.valueDiv = $( "<div>" ).appendTo( this.element );
-		this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" );
-		this._refreshValue();
-	},
-
-	_destroy: function() {
-		this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" );
-
-		this.valueDiv.remove();
-	},
-
-	value: function( newValue ) {
-		if ( newValue === undefined ) {
-			return this.options.value;
-		}
-
-		this.options.value = this._constrainedValue( newValue );
-		this._refreshValue();
-	},
-
-	_constrainedValue: function( newValue ) {
-		if ( newValue === undefined ) {
-			newValue = this.options.value;
-		}
-
-		this.indeterminate = newValue === false;
-
-		// Sanitize value
-		if ( typeof newValue !== "number" ) {
-			newValue = 0;
-		}
-
-		return this.indeterminate ? false :
-			Math.min( this.options.max, Math.max( this.min, newValue ) );
-	},
-
-	_setOptions: function( options ) {
-
-		// Ensure "value" option is set after other values (like max)
-		var value = options.value;
-		delete options.value;
-
-		this._super( options );
-
-		this.options.value = this._constrainedValue( value );
-		this._refreshValue();
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "max" ) {
-
-			// Don't allow a max less than min
-			value = Math.max( this.min, value );
-		}
-		this._super( key, value );
-	},
-
-	_setOptionDisabled: function( value ) {
-		this._super( value );
-
-		this.element.attr( "aria-disabled", value );
-		this._toggleClass( null, "ui-state-disabled", !!value );
-	},
-
-	_percentage: function() {
-		return this.indeterminate ?
-			100 :
-			100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
-	},
-
-	_refreshValue: function() {
-		var value = this.options.value,
-			percentage = this._percentage();
-
-		this.valueDiv
-			.toggle( this.indeterminate || value > this.min )
-			.width( percentage.toFixed( 0 ) + "%" );
-
-		this
-			._toggleClass( this.valueDiv, "ui-progressbar-complete", null,
-				value === this.options.max )
-			._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate );
-
-		if ( this.indeterminate ) {
-			this.element.removeAttr( "aria-valuenow" );
-			if ( !this.overlayDiv ) {
-				this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv );
-				this._addClass( this.overlayDiv, "ui-progressbar-overlay" );
-			}
-		} else {
-			this.element.attr( {
-				"aria-valuemax": this.options.max,
-				"aria-valuenow": value
-			} );
-			if ( this.overlayDiv ) {
-				this.overlayDiv.remove();
-				this.overlayDiv = null;
-			}
-		}
-
-		if ( this.oldValue !== value ) {
-			this.oldValue = value;
-			this._trigger( "change" );
-		}
-		if ( value === this.options.max ) {
-			this._trigger( "complete" );
-		}
-	}
-} );
-
-
-/*!
- * jQuery UI Selectable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Selectable
-//>>group: Interactions
-//>>description: Allows groups of elements to be selected with the mouse.
-//>>docs: http://api.jqueryui.com/selectable/
-//>>demos: http://jqueryui.com/selectable/
-//>>css.structure: ../../themes/base/selectable.css
-
-
-
-var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
-	version: "1.12.1",
-	options: {
-		appendTo: "body",
-		autoRefresh: true,
-		distance: 0,
-		filter: "*",
-		tolerance: "touch",
-
-		// Callbacks
-		selected: null,
-		selecting: null,
-		start: null,
-		stop: null,
-		unselected: null,
-		unselecting: null
-	},
-	_create: function() {
-		var that = this;
-
-		this._addClass( "ui-selectable" );
-
-		this.dragged = false;
-
-		// Cache selectee children based on filter
-		this.refresh = function() {
-			that.elementPos = $( that.element[ 0 ] ).offset();
-			that.selectees = $( that.options.filter, that.element[ 0 ] );
-			that._addClass( that.selectees, "ui-selectee" );
-			that.selectees.each( function() {
-				var $this = $( this ),
-					selecteeOffset = $this.offset(),
-					pos = {
-						left: selecteeOffset.left - that.elementPos.left,
-						top: selecteeOffset.top - that.elementPos.top
-					};
-				$.data( this, "selectable-item", {
-					element: this,
-					$element: $this,
-					left: pos.left,
-					top: pos.top,
-					right: pos.left + $this.outerWidth(),
-					bottom: pos.top + $this.outerHeight(),
-					startselected: false,
-					selected: $this.hasClass( "ui-selected" ),
-					selecting: $this.hasClass( "ui-selecting" ),
-					unselecting: $this.hasClass( "ui-unselecting" )
-				} );
-			} );
-		};
-		this.refresh();
-
-		this._mouseInit();
-
-		this.helper = $( "<div>" );
-		this._addClass( this.helper, "ui-selectable-helper" );
-	},
-
-	_destroy: function() {
-		this.selectees.removeData( "selectable-item" );
-		this._mouseDestroy();
-	},
-
-	_mouseStart: function( event ) {
-		var that = this,
-			options = this.options;
-
-		this.opos = [ event.pageX, event.pageY ];
-		this.elementPos = $( this.element[ 0 ] ).offset();
-
-		if ( this.options.disabled ) {
-			return;
-		}
-
-		this.selectees = $( options.filter, this.element[ 0 ] );
-
-		this._trigger( "start", event );
-
-		$( options.appendTo ).append( this.helper );
-
-		// position helper (lasso)
-		this.helper.css( {
-			"left": event.pageX,
-			"top": event.pageY,
-			"width": 0,
-			"height": 0
-		} );
-
-		if ( options.autoRefresh ) {
-			this.refresh();
-		}
-
-		this.selectees.filter( ".ui-selected" ).each( function() {
-			var selectee = $.data( this, "selectable-item" );
-			selectee.startselected = true;
-			if ( !event.metaKey && !event.ctrlKey ) {
-				that._removeClass( selectee.$element, "ui-selected" );
-				selectee.selected = false;
-				that._addClass( selectee.$element, "ui-unselecting" );
-				selectee.unselecting = true;
-
-				// selectable UNSELECTING callback
-				that._trigger( "unselecting", event, {
-					unselecting: selectee.element
-				} );
-			}
-		} );
-
-		$( event.target ).parents().addBack().each( function() {
-			var doSelect,
-				selectee = $.data( this, "selectable-item" );
-			if ( selectee ) {
-				doSelect = ( !event.metaKey && !event.ctrlKey ) ||
-					!selectee.$element.hasClass( "ui-selected" );
-				that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" )
-					._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" );
-				selectee.unselecting = !doSelect;
-				selectee.selecting = doSelect;
-				selectee.selected = doSelect;
-
-				// selectable (UN)SELECTING callback
-				if ( doSelect ) {
-					that._trigger( "selecting", event, {
-						selecting: selectee.element
-					} );
-				} else {
-					that._trigger( "unselecting", event, {
-						unselecting: selectee.element
-					} );
-				}
-				return false;
-			}
-		} );
-
-	},
-
-	_mouseDrag: function( event ) {
-
-		this.dragged = true;
-
-		if ( this.options.disabled ) {
-			return;
-		}
-
-		var tmp,
-			that = this,
-			options = this.options,
-			x1 = this.opos[ 0 ],
-			y1 = this.opos[ 1 ],
-			x2 = event.pageX,
-			y2 = event.pageY;
-
-		if ( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; }
-		if ( y1 > y2 ) { tmp = y2; y2 = y1; y1 = tmp; }
-		this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );
-
-		this.selectees.each( function() {
-			var selectee = $.data( this, "selectable-item" ),
-				hit = false,
-				offset = {};
-
-			//prevent helper from being selected if appendTo: selectable
-			if ( !selectee || selectee.element === that.element[ 0 ] ) {
-				return;
-			}
-
-			offset.left   = selectee.left   + that.elementPos.left;
-			offset.right  = selectee.right  + that.elementPos.left;
-			offset.top    = selectee.top    + that.elementPos.top;
-			offset.bottom = selectee.bottom + that.elementPos.top;
-
-			if ( options.tolerance === "touch" ) {
-				hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
-                    offset.bottom < y1 ) );
-			} else if ( options.tolerance === "fit" ) {
-				hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
-                    offset.bottom < y2 );
-			}
-
-			if ( hit ) {
-
-				// SELECT
-				if ( selectee.selected ) {
-					that._removeClass( selectee.$element, "ui-selected" );
-					selectee.selected = false;
-				}
-				if ( selectee.unselecting ) {
-					that._removeClass( selectee.$element, "ui-unselecting" );
-					selectee.unselecting = false;
-				}
-				if ( !selectee.selecting ) {
-					that._addClass( selectee.$element, "ui-selecting" );
-					selectee.selecting = true;
-
-					// selectable SELECTING callback
-					that._trigger( "selecting", event, {
-						selecting: selectee.element
-					} );
-				}
-			} else {
-
-				// UNSELECT
-				if ( selectee.selecting ) {
-					if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {
-						that._removeClass( selectee.$element, "ui-selecting" );
-						selectee.selecting = false;
-						that._addClass( selectee.$element, "ui-selected" );
-						selectee.selected = true;
-					} else {
-						that._removeClass( selectee.$element, "ui-selecting" );
-						selectee.selecting = false;
-						if ( selectee.startselected ) {
-							that._addClass( selectee.$element, "ui-unselecting" );
-							selectee.unselecting = true;
-						}
-
-						// selectable UNSELECTING callback
-						that._trigger( "unselecting", event, {
-							unselecting: selectee.element
-						} );
-					}
-				}
-				if ( selectee.selected ) {
-					if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {
-						that._removeClass( selectee.$element, "ui-selected" );
-						selectee.selected = false;
-
-						that._addClass( selectee.$element, "ui-unselecting" );
-						selectee.unselecting = true;
-
-						// selectable UNSELECTING callback
-						that._trigger( "unselecting", event, {
-							unselecting: selectee.element
-						} );
-					}
-				}
-			}
-		} );
-
-		return false;
-	},
-
-	_mouseStop: function( event ) {
-		var that = this;
-
-		this.dragged = false;
-
-		$( ".ui-unselecting", this.element[ 0 ] ).each( function() {
-			var selectee = $.data( this, "selectable-item" );
-			that._removeClass( selectee.$element, "ui-unselecting" );
-			selectee.unselecting = false;
-			selectee.startselected = false;
-			that._trigger( "unselected", event, {
-				unselected: selectee.element
-			} );
-		} );
-		$( ".ui-selecting", this.element[ 0 ] ).each( function() {
-			var selectee = $.data( this, "selectable-item" );
-			that._removeClass( selectee.$element, "ui-selecting" )
-				._addClass( selectee.$element, "ui-selected" );
-			selectee.selecting = false;
-			selectee.selected = true;
-			selectee.startselected = true;
-			that._trigger( "selected", event, {
-				selected: selectee.element
-			} );
-		} );
-		this._trigger( "stop", event );
-
-		this.helper.remove();
-
-		return false;
-	}
-
-} );
-
-
-/*!
- * jQuery UI Selectmenu 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Selectmenu
-//>>group: Widgets
-// jscs:disable maximumLineLength
-//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/selectmenu/
-//>>demos: http://jqueryui.com/selectmenu/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
-	version: "1.12.1",
-	defaultElement: "<select>",
-	options: {
-		appendTo: null,
-		classes: {
-			"ui-selectmenu-button-open": "ui-corner-top",
-			"ui-selectmenu-button-closed": "ui-corner-all"
-		},
-		disabled: null,
-		icons: {
-			button: "ui-icon-triangle-1-s"
-		},
-		position: {
-			my: "left top",
-			at: "left bottom",
-			collision: "none"
-		},
-		width: false,
-
-		// Callbacks
-		change: null,
-		close: null,
-		focus: null,
-		open: null,
-		select: null
-	},
-
-	_create: function() {
-		var selectmenuId = this.element.uniqueId().attr( "id" );
-		this.ids = {
-			element: selectmenuId,
-			button: selectmenuId + "-button",
-			menu: selectmenuId + "-menu"
-		};
-
-		this._drawButton();
-		this._drawMenu();
-		this._bindFormResetHandler();
-
-		this._rendered = false;
-		this.menuItems = $();
-	},
-
-	_drawButton: function() {
-		var icon,
-			that = this,
-			item = this._parseOption(
-				this.element.find( "option:selected" ),
-				this.element[ 0 ].selectedIndex
-			);
-
-		// Associate existing label with the new button
-		this.labels = this.element.labels().attr( "for", this.ids.button );
-		this._on( this.labels, {
-			click: function( event ) {
-				this.button.focus();
-				event.preventDefault();
-			}
-		} );
-
-		// Hide original select element
-		this.element.hide();
-
-		// Create button
-		this.button = $( "<span>", {
-			tabindex: this.options.disabled ? -1 : 0,
-			id: this.ids.button,
-			role: "combobox",
-			"aria-expanded": "false",
-			"aria-autocomplete": "list",
-			"aria-owns": this.ids.menu,
-			"aria-haspopup": "true",
-			title: this.element.attr( "title" )
-		} )
-			.insertAfter( this.element );
-
-		this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
-			"ui-button ui-widget" );
-
-		icon = $( "<span>" ).appendTo( this.button );
-		this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button );
-		this.buttonItem = this._renderButtonItem( item )
-			.appendTo( this.button );
-
-		if ( this.options.width !== false ) {
-			this._resizeButton();
-		}
-
-		this._on( this.button, this._buttonEvents );
-		this.button.one( "focusin", function() {
-
-			// Delay rendering the menu items until the button receives focus.
-			// The menu may have already been rendered via a programmatic open.
-			if ( !that._rendered ) {
-				that._refreshMenu();
-			}
-		} );
-	},
-
-	_drawMenu: function() {
-		var that = this;
-
-		// Create menu
-		this.menu = $( "<ul>", {
-			"aria-hidden": "true",
-			"aria-labelledby": this.ids.button,
-			id: this.ids.menu
-		} );
-
-		// Wrap menu
-		this.menuWrap = $( "<div>" ).append( this.menu );
-		this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
-		this.menuWrap.appendTo( this._appendTo() );
-
-		// Initialize menu widget
-		this.menuInstance = this.menu
-			.menu( {
-				classes: {
-					"ui-menu": "ui-corner-bottom"
-				},
-				role: "listbox",
-				select: function( event, ui ) {
-					event.preventDefault();
-
-					// Support: IE8
-					// If the item was selected via a click, the text selection
-					// will be destroyed in IE
-					that._setSelection();
-
-					that._select( ui.item.data( "ui-selectmenu-item" ), event );
-				},
-				focus: function( event, ui ) {
-					var item = ui.item.data( "ui-selectmenu-item" );
-
-					// Prevent inital focus from firing and check if its a newly focused item
-					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
-						that._trigger( "focus", event, { item: item } );
-						if ( !that.isOpen ) {
-							that._select( item, event );
-						}
-					}
-					that.focusIndex = item.index;
-
-					that.button.attr( "aria-activedescendant",
-						that.menuItems.eq( item.index ).attr( "id" ) );
-				}
-			} )
-			.menu( "instance" );
-
-		// Don't close the menu on mouseleave
-		this.menuInstance._off( this.menu, "mouseleave" );
-
-		// Cancel the menu's collapseAll on document click
-		this.menuInstance._closeOnDocumentClick = function() {
-			return false;
-		};
-
-		// Selects often contain empty items, but never contain dividers
-		this.menuInstance._isDivider = function() {
-			return false;
-		};
-	},
-
-	refresh: function() {
-		this._refreshMenu();
-		this.buttonItem.replaceWith(
-			this.buttonItem = this._renderButtonItem(
-
-				// Fall back to an empty object in case there are no options
-				this._getSelectedItem().data( "ui-selectmenu-item" ) || {}
-			)
-		);
-		if ( this.options.width === null ) {
-			this._resizeButton();
-		}
-	},
-
-	_refreshMenu: function() {
-		var item,
-			options = this.element.find( "option" );
-
-		this.menu.empty();
-
-		this._parseOptions( options );
-		this._renderMenu( this.menu, this.items );
-
-		this.menuInstance.refresh();
-		this.menuItems = this.menu.find( "li" )
-			.not( ".ui-selectmenu-optgroup" )
-				.find( ".ui-menu-item-wrapper" );
-
-		this._rendered = true;
-
-		if ( !options.length ) {
-			return;
-		}
-
-		item = this._getSelectedItem();
-
-		// Update the menu to have the correct item focused
-		this.menuInstance.focus( null, item );
-		this._setAria( item.data( "ui-selectmenu-item" ) );
-
-		// Set disabled state
-		this._setOption( "disabled", this.element.prop( "disabled" ) );
-	},
-
-	open: function( event ) {
-		if ( this.options.disabled ) {
-			return;
-		}
-
-		// If this is the first time the menu is being opened, render the items
-		if ( !this._rendered ) {
-			this._refreshMenu();
-		} else {
-
-			// Menu clears focus on close, reset focus to selected item
-			this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
-			this.menuInstance.focus( null, this._getSelectedItem() );
-		}
-
-		// If there are no options, don't open the menu
-		if ( !this.menuItems.length ) {
-			return;
-		}
-
-		this.isOpen = true;
-		this._toggleAttr();
-		this._resizeMenu();
-		this._position();
-
-		this._on( this.document, this._documentClick );
-
-		this._trigger( "open", event );
-	},
-
-	_position: function() {
-		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
-	},
-
-	close: function( event ) {
-		if ( !this.isOpen ) {
-			return;
-		}
-
-		this.isOpen = false;
-		this._toggleAttr();
-
-		this.range = null;
-		this._off( this.document );
-
-		this._trigger( "close", event );
-	},
-
-	widget: function() {
-		return this.button;
-	},
-
-	menuWidget: function() {
-		return this.menu;
-	},
-
-	_renderButtonItem: function( item ) {
-		var buttonItem = $( "<span>" );
-
-		this._setText( buttonItem, item.label );
-		this._addClass( buttonItem, "ui-selectmenu-text" );
-
-		return buttonItem;
-	},
-
-	_renderMenu: function( ul, items ) {
-		var that = this,
-			currentOptgroup = "";
-
-		$.each( items, function( index, item ) {
-			var li;
-
-			if ( item.optgroup !== currentOptgroup ) {
-				li = $( "<li>", {
-					text: item.optgroup
-				} );
-				that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
-					( item.element.parent( "optgroup" ).prop( "disabled" ) ?
-						" ui-state-disabled" :
-						"" ) );
-
-				li.appendTo( ul );
-
-				currentOptgroup = item.optgroup;
-			}
-
-			that._renderItemData( ul, item );
-		} );
-	},
-
-	_renderItemData: function( ul, item ) {
-		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
-	},
-
-	_renderItem: function( ul, item ) {
-		var li = $( "<li>" ),
-			wrapper = $( "<div>", {
-				title: item.element.attr( "title" )
-			} );
-
-		if ( item.disabled ) {
-			this._addClass( li, null, "ui-state-disabled" );
-		}
-		this._setText( wrapper, item.label );
-
-		return li.append( wrapper ).appendTo( ul );
-	},
-
-	_setText: function( element, value ) {
-		if ( value ) {
-			element.text( value );
-		} else {
-			element.html( "&#160;" );
-		}
-	},
-
-	_move: function( direction, event ) {
-		var item, next,
-			filter = ".ui-menu-item";
-
-		if ( this.isOpen ) {
-			item = this.menuItems.eq( this.focusIndex ).parent( "li" );
-		} else {
-			item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
-			filter += ":not(.ui-state-disabled)";
-		}
-
-		if ( direction === "first" || direction === "last" ) {
-			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
-		} else {
-			next = item[ direction + "All" ]( filter ).eq( 0 );
-		}
-
-		if ( next.length ) {
-			this.menuInstance.focus( event, next );
-		}
-	},
-
-	_getSelectedItem: function() {
-		return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
-	},
-
-	_toggle: function( event ) {
-		this[ this.isOpen ? "close" : "open" ]( event );
-	},
-
-	_setSelection: function() {
-		var selection;
-
-		if ( !this.range ) {
-			return;
-		}
-
-		if ( window.getSelection ) {
-			selection = window.getSelection();
-			selection.removeAllRanges();
-			selection.addRange( this.range );
-
-		// Support: IE8
-		} else {
-			this.range.select();
-		}
-
-		// Support: IE
-		// Setting the text selection kills the button focus in IE, but
-		// restoring the focus doesn't kill the selection.
-		this.button.focus();
-	},
-
-	_documentClick: {
-		mousedown: function( event ) {
-			if ( !this.isOpen ) {
-				return;
-			}
-
-			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" +
-					$.ui.escapeSelector( this.ids.button ) ).length ) {
-				this.close( event );
-			}
-		}
-	},
-
-	_buttonEvents: {
-
-		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
-		mousedown: function() {
-			var selection;
-
-			if ( window.getSelection ) {
-				selection = window.getSelection();
-				if ( selection.rangeCount ) {
-					this.range = selection.getRangeAt( 0 );
-				}
-
-			// Support: IE8
-			} else {
-				this.range = document.selection.createRange();
-			}
-		},
-
-		click: function( event ) {
-			this._setSelection();
-			this._toggle( event );
-		},
-
-		keydown: function( event ) {
-			var preventDefault = true;
-			switch ( event.keyCode ) {
-			case $.ui.keyCode.TAB:
-			case $.ui.keyCode.ESCAPE:
-				this.close( event );
-				preventDefault = false;
-				break;
-			case $.ui.keyCode.ENTER:
-				if ( this.isOpen ) {
-					this._selectFocusedItem( event );
-				}
-				break;
-			case $.ui.keyCode.UP:
-				if ( event.altKey ) {
-					this._toggle( event );
-				} else {
-					this._move( "prev", event );
-				}
-				break;
-			case $.ui.keyCode.DOWN:
-				if ( event.altKey ) {
-					this._toggle( event );
-				} else {
-					this._move( "next", event );
-				}
-				break;
-			case $.ui.keyCode.SPACE:
-				if ( this.isOpen ) {
-					this._selectFocusedItem( event );
-				} else {
-					this._toggle( event );
-				}
-				break;
-			case $.ui.keyCode.LEFT:
-				this._move( "prev", event );
-				break;
-			case $.ui.keyCode.RIGHT:
-				this._move( "next", event );
-				break;
-			case $.ui.keyCode.HOME:
-			case $.ui.keyCode.PAGE_UP:
-				this._move( "first", event );
-				break;
-			case $.ui.keyCode.END:
-			case $.ui.keyCode.PAGE_DOWN:
-				this._move( "last", event );
-				break;
-			default:
-				this.menu.trigger( event );
-				preventDefault = false;
-			}
-
-			if ( preventDefault ) {
-				event.preventDefault();
-			}
-		}
-	},
-
-	_selectFocusedItem: function( event ) {
-		var item = this.menuItems.eq( this.focusIndex ).parent( "li" );
-		if ( !item.hasClass( "ui-state-disabled" ) ) {
-			this._select( item.data( "ui-selectmenu-item" ), event );
-		}
-	},
-
-	_select: function( item, event ) {
-		var oldIndex = this.element[ 0 ].selectedIndex;
-
-		// Change native select element
-		this.element[ 0 ].selectedIndex = item.index;
-		this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );
-		this._setAria( item );
-		this._trigger( "select", event, { item: item } );
-
-		if ( item.index !== oldIndex ) {
-			this._trigger( "change", event, { item: item } );
-		}
-
-		this.close( event );
-	},
-
-	_setAria: function( item ) {
-		var id = this.menuItems.eq( item.index ).attr( "id" );
-
-		this.button.attr( {
-			"aria-labelledby": id,
-			"aria-activedescendant": id
-		} );
-		this.menu.attr( "aria-activedescendant", id );
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "icons" ) {
-			var icon = this.button.find( "span.ui-icon" );
-			this._removeClass( icon, null, this.options.icons.button )
-				._addClass( icon, null, value.button );
-		}
-
-		this._super( key, value );
-
-		if ( key === "appendTo" ) {
-			this.menuWrap.appendTo( this._appendTo() );
-		}
-
-		if ( key === "width" ) {
-			this._resizeButton();
-		}
-	},
-
-	_setOptionDisabled: function( value ) {
-		this._super( value );
-
-		this.menuInstance.option( "disabled", value );
-		this.button.attr( "aria-disabled", value );
-		this._toggleClass( this.button, null, "ui-state-disabled", value );
-
-		this.element.prop( "disabled", value );
-		if ( value ) {
-			this.button.attr( "tabindex", -1 );
-			this.close();
-		} else {
-			this.button.attr( "tabindex", 0 );
-		}
-	},
-
-	_appendTo: function() {
-		var element = this.options.appendTo;
-
-		if ( element ) {
-			element = element.jquery || element.nodeType ?
-				$( element ) :
-				this.document.find( element ).eq( 0 );
-		}
-
-		if ( !element || !element[ 0 ] ) {
-			element = this.element.closest( ".ui-front, dialog" );
-		}
-
-		if ( !element.length ) {
-			element = this.document[ 0 ].body;
-		}
-
-		return element;
-	},
-
-	_toggleAttr: function() {
-		this.button.attr( "aria-expanded", this.isOpen );
-
-		// We can't use two _toggleClass() calls here, because we need to make sure
-		// we always remove classes first and add them second, otherwise if both classes have the
-		// same theme class, it will be removed after we add it.
-		this._removeClass( this.button, "ui-selectmenu-button-" +
-			( this.isOpen ? "closed" : "open" ) )
-			._addClass( this.button, "ui-selectmenu-button-" +
-				( this.isOpen ? "open" : "closed" ) )
-			._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
-
-		this.menu.attr( "aria-hidden", !this.isOpen );
-	},
-
-	_resizeButton: function() {
-		var width = this.options.width;
-
-		// For `width: false`, just remove inline style and stop
-		if ( width === false ) {
-			this.button.css( "width", "" );
-			return;
-		}
-
-		// For `width: null`, match the width of the original element
-		if ( width === null ) {
-			width = this.element.show().outerWidth();
-			this.element.hide();
-		}
-
-		this.button.outerWidth( width );
-	},
-
-	_resizeMenu: function() {
-		this.menu.outerWidth( Math.max(
-			this.button.outerWidth(),
-
-			// Support: IE10
-			// IE10 wraps long text (possibly a rounding bug)
-			// so we add 1px to avoid the wrapping
-			this.menu.width( "" ).outerWidth() + 1
-		) );
-	},
-
-	_getCreateOptions: function() {
-		var options = this._super();
-
-		options.disabled = this.element.prop( "disabled" );
-
-		return options;
-	},
-
-	_parseOptions: function( options ) {
-		var that = this,
-			data = [];
-		options.each( function( index, item ) {
-			data.push( that._parseOption( $( item ), index ) );
-		} );
-		this.items = data;
-	},
-
-	_parseOption: function( option, index ) {
-		var optgroup = option.parent( "optgroup" );
-
-		return {
-			element: option,
-			index: index,
-			value: option.val(),
-			label: option.text(),
-			optgroup: optgroup.attr( "label" ) || "",
-			disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
-		};
-	},
-
-	_destroy: function() {
-		this._unbindFormResetHandler();
-		this.menuWrap.remove();
-		this.button.remove();
-		this.element.show();
-		this.element.removeUniqueId();
-		this.labels.attr( "for", this.ids.element );
-	}
-} ] );
-
-
-/*!
- * jQuery UI Slider 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Slider
-//>>group: Widgets
-//>>description: Displays a flexible slider with ranges and accessibility via keyboard.
-//>>docs: http://api.jqueryui.com/slider/
-//>>demos: http://jqueryui.com/slider/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/slider.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
-	version: "1.12.1",
-	widgetEventPrefix: "slide",
-
-	options: {
-		animate: false,
-		classes: {
-			"ui-slider": "ui-corner-all",
-			"ui-slider-handle": "ui-corner-all",
-
-			// Note: ui-widget-header isn't the most fittingly semantic framework class for this
-			// element, but worked best visually with a variety of themes
-			"ui-slider-range": "ui-corner-all ui-widget-header"
-		},
-		distance: 0,
-		max: 100,
-		min: 0,
-		orientation: "horizontal",
-		range: false,
-		step: 1,
-		value: 0,
-		values: null,
-
-		// Callbacks
-		change: null,
-		slide: null,
-		start: null,
-		stop: null
-	},
-
-	// Number of pages in a slider
-	// (how many times can you page up/down to go through the whole range)
-	numPages: 5,
-
-	_create: function() {
-		this._keySliding = false;
-		this._mouseSliding = false;
-		this._animateOff = true;
-		this._handleIndex = null;
-		this._detectOrientation();
-		this._mouseInit();
-		this._calculateNewMax();
-
-		this._addClass( "ui-slider ui-slider-" + this.orientation,
-			"ui-widget ui-widget-content" );
-
-		this._refresh();
-
-		this._animateOff = false;
-	},
-
-	_refresh: function() {
-		this._createRange();
-		this._createHandles();
-		this._setupEvents();
-		this._refreshValue();
-	},
-
-	_createHandles: function() {
-		var i, handleCount,
-			options = this.options,
-			existingHandles = this.element.find( ".ui-slider-handle" ),
-			handle = "<span tabindex='0'></span>",
-			handles = [];
-
-		handleCount = ( options.values && options.values.length ) || 1;
-
-		if ( existingHandles.length > handleCount ) {
-			existingHandles.slice( handleCount ).remove();
-			existingHandles = existingHandles.slice( 0, handleCount );
-		}
-
-		for ( i = existingHandles.length; i < handleCount; i++ ) {
-			handles.push( handle );
-		}
-
-		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
-
-		this._addClass( this.handles, "ui-slider-handle", "ui-state-default" );
-
-		this.handle = this.handles.eq( 0 );
-
-		this.handles.each( function( i ) {
-			$( this )
-				.data( "ui-slider-handle-index", i )
-				.attr( "tabIndex", 0 );
-		} );
-	},
-
-	_createRange: function() {
-		var options = this.options;
-
-		if ( options.range ) {
-			if ( options.range === true ) {
-				if ( !options.values ) {
-					options.values = [ this._valueMin(), this._valueMin() ];
-				} else if ( options.values.length && options.values.length !== 2 ) {
-					options.values = [ options.values[ 0 ], options.values[ 0 ] ];
-				} else if ( $.isArray( options.values ) ) {
-					options.values = options.values.slice( 0 );
-				}
-			}
-
-			if ( !this.range || !this.range.length ) {
-				this.range = $( "<div>" )
-					.appendTo( this.element );
-
-				this._addClass( this.range, "ui-slider-range" );
-			} else {
-				this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" );
-
-				// Handle range switching from true to min/max
-				this.range.css( {
-					"left": "",
-					"bottom": ""
-				} );
-			}
-			if ( options.range === "min" || options.range === "max" ) {
-				this._addClass( this.range, "ui-slider-range-" + options.range );
-			}
-		} else {
-			if ( this.range ) {
-				this.range.remove();
-			}
-			this.range = null;
-		}
-	},
-
-	_setupEvents: function() {
-		this._off( this.handles );
-		this._on( this.handles, this._handleEvents );
-		this._hoverable( this.handles );
-		this._focusable( this.handles );
-	},
-
-	_destroy: function() {
-		this.handles.remove();
-		if ( this.range ) {
-			this.range.remove();
-		}
-
-		this._mouseDestroy();
-	},
-
-	_mouseCapture: function( event ) {
-		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
-			that = this,
-			o = this.options;
-
-		if ( o.disabled ) {
-			return false;
-		}
-
-		this.elementSize = {
-			width: this.element.outerWidth(),
-			height: this.element.outerHeight()
-		};
-		this.elementOffset = this.element.offset();
-
-		position = { x: event.pageX, y: event.pageY };
-		normValue = this._normValueFromMouse( position );
-		distance = this._valueMax() - this._valueMin() + 1;
-		this.handles.each( function( i ) {
-			var thisDistance = Math.abs( normValue - that.values( i ) );
-			if ( ( distance > thisDistance ) ||
-				( distance === thisDistance &&
-					( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {
-				distance = thisDistance;
-				closestHandle = $( this );
-				index = i;
-			}
-		} );
-
-		allowed = this._start( event, index );
-		if ( allowed === false ) {
-			return false;
-		}
-		this._mouseSliding = true;
-
-		this._handleIndex = index;
-
-		this._addClass( closestHandle, null, "ui-state-active" );
-		closestHandle.trigger( "focus" );
-
-		offset = closestHandle.offset();
-		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
-		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
-			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
-			top: event.pageY - offset.top -
-				( closestHandle.height() / 2 ) -
-				( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) -
-				( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) +
-				( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 )
-		};
-
-		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
-			this._slide( event, index, normValue );
-		}
-		this._animateOff = true;
-		return true;
-	},
-
-	_mouseStart: function() {
-		return true;
-	},
-
-	_mouseDrag: function( event ) {
-		var position = { x: event.pageX, y: event.pageY },
-			normValue = this._normValueFromMouse( position );
-
-		this._slide( event, this._handleIndex, normValue );
-
-		return false;
-	},
-
-	_mouseStop: function( event ) {
-		this._removeClass( this.handles, null, "ui-state-active" );
-		this._mouseSliding = false;
-
-		this._stop( event, this._handleIndex );
-		this._change( event, this._handleIndex );
-
-		this._handleIndex = null;
-		this._clickOffset = null;
-		this._animateOff = false;
-
-		return false;
-	},
-
-	_detectOrientation: function() {
-		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
-	},
-
-	_normValueFromMouse: function( position ) {
-		var pixelTotal,
-			pixelMouse,
-			percentMouse,
-			valueTotal,
-			valueMouse;
-
-		if ( this.orientation === "horizontal" ) {
-			pixelTotal = this.elementSize.width;
-			pixelMouse = position.x - this.elementOffset.left -
-				( this._clickOffset ? this._clickOffset.left : 0 );
-		} else {
-			pixelTotal = this.elementSize.height;
-			pixelMouse = position.y - this.elementOffset.top -
-				( this._clickOffset ? this._clickOffset.top : 0 );
-		}
-
-		percentMouse = ( pixelMouse / pixelTotal );
-		if ( percentMouse > 1 ) {
-			percentMouse = 1;
-		}
-		if ( percentMouse < 0 ) {
-			percentMouse = 0;
-		}
-		if ( this.orientation === "vertical" ) {
-			percentMouse = 1 - percentMouse;
-		}
-
-		valueTotal = this._valueMax() - this._valueMin();
-		valueMouse = this._valueMin() + percentMouse * valueTotal;
-
-		return this._trimAlignValue( valueMouse );
-	},
-
-	_uiHash: function( index, value, values ) {
-		var uiHash = {
-			handle: this.handles[ index ],
-			handleIndex: index,
-			value: value !== undefined ? value : this.value()
-		};
-
-		if ( this._hasMultipleValues() ) {
-			uiHash.value = value !== undefined ? value : this.values( index );
-			uiHash.values = values || this.values();
-		}
-
-		return uiHash;
-	},
-
-	_hasMultipleValues: function() {
-		return this.options.values && this.options.values.length;
-	},
-
-	_start: function( event, index ) {
-		return this._trigger( "start", event, this._uiHash( index ) );
-	},
-
-	_slide: function( event, index, newVal ) {
-		var allowed, otherVal,
-			currentValue = this.value(),
-			newValues = this.values();
-
-		if ( this._hasMultipleValues() ) {
-			otherVal = this.values( index ? 0 : 1 );
-			currentValue = this.values( index );
-
-			if ( this.options.values.length === 2 && this.options.range === true ) {
-				newVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );
-			}
-
-			newValues[ index ] = newVal;
-		}
-
-		if ( newVal === currentValue ) {
-			return;
-		}
-
-		allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) );
-
-		// A slide can be canceled by returning false from the slide callback
-		if ( allowed === false ) {
-			return;
-		}
-
-		if ( this._hasMultipleValues() ) {
-			this.values( index, newVal );
-		} else {
-			this.value( newVal );
-		}
-	},
-
-	_stop: function( event, index ) {
-		this._trigger( "stop", event, this._uiHash( index ) );
-	},
-
-	_change: function( event, index ) {
-		if ( !this._keySliding && !this._mouseSliding ) {
-
-			//store the last changed value index for reference when handles overlap
-			this._lastChangedValue = index;
-			this._trigger( "change", event, this._uiHash( index ) );
-		}
-	},
-
-	value: function( newValue ) {
-		if ( arguments.length ) {
-			this.options.value = this._trimAlignValue( newValue );
-			this._refreshValue();
-			this._change( null, 0 );
-			return;
-		}
-
-		return this._value();
-	},
-
-	values: function( index, newValue ) {
-		var vals,
-			newValues,
-			i;
-
-		if ( arguments.length > 1 ) {
-			this.options.values[ index ] = this._trimAlignValue( newValue );
-			this._refreshValue();
-			this._change( null, index );
-			return;
-		}
-
-		if ( arguments.length ) {
-			if ( $.isArray( arguments[ 0 ] ) ) {
-				vals = this.options.values;
-				newValues = arguments[ 0 ];
-				for ( i = 0; i < vals.length; i += 1 ) {
-					vals[ i ] = this._trimAlignValue( newValues[ i ] );
-					this._change( null, i );
-				}
-				this._refreshValue();
-			} else {
-				if ( this._hasMultipleValues() ) {
-					return this._values( index );
-				} else {
-					return this.value();
-				}
-			}
-		} else {
-			return this._values();
-		}
-	},
-
-	_setOption: function( key, value ) {
-		var i,
-			valsLength = 0;
-
-		if ( key === "range" && this.options.range === true ) {
-			if ( value === "min" ) {
-				this.options.value = this._values( 0 );
-				this.options.values = null;
-			} else if ( value === "max" ) {
-				this.options.value = this._values( this.options.values.length - 1 );
-				this.options.values = null;
-			}
-		}
-
-		if ( $.isArray( this.options.values ) ) {
-			valsLength = this.options.values.length;
-		}
-
-		this._super( key, value );
-
-		switch ( key ) {
-			case "orientation":
-				this._detectOrientation();
-				this._removeClass( "ui-slider-horizontal ui-slider-vertical" )
-					._addClass( "ui-slider-" + this.orientation );
-				this._refreshValue();
-				if ( this.options.range ) {
-					this._refreshRange( value );
-				}
-
-				// Reset positioning from previous orientation
-				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
-				break;
-			case "value":
-				this._animateOff = true;
-				this._refreshValue();
-				this._change( null, 0 );
-				this._animateOff = false;
-				break;
-			case "values":
-				this._animateOff = true;
-				this._refreshValue();
-
-				// Start from the last handle to prevent unreachable handles (#9046)
-				for ( i = valsLength - 1; i >= 0; i-- ) {
-					this._change( null, i );
-				}
-				this._animateOff = false;
-				break;
-			case "step":
-			case "min":
-			case "max":
-				this._animateOff = true;
-				this._calculateNewMax();
-				this._refreshValue();
-				this._animateOff = false;
-				break;
-			case "range":
-				this._animateOff = true;
-				this._refresh();
-				this._animateOff = false;
-				break;
-		}
-	},
-
-	_setOptionDisabled: function( value ) {
-		this._super( value );
-
-		this._toggleClass( null, "ui-state-disabled", !!value );
-	},
-
-	//internal value getter
-	// _value() returns value trimmed by min and max, aligned by step
-	_value: function() {
-		var val = this.options.value;
-		val = this._trimAlignValue( val );
-
-		return val;
-	},
-
-	//internal values getter
-	// _values() returns array of values trimmed by min and max, aligned by step
-	// _values( index ) returns single value trimmed by min and max, aligned by step
-	_values: function( index ) {
-		var val,
-			vals,
-			i;
-
-		if ( arguments.length ) {
-			val = this.options.values[ index ];
-			val = this._trimAlignValue( val );
-
-			return val;
-		} else if ( this._hasMultipleValues() ) {
-
-			// .slice() creates a copy of the array
-			// this copy gets trimmed by min and max and then returned
-			vals = this.options.values.slice();
-			for ( i = 0; i < vals.length; i += 1 ) {
-				vals[ i ] = this._trimAlignValue( vals[ i ] );
-			}
-
-			return vals;
-		} else {
-			return [];
-		}
-	},
-
-	// Returns the step-aligned value that val is closest to, between (inclusive) min and max
-	_trimAlignValue: function( val ) {
-		if ( val <= this._valueMin() ) {
-			return this._valueMin();
-		}
-		if ( val >= this._valueMax() ) {
-			return this._valueMax();
-		}
-		var step = ( this.options.step > 0 ) ? this.options.step : 1,
-			valModStep = ( val - this._valueMin() ) % step,
-			alignValue = val - valModStep;
-
-		if ( Math.abs( valModStep ) * 2 >= step ) {
-			alignValue += ( valModStep > 0 ) ? step : ( -step );
-		}
-
-		// Since JavaScript has problems with large floats, round
-		// the final value to 5 digits after the decimal point (see #4124)
-		return parseFloat( alignValue.toFixed( 5 ) );
-	},
-
-	_calculateNewMax: function() {
-		var max = this.options.max,
-			min = this._valueMin(),
-			step = this.options.step,
-			aboveMin = Math.round( ( max - min ) / step ) * step;
-		max = aboveMin + min;
-		if ( max > this.options.max ) {
-
-			//If max is not divisible by step, rounding off may increase its value
-			max -= step;
-		}
-		this.max = parseFloat( max.toFixed( this._precision() ) );
-	},
-
-	_precision: function() {
-		var precision = this._precisionOf( this.options.step );
-		if ( this.options.min !== null ) {
-			precision = Math.max( precision, this._precisionOf( this.options.min ) );
-		}
-		return precision;
-	},
-
-	_precisionOf: function( num ) {
-		var str = num.toString(),
-			decimal = str.indexOf( "." );
-		return decimal === -1 ? 0 : str.length - decimal - 1;
-	},
-
-	_valueMin: function() {
-		return this.options.min;
-	},
-
-	_valueMax: function() {
-		return this.max;
-	},
-
-	_refreshRange: function( orientation ) {
-		if ( orientation === "vertical" ) {
-			this.range.css( { "width": "", "left": "" } );
-		}
-		if ( orientation === "horizontal" ) {
-			this.range.css( { "height": "", "bottom": "" } );
-		}
-	},
-
-	_refreshValue: function() {
-		var lastValPercent, valPercent, value, valueMin, valueMax,
-			oRange = this.options.range,
-			o = this.options,
-			that = this,
-			animate = ( !this._animateOff ) ? o.animate : false,
-			_set = {};
-
-		if ( this._hasMultipleValues() ) {
-			this.handles.each( function( i ) {
-				valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -
-					that._valueMin() ) * 100;
-				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
-				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-				if ( that.options.range === true ) {
-					if ( that.orientation === "horizontal" ) {
-						if ( i === 0 ) {
-							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
-								left: valPercent + "%"
-							}, o.animate );
-						}
-						if ( i === 1 ) {
-							that.range[ animate ? "animate" : "css" ]( {
-								width: ( valPercent - lastValPercent ) + "%"
-							}, {
-								queue: false,
-								duration: o.animate
-							} );
-						}
-					} else {
-						if ( i === 0 ) {
-							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
-								bottom: ( valPercent ) + "%"
-							}, o.animate );
-						}
-						if ( i === 1 ) {
-							that.range[ animate ? "animate" : "css" ]( {
-								height: ( valPercent - lastValPercent ) + "%"
-							}, {
-								queue: false,
-								duration: o.animate
-							} );
-						}
-					}
-				}
-				lastValPercent = valPercent;
-			} );
-		} else {
-			value = this.value();
-			valueMin = this._valueMin();
-			valueMax = this._valueMax();
-			valPercent = ( valueMax !== valueMin ) ?
-					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
-					0;
-			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
-			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-
-			if ( oRange === "min" && this.orientation === "horizontal" ) {
-				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
-					width: valPercent + "%"
-				}, o.animate );
-			}
-			if ( oRange === "max" && this.orientation === "horizontal" ) {
-				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
-					width: ( 100 - valPercent ) + "%"
-				}, o.animate );
-			}
-			if ( oRange === "min" && this.orientation === "vertical" ) {
-				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
-					height: valPercent + "%"
-				}, o.animate );
-			}
-			if ( oRange === "max" && this.orientation === "vertical" ) {
-				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
-					height: ( 100 - valPercent ) + "%"
-				}, o.animate );
-			}
-		}
-	},
-
-	_handleEvents: {
-		keydown: function( event ) {
-			var allowed, curVal, newVal, step,
-				index = $( event.target ).data( "ui-slider-handle-index" );
-
-			switch ( event.keyCode ) {
-				case $.ui.keyCode.HOME:
-				case $.ui.keyCode.END:
-				case $.ui.keyCode.PAGE_UP:
-				case $.ui.keyCode.PAGE_DOWN:
-				case $.ui.keyCode.UP:
-				case $.ui.keyCode.RIGHT:
-				case $.ui.keyCode.DOWN:
-				case $.ui.keyCode.LEFT:
-					event.preventDefault();
-					if ( !this._keySliding ) {
-						this._keySliding = true;
-						this._addClass( $( event.target ), null, "ui-state-active" );
-						allowed = this._start( event, index );
-						if ( allowed === false ) {
-							return;
-						}
-					}
-					break;
-			}
-
-			step = this.options.step;
-			if ( this._hasMultipleValues() ) {
-				curVal = newVal = this.values( index );
-			} else {
-				curVal = newVal = this.value();
-			}
-
-			switch ( event.keyCode ) {
-				case $.ui.keyCode.HOME:
-					newVal = this._valueMin();
-					break;
-				case $.ui.keyCode.END:
-					newVal = this._valueMax();
-					break;
-				case $.ui.keyCode.PAGE_UP:
-					newVal = this._trimAlignValue(
-						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
-					);
-					break;
-				case $.ui.keyCode.PAGE_DOWN:
-					newVal = this._trimAlignValue(
-						curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );
-					break;
-				case $.ui.keyCode.UP:
-				case $.ui.keyCode.RIGHT:
-					if ( curVal === this._valueMax() ) {
-						return;
-					}
-					newVal = this._trimAlignValue( curVal + step );
-					break;
-				case $.ui.keyCode.DOWN:
-				case $.ui.keyCode.LEFT:
-					if ( curVal === this._valueMin() ) {
-						return;
-					}
-					newVal = this._trimAlignValue( curVal - step );
-					break;
-			}
-
-			this._slide( event, index, newVal );
-		},
-		keyup: function( event ) {
-			var index = $( event.target ).data( "ui-slider-handle-index" );
-
-			if ( this._keySliding ) {
-				this._keySliding = false;
-				this._stop( event, index );
-				this._change( event, index );
-				this._removeClass( $( event.target ), null, "ui-state-active" );
-			}
-		}
-	}
-} );
-
-
-/*!
- * jQuery UI Sortable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Sortable
-//>>group: Interactions
-//>>description: Enables items in a list to be sorted using the mouse.
-//>>docs: http://api.jqueryui.com/sortable/
-//>>demos: http://jqueryui.com/sortable/
-//>>css.structure: ../../themes/base/sortable.css
-
-
-
-var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
-	version: "1.12.1",
-	widgetEventPrefix: "sort",
-	ready: false,
-	options: {
-		appendTo: "parent",
-		axis: false,
-		connectWith: false,
-		containment: false,
-		cursor: "auto",
-		cursorAt: false,
-		dropOnEmpty: true,
-		forcePlaceholderSize: false,
-		forceHelperSize: false,
-		grid: false,
-		handle: false,
-		helper: "original",
-		items: "> *",
-		opacity: false,
-		placeholder: false,
-		revert: false,
-		scroll: true,
-		scrollSensitivity: 20,
-		scrollSpeed: 20,
-		scope: "default",
-		tolerance: "intersect",
-		zIndex: 1000,
-
-		// Callbacks
-		activate: null,
-		beforeStop: null,
-		change: null,
-		deactivate: null,
-		out: null,
-		over: null,
-		receive: null,
-		remove: null,
-		sort: null,
-		start: null,
-		stop: null,
-		update: null
-	},
-
-	_isOverAxis: function( x, reference, size ) {
-		return ( x >= reference ) && ( x < ( reference + size ) );
-	},
-
-	_isFloating: function( item ) {
-		return ( /left|right/ ).test( item.css( "float" ) ) ||
-			( /inline|table-cell/ ).test( item.css( "display" ) );
-	},
-
-	_create: function() {
-		this.containerCache = {};
-		this._addClass( "ui-sortable" );
-
-		//Get the items
-		this.refresh();
-
-		//Let's determine the parent's offset
-		this.offset = this.element.offset();
-
-		//Initialize mouse events for interaction
-		this._mouseInit();
-
-		this._setHandleClassName();
-
-		//We're ready to go
-		this.ready = true;
-
-	},
-
-	_setOption: function( key, value ) {
-		this._super( key, value );
-
-		if ( key === "handle" ) {
-			this._setHandleClassName();
-		}
-	},
-
-	_setHandleClassName: function() {
-		var that = this;
-		this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
-		$.each( this.items, function() {
-			that._addClass(
-				this.instance.options.handle ?
-					this.item.find( this.instance.options.handle ) :
-					this.item,
-				"ui-sortable-handle"
-			);
-		} );
-	},
-
-	_destroy: function() {
-		this._mouseDestroy();
-
-		for ( var i = this.items.length - 1; i >= 0; i-- ) {
-			this.items[ i ].item.removeData( this.widgetName + "-item" );
-		}
-
-		return this;
-	},
-
-	_mouseCapture: function( event, overrideHandle ) {
-		var currentItem = null,
-			validHandle = false,
-			that = this;
-
-		if ( this.reverting ) {
-			return false;
-		}
-
-		if ( this.options.disabled || this.options.type === "static" ) {
-			return false;
-		}
-
-		//We have to refresh the items data once first
-		this._refreshItems( event );
-
-		//Find out if the clicked node (or one of its parents) is a actual item in this.items
-		$( event.target ).parents().each( function() {
-			if ( $.data( this, that.widgetName + "-item" ) === that ) {
-				currentItem = $( this );
-				return false;
-			}
-		} );
-		if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
-			currentItem = $( event.target );
-		}
-
-		if ( !currentItem ) {
-			return false;
-		}
-		if ( this.options.handle && !overrideHandle ) {
-			$( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
-				if ( this === event.target ) {
-					validHandle = true;
-				}
-			} );
-			if ( !validHandle ) {
-				return false;
-			}
-		}
-
-		this.currentItem = currentItem;
-		this._removeCurrentsFromItems();
-		return true;
-
-	},
-
-	_mouseStart: function( event, overrideHandle, noActivation ) {
-
-		var i, body,
-			o = this.options;
-
-		this.currentContainer = this;
-
-		//We only need to call refreshPositions, because the refreshItems call has been moved to
-		// mouseCapture
-		this.refreshPositions();
-
-		//Create and append the visible helper
-		this.helper = this._createHelper( event );
-
-		//Cache the helper size
-		this._cacheHelperProportions();
-
-		/*
-		 * - Position generation -
-		 * This block generates everything position related - it's the core of draggables.
-		 */
-
-		//Cache the margins of the original element
-		this._cacheMargins();
-
-		//Get the next scrolling parent
-		this.scrollParent = this.helper.scrollParent();
-
-		//The element's absolute position on the page minus margins
-		this.offset = this.currentItem.offset();
-		this.offset = {
-			top: this.offset.top - this.margins.top,
-			left: this.offset.left - this.margins.left
-		};
-
-		$.extend( this.offset, {
-			click: { //Where the click happened, relative to the element
-				left: event.pageX - this.offset.left,
-				top: event.pageY - this.offset.top
-			},
-			parent: this._getParentOffset(),
-
-			// This is a relative to absolute position minus the actual position calculation -
-			// only used for relative positioned helper
-			relative: this._getRelativeOffset()
-		} );
-
-		// Only after we got the offset, we can change the helper's position to absolute
-		// TODO: Still need to figure out a way to make relative sorting possible
-		this.helper.css( "position", "absolute" );
-		this.cssPosition = this.helper.css( "position" );
-
-		//Generate the original position
-		this.originalPosition = this._generatePosition( event );
-		this.originalPageX = event.pageX;
-		this.originalPageY = event.pageY;
-
-		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
-		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
-
-		//Cache the former DOM position
-		this.domPosition = {
-			prev: this.currentItem.prev()[ 0 ],
-			parent: this.currentItem.parent()[ 0 ]
-		};
-
-		// If the helper is not the original, hide the original so it's not playing any role during
-		// the drag, won't cause anything bad this way
-		if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
-			this.currentItem.hide();
-		}
-
-		//Create the placeholder
-		this._createPlaceholder();
-
-		//Set a containment if given in the options
-		if ( o.containment ) {
-			this._setContainment();
-		}
-
-		if ( o.cursor && o.cursor !== "auto" ) { // cursor option
-			body = this.document.find( "body" );
-
-			// Support: IE
-			this.storedCursor = body.css( "cursor" );
-			body.css( "cursor", o.cursor );
-
-			this.storedStylesheet =
-				$( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
-		}
-
-		if ( o.opacity ) { // opacity option
-			if ( this.helper.css( "opacity" ) ) {
-				this._storedOpacity = this.helper.css( "opacity" );
-			}
-			this.helper.css( "opacity", o.opacity );
-		}
-
-		if ( o.zIndex ) { // zIndex option
-			if ( this.helper.css( "zIndex" ) ) {
-				this._storedZIndex = this.helper.css( "zIndex" );
-			}
-			this.helper.css( "zIndex", o.zIndex );
-		}
-
-		//Prepare scrolling
-		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				this.scrollParent[ 0 ].tagName !== "HTML" ) {
-			this.overflowOffset = this.scrollParent.offset();
-		}
-
-		//Call callbacks
-		this._trigger( "start", event, this._uiHash() );
-
-		//Recache the helper size
-		if ( !this._preserveHelperProportions ) {
-			this._cacheHelperProportions();
-		}
-
-		//Post "activate" events to possible containers
-		if ( !noActivation ) {
-			for ( i = this.containers.length - 1; i >= 0; i-- ) {
-				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
-			}
-		}
-
-		//Prepare possible droppables
-		if ( $.ui.ddmanager ) {
-			$.ui.ddmanager.current = this;
-		}
-
-		if ( $.ui.ddmanager && !o.dropBehaviour ) {
-			$.ui.ddmanager.prepareOffsets( this, event );
-		}
-
-		this.dragging = true;
-
-		this._addClass( this.helper, "ui-sortable-helper" );
-
-		// Execute the drag once - this causes the helper not to be visiblebefore getting its
-		// correct position
-		this._mouseDrag( event );
-		return true;
-
-	},
-
-	_mouseDrag: function( event ) {
-		var i, item, itemElement, intersection,
-			o = this.options,
-			scrolled = false;
-
-		//Compute the helpers position
-		this.position = this._generatePosition( event );
-		this.positionAbs = this._convertPositionTo( "absolute" );
-
-		if ( !this.lastPositionAbs ) {
-			this.lastPositionAbs = this.positionAbs;
-		}
-
-		//Do scrolling
-		if ( this.options.scroll ) {
-			if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-					this.scrollParent[ 0 ].tagName !== "HTML" ) {
-
-				if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
-						event.pageY < o.scrollSensitivity ) {
-					this.scrollParent[ 0 ].scrollTop =
-						scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
-				} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
-					this.scrollParent[ 0 ].scrollTop =
-						scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
-				}
-
-				if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
-						event.pageX < o.scrollSensitivity ) {
-					this.scrollParent[ 0 ].scrollLeft = scrolled =
-						this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
-				} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
-					this.scrollParent[ 0 ].scrollLeft = scrolled =
-						this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
-				}
-
-			} else {
-
-				if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
-					scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
-				} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
-						o.scrollSensitivity ) {
-					scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
-				}
-
-				if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
-					scrolled = this.document.scrollLeft(
-						this.document.scrollLeft() - o.scrollSpeed
-					);
-				} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
-						o.scrollSensitivity ) {
-					scrolled = this.document.scrollLeft(
-						this.document.scrollLeft() + o.scrollSpeed
-					);
-				}
-
-			}
-
-			if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
-				$.ui.ddmanager.prepareOffsets( this, event );
-			}
-		}
-
-		//Regenerate the absolute position used for position checks
-		this.positionAbs = this._convertPositionTo( "absolute" );
-
-		//Set the helper position
-		if ( !this.options.axis || this.options.axis !== "y" ) {
-			this.helper[ 0 ].style.left = this.position.left + "px";
-		}
-		if ( !this.options.axis || this.options.axis !== "x" ) {
-			this.helper[ 0 ].style.top = this.position.top + "px";
-		}
-
-		//Rearrange
-		for ( i = this.items.length - 1; i >= 0; i-- ) {
-
-			//Cache variables and intersection, continue if no intersection
-			item = this.items[ i ];
-			itemElement = item.item[ 0 ];
-			intersection = this._intersectsWithPointer( item );
-			if ( !intersection ) {
-				continue;
-			}
-
-			// Only put the placeholder inside the current Container, skip all
-			// items from other containers. This works because when moving
-			// an item from one container to another the
-			// currentContainer is switched before the placeholder is moved.
-			//
-			// Without this, moving items in "sub-sortables" can cause
-			// the placeholder to jitter between the outer and inner container.
-			if ( item.instance !== this.currentContainer ) {
-				continue;
-			}
-
-			// Cannot intersect with itself
-			// no useless actions that have been done before
-			// no action if the item moved is the parent of the item checked
-			if ( itemElement !== this.currentItem[ 0 ] &&
-				this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement &&
-				!$.contains( this.placeholder[ 0 ], itemElement ) &&
-				( this.options.type === "semi-dynamic" ?
-					!$.contains( this.element[ 0 ], itemElement ) :
-					true
-				)
-			) {
-
-				this.direction = intersection === 1 ? "down" : "up";
-
-				if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) {
-					this._rearrange( event, item );
-				} else {
-					break;
-				}
-
-				this._trigger( "change", event, this._uiHash() );
-				break;
-			}
-		}
-
-		//Post events to containers
-		this._contactContainers( event );
-
-		//Interconnect with droppables
-		if ( $.ui.ddmanager ) {
-			$.ui.ddmanager.drag( this, event );
-		}
-
-		//Call callbacks
-		this._trigger( "sort", event, this._uiHash() );
-
-		this.lastPositionAbs = this.positionAbs;
-		return false;
-
-	},
-
-	_mouseStop: function( event, noPropagation ) {
-
-		if ( !event ) {
-			return;
-		}
-
-		//If we are using droppables, inform the manager about the drop
-		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
-			$.ui.ddmanager.drop( this, event );
-		}
-
-		if ( this.options.revert ) {
-			var that = this,
-				cur = this.placeholder.offset(),
-				axis = this.options.axis,
-				animation = {};
-
-			if ( !axis || axis === "x" ) {
-				animation.left = cur.left - this.offset.parent.left - this.margins.left +
-					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
-						0 :
-						this.offsetParent[ 0 ].scrollLeft
-					);
-			}
-			if ( !axis || axis === "y" ) {
-				animation.top = cur.top - this.offset.parent.top - this.margins.top +
-					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
-						0 :
-						this.offsetParent[ 0 ].scrollTop
-					);
-			}
-			this.reverting = true;
-			$( this.helper ).animate(
-				animation,
-				parseInt( this.options.revert, 10 ) || 500,
-				function() {
-					that._clear( event );
-				}
-			);
-		} else {
-			this._clear( event, noPropagation );
-		}
-
-		return false;
-
-	},
-
-	cancel: function() {
-
-		if ( this.dragging ) {
-
-			this._mouseUp( new $.Event( "mouseup", { target: null } ) );
-
-			if ( this.options.helper === "original" ) {
-				this.currentItem.css( this._storedCSS );
-				this._removeClass( this.currentItem, "ui-sortable-helper" );
-			} else {
-				this.currentItem.show();
-			}
-
-			//Post deactivating events to containers
-			for ( var i = this.containers.length - 1; i >= 0; i-- ) {
-				this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
-				if ( this.containers[ i ].containerCache.over ) {
-					this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
-					this.containers[ i ].containerCache.over = 0;
-				}
-			}
-
-		}
-
-		if ( this.placeholder ) {
-
-			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
-			// it unbinds ALL events from the original node!
-			if ( this.placeholder[ 0 ].parentNode ) {
-				this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
-			}
-			if ( this.options.helper !== "original" && this.helper &&
-					this.helper[ 0 ].parentNode ) {
-				this.helper.remove();
-			}
-
-			$.extend( this, {
-				helper: null,
-				dragging: false,
-				reverting: false,
-				_noFinalSort: null
-			} );
-
-			if ( this.domPosition.prev ) {
-				$( this.domPosition.prev ).after( this.currentItem );
-			} else {
-				$( this.domPosition.parent ).prepend( this.currentItem );
-			}
-		}
-
-		return this;
-
-	},
-
-	serialize: function( o ) {
-
-		var items = this._getItemsAsjQuery( o && o.connected ),
-			str = [];
-		o = o || {};
-
-		$( items ).each( function() {
-			var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
-				.match( o.expression || ( /(.+)[\-=_](.+)/ ) );
-			if ( res ) {
-				str.push(
-					( o.key || res[ 1 ] + "[]" ) +
-					"=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
-			}
-		} );
-
-		if ( !str.length && o.key ) {
-			str.push( o.key + "=" );
-		}
-
-		return str.join( "&" );
-
-	},
-
-	toArray: function( o ) {
-
-		var items = this._getItemsAsjQuery( o && o.connected ),
-			ret = [];
-
-		o = o || {};
-
-		items.each( function() {
-			ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
-		} );
-		return ret;
-
-	},
-
-	/* Be careful with the following core functions */
-	_intersectsWith: function( item ) {
-
-		var x1 = this.positionAbs.left,
-			x2 = x1 + this.helperProportions.width,
-			y1 = this.positionAbs.top,
-			y2 = y1 + this.helperProportions.height,
-			l = item.left,
-			r = l + item.width,
-			t = item.top,
-			b = t + item.height,
-			dyClick = this.offset.click.top,
-			dxClick = this.offset.click.left,
-			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
-				( y1 + dyClick ) < b ),
-			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
-				( x1 + dxClick ) < r ),
-			isOverElement = isOverElementHeight && isOverElementWidth;
-
-		if ( this.options.tolerance === "pointer" ||
-			this.options.forcePointerForContainers ||
-			( this.options.tolerance !== "pointer" &&
-				this.helperProportions[ this.floating ? "width" : "height" ] >
-				item[ this.floating ? "width" : "height" ] )
-		) {
-			return isOverElement;
-		} else {
-
-			return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
-				x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
-				t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
-				y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
-
-		}
-	},
-
-	_intersectsWithPointer: function( item ) {
-		var verticalDirection, horizontalDirection,
-			isOverElementHeight = ( this.options.axis === "x" ) ||
-				this._isOverAxis(
-					this.positionAbs.top + this.offset.click.top, item.top, item.height ),
-			isOverElementWidth = ( this.options.axis === "y" ) ||
-				this._isOverAxis(
-					this.positionAbs.left + this.offset.click.left, item.left, item.width ),
-			isOverElement = isOverElementHeight && isOverElementWidth;
-
-		if ( !isOverElement ) {
-			return false;
-		}
-
-		verticalDirection = this._getDragVerticalDirection();
-		horizontalDirection = this._getDragHorizontalDirection();
-
-		return this.floating ?
-			( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
-			: ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
-
-	},
-
-	_intersectsWithSides: function( item ) {
-
-		var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
-				this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
-			isOverRightHalf = this._isOverAxis( this.positionAbs.left +
-				this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
-			verticalDirection = this._getDragVerticalDirection(),
-			horizontalDirection = this._getDragHorizontalDirection();
-
-		if ( this.floating && horizontalDirection ) {
-			return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
-				( horizontalDirection === "left" && !isOverRightHalf ) );
-		} else {
-			return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
-				( verticalDirection === "up" && !isOverBottomHalf ) );
-		}
-
-	},
-
-	_getDragVerticalDirection: function() {
-		var delta = this.positionAbs.top - this.lastPositionAbs.top;
-		return delta !== 0 && ( delta > 0 ? "down" : "up" );
-	},
-
-	_getDragHorizontalDirection: function() {
-		var delta = this.positionAbs.left - this.lastPositionAbs.left;
-		return delta !== 0 && ( delta > 0 ? "right" : "left" );
-	},
-
-	refresh: function( event ) {
-		this._refreshItems( event );
-		this._setHandleClassName();
-		this.refreshPositions();
-		return this;
-	},
-
-	_connectWith: function() {
-		var options = this.options;
-		return options.connectWith.constructor === String ?
-			[ options.connectWith ] :
-			options.connectWith;
-	},
-
-	_getItemsAsjQuery: function( connected ) {
-
-		var i, j, cur, inst,
-			items = [],
-			queries = [],
-			connectWith = this._connectWith();
-
-		if ( connectWith && connected ) {
-			for ( i = connectWith.length - 1; i >= 0; i-- ) {
-				cur = $( connectWith[ i ], this.document[ 0 ] );
-				for ( j = cur.length - 1; j >= 0; j-- ) {
-					inst = $.data( cur[ j ], this.widgetFullName );
-					if ( inst && inst !== this && !inst.options.disabled ) {
-						queries.push( [ $.isFunction( inst.options.items ) ?
-							inst.options.items.call( inst.element ) :
-							$( inst.options.items, inst.element )
-								.not( ".ui-sortable-helper" )
-								.not( ".ui-sortable-placeholder" ), inst ] );
-					}
-				}
-			}
-		}
-
-		queries.push( [ $.isFunction( this.options.items ) ?
-			this.options.items
-				.call( this.element, null, { options: this.options, item: this.currentItem } ) :
-			$( this.options.items, this.element )
-				.not( ".ui-sortable-helper" )
-				.not( ".ui-sortable-placeholder" ), this ] );
-
-		function addItems() {
-			items.push( this );
-		}
-		for ( i = queries.length - 1; i >= 0; i-- ) {
-			queries[ i ][ 0 ].each( addItems );
-		}
-
-		return $( items );
-
-	},
-
-	_removeCurrentsFromItems: function() {
-
-		var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
-
-		this.items = $.grep( this.items, function( item ) {
-			for ( var j = 0; j < list.length; j++ ) {
-				if ( list[ j ] === item.item[ 0 ] ) {
-					return false;
-				}
-			}
-			return true;
-		} );
-
-	},
-
-	_refreshItems: function( event ) {
-
-		this.items = [];
-		this.containers = [ this ];
-
-		var i, j, cur, inst, targetData, _queries, item, queriesLength,
-			items = this.items,
-			queries = [ [ $.isFunction( this.options.items ) ?
-				this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
-				$( this.options.items, this.element ), this ] ],
-			connectWith = this._connectWith();
-
-		//Shouldn't be run the first time through due to massive slow-down
-		if ( connectWith && this.ready ) {
-			for ( i = connectWith.length - 1; i >= 0; i-- ) {
-				cur = $( connectWith[ i ], this.document[ 0 ] );
-				for ( j = cur.length - 1; j >= 0; j-- ) {
-					inst = $.data( cur[ j ], this.widgetFullName );
-					if ( inst && inst !== this && !inst.options.disabled ) {
-						queries.push( [ $.isFunction( inst.options.items ) ?
-							inst.options.items
-								.call( inst.element[ 0 ], event, { item: this.currentItem } ) :
-							$( inst.options.items, inst.element ), inst ] );
-						this.containers.push( inst );
-					}
-				}
-			}
-		}
-
-		for ( i = queries.length - 1; i >= 0; i-- ) {
-			targetData = queries[ i ][ 1 ];
-			_queries = queries[ i ][ 0 ];
-
-			for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
-				item = $( _queries[ j ] );
-
-				// Data for target checking (mouse manager)
-				item.data( this.widgetName + "-item", targetData );
-
-				items.push( {
-					item: item,
-					instance: targetData,
-					width: 0, height: 0,
-					left: 0, top: 0
-				} );
-			}
-		}
-
-	},
-
-	refreshPositions: function( fast ) {
-
-		// Determine whether items are being displayed horizontally
-		this.floating = this.items.length ?
-			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
-			false;
-
-		//This has to be redone because due to the item being moved out/into the offsetParent,
-		// the offsetParent's position will change
-		if ( this.offsetParent && this.helper ) {
-			this.offset.parent = this._getParentOffset();
-		}
-
-		var i, item, t, p;
-
-		for ( i = this.items.length - 1; i >= 0; i-- ) {
-			item = this.items[ i ];
-
-			//We ignore calculating positions of all connected containers when we're not over them
-			if ( item.instance !== this.currentContainer && this.currentContainer &&
-					item.item[ 0 ] !== this.currentItem[ 0 ] ) {
-				continue;
-			}
-
-			t = this.options.toleranceElement ?
-				$( this.options.toleranceElement, item.item ) :
-				item.item;
-
-			if ( !fast ) {
-				item.width = t.outerWidth();
-				item.height = t.outerHeight();
-			}
-
-			p = t.offset();
-			item.left = p.left;
-			item.top = p.top;
-		}
-
-		if ( this.options.custom && this.options.custom.refreshContainers ) {
-			this.options.custom.refreshContainers.call( this );
-		} else {
-			for ( i = this.containers.length - 1; i >= 0; i-- ) {
-				p = this.containers[ i ].element.offset();
-				this.containers[ i ].containerCache.left = p.left;
-				this.containers[ i ].containerCache.top = p.top;
-				this.containers[ i ].containerCache.width =
-					this.containers[ i ].element.outerWidth();
-				this.containers[ i ].containerCache.height =
-					this.containers[ i ].element.outerHeight();
-			}
-		}
-
-		return this;
-	},
-
-	_createPlaceholder: function( that ) {
-		that = that || this;
-		var className,
-			o = that.options;
-
-		if ( !o.placeholder || o.placeholder.constructor === String ) {
-			className = o.placeholder;
-			o.placeholder = {
-				element: function() {
-
-					var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),
-						element = $( "<" + nodeName + ">", that.document[ 0 ] );
-
-						that._addClass( element, "ui-sortable-placeholder",
-								className || that.currentItem[ 0 ].className )
-							._removeClass( element, "ui-sortable-helper" );
-
-					if ( nodeName === "tbody" ) {
-						that._createTrPlaceholder(
-							that.currentItem.find( "tr" ).eq( 0 ),
-							$( "<tr>", that.document[ 0 ] ).appendTo( element )
-						);
-					} else if ( nodeName === "tr" ) {
-						that._createTrPlaceholder( that.currentItem, element );
-					} else if ( nodeName === "img" ) {
-						element.attr( "src", that.currentItem.attr( "src" ) );
-					}
-
-					if ( !className ) {
-						element.css( "visibility", "hidden" );
-					}
-
-					return element;
-				},
-				update: function( container, p ) {
-
-					// 1. If a className is set as 'placeholder option, we don't force sizes -
-					// the class is responsible for that
-					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a
-					// class name is specified
-					if ( className && !o.forcePlaceholderSize ) {
-						return;
-					}
-
-					//If the element doesn't have a actual height by itself (without styles coming
-					// from a stylesheet), it receives the inline height from the dragged item
-					if ( !p.height() ) {
-						p.height(
-							that.currentItem.innerHeight() -
-							parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
-							parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
-					}
-					if ( !p.width() ) {
-						p.width(
-							that.currentItem.innerWidth() -
-							parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
-							parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
-					}
-				}
-			};
-		}
-
-		//Create the placeholder
-		that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
-
-		//Append it after the actual current item
-		that.currentItem.after( that.placeholder );
-
-		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
-		o.placeholder.update( that, that.placeholder );
-
-	},
-
-	_createTrPlaceholder: function( sourceTr, targetTr ) {
-		var that = this;
-
-		sourceTr.children().each( function() {
-			$( "<td>&#160;</td>", that.document[ 0 ] )
-				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
-				.appendTo( targetTr );
-		} );
-	},
-
-	_contactContainers: function( event ) {
-		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
-			floating, axis,
-			innermostContainer = null,
-			innermostIndex = null;
-
-		// Get innermost container that intersects with item
-		for ( i = this.containers.length - 1; i >= 0; i-- ) {
-
-			// Never consider a container that's located within the item itself
-			if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
-				continue;
-			}
-
-			if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
-
-				// If we've already found a container and it's more "inner" than this, then continue
-				if ( innermostContainer &&
-						$.contains(
-							this.containers[ i ].element[ 0 ],
-							innermostContainer.element[ 0 ] ) ) {
-					continue;
-				}
-
-				innermostContainer = this.containers[ i ];
-				innermostIndex = i;
-
-			} else {
-
-				// container doesn't intersect. trigger "out" event if necessary
-				if ( this.containers[ i ].containerCache.over ) {
-					this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
-					this.containers[ i ].containerCache.over = 0;
-				}
-			}
-
-		}
-
-		// If no intersecting containers found, return
-		if ( !innermostContainer ) {
-			return;
-		}
-
-		// Move the item into the container if it's not there already
-		if ( this.containers.length === 1 ) {
-			if ( !this.containers[ innermostIndex ].containerCache.over ) {
-				this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
-				this.containers[ innermostIndex ].containerCache.over = 1;
-			}
-		} else {
-
-			// When entering a new container, we will find the item with the least distance and
-			// append our item near it
-			dist = 10000;
-			itemWithLeastDistance = null;
-			floating = innermostContainer.floating || this._isFloating( this.currentItem );
-			posProperty = floating ? "left" : "top";
-			sizeProperty = floating ? "width" : "height";
-			axis = floating ? "pageX" : "pageY";
-
-			for ( j = this.items.length - 1; j >= 0; j-- ) {
-				if ( !$.contains(
-						this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
-				) {
-					continue;
-				}
-				if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
-					continue;
-				}
-
-				cur = this.items[ j ].item.offset()[ posProperty ];
-				nearBottom = false;
-				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
-					nearBottom = true;
-				}
-
-				if ( Math.abs( event[ axis ] - cur ) < dist ) {
-					dist = Math.abs( event[ axis ] - cur );
-					itemWithLeastDistance = this.items[ j ];
-					this.direction = nearBottom ? "up" : "down";
-				}
-			}
-
-			//Check if dropOnEmpty is enabled
-			if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
-				return;
-			}
-
-			if ( this.currentContainer === this.containers[ innermostIndex ] ) {
-				if ( !this.currentContainer.containerCache.over ) {
-					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
-					this.currentContainer.containerCache.over = 1;
-				}
-				return;
-			}
-
-			itemWithLeastDistance ?
-				this._rearrange( event, itemWithLeastDistance, null, true ) :
-				this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
-			this._trigger( "change", event, this._uiHash() );
-			this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
-			this.currentContainer = this.containers[ innermostIndex ];
-
-			//Update the placeholder
-			this.options.placeholder.update( this.currentContainer, this.placeholder );
-
-			this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
-			this.containers[ innermostIndex ].containerCache.over = 1;
-		}
-
-	},
-
-	_createHelper: function( event ) {
-
-		var o = this.options,
-			helper = $.isFunction( o.helper ) ?
-				$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
-				( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
-
-		//Add the helper to the DOM if that didn't happen already
-		if ( !helper.parents( "body" ).length ) {
-			$( o.appendTo !== "parent" ?
-				o.appendTo :
-				this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );
-		}
-
-		if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
-			this._storedCSS = {
-				width: this.currentItem[ 0 ].style.width,
-				height: this.currentItem[ 0 ].style.height,
-				position: this.currentItem.css( "position" ),
-				top: this.currentItem.css( "top" ),
-				left: this.currentItem.css( "left" )
-			};
-		}
-
-		if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
-			helper.width( this.currentItem.width() );
-		}
-		if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
-			helper.height( this.currentItem.height() );
-		}
-
-		return helper;
-
-	},
-
-	_adjustOffsetFromHelper: function( obj ) {
-		if ( typeof obj === "string" ) {
-			obj = obj.split( " " );
-		}
-		if ( $.isArray( obj ) ) {
-			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
-		}
-		if ( "left" in obj ) {
-			this.offset.click.left = obj.left + this.margins.left;
-		}
-		if ( "right" in obj ) {
-			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-		}
-		if ( "top" in obj ) {
-			this.offset.click.top = obj.top + this.margins.top;
-		}
-		if ( "bottom" in obj ) {
-			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-		}
-	},
-
-	_getParentOffset: function() {
-
-		//Get the offsetParent and cache its position
-		this.offsetParent = this.helper.offsetParent();
-		var po = this.offsetParent.offset();
-
-		// This is a special case where we need to modify a offset calculated on start, since the
-		// following happened:
-		// 1. The position of the helper is absolute, so it's position is calculated based on the
-		// next positioned parent
-		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
-		// the document, which means that the scroll is included in the initial calculation of the
-		// offset of the parent, and never recalculated upon drag
-		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
-			po.left += this.scrollParent.scrollLeft();
-			po.top += this.scrollParent.scrollTop();
-		}
-
-		// This needs to be actually done for all browsers, since pageX/pageY includes this
-		// information with an ugly IE fix
-		if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
-				( this.offsetParent[ 0 ].tagName &&
-				this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
-			po = { top: 0, left: 0 };
-		}
-
-		return {
-			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
-			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
-		};
-
-	},
-
-	_getRelativeOffset: function() {
-
-		if ( this.cssPosition === "relative" ) {
-			var p = this.currentItem.position();
-			return {
-				top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
-					this.scrollParent.scrollTop(),
-				left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
-					this.scrollParent.scrollLeft()
-			};
-		} else {
-			return { top: 0, left: 0 };
-		}
-
-	},
-
-	_cacheMargins: function() {
-		this.margins = {
-			left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
-			top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
-		};
-	},
-
-	_cacheHelperProportions: function() {
-		this.helperProportions = {
-			width: this.helper.outerWidth(),
-			height: this.helper.outerHeight()
-		};
-	},
-
-	_setContainment: function() {
-
-		var ce, co, over,
-			o = this.options;
-		if ( o.containment === "parent" ) {
-			o.containment = this.helper[ 0 ].parentNode;
-		}
-		if ( o.containment === "document" || o.containment === "window" ) {
-			this.containment = [
-				0 - this.offset.relative.left - this.offset.parent.left,
-				0 - this.offset.relative.top - this.offset.parent.top,
-				o.containment === "document" ?
-					this.document.width() :
-					this.window.width() - this.helperProportions.width - this.margins.left,
-				( o.containment === "document" ?
-					( this.document.height() || document.body.parentNode.scrollHeight ) :
-					this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
-				) - this.helperProportions.height - this.margins.top
-			];
-		}
-
-		if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
-			ce = $( o.containment )[ 0 ];
-			co = $( o.containment ).offset();
-			over = ( $( ce ).css( "overflow" ) !== "hidden" );
-
-			this.containment = [
-				co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
-					( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
-				co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
-					( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
-				co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
-					( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
-					( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
-					this.helperProportions.width - this.margins.left,
-				co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
-					( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
-					( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
-					this.helperProportions.height - this.margins.top
-			];
-		}
-
-	},
-
-	_convertPositionTo: function( d, pos ) {
-
-		if ( !pos ) {
-			pos = this.position;
-		}
-		var mod = d === "absolute" ? 1 : -1,
-			scroll = this.cssPosition === "absolute" &&
-				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
-					this.offsetParent :
-					this.scrollParent,
-			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
-
-		return {
-			top: (
-
-				// The absolute mouse position
-				pos.top	+
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.top * mod +
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.top * mod -
-				( ( this.cssPosition === "fixed" ?
-					-this.scrollParent.scrollTop() :
-					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
-			),
-			left: (
-
-				// The absolute mouse position
-				pos.left +
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.left * mod +
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.left * mod	-
-				( ( this.cssPosition === "fixed" ?
-					-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
-					scroll.scrollLeft() ) * mod )
-			)
-		};
-
-	},
-
-	_generatePosition: function( event ) {
-
-		var top, left,
-			o = this.options,
-			pageX = event.pageX,
-			pageY = event.pageY,
-			scroll = this.cssPosition === "absolute" &&
-				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
-					this.offsetParent :
-					this.scrollParent,
-				scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
-
-		// This is another very weird special case that only happens for relative elements:
-		// 1. If the css position is relative
-		// 2. and the scroll parent is the document or similar to the offset parent
-		// we have to refresh the relative offset during the scroll so there are no jumps
-		if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
-			this.offset.relative = this._getRelativeOffset();
-		}
-
-		/*
-		 * - Position constraining -
-		 * Constrain the position to a mix of grid, containment.
-		 */
-
-		if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
-
-			if ( this.containment ) {
-				if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
-					pageX = this.containment[ 0 ] + this.offset.click.left;
-				}
-				if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
-					pageY = this.containment[ 1 ] + this.offset.click.top;
-				}
-				if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
-					pageX = this.containment[ 2 ] + this.offset.click.left;
-				}
-				if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
-					pageY = this.containment[ 3 ] + this.offset.click.top;
-				}
-			}
-
-			if ( o.grid ) {
-				top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
-					o.grid[ 1 ] ) * o.grid[ 1 ];
-				pageY = this.containment ?
-					( ( top - this.offset.click.top >= this.containment[ 1 ] &&
-						top - this.offset.click.top <= this.containment[ 3 ] ) ?
-							top :
-							( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
-								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
-								top;
-
-				left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
-					o.grid[ 0 ] ) * o.grid[ 0 ];
-				pageX = this.containment ?
-					( ( left - this.offset.click.left >= this.containment[ 0 ] &&
-						left - this.offset.click.left <= this.containment[ 2 ] ) ?
-							left :
-							( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
-								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
-								left;
-			}
-
-		}
-
-		return {
-			top: (
-
-				// The absolute mouse position
-				pageY -
-
-				// Click offset (relative to the element)
-				this.offset.click.top -
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.top -
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.top +
-				( ( this.cssPosition === "fixed" ?
-					-this.scrollParent.scrollTop() :
-					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
-			),
-			left: (
-
-				// The absolute mouse position
-				pageX -
-
-				// Click offset (relative to the element)
-				this.offset.click.left -
-
-				// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.relative.left -
-
-				// The offsetParent's offset without borders (offset + border)
-				this.offset.parent.left +
-				( ( this.cssPosition === "fixed" ?
-					-this.scrollParent.scrollLeft() :
-					scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
-			)
-		};
-
-	},
-
-	_rearrange: function( event, i, a, hardRefresh ) {
-
-		a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :
-			i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
-				( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
-
-		//Various things done here to improve the performance:
-		// 1. we create a setTimeout, that calls refreshPositions
-		// 2. on the instance, we have a counter variable, that get's higher after every append
-		// 3. on the local scope, we copy the counter variable, and check in the timeout,
-		// if it's still the same
-		// 4. this lets only the last addition to the timeout stack through
-		this.counter = this.counter ? ++this.counter : 1;
-		var counter = this.counter;
-
-		this._delay( function() {
-			if ( counter === this.counter ) {
-
-				//Precompute after each DOM insertion, NOT on mousemove
-				this.refreshPositions( !hardRefresh );
-			}
-		} );
-
-	},
-
-	_clear: function( event, noPropagation ) {
-
-		this.reverting = false;
-
-		// We delay all events that have to be triggered to after the point where the placeholder
-		// has been removed and everything else normalized again
-		var i,
-			delayedTriggers = [];
-
-		// We first have to update the dom position of the actual currentItem
-		// Note: don't do it if the current item is already removed (by a user), or it gets
-		// reappended (see #4088)
-		if ( !this._noFinalSort && this.currentItem.parent().length ) {
-			this.placeholder.before( this.currentItem );
-		}
-		this._noFinalSort = null;
-
-		if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
-			for ( i in this._storedCSS ) {
-				if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
-					this._storedCSS[ i ] = "";
-				}
-			}
-			this.currentItem.css( this._storedCSS );
-			this._removeClass( this.currentItem, "ui-sortable-helper" );
-		} else {
-			this.currentItem.show();
-		}
-
-		if ( this.fromOutside && !noPropagation ) {
-			delayedTriggers.push( function( event ) {
-				this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
-			} );
-		}
-		if ( ( this.fromOutside ||
-				this.domPosition.prev !==
-				this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
-				this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
-
-			// Trigger update callback if the DOM position has changed
-			delayedTriggers.push( function( event ) {
-				this._trigger( "update", event, this._uiHash() );
-			} );
-		}
-
-		// Check if the items Container has Changed and trigger appropriate
-		// events.
-		if ( this !== this.currentContainer ) {
-			if ( !noPropagation ) {
-				delayedTriggers.push( function( event ) {
-					this._trigger( "remove", event, this._uiHash() );
-				} );
-				delayedTriggers.push( ( function( c ) {
-					return function( event ) {
-						c._trigger( "receive", event, this._uiHash( this ) );
-					};
-				} ).call( this, this.currentContainer ) );
-				delayedTriggers.push( ( function( c ) {
-					return function( event ) {
-						c._trigger( "update", event, this._uiHash( this ) );
-					};
-				} ).call( this, this.currentContainer ) );
-			}
-		}
-
-		//Post events to containers
-		function delayEvent( type, instance, container ) {
-			return function( event ) {
-				container._trigger( type, event, instance._uiHash( instance ) );
-			};
-		}
-		for ( i = this.containers.length - 1; i >= 0; i-- ) {
-			if ( !noPropagation ) {
-				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
-			}
-			if ( this.containers[ i ].containerCache.over ) {
-				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
-				this.containers[ i ].containerCache.over = 0;
-			}
-		}
-
-		//Do what was originally in plugins
-		if ( this.storedCursor ) {
-			this.document.find( "body" ).css( "cursor", this.storedCursor );
-			this.storedStylesheet.remove();
-		}
-		if ( this._storedOpacity ) {
-			this.helper.css( "opacity", this._storedOpacity );
-		}
-		if ( this._storedZIndex ) {
-			this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
-		}
-
-		this.dragging = false;
-
-		if ( !noPropagation ) {
-			this._trigger( "beforeStop", event, this._uiHash() );
-		}
-
-		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
-		// it unbinds ALL events from the original node!
-		this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
-
-		if ( !this.cancelHelperRemoval ) {
-			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
-				this.helper.remove();
-			}
-			this.helper = null;
-		}
-
-		if ( !noPropagation ) {
-			for ( i = 0; i < delayedTriggers.length; i++ ) {
-
-				// Trigger all delayed events
-				delayedTriggers[ i ].call( this, event );
-			}
-			this._trigger( "stop", event, this._uiHash() );
-		}
-
-		this.fromOutside = false;
-		return !this.cancelHelperRemoval;
-
-	},
-
-	_trigger: function() {
-		if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
-			this.cancel();
-		}
-	},
-
-	_uiHash: function( _inst ) {
-		var inst = _inst || this;
-		return {
-			helper: inst.helper,
-			placeholder: inst.placeholder || $( [] ),
-			position: inst.position,
-			originalPosition: inst.originalPosition,
-			offset: inst.positionAbs,
-			item: inst.currentItem,
-			sender: _inst ? _inst.element : null
-		};
-	}
-
-} );
-
-
-/*!
- * jQuery UI Spinner 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Spinner
-//>>group: Widgets
-//>>description: Displays buttons to easily input numbers via the keyboard or mouse.
-//>>docs: http://api.jqueryui.com/spinner/
-//>>demos: http://jqueryui.com/spinner/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/spinner.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-function spinnerModifer( fn ) {
-	return function() {
-		var previous = this.element.val();
-		fn.apply( this, arguments );
-		this._refresh();
-		if ( previous !== this.element.val() ) {
-			this._trigger( "change" );
-		}
-	};
-}
-
-$.widget( "ui.spinner", {
-	version: "1.12.1",
-	defaultElement: "<input>",
-	widgetEventPrefix: "spin",
-	options: {
-		classes: {
-			"ui-spinner": "ui-corner-all",
-			"ui-spinner-down": "ui-corner-br",
-			"ui-spinner-up": "ui-corner-tr"
-		},
-		culture: null,
-		icons: {
-			down: "ui-icon-triangle-1-s",
-			up: "ui-icon-triangle-1-n"
-		},
-		incremental: true,
-		max: null,
-		min: null,
-		numberFormat: null,
-		page: 10,
-		step: 1,
-
-		change: null,
-		spin: null,
-		start: null,
-		stop: null
-	},
-
-	_create: function() {
-
-		// handle string values that need to be parsed
-		this._setOption( "max", this.options.max );
-		this._setOption( "min", this.options.min );
-		this._setOption( "step", this.options.step );
-
-		// Only format if there is a value, prevents the field from being marked
-		// as invalid in Firefox, see #9573.
-		if ( this.value() !== "" ) {
-
-			// Format the value, but don't constrain.
-			this._value( this.element.val(), true );
-		}
-
-		this._draw();
-		this._on( this._events );
-		this._refresh();
-
-		// Turning off autocomplete prevents the browser from remembering the
-		// value when navigating through history, so we re-enable autocomplete
-		// if the page is unloaded before the widget is destroyed. #7790
-		this._on( this.window, {
-			beforeunload: function() {
-				this.element.removeAttr( "autocomplete" );
-			}
-		} );
-	},
-
-	_getCreateOptions: function() {
-		var options = this._super();
-		var element = this.element;
-
-		$.each( [ "min", "max", "step" ], function( i, option ) {
-			var value = element.attr( option );
-			if ( value != null && value.length ) {
-				options[ option ] = value;
-			}
-		} );
-
-		return options;
-	},
-
-	_events: {
-		keydown: function( event ) {
-			if ( this._start( event ) && this._keydown( event ) ) {
-				event.preventDefault();
-			}
-		},
-		keyup: "_stop",
-		focus: function() {
-			this.previous = this.element.val();
-		},
-		blur: function( event ) {
-			if ( this.cancelBlur ) {
-				delete this.cancelBlur;
-				return;
-			}
-
-			this._stop();
-			this._refresh();
-			if ( this.previous !== this.element.val() ) {
-				this._trigger( "change", event );
-			}
-		},
-		mousewheel: function( event, delta ) {
-			if ( !delta ) {
-				return;
-			}
-			if ( !this.spinning && !this._start( event ) ) {
-				return false;
-			}
-
-			this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );
-			clearTimeout( this.mousewheelTimer );
-			this.mousewheelTimer = this._delay( function() {
-				if ( this.spinning ) {
-					this._stop( event );
-				}
-			}, 100 );
-			event.preventDefault();
-		},
-		"mousedown .ui-spinner-button": function( event ) {
-			var previous;
-
-			// We never want the buttons to have focus; whenever the user is
-			// interacting with the spinner, the focus should be on the input.
-			// If the input is focused then this.previous is properly set from
-			// when the input first received focus. If the input is not focused
-			// then we need to set this.previous based on the value before spinning.
-			previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?
-				this.previous : this.element.val();
-			function checkFocus() {
-				var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );
-				if ( !isActive ) {
-					this.element.trigger( "focus" );
-					this.previous = previous;
-
-					// support: IE
-					// IE sets focus asynchronously, so we need to check if focus
-					// moved off of the input because the user clicked on the button.
-					this._delay( function() {
-						this.previous = previous;
-					} );
-				}
-			}
-
-			// Ensure focus is on (or stays on) the text field
-			event.preventDefault();
-			checkFocus.call( this );
-
-			// Support: IE
-			// IE doesn't prevent moving focus even with event.preventDefault()
-			// so we set a flag to know when we should ignore the blur event
-			// and check (again) if focus moved off of the input.
-			this.cancelBlur = true;
-			this._delay( function() {
-				delete this.cancelBlur;
-				checkFocus.call( this );
-			} );
-
-			if ( this._start( event ) === false ) {
-				return;
-			}
-
-			this._repeat( null, $( event.currentTarget )
-				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
-		},
-		"mouseup .ui-spinner-button": "_stop",
-		"mouseenter .ui-spinner-button": function( event ) {
-
-			// button will add ui-state-active if mouse was down while mouseleave and kept down
-			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
-				return;
-			}
-
-			if ( this._start( event ) === false ) {
-				return false;
-			}
-			this._repeat( null, $( event.currentTarget )
-				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
-		},
-
-		// TODO: do we really want to consider this a stop?
-		// shouldn't we just stop the repeater and wait until mouseup before
-		// we trigger the stop event?
-		"mouseleave .ui-spinner-button": "_stop"
-	},
-
-	// Support mobile enhanced option and make backcompat more sane
-	_enhance: function() {
-		this.uiSpinner = this.element
-			.attr( "autocomplete", "off" )
-			.wrap( "<span>" )
-			.parent()
-
-				// Add buttons
-				.append(
-					"<a></a><a></a>"
-				);
-	},
-
-	_draw: function() {
-		this._enhance();
-
-		this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
-		this._addClass( "ui-spinner-input" );
-
-		this.element.attr( "role", "spinbutton" );
-
-		// Button bindings
-		this.buttons = this.uiSpinner.children( "a" )
-			.attr( "tabIndex", -1 )
-			.attr( "aria-hidden", true )
-			.button( {
-				classes: {
-					"ui-button": ""
-				}
-			} );
-
-		// TODO: Right now button does not support classes this is already updated in button PR
-		this._removeClass( this.buttons, "ui-corner-all" );
-
-		this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
-		this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
-		this.buttons.first().button( {
-			"icon": this.options.icons.up,
-			"showLabel": false
-		} );
-		this.buttons.last().button( {
-			"icon": this.options.icons.down,
-			"showLabel": false
-		} );
-
-		// IE 6 doesn't understand height: 50% for the buttons
-		// unless the wrapper has an explicit height
-		if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
-				this.uiSpinner.height() > 0 ) {
-			this.uiSpinner.height( this.uiSpinner.height() );
-		}
-	},
-
-	_keydown: function( event ) {
-		var options = this.options,
-			keyCode = $.ui.keyCode;
-
-		switch ( event.keyCode ) {
-		case keyCode.UP:
-			this._repeat( null, 1, event );
-			return true;
-		case keyCode.DOWN:
-			this._repeat( null, -1, event );
-			return true;
-		case keyCode.PAGE_UP:
-			this._repeat( null, options.page, event );
-			return true;
-		case keyCode.PAGE_DOWN:
-			this._repeat( null, -options.page, event );
-			return true;
-		}
-
-		return false;
-	},
-
-	_start: function( event ) {
-		if ( !this.spinning && this._trigger( "start", event ) === false ) {
-			return false;
-		}
-
-		if ( !this.counter ) {
-			this.counter = 1;
-		}
-		this.spinning = true;
-		return true;
-	},
-
-	_repeat: function( i, steps, event ) {
-		i = i || 500;
-
-		clearTimeout( this.timer );
-		this.timer = this._delay( function() {
-			this._repeat( 40, steps, event );
-		}, i );
-
-		this._spin( steps * this.options.step, event );
-	},
-
-	_spin: function( step, event ) {
-		var value = this.value() || 0;
-
-		if ( !this.counter ) {
-			this.counter = 1;
-		}
-
-		value = this._adjustValue( value + step * this._increment( this.counter ) );
-
-		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) {
-			this._value( value );
-			this.counter++;
-		}
-	},
-
-	_increment: function( i ) {
-		var incremental = this.options.incremental;
-
-		if ( incremental ) {
-			return $.isFunction( incremental ) ?
-				incremental( i ) :
-				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
-		}
-
-		return 1;
-	},
-
-	_precision: function() {
-		var precision = this._precisionOf( this.options.step );
-		if ( this.options.min !== null ) {
-			precision = Math.max( precision, this._precisionOf( this.options.min ) );
-		}
-		return precision;
-	},
-
-	_precisionOf: function( num ) {
-		var str = num.toString(),
-			decimal = str.indexOf( "." );
-		return decimal === -1 ? 0 : str.length - decimal - 1;
-	},
-
-	_adjustValue: function( value ) {
-		var base, aboveMin,
-			options = this.options;
-
-		// Make sure we're at a valid step
-		// - find out where we are relative to the base (min or 0)
-		base = options.min !== null ? options.min : 0;
-		aboveMin = value - base;
-
-		// - round to the nearest step
-		aboveMin = Math.round( aboveMin / options.step ) * options.step;
-
-		// - rounding is based on 0, so adjust back to our base
-		value = base + aboveMin;
-
-		// Fix precision from bad JS floating point math
-		value = parseFloat( value.toFixed( this._precision() ) );
-
-		// Clamp the value
-		if ( options.max !== null && value > options.max ) {
-			return options.max;
-		}
-		if ( options.min !== null && value < options.min ) {
-			return options.min;
-		}
-
-		return value;
-	},
-
-	_stop: function( event ) {
-		if ( !this.spinning ) {
-			return;
-		}
-
-		clearTimeout( this.timer );
-		clearTimeout( this.mousewheelTimer );
-		this.counter = 0;
-		this.spinning = false;
-		this._trigger( "stop", event );
-	},
-
-	_setOption: function( key, value ) {
-		var prevValue, first, last;
-
-		if ( key === "culture" || key === "numberFormat" ) {
-			prevValue = this._parse( this.element.val() );
-			this.options[ key ] = value;
-			this.element.val( this._format( prevValue ) );
-			return;
-		}
-
-		if ( key === "max" || key === "min" || key === "step" ) {
-			if ( typeof value === "string" ) {
-				value = this._parse( value );
-			}
-		}
-		if ( key === "icons" ) {
-			first = this.buttons.first().find( ".ui-icon" );
-			this._removeClass( first, null, this.options.icons.up );
-			this._addClass( first, null, value.up );
-			last = this.buttons.last().find( ".ui-icon" );
-			this._removeClass( last, null, this.options.icons.down );
-			this._addClass( last, null, value.down );
-		}
-
-		this._super( key, value );
-	},
-
-	_setOptionDisabled: function( value ) {
-		this._super( value );
-
-		this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
-		this.element.prop( "disabled", !!value );
-		this.buttons.button( value ? "disable" : "enable" );
-	},
-
-	_setOptions: spinnerModifer( function( options ) {
-		this._super( options );
-	} ),
-
-	_parse: function( val ) {
-		if ( typeof val === "string" && val !== "" ) {
-			val = window.Globalize && this.options.numberFormat ?
-				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
-		}
-		return val === "" || isNaN( val ) ? null : val;
-	},
-
-	_format: function( value ) {
-		if ( value === "" ) {
-			return "";
-		}
-		return window.Globalize && this.options.numberFormat ?
-			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
-			value;
-	},
-
-	_refresh: function() {
-		this.element.attr( {
-			"aria-valuemin": this.options.min,
-			"aria-valuemax": this.options.max,
-
-			// TODO: what should we do with values that can't be parsed?
-			"aria-valuenow": this._parse( this.element.val() )
-		} );
-	},
-
-	isValid: function() {
-		var value = this.value();
-
-		// Null is invalid
-		if ( value === null ) {
-			return false;
-		}
-
-		// If value gets adjusted, it's invalid
-		return value === this._adjustValue( value );
-	},
-
-	// Update the value without triggering change
-	_value: function( value, allowAny ) {
-		var parsed;
-		if ( value !== "" ) {
-			parsed = this._parse( value );
-			if ( parsed !== null ) {
-				if ( !allowAny ) {
-					parsed = this._adjustValue( parsed );
-				}
-				value = this._format( parsed );
-			}
-		}
-		this.element.val( value );
-		this._refresh();
-	},
-
-	_destroy: function() {
-		this.element
-			.prop( "disabled", false )
-			.removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" );
-
-		this.uiSpinner.replaceWith( this.element );
-	},
-
-	stepUp: spinnerModifer( function( steps ) {
-		this._stepUp( steps );
-	} ),
-	_stepUp: function( steps ) {
-		if ( this._start() ) {
-			this._spin( ( steps || 1 ) * this.options.step );
-			this._stop();
-		}
-	},
-
-	stepDown: spinnerModifer( function( steps ) {
-		this._stepDown( steps );
-	} ),
-	_stepDown: function( steps ) {
-		if ( this._start() ) {
-			this._spin( ( steps || 1 ) * -this.options.step );
-			this._stop();
-		}
-	},
-
-	pageUp: spinnerModifer( function( pages ) {
-		this._stepUp( ( pages || 1 ) * this.options.page );
-	} ),
-
-	pageDown: spinnerModifer( function( pages ) {
-		this._stepDown( ( pages || 1 ) * this.options.page );
-	} ),
-
-	value: function( newVal ) {
-		if ( !arguments.length ) {
-			return this._parse( this.element.val() );
-		}
-		spinnerModifer( this._value ).call( this, newVal );
-	},
-
-	widget: function() {
-		return this.uiSpinner;
-	}
-} );
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
-	// Backcompat for spinner html extension points
-	$.widget( "ui.spinner", $.ui.spinner, {
-		_enhance: function() {
-			this.uiSpinner = this.element
-				.attr( "autocomplete", "off" )
-				.wrap( this._uiSpinnerHtml() )
-				.parent()
-
-					// Add buttons
-					.append( this._buttonHtml() );
-		},
-		_uiSpinnerHtml: function() {
-			return "<span>";
-		},
-
-		_buttonHtml: function() {
-			return "<a></a><a></a>";
-		}
-	} );
-}
-
-var widgetsSpinner = $.ui.spinner;
-
-
-/*!
- * jQuery UI Tabs 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Tabs
-//>>group: Widgets
-//>>description: Transforms a set of container elements into a tab structure.
-//>>docs: http://api.jqueryui.com/tabs/
-//>>demos: http://jqueryui.com/tabs/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/tabs.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.tabs", {
-	version: "1.12.1",
-	delay: 300,
-	options: {
-		active: null,
-		classes: {
-			"ui-tabs": "ui-corner-all",
-			"ui-tabs-nav": "ui-corner-all",
-			"ui-tabs-panel": "ui-corner-bottom",
-			"ui-tabs-tab": "ui-corner-top"
-		},
-		collapsible: false,
-		event: "click",
-		heightStyle: "content",
-		hide: null,
-		show: null,
-
-		// Callbacks
-		activate: null,
-		beforeActivate: null,
-		beforeLoad: null,
-		load: null
-	},
-
-	_isLocal: ( function() {
-		var rhash = /#.*$/;
-
-		return function( anchor ) {
-			var anchorUrl, locationUrl;
-
-			anchorUrl = anchor.href.replace( rhash, "" );
-			locationUrl = location.href.replace( rhash, "" );
-
-			// Decoding may throw an error if the URL isn't UTF-8 (#9518)
-			try {
-				anchorUrl = decodeURIComponent( anchorUrl );
-			} catch ( error ) {}
-			try {
-				locationUrl = decodeURIComponent( locationUrl );
-			} catch ( error ) {}
-
-			return anchor.hash.length > 1 && anchorUrl === locationUrl;
-		};
-	} )(),
-
-	_create: function() {
-		var that = this,
-			options = this.options;
-
-		this.running = false;
-
-		this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
-		this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
-
-		this._processTabs();
-		options.active = this._initialActive();
-
-		// Take disabling tabs via class attribute from HTML
-		// into account and update option properly.
-		if ( $.isArray( options.disabled ) ) {
-			options.disabled = $.unique( options.disabled.concat(
-				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
-					return that.tabs.index( li );
-				} )
-			) ).sort();
-		}
-
-		// Check for length avoids error when initializing empty list
-		if ( this.options.active !== false && this.anchors.length ) {
-			this.active = this._findActive( options.active );
-		} else {
-			this.active = $();
-		}
-
-		this._refresh();
-
-		if ( this.active.length ) {
-			this.load( options.active );
-		}
-	},
-
-	_initialActive: function() {
-		var active = this.options.active,
-			collapsible = this.options.collapsible,
-			locationHash = location.hash.substring( 1 );
-
-		if ( active === null ) {
-
-			// check the fragment identifier in the URL
-			if ( locationHash ) {
-				this.tabs.each( function( i, tab ) {
-					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
-						active = i;
-						return false;
-					}
-				} );
-			}
-
-			// Check for a tab marked active via a class
-			if ( active === null ) {
-				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
-			}
-
-			// No active tab, set to false
-			if ( active === null || active === -1 ) {
-				active = this.tabs.length ? 0 : false;
-			}
-		}
-
-		// Handle numbers: negative, out of range
-		if ( active !== false ) {
-			active = this.tabs.index( this.tabs.eq( active ) );
-			if ( active === -1 ) {
-				active = collapsible ? false : 0;
-			}
-		}
-
-		// Don't allow collapsible: false and active: false
-		if ( !collapsible && active === false && this.anchors.length ) {
-			active = 0;
-		}
-
-		return active;
-	},
-
-	_getCreateEventData: function() {
-		return {
-			tab: this.active,
-			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
-		};
-	},
-
-	_tabKeydown: function( event ) {
-		var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
-			selectedIndex = this.tabs.index( focusedTab ),
-			goingForward = true;
-
-		if ( this._handlePageNav( event ) ) {
-			return;
-		}
-
-		switch ( event.keyCode ) {
-		case $.ui.keyCode.RIGHT:
-		case $.ui.keyCode.DOWN:
-			selectedIndex++;
-			break;
-		case $.ui.keyCode.UP:
-		case $.ui.keyCode.LEFT:
-			goingForward = false;
-			selectedIndex--;
-			break;
-		case $.ui.keyCode.END:
-			selectedIndex = this.anchors.length - 1;
-			break;
-		case $.ui.keyCode.HOME:
-			selectedIndex = 0;
-			break;
-		case $.ui.keyCode.SPACE:
-
-			// Activate only, no collapsing
-			event.preventDefault();
-			clearTimeout( this.activating );
-			this._activate( selectedIndex );
-			return;
-		case $.ui.keyCode.ENTER:
-
-			// Toggle (cancel delayed activation, allow collapsing)
-			event.preventDefault();
-			clearTimeout( this.activating );
-
-			// Determine if we should collapse or activate
-			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
-			return;
-		default:
-			return;
-		}
-
-		// Focus the appropriate tab, based on which key was pressed
-		event.preventDefault();
-		clearTimeout( this.activating );
-		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
-
-		// Navigating with control/command key will prevent automatic activation
-		if ( !event.ctrlKey && !event.metaKey ) {
-
-			// Update aria-selected immediately so that AT think the tab is already selected.
-			// Otherwise AT may confuse the user by stating that they need to activate the tab,
-			// but the tab will already be activated by the time the announcement finishes.
-			focusedTab.attr( "aria-selected", "false" );
-			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
-
-			this.activating = this._delay( function() {
-				this.option( "active", selectedIndex );
-			}, this.delay );
-		}
-	},
-
-	_panelKeydown: function( event ) {
-		if ( this._handlePageNav( event ) ) {
-			return;
-		}
-
-		// Ctrl+up moves focus to the current tab
-		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
-			event.preventDefault();
-			this.active.trigger( "focus" );
-		}
-	},
-
-	// Alt+page up/down moves focus to the previous/next tab (and activates)
-	_handlePageNav: function( event ) {
-		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
-			this._activate( this._focusNextTab( this.options.active - 1, false ) );
-			return true;
-		}
-		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
-			this._activate( this._focusNextTab( this.options.active + 1, true ) );
-			return true;
-		}
-	},
-
-	_findNextTab: function( index, goingForward ) {
-		var lastTabIndex = this.tabs.length - 1;
-
-		function constrain() {
-			if ( index > lastTabIndex ) {
-				index = 0;
-			}
-			if ( index < 0 ) {
-				index = lastTabIndex;
-			}
-			return index;
-		}
-
-		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
-			index = goingForward ? index + 1 : index - 1;
-		}
-
-		return index;
-	},
-
-	_focusNextTab: function( index, goingForward ) {
-		index = this._findNextTab( index, goingForward );
-		this.tabs.eq( index ).trigger( "focus" );
-		return index;
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "active" ) {
-
-			// _activate() will handle invalid values and update this.options
-			this._activate( value );
-			return;
-		}
-
-		this._super( key, value );
-
-		if ( key === "collapsible" ) {
-			this._toggleClass( "ui-tabs-collapsible", null, value );
-
-			// Setting collapsible: false while collapsed; open first panel
-			if ( !value && this.options.active === false ) {
-				this._activate( 0 );
-			}
-		}
-
-		if ( key === "event" ) {
-			this._setupEvents( value );
-		}
-
-		if ( key === "heightStyle" ) {
-			this._setupHeightStyle( value );
-		}
-	},
-
-	_sanitizeSelector: function( hash ) {
-		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
-	},
-
-	refresh: function() {
-		var options = this.options,
-			lis = this.tablist.children( ":has(a[href])" );
-
-		// Get disabled tabs from class attribute from HTML
-		// this will get converted to a boolean if needed in _refresh()
-		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
-			return lis.index( tab );
-		} );
-
-		this._processTabs();
-
-		// Was collapsed or no tabs
-		if ( options.active === false || !this.anchors.length ) {
-			options.active = false;
-			this.active = $();
-
-		// was active, but active tab is gone
-		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
-
-			// all remaining tabs are disabled
-			if ( this.tabs.length === options.disabled.length ) {
-				options.active = false;
-				this.active = $();
-
-			// activate previous tab
-			} else {
-				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
-			}
-
-		// was active, active tab still exists
-		} else {
-
-			// make sure active index is correct
-			options.active = this.tabs.index( this.active );
-		}
-
-		this._refresh();
-	},
-
-	_refresh: function() {
-		this._setOptionDisabled( this.options.disabled );
-		this._setupEvents( this.options.event );
-		this._setupHeightStyle( this.options.heightStyle );
-
-		this.tabs.not( this.active ).attr( {
-			"aria-selected": "false",
-			"aria-expanded": "false",
-			tabIndex: -1
-		} );
-		this.panels.not( this._getPanelForTab( this.active ) )
-			.hide()
-			.attr( {
-				"aria-hidden": "true"
-			} );
-
-		// Make sure one tab is in the tab order
-		if ( !this.active.length ) {
-			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
-		} else {
-			this.active
-				.attr( {
-					"aria-selected": "true",
-					"aria-expanded": "true",
-					tabIndex: 0
-				} );
-			this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
-			this._getPanelForTab( this.active )
-				.show()
-				.attr( {
-					"aria-hidden": "false"
-				} );
-		}
-	},
-
-	_processTabs: function() {
-		var that = this,
-			prevTabs = this.tabs,
-			prevAnchors = this.anchors,
-			prevPanels = this.panels;
-
-		this.tablist = this._getList().attr( "role", "tablist" );
-		this._addClass( this.tablist, "ui-tabs-nav",
-			"ui-helper-reset ui-helper-clearfix ui-widget-header" );
-
-		// Prevent users from focusing disabled tabs via click
-		this.tablist
-			.on( "mousedown" + this.eventNamespace, "> li", function( event ) {
-				if ( $( this ).is( ".ui-state-disabled" ) ) {
-					event.preventDefault();
-				}
-			} )
-
-			// Support: IE <9
-			// Preventing the default action in mousedown doesn't prevent IE
-			// from focusing the element, so if the anchor gets focused, blur.
-			// We don't have to worry about focusing the previously focused
-			// element since clicking on a non-focusable element should focus
-			// the body anyway.
-			.on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
-				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
-					this.blur();
-				}
-			} );
-
-		this.tabs = this.tablist.find( "> li:has(a[href])" )
-			.attr( {
-				role: "tab",
-				tabIndex: -1
-			} );
-		this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
-
-		this.anchors = this.tabs.map( function() {
-			return $( "a", this )[ 0 ];
-		} )
-			.attr( {
-				role: "presentation",
-				tabIndex: -1
-			} );
-		this._addClass( this.anchors, "ui-tabs-anchor" );
-
-		this.panels = $();
-
-		this.anchors.each( function( i, anchor ) {
-			var selector, panel, panelId,
-				anchorId = $( anchor ).uniqueId().attr( "id" ),
-				tab = $( anchor ).closest( "li" ),
-				originalAriaControls = tab.attr( "aria-controls" );
-
-			// Inline tab
-			if ( that._isLocal( anchor ) ) {
-				selector = anchor.hash;
-				panelId = selector.substring( 1 );
-				panel = that.element.find( that._sanitizeSelector( selector ) );
-
-			// remote tab
-			} else {
-
-				// If the tab doesn't already have aria-controls,
-				// generate an id by using a throw-away element
-				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
-				selector = "#" + panelId;
-				panel = that.element.find( selector );
-				if ( !panel.length ) {
-					panel = that._createPanel( panelId );
-					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
-				}
-				panel.attr( "aria-live", "polite" );
-			}
-
-			if ( panel.length ) {
-				that.panels = that.panels.add( panel );
-			}
-			if ( originalAriaControls ) {
-				tab.data( "ui-tabs-aria-controls", originalAriaControls );
-			}
-			tab.attr( {
-				"aria-controls": panelId,
-				"aria-labelledby": anchorId
-			} );
-			panel.attr( "aria-labelledby", anchorId );
-		} );
-
-		this.panels.attr( "role", "tabpanel" );
-		this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
-
-		// Avoid memory leaks (#10056)
-		if ( prevTabs ) {
-			this._off( prevTabs.not( this.tabs ) );
-			this._off( prevAnchors.not( this.anchors ) );
-			this._off( prevPanels.not( this.panels ) );
-		}
-	},
-
-	// Allow overriding how to find the list for rare usage scenarios (#7715)
-	_getList: function() {
-		return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
-	},
-
-	_createPanel: function( id ) {
-		return $( "<div>" )
-			.attr( "id", id )
-			.data( "ui-tabs-destroy", true );
-	},
-
-	_setOptionDisabled: function( disabled ) {
-		var currentItem, li, i;
-
-		if ( $.isArray( disabled ) ) {
-			if ( !disabled.length ) {
-				disabled = false;
-			} else if ( disabled.length === this.anchors.length ) {
-				disabled = true;
-			}
-		}
-
-		// Disable tabs
-		for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
-			currentItem = $( li );
-			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
-				currentItem.attr( "aria-disabled", "true" );
-				this._addClass( currentItem, null, "ui-state-disabled" );
-			} else {
-				currentItem.removeAttr( "aria-disabled" );
-				this._removeClass( currentItem, null, "ui-state-disabled" );
-			}
-		}
-
-		this.options.disabled = disabled;
-
-		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
-			disabled === true );
-	},
-
-	_setupEvents: function( event ) {
-		var events = {};
-		if ( event ) {
-			$.each( event.split( " " ), function( index, eventName ) {
-				events[ eventName ] = "_eventHandler";
-			} );
-		}
-
-		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
-
-		// Always prevent the default action, even when disabled
-		this._on( true, this.anchors, {
-			click: function( event ) {
-				event.preventDefault();
-			}
-		} );
-		this._on( this.anchors, events );
-		this._on( this.tabs, { keydown: "_tabKeydown" } );
-		this._on( this.panels, { keydown: "_panelKeydown" } );
-
-		this._focusable( this.tabs );
-		this._hoverable( this.tabs );
-	},
-
-	_setupHeightStyle: function( heightStyle ) {
-		var maxHeight,
-			parent = this.element.parent();
-
-		if ( heightStyle === "fill" ) {
-			maxHeight = parent.height();
-			maxHeight -= this.element.outerHeight() - this.element.height();
-
-			this.element.siblings( ":visible" ).each( function() {
-				var elem = $( this ),
-					position = elem.css( "position" );
-
-				if ( position === "absolute" || position === "fixed" ) {
-					return;
-				}
-				maxHeight -= elem.outerHeight( true );
-			} );
-
-			this.element.children().not( this.panels ).each( function() {
-				maxHeight -= $( this ).outerHeight( true );
-			} );
-
-			this.panels.each( function() {
-				$( this ).height( Math.max( 0, maxHeight -
-					$( this ).innerHeight() + $( this ).height() ) );
-			} )
-				.css( "overflow", "auto" );
-		} else if ( heightStyle === "auto" ) {
-			maxHeight = 0;
-			this.panels.each( function() {
-				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
-			} ).height( maxHeight );
-		}
-	},
-
-	_eventHandler: function( event ) {
-		var options = this.options,
-			active = this.active,
-			anchor = $( event.currentTarget ),
-			tab = anchor.closest( "li" ),
-			clickedIsActive = tab[ 0 ] === active[ 0 ],
-			collapsing = clickedIsActive && options.collapsible,
-			toShow = collapsing ? $() : this._getPanelForTab( tab ),
-			toHide = !active.length ? $() : this._getPanelForTab( active ),
-			eventData = {
-				oldTab: active,
-				oldPanel: toHide,
-				newTab: collapsing ? $() : tab,
-				newPanel: toShow
-			};
-
-		event.preventDefault();
-
-		if ( tab.hasClass( "ui-state-disabled" ) ||
-
-				// tab is already loading
-				tab.hasClass( "ui-tabs-loading" ) ||
-
-				// can't switch durning an animation
-				this.running ||
-
-				// click on active header, but not collapsible
-				( clickedIsActive && !options.collapsible ) ||
-
-				// allow canceling activation
-				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
-			return;
-		}
-
-		options.active = collapsing ? false : this.tabs.index( tab );
-
-		this.active = clickedIsActive ? $() : tab;
-		if ( this.xhr ) {
-			this.xhr.abort();
-		}
-
-		if ( !toHide.length && !toShow.length ) {
-			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
-		}
-
-		if ( toShow.length ) {
-			this.load( this.tabs.index( tab ), event );
-		}
-		this._toggle( event, eventData );
-	},
-
-	// Handles show/hide for selecting tabs
-	_toggle: function( event, eventData ) {
-		var that = this,
-			toShow = eventData.newPanel,
-			toHide = eventData.oldPanel;
-
-		this.running = true;
-
-		function complete() {
-			that.running = false;
-			that._trigger( "activate", event, eventData );
-		}
-
-		function show() {
-			that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
-
-			if ( toShow.length && that.options.show ) {
-				that._show( toShow, that.options.show, complete );
-			} else {
-				toShow.show();
-				complete();
-			}
-		}
-
-		// Start out by hiding, then showing, then completing
-		if ( toHide.length && this.options.hide ) {
-			this._hide( toHide, this.options.hide, function() {
-				that._removeClass( eventData.oldTab.closest( "li" ),
-					"ui-tabs-active", "ui-state-active" );
-				show();
-			} );
-		} else {
-			this._removeClass( eventData.oldTab.closest( "li" ),
-				"ui-tabs-active", "ui-state-active" );
-			toHide.hide();
-			show();
-		}
-
-		toHide.attr( "aria-hidden", "true" );
-		eventData.oldTab.attr( {
-			"aria-selected": "false",
-			"aria-expanded": "false"
-		} );
-
-		// If we're switching tabs, remove the old tab from the tab order.
-		// If we're opening from collapsed state, remove the previous tab from the tab order.
-		// If we're collapsing, then keep the collapsing tab in the tab order.
-		if ( toShow.length && toHide.length ) {
-			eventData.oldTab.attr( "tabIndex", -1 );
-		} else if ( toShow.length ) {
-			this.tabs.filter( function() {
-				return $( this ).attr( "tabIndex" ) === 0;
-			} )
-				.attr( "tabIndex", -1 );
-		}
-
-		toShow.attr( "aria-hidden", "false" );
-		eventData.newTab.attr( {
-			"aria-selected": "true",
-			"aria-expanded": "true",
-			tabIndex: 0
-		} );
-	},
-
-	_activate: function( index ) {
-		var anchor,
-			active = this._findActive( index );
-
-		// Trying to activate the already active panel
-		if ( active[ 0 ] === this.active[ 0 ] ) {
-			return;
-		}
-
-		// Trying to collapse, simulate a click on the current active header
-		if ( !active.length ) {
-			active = this.active;
-		}
-
-		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
-		this._eventHandler( {
-			target: anchor,
-			currentTarget: anchor,
-			preventDefault: $.noop
-		} );
-	},
-
-	_findActive: function( index ) {
-		return index === false ? $() : this.tabs.eq( index );
-	},
-
-	_getIndex: function( index ) {
-
-		// meta-function to give users option to provide a href string instead of a numerical index.
-		if ( typeof index === "string" ) {
-			index = this.anchors.index( this.anchors.filter( "[href$='" +
-				$.ui.escapeSelector( index ) + "']" ) );
-		}
-
-		return index;
-	},
-
-	_destroy: function() {
-		if ( this.xhr ) {
-			this.xhr.abort();
-		}
-
-		this.tablist
-			.removeAttr( "role" )
-			.off( this.eventNamespace );
-
-		this.anchors
-			.removeAttr( "role tabIndex" )
-			.removeUniqueId();
-
-		this.tabs.add( this.panels ).each( function() {
-			if ( $.data( this, "ui-tabs-destroy" ) ) {
-				$( this ).remove();
-			} else {
-				$( this ).removeAttr( "role tabIndex " +
-					"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
-			}
-		} );
-
-		this.tabs.each( function() {
-			var li = $( this ),
-				prev = li.data( "ui-tabs-aria-controls" );
-			if ( prev ) {
-				li
-					.attr( "aria-controls", prev )
-					.removeData( "ui-tabs-aria-controls" );
-			} else {
-				li.removeAttr( "aria-controls" );
-			}
-		} );
-
-		this.panels.show();
-
-		if ( this.options.heightStyle !== "content" ) {
-			this.panels.css( "height", "" );
-		}
-	},
-
-	enable: function( index ) {
-		var disabled = this.options.disabled;
-		if ( disabled === false ) {
-			return;
-		}
-
-		if ( index === undefined ) {
-			disabled = false;
-		} else {
-			index = this._getIndex( index );
-			if ( $.isArray( disabled ) ) {
-				disabled = $.map( disabled, function( num ) {
-					return num !== index ? num : null;
-				} );
-			} else {
-				disabled = $.map( this.tabs, function( li, num ) {
-					return num !== index ? num : null;
-				} );
-			}
-		}
-		this._setOptionDisabled( disabled );
-	},
-
-	disable: function( index ) {
-		var disabled = this.options.disabled;
-		if ( disabled === true ) {
-			return;
-		}
-
-		if ( index === undefined ) {
-			disabled = true;
-		} else {
-			index = this._getIndex( index );
-			if ( $.inArray( index, disabled ) !== -1 ) {
-				return;
-			}
-			if ( $.isArray( disabled ) ) {
-				disabled = $.merge( [ index ], disabled ).sort();
-			} else {
-				disabled = [ index ];
-			}
-		}
-		this._setOptionDisabled( disabled );
-	},
-
-	load: function( index, event ) {
-		index = this._getIndex( index );
-		var that = this,
-			tab = this.tabs.eq( index ),
-			anchor = tab.find( ".ui-tabs-anchor" ),
-			panel = this._getPanelForTab( tab ),
-			eventData = {
-				tab: tab,
-				panel: panel
-			},
-			complete = function( jqXHR, status ) {
-				if ( status === "abort" ) {
-					that.panels.stop( false, true );
-				}
-
-				that._removeClass( tab, "ui-tabs-loading" );
-				panel.removeAttr( "aria-busy" );
-
-				if ( jqXHR === that.xhr ) {
-					delete that.xhr;
-				}
-			};
-
-		// Not remote
-		if ( this._isLocal( anchor[ 0 ] ) ) {
-			return;
-		}
-
-		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
-
-		// Support: jQuery <1.8
-		// jQuery <1.8 returns false if the request is canceled in beforeSend,
-		// but as of 1.8, $.ajax() always returns a jqXHR object.
-		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
-			this._addClass( tab, "ui-tabs-loading" );
-			panel.attr( "aria-busy", "true" );
-
-			this.xhr
-				.done( function( response, status, jqXHR ) {
-
-					// support: jQuery <1.8
-					// http://bugs.jquery.com/ticket/11778
-					setTimeout( function() {
-						panel.html( response );
-						that._trigger( "load", event, eventData );
-
-						complete( jqXHR, status );
-					}, 1 );
-				} )
-				.fail( function( jqXHR, status ) {
-
-					// support: jQuery <1.8
-					// http://bugs.jquery.com/ticket/11778
-					setTimeout( function() {
-						complete( jqXHR, status );
-					}, 1 );
-				} );
-		}
-	},
-
-	_ajaxSettings: function( anchor, event, eventData ) {
-		var that = this;
-		return {
-
-			// Support: IE <11 only
-			// Strip any hash that exists to prevent errors with the Ajax request
-			url: anchor.attr( "href" ).replace( /#.*$/, "" ),
-			beforeSend: function( jqXHR, settings ) {
-				return that._trigger( "beforeLoad", event,
-					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
-			}
-		};
-	},
-
-	_getPanelForTab: function( tab ) {
-		var id = $( tab ).attr( "aria-controls" );
-		return this.element.find( this._sanitizeSelector( "#" + id ) );
-	}
-} );
-
-// DEPRECATED
-// TODO: Switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
-	// Backcompat for ui-tab class (now ui-tabs-tab)
-	$.widget( "ui.tabs", $.ui.tabs, {
-		_processTabs: function() {
-			this._superApply( arguments );
-			this._addClass( this.tabs, "ui-tab" );
-		}
-	} );
-}
-
-var widgetsTabs = $.ui.tabs;
-
-
-/*!
- * jQuery UI Tooltip 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Tooltip
-//>>group: Widgets
-//>>description: Shows additional information for any element on hover or focus.
-//>>docs: http://api.jqueryui.com/tooltip/
-//>>demos: http://jqueryui.com/tooltip/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/tooltip.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.tooltip", {
-	version: "1.12.1",
-	options: {
-		classes: {
-			"ui-tooltip": "ui-corner-all ui-widget-shadow"
-		},
-		content: function() {
-
-			// support: IE<9, Opera in jQuery <1.7
-			// .text() can't accept undefined, so coerce to a string
-			var title = $( this ).attr( "title" ) || "";
-
-			// Escape title, since we're going from an attribute to raw HTML
-			return $( "<a>" ).text( title ).html();
-		},
-		hide: true,
-
-		// Disabled elements have inconsistent behavior across browsers (#8661)
-		items: "[title]:not([disabled])",
-		position: {
-			my: "left top+15",
-			at: "left bottom",
-			collision: "flipfit flip"
-		},
-		show: true,
-		track: false,
-
-		// Callbacks
-		close: null,
-		open: null
-	},
-
-	_addDescribedBy: function( elem, id ) {
-		var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ );
-		describedby.push( id );
-		elem
-			.data( "ui-tooltip-id", id )
-			.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
-	},
-
-	_removeDescribedBy: function( elem ) {
-		var id = elem.data( "ui-tooltip-id" ),
-			describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ),
-			index = $.inArray( id, describedby );
-
-		if ( index !== -1 ) {
-			describedby.splice( index, 1 );
-		}
-
-		elem.removeData( "ui-tooltip-id" );
-		describedby = $.trim( describedby.join( " " ) );
-		if ( describedby ) {
-			elem.attr( "aria-describedby", describedby );
-		} else {
-			elem.removeAttr( "aria-describedby" );
-		}
-	},
-
-	_create: function() {
-		this._on( {
-			mouseover: "open",
-			focusin: "open"
-		} );
-
-		// IDs of generated tooltips, needed for destroy
-		this.tooltips = {};
-
-		// IDs of parent tooltips where we removed the title attribute
-		this.parents = {};
-
-		// Append the aria-live region so tooltips announce correctly
-		this.liveRegion = $( "<div>" )
-			.attr( {
-				role: "log",
-				"aria-live": "assertive",
-				"aria-relevant": "additions"
-			} )
-			.appendTo( this.document[ 0 ].body );
-		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
-
-		this.disabledTitles = $( [] );
-	},
-
-	_setOption: function( key, value ) {
-		var that = this;
-
-		this._super( key, value );
-
-		if ( key === "content" ) {
-			$.each( this.tooltips, function( id, tooltipData ) {
-				that._updateContent( tooltipData.element );
-			} );
-		}
-	},
-
-	_setOptionDisabled: function( value ) {
-		this[ value ? "_disable" : "_enable" ]();
-	},
-
-	_disable: function() {
-		var that = this;
-
-		// Close open tooltips
-		$.each( this.tooltips, function( id, tooltipData ) {
-			var event = $.Event( "blur" );
-			event.target = event.currentTarget = tooltipData.element[ 0 ];
-			that.close( event, true );
-		} );
-
-		// Remove title attributes to prevent native tooltips
-		this.disabledTitles = this.disabledTitles.add(
-			this.element.find( this.options.items ).addBack()
-				.filter( function() {
-					var element = $( this );
-					if ( element.is( "[title]" ) ) {
-						return element
-							.data( "ui-tooltip-title", element.attr( "title" ) )
-							.removeAttr( "title" );
-					}
-				} )
-		);
-	},
-
-	_enable: function() {
-
-		// restore title attributes
-		this.disabledTitles.each( function() {
-			var element = $( this );
-			if ( element.data( "ui-tooltip-title" ) ) {
-				element.attr( "title", element.data( "ui-tooltip-title" ) );
-			}
-		} );
-		this.disabledTitles = $( [] );
-	},
-
-	open: function( event ) {
-		var that = this,
-			target = $( event ? event.target : this.element )
-
-				// we need closest here due to mouseover bubbling,
-				// but always pointing at the same event target
-				.closest( this.options.items );
-
-		// No element to show a tooltip for or the tooltip is already open
-		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
-			return;
-		}
-
-		if ( target.attr( "title" ) ) {
-			target.data( "ui-tooltip-title", target.attr( "title" ) );
-		}
-
-		target.data( "ui-tooltip-open", true );
-
-		// Kill parent tooltips, custom or native, for hover
-		if ( event && event.type === "mouseover" ) {
-			target.parents().each( function() {
-				var parent = $( this ),
-					blurEvent;
-				if ( parent.data( "ui-tooltip-open" ) ) {
-					blurEvent = $.Event( "blur" );
-					blurEvent.target = blurEvent.currentTarget = this;
-					that.close( blurEvent, true );
-				}
-				if ( parent.attr( "title" ) ) {
-					parent.uniqueId();
-					that.parents[ this.id ] = {
-						element: this,
-						title: parent.attr( "title" )
-					};
-					parent.attr( "title", "" );
-				}
-			} );
-		}
-
-		this._registerCloseHandlers( event, target );
-		this._updateContent( target, event );
-	},
-
-	_updateContent: function( target, event ) {
-		var content,
-			contentOption = this.options.content,
-			that = this,
-			eventType = event ? event.type : null;
-
-		if ( typeof contentOption === "string" || contentOption.nodeType ||
-				contentOption.jquery ) {
-			return this._open( event, target, contentOption );
-		}
-
-		content = contentOption.call( target[ 0 ], function( response ) {
-
-			// IE may instantly serve a cached response for ajax requests
-			// delay this call to _open so the other call to _open runs first
-			that._delay( function() {
-
-				// Ignore async response if tooltip was closed already
-				if ( !target.data( "ui-tooltip-open" ) ) {
-					return;
-				}
-
-				// JQuery creates a special event for focusin when it doesn't
-				// exist natively. To improve performance, the native event
-				// object is reused and the type is changed. Therefore, we can't
-				// rely on the type being correct after the event finished
-				// bubbling, so we set it back to the previous value. (#8740)
-				if ( event ) {
-					event.type = eventType;
-				}
-				this._open( event, target, response );
-			} );
-		} );
-		if ( content ) {
-			this._open( event, target, content );
-		}
-	},
-
-	_open: function( event, target, content ) {
-		var tooltipData, tooltip, delayedShow, a11yContent,
-			positionOption = $.extend( {}, this.options.position );
-
-		if ( !content ) {
-			return;
-		}
-
-		// Content can be updated multiple times. If the tooltip already
-		// exists, then just update the content and bail.
-		tooltipData = this._find( target );
-		if ( tooltipData ) {
-			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
-			return;
-		}
-
-		// If we have a title, clear it to prevent the native tooltip
-		// we have to check first to avoid defining a title if none exists
-		// (we don't want to cause an element to start matching [title])
-		//
-		// We use removeAttr only for key events, to allow IE to export the correct
-		// accessible attributes. For mouse events, set to empty string to avoid
-		// native tooltip showing up (happens only when removing inside mouseover).
-		if ( target.is( "[title]" ) ) {
-			if ( event && event.type === "mouseover" ) {
-				target.attr( "title", "" );
-			} else {
-				target.removeAttr( "title" );
-			}
-		}
-
-		tooltipData = this._tooltip( target );
-		tooltip = tooltipData.tooltip;
-		this._addDescribedBy( target, tooltip.attr( "id" ) );
-		tooltip.find( ".ui-tooltip-content" ).html( content );
-
-		// Support: Voiceover on OS X, JAWS on IE <= 9
-		// JAWS announces deletions even when aria-relevant="additions"
-		// Voiceover will sometimes re-read the entire log region's contents from the beginning
-		this.liveRegion.children().hide();
-		a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() );
-		a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" );
-		a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
-		a11yContent.appendTo( this.liveRegion );
-
-		function position( event ) {
-			positionOption.of = event;
-			if ( tooltip.is( ":hidden" ) ) {
-				return;
-			}
-			tooltip.position( positionOption );
-		}
-		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
-			this._on( this.document, {
-				mousemove: position
-			} );
-
-			// trigger once to override element-relative positioning
-			position( event );
-		} else {
-			tooltip.position( $.extend( {
-				of: target
-			}, this.options.position ) );
-		}
-
-		tooltip.hide();
-
-		this._show( tooltip, this.options.show );
-
-		// Handle tracking tooltips that are shown with a delay (#8644). As soon
-		// as the tooltip is visible, position the tooltip using the most recent
-		// event.
-		// Adds the check to add the timers only when both delay and track options are set (#14682)
-		if ( this.options.track && this.options.show && this.options.show.delay ) {
-			delayedShow = this.delayedShow = setInterval( function() {
-				if ( tooltip.is( ":visible" ) ) {
-					position( positionOption.of );
-					clearInterval( delayedShow );
-				}
-			}, $.fx.interval );
-		}
-
-		this._trigger( "open", event, { tooltip: tooltip } );
-	},
-
-	_registerCloseHandlers: function( event, target ) {
-		var events = {
-			keyup: function( event ) {
-				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
-					var fakeEvent = $.Event( event );
-					fakeEvent.currentTarget = target[ 0 ];
-					this.close( fakeEvent, true );
-				}
-			}
-		};
-
-		// Only bind remove handler for delegated targets. Non-delegated
-		// tooltips will handle this in destroy.
-		if ( target[ 0 ] !== this.element[ 0 ] ) {
-			events.remove = function() {
-				this._removeTooltip( this._find( target ).tooltip );
-			};
-		}
-
-		if ( !event || event.type === "mouseover" ) {
-			events.mouseleave = "close";
-		}
-		if ( !event || event.type === "focusin" ) {
-			events.focusout = "close";
-		}
-		this._on( true, target, events );
-	},
-
-	close: function( event ) {
-		var tooltip,
-			that = this,
-			target = $( event ? event.currentTarget : this.element ),
-			tooltipData = this._find( target );
-
-		// The tooltip may already be closed
-		if ( !tooltipData ) {
-
-			// We set ui-tooltip-open immediately upon open (in open()), but only set the
-			// additional data once there's actually content to show (in _open()). So even if the
-			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
-			// the period between open() and _open().
-			target.removeData( "ui-tooltip-open" );
-			return;
-		}
-
-		tooltip = tooltipData.tooltip;
-
-		// Disabling closes the tooltip, so we need to track when we're closing
-		// to avoid an infinite loop in case the tooltip becomes disabled on close
-		if ( tooltipData.closing ) {
-			return;
-		}
-
-		// Clear the interval for delayed tracking tooltips
-		clearInterval( this.delayedShow );
-
-		// Only set title if we had one before (see comment in _open())
-		// If the title attribute has changed since open(), don't restore
-		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
-			target.attr( "title", target.data( "ui-tooltip-title" ) );
-		}
-
-		this._removeDescribedBy( target );
-
-		tooltipData.hiding = true;
-		tooltip.stop( true );
-		this._hide( tooltip, this.options.hide, function() {
-			that._removeTooltip( $( this ) );
-		} );
-
-		target.removeData( "ui-tooltip-open" );
-		this._off( target, "mouseleave focusout keyup" );
-
-		// Remove 'remove' binding only on delegated targets
-		if ( target[ 0 ] !== this.element[ 0 ] ) {
-			this._off( target, "remove" );
-		}
-		this._off( this.document, "mousemove" );
-
-		if ( event && event.type === "mouseleave" ) {
-			$.each( this.parents, function( id, parent ) {
-				$( parent.element ).attr( "title", parent.title );
-				delete that.parents[ id ];
-			} );
-		}
-
-		tooltipData.closing = true;
-		this._trigger( "close", event, { tooltip: tooltip } );
-		if ( !tooltipData.hiding ) {
-			tooltipData.closing = false;
-		}
-	},
-
-	_tooltip: function( element ) {
-		var tooltip = $( "<div>" ).attr( "role", "tooltip" ),
-			content = $( "<div>" ).appendTo( tooltip ),
-			id = tooltip.uniqueId().attr( "id" );
-
-		this._addClass( content, "ui-tooltip-content" );
-		this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" );
-
-		tooltip.appendTo( this._appendTo( element ) );
-
-		return this.tooltips[ id ] = {
-			element: element,
-			tooltip: tooltip
-		};
-	},
-
-	_find: function( target ) {
-		var id = target.data( "ui-tooltip-id" );
-		return id ? this.tooltips[ id ] : null;
-	},
-
-	_removeTooltip: function( tooltip ) {
-		tooltip.remove();
-		delete this.tooltips[ tooltip.attr( "id" ) ];
-	},
-
-	_appendTo: function( target ) {
-		var element = target.closest( ".ui-front, dialog" );
-
-		if ( !element.length ) {
-			element = this.document[ 0 ].body;
-		}
-
-		return element;
-	},
-
-	_destroy: function() {
-		var that = this;
-
-		// Close open tooltips
-		$.each( this.tooltips, function( id, tooltipData ) {
-
-			// Delegate to close method to handle common cleanup
-			var event = $.Event( "blur" ),
-				element = tooltipData.element;
-			event.target = event.currentTarget = element[ 0 ];
-			that.close( event, true );
-
-			// Remove immediately; destroying an open tooltip doesn't use the
-			// hide animation
-			$( "#" + id ).remove();
-
-			// Restore the title
-			if ( element.data( "ui-tooltip-title" ) ) {
-
-				// If the title attribute has changed since open(), don't restore
-				if ( !element.attr( "title" ) ) {
-					element.attr( "title", element.data( "ui-tooltip-title" ) );
-				}
-				element.removeData( "ui-tooltip-title" );
-			}
-		} );
-		this.liveRegion.remove();
-	}
-} );
-
-// DEPRECATED
-// TODO: Switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
-	// Backcompat for tooltipClass option
-	$.widget( "ui.tooltip", $.ui.tooltip, {
-		options: {
-			tooltipClass: null
-		},
-		_tooltip: function() {
-			var tooltipData = this._superApply( arguments );
-			if ( this.options.tooltipClass ) {
-				tooltipData.tooltip.addClass( this.options.tooltipClass );
-			}
-			return tooltipData;
-		}
-	} );
-}
-
-var widgetsTooltip = $.ui.tooltip;
-
-
-
-
-}));
\ No newline at end of file
diff --git a/ui/legacy/lib/jquery.cookies.js b/ui/legacy/lib/jquery.cookies.js
deleted file mode 100644
index 6df1fac..0000000
--- a/ui/legacy/lib/jquery.cookies.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * Cookie plugin
- *
- * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- */
-
-/**
- * Create a cookie with the given name and value and other optional parameters.
- *
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Set the value of a cookie.
- * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
- * @desc Create a cookie with all available options.
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Create a session cookie.
- * @example $.cookie('the_cookie', null);
- * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
- *       used when the cookie was set.
- *
- * @param String name The name of the cookie.
- * @param String value The value of the cookie.
- * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
- * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
- *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
- *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
- *                             when the the browser exits.
- * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
- * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
- * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
- *                        require a secure protocol (like HTTPS).
- * @type undefined
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl@stilbuero.de
- */
-
-/**
- * Get the value of a cookie with the given name.
- *
- * @example $.cookie('the_cookie');
- * @desc Get the value of a cookie.
- *
- * @param String name The name of the cookie.
- * @return The value of the cookie.
- * @type String
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl@stilbuero.de
- */
-jQuery.cookie = function(name, value, options) {
-    if (typeof value != 'undefined') { // name and value given, set cookie
-        options = options || {};
-        if (value === null) {
-            value = '';
-            options.expires = -1;
-        }
-        var expires = '';
-        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
-            var date;
-            if (typeof options.expires == 'number') {
-                date = new Date();
-                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
-            } else {
-                date = options.expires;
-            }
-            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
-        }
-        // CAUTION: Needed to parenthesize options.path and options.domain
-        // in the following expressions, otherwise they evaluate to undefined
-        // in the packed version for some reason...
-        var path = options.path ? '; path=' + (options.path) : '';
-        var domain = options.domain ? '; domain=' + (options.domain) : '';
-        var secure = options.secure ? '; secure' : '';
-        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
-    } else { // only name given, get cookie
-        var cookieValue = null;
-        if (document.cookie && document.cookie != '') {
-            var cookies = document.cookie.split(';');
-            for (var i = 0; i < cookies.length; i++) {
-                var cookie = jQuery.trim(cookies[i]);
-                // Does this cookie string begin with the name we want?
-                if (cookie.substring(0, name.length + 1) == (name + '=')) {
-                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
-                    break;
-                }
-            }
-        }
-        return cookieValue;
-    }
-};
\ No newline at end of file
diff --git a/ui/legacy/lib/jquery.easing.js b/ui/legacy/lib/jquery.easing.js
deleted file mode 100644
index 31587dd..0000000
--- a/ui/legacy/lib/jquery.easing.js
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
- *
- * Uses the built in easing capabilities added In jQuery 1.1
- * to offer multiple easing options
- *
- * TERMS OF USE - jQuery Easing
- * 
- * Open source under the BSD License. 
- * 
- * Copyright © 2008 George McGinley Smith
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- * Redistributions of source code must retain the above copyright notice, this list of 
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list 
- * of conditions and the following disclaimer in the documentation and/or other materials 
- * provided with the distribution.
- * 
- * Neither the name of the author nor the names of contributors may be used to endorse 
- * or promote products derived from this software without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
- * OF THE POSSIBILITY OF SUCH DAMAGE. 
- *
-*/
-
-// t: current time, b: begInnIng value, c: change In value, d: duration
-jQuery.easing['jswing'] = jQuery.easing['swing'];
-
-jQuery.extend( jQuery.easing,
-{
-	def: 'easeOutQuad',
-	swing: function (x, t, b, c, d) {
-		//alert(jQuery.easing.default);
-		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
-	},
-	easeInQuad: function (x, t, b, c, d) {
-		return c*(t/=d)*t + b;
-	},
-	easeOutQuad: function (x, t, b, c, d) {
-		return -c *(t/=d)*(t-2) + b;
-	},
-	easeInOutQuad: function (x, t, b, c, d) {
-		if ((t/=d/2) < 1) return c/2*t*t + b;
-		return -c/2 * ((--t)*(t-2) - 1) + b;
-	},
-	easeInCubic: function (x, t, b, c, d) {
-		return c*(t/=d)*t*t + b;
-	},
-	easeOutCubic: function (x, t, b, c, d) {
-		return c*((t=t/d-1)*t*t + 1) + b;
-	},
-	easeInOutCubic: function (x, t, b, c, d) {
-		if ((t/=d/2) < 1) return c/2*t*t*t + b;
-		return c/2*((t-=2)*t*t + 2) + b;
-	},
-	easeInQuart: function (x, t, b, c, d) {
-		return c*(t/=d)*t*t*t + b;
-	},
-	easeOutQuart: function (x, t, b, c, d) {
-		return -c * ((t=t/d-1)*t*t*t - 1) + b;
-	},
-	easeInOutQuart: function (x, t, b, c, d) {
-		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
-		return -c/2 * ((t-=2)*t*t*t - 2) + b;
-	},
-	easeInQuint: function (x, t, b, c, d) {
-		return c*(t/=d)*t*t*t*t + b;
-	},
-	easeOutQuint: function (x, t, b, c, d) {
-		return c*((t=t/d-1)*t*t*t*t + 1) + b;
-	},
-	easeInOutQuint: function (x, t, b, c, d) {
-		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
-		return c/2*((t-=2)*t*t*t*t + 2) + b;
-	},
-	easeInSine: function (x, t, b, c, d) {
-		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
-	},
-	easeOutSine: function (x, t, b, c, d) {
-		return c * Math.sin(t/d * (Math.PI/2)) + b;
-	},
-	easeInOutSine: function (x, t, b, c, d) {
-		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
-	},
-	easeInExpo: function (x, t, b, c, d) {
-		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
-	},
-	easeOutExpo: function (x, t, b, c, d) {
-		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
-	},
-	easeInOutExpo: function (x, t, b, c, d) {
-		if (t==0) return b;
-		if (t==d) return b+c;
-		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
-		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
-	},
-	easeInCirc: function (x, t, b, c, d) {
-		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
-	},
-	easeOutCirc: function (x, t, b, c, d) {
-		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
-	},
-	easeInOutCirc: function (x, t, b, c, d) {
-		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
-		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
-	},
-	easeInElastic: function (x, t, b, c, d) {
-		var s=1.70158;var p=0;var a=c;
-		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
-		if (a < Math.abs(c)) { a=c; var s=p/4; }
-		else var s = p/(2*Math.PI) * Math.asin (c/a);
-		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
-	},
-	easeOutElastic: function (x, t, b, c, d) {
-		var s=1.70158;var p=0;var a=c;
-		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
-		if (a < Math.abs(c)) { a=c; var s=p/4; }
-		else var s = p/(2*Math.PI) * Math.asin (c/a);
-		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
-	},
-	easeInOutElastic: function (x, t, b, c, d) {
-		var s=1.70158;var p=0;var a=c;
-		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
-		if (a < Math.abs(c)) { a=c; var s=p/4; }
-		else var s = p/(2*Math.PI) * Math.asin (c/a);
-		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
-		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
-	},
-	easeInBack: function (x, t, b, c, d, s) {
-		if (s == undefined) s = 1.70158;
-		return c*(t/=d)*t*((s+1)*t - s) + b;
-	},
-	easeOutBack: function (x, t, b, c, d, s) {
-		if (s == undefined) s = 1.70158;
-		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
-	},
-	easeInOutBack: function (x, t, b, c, d, s) {
-		if (s == undefined) s = 1.70158; 
-		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
-		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
-	},
-	easeInBounce: function (x, t, b, c, d) {
-		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
-	},
-	easeOutBounce: function (x, t, b, c, d) {
-		if ((t/=d) < (1/2.75)) {
-			return c*(7.5625*t*t) + b;
-		} else if (t < (2/2.75)) {
-			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
-		} else if (t < (2.5/2.75)) {
-			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
-		} else {
-			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
-		}
-	},
-	easeInOutBounce: function (x, t, b, c, d) {
-		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
-		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
-	}
-});
-
-/*
- *
- * TERMS OF USE - EASING EQUATIONS
- * 
- * Open source under the BSD License. 
- * 
- * Copyright © 2001 Robert Penner
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- * Redistributions of source code must retain the above copyright notice, this list of 
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list 
- * of conditions and the following disclaimer in the documentation and/or other materials 
- * provided with the distribution.
- * 
- * Neither the name of the author nor the names of contributors may be used to endorse 
- * or promote products derived from this software without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
- * OF THE POSSIBILITY OF SUCH DAMAGE. 
- *
- */
diff --git a/ui/legacy/lib/jquery.js b/ui/legacy/lib/jquery.js
deleted file mode 100644
index debcd7a..0000000
--- a/ui/legacy/lib/jquery.js
+++ /dev/null
@@ -1,10364 +0,0 @@
-/*!
- * jQuery JavaScript Library v3.3.1
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2018-01-20T17:24Z
- */
-( function( global, factory ) {
-
-  "use strict";
-
-  if ( typeof module === "object" && typeof module.exports === "object" ) {
-
-    // For CommonJS and CommonJS-like environments where a proper `window`
-    // is present, execute the factory and get jQuery.
-    // For environments that do not have a `window` with a `document`
-    // (such as Node.js), expose a factory as module.exports.
-    // This accentuates the need for the creation of a real `window`.
-    // e.g. var jQuery = require("jquery")(window);
-    // See ticket #14549 for more info.
-    module.exports = global.document ?
-        factory( global, true ) :
-        function( w ) {
-          if ( !w.document ) {
-            throw new Error( "jQuery requires a window with a document" );
-          }
-          return factory( w );
-        };
-  } else {
-    factory( global );
-  }
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-  "use strict";
-
-  var arr = [];
-
-  var document = window.document;
-
-  var getProto = Object.getPrototypeOf;
-
-  var slice = arr.slice;
-
-  var concat = arr.concat;
-
-  var push = arr.push;
-
-  var indexOf = arr.indexOf;
-
-  var class2type = {};
-
-  var toString = class2type.toString;
-
-  var hasOwn = class2type.hasOwnProperty;
-
-  var fnToString = hasOwn.toString;
-
-  var ObjectFunctionString = fnToString.call( Object );
-
-  var support = {};
-
-  var isFunction = function isFunction( obj ) {
-
-    // Support: Chrome <=57, Firefox <=52
-    // In some browsers, typeof returns "function" for HTML <object> elements
-    // (i.e., `typeof document.createElement( "object" ) === "function"`).
-    // We don't want to classify *any* DOM node as a function.
-    return typeof obj === "function" && typeof obj.nodeType !== "number";
-  };
-
-
-  var isWindow = function isWindow( obj ) {
-    return obj != null && obj === obj.window;
-  };
-
-
-
-
-  var preservedScriptAttributes = {
-    type: true,
-    src: true,
-    noModule: true
-  };
-
-  function DOMEval( code, doc, node ) {
-    doc = doc || document;
-
-    var i,
-        script = doc.createElement( "script" );
-
-    script.text = code;
-    if ( node ) {
-      for ( i in preservedScriptAttributes ) {
-        if ( node[ i ] ) {
-          script[ i ] = node[ i ];
-        }
-      }
-    }
-    doc.head.appendChild( script ).parentNode.removeChild( script );
-  }
-
-
-  function toType( obj ) {
-    if ( obj == null ) {
-      return obj + "";
-    }
-
-    // Support: Android <=2.3 only (functionish RegExp)
-    return typeof obj === "object" || typeof obj === "function" ?
-        class2type[ toString.call( obj ) ] || "object" :
-        typeof obj;
-  }
-  /* global Symbol */
-// Defining this global in .eslintrc.json would create a danger of using the global
-// unguarded in another place, it seems safer to define global only for this module
-
-
-
-  var
-      version = "3.3.1",
-
-      // Define a local copy of jQuery
-      jQuery = function( selector, context ) {
-
-        // The jQuery object is actually just the init constructor 'enhanced'
-        // Need init if jQuery is called (just allow error to be thrown if not included)
-        return new jQuery.fn.init( selector, context );
-      },
-
-      // Support: Android <=4.0 only
-      // Make sure we trim BOM and NBSP
-      rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
-
-  jQuery.fn = jQuery.prototype = {
-
-    // The current version of jQuery being used
-    jquery: version,
-
-    constructor: jQuery,
-
-    // The default length of a jQuery object is 0
-    length: 0,
-
-    toArray: function() {
-      return slice.call( this );
-    },
-
-    // Get the Nth element in the matched element set OR
-    // Get the whole matched element set as a clean array
-    get: function( num ) {
-
-      // Return all the elements in a clean array
-      if ( num == null ) {
-        return slice.call( this );
-      }
-
-      // Return just the one element from the set
-      return num < 0 ? this[ num + this.length ] : this[ num ];
-    },
-
-    // Take an array of elements and push it onto the stack
-    // (returning the new matched element set)
-    pushStack: function( elems ) {
-
-      // Build a new jQuery matched element set
-      var ret = jQuery.merge( this.constructor(), elems );
-
-      // Add the old object onto the stack (as a reference)
-      ret.prevObject = this;
-
-      // Return the newly-formed element set
-      return ret;
-    },
-
-    // Execute a callback for every element in the matched set.
-    each: function( callback ) {
-      return jQuery.each( this, callback );
-    },
-
-    map: function( callback ) {
-      return this.pushStack( jQuery.map( this, function( elem, i ) {
-        return callback.call( elem, i, elem );
-      } ) );
-    },
-
-    slice: function() {
-      return this.pushStack( slice.apply( this, arguments ) );
-    },
-
-    first: function() {
-      return this.eq( 0 );
-    },
-
-    last: function() {
-      return this.eq( -1 );
-    },
-
-    eq: function( i ) {
-      var len = this.length,
-          j = +i + ( i < 0 ? len : 0 );
-      return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
-    },
-
-    end: function() {
-      return this.prevObject || this.constructor();
-    },
-
-    // For internal use only.
-    // Behaves like an Array's method, not like a jQuery method.
-    push: push,
-    sort: arr.sort,
-    splice: arr.splice
-  };
-
-  jQuery.extend = jQuery.fn.extend = function() {
-    var options, name, src, copy, copyIsArray, clone,
-        target = arguments[ 0 ] || {},
-        i = 1,
-        length = arguments.length,
-        deep = false;
-
-    // Handle a deep copy situation
-    if ( typeof target === "boolean" ) {
-      deep = target;
-
-      // Skip the boolean and the target
-      target = arguments[ i ] || {};
-      i++;
-    }
-
-    // Handle case when target is a string or something (possible in deep copy)
-    if ( typeof target !== "object" && !isFunction( target ) ) {
-      target = {};
-    }
-
-    // Extend jQuery itself if only one argument is passed
-    if ( i === length ) {
-      target = this;
-      i--;
-    }
-
-    for ( ; i < length; i++ ) {
-
-      // Only deal with non-null/undefined values
-      if ( ( options = arguments[ i ] ) != null ) {
-
-        // Extend the base object
-        for ( name in options ) {
-          src = target[ name ];
-          copy = options[ name ];
-
-          // Prevent never-ending loop
-          if ( target === copy ) {
-            continue;
-          }
-
-          // Recurse if we're merging plain objects or arrays
-          if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
-              ( copyIsArray = Array.isArray( copy ) ) ) ) {
-
-            if ( copyIsArray ) {
-              copyIsArray = false;
-              clone = src && Array.isArray( src ) ? src : [];
-
-            } else {
-              clone = src && jQuery.isPlainObject( src ) ? src : {};
-            }
-
-            // Never move original objects, clone them
-            target[ name ] = jQuery.extend( deep, clone, copy );
-
-            // Don't bring in undefined values
-          } else if ( copy !== undefined ) {
-            target[ name ] = copy;
-          }
-        }
-      }
-    }
-
-    // Return the modified object
-    return target;
-  };
-
-  jQuery.extend( {
-
-    // Unique for each copy of jQuery on the page
-    expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
-    // Assume jQuery is ready without the ready module
-    isReady: true,
-
-    error: function( msg ) {
-      throw new Error( msg );
-    },
-
-    noop: function() {},
-
-    isPlainObject: function( obj ) {
-      var proto, Ctor;
-
-      // Detect obvious negatives
-      // Use toString instead of jQuery.type to catch host objects
-      if ( !obj || toString.call( obj ) !== "[object Object]" ) {
-        return false;
-      }
-
-      proto = getProto( obj );
-
-      // Objects with no prototype (e.g., `Object.create( null )`) are plain
-      if ( !proto ) {
-        return true;
-      }
-
-      // Objects with prototype are plain iff they were constructed by a global Object function
-      Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
-      return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
-    },
-
-    isEmptyObject: function( obj ) {
-
-      /* eslint-disable no-unused-vars */
-      // See https://github.com/eslint/eslint/issues/6125
-      var name;
-
-      for ( name in obj ) {
-        return false;
-      }
-      return true;
-    },
-
-    // Evaluates a script in a global context
-    globalEval: function( code ) {
-      DOMEval( code );
-    },
-
-    each: function( obj, callback ) {
-      var length, i = 0;
-
-      if ( isArrayLike( obj ) ) {
-        length = obj.length;
-        for ( ; i < length; i++ ) {
-          if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-            break;
-          }
-        }
-      } else {
-        for ( i in obj ) {
-          if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-            break;
-          }
-        }
-      }
-
-      return obj;
-    },
-
-    // Support: Android <=4.0 only
-    trim: function( text ) {
-      return text == null ?
-          "" :
-          ( text + "" ).replace( rtrim, "" );
-    },
-
-    // results is for internal usage only
-    makeArray: function( arr, results ) {
-      var ret = results || [];
-
-      if ( arr != null ) {
-        if ( isArrayLike( Object( arr ) ) ) {
-          jQuery.merge( ret,
-              typeof arr === "string" ?
-                  [ arr ] : arr
-          );
-        } else {
-          push.call( ret, arr );
-        }
-      }
-
-      return ret;
-    },
-
-    inArray: function( elem, arr, i ) {
-      return arr == null ? -1 : indexOf.call( arr, elem, i );
-    },
-
-    // Support: Android <=4.0 only, PhantomJS 1 only
-    // push.apply(_, arraylike) throws on ancient WebKit
-    merge: function( first, second ) {
-      var len = +second.length,
-          j = 0,
-          i = first.length;
-
-      for ( ; j < len; j++ ) {
-        first[ i++ ] = second[ j ];
-      }
-
-      first.length = i;
-
-      return first;
-    },
-
-    grep: function( elems, callback, invert ) {
-      var callbackInverse,
-          matches = [],
-          i = 0,
-          length = elems.length,
-          callbackExpect = !invert;
-
-      // Go through the array, only saving the items
-      // that pass the validator function
-      for ( ; i < length; i++ ) {
-        callbackInverse = !callback( elems[ i ], i );
-        if ( callbackInverse !== callbackExpect ) {
-          matches.push( elems[ i ] );
-        }
-      }
-
-      return matches;
-    },
-
-    // arg is for internal usage only
-    map: function( elems, callback, arg ) {
-      var length, value,
-          i = 0,
-          ret = [];
-
-      // Go through the array, translating each of the items to their new values
-      if ( isArrayLike( elems ) ) {
-        length = elems.length;
-        for ( ; i < length; i++ ) {
-          value = callback( elems[ i ], i, arg );
-
-          if ( value != null ) {
-            ret.push( value );
-          }
-        }
-
-        // Go through every key on the object,
-      } else {
-        for ( i in elems ) {
-          value = callback( elems[ i ], i, arg );
-
-          if ( value != null ) {
-            ret.push( value );
-          }
-        }
-      }
-
-      // Flatten any nested arrays
-      return concat.apply( [], ret );
-    },
-
-    // A global GUID counter for objects
-    guid: 1,
-
-    // jQuery.support is not used in Core but other projects attach their
-    // properties to it so it needs to exist.
-    support: support
-  } );
-
-  if ( typeof Symbol === "function" ) {
-    jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-  }
-
-// Populate the class2type map
-  jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-      function( i, name ) {
-        class2type[ "[object " + name + "]" ] = name.toLowerCase();
-      } );
-
-  function isArrayLike( obj ) {
-
-    // Support: real iOS 8.2 only (not reproducible in simulator)
-    // `in` check used to prevent JIT error (gh-2145)
-    // hasOwn isn't used here due to false negatives
-    // regarding Nodelist length in IE
-    var length = !!obj && "length" in obj && obj.length,
-        type = toType( obj );
-
-    if ( isFunction( obj ) || isWindow( obj ) ) {
-      return false;
-    }
-
-    return type === "array" || length === 0 ||
-        typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-  }
-  var Sizzle =
-      /*!
- * Sizzle CSS Selector Engine v2.3.3
- * https://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-08-08
- */
-      (function( window ) {
-
-        var i,
-            support,
-            Expr,
-            getText,
-            isXML,
-            tokenize,
-            compile,
-            select,
-            outermostContext,
-            sortInput,
-            hasDuplicate,
-
-            // Local document vars
-            setDocument,
-            document,
-            docElem,
-            documentIsHTML,
-            rbuggyQSA,
-            rbuggyMatches,
-            matches,
-            contains,
-
-            // Instance-specific data
-            expando = "sizzle" + 1 * new Date(),
-            preferredDoc = window.document,
-            dirruns = 0,
-            done = 0,
-            classCache = createCache(),
-            tokenCache = createCache(),
-            compilerCache = createCache(),
-            sortOrder = function( a, b ) {
-              if ( a === b ) {
-                hasDuplicate = true;
-              }
-              return 0;
-            },
-
-            // Instance methods
-            hasOwn = ({}).hasOwnProperty,
-            arr = [],
-            pop = arr.pop,
-            push_native = arr.push,
-            push = arr.push,
-            slice = arr.slice,
-            // Use a stripped-down indexOf as it's faster than native
-            // https://jsperf.com/thor-indexof-vs-for/5
-            indexOf = function( list, elem ) {
-              var i = 0,
-                  len = list.length;
-              for ( ; i < len; i++ ) {
-                if ( list[i] === elem ) {
-                  return i;
-                }
-              }
-              return -1;
-            },
-
-            booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-            // Regular expressions
-
-            // http://www.w3.org/TR/css3-selectors/#whitespace
-            whitespace = "[\\x20\\t\\r\\n\\f]",
-
-            // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-            identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
-
-            // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
-            attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-                // Operator (capture 2)
-                "*([*^$|!~]?=)" + whitespace +
-                // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-                "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
-                "*\\]",
-
-            pseudos = ":(" + identifier + ")(?:\\((" +
-                // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
-                // 1. quoted (capture 3; capture 4 or capture 5)
-                "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-                // 2. simple (capture 6)
-                "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-                // 3. anything else (capture 2)
-                ".*" +
-                ")\\)|)",
-
-            // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-            rwhitespace = new RegExp( whitespace + "+", "g" ),
-            rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-            rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-            rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-            rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-            rpseudo = new RegExp( pseudos ),
-            ridentifier = new RegExp( "^" + identifier + "$" ),
-
-            matchExpr = {
-              "ID": new RegExp( "^#(" + identifier + ")" ),
-              "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
-              "TAG": new RegExp( "^(" + identifier + "|[*])" ),
-              "ATTR": new RegExp( "^" + attributes ),
-              "PSEUDO": new RegExp( "^" + pseudos ),
-              "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-                  "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-                  "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-              "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-              // For use in libraries implementing .is()
-              // We use this for POS matching in `select`
-              "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-                  whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-            },
-
-            rinputs = /^(?:input|select|textarea|button)$/i,
-            rheader = /^h\d$/i,
-
-            rnative = /^[^{]+\{\s*\[native \w/,
-
-            // Easily-parseable/retrievable ID or TAG or CLASS selectors
-            rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-            rsibling = /[+~]/,
-
-            // CSS escapes
-            // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-            runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-            funescape = function( _, escaped, escapedWhitespace ) {
-              var high = "0x" + escaped - 0x10000;
-              // NaN means non-codepoint
-              // Support: Firefox<24
-              // Workaround erroneous numeric interpretation of +"0x"
-              return high !== high || escapedWhitespace ?
-                  escaped :
-                  high < 0 ?
-                      // BMP codepoint
-                      String.fromCharCode( high + 0x10000 ) :
-                      // Supplemental Plane codepoint (surrogate pair)
-                      String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-            },
-
-            // CSS string/identifier serialization
-            // https://drafts.csswg.org/cssom/#common-serializing-idioms
-            rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
-            fcssescape = function( ch, asCodePoint ) {
-              if ( asCodePoint ) {
-
-                // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
-                if ( ch === "\0" ) {
-                  return "\uFFFD";
-                }
-
-                // Control characters and (dependent upon position) numbers get escaped as code points
-                return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
-              }
-
-              // Other potentially-special ASCII characters get backslash-escaped
-              return "\\" + ch;
-            },
-
-            // Used for iframes
-            // See setDocument()
-            // Removing the function wrapper causes a "Permission Denied"
-            // error in IE
-            unloadHandler = function() {
-              setDocument();
-            },
-
-            disabledAncestor = addCombinator(
-                function( elem ) {
-                  return elem.disabled === true && ("form" in elem || "label" in elem);
-                },
-                { dir: "parentNode", next: "legend" }
-            );
-
-// Optimize for push.apply( _, NodeList )
-        try {
-          push.apply(
-              (arr = slice.call( preferredDoc.childNodes )),
-              preferredDoc.childNodes
-          );
-          // Support: Android<4.0
-          // Detect silently failing push.apply
-          arr[ preferredDoc.childNodes.length ].nodeType;
-        } catch ( e ) {
-          push = { apply: arr.length ?
-
-                // Leverage slice if possible
-                function( target, els ) {
-                  push_native.apply( target, slice.call(els) );
-                } :
-
-                // Support: IE<9
-                // Otherwise append directly
-                function( target, els ) {
-                  var j = target.length,
-                      i = 0;
-                  // Can't trust NodeList.length
-                  while ( (target[j++] = els[i++]) ) {}
-                  target.length = j - 1;
-                }
-          };
-        }
-
-        function Sizzle( selector, context, results, seed ) {
-          var m, i, elem, nid, match, groups, newSelector,
-              newContext = context && context.ownerDocument,
-
-              // nodeType defaults to 9, since context defaults to document
-              nodeType = context ? context.nodeType : 9;
-
-          results = results || [];
-
-          // Return early from calls with invalid selector or context
-          if ( typeof selector !== "string" || !selector ||
-              nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
-            return results;
-          }
-
-          // Try to shortcut find operations (as opposed to filters) in HTML documents
-          if ( !seed ) {
-
-            if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-              setDocument( context );
-            }
-            context = context || document;
-
-            if ( documentIsHTML ) {
-
-              // If the selector is sufficiently simple, try using a "get*By*" DOM method
-              // (excepting DocumentFragment context, where the methods don't exist)
-              if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
-                // ID selector
-                if ( (m = match[1]) ) {
-
-                  // Document context
-                  if ( nodeType === 9 ) {
-                    if ( (elem = context.getElementById( m )) ) {
-
-                      // Support: IE, Opera, Webkit
-                      // TODO: identify versions
-                      // getElementById can match elements by name instead of ID
-                      if ( elem.id === m ) {
-                        results.push( elem );
-                        return results;
-                      }
-                    } else {
-                      return results;
-                    }
-
-                    // Element context
-                  } else {
-
-                    // Support: IE, Opera, Webkit
-                    // TODO: identify versions
-                    // getElementById can match elements by name instead of ID
-                    if ( newContext && (elem = newContext.getElementById( m )) &&
-                        contains( context, elem ) &&
-                        elem.id === m ) {
-
-                      results.push( elem );
-                      return results;
-                    }
-                  }
-
-                  // Type selector
-                } else if ( match[2] ) {
-                  push.apply( results, context.getElementsByTagName( selector ) );
-                  return results;
-
-                  // Class selector
-                } else if ( (m = match[3]) && support.getElementsByClassName &&
-                    context.getElementsByClassName ) {
-
-                  push.apply( results, context.getElementsByClassName( m ) );
-                  return results;
-                }
-              }
-
-              // Take advantage of querySelectorAll
-              if ( support.qsa &&
-                  !compilerCache[ selector + " " ] &&
-                  (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
-                if ( nodeType !== 1 ) {
-                  newContext = context;
-                  newSelector = selector;
-
-                  // qSA looks outside Element context, which is not what we want
-                  // Thanks to Andrew Dupont for this workaround technique
-                  // Support: IE <=8
-                  // Exclude object elements
-                } else if ( context.nodeName.toLowerCase() !== "object" ) {
-
-                  // Capture the context ID, setting it first if necessary
-                  if ( (nid = context.getAttribute( "id" )) ) {
-                    nid = nid.replace( rcssescape, fcssescape );
-                  } else {
-                    context.setAttribute( "id", (nid = expando) );
-                  }
-
-                  // Prefix every selector in the list
-                  groups = tokenize( selector );
-                  i = groups.length;
-                  while ( i-- ) {
-                    groups[i] = "#" + nid + " " + toSelector( groups[i] );
-                  }
-                  newSelector = groups.join( "," );
-
-                  // Expand context for sibling selectors
-                  newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
-                      context;
-                }
-
-                if ( newSelector ) {
-                  try {
-                    push.apply( results,
-                        newContext.querySelectorAll( newSelector )
-                    );
-                    return results;
-                  } catch ( qsaError ) {
-                  } finally {
-                    if ( nid === expando ) {
-                      context.removeAttribute( "id" );
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-          // All others
-          return select( selector.replace( rtrim, "$1" ), context, results, seed );
-        }
-
-        /**
-         * Create key-value caches of limited size
-         * @returns {function(string, object)} Returns the Object data after storing it on itself with
-         *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
-         *	deleting the oldest entry
-         */
-        function createCache() {
-          var keys = [];
-
-          function cache( key, value ) {
-            // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-            if ( keys.push( key + " " ) > Expr.cacheLength ) {
-              // Only keep the most recent entries
-              delete cache[ keys.shift() ];
-            }
-            return (cache[ key + " " ] = value);
-          }
-          return cache;
-        }
-
-        /**
-         * Mark a function for special use by Sizzle
-         * @param {Function} fn The function to mark
-         */
-        function markFunction( fn ) {
-          fn[ expando ] = true;
-          return fn;
-        }
-
-        /**
-         * Support testing using an element
-         * @param {Function} fn Passed the created element and returns a boolean result
-         */
-        function assert( fn ) {
-          var el = document.createElement("fieldset");
-
-          try {
-            return !!fn( el );
-          } catch (e) {
-            return false;
-          } finally {
-            // Remove from its parent by default
-            if ( el.parentNode ) {
-              el.parentNode.removeChild( el );
-            }
-            // release memory in IE
-            el = null;
-          }
-        }
-
-        /**
-         * Adds the same handler for all of the specified attrs
-         * @param {String} attrs Pipe-separated list of attributes
-         * @param {Function} handler The method that will be applied
-         */
-        function addHandle( attrs, handler ) {
-          var arr = attrs.split("|"),
-              i = arr.length;
-
-          while ( i-- ) {
-            Expr.attrHandle[ arr[i] ] = handler;
-          }
-        }
-
-        /**
-         * Checks document order of two siblings
-         * @param {Element} a
-         * @param {Element} b
-         * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
-         */
-        function siblingCheck( a, b ) {
-          var cur = b && a,
-              diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-                  a.sourceIndex - b.sourceIndex;
-
-          // Use IE sourceIndex if available on both nodes
-          if ( diff ) {
-            return diff;
-          }
-
-          // Check if b follows a
-          if ( cur ) {
-            while ( (cur = cur.nextSibling) ) {
-              if ( cur === b ) {
-                return -1;
-              }
-            }
-          }
-
-          return a ? 1 : -1;
-        }
-
-        /**
-         * Returns a function to use in pseudos for input types
-         * @param {String} type
-         */
-        function createInputPseudo( type ) {
-          return function( elem ) {
-            var name = elem.nodeName.toLowerCase();
-            return name === "input" && elem.type === type;
-          };
-        }
-
-        /**
-         * Returns a function to use in pseudos for buttons
-         * @param {String} type
-         */
-        function createButtonPseudo( type ) {
-          return function( elem ) {
-            var name = elem.nodeName.toLowerCase();
-            return (name === "input" || name === "button") && elem.type === type;
-          };
-        }
-
-        /**
-         * Returns a function to use in pseudos for :enabled/:disabled
-         * @param {Boolean} disabled true for :disabled; false for :enabled
-         */
-        function createDisabledPseudo( disabled ) {
-
-          // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
-          return function( elem ) {
-
-            // Only certain elements can match :enabled or :disabled
-            // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
-            // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
-            if ( "form" in elem ) {
-
-              // Check for inherited disabledness on relevant non-disabled elements:
-              // * listed form-associated elements in a disabled fieldset
-              //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
-              //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
-              // * option elements in a disabled optgroup
-              //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
-              // All such elements have a "form" property.
-              if ( elem.parentNode && elem.disabled === false ) {
-
-                // Option elements defer to a parent optgroup if present
-                if ( "label" in elem ) {
-                  if ( "label" in elem.parentNode ) {
-                    return elem.parentNode.disabled === disabled;
-                  } else {
-                    return elem.disabled === disabled;
-                  }
-                }
-
-                // Support: IE 6 - 11
-                // Use the isDisabled shortcut property to check for disabled fieldset ancestors
-                return elem.isDisabled === disabled ||
-
-                    // Where there is no isDisabled, check manually
-                    /* jshint -W018 */
-                    elem.isDisabled !== !disabled &&
-                    disabledAncestor( elem ) === disabled;
-              }
-
-              return elem.disabled === disabled;
-
-              // Try to winnow out elements that can't be disabled before trusting the disabled property.
-              // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
-              // even exist on them, let alone have a boolean value.
-            } else if ( "label" in elem ) {
-              return elem.disabled === disabled;
-            }
-
-            // Remaining elements are neither :enabled nor :disabled
-            return false;
-          };
-        }
-
-        /**
-         * Returns a function to use in pseudos for positionals
-         * @param {Function} fn
-         */
-        function createPositionalPseudo( fn ) {
-          return markFunction(function( argument ) {
-            argument = +argument;
-            return markFunction(function( seed, matches ) {
-              var j,
-                  matchIndexes = fn( [], seed.length, argument ),
-                  i = matchIndexes.length;
-
-              // Match elements found at the specified indexes
-              while ( i-- ) {
-                if ( seed[ (j = matchIndexes[i]) ] ) {
-                  seed[j] = !(matches[j] = seed[j]);
-                }
-              }
-            });
-          });
-        }
-
-        /**
-         * Checks a node for validity as a Sizzle context
-         * @param {Element|Object=} context
-         * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
-         */
-        function testContext( context ) {
-          return context && typeof context.getElementsByTagName !== "undefined" && context;
-        }
-
-// Expose support vars for convenience
-        support = Sizzle.support = {};
-
-        /**
-         * Detects XML nodes
-         * @param {Element|Object} elem An element or a document
-         * @returns {Boolean} True iff elem is a non-HTML XML node
-         */
-        isXML = Sizzle.isXML = function( elem ) {
-          // documentElement is verified for cases where it doesn't yet exist
-          // (such as loading iframes in IE - #4833)
-          var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-          return documentElement ? documentElement.nodeName !== "HTML" : false;
-        };
-
-        /**
-         * Sets document-related variables once based on the current document
-         * @param {Element|Object} [doc] An element or document object to use to set the document
-         * @returns {Object} Returns the current document
-         */
-        setDocument = Sizzle.setDocument = function( node ) {
-          var hasCompare, subWindow,
-              doc = node ? node.ownerDocument || node : preferredDoc;
-
-          // Return early if doc is invalid or already selected
-          if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-            return document;
-          }
-
-          // Update global variables
-          document = doc;
-          docElem = document.documentElement;
-          documentIsHTML = !isXML( document );
-
-          // Support: IE 9-11, Edge
-          // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
-          if ( preferredDoc !== document &&
-              (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
-
-            // Support: IE 11, Edge
-            if ( subWindow.addEventListener ) {
-              subWindow.addEventListener( "unload", unloadHandler, false );
-
-              // Support: IE 9 - 10 only
-            } else if ( subWindow.attachEvent ) {
-              subWindow.attachEvent( "onunload", unloadHandler );
-            }
-          }
-
-          /* Attributes
-	---------------------------------------------------------------------- */
-
-          // Support: IE<8
-          // Verify that getAttribute really returns attributes and not properties
-          // (excepting IE8 booleans)
-          support.attributes = assert(function( el ) {
-            el.className = "i";
-            return !el.getAttribute("className");
-          });
-
-          /* getElement(s)By*
-	---------------------------------------------------------------------- */
-
-          // Check if getElementsByTagName("*") returns only elements
-          support.getElementsByTagName = assert(function( el ) {
-            el.appendChild( document.createComment("") );
-            return !el.getElementsByTagName("*").length;
-          });
-
-          // Support: IE<9
-          support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
-          // Support: IE<10
-          // Check if getElementById returns elements by name
-          // The broken getElementById methods don't pick up programmatically-set names,
-          // so use a roundabout getElementsByName test
-          support.getById = assert(function( el ) {
-            docElem.appendChild( el ).id = expando;
-            return !document.getElementsByName || !document.getElementsByName( expando ).length;
-          });
-
-          // ID filter and find
-          if ( support.getById ) {
-            Expr.filter["ID"] = function( id ) {
-              var attrId = id.replace( runescape, funescape );
-              return function( elem ) {
-                return elem.getAttribute("id") === attrId;
-              };
-            };
-            Expr.find["ID"] = function( id, context ) {
-              if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-                var elem = context.getElementById( id );
-                return elem ? [ elem ] : [];
-              }
-            };
-          } else {
-            Expr.filter["ID"] =  function( id ) {
-              var attrId = id.replace( runescape, funescape );
-              return function( elem ) {
-                var node = typeof elem.getAttributeNode !== "undefined" &&
-                    elem.getAttributeNode("id");
-                return node && node.value === attrId;
-              };
-            };
-
-            // Support: IE 6 - 7 only
-            // getElementById is not reliable as a find shortcut
-            Expr.find["ID"] = function( id, context ) {
-              if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-                var node, i, elems,
-                    elem = context.getElementById( id );
-
-                if ( elem ) {
-
-                  // Verify the id attribute
-                  node = elem.getAttributeNode("id");
-                  if ( node && node.value === id ) {
-                    return [ elem ];
-                  }
-
-                  // Fall back on getElementsByName
-                  elems = context.getElementsByName( id );
-                  i = 0;
-                  while ( (elem = elems[i++]) ) {
-                    node = elem.getAttributeNode("id");
-                    if ( node && node.value === id ) {
-                      return [ elem ];
-                    }
-                  }
-                }
-
-                return [];
-              }
-            };
-          }
-
-          // Tag
-          Expr.find["TAG"] = support.getElementsByTagName ?
-              function( tag, context ) {
-                if ( typeof context.getElementsByTagName !== "undefined" ) {
-                  return context.getElementsByTagName( tag );
-
-                  // DocumentFragment nodes don't have gEBTN
-                } else if ( support.qsa ) {
-                  return context.querySelectorAll( tag );
-                }
-              } :
-
-              function( tag, context ) {
-                var elem,
-                    tmp = [],
-                    i = 0,
-                    // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
-                    results = context.getElementsByTagName( tag );
-
-                // Filter out possible comments
-                if ( tag === "*" ) {
-                  while ( (elem = results[i++]) ) {
-                    if ( elem.nodeType === 1 ) {
-                      tmp.push( elem );
-                    }
-                  }
-
-                  return tmp;
-                }
-                return results;
-              };
-
-          // Class
-          Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-            if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
-              return context.getElementsByClassName( className );
-            }
-          };
-
-          /* QSA/matchesSelector
-	---------------------------------------------------------------------- */
-
-          // QSA and matchesSelector support
-
-          // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-          rbuggyMatches = [];
-
-          // qSa(:focus) reports false when true (Chrome 21)
-          // We allow this because of a bug in IE8/9 that throws an error
-          // whenever `document.activeElement` is accessed on an iframe
-          // So, we allow :focus to pass through QSA all the time to avoid the IE error
-          // See https://bugs.jquery.com/ticket/13378
-          rbuggyQSA = [];
-
-          if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
-            // Build QSA regex
-            // Regex strategy adopted from Diego Perini
-            assert(function( el ) {
-              // Select is set to empty string on purpose
-              // This is to test IE's treatment of not explicitly
-              // setting a boolean content attribute,
-              // since its presence should be enough
-              // https://bugs.jquery.com/ticket/12359
-              docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
-                  "<select id='" + expando + "-\r\\' msallowcapture=''>" +
-                  "<option selected=''></option></select>";
-
-              // Support: IE8, Opera 11-12.16
-              // Nothing should be selected when empty strings follow ^= or $= or *=
-              // The test attribute must be unknown in Opera but "safe" for WinRT
-              // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-              if ( el.querySelectorAll("[msallowcapture^='']").length ) {
-                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-              }
-
-              // Support: IE8
-              // Boolean attributes and "value" are not treated correctly
-              if ( !el.querySelectorAll("[selected]").length ) {
-                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-              }
-
-              // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
-              if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
-                rbuggyQSA.push("~=");
-              }
-
-              // Webkit/Opera - :checked should return selected option elements
-              // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-              // IE8 throws error here and will not see later tests
-              if ( !el.querySelectorAll(":checked").length ) {
-                rbuggyQSA.push(":checked");
-              }
-
-              // Support: Safari 8+, iOS 8+
-              // https://bugs.webkit.org/show_bug.cgi?id=136851
-              // In-page `selector#id sibling-combinator selector` fails
-              if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
-                rbuggyQSA.push(".#.+[+~]");
-              }
-            });
-
-            assert(function( el ) {
-              el.innerHTML = "<a href='' disabled='disabled'></a>" +
-                  "<select disabled='disabled'><option/></select>";
-
-              // Support: Windows 8 Native Apps
-              // The type and name attributes are restricted during .innerHTML assignment
-              var input = document.createElement("input");
-              input.setAttribute( "type", "hidden" );
-              el.appendChild( input ).setAttribute( "name", "D" );
-
-              // Support: IE8
-              // Enforce case-sensitivity of name attribute
-              if ( el.querySelectorAll("[name=d]").length ) {
-                rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
-              }
-
-              // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-              // IE8 throws error here and will not see later tests
-              if ( el.querySelectorAll(":enabled").length !== 2 ) {
-                rbuggyQSA.push( ":enabled", ":disabled" );
-              }
-
-              // Support: IE9-11+
-              // IE's :disabled selector does not pick up the children of disabled fieldsets
-              docElem.appendChild( el ).disabled = true;
-              if ( el.querySelectorAll(":disabled").length !== 2 ) {
-                rbuggyQSA.push( ":enabled", ":disabled" );
-              }
-
-              // Opera 10-11 does not throw on post-comma invalid pseudos
-              el.querySelectorAll("*,:x");
-              rbuggyQSA.push(",.*:");
-            });
-          }
-
-          if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
-              docElem.webkitMatchesSelector ||
-              docElem.mozMatchesSelector ||
-              docElem.oMatchesSelector ||
-              docElem.msMatchesSelector) )) ) {
-
-            assert(function( el ) {
-              // Check to see if it's possible to do matchesSelector
-              // on a disconnected node (IE 9)
-              support.disconnectedMatch = matches.call( el, "*" );
-
-              // This should fail with an exception
-              // Gecko does not error, returns false instead
-              matches.call( el, "[s!='']:x" );
-              rbuggyMatches.push( "!=", pseudos );
-            });
-          }
-
-          rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-          rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-          /* Contains
-	---------------------------------------------------------------------- */
-          hasCompare = rnative.test( docElem.compareDocumentPosition );
-
-          // Element contains another
-          // Purposefully self-exclusive
-          // As in, an element does not contain itself
-          contains = hasCompare || rnative.test( docElem.contains ) ?
-              function( a, b ) {
-                var adown = a.nodeType === 9 ? a.documentElement : a,
-                    bup = b && b.parentNode;
-                return a === bup || !!( bup && bup.nodeType === 1 && (
-                    adown.contains ?
-                        adown.contains( bup ) :
-                        a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-                ));
-              } :
-              function( a, b ) {
-                if ( b ) {
-                  while ( (b = b.parentNode) ) {
-                    if ( b === a ) {
-                      return true;
-                    }
-                  }
-                }
-                return false;
-              };
-
-          /* Sorting
-	---------------------------------------------------------------------- */
-
-          // Document order sorting
-          sortOrder = hasCompare ?
-              function( a, b ) {
-
-                // Flag for duplicate removal
-                if ( a === b ) {
-                  hasDuplicate = true;
-                  return 0;
-                }
-
-                // Sort on method existence if only one input has compareDocumentPosition
-                var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-                if ( compare ) {
-                  return compare;
-                }
-
-                // Calculate position if both inputs belong to the same document
-                compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
-                    a.compareDocumentPosition( b ) :
-
-                    // Otherwise we know they are disconnected
-                    1;
-
-                // Disconnected nodes
-                if ( compare & 1 ||
-                    (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-                  // Choose the first element that is related to our preferred document
-                  if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-                    return -1;
-                  }
-                  if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-                    return 1;
-                  }
-
-                  // Maintain original order
-                  return sortInput ?
-                      ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-                      0;
-                }
-
-                return compare & 4 ? -1 : 1;
-              } :
-              function( a, b ) {
-                // Exit early if the nodes are identical
-                if ( a === b ) {
-                  hasDuplicate = true;
-                  return 0;
-                }
-
-                var cur,
-                    i = 0,
-                    aup = a.parentNode,
-                    bup = b.parentNode,
-                    ap = [ a ],
-                    bp = [ b ];
-
-                // Parentless nodes are either documents or disconnected
-                if ( !aup || !bup ) {
-                  return a === document ? -1 :
-                      b === document ? 1 :
-                          aup ? -1 :
-                              bup ? 1 :
-                                  sortInput ?
-                                      ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-                                      0;
-
-                  // If the nodes are siblings, we can do a quick check
-                } else if ( aup === bup ) {
-                  return siblingCheck( a, b );
-                }
-
-                // Otherwise we need full lists of their ancestors for comparison
-                cur = a;
-                while ( (cur = cur.parentNode) ) {
-                  ap.unshift( cur );
-                }
-                cur = b;
-                while ( (cur = cur.parentNode) ) {
-                  bp.unshift( cur );
-                }
-
-                // Walk down the tree looking for a discrepancy
-                while ( ap[i] === bp[i] ) {
-                  i++;
-                }
-
-                return i ?
-                    // Do a sibling check if the nodes have a common ancestor
-                    siblingCheck( ap[i], bp[i] ) :
-
-                    // Otherwise nodes in our document sort first
-                    ap[i] === preferredDoc ? -1 :
-                        bp[i] === preferredDoc ? 1 :
-                            0;
-              };
-
-          return document;
-        };
-
-        Sizzle.matches = function( expr, elements ) {
-          return Sizzle( expr, null, null, elements );
-        };
-
-        Sizzle.matchesSelector = function( elem, expr ) {
-          // Set document vars if needed
-          if ( ( elem.ownerDocument || elem ) !== document ) {
-            setDocument( elem );
-          }
-
-          // Make sure that attribute selectors are quoted
-          expr = expr.replace( rattributeQuotes, "='$1']" );
-
-          if ( support.matchesSelector && documentIsHTML &&
-              !compilerCache[ expr + " " ] &&
-              ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-              ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-            try {
-              var ret = matches.call( elem, expr );
-
-              // IE 9's matchesSelector returns false on disconnected nodes
-              if ( ret || support.disconnectedMatch ||
-                  // As well, disconnected nodes are said to be in a document
-                  // fragment in IE 9
-                  elem.document && elem.document.nodeType !== 11 ) {
-                return ret;
-              }
-            } catch (e) {}
-          }
-
-          return Sizzle( expr, document, null, [ elem ] ).length > 0;
-        };
-
-        Sizzle.contains = function( context, elem ) {
-          // Set document vars if needed
-          if ( ( context.ownerDocument || context ) !== document ) {
-            setDocument( context );
-          }
-          return contains( context, elem );
-        };
-
-        Sizzle.attr = function( elem, name ) {
-          // Set document vars if needed
-          if ( ( elem.ownerDocument || elem ) !== document ) {
-            setDocument( elem );
-          }
-
-          var fn = Expr.attrHandle[ name.toLowerCase() ],
-              // Don't get fooled by Object.prototype properties (jQuery #13807)
-              val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-                  fn( elem, name, !documentIsHTML ) :
-                  undefined;
-
-          return val !== undefined ?
-              val :
-              support.attributes || !documentIsHTML ?
-                  elem.getAttribute( name ) :
-                  (val = elem.getAttributeNode(name)) && val.specified ?
-                      val.value :
-                      null;
-        };
-
-        Sizzle.escape = function( sel ) {
-          return (sel + "").replace( rcssescape, fcssescape );
-        };
-
-        Sizzle.error = function( msg ) {
-          throw new Error( "Syntax error, unrecognized expression: " + msg );
-        };
-
-        /**
-         * Document sorting and removing duplicates
-         * @param {ArrayLike} results
-         */
-        Sizzle.uniqueSort = function( results ) {
-          var elem,
-              duplicates = [],
-              j = 0,
-              i = 0;
-
-          // Unless we *know* we can detect duplicates, assume their presence
-          hasDuplicate = !support.detectDuplicates;
-          sortInput = !support.sortStable && results.slice( 0 );
-          results.sort( sortOrder );
-
-          if ( hasDuplicate ) {
-            while ( (elem = results[i++]) ) {
-              if ( elem === results[ i ] ) {
-                j = duplicates.push( i );
-              }
-            }
-            while ( j-- ) {
-              results.splice( duplicates[ j ], 1 );
-            }
-          }
-
-          // Clear input after sorting to release objects
-          // See https://github.com/jquery/sizzle/pull/225
-          sortInput = null;
-
-          return results;
-        };
-
-        /**
-         * Utility function for retrieving the text value of an array of DOM nodes
-         * @param {Array|Element} elem
-         */
-        getText = Sizzle.getText = function( elem ) {
-          var node,
-              ret = "",
-              i = 0,
-              nodeType = elem.nodeType;
-
-          if ( !nodeType ) {
-            // If no nodeType, this is expected to be an array
-            while ( (node = elem[i++]) ) {
-              // Do not traverse comment nodes
-              ret += getText( node );
-            }
-          } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-            // Use textContent for elements
-            // innerText usage removed for consistency of new lines (jQuery #11153)
-            if ( typeof elem.textContent === "string" ) {
-              return elem.textContent;
-            } else {
-              // Traverse its children
-              for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                ret += getText( elem );
-              }
-            }
-          } else if ( nodeType === 3 || nodeType === 4 ) {
-            return elem.nodeValue;
-          }
-          // Do not include comment or processing instruction nodes
-
-          return ret;
-        };
-
-        Expr = Sizzle.selectors = {
-
-          // Can be adjusted by the user
-          cacheLength: 50,
-
-          createPseudo: markFunction,
-
-          match: matchExpr,
-
-          attrHandle: {},
-
-          find: {},
-
-          relative: {
-            ">": { dir: "parentNode", first: true },
-            " ": { dir: "parentNode" },
-            "+": { dir: "previousSibling", first: true },
-            "~": { dir: "previousSibling" }
-          },
-
-          preFilter: {
-            "ATTR": function( match ) {
-              match[1] = match[1].replace( runescape, funescape );
-
-              // Move the given value to match[3] whether quoted or unquoted
-              match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
-              if ( match[2] === "~=" ) {
-                match[3] = " " + match[3] + " ";
-              }
-
-              return match.slice( 0, 4 );
-            },
-
-            "CHILD": function( match ) {
-              /* matches from matchExpr["CHILD"]
-				1 type (only|nth|...)
-				2 what (child|of-type)
-				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				4 xn-component of xn+y argument ([+-]?\d*n|)
-				5 sign of xn-component
-				6 x of xn-component
-				7 sign of y-component
-				8 y of y-component
-			*/
-              match[1] = match[1].toLowerCase();
-
-              if ( match[1].slice( 0, 3 ) === "nth" ) {
-                // nth-* requires argument
-                if ( !match[3] ) {
-                  Sizzle.error( match[0] );
-                }
-
-                // numeric x and y parameters for Expr.filter.CHILD
-                // remember that false/true cast respectively to 0/1
-                match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-                match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-                // other types prohibit arguments
-              } else if ( match[3] ) {
-                Sizzle.error( match[0] );
-              }
-
-              return match;
-            },
-
-            "PSEUDO": function( match ) {
-              var excess,
-                  unquoted = !match[6] && match[2];
-
-              if ( matchExpr["CHILD"].test( match[0] ) ) {
-                return null;
-              }
-
-              // Accept quoted arguments as-is
-              if ( match[3] ) {
-                match[2] = match[4] || match[5] || "";
-
-                // Strip excess characters from unquoted arguments
-              } else if ( unquoted && rpseudo.test( unquoted ) &&
-                  // Get excess from tokenize (recursively)
-                  (excess = tokenize( unquoted, true )) &&
-                  // advance to the next closing parenthesis
-                  (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-                // excess is a negative index
-                match[0] = match[0].slice( 0, excess );
-                match[2] = unquoted.slice( 0, excess );
-              }
-
-              // Return only captures needed by the pseudo filter method (type and argument)
-              return match.slice( 0, 3 );
-            }
-          },
-
-          filter: {
-
-            "TAG": function( nodeNameSelector ) {
-              var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-              return nodeNameSelector === "*" ?
-                  function() { return true; } :
-                  function( elem ) {
-                    return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-                  };
-            },
-
-            "CLASS": function( className ) {
-              var pattern = classCache[ className + " " ];
-
-              return pattern ||
-                  (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-                  classCache( className, function( elem ) {
-                    return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
-                  });
-            },
-
-            "ATTR": function( name, operator, check ) {
-              return function( elem ) {
-                var result = Sizzle.attr( elem, name );
-
-                if ( result == null ) {
-                  return operator === "!=";
-                }
-                if ( !operator ) {
-                  return true;
-                }
-
-                result += "";
-
-                return operator === "=" ? result === check :
-                    operator === "!=" ? result !== check :
-                        operator === "^=" ? check && result.indexOf( check ) === 0 :
-                            operator === "*=" ? check && result.indexOf( check ) > -1 :
-                                operator === "$=" ? check && result.slice( -check.length ) === check :
-                                    operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
-                                        operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-                                            false;
-              };
-            },
-
-            "CHILD": function( type, what, argument, first, last ) {
-              var simple = type.slice( 0, 3 ) !== "nth",
-                  forward = type.slice( -4 ) !== "last",
-                  ofType = what === "of-type";
-
-              return first === 1 && last === 0 ?
-
-                  // Shortcut for :nth-*(n)
-                  function( elem ) {
-                    return !!elem.parentNode;
-                  } :
-
-                  function( elem, context, xml ) {
-                    var cache, uniqueCache, outerCache, node, nodeIndex, start,
-                        dir = simple !== forward ? "nextSibling" : "previousSibling",
-                        parent = elem.parentNode,
-                        name = ofType && elem.nodeName.toLowerCase(),
-                        useCache = !xml && !ofType,
-                        diff = false;
-
-                    if ( parent ) {
-
-                      // :(first|last|only)-(child|of-type)
-                      if ( simple ) {
-                        while ( dir ) {
-                          node = elem;
-                          while ( (node = node[ dir ]) ) {
-                            if ( ofType ?
-                                node.nodeName.toLowerCase() === name :
-                                node.nodeType === 1 ) {
-
-                              return false;
-                            }
-                          }
-                          // Reverse direction for :only-* (if we haven't yet done so)
-                          start = dir = type === "only" && !start && "nextSibling";
-                        }
-                        return true;
-                      }
-
-                      start = [ forward ? parent.firstChild : parent.lastChild ];
-
-                      // non-xml :nth-child(...) stores cache data on `parent`
-                      if ( forward && useCache ) {
-
-                        // Seek `elem` from a previously-cached index
-
-                        // ...in a gzip-friendly way
-                        node = parent;
-                        outerCache = node[ expando ] || (node[ expando ] = {});
-
-                        // Support: IE <9 only
-                        // Defend against cloned attroperties (jQuery gh-1709)
-                        uniqueCache = outerCache[ node.uniqueID ] ||
-                            (outerCache[ node.uniqueID ] = {});
-
-                        cache = uniqueCache[ type ] || [];
-                        nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-                        diff = nodeIndex && cache[ 2 ];
-                        node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-                        while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-                            // Fallback to seeking `elem` from the start
-                            (diff = nodeIndex = 0) || start.pop()) ) {
-
-                          // When found, cache indexes on `parent` and break
-                          if ( node.nodeType === 1 && ++diff && node === elem ) {
-                            uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
-                            break;
-                          }
-                        }
-
-                      } else {
-                        // Use previously-cached element index if available
-                        if ( useCache ) {
-                          // ...in a gzip-friendly way
-                          node = elem;
-                          outerCache = node[ expando ] || (node[ expando ] = {});
-
-                          // Support: IE <9 only
-                          // Defend against cloned attroperties (jQuery gh-1709)
-                          uniqueCache = outerCache[ node.uniqueID ] ||
-                              (outerCache[ node.uniqueID ] = {});
-
-                          cache = uniqueCache[ type ] || [];
-                          nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-                          diff = nodeIndex;
-                        }
-
-                        // xml :nth-child(...)
-                        // or :nth-last-child(...) or :nth(-last)?-of-type(...)
-                        if ( diff === false ) {
-                          // Use the same loop as above to seek `elem` from the start
-                          while ( (node = ++nodeIndex && node && node[ dir ] ||
-                              (diff = nodeIndex = 0) || start.pop()) ) {
-
-                            if ( ( ofType ?
-                                node.nodeName.toLowerCase() === name :
-                                node.nodeType === 1 ) &&
-                                ++diff ) {
-
-                              // Cache the index of each encountered element
-                              if ( useCache ) {
-                                outerCache = node[ expando ] || (node[ expando ] = {});
-
-                                // Support: IE <9 only
-                                // Defend against cloned attroperties (jQuery gh-1709)
-                                uniqueCache = outerCache[ node.uniqueID ] ||
-                                    (outerCache[ node.uniqueID ] = {});
-
-                                uniqueCache[ type ] = [ dirruns, diff ];
-                              }
-
-                              if ( node === elem ) {
-                                break;
-                              }
-                            }
-                          }
-                        }
-                      }
-
-                      // Incorporate the offset, then check against cycle size
-                      diff -= last;
-                      return diff === first || ( diff % first === 0 && diff / first >= 0 );
-                    }
-                  };
-            },
-
-            "PSEUDO": function( pseudo, argument ) {
-              // pseudo-class names are case-insensitive
-              // http://www.w3.org/TR/selectors/#pseudo-classes
-              // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-              // Remember that setFilters inherits from pseudos
-              var args,
-                  fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-                      Sizzle.error( "unsupported pseudo: " + pseudo );
-
-              // The user may use createPseudo to indicate that
-              // arguments are needed to create the filter function
-              // just as Sizzle does
-              if ( fn[ expando ] ) {
-                return fn( argument );
-              }
-
-              // But maintain support for old signatures
-              if ( fn.length > 1 ) {
-                args = [ pseudo, pseudo, "", argument ];
-                return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-                    markFunction(function( seed, matches ) {
-                      var idx,
-                          matched = fn( seed, argument ),
-                          i = matched.length;
-                      while ( i-- ) {
-                        idx = indexOf( seed, matched[i] );
-                        seed[ idx ] = !( matches[ idx ] = matched[i] );
-                      }
-                    }) :
-                    function( elem ) {
-                      return fn( elem, 0, args );
-                    };
-              }
-
-              return fn;
-            }
-          },
-
-          pseudos: {
-            // Potentially complex pseudos
-            "not": markFunction(function( selector ) {
-              // Trim the selector passed to compile
-              // to avoid treating leading and trailing
-              // spaces as combinators
-              var input = [],
-                  results = [],
-                  matcher = compile( selector.replace( rtrim, "$1" ) );
-
-              return matcher[ expando ] ?
-                  markFunction(function( seed, matches, context, xml ) {
-                    var elem,
-                        unmatched = matcher( seed, null, xml, [] ),
-                        i = seed.length;
-
-                    // Match elements unmatched by `matcher`
-                    while ( i-- ) {
-                      if ( (elem = unmatched[i]) ) {
-                        seed[i] = !(matches[i] = elem);
-                      }
-                    }
-                  }) :
-                  function( elem, context, xml ) {
-                    input[0] = elem;
-                    matcher( input, null, xml, results );
-                    // Don't keep the element (issue #299)
-                    input[0] = null;
-                    return !results.pop();
-                  };
-            }),
-
-            "has": markFunction(function( selector ) {
-              return function( elem ) {
-                return Sizzle( selector, elem ).length > 0;
-              };
-            }),
-
-            "contains": markFunction(function( text ) {
-              text = text.replace( runescape, funescape );
-              return function( elem ) {
-                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-              };
-            }),
-
-            // "Whether an element is represented by a :lang() selector
-            // is based solely on the element's language value
-            // being equal to the identifier C,
-            // or beginning with the identifier C immediately followed by "-".
-            // The matching of C against the element's language value is performed case-insensitively.
-            // The identifier C does not have to be a valid language name."
-            // http://www.w3.org/TR/selectors/#lang-pseudo
-            "lang": markFunction( function( lang ) {
-              // lang value must be a valid identifier
-              if ( !ridentifier.test(lang || "") ) {
-                Sizzle.error( "unsupported lang: " + lang );
-              }
-              lang = lang.replace( runescape, funescape ).toLowerCase();
-              return function( elem ) {
-                var elemLang;
-                do {
-                  if ( (elemLang = documentIsHTML ?
-                      elem.lang :
-                      elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-                    elemLang = elemLang.toLowerCase();
-                    return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-                  }
-                } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-                return false;
-              };
-            }),
-
-            // Miscellaneous
-            "target": function( elem ) {
-              var hash = window.location && window.location.hash;
-              return hash && hash.slice( 1 ) === elem.id;
-            },
-
-            "root": function( elem ) {
-              return elem === docElem;
-            },
-
-            "focus": function( elem ) {
-              return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-            },
-
-            // Boolean properties
-            "enabled": createDisabledPseudo( false ),
-            "disabled": createDisabledPseudo( true ),
-
-            "checked": function( elem ) {
-              // In CSS3, :checked should return both checked and selected elements
-              // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-              var nodeName = elem.nodeName.toLowerCase();
-              return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-            },
-
-            "selected": function( elem ) {
-              // Accessing this property makes selected-by-default
-              // options in Safari work properly
-              if ( elem.parentNode ) {
-                elem.parentNode.selectedIndex;
-              }
-
-              return elem.selected === true;
-            },
-
-            // Contents
-            "empty": function( elem ) {
-              // http://www.w3.org/TR/selectors/#empty-pseudo
-              // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
-              //   but not by others (comment: 8; processing instruction: 7; etc.)
-              // nodeType < 6 works because attributes (2) do not appear as children
-              for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                if ( elem.nodeType < 6 ) {
-                  return false;
-                }
-              }
-              return true;
-            },
-
-            "parent": function( elem ) {
-              return !Expr.pseudos["empty"]( elem );
-            },
-
-            // Element/input types
-            "header": function( elem ) {
-              return rheader.test( elem.nodeName );
-            },
-
-            "input": function( elem ) {
-              return rinputs.test( elem.nodeName );
-            },
-
-            "button": function( elem ) {
-              var name = elem.nodeName.toLowerCase();
-              return name === "input" && elem.type === "button" || name === "button";
-            },
-
-            "text": function( elem ) {
-              var attr;
-              return elem.nodeName.toLowerCase() === "input" &&
-                  elem.type === "text" &&
-
-                  // Support: IE<8
-                  // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
-                  ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
-            },
-
-            // Position-in-collection
-            "first": createPositionalPseudo(function() {
-              return [ 0 ];
-            }),
-
-            "last": createPositionalPseudo(function( matchIndexes, length ) {
-              return [ length - 1 ];
-            }),
-
-            "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-              return [ argument < 0 ? argument + length : argument ];
-            }),
-
-            "even": createPositionalPseudo(function( matchIndexes, length ) {
-              var i = 0;
-              for ( ; i < length; i += 2 ) {
-                matchIndexes.push( i );
-              }
-              return matchIndexes;
-            }),
-
-            "odd": createPositionalPseudo(function( matchIndexes, length ) {
-              var i = 1;
-              for ( ; i < length; i += 2 ) {
-                matchIndexes.push( i );
-              }
-              return matchIndexes;
-            }),
-
-            "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-              var i = argument < 0 ? argument + length : argument;
-              for ( ; --i >= 0; ) {
-                matchIndexes.push( i );
-              }
-              return matchIndexes;
-            }),
-
-            "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-              var i = argument < 0 ? argument + length : argument;
-              for ( ; ++i < length; ) {
-                matchIndexes.push( i );
-              }
-              return matchIndexes;
-            })
-          }
-        };
-
-        Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-        for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-          Expr.pseudos[ i ] = createInputPseudo( i );
-        }
-        for ( i in { submit: true, reset: true } ) {
-          Expr.pseudos[ i ] = createButtonPseudo( i );
-        }
-
-// Easy API for creating new setFilters
-        function setFilters() {}
-        setFilters.prototype = Expr.filters = Expr.pseudos;
-        Expr.setFilters = new setFilters();
-
-        tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
-          var matched, match, tokens, type,
-              soFar, groups, preFilters,
-              cached = tokenCache[ selector + " " ];
-
-          if ( cached ) {
-            return parseOnly ? 0 : cached.slice( 0 );
-          }
-
-          soFar = selector;
-          groups = [];
-          preFilters = Expr.preFilter;
-
-          while ( soFar ) {
-
-            // Comma and first run
-            if ( !matched || (match = rcomma.exec( soFar )) ) {
-              if ( match ) {
-                // Don't consume trailing commas as valid
-                soFar = soFar.slice( match[0].length ) || soFar;
-              }
-              groups.push( (tokens = []) );
-            }
-
-            matched = false;
-
-            // Combinators
-            if ( (match = rcombinators.exec( soFar )) ) {
-              matched = match.shift();
-              tokens.push({
-                value: matched,
-                // Cast descendant combinators to space
-                type: match[0].replace( rtrim, " " )
-              });
-              soFar = soFar.slice( matched.length );
-            }
-
-            // Filters
-            for ( type in Expr.filter ) {
-              if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-                  (match = preFilters[ type ]( match ))) ) {
-                matched = match.shift();
-                tokens.push({
-                  value: matched,
-                  type: type,
-                  matches: match
-                });
-                soFar = soFar.slice( matched.length );
-              }
-            }
-
-            if ( !matched ) {
-              break;
-            }
-          }
-
-          // Return the length of the invalid excess
-          // if we're just parsing
-          // Otherwise, throw an error or return tokens
-          return parseOnly ?
-              soFar.length :
-              soFar ?
-                  Sizzle.error( selector ) :
-                  // Cache the tokens
-                  tokenCache( selector, groups ).slice( 0 );
-        };
-
-        function toSelector( tokens ) {
-          var i = 0,
-              len = tokens.length,
-              selector = "";
-          for ( ; i < len; i++ ) {
-            selector += tokens[i].value;
-          }
-          return selector;
-        }
-
-        function addCombinator( matcher, combinator, base ) {
-          var dir = combinator.dir,
-              skip = combinator.next,
-              key = skip || dir,
-              checkNonElements = base && key === "parentNode",
-              doneName = done++;
-
-          return combinator.first ?
-              // Check against closest ancestor/preceding element
-              function( elem, context, xml ) {
-                while ( (elem = elem[ dir ]) ) {
-                  if ( elem.nodeType === 1 || checkNonElements ) {
-                    return matcher( elem, context, xml );
-                  }
-                }
-                return false;
-              } :
-
-              // Check against all ancestor/preceding elements
-              function( elem, context, xml ) {
-                var oldCache, uniqueCache, outerCache,
-                    newCache = [ dirruns, doneName ];
-
-                // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
-                if ( xml ) {
-                  while ( (elem = elem[ dir ]) ) {
-                    if ( elem.nodeType === 1 || checkNonElements ) {
-                      if ( matcher( elem, context, xml ) ) {
-                        return true;
-                      }
-                    }
-                  }
-                } else {
-                  while ( (elem = elem[ dir ]) ) {
-                    if ( elem.nodeType === 1 || checkNonElements ) {
-                      outerCache = elem[ expando ] || (elem[ expando ] = {});
-
-                      // Support: IE <9 only
-                      // Defend against cloned attroperties (jQuery gh-1709)
-                      uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
-                      if ( skip && skip === elem.nodeName.toLowerCase() ) {
-                        elem = elem[ dir ] || elem;
-                      } else if ( (oldCache = uniqueCache[ key ]) &&
-                          oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
-                        // Assign to newCache so results back-propagate to previous elements
-                        return (newCache[ 2 ] = oldCache[ 2 ]);
-                      } else {
-                        // Reuse newcache so results back-propagate to previous elements
-                        uniqueCache[ key ] = newCache;
-
-                        // A match means we're done; a fail means we have to keep checking
-                        if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
-                          return true;
-                        }
-                      }
-                    }
-                  }
-                }
-                return false;
-              };
-        }
-
-        function elementMatcher( matchers ) {
-          return matchers.length > 1 ?
-              function( elem, context, xml ) {
-                var i = matchers.length;
-                while ( i-- ) {
-                  if ( !matchers[i]( elem, context, xml ) ) {
-                    return false;
-                  }
-                }
-                return true;
-              } :
-              matchers[0];
-        }
-
-        function multipleContexts( selector, contexts, results ) {
-          var i = 0,
-              len = contexts.length;
-          for ( ; i < len; i++ ) {
-            Sizzle( selector, contexts[i], results );
-          }
-          return results;
-        }
-
-        function condense( unmatched, map, filter, context, xml ) {
-          var elem,
-              newUnmatched = [],
-              i = 0,
-              len = unmatched.length,
-              mapped = map != null;
-
-          for ( ; i < len; i++ ) {
-            if ( (elem = unmatched[i]) ) {
-              if ( !filter || filter( elem, context, xml ) ) {
-                newUnmatched.push( elem );
-                if ( mapped ) {
-                  map.push( i );
-                }
-              }
-            }
-          }
-
-          return newUnmatched;
-        }
-
-        function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-          if ( postFilter && !postFilter[ expando ] ) {
-            postFilter = setMatcher( postFilter );
-          }
-          if ( postFinder && !postFinder[ expando ] ) {
-            postFinder = setMatcher( postFinder, postSelector );
-          }
-          return markFunction(function( seed, results, context, xml ) {
-            var temp, i, elem,
-                preMap = [],
-                postMap = [],
-                preexisting = results.length,
-
-                // Get initial elements from seed or context
-                elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-                // Prefilter to get matcher input, preserving a map for seed-results synchronization
-                matcherIn = preFilter && ( seed || !selector ) ?
-                    condense( elems, preMap, preFilter, context, xml ) :
-                    elems,
-
-                matcherOut = matcher ?
-                    // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-                    postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-                        // ...intermediate processing is necessary
-                        [] :
-
-                        // ...otherwise use results directly
-                        results :
-                    matcherIn;
-
-            // Find primary matches
-            if ( matcher ) {
-              matcher( matcherIn, matcherOut, context, xml );
-            }
-
-            // Apply postFilter
-            if ( postFilter ) {
-              temp = condense( matcherOut, postMap );
-              postFilter( temp, [], context, xml );
-
-              // Un-match failing elements by moving them back to matcherIn
-              i = temp.length;
-              while ( i-- ) {
-                if ( (elem = temp[i]) ) {
-                  matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-                }
-              }
-            }
-
-            if ( seed ) {
-              if ( postFinder || preFilter ) {
-                if ( postFinder ) {
-                  // Get the final matcherOut by condensing this intermediate into postFinder contexts
-                  temp = [];
-                  i = matcherOut.length;
-                  while ( i-- ) {
-                    if ( (elem = matcherOut[i]) ) {
-                      // Restore matcherIn since elem is not yet a final match
-                      temp.push( (matcherIn[i] = elem) );
-                    }
-                  }
-                  postFinder( null, (matcherOut = []), temp, xml );
-                }
-
-                // Move matched elements from seed to results to keep them synchronized
-                i = matcherOut.length;
-                while ( i-- ) {
-                  if ( (elem = matcherOut[i]) &&
-                      (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
-                    seed[temp] = !(results[temp] = elem);
-                  }
-                }
-              }
-
-              // Add elements to results, through postFinder if defined
-            } else {
-              matcherOut = condense(
-                  matcherOut === results ?
-                      matcherOut.splice( preexisting, matcherOut.length ) :
-                      matcherOut
-              );
-              if ( postFinder ) {
-                postFinder( null, results, matcherOut, xml );
-              } else {
-                push.apply( results, matcherOut );
-              }
-            }
-          });
-        }
-
-        function matcherFromTokens( tokens ) {
-          var checkContext, matcher, j,
-              len = tokens.length,
-              leadingRelative = Expr.relative[ tokens[0].type ],
-              implicitRelative = leadingRelative || Expr.relative[" "],
-              i = leadingRelative ? 1 : 0,
-
-              // The foundational matcher ensures that elements are reachable from top-level context(s)
-              matchContext = addCombinator( function( elem ) {
-                return elem === checkContext;
-              }, implicitRelative, true ),
-              matchAnyContext = addCombinator( function( elem ) {
-                return indexOf( checkContext, elem ) > -1;
-              }, implicitRelative, true ),
-              matchers = [ function( elem, context, xml ) {
-                var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-                    (checkContext = context).nodeType ?
-                        matchContext( elem, context, xml ) :
-                        matchAnyContext( elem, context, xml ) );
-                // Avoid hanging onto element (issue #299)
-                checkContext = null;
-                return ret;
-              } ];
-
-          for ( ; i < len; i++ ) {
-            if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-              matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-            } else {
-              matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-              // Return special upon seeing a positional matcher
-              if ( matcher[ expando ] ) {
-                // Find the next relative operator (if any) for proper handling
-                j = ++i;
-                for ( ; j < len; j++ ) {
-                  if ( Expr.relative[ tokens[j].type ] ) {
-                    break;
-                  }
-                }
-                return setMatcher(
-                    i > 1 && elementMatcher( matchers ),
-                    i > 1 && toSelector(
-                    // If the preceding token was a descendant combinator, insert an implicit any-element `*`
-                    tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-                    ).replace( rtrim, "$1" ),
-                    matcher,
-                    i < j && matcherFromTokens( tokens.slice( i, j ) ),
-                    j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-                    j < len && toSelector( tokens )
-                );
-              }
-              matchers.push( matcher );
-            }
-          }
-
-          return elementMatcher( matchers );
-        }
-
-        function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-          var bySet = setMatchers.length > 0,
-              byElement = elementMatchers.length > 0,
-              superMatcher = function( seed, context, xml, results, outermost ) {
-                var elem, j, matcher,
-                    matchedCount = 0,
-                    i = "0",
-                    unmatched = seed && [],
-                    setMatched = [],
-                    contextBackup = outermostContext,
-                    // We must always have either seed elements or outermost context
-                    elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
-                    // Use integer dirruns iff this is the outermost matcher
-                    dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
-                    len = elems.length;
-
-                if ( outermost ) {
-                  outermostContext = context === document || context || outermost;
-                }
-
-                // Add elements passing elementMatchers directly to results
-                // Support: IE<9, Safari
-                // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
-                for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
-                  if ( byElement && elem ) {
-                    j = 0;
-                    if ( !context && elem.ownerDocument !== document ) {
-                      setDocument( elem );
-                      xml = !documentIsHTML;
-                    }
-                    while ( (matcher = elementMatchers[j++]) ) {
-                      if ( matcher( elem, context || document, xml) ) {
-                        results.push( elem );
-                        break;
-                      }
-                    }
-                    if ( outermost ) {
-                      dirruns = dirrunsUnique;
-                    }
-                  }
-
-                  // Track unmatched elements for set filters
-                  if ( bySet ) {
-                    // They will have gone through all possible matchers
-                    if ( (elem = !matcher && elem) ) {
-                      matchedCount--;
-                    }
-
-                    // Lengthen the array for every element, matched or not
-                    if ( seed ) {
-                      unmatched.push( elem );
-                    }
-                  }
-                }
-
-                // `i` is now the count of elements visited above, and adding it to `matchedCount`
-                // makes the latter nonnegative.
-                matchedCount += i;
-
-                // Apply set filters to unmatched elements
-                // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
-                // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
-                // no element matchers and no seed.
-                // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
-                // case, which will result in a "00" `matchedCount` that differs from `i` but is also
-                // numerically zero.
-                if ( bySet && i !== matchedCount ) {
-                  j = 0;
-                  while ( (matcher = setMatchers[j++]) ) {
-                    matcher( unmatched, setMatched, context, xml );
-                  }
-
-                  if ( seed ) {
-                    // Reintegrate element matches to eliminate the need for sorting
-                    if ( matchedCount > 0 ) {
-                      while ( i-- ) {
-                        if ( !(unmatched[i] || setMatched[i]) ) {
-                          setMatched[i] = pop.call( results );
-                        }
-                      }
-                    }
-
-                    // Discard index placeholder values to get only actual matches
-                    setMatched = condense( setMatched );
-                  }
-
-                  // Add matches to results
-                  push.apply( results, setMatched );
-
-                  // Seedless set matches succeeding multiple successful matchers stipulate sorting
-                  if ( outermost && !seed && setMatched.length > 0 &&
-                      ( matchedCount + setMatchers.length ) > 1 ) {
-
-                    Sizzle.uniqueSort( results );
-                  }
-                }
-
-                // Override manipulation of globals by nested matchers
-                if ( outermost ) {
-                  dirruns = dirrunsUnique;
-                  outermostContext = contextBackup;
-                }
-
-                return unmatched;
-              };
-
-          return bySet ?
-              markFunction( superMatcher ) :
-              superMatcher;
-        }
-
-        compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
-          var i,
-              setMatchers = [],
-              elementMatchers = [],
-              cached = compilerCache[ selector + " " ];
-
-          if ( !cached ) {
-            // Generate a function of recursive functions that can be used to check each element
-            if ( !match ) {
-              match = tokenize( selector );
-            }
-            i = match.length;
-            while ( i-- ) {
-              cached = matcherFromTokens( match[i] );
-              if ( cached[ expando ] ) {
-                setMatchers.push( cached );
-              } else {
-                elementMatchers.push( cached );
-              }
-            }
-
-            // Cache the compiled function
-            cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
-            // Save selector and tokenization
-            cached.selector = selector;
-          }
-          return cached;
-        };
-
-        /**
-         * A low-level selection function that works with Sizzle's compiled
-         *  selector functions
-         * @param {String|Function} selector A selector or a pre-compiled
-         *  selector function built with Sizzle.compile
-         * @param {Element} context
-         * @param {Array} [results]
-         * @param {Array} [seed] A set of elements to match against
-         */
-        select = Sizzle.select = function( selector, context, results, seed ) {
-          var i, tokens, token, type, find,
-              compiled = typeof selector === "function" && selector,
-              match = !seed && tokenize( (selector = compiled.selector || selector) );
-
-          results = results || [];
-
-          // Try to minimize operations if there is only one selector in the list and no seed
-          // (the latter of which guarantees us context)
-          if ( match.length === 1 ) {
-
-            // Reduce context if the leading compound selector is an ID
-            tokens = match[0] = match[0].slice( 0 );
-            if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-                context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
-
-              context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-              if ( !context ) {
-                return results;
-
-                // Precompiled matchers will still verify ancestry, so step up a level
-              } else if ( compiled ) {
-                context = context.parentNode;
-              }
-
-              selector = selector.slice( tokens.shift().value.length );
-            }
-
-            // Fetch a seed set for right-to-left matching
-            i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-            while ( i-- ) {
-              token = tokens[i];
-
-              // Abort if we hit a combinator
-              if ( Expr.relative[ (type = token.type) ] ) {
-                break;
-              }
-              if ( (find = Expr.find[ type ]) ) {
-                // Search, expanding context for leading sibling combinators
-                if ( (seed = find(
-                    token.matches[0].replace( runescape, funescape ),
-                    rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-                )) ) {
-
-                  // If seed is empty or no tokens remain, we can return early
-                  tokens.splice( i, 1 );
-                  selector = seed.length && toSelector( tokens );
-                  if ( !selector ) {
-                    push.apply( results, seed );
-                    return results;
-                  }
-
-                  break;
-                }
-              }
-            }
-          }
-
-          // Compile and execute a filtering function if one is not provided
-          // Provide `match` to avoid retokenization if we modified the selector above
-          ( compiled || compile( selector, match ) )(
-              seed,
-              context,
-              !documentIsHTML,
-              results,
-              !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
-          );
-          return results;
-        };
-
-// One-time assignments
-
-// Sort stability
-        support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-        support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-        setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-        support.sortDetached = assert(function( el ) {
-          // Should return 1, but returns 4 (following)
-          return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
-        });
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-        if ( !assert(function( el ) {
-          el.innerHTML = "<a href='#'></a>";
-          return el.firstChild.getAttribute("href") === "#" ;
-        }) ) {
-          addHandle( "type|href|height|width", function( elem, name, isXML ) {
-            if ( !isXML ) {
-              return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-            }
-          });
-        }
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-        if ( !support.attributes || !assert(function( el ) {
-          el.innerHTML = "<input/>";
-          el.firstChild.setAttribute( "value", "" );
-          return el.firstChild.getAttribute( "value" ) === "";
-        }) ) {
-          addHandle( "value", function( elem, name, isXML ) {
-            if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-              return elem.defaultValue;
-            }
-          });
-        }
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-        if ( !assert(function( el ) {
-          return el.getAttribute("disabled") == null;
-        }) ) {
-          addHandle( booleans, function( elem, name, isXML ) {
-            var val;
-            if ( !isXML ) {
-              return elem[ name ] === true ? name.toLowerCase() :
-                  (val = elem.getAttributeNode( name )) && val.specified ?
-                      val.value :
-                      null;
-            }
-          });
-        }
-
-        return Sizzle;
-
-      })( window );
-
-
-
-  jQuery.find = Sizzle;
-  jQuery.expr = Sizzle.selectors;
-
-// Deprecated
-  jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-  jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-  jQuery.text = Sizzle.getText;
-  jQuery.isXMLDoc = Sizzle.isXML;
-  jQuery.contains = Sizzle.contains;
-  jQuery.escapeSelector = Sizzle.escape;
-
-
-
-
-  var dir = function( elem, dir, until ) {
-    var matched = [],
-        truncate = until !== undefined;
-
-    while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
-      if ( elem.nodeType === 1 ) {
-        if ( truncate && jQuery( elem ).is( until ) ) {
-          break;
-        }
-        matched.push( elem );
-      }
-    }
-    return matched;
-  };
-
-
-  var siblings = function( n, elem ) {
-    var matched = [];
-
-    for ( ; n; n = n.nextSibling ) {
-      if ( n.nodeType === 1 && n !== elem ) {
-        matched.push( n );
-      }
-    }
-
-    return matched;
-  };
-
-
-  var rneedsContext = jQuery.expr.match.needsContext;
-
-
-
-  function nodeName( elem, name ) {
-
-    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-
-  };
-  var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
-
-
-// Implement the identical functionality for filter and not
-  function winnow( elements, qualifier, not ) {
-    if ( isFunction( qualifier ) ) {
-      return jQuery.grep( elements, function( elem, i ) {
-        return !!qualifier.call( elem, i, elem ) !== not;
-      } );
-    }
-
-    // Single element
-    if ( qualifier.nodeType ) {
-      return jQuery.grep( elements, function( elem ) {
-        return ( elem === qualifier ) !== not;
-      } );
-    }
-
-    // Arraylike of elements (jQuery, arguments, Array)
-    if ( typeof qualifier !== "string" ) {
-      return jQuery.grep( elements, function( elem ) {
-        return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
-      } );
-    }
-
-    // Filtered directly for both simple and complex selectors
-    return jQuery.filter( qualifier, elements, not );
-  }
-
-  jQuery.filter = function( expr, elems, not ) {
-    var elem = elems[ 0 ];
-
-    if ( not ) {
-      expr = ":not(" + expr + ")";
-    }
-
-    if ( elems.length === 1 && elem.nodeType === 1 ) {
-      return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
-    }
-
-    return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-      return elem.nodeType === 1;
-    } ) );
-  };
-
-  jQuery.fn.extend( {
-    find: function( selector ) {
-      var i, ret,
-          len = this.length,
-          self = this;
-
-      if ( typeof selector !== "string" ) {
-        return this.pushStack( jQuery( selector ).filter( function() {
-          for ( i = 0; i < len; i++ ) {
-            if ( jQuery.contains( self[ i ], this ) ) {
-              return true;
-            }
-          }
-        } ) );
-      }
-
-      ret = this.pushStack( [] );
-
-      for ( i = 0; i < len; i++ ) {
-        jQuery.find( selector, self[ i ], ret );
-      }
-
-      return len > 1 ? jQuery.uniqueSort( ret ) : ret;
-    },
-    filter: function( selector ) {
-      return this.pushStack( winnow( this, selector || [], false ) );
-    },
-    not: function( selector ) {
-      return this.pushStack( winnow( this, selector || [], true ) );
-    },
-    is: function( selector ) {
-      return !!winnow(
-          this,
-
-          // If this is a positional/relative selector, check membership in the returned set
-          // so $("p:first").is("p:last") won't return true for a doc with two "p".
-          typeof selector === "string" && rneedsContext.test( selector ) ?
-              jQuery( selector ) :
-              selector || [],
-          false
-      ).length;
-    }
-  } );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-  var rootjQuery,
-
-      // A simple way to check for HTML strings
-      // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-      // Strict HTML recognition (#11290: must start with <)
-      // Shortcut simple #id case for speed
-      rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
-
-      init = jQuery.fn.init = function( selector, context, root ) {
-        var match, elem;
-
-        // HANDLE: $(""), $(null), $(undefined), $(false)
-        if ( !selector ) {
-          return this;
-        }
-
-        // Method init() accepts an alternate rootjQuery
-        // so migrate can support jQuery.sub (gh-2101)
-        root = root || rootjQuery;
-
-        // Handle HTML strings
-        if ( typeof selector === "string" ) {
-          if ( selector[ 0 ] === "<" &&
-              selector[ selector.length - 1 ] === ">" &&
-              selector.length >= 3 ) {
-
-            // Assume that strings that start and end with <> are HTML and skip the regex check
-            match = [ null, selector, null ];
-
-          } else {
-            match = rquickExpr.exec( selector );
-          }
-
-          // Match html or make sure no context is specified for #id
-          if ( match && ( match[ 1 ] || !context ) ) {
-
-            // HANDLE: $(html) -> $(array)
-            if ( match[ 1 ] ) {
-              context = context instanceof jQuery ? context[ 0 ] : context;
-
-              // Option to run scripts is true for back-compat
-              // Intentionally let the error be thrown if parseHTML is not present
-              jQuery.merge( this, jQuery.parseHTML(
-                  match[ 1 ],
-                  context && context.nodeType ? context.ownerDocument || context : document,
-                  true
-              ) );
-
-              // HANDLE: $(html, props)
-              if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
-                for ( match in context ) {
-
-                  // Properties of context are called as methods if possible
-                  if ( isFunction( this[ match ] ) ) {
-                    this[ match ]( context[ match ] );
-
-                    // ...and otherwise set as attributes
-                  } else {
-                    this.attr( match, context[ match ] );
-                  }
-                }
-              }
-
-              return this;
-
-              // HANDLE: $(#id)
-            } else {
-              elem = document.getElementById( match[ 2 ] );
-
-              if ( elem ) {
-
-                // Inject the element directly into the jQuery object
-                this[ 0 ] = elem;
-                this.length = 1;
-              }
-              return this;
-            }
-
-            // HANDLE: $(expr, $(...))
-          } else if ( !context || context.jquery ) {
-            return ( context || root ).find( selector );
-
-            // HANDLE: $(expr, context)
-            // (which is just equivalent to: $(context).find(expr)
-          } else {
-            return this.constructor( context ).find( selector );
-          }
-
-          // HANDLE: $(DOMElement)
-        } else if ( selector.nodeType ) {
-          this[ 0 ] = selector;
-          this.length = 1;
-          return this;
-
-          // HANDLE: $(function)
-          // Shortcut for document ready
-        } else if ( isFunction( selector ) ) {
-          return root.ready !== undefined ?
-              root.ready( selector ) :
-
-              // Execute immediately if ready is not present
-              selector( jQuery );
-        }
-
-        return jQuery.makeArray( selector, this );
-      };
-
-// Give the init function the jQuery prototype for later instantiation
-  init.prototype = jQuery.fn;
-
-// Initialize central reference
-  rootjQuery = jQuery( document );
-
-
-  var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
-      // Methods guaranteed to produce a unique set when starting from a unique set
-      guaranteedUnique = {
-        children: true,
-        contents: true,
-        next: true,
-        prev: true
-      };
-
-  jQuery.fn.extend( {
-    has: function( target ) {
-      var targets = jQuery( target, this ),
-          l = targets.length;
-
-      return this.filter( function() {
-        var i = 0;
-        for ( ; i < l; i++ ) {
-          if ( jQuery.contains( this, targets[ i ] ) ) {
-            return true;
-          }
-        }
-      } );
-    },
-
-    closest: function( selectors, context ) {
-      var cur,
-          i = 0,
-          l = this.length,
-          matched = [],
-          targets = typeof selectors !== "string" && jQuery( selectors );
-
-      // Positional selectors never match, since there's no _selection_ context
-      if ( !rneedsContext.test( selectors ) ) {
-        for ( ; i < l; i++ ) {
-          for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
-            // Always skip document fragments
-            if ( cur.nodeType < 11 && ( targets ?
-                targets.index( cur ) > -1 :
-
-                // Don't pass non-elements to Sizzle
-                cur.nodeType === 1 &&
-                jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
-              matched.push( cur );
-              break;
-            }
-          }
-        }
-      }
-
-      return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
-    },
-
-    // Determine the position of an element within the set
-    index: function( elem ) {
-
-      // No argument, return index in parent
-      if ( !elem ) {
-        return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
-      }
-
-      // Index in selector
-      if ( typeof elem === "string" ) {
-        return indexOf.call( jQuery( elem ), this[ 0 ] );
-      }
-
-      // Locate the position of the desired element
-      return indexOf.call( this,
-
-          // If it receives a jQuery object, the first element is used
-          elem.jquery ? elem[ 0 ] : elem
-      );
-    },
-
-    add: function( selector, context ) {
-      return this.pushStack(
-          jQuery.uniqueSort(
-              jQuery.merge( this.get(), jQuery( selector, context ) )
-          )
-      );
-    },
-
-    addBack: function( selector ) {
-      return this.add( selector == null ?
-          this.prevObject : this.prevObject.filter( selector )
-      );
-    }
-  } );
-
-  function sibling( cur, dir ) {
-    while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
-    return cur;
-  }
-
-  jQuery.each( {
-    parent: function( elem ) {
-      var parent = elem.parentNode;
-      return parent && parent.nodeType !== 11 ? parent : null;
-    },
-    parents: function( elem ) {
-      return dir( elem, "parentNode" );
-    },
-    parentsUntil: function( elem, i, until ) {
-      return dir( elem, "parentNode", until );
-    },
-    next: function( elem ) {
-      return sibling( elem, "nextSibling" );
-    },
-    prev: function( elem ) {
-      return sibling( elem, "previousSibling" );
-    },
-    nextAll: function( elem ) {
-      return dir( elem, "nextSibling" );
-    },
-    prevAll: function( elem ) {
-      return dir( elem, "previousSibling" );
-    },
-    nextUntil: function( elem, i, until ) {
-      return dir( elem, "nextSibling", until );
-    },
-    prevUntil: function( elem, i, until ) {
-      return dir( elem, "previousSibling", until );
-    },
-    siblings: function( elem ) {
-      return siblings( ( elem.parentNode || {} ).firstChild, elem );
-    },
-    children: function( elem ) {
-      return siblings( elem.firstChild );
-    },
-    contents: function( elem ) {
-      if ( nodeName( elem, "iframe" ) ) {
-        return elem.contentDocument;
-      }
-
-      // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
-      // Treat the template element as a regular one in browsers that
-      // don't support it.
-      if ( nodeName( elem, "template" ) ) {
-        elem = elem.content || elem;
-      }
-
-      return jQuery.merge( [], elem.childNodes );
-    }
-  }, function( name, fn ) {
-    jQuery.fn[ name ] = function( until, selector ) {
-      var matched = jQuery.map( this, fn, until );
-
-      if ( name.slice( -5 ) !== "Until" ) {
-        selector = until;
-      }
-
-      if ( selector && typeof selector === "string" ) {
-        matched = jQuery.filter( selector, matched );
-      }
-
-      if ( this.length > 1 ) {
-
-        // Remove duplicates
-        if ( !guaranteedUnique[ name ] ) {
-          jQuery.uniqueSort( matched );
-        }
-
-        // Reverse order for parents* and prev-derivatives
-        if ( rparentsprev.test( name ) ) {
-          matched.reverse();
-        }
-      }
-
-      return this.pushStack( matched );
-    };
-  } );
-  var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-  function createOptions( options ) {
-    var object = {};
-    jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
-      object[ flag ] = true;
-    } );
-    return object;
-  }
-
-  /*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-  jQuery.Callbacks = function( options ) {
-
-    // Convert options from String-formatted to Object-formatted if needed
-    // (we check in cache first)
-    options = typeof options === "string" ?
-        createOptions( options ) :
-        jQuery.extend( {}, options );
-
-    var // Flag to know if list is currently firing
-        firing,
-
-        // Last fire value for non-forgettable lists
-        memory,
-
-        // Flag to know if list was already fired
-        fired,
-
-        // Flag to prevent firing
-        locked,
-
-        // Actual callback list
-        list = [],
-
-        // Queue of execution data for repeatable lists
-        queue = [],
-
-        // Index of currently firing callback (modified by add/remove as needed)
-        firingIndex = -1,
-
-        // Fire callbacks
-        fire = function() {
-
-          // Enforce single-firing
-          locked = locked || options.once;
-
-          // Execute callbacks for all pending executions,
-          // respecting firingIndex overrides and runtime changes
-          fired = firing = true;
-          for ( ; queue.length; firingIndex = -1 ) {
-            memory = queue.shift();
-            while ( ++firingIndex < list.length ) {
-
-              // Run callback and check for early termination
-              if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
-                  options.stopOnFalse ) {
-
-                // Jump to end and forget the data so .add doesn't re-fire
-                firingIndex = list.length;
-                memory = false;
-              }
-            }
-          }
-
-          // Forget the data if we're done with it
-          if ( !options.memory ) {
-            memory = false;
-          }
-
-          firing = false;
-
-          // Clean up if we're done firing for good
-          if ( locked ) {
-
-            // Keep an empty list if we have data for future add calls
-            if ( memory ) {
-              list = [];
-
-              // Otherwise, this object is spent
-            } else {
-              list = "";
-            }
-          }
-        },
-
-        // Actual Callbacks object
-        self = {
-
-          // Add a callback or a collection of callbacks to the list
-          add: function() {
-            if ( list ) {
-
-              // If we have memory from a past run, we should fire after adding
-              if ( memory && !firing ) {
-                firingIndex = list.length - 1;
-                queue.push( memory );
-              }
-
-              ( function add( args ) {
-                jQuery.each( args, function( _, arg ) {
-                  if ( isFunction( arg ) ) {
-                    if ( !options.unique || !self.has( arg ) ) {
-                      list.push( arg );
-                    }
-                  } else if ( arg && arg.length && toType( arg ) !== "string" ) {
-
-                    // Inspect recursively
-                    add( arg );
-                  }
-                } );
-              } )( arguments );
-
-              if ( memory && !firing ) {
-                fire();
-              }
-            }
-            return this;
-          },
-
-          // Remove a callback from the list
-          remove: function() {
-            jQuery.each( arguments, function( _, arg ) {
-              var index;
-              while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-                list.splice( index, 1 );
-
-                // Handle firing indexes
-                if ( index <= firingIndex ) {
-                  firingIndex--;
-                }
-              }
-            } );
-            return this;
-          },
-
-          // Check if a given callback is in the list.
-          // If no argument is given, return whether or not list has callbacks attached.
-          has: function( fn ) {
-            return fn ?
-                jQuery.inArray( fn, list ) > -1 :
-                list.length > 0;
-          },
-
-          // Remove all callbacks from the list
-          empty: function() {
-            if ( list ) {
-              list = [];
-            }
-            return this;
-          },
-
-          // Disable .fire and .add
-          // Abort any current/pending executions
-          // Clear all callbacks and values
-          disable: function() {
-            locked = queue = [];
-            list = memory = "";
-            return this;
-          },
-          disabled: function() {
-            return !list;
-          },
-
-          // Disable .fire
-          // Also disable .add unless we have memory (since it would have no effect)
-          // Abort any pending executions
-          lock: function() {
-            locked = queue = [];
-            if ( !memory && !firing ) {
-              list = memory = "";
-            }
-            return this;
-          },
-          locked: function() {
-            return !!locked;
-          },
-
-          // Call all callbacks with the given context and arguments
-          fireWith: function( context, args ) {
-            if ( !locked ) {
-              args = args || [];
-              args = [ context, args.slice ? args.slice() : args ];
-              queue.push( args );
-              if ( !firing ) {
-                fire();
-              }
-            }
-            return this;
-          },
-
-          // Call all the callbacks with the given arguments
-          fire: function() {
-            self.fireWith( this, arguments );
-            return this;
-          },
-
-          // To know if the callbacks have already been called at least once
-          fired: function() {
-            return !!fired;
-          }
-        };
-
-    return self;
-  };
-
-
-  function Identity( v ) {
-    return v;
-  }
-  function Thrower( ex ) {
-    throw ex;
-  }
-
-  function adoptValue( value, resolve, reject, noValue ) {
-    var method;
-
-    try {
-
-      // Check for promise aspect first to privilege synchronous behavior
-      if ( value && isFunction( ( method = value.promise ) ) ) {
-        method.call( value ).done( resolve ).fail( reject );
-
-        // Other thenables
-      } else if ( value && isFunction( ( method = value.then ) ) ) {
-        method.call( value, resolve, reject );
-
-        // Other non-thenables
-      } else {
-
-        // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
-        // * false: [ value ].slice( 0 ) => resolve( value )
-        // * true: [ value ].slice( 1 ) => resolve()
-        resolve.apply( undefined, [ value ].slice( noValue ) );
-      }
-
-      // For Promises/A+, convert exceptions into rejections
-      // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
-      // Deferred#then to conditionally suppress rejection.
-    } catch ( value ) {
-
-      // Support: Android 4.0 only
-      // Strict mode functions invoked without .call/.apply get global-object context
-      reject.apply( undefined, [ value ] );
-    }
-  }
-
-  jQuery.extend( {
-
-    Deferred: function( func ) {
-      var tuples = [
-
-            // action, add listener, callbacks,
-            // ... .then handlers, argument index, [final state]
-            [ "notify", "progress", jQuery.Callbacks( "memory" ),
-              jQuery.Callbacks( "memory" ), 2 ],
-            [ "resolve", "done", jQuery.Callbacks( "once memory" ),
-              jQuery.Callbacks( "once memory" ), 0, "resolved" ],
-            [ "reject", "fail", jQuery.Callbacks( "once memory" ),
-              jQuery.Callbacks( "once memory" ), 1, "rejected" ]
-          ],
-          state = "pending",
-          promise = {
-            state: function() {
-              return state;
-            },
-            always: function() {
-              deferred.done( arguments ).fail( arguments );
-              return this;
-            },
-            "catch": function( fn ) {
-              return promise.then( null, fn );
-            },
-
-            // Keep pipe for back-compat
-            pipe: function( /* fnDone, fnFail, fnProgress */ ) {
-              var fns = arguments;
-
-              return jQuery.Deferred( function( newDefer ) {
-                jQuery.each( tuples, function( i, tuple ) {
-
-                  // Map tuples (progress, done, fail) to arguments (done, fail, progress)
-                  var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
-
-                  // deferred.progress(function() { bind to newDefer or newDefer.notify })
-                  // deferred.done(function() { bind to newDefer or newDefer.resolve })
-                  // deferred.fail(function() { bind to newDefer or newDefer.reject })
-                  deferred[ tuple[ 1 ] ]( function() {
-                    var returned = fn && fn.apply( this, arguments );
-                    if ( returned && isFunction( returned.promise ) ) {
-                      returned.promise()
-                          .progress( newDefer.notify )
-                          .done( newDefer.resolve )
-                          .fail( newDefer.reject );
-                    } else {
-                      newDefer[ tuple[ 0 ] + "With" ](
-                          this,
-                          fn ? [ returned ] : arguments
-                      );
-                    }
-                  } );
-                } );
-                fns = null;
-              } ).promise();
-            },
-            then: function( onFulfilled, onRejected, onProgress ) {
-              var maxDepth = 0;
-              function resolve( depth, deferred, handler, special ) {
-                return function() {
-                  var that = this,
-                      args = arguments,
-                      mightThrow = function() {
-                        var returned, then;
-
-                        // Support: Promises/A+ section 2.3.3.3.3
-                        // https://promisesaplus.com/#point-59
-                        // Ignore double-resolution attempts
-                        if ( depth < maxDepth ) {
-                          return;
-                        }
-
-                        returned = handler.apply( that, args );
-
-                        // Support: Promises/A+ section 2.3.1
-                        // https://promisesaplus.com/#point-48
-                        if ( returned === deferred.promise() ) {
-                          throw new TypeError( "Thenable self-resolution" );
-                        }
-
-                        // Support: Promises/A+ sections 2.3.3.1, 3.5
-                        // https://promisesaplus.com/#point-54
-                        // https://promisesaplus.com/#point-75
-                        // Retrieve `then` only once
-                        then = returned &&
-
-                            // Support: Promises/A+ section 2.3.4
-                            // https://promisesaplus.com/#point-64
-                            // Only check objects and functions for thenability
-                            ( typeof returned === "object" ||
-                                typeof returned === "function" ) &&
-                            returned.then;
-
-                        // Handle a returned thenable
-                        if ( isFunction( then ) ) {
-
-                          // Special processors (notify) just wait for resolution
-                          if ( special ) {
-                            then.call(
-                                returned,
-                                resolve( maxDepth, deferred, Identity, special ),
-                                resolve( maxDepth, deferred, Thrower, special )
-                            );
-
-                            // Normal processors (resolve) also hook into progress
-                          } else {
-
-                            // ...and disregard older resolution values
-                            maxDepth++;
-
-                            then.call(
-                                returned,
-                                resolve( maxDepth, deferred, Identity, special ),
-                                resolve( maxDepth, deferred, Thrower, special ),
-                                resolve( maxDepth, deferred, Identity,
-                                    deferred.notifyWith )
-                            );
-                          }
-
-                          // Handle all other returned values
-                        } else {
-
-                          // Only substitute handlers pass on context
-                          // and multiple values (non-spec behavior)
-                          if ( handler !== Identity ) {
-                            that = undefined;
-                            args = [ returned ];
-                          }
-
-                          // Process the value(s)
-                          // Default process is resolve
-                          ( special || deferred.resolveWith )( that, args );
-                        }
-                      },
-
-                      // Only normal processors (resolve) catch and reject exceptions
-                      process = special ?
-                          mightThrow :
-                          function() {
-                            try {
-                              mightThrow();
-                            } catch ( e ) {
-
-                              if ( jQuery.Deferred.exceptionHook ) {
-                                jQuery.Deferred.exceptionHook( e,
-                                    process.stackTrace );
-                              }
-
-                              // Support: Promises/A+ section 2.3.3.3.4.1
-                              // https://promisesaplus.com/#point-61
-                              // Ignore post-resolution exceptions
-                              if ( depth + 1 >= maxDepth ) {
-
-                                // Only substitute handlers pass on context
-                                // and multiple values (non-spec behavior)
-                                if ( handler !== Thrower ) {
-                                  that = undefined;
-                                  args = [ e ];
-                                }
-
-                                deferred.rejectWith( that, args );
-                              }
-                            }
-                          };
-
-                  // Support: Promises/A+ section 2.3.3.3.1
-                  // https://promisesaplus.com/#point-57
-                  // Re-resolve promises immediately to dodge false rejection from
-                  // subsequent errors
-                  if ( depth ) {
-                    process();
-                  } else {
-
-                    // Call an optional hook to record the stack, in case of exception
-                    // since it's otherwise lost when execution goes async
-                    if ( jQuery.Deferred.getStackHook ) {
-                      process.stackTrace = jQuery.Deferred.getStackHook();
-                    }
-                    window.setTimeout( process );
-                  }
-                };
-              }
-
-              return jQuery.Deferred( function( newDefer ) {
-
-                // progress_handlers.add( ... )
-                tuples[ 0 ][ 3 ].add(
-                    resolve(
-                        0,
-                        newDefer,
-                        isFunction( onProgress ) ?
-                            onProgress :
-                            Identity,
-                        newDefer.notifyWith
-                    )
-                );
-
-                // fulfilled_handlers.add( ... )
-                tuples[ 1 ][ 3 ].add(
-                    resolve(
-                        0,
-                        newDefer,
-                        isFunction( onFulfilled ) ?
-                            onFulfilled :
-                            Identity
-                    )
-                );
-
-                // rejected_handlers.add( ... )
-                tuples[ 2 ][ 3 ].add(
-                    resolve(
-                        0,
-                        newDefer,
-                        isFunction( onRejected ) ?
-                            onRejected :
-                            Thrower
-                    )
-                );
-              } ).promise();
-            },
-
-            // Get a promise for this deferred
-            // If obj is provided, the promise aspect is added to the object
-            promise: function( obj ) {
-              return obj != null ? jQuery.extend( obj, promise ) : promise;
-            }
-          },
-          deferred = {};
-
-      // Add list-specific methods
-      jQuery.each( tuples, function( i, tuple ) {
-        var list = tuple[ 2 ],
-            stateString = tuple[ 5 ];
-
-        // promise.progress = list.add
-        // promise.done = list.add
-        // promise.fail = list.add
-        promise[ tuple[ 1 ] ] = list.add;
-
-        // Handle state
-        if ( stateString ) {
-          list.add(
-              function() {
-
-                // state = "resolved" (i.e., fulfilled)
-                // state = "rejected"
-                state = stateString;
-              },
-
-              // rejected_callbacks.disable
-              // fulfilled_callbacks.disable
-              tuples[ 3 - i ][ 2 ].disable,
-
-              // rejected_handlers.disable
-              // fulfilled_handlers.disable
-              tuples[ 3 - i ][ 3 ].disable,
-
-              // progress_callbacks.lock
-              tuples[ 0 ][ 2 ].lock,
-
-              // progress_handlers.lock
-              tuples[ 0 ][ 3 ].lock
-          );
-        }
-
-        // progress_handlers.fire
-        // fulfilled_handlers.fire
-        // rejected_handlers.fire
-        list.add( tuple[ 3 ].fire );
-
-        // deferred.notify = function() { deferred.notifyWith(...) }
-        // deferred.resolve = function() { deferred.resolveWith(...) }
-        // deferred.reject = function() { deferred.rejectWith(...) }
-        deferred[ tuple[ 0 ] ] = function() {
-          deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
-          return this;
-        };
-
-        // deferred.notifyWith = list.fireWith
-        // deferred.resolveWith = list.fireWith
-        // deferred.rejectWith = list.fireWith
-        deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
-      } );
-
-      // Make the deferred a promise
-      promise.promise( deferred );
-
-      // Call given func if any
-      if ( func ) {
-        func.call( deferred, deferred );
-      }
-
-      // All done!
-      return deferred;
-    },
-
-    // Deferred helper
-    when: function( singleValue ) {
-      var
-
-          // count of uncompleted subordinates
-          remaining = arguments.length,
-
-          // count of unprocessed arguments
-          i = remaining,
-
-          // subordinate fulfillment data
-          resolveContexts = Array( i ),
-          resolveValues = slice.call( arguments ),
-
-          // the master Deferred
-          master = jQuery.Deferred(),
-
-          // subordinate callback factory
-          updateFunc = function( i ) {
-            return function( value ) {
-              resolveContexts[ i ] = this;
-              resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
-              if ( !( --remaining ) ) {
-                master.resolveWith( resolveContexts, resolveValues );
-              }
-            };
-          };
-
-      // Single- and empty arguments are adopted like Promise.resolve
-      if ( remaining <= 1 ) {
-        adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
-            !remaining );
-
-        // Use .then() to unwrap secondary thenables (cf. gh-3000)
-        if ( master.state() === "pending" ||
-            isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
-
-          return master.then();
-        }
-      }
-
-      // Multiple arguments are aggregated like Promise.all array elements
-      while ( i-- ) {
-        adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
-      }
-
-      return master.promise();
-    }
-  } );
-
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-  jQuery.Deferred.exceptionHook = function( error, stack ) {
-
-    // Support: IE 8 - 9 only
-    // Console exists when dev tools are open, which can happen at any time
-    if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
-      window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
-    }
-  };
-
-
-
-
-  jQuery.readyException = function( error ) {
-    window.setTimeout( function() {
-      throw error;
-    } );
-  };
-
-
-
-
-// The deferred used on DOM ready
-  var readyList = jQuery.Deferred();
-
-  jQuery.fn.ready = function( fn ) {
-
-    readyList
-        .then( fn )
-
-        // Wrap jQuery.readyException in a function so that the lookup
-        // happens at the time of error handling instead of callback
-        // registration.
-        .catch( function( error ) {
-          jQuery.readyException( error );
-        } );
-
-    return this;
-  };
-
-  jQuery.extend( {
-
-    // Is the DOM ready to be used? Set to true once it occurs.
-    isReady: false,
-
-    // A counter to track how many items to wait for before
-    // the ready event fires. See #6781
-    readyWait: 1,
-
-    // Handle when the DOM is ready
-    ready: function( wait ) {
-
-      // Abort if there are pending holds or we're already ready
-      if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-        return;
-      }
-
-      // Remember that the DOM is ready
-      jQuery.isReady = true;
-
-      // If a normal DOM Ready event fired, decrement, and wait if need be
-      if ( wait !== true && --jQuery.readyWait > 0 ) {
-        return;
-      }
-
-      // If there are functions bound, to execute
-      readyList.resolveWith( document, [ jQuery ] );
-    }
-  } );
-
-  jQuery.ready.then = readyList.then;
-
-// The ready event handler and self cleanup method
-  function completed() {
-    document.removeEventListener( "DOMContentLoaded", completed );
-    window.removeEventListener( "load", completed );
-    jQuery.ready();
-  }
-
-// Catch cases where $(document).ready() is called
-// after the browser event has already occurred.
-// Support: IE <=9 - 10 only
-// Older IE sometimes signals "interactive" too soon
-  if ( document.readyState === "complete" ||
-      ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
-    // Handle it asynchronously to allow scripts the opportunity to delay ready
-    window.setTimeout( jQuery.ready );
-
-  } else {
-
-    // Use the handy event callback
-    document.addEventListener( "DOMContentLoaded", completed );
-
-    // A fallback to window.onload, that will always work
-    window.addEventListener( "load", completed );
-  }
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-  var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-    var i = 0,
-        len = elems.length,
-        bulk = key == null;
-
-    // Sets many values
-    if ( toType( key ) === "object" ) {
-      chainable = true;
-      for ( i in key ) {
-        access( elems, fn, i, key[ i ], true, emptyGet, raw );
-      }
-
-      // Sets one value
-    } else if ( value !== undefined ) {
-      chainable = true;
-
-      if ( !isFunction( value ) ) {
-        raw = true;
-      }
-
-      if ( bulk ) {
-
-        // Bulk operations run against the entire set
-        if ( raw ) {
-          fn.call( elems, value );
-          fn = null;
-
-          // ...except when executing function values
-        } else {
-          bulk = fn;
-          fn = function( elem, key, value ) {
-            return bulk.call( jQuery( elem ), value );
-          };
-        }
-      }
-
-      if ( fn ) {
-        for ( ; i < len; i++ ) {
-          fn(
-              elems[ i ], key, raw ?
-                  value :
-                  value.call( elems[ i ], i, fn( elems[ i ], key ) )
-          );
-        }
-      }
-    }
-
-    if ( chainable ) {
-      return elems;
-    }
-
-    // Gets
-    if ( bulk ) {
-      return fn.call( elems );
-    }
-
-    return len ? fn( elems[ 0 ], key ) : emptyGet;
-  };
-
-
-// Matches dashed string for camelizing
-  var rmsPrefix = /^-ms-/,
-      rdashAlpha = /-([a-z])/g;
-
-// Used by camelCase as callback to replace()
-  function fcamelCase( all, letter ) {
-    return letter.toUpperCase();
-  }
-
-// Convert dashed to camelCase; used by the css and data modules
-// Support: IE <=9 - 11, Edge 12 - 15
-// Microsoft forgot to hump their vendor prefix (#9572)
-  function camelCase( string ) {
-    return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-  }
-  var acceptData = function( owner ) {
-
-    // Accepts only:
-    //  - Node
-    //    - Node.ELEMENT_NODE
-    //    - Node.DOCUMENT_NODE
-    //  - Object
-    //    - Any
-    return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-  };
-
-
-
-
-  function Data() {
-    this.expando = jQuery.expando + Data.uid++;
-  }
-
-  Data.uid = 1;
-
-  Data.prototype = {
-
-    cache: function( owner ) {
-
-      // Check if the owner object already has a cache
-      var value = owner[ this.expando ];
-
-      // If not, create one
-      if ( !value ) {
-        value = {};
-
-        // We can accept data for non-element nodes in modern browsers,
-        // but we should not, see #8335.
-        // Always return an empty object.
-        if ( acceptData( owner ) ) {
-
-          // If it is a node unlikely to be stringify-ed or looped over
-          // use plain assignment
-          if ( owner.nodeType ) {
-            owner[ this.expando ] = value;
-
-            // Otherwise secure it in a non-enumerable property
-            // configurable must be true to allow the property to be
-            // deleted when data is removed
-          } else {
-            Object.defineProperty( owner, this.expando, {
-              value: value,
-              configurable: true
-            } );
-          }
-        }
-      }
-
-      return value;
-    },
-    set: function( owner, data, value ) {
-      var prop,
-          cache = this.cache( owner );
-
-      // Handle: [ owner, key, value ] args
-      // Always use camelCase key (gh-2257)
-      if ( typeof data === "string" ) {
-        cache[ camelCase( data ) ] = value;
-
-        // Handle: [ owner, { properties } ] args
-      } else {
-
-        // Copy the properties one-by-one to the cache object
-        for ( prop in data ) {
-          cache[ camelCase( prop ) ] = data[ prop ];
-        }
-      }
-      return cache;
-    },
-    get: function( owner, key ) {
-      return key === undefined ?
-          this.cache( owner ) :
-
-          // Always use camelCase key (gh-2257)
-          owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
-    },
-    access: function( owner, key, value ) {
-
-      // In cases where either:
-      //
-      //   1. No key was specified
-      //   2. A string key was specified, but no value provided
-      //
-      // Take the "read" path and allow the get method to determine
-      // which value to return, respectively either:
-      //
-      //   1. The entire cache object
-      //   2. The data stored at the key
-      //
-      if ( key === undefined ||
-          ( ( key && typeof key === "string" ) && value === undefined ) ) {
-
-        return this.get( owner, key );
-      }
-
-      // When the key is not a string, or both a key and value
-      // are specified, set or extend (existing objects) with either:
-      //
-      //   1. An object of properties
-      //   2. A key and value
-      //
-      this.set( owner, key, value );
-
-      // Since the "set" path can have two possible entry points
-      // return the expected data based on which path was taken[*]
-      return value !== undefined ? value : key;
-    },
-    remove: function( owner, key ) {
-      var i,
-          cache = owner[ this.expando ];
-
-      if ( cache === undefined ) {
-        return;
-      }
-
-      if ( key !== undefined ) {
-
-        // Support array or space separated string of keys
-        if ( Array.isArray( key ) ) {
-
-          // If key is an array of keys...
-          // We always set camelCase keys, so remove that.
-          key = key.map( camelCase );
-        } else {
-          key = camelCase( key );
-
-          // If a key with the spaces exists, use it.
-          // Otherwise, create an array by matching non-whitespace
-          key = key in cache ?
-              [ key ] :
-              ( key.match( rnothtmlwhite ) || [] );
-        }
-
-        i = key.length;
-
-        while ( i-- ) {
-          delete cache[ key[ i ] ];
-        }
-      }
-
-      // Remove the expando if there's no more data
-      if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
-        // Support: Chrome <=35 - 45
-        // Webkit & Blink performance suffers when deleting properties
-        // from DOM nodes, so set to undefined instead
-        // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
-        if ( owner.nodeType ) {
-          owner[ this.expando ] = undefined;
-        } else {
-          delete owner[ this.expando ];
-        }
-      }
-    },
-    hasData: function( owner ) {
-      var cache = owner[ this.expando ];
-      return cache !== undefined && !jQuery.isEmptyObject( cache );
-    }
-  };
-  var dataPriv = new Data();
-
-  var dataUser = new Data();
-
-
-
-//	Implementation Summary
-//
-//	1. Enforce API surface and semantic compatibility with 1.9.x branch
-//	2. Improve the module's maintainability by reducing the storage
-//		paths to a single mechanism.
-//	3. Use the same single mechanism to support "private" and "user" data.
-//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-//	5. Avoid exposing implementation details on user objects (eg. expando properties)
-//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-  var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-      rmultiDash = /[A-Z]/g;
-
-  function getData( data ) {
-    if ( data === "true" ) {
-      return true;
-    }
-
-    if ( data === "false" ) {
-      return false;
-    }
-
-    if ( data === "null" ) {
-      return null;
-    }
-
-    // Only convert to a number if it doesn't change the string
-    if ( data === +data + "" ) {
-      return +data;
-    }
-
-    if ( rbrace.test( data ) ) {
-      return JSON.parse( data );
-    }
-
-    return data;
-  }
-
-  function dataAttr( elem, key, data ) {
-    var name;
-
-    // If nothing was found internally, try to fetch any
-    // data from the HTML5 data-* attribute
-    if ( data === undefined && elem.nodeType === 1 ) {
-      name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
-      data = elem.getAttribute( name );
-
-      if ( typeof data === "string" ) {
-        try {
-          data = getData( data );
-        } catch ( e ) {}
-
-        // Make sure we set the data so it isn't changed later
-        dataUser.set( elem, key, data );
-      } else {
-        data = undefined;
-      }
-    }
-    return data;
-  }
-
-  jQuery.extend( {
-    hasData: function( elem ) {
-      return dataUser.hasData( elem ) || dataPriv.hasData( elem );
-    },
-
-    data: function( elem, name, data ) {
-      return dataUser.access( elem, name, data );
-    },
-
-    removeData: function( elem, name ) {
-      dataUser.remove( elem, name );
-    },
-
-    // TODO: Now that all calls to _data and _removeData have been replaced
-    // with direct calls to dataPriv methods, these can be deprecated.
-    _data: function( elem, name, data ) {
-      return dataPriv.access( elem, name, data );
-    },
-
-    _removeData: function( elem, name ) {
-      dataPriv.remove( elem, name );
-    }
-  } );
-
-  jQuery.fn.extend( {
-    data: function( key, value ) {
-      var i, name, data,
-          elem = this[ 0 ],
-          attrs = elem && elem.attributes;
-
-      // Gets all values
-      if ( key === undefined ) {
-        if ( this.length ) {
-          data = dataUser.get( elem );
-
-          if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
-            i = attrs.length;
-            while ( i-- ) {
-
-              // Support: IE 11 only
-              // The attrs elements can be null (#14894)
-              if ( attrs[ i ] ) {
-                name = attrs[ i ].name;
-                if ( name.indexOf( "data-" ) === 0 ) {
-                  name = camelCase( name.slice( 5 ) );
-                  dataAttr( elem, name, data[ name ] );
-                }
-              }
-            }
-            dataPriv.set( elem, "hasDataAttrs", true );
-          }
-        }
-
-        return data;
-      }
-
-      // Sets multiple values
-      if ( typeof key === "object" ) {
-        return this.each( function() {
-          dataUser.set( this, key );
-        } );
-      }
-
-      return access( this, function( value ) {
-        var data;
-
-        // The calling jQuery object (element matches) is not empty
-        // (and therefore has an element appears at this[ 0 ]) and the
-        // `value` parameter was not undefined. An empty jQuery object
-        // will result in `undefined` for elem = this[ 0 ] which will
-        // throw an exception if an attempt to read a data cache is made.
-        if ( elem && value === undefined ) {
-
-          // Attempt to get data from the cache
-          // The key will always be camelCased in Data
-          data = dataUser.get( elem, key );
-          if ( data !== undefined ) {
-            return data;
-          }
-
-          // Attempt to "discover" the data in
-          // HTML5 custom data-* attrs
-          data = dataAttr( elem, key );
-          if ( data !== undefined ) {
-            return data;
-          }
-
-          // We tried really hard, but the data doesn't exist.
-          return;
-        }
-
-        // Set the data...
-        this.each( function() {
-
-          // We always store the camelCased key
-          dataUser.set( this, key, value );
-        } );
-      }, null, value, arguments.length > 1, null, true );
-    },
-
-    removeData: function( key ) {
-      return this.each( function() {
-        dataUser.remove( this, key );
-      } );
-    }
-  } );
-
-
-  jQuery.extend( {
-    queue: function( elem, type, data ) {
-      var queue;
-
-      if ( elem ) {
-        type = ( type || "fx" ) + "queue";
-        queue = dataPriv.get( elem, type );
-
-        // Speed up dequeue by getting out quickly if this is just a lookup
-        if ( data ) {
-          if ( !queue || Array.isArray( data ) ) {
-            queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
-          } else {
-            queue.push( data );
-          }
-        }
-        return queue || [];
-      }
-    },
-
-    dequeue: function( elem, type ) {
-      type = type || "fx";
-
-      var queue = jQuery.queue( elem, type ),
-          startLength = queue.length,
-          fn = queue.shift(),
-          hooks = jQuery._queueHooks( elem, type ),
-          next = function() {
-            jQuery.dequeue( elem, type );
-          };
-
-      // If the fx queue is dequeued, always remove the progress sentinel
-      if ( fn === "inprogress" ) {
-        fn = queue.shift();
-        startLength--;
-      }
-
-      if ( fn ) {
-
-        // Add a progress sentinel to prevent the fx queue from being
-        // automatically dequeued
-        if ( type === "fx" ) {
-          queue.unshift( "inprogress" );
-        }
-
-        // Clear up the last queue stop function
-        delete hooks.stop;
-        fn.call( elem, next, hooks );
-      }
-
-      if ( !startLength && hooks ) {
-        hooks.empty.fire();
-      }
-    },
-
-    // Not public - generate a queueHooks object, or return the current one
-    _queueHooks: function( elem, type ) {
-      var key = type + "queueHooks";
-      return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
-        empty: jQuery.Callbacks( "once memory" ).add( function() {
-          dataPriv.remove( elem, [ type + "queue", key ] );
-        } )
-      } );
-    }
-  } );
-
-  jQuery.fn.extend( {
-    queue: function( type, data ) {
-      var setter = 2;
-
-      if ( typeof type !== "string" ) {
-        data = type;
-        type = "fx";
-        setter--;
-      }
-
-      if ( arguments.length < setter ) {
-        return jQuery.queue( this[ 0 ], type );
-      }
-
-      return data === undefined ?
-          this :
-          this.each( function() {
-            var queue = jQuery.queue( this, type, data );
-
-            // Ensure a hooks for this queue
-            jQuery._queueHooks( this, type );
-
-            if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
-              jQuery.dequeue( this, type );
-            }
-          } );
-    },
-    dequeue: function( type ) {
-      return this.each( function() {
-        jQuery.dequeue( this, type );
-      } );
-    },
-    clearQueue: function( type ) {
-      return this.queue( type || "fx", [] );
-    },
-
-    // Get a promise resolved when queues of a certain type
-    // are emptied (fx is the type by default)
-    promise: function( type, obj ) {
-      var tmp,
-          count = 1,
-          defer = jQuery.Deferred(),
-          elements = this,
-          i = this.length,
-          resolve = function() {
-            if ( !( --count ) ) {
-              defer.resolveWith( elements, [ elements ] );
-            }
-          };
-
-      if ( typeof type !== "string" ) {
-        obj = type;
-        type = undefined;
-      }
-      type = type || "fx";
-
-      while ( i-- ) {
-        tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
-        if ( tmp && tmp.empty ) {
-          count++;
-          tmp.empty.add( resolve );
-        }
-      }
-      resolve();
-      return defer.promise( obj );
-    }
-  } );
-  var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-  var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-  var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-  var isHiddenWithinTree = function( elem, el ) {
-
-    // isHiddenWithinTree might be called from jQuery#filter function;
-    // in that case, element will be second argument
-    elem = el || elem;
-
-    // Inline style trumps all
-    return elem.style.display === "none" ||
-        elem.style.display === "" &&
-
-        // Otherwise, check computed style
-        // Support: Firefox <=43 - 45
-        // Disconnected elements can have computed display: none, so first confirm that elem is
-        // in the document.
-        jQuery.contains( elem.ownerDocument, elem ) &&
-
-        jQuery.css( elem, "display" ) === "none";
-  };
-
-  var swap = function( elem, options, callback, args ) {
-    var ret, name,
-        old = {};
-
-    // Remember the old values, and insert the new ones
-    for ( name in options ) {
-      old[ name ] = elem.style[ name ];
-      elem.style[ name ] = options[ name ];
-    }
-
-    ret = callback.apply( elem, args || [] );
-
-    // Revert the old values
-    for ( name in options ) {
-      elem.style[ name ] = old[ name ];
-    }
-
-    return ret;
-  };
-
-
-
-
-  function adjustCSS( elem, prop, valueParts, tween ) {
-    var adjusted, scale,
-        maxIterations = 20,
-        currentValue = tween ?
-            function() {
-              return tween.cur();
-            } :
-            function() {
-              return jQuery.css( elem, prop, "" );
-            },
-        initial = currentValue(),
-        unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-        // Starting value computation is required for potential unit mismatches
-        initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
-            rcssNum.exec( jQuery.css( elem, prop ) );
-
-    if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
-      // Support: Firefox <=54
-      // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
-      initial = initial / 2;
-
-      // Trust units reported by jQuery.css
-      unit = unit || initialInUnit[ 3 ];
-
-      // Iteratively approximate from a nonzero starting point
-      initialInUnit = +initial || 1;
-
-      while ( maxIterations-- ) {
-
-        // Evaluate and update our best guess (doubling guesses that zero out).
-        // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
-        jQuery.style( elem, prop, initialInUnit + unit );
-        if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
-          maxIterations = 0;
-        }
-        initialInUnit = initialInUnit / scale;
-
-      }
-
-      initialInUnit = initialInUnit * 2;
-      jQuery.style( elem, prop, initialInUnit + unit );
-
-      // Make sure we update the tween properties later on
-      valueParts = valueParts || [];
-    }
-
-    if ( valueParts ) {
-      initialInUnit = +initialInUnit || +initial || 0;
-
-      // Apply relative offset (+=/-=) if specified
-      adjusted = valueParts[ 1 ] ?
-          initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
-          +valueParts[ 2 ];
-      if ( tween ) {
-        tween.unit = unit;
-        tween.start = initialInUnit;
-        tween.end = adjusted;
-      }
-    }
-    return adjusted;
-  }
-
-
-  var defaultDisplayMap = {};
-
-  function getDefaultDisplay( elem ) {
-    var temp,
-        doc = elem.ownerDocument,
-        nodeName = elem.nodeName,
-        display = defaultDisplayMap[ nodeName ];
-
-    if ( display ) {
-      return display;
-    }
-
-    temp = doc.body.appendChild( doc.createElement( nodeName ) );
-    display = jQuery.css( temp, "display" );
-
-    temp.parentNode.removeChild( temp );
-
-    if ( display === "none" ) {
-      display = "block";
-    }
-    defaultDisplayMap[ nodeName ] = display;
-
-    return display;
-  }
-
-  function showHide( elements, show ) {
-    var display, elem,
-        values = [],
-        index = 0,
-        length = elements.length;
-
-    // Determine new display value for elements that need to change
-    for ( ; index < length; index++ ) {
-      elem = elements[ index ];
-      if ( !elem.style ) {
-        continue;
-      }
-
-      display = elem.style.display;
-      if ( show ) {
-
-        // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
-        // check is required in this first loop unless we have a nonempty display value (either
-        // inline or about-to-be-restored)
-        if ( display === "none" ) {
-          values[ index ] = dataPriv.get( elem, "display" ) || null;
-          if ( !values[ index ] ) {
-            elem.style.display = "";
-          }
-        }
-        if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
-          values[ index ] = getDefaultDisplay( elem );
-        }
-      } else {
-        if ( display !== "none" ) {
-          values[ index ] = "none";
-
-          // Remember what we're overwriting
-          dataPriv.set( elem, "display", display );
-        }
-      }
-    }
-
-    // Set the display of the elements in a second loop to avoid constant reflow
-    for ( index = 0; index < length; index++ ) {
-      if ( values[ index ] != null ) {
-        elements[ index ].style.display = values[ index ];
-      }
-    }
-
-    return elements;
-  }
-
-  jQuery.fn.extend( {
-    show: function() {
-      return showHide( this, true );
-    },
-    hide: function() {
-      return showHide( this );
-    },
-    toggle: function( state ) {
-      if ( typeof state === "boolean" ) {
-        return state ? this.show() : this.hide();
-      }
-
-      return this.each( function() {
-        if ( isHiddenWithinTree( this ) ) {
-          jQuery( this ).show();
-        } else {
-          jQuery( this ).hide();
-        }
-      } );
-    }
-  } );
-  var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-  var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
-
-  var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
-
-
-
-// We have to close these tags to support XHTML (#13200)
-  var wrapMap = {
-
-    // Support: IE <=9 only
-    option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
-    // XHTML parsers do not magically insert elements in the
-    // same way that tag soup parsers do. So we cannot shorten
-    // this by omitting <tbody> or other required elements.
-    thead: [ 1, "<table>", "</table>" ],
-    col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
-    tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-    td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-    _default: [ 0, "", "" ]
-  };
-
-// Support: IE <=9 only
-  wrapMap.optgroup = wrapMap.option;
-
-  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-  wrapMap.th = wrapMap.td;
-
-
-  function getAll( context, tag ) {
-
-    // Support: IE <=9 - 11 only
-    // Use typeof to avoid zero-argument method invocation on host objects (#15151)
-    var ret;
-
-    if ( typeof context.getElementsByTagName !== "undefined" ) {
-      ret = context.getElementsByTagName( tag || "*" );
-
-    } else if ( typeof context.querySelectorAll !== "undefined" ) {
-      ret = context.querySelectorAll( tag || "*" );
-
-    } else {
-      ret = [];
-    }
-
-    if ( tag === undefined || tag && nodeName( context, tag ) ) {
-      return jQuery.merge( [ context ], ret );
-    }
-
-    return ret;
-  }
-
-
-// Mark scripts as having already been evaluated
-  function setGlobalEval( elems, refElements ) {
-    var i = 0,
-        l = elems.length;
-
-    for ( ; i < l; i++ ) {
-      dataPriv.set(
-          elems[ i ],
-          "globalEval",
-          !refElements || dataPriv.get( refElements[ i ], "globalEval" )
-      );
-    }
-  }
-
-
-  var rhtml = /<|&#?\w+;/;
-
-  function buildFragment( elems, context, scripts, selection, ignored ) {
-    var elem, tmp, tag, wrap, contains, j,
-        fragment = context.createDocumentFragment(),
-        nodes = [],
-        i = 0,
-        l = elems.length;
-
-    for ( ; i < l; i++ ) {
-      elem = elems[ i ];
-
-      if ( elem || elem === 0 ) {
-
-        // Add nodes directly
-        if ( toType( elem ) === "object" ) {
-
-          // Support: Android <=4.0 only, PhantomJS 1 only
-          // push.apply(_, arraylike) throws on ancient WebKit
-          jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-          // Convert non-html into a text node
-        } else if ( !rhtml.test( elem ) ) {
-          nodes.push( context.createTextNode( elem ) );
-
-          // Convert html into DOM nodes
-        } else {
-          tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
-          // Deserialize a standard representation
-          tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
-          wrap = wrapMap[ tag ] || wrapMap._default;
-          tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
-          // Descend through wrappers to the right content
-          j = wrap[ 0 ];
-          while ( j-- ) {
-            tmp = tmp.lastChild;
-          }
-
-          // Support: Android <=4.0 only, PhantomJS 1 only
-          // push.apply(_, arraylike) throws on ancient WebKit
-          jQuery.merge( nodes, tmp.childNodes );
-
-          // Remember the top-level container
-          tmp = fragment.firstChild;
-
-          // Ensure the created nodes are orphaned (#12392)
-          tmp.textContent = "";
-        }
-      }
-    }
-
-    // Remove wrapper from fragment
-    fragment.textContent = "";
-
-    i = 0;
-    while ( ( elem = nodes[ i++ ] ) ) {
-
-      // Skip elements already in the context collection (trac-4087)
-      if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
-        if ( ignored ) {
-          ignored.push( elem );
-        }
-        continue;
-      }
-
-      contains = jQuery.contains( elem.ownerDocument, elem );
-
-      // Append to fragment
-      tmp = getAll( fragment.appendChild( elem ), "script" );
-
-      // Preserve script evaluation history
-      if ( contains ) {
-        setGlobalEval( tmp );
-      }
-
-      // Capture executables
-      if ( scripts ) {
-        j = 0;
-        while ( ( elem = tmp[ j++ ] ) ) {
-          if ( rscriptType.test( elem.type || "" ) ) {
-            scripts.push( elem );
-          }
-        }
-      }
-    }
-
-    return fragment;
-  }
-
-
-  ( function() {
-    var fragment = document.createDocumentFragment(),
-        div = fragment.appendChild( document.createElement( "div" ) ),
-        input = document.createElement( "input" );
-
-    // Support: Android 4.0 - 4.3 only
-    // Check state lost if the name is set (#11217)
-    // Support: Windows Web Apps (WWA)
-    // `name` and `type` must use .setAttribute for WWA (#14901)
-    input.setAttribute( "type", "radio" );
-    input.setAttribute( "checked", "checked" );
-    input.setAttribute( "name", "t" );
-
-    div.appendChild( input );
-
-    // Support: Android <=4.1 only
-    // Older WebKit doesn't clone checked state correctly in fragments
-    support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-    // Support: IE <=11 only
-    // Make sure textarea (and checkbox) defaultValue is properly cloned
-    div.innerHTML = "<textarea>x</textarea>";
-    support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-  } )();
-  var documentElement = document.documentElement;
-
-
-
-  var
-      rkeyEvent = /^key/,
-      rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-      rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-  function returnTrue() {
-    return true;
-  }
-
-  function returnFalse() {
-    return false;
-  }
-
-// Support: IE <=9 only
-// See #13393 for more info
-  function safeActiveElement() {
-    try {
-      return document.activeElement;
-    } catch ( err ) { }
-  }
-
-  function on( elem, types, selector, data, fn, one ) {
-    var origFn, type;
-
-    // Types can be a map of types/handlers
-    if ( typeof types === "object" ) {
-
-      // ( types-Object, selector, data )
-      if ( typeof selector !== "string" ) {
-
-        // ( types-Object, data )
-        data = data || selector;
-        selector = undefined;
-      }
-      for ( type in types ) {
-        on( elem, type, selector, data, types[ type ], one );
-      }
-      return elem;
-    }
-
-    if ( data == null && fn == null ) {
-
-      // ( types, fn )
-      fn = selector;
-      data = selector = undefined;
-    } else if ( fn == null ) {
-      if ( typeof selector === "string" ) {
-
-        // ( types, selector, fn )
-        fn = data;
-        data = undefined;
-      } else {
-
-        // ( types, data, fn )
-        fn = data;
-        data = selector;
-        selector = undefined;
-      }
-    }
-    if ( fn === false ) {
-      fn = returnFalse;
-    } else if ( !fn ) {
-      return elem;
-    }
-
-    if ( one === 1 ) {
-      origFn = fn;
-      fn = function( event ) {
-
-        // Can use an empty set, since event contains the info
-        jQuery().off( event );
-        return origFn.apply( this, arguments );
-      };
-
-      // Use same guid so caller can remove using origFn
-      fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-    }
-    return elem.each( function() {
-      jQuery.event.add( this, types, fn, data, selector );
-    } );
-  }
-
-  /*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-  jQuery.event = {
-
-    global: {},
-
-    add: function( elem, types, handler, data, selector ) {
-
-      var handleObjIn, eventHandle, tmp,
-          events, t, handleObj,
-          special, handlers, type, namespaces, origType,
-          elemData = dataPriv.get( elem );
-
-      // Don't attach events to noData or text/comment nodes (but allow plain objects)
-      if ( !elemData ) {
-        return;
-      }
-
-      // Caller can pass in an object of custom data in lieu of the handler
-      if ( handler.handler ) {
-        handleObjIn = handler;
-        handler = handleObjIn.handler;
-        selector = handleObjIn.selector;
-      }
-
-      // Ensure that invalid selectors throw exceptions at attach time
-      // Evaluate against documentElement in case elem is a non-element node (e.g., document)
-      if ( selector ) {
-        jQuery.find.matchesSelector( documentElement, selector );
-      }
-
-      // Make sure that the handler has a unique ID, used to find/remove it later
-      if ( !handler.guid ) {
-        handler.guid = jQuery.guid++;
-      }
-
-      // Init the element's event structure and main handler, if this is the first
-      if ( !( events = elemData.events ) ) {
-        events = elemData.events = {};
-      }
-      if ( !( eventHandle = elemData.handle ) ) {
-        eventHandle = elemData.handle = function( e ) {
-
-          // Discard the second event of a jQuery.event.trigger() and
-          // when an event is called after a page has unloaded
-          return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
-              jQuery.event.dispatch.apply( elem, arguments ) : undefined;
-        };
-      }
-
-      // Handle multiple events separated by a space
-      types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
-      t = types.length;
-      while ( t-- ) {
-        tmp = rtypenamespace.exec( types[ t ] ) || [];
-        type = origType = tmp[ 1 ];
-        namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-        // There *must* be a type, no attaching namespace-only handlers
-        if ( !type ) {
-          continue;
-        }
-
-        // If event changes its type, use the special event handlers for the changed type
-        special = jQuery.event.special[ type ] || {};
-
-        // If selector defined, determine special event api type, otherwise given type
-        type = ( selector ? special.delegateType : special.bindType ) || type;
-
-        // Update special based on newly reset type
-        special = jQuery.event.special[ type ] || {};
-
-        // handleObj is passed to all event handlers
-        handleObj = jQuery.extend( {
-          type: type,
-          origType: origType,
-          data: data,
-          handler: handler,
-          guid: handler.guid,
-          selector: selector,
-          needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-          namespace: namespaces.join( "." )
-        }, handleObjIn );
-
-        // Init the event handler queue if we're the first
-        if ( !( handlers = events[ type ] ) ) {
-          handlers = events[ type ] = [];
-          handlers.delegateCount = 0;
-
-          // Only use addEventListener if the special events handler returns false
-          if ( !special.setup ||
-              special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
-            if ( elem.addEventListener ) {
-              elem.addEventListener( type, eventHandle );
-            }
-          }
-        }
-
-        if ( special.add ) {
-          special.add.call( elem, handleObj );
-
-          if ( !handleObj.handler.guid ) {
-            handleObj.handler.guid = handler.guid;
-          }
-        }
-
-        // Add to the element's handler list, delegates in front
-        if ( selector ) {
-          handlers.splice( handlers.delegateCount++, 0, handleObj );
-        } else {
-          handlers.push( handleObj );
-        }
-
-        // Keep track of which events have ever been used, for event optimization
-        jQuery.event.global[ type ] = true;
-      }
-
-    },
-
-    // Detach an event or set of events from an element
-    remove: function( elem, types, handler, selector, mappedTypes ) {
-
-      var j, origCount, tmp,
-          events, t, handleObj,
-          special, handlers, type, namespaces, origType,
-          elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
-      if ( !elemData || !( events = elemData.events ) ) {
-        return;
-      }
-
-      // Once for each type.namespace in types; type may be omitted
-      types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
-      t = types.length;
-      while ( t-- ) {
-        tmp = rtypenamespace.exec( types[ t ] ) || [];
-        type = origType = tmp[ 1 ];
-        namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-        // Unbind all events (on this namespace, if provided) for the element
-        if ( !type ) {
-          for ( type in events ) {
-            jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-          }
-          continue;
-        }
-
-        special = jQuery.event.special[ type ] || {};
-        type = ( selector ? special.delegateType : special.bindType ) || type;
-        handlers = events[ type ] || [];
-        tmp = tmp[ 2 ] &&
-            new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
-        // Remove matching events
-        origCount = j = handlers.length;
-        while ( j-- ) {
-          handleObj = handlers[ j ];
-
-          if ( ( mappedTypes || origType === handleObj.origType ) &&
-              ( !handler || handler.guid === handleObj.guid ) &&
-              ( !tmp || tmp.test( handleObj.namespace ) ) &&
-              ( !selector || selector === handleObj.selector ||
-                  selector === "**" && handleObj.selector ) ) {
-            handlers.splice( j, 1 );
-
-            if ( handleObj.selector ) {
-              handlers.delegateCount--;
-            }
-            if ( special.remove ) {
-              special.remove.call( elem, handleObj );
-            }
-          }
-        }
-
-        // Remove generic event handler if we removed something and no more handlers exist
-        // (avoids potential for endless recursion during removal of special event handlers)
-        if ( origCount && !handlers.length ) {
-          if ( !special.teardown ||
-              special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
-            jQuery.removeEvent( elem, type, elemData.handle );
-          }
-
-          delete events[ type ];
-        }
-      }
-
-      // Remove data and the expando if it's no longer used
-      if ( jQuery.isEmptyObject( events ) ) {
-        dataPriv.remove( elem, "handle events" );
-      }
-    },
-
-    dispatch: function( nativeEvent ) {
-
-      // Make a writable jQuery.Event from the native event object
-      var event = jQuery.event.fix( nativeEvent );
-
-      var i, j, ret, matched, handleObj, handlerQueue,
-          args = new Array( arguments.length ),
-          handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
-          special = jQuery.event.special[ event.type ] || {};
-
-      // Use the fix-ed jQuery.Event rather than the (read-only) native event
-      args[ 0 ] = event;
-
-      for ( i = 1; i < arguments.length; i++ ) {
-        args[ i ] = arguments[ i ];
-      }
-
-      event.delegateTarget = this;
-
-      // Call the preDispatch hook for the mapped type, and let it bail if desired
-      if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-        return;
-      }
-
-      // Determine handlers
-      handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-      // Run delegates first; they may want to stop propagation beneath us
-      i = 0;
-      while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
-        event.currentTarget = matched.elem;
-
-        j = 0;
-        while ( ( handleObj = matched.handlers[ j++ ] ) &&
-        !event.isImmediatePropagationStopped() ) {
-
-          // Triggered event must either 1) have no namespace, or 2) have namespace(s)
-          // a subset or equal to those in the bound event (both can have no namespace).
-          if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
-            event.handleObj = handleObj;
-            event.data = handleObj.data;
-
-            ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
-                handleObj.handler ).apply( matched.elem, args );
-
-            if ( ret !== undefined ) {
-              if ( ( event.result = ret ) === false ) {
-                event.preventDefault();
-                event.stopPropagation();
-              }
-            }
-          }
-        }
-      }
-
-      // Call the postDispatch hook for the mapped type
-      if ( special.postDispatch ) {
-        special.postDispatch.call( this, event );
-      }
-
-      return event.result;
-    },
-
-    handlers: function( event, handlers ) {
-      var i, handleObj, sel, matchedHandlers, matchedSelectors,
-          handlerQueue = [],
-          delegateCount = handlers.delegateCount,
-          cur = event.target;
-
-      // Find delegate handlers
-      if ( delegateCount &&
-
-          // Support: IE <=9
-          // Black-hole SVG <use> instance trees (trac-13180)
-          cur.nodeType &&
-
-          // Support: Firefox <=42
-          // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
-          // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
-          // Support: IE 11 only
-          // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
-          !( event.type === "click" && event.button >= 1 ) ) {
-
-        for ( ; cur !== this; cur = cur.parentNode || this ) {
-
-          // Don't check non-elements (#13208)
-          // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-          if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
-            matchedHandlers = [];
-            matchedSelectors = {};
-            for ( i = 0; i < delegateCount; i++ ) {
-              handleObj = handlers[ i ];
-
-              // Don't conflict with Object.prototype properties (#13203)
-              sel = handleObj.selector + " ";
-
-              if ( matchedSelectors[ sel ] === undefined ) {
-                matchedSelectors[ sel ] = handleObj.needsContext ?
-                    jQuery( sel, this ).index( cur ) > -1 :
-                    jQuery.find( sel, this, null, [ cur ] ).length;
-              }
-              if ( matchedSelectors[ sel ] ) {
-                matchedHandlers.push( handleObj );
-              }
-            }
-            if ( matchedHandlers.length ) {
-              handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
-            }
-          }
-        }
-      }
-
-      // Add the remaining (directly-bound) handlers
-      cur = this;
-      if ( delegateCount < handlers.length ) {
-        handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
-      }
-
-      return handlerQueue;
-    },
-
-    addProp: function( name, hook ) {
-      Object.defineProperty( jQuery.Event.prototype, name, {
-        enumerable: true,
-        configurable: true,
-
-        get: isFunction( hook ) ?
-            function() {
-              if ( this.originalEvent ) {
-                return hook( this.originalEvent );
-              }
-            } :
-            function() {
-              if ( this.originalEvent ) {
-                return this.originalEvent[ name ];
-              }
-            },
-
-        set: function( value ) {
-          Object.defineProperty( this, name, {
-            enumerable: true,
-            configurable: true,
-            writable: true,
-            value: value
-          } );
-        }
-      } );
-    },
-
-    fix: function( originalEvent ) {
-      return originalEvent[ jQuery.expando ] ?
-          originalEvent :
-          new jQuery.Event( originalEvent );
-    },
-
-    special: {
-      load: {
-
-        // Prevent triggered image.load events from bubbling to window.load
-        noBubble: true
-      },
-      focus: {
-
-        // Fire native event if possible so blur/focus sequence is correct
-        trigger: function() {
-          if ( this !== safeActiveElement() && this.focus ) {
-            this.focus();
-            return false;
-          }
-        },
-        delegateType: "focusin"
-      },
-      blur: {
-        trigger: function() {
-          if ( this === safeActiveElement() && this.blur ) {
-            this.blur();
-            return false;
-          }
-        },
-        delegateType: "focusout"
-      },
-      click: {
-
-        // For checkbox, fire native event so checked state will be right
-        trigger: function() {
-          if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
-            this.click();
-            return false;
-          }
-        },
-
-        // For cross-browser consistency, don't fire native .click() on links
-        _default: function( event ) {
-          return nodeName( event.target, "a" );
-        }
-      },
-
-      beforeunload: {
-        postDispatch: function( event ) {
-
-          // Support: Firefox 20+
-          // Firefox doesn't alert if the returnValue field is not set.
-          if ( event.result !== undefined && event.originalEvent ) {
-            event.originalEvent.returnValue = event.result;
-          }
-        }
-      }
-    }
-  };
-
-  jQuery.removeEvent = function( elem, type, handle ) {
-
-    // This "if" is needed for plain objects
-    if ( elem.removeEventListener ) {
-      elem.removeEventListener( type, handle );
-    }
-  };
-
-  jQuery.Event = function( src, props ) {
-
-    // Allow instantiation without the 'new' keyword
-    if ( !( this instanceof jQuery.Event ) ) {
-      return new jQuery.Event( src, props );
-    }
-
-    // Event object
-    if ( src && src.type ) {
-      this.originalEvent = src;
-      this.type = src.type;
-
-      // Events bubbling up the document may have been marked as prevented
-      // by a handler lower down the tree; reflect the correct value.
-      this.isDefaultPrevented = src.defaultPrevented ||
-      src.defaultPrevented === undefined &&
-
-      // Support: Android <=2.3 only
-      src.returnValue === false ?
-          returnTrue :
-          returnFalse;
-
-      // Create target properties
-      // Support: Safari <=6 - 7 only
-      // Target should not be a text node (#504, #13143)
-      this.target = ( src.target && src.target.nodeType === 3 ) ?
-          src.target.parentNode :
-          src.target;
-
-      this.currentTarget = src.currentTarget;
-      this.relatedTarget = src.relatedTarget;
-
-      // Event type
-    } else {
-      this.type = src;
-    }
-
-    // Put explicitly provided properties onto the event object
-    if ( props ) {
-      jQuery.extend( this, props );
-    }
-
-    // Create a timestamp if incoming event doesn't have one
-    this.timeStamp = src && src.timeStamp || Date.now();
-
-    // Mark it as fixed
-    this[ jQuery.expando ] = true;
-  };
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-  jQuery.Event.prototype = {
-    constructor: jQuery.Event,
-    isDefaultPrevented: returnFalse,
-    isPropagationStopped: returnFalse,
-    isImmediatePropagationStopped: returnFalse,
-    isSimulated: false,
-
-    preventDefault: function() {
-      var e = this.originalEvent;
-
-      this.isDefaultPrevented = returnTrue;
-
-      if ( e && !this.isSimulated ) {
-        e.preventDefault();
-      }
-    },
-    stopPropagation: function() {
-      var e = this.originalEvent;
-
-      this.isPropagationStopped = returnTrue;
-
-      if ( e && !this.isSimulated ) {
-        e.stopPropagation();
-      }
-    },
-    stopImmediatePropagation: function() {
-      var e = this.originalEvent;
-
-      this.isImmediatePropagationStopped = returnTrue;
-
-      if ( e && !this.isSimulated ) {
-        e.stopImmediatePropagation();
-      }
-
-      this.stopPropagation();
-    }
-  };
-
-// Includes all common event props including KeyEvent and MouseEvent specific props
-  jQuery.each( {
-    altKey: true,
-    bubbles: true,
-    cancelable: true,
-    changedTouches: true,
-    ctrlKey: true,
-    detail: true,
-    eventPhase: true,
-    metaKey: true,
-    pageX: true,
-    pageY: true,
-    shiftKey: true,
-    view: true,
-    "char": true,
-    charCode: true,
-    key: true,
-    keyCode: true,
-    button: true,
-    buttons: true,
-    clientX: true,
-    clientY: true,
-    offsetX: true,
-    offsetY: true,
-    pointerId: true,
-    pointerType: true,
-    screenX: true,
-    screenY: true,
-    targetTouches: true,
-    toElement: true,
-    touches: true,
-
-    which: function( event ) {
-      var button = event.button;
-
-      // Add which for key events
-      if ( event.which == null && rkeyEvent.test( event.type ) ) {
-        return event.charCode != null ? event.charCode : event.keyCode;
-      }
-
-      // Add which for click: 1 === left; 2 === middle; 3 === right
-      if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
-        if ( button & 1 ) {
-          return 1;
-        }
-
-        if ( button & 2 ) {
-          return 3;
-        }
-
-        if ( button & 4 ) {
-          return 2;
-        }
-
-        return 0;
-      }
-
-      return event.which;
-    }
-  }, jQuery.event.addProp );
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-  jQuery.each( {
-    mouseenter: "mouseover",
-    mouseleave: "mouseout",
-    pointerenter: "pointerover",
-    pointerleave: "pointerout"
-  }, function( orig, fix ) {
-    jQuery.event.special[ orig ] = {
-      delegateType: fix,
-      bindType: fix,
-
-      handle: function( event ) {
-        var ret,
-            target = this,
-            related = event.relatedTarget,
-            handleObj = event.handleObj;
-
-        // For mouseenter/leave call the handler if related is outside the target.
-        // NB: No relatedTarget if the mouse left/entered the browser window
-        if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
-          event.type = handleObj.origType;
-          ret = handleObj.handler.apply( this, arguments );
-          event.type = fix;
-        }
-        return ret;
-      }
-    };
-  } );
-
-  jQuery.fn.extend( {
-
-    on: function( types, selector, data, fn ) {
-      return on( this, types, selector, data, fn );
-    },
-    one: function( types, selector, data, fn ) {
-      return on( this, types, selector, data, fn, 1 );
-    },
-    off: function( types, selector, fn ) {
-      var handleObj, type;
-      if ( types && types.preventDefault && types.handleObj ) {
-
-        // ( event )  dispatched jQuery.Event
-        handleObj = types.handleObj;
-        jQuery( types.delegateTarget ).off(
-            handleObj.namespace ?
-                handleObj.origType + "." + handleObj.namespace :
-                handleObj.origType,
-            handleObj.selector,
-            handleObj.handler
-        );
-        return this;
-      }
-      if ( typeof types === "object" ) {
-
-        // ( types-object [, selector] )
-        for ( type in types ) {
-          this.off( type, selector, types[ type ] );
-        }
-        return this;
-      }
-      if ( selector === false || typeof selector === "function" ) {
-
-        // ( types [, fn] )
-        fn = selector;
-        selector = undefined;
-      }
-      if ( fn === false ) {
-        fn = returnFalse;
-      }
-      return this.each( function() {
-        jQuery.event.remove( this, types, fn, selector );
-      } );
-    }
-  } );
-
-
-  var
-
-      /* eslint-disable max-len */
-
-      // See https://github.com/eslint/eslint/issues/3229
-      rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-
-      /* eslint-enable */
-
-      // Support: IE <=10 - 11, Edge 12 - 13 only
-      // In IE/Edge using regex groups here causes severe slowdowns.
-      // See https://connect.microsoft.com/IE/feedback/details/1736512/
-      rnoInnerhtml = /<script|<style|<link/i,
-
-      // checked="checked" or checked
-      rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-      rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Prefer a tbody over its parent table for containing new rows
-  function manipulationTarget( elem, content ) {
-    if ( nodeName( elem, "table" ) &&
-        nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
-
-      return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
-    }
-
-    return elem;
-  }
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-  function disableScript( elem ) {
-    elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
-    return elem;
-  }
-  function restoreScript( elem ) {
-    if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
-      elem.type = elem.type.slice( 5 );
-    } else {
-      elem.removeAttribute( "type" );
-    }
-
-    return elem;
-  }
-
-  function cloneCopyEvent( src, dest ) {
-    var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
-    if ( dest.nodeType !== 1 ) {
-      return;
-    }
-
-    // 1. Copy private data: events, handlers, etc.
-    if ( dataPriv.hasData( src ) ) {
-      pdataOld = dataPriv.access( src );
-      pdataCur = dataPriv.set( dest, pdataOld );
-      events = pdataOld.events;
-
-      if ( events ) {
-        delete pdataCur.handle;
-        pdataCur.events = {};
-
-        for ( type in events ) {
-          for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-            jQuery.event.add( dest, type, events[ type ][ i ] );
-          }
-        }
-      }
-    }
-
-    // 2. Copy user data
-    if ( dataUser.hasData( src ) ) {
-      udataOld = dataUser.access( src );
-      udataCur = jQuery.extend( {}, udataOld );
-
-      dataUser.set( dest, udataCur );
-    }
-  }
-
-// Fix IE bugs, see support tests
-  function fixInput( src, dest ) {
-    var nodeName = dest.nodeName.toLowerCase();
-
-    // Fails to persist the checked state of a cloned checkbox or radio button.
-    if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-      dest.checked = src.checked;
-
-      // Fails to return the selected option to the default selected state when cloning options
-    } else if ( nodeName === "input" || nodeName === "textarea" ) {
-      dest.defaultValue = src.defaultValue;
-    }
-  }
-
-  function domManip( collection, args, callback, ignored ) {
-
-    // Flatten any nested arrays
-    args = concat.apply( [], args );
-
-    var fragment, first, scripts, hasScripts, node, doc,
-        i = 0,
-        l = collection.length,
-        iNoClone = l - 1,
-        value = args[ 0 ],
-        valueIsFunction = isFunction( value );
-
-    // We can't cloneNode fragments that contain checked, in WebKit
-    if ( valueIsFunction ||
-        ( l > 1 && typeof value === "string" &&
-            !support.checkClone && rchecked.test( value ) ) ) {
-      return collection.each( function( index ) {
-        var self = collection.eq( index );
-        if ( valueIsFunction ) {
-          args[ 0 ] = value.call( this, index, self.html() );
-        }
-        domManip( self, args, callback, ignored );
-      } );
-    }
-
-    if ( l ) {
-      fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
-      first = fragment.firstChild;
-
-      if ( fragment.childNodes.length === 1 ) {
-        fragment = first;
-      }
-
-      // Require either new content or an interest in ignored elements to invoke the callback
-      if ( first || ignored ) {
-        scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-        hasScripts = scripts.length;
-
-        // Use the original fragment for the last item
-        // instead of the first because it can end up
-        // being emptied incorrectly in certain situations (#8070).
-        for ( ; i < l; i++ ) {
-          node = fragment;
-
-          if ( i !== iNoClone ) {
-            node = jQuery.clone( node, true, true );
-
-            // Keep references to cloned scripts for later restoration
-            if ( hasScripts ) {
-
-              // Support: Android <=4.0 only, PhantomJS 1 only
-              // push.apply(_, arraylike) throws on ancient WebKit
-              jQuery.merge( scripts, getAll( node, "script" ) );
-            }
-          }
-
-          callback.call( collection[ i ], node, i );
-        }
-
-        if ( hasScripts ) {
-          doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-          // Reenable scripts
-          jQuery.map( scripts, restoreScript );
-
-          // Evaluate executable scripts on first document insertion
-          for ( i = 0; i < hasScripts; i++ ) {
-            node = scripts[ i ];
-            if ( rscriptType.test( node.type || "" ) &&
-                !dataPriv.access( node, "globalEval" ) &&
-                jQuery.contains( doc, node ) ) {
-
-              if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
-
-                // Optional AJAX dependency, but won't run scripts if not present
-                if ( jQuery._evalUrl ) {
-                  jQuery._evalUrl( node.src );
-                }
-              } else {
-                DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
-              }
-            }
-          }
-        }
-      }
-    }
-
-    return collection;
-  }
-
-  function remove( elem, selector, keepData ) {
-    var node,
-        nodes = selector ? jQuery.filter( selector, elem ) : elem,
-        i = 0;
-
-    for ( ; ( node = nodes[ i ] ) != null; i++ ) {
-      if ( !keepData && node.nodeType === 1 ) {
-        jQuery.cleanData( getAll( node ) );
-      }
-
-      if ( node.parentNode ) {
-        if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
-          setGlobalEval( getAll( node, "script" ) );
-        }
-        node.parentNode.removeChild( node );
-      }
-    }
-
-    return elem;
-  }
-
-  jQuery.extend( {
-    htmlPrefilter: function( html ) {
-      return html.replace( rxhtmlTag, "<$1></$2>" );
-    },
-
-    clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-      var i, l, srcElements, destElements,
-          clone = elem.cloneNode( true ),
-          inPage = jQuery.contains( elem.ownerDocument, elem );
-
-      // Fix IE cloning issues
-      if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
-          !jQuery.isXMLDoc( elem ) ) {
-
-        // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
-        destElements = getAll( clone );
-        srcElements = getAll( elem );
-
-        for ( i = 0, l = srcElements.length; i < l; i++ ) {
-          fixInput( srcElements[ i ], destElements[ i ] );
-        }
-      }
-
-      // Copy the events from the original to the clone
-      if ( dataAndEvents ) {
-        if ( deepDataAndEvents ) {
-          srcElements = srcElements || getAll( elem );
-          destElements = destElements || getAll( clone );
-
-          for ( i = 0, l = srcElements.length; i < l; i++ ) {
-            cloneCopyEvent( srcElements[ i ], destElements[ i ] );
-          }
-        } else {
-          cloneCopyEvent( elem, clone );
-        }
-      }
-
-      // Preserve script evaluation history
-      destElements = getAll( clone, "script" );
-      if ( destElements.length > 0 ) {
-        setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-      }
-
-      // Return the cloned set
-      return clone;
-    },
-
-    cleanData: function( elems ) {
-      var data, elem, type,
-          special = jQuery.event.special,
-          i = 0;
-
-      for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
-        if ( acceptData( elem ) ) {
-          if ( ( data = elem[ dataPriv.expando ] ) ) {
-            if ( data.events ) {
-              for ( type in data.events ) {
-                if ( special[ type ] ) {
-                  jQuery.event.remove( elem, type );
-
-                  // This is a shortcut to avoid jQuery.event.remove's overhead
-                } else {
-                  jQuery.removeEvent( elem, type, data.handle );
-                }
-              }
-            }
-
-            // Support: Chrome <=35 - 45+
-            // Assign undefined instead of using delete, see Data#remove
-            elem[ dataPriv.expando ] = undefined;
-          }
-          if ( elem[ dataUser.expando ] ) {
-
-            // Support: Chrome <=35 - 45+
-            // Assign undefined instead of using delete, see Data#remove
-            elem[ dataUser.expando ] = undefined;
-          }
-        }
-      }
-    }
-  } );
-
-  jQuery.fn.extend( {
-    detach: function( selector ) {
-      return remove( this, selector, true );
-    },
-
-    remove: function( selector ) {
-      return remove( this, selector );
-    },
-
-    text: function( value ) {
-      return access( this, function( value ) {
-        return value === undefined ?
-            jQuery.text( this ) :
-            this.empty().each( function() {
-              if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-                this.textContent = value;
-              }
-            } );
-      }, null, value, arguments.length );
-    },
-
-    append: function() {
-      return domManip( this, arguments, function( elem ) {
-        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-          var target = manipulationTarget( this, elem );
-          target.appendChild( elem );
-        }
-      } );
-    },
-
-    prepend: function() {
-      return domManip( this, arguments, function( elem ) {
-        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-          var target = manipulationTarget( this, elem );
-          target.insertBefore( elem, target.firstChild );
-        }
-      } );
-    },
-
-    before: function() {
-      return domManip( this, arguments, function( elem ) {
-        if ( this.parentNode ) {
-          this.parentNode.insertBefore( elem, this );
-        }
-      } );
-    },
-
-    after: function() {
-      return domManip( this, arguments, function( elem ) {
-        if ( this.parentNode ) {
-          this.parentNode.insertBefore( elem, this.nextSibling );
-        }
-      } );
-    },
-
-    empty: function() {
-      var elem,
-          i = 0;
-
-      for ( ; ( elem = this[ i ] ) != null; i++ ) {
-        if ( elem.nodeType === 1 ) {
-
-          // Prevent memory leaks
-          jQuery.cleanData( getAll( elem, false ) );
-
-          // Remove any remaining nodes
-          elem.textContent = "";
-        }
-      }
-
-      return this;
-    },
-
-    clone: function( dataAndEvents, deepDataAndEvents ) {
-      dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-      deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-      return this.map( function() {
-        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-      } );
-    },
-
-    html: function( value ) {
-      return access( this, function( value ) {
-        var elem = this[ 0 ] || {},
-            i = 0,
-            l = this.length;
-
-        if ( value === undefined && elem.nodeType === 1 ) {
-          return elem.innerHTML;
-        }
-
-        // See if we can take a shortcut and just use innerHTML
-        if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-            !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
-          value = jQuery.htmlPrefilter( value );
-
-          try {
-            for ( ; i < l; i++ ) {
-              elem = this[ i ] || {};
-
-              // Remove element nodes and prevent memory leaks
-              if ( elem.nodeType === 1 ) {
-                jQuery.cleanData( getAll( elem, false ) );
-                elem.innerHTML = value;
-              }
-            }
-
-            elem = 0;
-
-            // If using innerHTML throws an exception, use the fallback method
-          } catch ( e ) {}
-        }
-
-        if ( elem ) {
-          this.empty().append( value );
-        }
-      }, null, value, arguments.length );
-    },
-
-    replaceWith: function() {
-      var ignored = [];
-
-      // Make the changes, replacing each non-ignored context element with the new content
-      return domManip( this, arguments, function( elem ) {
-        var parent = this.parentNode;
-
-        if ( jQuery.inArray( this, ignored ) < 0 ) {
-          jQuery.cleanData( getAll( this ) );
-          if ( parent ) {
-            parent.replaceChild( elem, this );
-          }
-        }
-
-        // Force callback invocation
-      }, ignored );
-    }
-  } );
-
-  jQuery.each( {
-    appendTo: "append",
-    prependTo: "prepend",
-    insertBefore: "before",
-    insertAfter: "after",
-    replaceAll: "replaceWith"
-  }, function( name, original ) {
-    jQuery.fn[ name ] = function( selector ) {
-      var elems,
-          ret = [],
-          insert = jQuery( selector ),
-          last = insert.length - 1,
-          i = 0;
-
-      for ( ; i <= last; i++ ) {
-        elems = i === last ? this : this.clone( true );
-        jQuery( insert[ i ] )[ original ]( elems );
-
-        // Support: Android <=4.0 only, PhantomJS 1 only
-        // .get() because push.apply(_, arraylike) throws on ancient WebKit
-        push.apply( ret, elems.get() );
-      }
-
-      return this.pushStack( ret );
-    };
-  } );
-  var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-  var getStyles = function( elem ) {
-
-    // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
-    // IE throws on elements created in popups
-    // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
-    var view = elem.ownerDocument.defaultView;
-
-    if ( !view || !view.opener ) {
-      view = window;
-    }
-
-    return view.getComputedStyle( elem );
-  };
-
-  var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
-
-
-
-  ( function() {
-
-    // Executing both pixelPosition & boxSizingReliable tests require only one layout
-    // so they're executed at the same time to save the second computation.
-    function computeStyleTests() {
-
-      // This is a singleton, we need to execute it only once
-      if ( !div ) {
-        return;
-      }
-
-      container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
-          "margin-top:1px;padding:0;border:0";
-      div.style.cssText =
-          "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
-          "margin:auto;border:1px;padding:1px;" +
-          "width:60%;top:1%";
-      documentElement.appendChild( container ).appendChild( div );
-
-      var divStyle = window.getComputedStyle( div );
-      pixelPositionVal = divStyle.top !== "1%";
-
-      // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
-      reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
-
-      // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
-      // Some styles come back with percentage values, even though they shouldn't
-      div.style.right = "60%";
-      pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
-
-      // Support: IE 9 - 11 only
-      // Detect misreporting of content dimensions for box-sizing:border-box elements
-      boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
-
-      // Support: IE 9 only
-      // Detect overflow:scroll screwiness (gh-3699)
-      div.style.position = "absolute";
-      scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
-
-      documentElement.removeChild( container );
-
-      // Nullify the div so it wouldn't be stored in the memory and
-      // it will also be a sign that checks already performed
-      div = null;
-    }
-
-    function roundPixelMeasures( measure ) {
-      return Math.round( parseFloat( measure ) );
-    }
-
-    var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
-        reliableMarginLeftVal,
-        container = document.createElement( "div" ),
-        div = document.createElement( "div" );
-
-    // Finish early in limited (non-browser) environments
-    if ( !div.style ) {
-      return;
-    }
-
-    // Support: IE <=9 - 11 only
-    // Style of cloned element affects source element cloned (#8908)
-    div.style.backgroundClip = "content-box";
-    div.cloneNode( true ).style.backgroundClip = "";
-    support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-    jQuery.extend( support, {
-      boxSizingReliable: function() {
-        computeStyleTests();
-        return boxSizingReliableVal;
-      },
-      pixelBoxStyles: function() {
-        computeStyleTests();
-        return pixelBoxStylesVal;
-      },
-      pixelPosition: function() {
-        computeStyleTests();
-        return pixelPositionVal;
-      },
-      reliableMarginLeft: function() {
-        computeStyleTests();
-        return reliableMarginLeftVal;
-      },
-      scrollboxSize: function() {
-        computeStyleTests();
-        return scrollboxSizeVal;
-      }
-    } );
-  } )();
-
-
-  function curCSS( elem, name, computed ) {
-    var width, minWidth, maxWidth, ret,
-
-        // Support: Firefox 51+
-        // Retrieving style before computed somehow
-        // fixes an issue with getting wrong values
-        // on detached elements
-        style = elem.style;
-
-    computed = computed || getStyles( elem );
-
-    // getPropertyValue is needed for:
-    //   .css('filter') (IE 9 only, #12537)
-    //   .css('--customProperty) (#3144)
-    if ( computed ) {
-      ret = computed.getPropertyValue( name ) || computed[ name ];
-
-      if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-        ret = jQuery.style( elem, name );
-      }
-
-      // A tribute to the "awesome hack by Dean Edwards"
-      // Android Browser returns percentage for some values,
-      // but width seems to be reliably pixels.
-      // This is against the CSSOM draft spec:
-      // https://drafts.csswg.org/cssom/#resolved-values
-      if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
-
-        // Remember the original values
-        width = style.width;
-        minWidth = style.minWidth;
-        maxWidth = style.maxWidth;
-
-        // Put in the new values to get a computed value out
-        style.minWidth = style.maxWidth = style.width = ret;
-        ret = computed.width;
-
-        // Revert the changed values
-        style.width = width;
-        style.minWidth = minWidth;
-        style.maxWidth = maxWidth;
-      }
-    }
-
-    return ret !== undefined ?
-
-        // Support: IE <=9 - 11 only
-        // IE returns zIndex value as an integer.
-        ret + "" :
-        ret;
-  }
-
-
-  function addGetHookIf( conditionFn, hookFn ) {
-
-    // Define the hook, we'll check on the first run if it's really needed.
-    return {
-      get: function() {
-        if ( conditionFn() ) {
-
-          // Hook not needed (or it's not possible to use it due
-          // to missing dependency), remove it.
-          delete this.get;
-          return;
-        }
-
-        // Hook needed; redefine it so that the support test is not executed again.
-        return ( this.get = hookFn ).apply( this, arguments );
-      }
-    };
-  }
-
-
-  var
-
-      // Swappable if display is none or starts with table
-      // except "table", "table-cell", or "table-caption"
-      // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-      rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-      rcustomProp = /^--/,
-      cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-      cssNormalTransform = {
-        letterSpacing: "0",
-        fontWeight: "400"
-      },
-
-      cssPrefixes = [ "Webkit", "Moz", "ms" ],
-      emptyStyle = document.createElement( "div" ).style;
-
-// Return a css property mapped to a potentially vendor prefixed property
-  function vendorPropName( name ) {
-
-    // Shortcut for names that are not vendor prefixed
-    if ( name in emptyStyle ) {
-      return name;
-    }
-
-    // Check for vendor prefixed names
-    var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
-        i = cssPrefixes.length;
-
-    while ( i-- ) {
-      name = cssPrefixes[ i ] + capName;
-      if ( name in emptyStyle ) {
-        return name;
-      }
-    }
-  }
-
-// Return a property mapped along what jQuery.cssProps suggests or to
-// a vendor prefixed property.
-  function finalPropName( name ) {
-    var ret = jQuery.cssProps[ name ];
-    if ( !ret ) {
-      ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
-    }
-    return ret;
-  }
-
-  function setPositiveNumber( elem, value, subtract ) {
-
-    // Any relative (+/-) values have already been
-    // normalized at this point
-    var matches = rcssNum.exec( value );
-    return matches ?
-
-        // Guard against undefined "subtract", e.g., when used as in cssHooks
-        Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
-        value;
-  }
-
-  function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
-    var i = dimension === "width" ? 1 : 0,
-        extra = 0,
-        delta = 0;
-
-    // Adjustment may not be necessary
-    if ( box === ( isBorderBox ? "border" : "content" ) ) {
-      return 0;
-    }
-
-    for ( ; i < 4; i += 2 ) {
-
-      // Both box models exclude margin
-      if ( box === "margin" ) {
-        delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
-      }
-
-      // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
-      if ( !isBorderBox ) {
-
-        // Add padding
-        delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-        // For "border" or "margin", add border
-        if ( box !== "padding" ) {
-          delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-
-          // But still keep track of it otherwise
-        } else {
-          extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-        }
-
-        // If we get here with a border-box (content + padding + border), we're seeking "content" or
-        // "padding" or "margin"
-      } else {
-
-        // For "content", subtract padding
-        if ( box === "content" ) {
-          delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-        }
-
-        // For "content" or "padding", subtract border
-        if ( box !== "margin" ) {
-          delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-        }
-      }
-    }
-
-    // Account for positive content-box scroll gutter when requested by providing computedVal
-    if ( !isBorderBox && computedVal >= 0 ) {
-
-      // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
-      // Assuming integer scroll gutter, subtract the rest and round down
-      delta += Math.max( 0, Math.ceil(
-          elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
-          computedVal -
-          delta -
-          extra -
-          0.5
-      ) );
-    }
-
-    return delta;
-  }
-
-  function getWidthOrHeight( elem, dimension, extra ) {
-
-    // Start with computed style
-    var styles = getStyles( elem ),
-        val = curCSS( elem, dimension, styles ),
-        isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-        valueIsBorderBox = isBorderBox;
-
-    // Support: Firefox <=54
-    // Return a confounding non-pixel value or feign ignorance, as appropriate.
-    if ( rnumnonpx.test( val ) ) {
-      if ( !extra ) {
-        return val;
-      }
-      val = "auto";
-    }
-
-    // Check for style in case a browser which returns unreliable values
-    // for getComputedStyle silently falls back to the reliable elem.style
-    valueIsBorderBox = valueIsBorderBox &&
-        ( support.boxSizingReliable() || val === elem.style[ dimension ] );
-
-    // Fall back to offsetWidth/offsetHeight when value is "auto"
-    // This happens for inline elements with no explicit setting (gh-3571)
-    // Support: Android <=4.1 - 4.3 only
-    // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
-    if ( val === "auto" ||
-        !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
-
-      val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
-
-      // offsetWidth/offsetHeight provide border-box values
-      valueIsBorderBox = true;
-    }
-
-    // Normalize "" and auto
-    val = parseFloat( val ) || 0;
-
-    // Adjust for the element's box model
-    return ( val +
-        boxModelAdjustment(
-            elem,
-            dimension,
-            extra || ( isBorderBox ? "border" : "content" ),
-            valueIsBorderBox,
-            styles,
-
-            // Provide the current computed size to request scroll gutter calculation (gh-3589)
-            val
-        )
-    ) + "px";
-  }
-
-  jQuery.extend( {
-
-    // Add in style property hooks for overriding the default
-    // behavior of getting and setting a style property
-    cssHooks: {
-      opacity: {
-        get: function( elem, computed ) {
-          if ( computed ) {
-
-            // We should always get a number back from opacity
-            var ret = curCSS( elem, "opacity" );
-            return ret === "" ? "1" : ret;
-          }
-        }
-      }
-    },
-
-    // Don't automatically add "px" to these possibly-unitless properties
-    cssNumber: {
-      "animationIterationCount": true,
-      "columnCount": true,
-      "fillOpacity": true,
-      "flexGrow": true,
-      "flexShrink": true,
-      "fontWeight": true,
-      "lineHeight": true,
-      "opacity": true,
-      "order": true,
-      "orphans": true,
-      "widows": true,
-      "zIndex": true,
-      "zoom": true
-    },
-
-    // Add in properties whose names you wish to fix before
-    // setting or getting the value
-    cssProps: {},
-
-    // Get and set the style property on a DOM Node
-    style: function( elem, name, value, extra ) {
-
-      // Don't set styles on text and comment nodes
-      if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-        return;
-      }
-
-      // Make sure that we're working with the right name
-      var ret, type, hooks,
-          origName = camelCase( name ),
-          isCustomProp = rcustomProp.test( name ),
-          style = elem.style;
-
-      // Make sure that we're working with the right name. We don't
-      // want to query the value if it is a CSS custom property
-      // since they are user-defined.
-      if ( !isCustomProp ) {
-        name = finalPropName( origName );
-      }
-
-      // Gets hook for the prefixed version, then unprefixed version
-      hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-      // Check if we're setting a value
-      if ( value !== undefined ) {
-        type = typeof value;
-
-        // Convert "+=" or "-=" to relative numbers (#7345)
-        if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
-          value = adjustCSS( elem, name, ret );
-
-          // Fixes bug #9237
-          type = "number";
-        }
-
-        // Make sure that null and NaN values aren't set (#7116)
-        if ( value == null || value !== value ) {
-          return;
-        }
-
-        // If a number was passed in, add the unit (except for certain CSS properties)
-        if ( type === "number" ) {
-          value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
-        }
-
-        // background-* props affect original clone's values
-        if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
-          style[ name ] = "inherit";
-        }
-
-        // If a hook was provided, use that value, otherwise just set the specified value
-        if ( !hooks || !( "set" in hooks ) ||
-            ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
-          if ( isCustomProp ) {
-            style.setProperty( name, value );
-          } else {
-            style[ name ] = value;
-          }
-        }
-
-      } else {
-
-        // If a hook was provided get the non-computed value from there
-        if ( hooks && "get" in hooks &&
-            ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
-          return ret;
-        }
-
-        // Otherwise just get the value from the style object
-        return style[ name ];
-      }
-    },
-
-    css: function( elem, name, extra, styles ) {
-      var val, num, hooks,
-          origName = camelCase( name ),
-          isCustomProp = rcustomProp.test( name );
-
-      // Make sure that we're working with the right name. We don't
-      // want to modify the value if it is a CSS custom property
-      // since they are user-defined.
-      if ( !isCustomProp ) {
-        name = finalPropName( origName );
-      }
-
-      // Try prefixed name followed by the unprefixed name
-      hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-      // If a hook was provided get the computed value from there
-      if ( hooks && "get" in hooks ) {
-        val = hooks.get( elem, true, extra );
-      }
-
-      // Otherwise, if a way to get the computed value exists, use that
-      if ( val === undefined ) {
-        val = curCSS( elem, name, styles );
-      }
-
-      // Convert "normal" to computed value
-      if ( val === "normal" && name in cssNormalTransform ) {
-        val = cssNormalTransform[ name ];
-      }
-
-      // Make numeric if forced or a qualifier was provided and val looks numeric
-      if ( extra === "" || extra ) {
-        num = parseFloat( val );
-        return extra === true || isFinite( num ) ? num || 0 : val;
-      }
-
-      return val;
-    }
-  } );
-
-  jQuery.each( [ "height", "width" ], function( i, dimension ) {
-    jQuery.cssHooks[ dimension ] = {
-      get: function( elem, computed, extra ) {
-        if ( computed ) {
-
-          // Certain elements can have dimension info if we invisibly show them
-          // but it must have a current display style that would benefit
-          return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-
-          // Support: Safari 8+
-          // Table columns in Safari have non-zero offsetWidth & zero
-          // getBoundingClientRect().width unless display is changed.
-          // Support: IE <=11 only
-          // Running getBoundingClientRect on a disconnected node
-          // in IE throws an error.
-          ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
-              swap( elem, cssShow, function() {
-                return getWidthOrHeight( elem, dimension, extra );
-              } ) :
-              getWidthOrHeight( elem, dimension, extra );
-        }
-      },
-
-      set: function( elem, value, extra ) {
-        var matches,
-            styles = getStyles( elem ),
-            isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-            subtract = extra && boxModelAdjustment(
-                elem,
-                dimension,
-                extra,
-                isBorderBox,
-                styles
-            );
-
-        // Account for unreliable border-box dimensions by comparing offset* to computed and
-        // faking a content-box to get border and padding (gh-3699)
-        if ( isBorderBox && support.scrollboxSize() === styles.position ) {
-          subtract -= Math.ceil(
-              elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
-              parseFloat( styles[ dimension ] ) -
-              boxModelAdjustment( elem, dimension, "border", false, styles ) -
-              0.5
-          );
-        }
-
-        // Convert to pixels if value adjustment is needed
-        if ( subtract && ( matches = rcssNum.exec( value ) ) &&
-            ( matches[ 3 ] || "px" ) !== "px" ) {
-
-          elem.style[ dimension ] = value;
-          value = jQuery.css( elem, dimension );
-        }
-
-        return setPositiveNumber( elem, value, subtract );
-      }
-    };
-  } );
-
-  jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
-      function( elem, computed ) {
-        if ( computed ) {
-          return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
-              elem.getBoundingClientRect().left -
-              swap( elem, { marginLeft: 0 }, function() {
-                return elem.getBoundingClientRect().left;
-              } )
-          ) + "px";
-        }
-      }
-  );
-
-// These hooks are used by animate to expand properties
-  jQuery.each( {
-    margin: "",
-    padding: "",
-    border: "Width"
-  }, function( prefix, suffix ) {
-    jQuery.cssHooks[ prefix + suffix ] = {
-      expand: function( value ) {
-        var i = 0,
-            expanded = {},
-
-            // Assumes a single number if not a string
-            parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
-        for ( ; i < 4; i++ ) {
-          expanded[ prefix + cssExpand[ i ] + suffix ] =
-              parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-        }
-
-        return expanded;
-      }
-    };
-
-    if ( prefix !== "margin" ) {
-      jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-    }
-  } );
-
-  jQuery.fn.extend( {
-    css: function( name, value ) {
-      return access( this, function( elem, name, value ) {
-        var styles, len,
-            map = {},
-            i = 0;
-
-        if ( Array.isArray( name ) ) {
-          styles = getStyles( elem );
-          len = name.length;
-
-          for ( ; i < len; i++ ) {
-            map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-          }
-
-          return map;
-        }
-
-        return value !== undefined ?
-            jQuery.style( elem, name, value ) :
-            jQuery.css( elem, name );
-      }, name, value, arguments.length > 1 );
-    }
-  } );
-
-
-  function Tween( elem, options, prop, end, easing ) {
-    return new Tween.prototype.init( elem, options, prop, end, easing );
-  }
-  jQuery.Tween = Tween;
-
-  Tween.prototype = {
-    constructor: Tween,
-    init: function( elem, options, prop, end, easing, unit ) {
-      this.elem = elem;
-      this.prop = prop;
-      this.easing = easing || jQuery.easing._default;
-      this.options = options;
-      this.start = this.now = this.cur();
-      this.end = end;
-      this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-    },
-    cur: function() {
-      var hooks = Tween.propHooks[ this.prop ];
-
-      return hooks && hooks.get ?
-          hooks.get( this ) :
-          Tween.propHooks._default.get( this );
-    },
-    run: function( percent ) {
-      var eased,
-          hooks = Tween.propHooks[ this.prop ];
-
-      if ( this.options.duration ) {
-        this.pos = eased = jQuery.easing[ this.easing ](
-            percent, this.options.duration * percent, 0, 1, this.options.duration
-        );
-      } else {
-        this.pos = eased = percent;
-      }
-      this.now = ( this.end - this.start ) * eased + this.start;
-
-      if ( this.options.step ) {
-        this.options.step.call( this.elem, this.now, this );
-      }
-
-      if ( hooks && hooks.set ) {
-        hooks.set( this );
-      } else {
-        Tween.propHooks._default.set( this );
-      }
-      return this;
-    }
-  };
-
-  Tween.prototype.init.prototype = Tween.prototype;
-
-  Tween.propHooks = {
-    _default: {
-      get: function( tween ) {
-        var result;
-
-        // Use a property on the element directly when it is not a DOM element,
-        // or when there is no matching style property that exists.
-        if ( tween.elem.nodeType !== 1 ||
-            tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
-          return tween.elem[ tween.prop ];
-        }
-
-        // Passing an empty string as a 3rd parameter to .css will automatically
-        // attempt a parseFloat and fallback to a string if the parse fails.
-        // Simple values such as "10px" are parsed to Float;
-        // complex values such as "rotate(1rad)" are returned as-is.
-        result = jQuery.css( tween.elem, tween.prop, "" );
-
-        // Empty strings, null, undefined and "auto" are converted to 0.
-        return !result || result === "auto" ? 0 : result;
-      },
-      set: function( tween ) {
-
-        // Use step hook for back compat.
-        // Use cssHook if its there.
-        // Use .style if available and use plain properties where available.
-        if ( jQuery.fx.step[ tween.prop ] ) {
-          jQuery.fx.step[ tween.prop ]( tween );
-        } else if ( tween.elem.nodeType === 1 &&
-            ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
-                jQuery.cssHooks[ tween.prop ] ) ) {
-          jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-        } else {
-          tween.elem[ tween.prop ] = tween.now;
-        }
-      }
-    }
-  };
-
-// Support: IE <=9 only
-// Panic based approach to setting things on disconnected nodes
-  Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-    set: function( tween ) {
-      if ( tween.elem.nodeType && tween.elem.parentNode ) {
-        tween.elem[ tween.prop ] = tween.now;
-      }
-    }
-  };
-
-  jQuery.easing = {
-    linear: function( p ) {
-      return p;
-    },
-    swing: function( p ) {
-      return 0.5 - Math.cos( p * Math.PI ) / 2;
-    },
-    _default: "swing"
-  };
-
-  jQuery.fx = Tween.prototype.init;
-
-// Back compat <1.8 extension point
-  jQuery.fx.step = {};
-
-
-
-
-  var
-      fxNow, inProgress,
-      rfxtypes = /^(?:toggle|show|hide)$/,
-      rrun = /queueHooks$/;
-
-  function schedule() {
-    if ( inProgress ) {
-      if ( document.hidden === false && window.requestAnimationFrame ) {
-        window.requestAnimationFrame( schedule );
-      } else {
-        window.setTimeout( schedule, jQuery.fx.interval );
-      }
-
-      jQuery.fx.tick();
-    }
-  }
-
-// Animations created synchronously will run synchronously
-  function createFxNow() {
-    window.setTimeout( function() {
-      fxNow = undefined;
-    } );
-    return ( fxNow = Date.now() );
-  }
-
-// Generate parameters to create a standard animation
-  function genFx( type, includeWidth ) {
-    var which,
-        i = 0,
-        attrs = { height: type };
-
-    // If we include width, step value is 1 to do all cssExpand values,
-    // otherwise step value is 2 to skip over Left and Right
-    includeWidth = includeWidth ? 1 : 0;
-    for ( ; i < 4; i += 2 - includeWidth ) {
-      which = cssExpand[ i ];
-      attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-    }
-
-    if ( includeWidth ) {
-      attrs.opacity = attrs.width = type;
-    }
-
-    return attrs;
-  }
-
-  function createTween( value, prop, animation ) {
-    var tween,
-        collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
-        index = 0,
-        length = collection.length;
-    for ( ; index < length; index++ ) {
-      if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
-        // We're done with this property
-        return tween;
-      }
-    }
-  }
-
-  function defaultPrefilter( elem, props, opts ) {
-    var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
-        isBox = "width" in props || "height" in props,
-        anim = this,
-        orig = {},
-        style = elem.style,
-        hidden = elem.nodeType && isHiddenWithinTree( elem ),
-        dataShow = dataPriv.get( elem, "fxshow" );
-
-    // Queue-skipping animations hijack the fx hooks
-    if ( !opts.queue ) {
-      hooks = jQuery._queueHooks( elem, "fx" );
-      if ( hooks.unqueued == null ) {
-        hooks.unqueued = 0;
-        oldfire = hooks.empty.fire;
-        hooks.empty.fire = function() {
-          if ( !hooks.unqueued ) {
-            oldfire();
-          }
-        };
-      }
-      hooks.unqueued++;
-
-      anim.always( function() {
-
-        // Ensure the complete handler is called before this completes
-        anim.always( function() {
-          hooks.unqueued--;
-          if ( !jQuery.queue( elem, "fx" ).length ) {
-            hooks.empty.fire();
-          }
-        } );
-      } );
-    }
-
-    // Detect show/hide animations
-    for ( prop in props ) {
-      value = props[ prop ];
-      if ( rfxtypes.test( value ) ) {
-        delete props[ prop ];
-        toggle = toggle || value === "toggle";
-        if ( value === ( hidden ? "hide" : "show" ) ) {
-
-          // Pretend to be hidden if this is a "show" and
-          // there is still data from a stopped show/hide
-          if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
-            hidden = true;
-
-            // Ignore all other no-op show/hide data
-          } else {
-            continue;
-          }
-        }
-        orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-      }
-    }
-
-    // Bail out if this is a no-op like .hide().hide()
-    propTween = !jQuery.isEmptyObject( props );
-    if ( !propTween && jQuery.isEmptyObject( orig ) ) {
-      return;
-    }
-
-    // Restrict "overflow" and "display" styles during box animations
-    if ( isBox && elem.nodeType === 1 ) {
-
-      // Support: IE <=9 - 11, Edge 12 - 15
-      // Record all 3 overflow attributes because IE does not infer the shorthand
-      // from identically-valued overflowX and overflowY and Edge just mirrors
-      // the overflowX value there.
-      opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-      // Identify a display type, preferring old show/hide data over the CSS cascade
-      restoreDisplay = dataShow && dataShow.display;
-      if ( restoreDisplay == null ) {
-        restoreDisplay = dataPriv.get( elem, "display" );
-      }
-      display = jQuery.css( elem, "display" );
-      if ( display === "none" ) {
-        if ( restoreDisplay ) {
-          display = restoreDisplay;
-        } else {
-
-          // Get nonempty value(s) by temporarily forcing visibility
-          showHide( [ elem ], true );
-          restoreDisplay = elem.style.display || restoreDisplay;
-          display = jQuery.css( elem, "display" );
-          showHide( [ elem ] );
-        }
-      }
-
-      // Animate inline elements as inline-block
-      if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
-        if ( jQuery.css( elem, "float" ) === "none" ) {
-
-          // Restore the original display value at the end of pure show/hide animations
-          if ( !propTween ) {
-            anim.done( function() {
-              style.display = restoreDisplay;
-            } );
-            if ( restoreDisplay == null ) {
-              display = style.display;
-              restoreDisplay = display === "none" ? "" : display;
-            }
-          }
-          style.display = "inline-block";
-        }
-      }
-    }
-
-    if ( opts.overflow ) {
-      style.overflow = "hidden";
-      anim.always( function() {
-        style.overflow = opts.overflow[ 0 ];
-        style.overflowX = opts.overflow[ 1 ];
-        style.overflowY = opts.overflow[ 2 ];
-      } );
-    }
-
-    // Implement show/hide animations
-    propTween = false;
-    for ( prop in orig ) {
-
-      // General show/hide setup for this element animation
-      if ( !propTween ) {
-        if ( dataShow ) {
-          if ( "hidden" in dataShow ) {
-            hidden = dataShow.hidden;
-          }
-        } else {
-          dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
-        }
-
-        // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
-        if ( toggle ) {
-          dataShow.hidden = !hidden;
-        }
-
-        // Show elements before animating them
-        if ( hidden ) {
-          showHide( [ elem ], true );
-        }
-
-        /* eslint-disable no-loop-func */
-
-        anim.done( function() {
-
-          /* eslint-enable no-loop-func */
-
-          // The final step of a "hide" animation is actually hiding the element
-          if ( !hidden ) {
-            showHide( [ elem ] );
-          }
-          dataPriv.remove( elem, "fxshow" );
-          for ( prop in orig ) {
-            jQuery.style( elem, prop, orig[ prop ] );
-          }
-        } );
-      }
-
-      // Per-property setup
-      propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-      if ( !( prop in dataShow ) ) {
-        dataShow[ prop ] = propTween.start;
-        if ( hidden ) {
-          propTween.end = propTween.start;
-          propTween.start = 0;
-        }
-      }
-    }
-  }
-
-  function propFilter( props, specialEasing ) {
-    var index, name, easing, value, hooks;
-
-    // camelCase, specialEasing and expand cssHook pass
-    for ( index in props ) {
-      name = camelCase( index );
-      easing = specialEasing[ name ];
-      value = props[ index ];
-      if ( Array.isArray( value ) ) {
-        easing = value[ 1 ];
-        value = props[ index ] = value[ 0 ];
-      }
-
-      if ( index !== name ) {
-        props[ name ] = value;
-        delete props[ index ];
-      }
-
-      hooks = jQuery.cssHooks[ name ];
-      if ( hooks && "expand" in hooks ) {
-        value = hooks.expand( value );
-        delete props[ name ];
-
-        // Not quite $.extend, this won't overwrite existing keys.
-        // Reusing 'index' because we have the correct "name"
-        for ( index in value ) {
-          if ( !( index in props ) ) {
-            props[ index ] = value[ index ];
-            specialEasing[ index ] = easing;
-          }
-        }
-      } else {
-        specialEasing[ name ] = easing;
-      }
-    }
-  }
-
-  function Animation( elem, properties, options ) {
-    var result,
-        stopped,
-        index = 0,
-        length = Animation.prefilters.length,
-        deferred = jQuery.Deferred().always( function() {
-
-          // Don't match elem in the :animated selector
-          delete tick.elem;
-        } ),
-        tick = function() {
-          if ( stopped ) {
-            return false;
-          }
-          var currentTime = fxNow || createFxNow(),
-              remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
-              // Support: Android 2.3 only
-              // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
-              temp = remaining / animation.duration || 0,
-              percent = 1 - temp,
-              index = 0,
-              length = animation.tweens.length;
-
-          for ( ; index < length; index++ ) {
-            animation.tweens[ index ].run( percent );
-          }
-
-          deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
-          // If there's more to do, yield
-          if ( percent < 1 && length ) {
-            return remaining;
-          }
-
-          // If this was an empty animation, synthesize a final progress notification
-          if ( !length ) {
-            deferred.notifyWith( elem, [ animation, 1, 0 ] );
-          }
-
-          // Resolve the animation and report its conclusion
-          deferred.resolveWith( elem, [ animation ] );
-          return false;
-        },
-        animation = deferred.promise( {
-          elem: elem,
-          props: jQuery.extend( {}, properties ),
-          opts: jQuery.extend( true, {
-            specialEasing: {},
-            easing: jQuery.easing._default
-          }, options ),
-          originalProperties: properties,
-          originalOptions: options,
-          startTime: fxNow || createFxNow(),
-          duration: options.duration,
-          tweens: [],
-          createTween: function( prop, end ) {
-            var tween = jQuery.Tween( elem, animation.opts, prop, end,
-                animation.opts.specialEasing[ prop ] || animation.opts.easing );
-            animation.tweens.push( tween );
-            return tween;
-          },
-          stop: function( gotoEnd ) {
-            var index = 0,
-
-                // If we are going to the end, we want to run all the tweens
-                // otherwise we skip this part
-                length = gotoEnd ? animation.tweens.length : 0;
-            if ( stopped ) {
-              return this;
-            }
-            stopped = true;
-            for ( ; index < length; index++ ) {
-              animation.tweens[ index ].run( 1 );
-            }
-
-            // Resolve when we played the last frame; otherwise, reject
-            if ( gotoEnd ) {
-              deferred.notifyWith( elem, [ animation, 1, 0 ] );
-              deferred.resolveWith( elem, [ animation, gotoEnd ] );
-            } else {
-              deferred.rejectWith( elem, [ animation, gotoEnd ] );
-            }
-            return this;
-          }
-        } ),
-        props = animation.props;
-
-    propFilter( props, animation.opts.specialEasing );
-
-    for ( ; index < length; index++ ) {
-      result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
-      if ( result ) {
-        if ( isFunction( result.stop ) ) {
-          jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
-              result.stop.bind( result );
-        }
-        return result;
-      }
-    }
-
-    jQuery.map( props, createTween, animation );
-
-    if ( isFunction( animation.opts.start ) ) {
-      animation.opts.start.call( elem, animation );
-    }
-
-    // Attach callbacks from options
-    animation
-        .progress( animation.opts.progress )
-        .done( animation.opts.done, animation.opts.complete )
-        .fail( animation.opts.fail )
-        .always( animation.opts.always );
-
-    jQuery.fx.timer(
-        jQuery.extend( tick, {
-          elem: elem,
-          anim: animation,
-          queue: animation.opts.queue
-        } )
-    );
-
-    return animation;
-  }
-
-  jQuery.Animation = jQuery.extend( Animation, {
-
-    tweeners: {
-      "*": [ function( prop, value ) {
-        var tween = this.createTween( prop, value );
-        adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
-        return tween;
-      } ]
-    },
-
-    tweener: function( props, callback ) {
-      if ( isFunction( props ) ) {
-        callback = props;
-        props = [ "*" ];
-      } else {
-        props = props.match( rnothtmlwhite );
-      }
-
-      var prop,
-          index = 0,
-          length = props.length;
-
-      for ( ; index < length; index++ ) {
-        prop = props[ index ];
-        Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
-        Animation.tweeners[ prop ].unshift( callback );
-      }
-    },
-
-    prefilters: [ defaultPrefilter ],
-
-    prefilter: function( callback, prepend ) {
-      if ( prepend ) {
-        Animation.prefilters.unshift( callback );
-      } else {
-        Animation.prefilters.push( callback );
-      }
-    }
-  } );
-
-  jQuery.speed = function( speed, easing, fn ) {
-    var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-      complete: fn || !fn && easing ||
-          isFunction( speed ) && speed,
-      duration: speed,
-      easing: fn && easing || easing && !isFunction( easing ) && easing
-    };
-
-    // Go to the end state if fx are off
-    if ( jQuery.fx.off ) {
-      opt.duration = 0;
-
-    } else {
-      if ( typeof opt.duration !== "number" ) {
-        if ( opt.duration in jQuery.fx.speeds ) {
-          opt.duration = jQuery.fx.speeds[ opt.duration ];
-
-        } else {
-          opt.duration = jQuery.fx.speeds._default;
-        }
-      }
-    }
-
-    // Normalize opt.queue - true/undefined/null -> "fx"
-    if ( opt.queue == null || opt.queue === true ) {
-      opt.queue = "fx";
-    }
-
-    // Queueing
-    opt.old = opt.complete;
-
-    opt.complete = function() {
-      if ( isFunction( opt.old ) ) {
-        opt.old.call( this );
-      }
-
-      if ( opt.queue ) {
-        jQuery.dequeue( this, opt.queue );
-      }
-    };
-
-    return opt;
-  };
-
-  jQuery.fn.extend( {
-    fadeTo: function( speed, to, easing, callback ) {
-
-      // Show any hidden elements after setting opacity to 0
-      return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
-
-      // Animate to the value specified
-          .end().animate( { opacity: to }, speed, easing, callback );
-    },
-    animate: function( prop, speed, easing, callback ) {
-      var empty = jQuery.isEmptyObject( prop ),
-          optall = jQuery.speed( speed, easing, callback ),
-          doAnimation = function() {
-
-            // Operate on a copy of prop so per-property easing won't be lost
-            var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-            // Empty animations, or finishing resolves immediately
-            if ( empty || dataPriv.get( this, "finish" ) ) {
-              anim.stop( true );
-            }
-          };
-      doAnimation.finish = doAnimation;
-
-      return empty || optall.queue === false ?
-          this.each( doAnimation ) :
-          this.queue( optall.queue, doAnimation );
-    },
-    stop: function( type, clearQueue, gotoEnd ) {
-      var stopQueue = function( hooks ) {
-        var stop = hooks.stop;
-        delete hooks.stop;
-        stop( gotoEnd );
-      };
-
-      if ( typeof type !== "string" ) {
-        gotoEnd = clearQueue;
-        clearQueue = type;
-        type = undefined;
-      }
-      if ( clearQueue && type !== false ) {
-        this.queue( type || "fx", [] );
-      }
-
-      return this.each( function() {
-        var dequeue = true,
-            index = type != null && type + "queueHooks",
-            timers = jQuery.timers,
-            data = dataPriv.get( this );
-
-        if ( index ) {
-          if ( data[ index ] && data[ index ].stop ) {
-            stopQueue( data[ index ] );
-          }
-        } else {
-          for ( index in data ) {
-            if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-              stopQueue( data[ index ] );
-            }
-          }
-        }
-
-        for ( index = timers.length; index--; ) {
-          if ( timers[ index ].elem === this &&
-              ( type == null || timers[ index ].queue === type ) ) {
-
-            timers[ index ].anim.stop( gotoEnd );
-            dequeue = false;
-            timers.splice( index, 1 );
-          }
-        }
-
-        // Start the next in the queue if the last step wasn't forced.
-        // Timers currently will call their complete callbacks, which
-        // will dequeue but only if they were gotoEnd.
-        if ( dequeue || !gotoEnd ) {
-          jQuery.dequeue( this, type );
-        }
-      } );
-    },
-    finish: function( type ) {
-      if ( type !== false ) {
-        type = type || "fx";
-      }
-      return this.each( function() {
-        var index,
-            data = dataPriv.get( this ),
-            queue = data[ type + "queue" ],
-            hooks = data[ type + "queueHooks" ],
-            timers = jQuery.timers,
-            length = queue ? queue.length : 0;
-
-        // Enable finishing flag on private data
-        data.finish = true;
-
-        // Empty the queue first
-        jQuery.queue( this, type, [] );
-
-        if ( hooks && hooks.stop ) {
-          hooks.stop.call( this, true );
-        }
-
-        // Look for any active animations, and finish them
-        for ( index = timers.length; index--; ) {
-          if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-            timers[ index ].anim.stop( true );
-            timers.splice( index, 1 );
-          }
-        }
-
-        // Look for any animations in the old queue and finish them
-        for ( index = 0; index < length; index++ ) {
-          if ( queue[ index ] && queue[ index ].finish ) {
-            queue[ index ].finish.call( this );
-          }
-        }
-
-        // Turn off finishing flag
-        delete data.finish;
-      } );
-    }
-  } );
-
-  jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
-    var cssFn = jQuery.fn[ name ];
-    jQuery.fn[ name ] = function( speed, easing, callback ) {
-      return speed == null || typeof speed === "boolean" ?
-          cssFn.apply( this, arguments ) :
-          this.animate( genFx( name, true ), speed, easing, callback );
-    };
-  } );
-
-// Generate shortcuts for custom animations
-  jQuery.each( {
-    slideDown: genFx( "show" ),
-    slideUp: genFx( "hide" ),
-    slideToggle: genFx( "toggle" ),
-    fadeIn: { opacity: "show" },
-    fadeOut: { opacity: "hide" },
-    fadeToggle: { opacity: "toggle" }
-  }, function( name, props ) {
-    jQuery.fn[ name ] = function( speed, easing, callback ) {
-      return this.animate( props, speed, easing, callback );
-    };
-  } );
-
-  jQuery.timers = [];
-  jQuery.fx.tick = function() {
-    var timer,
-        i = 0,
-        timers = jQuery.timers;
-
-    fxNow = Date.now();
-
-    for ( ; i < timers.length; i++ ) {
-      timer = timers[ i ];
-
-      // Run the timer and safely remove it when done (allowing for external removal)
-      if ( !timer() && timers[ i ] === timer ) {
-        timers.splice( i--, 1 );
-      }
-    }
-
-    if ( !timers.length ) {
-      jQuery.fx.stop();
-    }
-    fxNow = undefined;
-  };
-
-  jQuery.fx.timer = function( timer ) {
-    jQuery.timers.push( timer );
-    jQuery.fx.start();
-  };
-
-  jQuery.fx.interval = 13;
-  jQuery.fx.start = function() {
-    if ( inProgress ) {
-      return;
-    }
-
-    inProgress = true;
-    schedule();
-  };
-
-  jQuery.fx.stop = function() {
-    inProgress = null;
-  };
-
-  jQuery.fx.speeds = {
-    slow: 600,
-    fast: 200,
-
-    // Default speed
-    _default: 400
-  };
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-  jQuery.fn.delay = function( time, type ) {
-    time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-    type = type || "fx";
-
-    return this.queue( type, function( next, hooks ) {
-      var timeout = window.setTimeout( next, time );
-      hooks.stop = function() {
-        window.clearTimeout( timeout );
-      };
-    } );
-  };
-
-
-  ( function() {
-    var input = document.createElement( "input" ),
-        select = document.createElement( "select" ),
-        opt = select.appendChild( document.createElement( "option" ) );
-
-    input.type = "checkbox";
-
-    // Support: Android <=4.3 only
-    // Default value for a checkbox should be "on"
-    support.checkOn = input.value !== "";
-
-    // Support: IE <=11 only
-    // Must access selectedIndex to make default options select
-    support.optSelected = opt.selected;
-
-    // Support: IE <=11 only
-    // An input loses its value after becoming a radio
-    input = document.createElement( "input" );
-    input.value = "t";
-    input.type = "radio";
-    support.radioValue = input.value === "t";
-  } )();
-
-
-  var boolHook,
-      attrHandle = jQuery.expr.attrHandle;
-
-  jQuery.fn.extend( {
-    attr: function( name, value ) {
-      return access( this, jQuery.attr, name, value, arguments.length > 1 );
-    },
-
-    removeAttr: function( name ) {
-      return this.each( function() {
-        jQuery.removeAttr( this, name );
-      } );
-    }
-  } );
-
-  jQuery.extend( {
-    attr: function( elem, name, value ) {
-      var ret, hooks,
-          nType = elem.nodeType;
-
-      // Don't get/set attributes on text, comment and attribute nodes
-      if ( nType === 3 || nType === 8 || nType === 2 ) {
-        return;
-      }
-
-      // Fallback to prop when attributes are not supported
-      if ( typeof elem.getAttribute === "undefined" ) {
-        return jQuery.prop( elem, name, value );
-      }
-
-      // Attribute hooks are determined by the lowercase version
-      // Grab necessary hook if one is defined
-      if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-        hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
-            ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
-      }
-
-      if ( value !== undefined ) {
-        if ( value === null ) {
-          jQuery.removeAttr( elem, name );
-          return;
-        }
-
-        if ( hooks && "set" in hooks &&
-            ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-          return ret;
-        }
-
-        elem.setAttribute( name, value + "" );
-        return value;
-      }
-
-      if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-        return ret;
-      }
-
-      ret = jQuery.find.attr( elem, name );
-
-      // Non-existent attributes return null, we normalize to undefined
-      return ret == null ? undefined : ret;
-    },
-
-    attrHooks: {
-      type: {
-        set: function( elem, value ) {
-          if ( !support.radioValue && value === "radio" &&
-              nodeName( elem, "input" ) ) {
-            var val = elem.value;
-            elem.setAttribute( "type", value );
-            if ( val ) {
-              elem.value = val;
-            }
-            return value;
-          }
-        }
-      }
-    },
-
-    removeAttr: function( elem, value ) {
-      var name,
-          i = 0,
-
-          // Attribute names can contain non-HTML whitespace characters
-          // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
-          attrNames = value && value.match( rnothtmlwhite );
-
-      if ( attrNames && elem.nodeType === 1 ) {
-        while ( ( name = attrNames[ i++ ] ) ) {
-          elem.removeAttribute( name );
-        }
-      }
-    }
-  } );
-
-// Hooks for boolean attributes
-  boolHook = {
-    set: function( elem, value, name ) {
-      if ( value === false ) {
-
-        // Remove boolean attributes when set to false
-        jQuery.removeAttr( elem, name );
-      } else {
-        elem.setAttribute( name, name );
-      }
-      return name;
-    }
-  };
-
-  jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-    var getter = attrHandle[ name ] || jQuery.find.attr;
-
-    attrHandle[ name ] = function( elem, name, isXML ) {
-      var ret, handle,
-          lowercaseName = name.toLowerCase();
-
-      if ( !isXML ) {
-
-        // Avoid an infinite loop by temporarily removing this function from the getter
-        handle = attrHandle[ lowercaseName ];
-        attrHandle[ lowercaseName ] = ret;
-        ret = getter( elem, name, isXML ) != null ?
-            lowercaseName :
-            null;
-        attrHandle[ lowercaseName ] = handle;
-      }
-      return ret;
-    };
-  } );
-
-
-
-
-  var rfocusable = /^(?:input|select|textarea|button)$/i,
-      rclickable = /^(?:a|area)$/i;
-
-  jQuery.fn.extend( {
-    prop: function( name, value ) {
-      return access( this, jQuery.prop, name, value, arguments.length > 1 );
-    },
-
-    removeProp: function( name ) {
-      return this.each( function() {
-        delete this[ jQuery.propFix[ name ] || name ];
-      } );
-    }
-  } );
-
-  jQuery.extend( {
-    prop: function( elem, name, value ) {
-      var ret, hooks,
-          nType = elem.nodeType;
-
-      // Don't get/set properties on text, comment and attribute nodes
-      if ( nType === 3 || nType === 8 || nType === 2 ) {
-        return;
-      }
-
-      if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
-        // Fix name and attach hooks
-        name = jQuery.propFix[ name ] || name;
-        hooks = jQuery.propHooks[ name ];
-      }
-
-      if ( value !== undefined ) {
-        if ( hooks && "set" in hooks &&
-            ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-          return ret;
-        }
-
-        return ( elem[ name ] = value );
-      }
-
-      if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-        return ret;
-      }
-
-      return elem[ name ];
-    },
-
-    propHooks: {
-      tabIndex: {
-        get: function( elem ) {
-
-          // Support: IE <=9 - 11 only
-          // elem.tabIndex doesn't always return the
-          // correct value when it hasn't been explicitly set
-          // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-          // Use proper attribute retrieval(#12072)
-          var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-          if ( tabindex ) {
-            return parseInt( tabindex, 10 );
-          }
-
-          if (
-              rfocusable.test( elem.nodeName ) ||
-              rclickable.test( elem.nodeName ) &&
-              elem.href
-          ) {
-            return 0;
-          }
-
-          return -1;
-        }
-      }
-    },
-
-    propFix: {
-      "for": "htmlFor",
-      "class": "className"
-    }
-  } );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-// eslint rule "no-unused-expressions" is disabled for this code
-// since it considers such accessions noop
-  if ( !support.optSelected ) {
-    jQuery.propHooks.selected = {
-      get: function( elem ) {
-
-        /* eslint no-unused-expressions: "off" */
-
-        var parent = elem.parentNode;
-        if ( parent && parent.parentNode ) {
-          parent.parentNode.selectedIndex;
-        }
-        return null;
-      },
-      set: function( elem ) {
-
-        /* eslint no-unused-expressions: "off" */
-
-        var parent = elem.parentNode;
-        if ( parent ) {
-          parent.selectedIndex;
-
-          if ( parent.parentNode ) {
-            parent.parentNode.selectedIndex;
-          }
-        }
-      }
-    };
-  }
-
-  jQuery.each( [
-    "tabIndex",
-    "readOnly",
-    "maxLength",
-    "cellSpacing",
-    "cellPadding",
-    "rowSpan",
-    "colSpan",
-    "useMap",
-    "frameBorder",
-    "contentEditable"
-  ], function() {
-    jQuery.propFix[ this.toLowerCase() ] = this;
-  } );
-
-
-
-
-  // Strip and collapse whitespace according to HTML spec
-  // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
-  function stripAndCollapse( value ) {
-    var tokens = value.match( rnothtmlwhite ) || [];
-    return tokens.join( " " );
-  }
-
-
-  function getClass( elem ) {
-    return elem.getAttribute && elem.getAttribute( "class" ) || "";
-  }
-
-  function classesToArray( value ) {
-    if ( Array.isArray( value ) ) {
-      return value;
-    }
-    if ( typeof value === "string" ) {
-      return value.match( rnothtmlwhite ) || [];
-    }
-    return [];
-  }
-
-  jQuery.fn.extend( {
-    addClass: function( value ) {
-      var classes, elem, cur, curValue, clazz, j, finalValue,
-          i = 0;
-
-      if ( isFunction( value ) ) {
-        return this.each( function( j ) {
-          jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
-        } );
-      }
-
-      classes = classesToArray( value );
-
-      if ( classes.length ) {
-        while ( ( elem = this[ i++ ] ) ) {
-          curValue = getClass( elem );
-          cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
-          if ( cur ) {
-            j = 0;
-            while ( ( clazz = classes[ j++ ] ) ) {
-              if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-                cur += clazz + " ";
-              }
-            }
-
-            // Only assign if different to avoid unneeded rendering.
-            finalValue = stripAndCollapse( cur );
-            if ( curValue !== finalValue ) {
-              elem.setAttribute( "class", finalValue );
-            }
-          }
-        }
-      }
-
-      return this;
-    },
-
-    removeClass: function( value ) {
-      var classes, elem, cur, curValue, clazz, j, finalValue,
-          i = 0;
-
-      if ( isFunction( value ) ) {
-        return this.each( function( j ) {
-          jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
-        } );
-      }
-
-      if ( !arguments.length ) {
-        return this.attr( "class", "" );
-      }
-
-      classes = classesToArray( value );
-
-      if ( classes.length ) {
-        while ( ( elem = this[ i++ ] ) ) {
-          curValue = getClass( elem );
-
-          // This expression is here for better compressibility (see addClass)
-          cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
-          if ( cur ) {
-            j = 0;
-            while ( ( clazz = classes[ j++ ] ) ) {
-
-              // Remove *all* instances
-              while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
-                cur = cur.replace( " " + clazz + " ", " " );
-              }
-            }
-
-            // Only assign if different to avoid unneeded rendering.
-            finalValue = stripAndCollapse( cur );
-            if ( curValue !== finalValue ) {
-              elem.setAttribute( "class", finalValue );
-            }
-          }
-        }
-      }
-
-      return this;
-    },
-
-    toggleClass: function( value, stateVal ) {
-      var type = typeof value,
-          isValidValue = type === "string" || Array.isArray( value );
-
-      if ( typeof stateVal === "boolean" && isValidValue ) {
-        return stateVal ? this.addClass( value ) : this.removeClass( value );
-      }
-
-      if ( isFunction( value ) ) {
-        return this.each( function( i ) {
-          jQuery( this ).toggleClass(
-              value.call( this, i, getClass( this ), stateVal ),
-              stateVal
-          );
-        } );
-      }
-
-      return this.each( function() {
-        var className, i, self, classNames;
-
-        if ( isValidValue ) {
-
-          // Toggle individual class names
-          i = 0;
-          self = jQuery( this );
-          classNames = classesToArray( value );
-
-          while ( ( className = classNames[ i++ ] ) ) {
-
-            // Check each className given, space separated list
-            if ( self.hasClass( className ) ) {
-              self.removeClass( className );
-            } else {
-              self.addClass( className );
-            }
-          }
-
-          // Toggle whole class name
-        } else if ( value === undefined || type === "boolean" ) {
-          className = getClass( this );
-          if ( className ) {
-
-            // Store className if set
-            dataPriv.set( this, "__className__", className );
-          }
-
-          // If the element has a class name or if we're passed `false`,
-          // then remove the whole classname (if there was one, the above saved it).
-          // Otherwise bring back whatever was previously saved (if anything),
-          // falling back to the empty string if nothing was stored.
-          if ( this.setAttribute ) {
-            this.setAttribute( "class",
-                className || value === false ?
-                    "" :
-                    dataPriv.get( this, "__className__" ) || ""
-            );
-          }
-        }
-      } );
-    },
-
-    hasClass: function( selector ) {
-      var className, elem,
-          i = 0;
-
-      className = " " + selector + " ";
-      while ( ( elem = this[ i++ ] ) ) {
-        if ( elem.nodeType === 1 &&
-            ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
-          return true;
-        }
-      }
-
-      return false;
-    }
-  } );
-
-
-
-
-  var rreturn = /\r/g;
-
-  jQuery.fn.extend( {
-    val: function( value ) {
-      var hooks, ret, valueIsFunction,
-          elem = this[ 0 ];
-
-      if ( !arguments.length ) {
-        if ( elem ) {
-          hooks = jQuery.valHooks[ elem.type ] ||
-              jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-          if ( hooks &&
-              "get" in hooks &&
-              ( ret = hooks.get( elem, "value" ) ) !== undefined
-          ) {
-            return ret;
-          }
-
-          ret = elem.value;
-
-          // Handle most common string cases
-          if ( typeof ret === "string" ) {
-            return ret.replace( rreturn, "" );
-          }
-
-          // Handle cases where value is null/undef or number
-          return ret == null ? "" : ret;
-        }
-
-        return;
-      }
-
-      valueIsFunction = isFunction( value );
-
-      return this.each( function( i ) {
-        var val;
-
-        if ( this.nodeType !== 1 ) {
-          return;
-        }
-
-        if ( valueIsFunction ) {
-          val = value.call( this, i, jQuery( this ).val() );
-        } else {
-          val = value;
-        }
-
-        // Treat null/undefined as ""; convert numbers to string
-        if ( val == null ) {
-          val = "";
-
-        } else if ( typeof val === "number" ) {
-          val += "";
-
-        } else if ( Array.isArray( val ) ) {
-          val = jQuery.map( val, function( value ) {
-            return value == null ? "" : value + "";
-          } );
-        }
-
-        hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-        // If set returns undefined, fall back to normal setting
-        if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
-          this.value = val;
-        }
-      } );
-    }
-  } );
-
-  jQuery.extend( {
-    valHooks: {
-      option: {
-        get: function( elem ) {
-
-          var val = jQuery.find.attr( elem, "value" );
-          return val != null ?
-              val :
-
-              // Support: IE <=10 - 11 only
-              // option.text throws exceptions (#14686, #14858)
-              // Strip and collapse whitespace
-              // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-              stripAndCollapse( jQuery.text( elem ) );
-        }
-      },
-      select: {
-        get: function( elem ) {
-          var value, option, i,
-              options = elem.options,
-              index = elem.selectedIndex,
-              one = elem.type === "select-one",
-              values = one ? null : [],
-              max = one ? index + 1 : options.length;
-
-          if ( index < 0 ) {
-            i = max;
-
-          } else {
-            i = one ? index : 0;
-          }
-
-          // Loop through all the selected options
-          for ( ; i < max; i++ ) {
-            option = options[ i ];
-
-            // Support: IE <=9 only
-            // IE8-9 doesn't update selected after form reset (#2551)
-            if ( ( option.selected || i === index ) &&
-
-                // Don't return options that are disabled or in a disabled optgroup
-                !option.disabled &&
-                ( !option.parentNode.disabled ||
-                    !nodeName( option.parentNode, "optgroup" ) ) ) {
-
-              // Get the specific value for the option
-              value = jQuery( option ).val();
-
-              // We don't need an array for one selects
-              if ( one ) {
-                return value;
-              }
-
-              // Multi-Selects return an array
-              values.push( value );
-            }
-          }
-
-          return values;
-        },
-
-        set: function( elem, value ) {
-          var optionSet, option,
-              options = elem.options,
-              values = jQuery.makeArray( value ),
-              i = options.length;
-
-          while ( i-- ) {
-            option = options[ i ];
-
-            /* eslint-disable no-cond-assign */
-
-            if ( option.selected =
-                jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
-            ) {
-              optionSet = true;
-            }
-
-            /* eslint-enable no-cond-assign */
-          }
-
-          // Force browsers to behave consistently when non-matching value is set
-          if ( !optionSet ) {
-            elem.selectedIndex = -1;
-          }
-          return values;
-        }
-      }
-    }
-  } );
-
-// Radios and checkboxes getter/setter
-  jQuery.each( [ "radio", "checkbox" ], function() {
-    jQuery.valHooks[ this ] = {
-      set: function( elem, value ) {
-        if ( Array.isArray( value ) ) {
-          return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
-        }
-      }
-    };
-    if ( !support.checkOn ) {
-      jQuery.valHooks[ this ].get = function( elem ) {
-        return elem.getAttribute( "value" ) === null ? "on" : elem.value;
-      };
-    }
-  } );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-  support.focusin = "onfocusin" in window;
-
-
-  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-      stopPropagationCallback = function( e ) {
-        e.stopPropagation();
-      };
-
-  jQuery.extend( jQuery.event, {
-
-    trigger: function( event, data, elem, onlyHandlers ) {
-
-      var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
-          eventPath = [ elem || document ],
-          type = hasOwn.call( event, "type" ) ? event.type : event,
-          namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
-      cur = lastElement = tmp = elem = elem || document;
-
-      // Don't do events on text and comment nodes
-      if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-        return;
-      }
-
-      // focus/blur morphs to focusin/out; ensure we're not firing them right now
-      if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-        return;
-      }
-
-      if ( type.indexOf( "." ) > -1 ) {
-
-        // Namespaced trigger; create a regexp to match event type in handle()
-        namespaces = type.split( "." );
-        type = namespaces.shift();
-        namespaces.sort();
-      }
-      ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
-      // Caller can pass in a jQuery.Event object, Object, or just an event type string
-      event = event[ jQuery.expando ] ?
-          event :
-          new jQuery.Event( type, typeof event === "object" && event );
-
-      // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-      event.isTrigger = onlyHandlers ? 2 : 3;
-      event.namespace = namespaces.join( "." );
-      event.rnamespace = event.namespace ?
-          new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
-          null;
-
-      // Clean up the event in case it is being reused
-      event.result = undefined;
-      if ( !event.target ) {
-        event.target = elem;
-      }
-
-      // Clone any incoming data and prepend the event, creating the handler arg list
-      data = data == null ?
-          [ event ] :
-          jQuery.makeArray( data, [ event ] );
-
-      // Allow special events to draw outside the lines
-      special = jQuery.event.special[ type ] || {};
-      if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-        return;
-      }
-
-      // Determine event propagation path in advance, per W3C events spec (#9951)
-      // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-      if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
-
-        bubbleType = special.delegateType || type;
-        if ( !rfocusMorph.test( bubbleType + type ) ) {
-          cur = cur.parentNode;
-        }
-        for ( ; cur; cur = cur.parentNode ) {
-          eventPath.push( cur );
-          tmp = cur;
-        }
-
-        // Only add window if we got to document (e.g., not plain obj or detached DOM)
-        if ( tmp === ( elem.ownerDocument || document ) ) {
-          eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-        }
-      }
-
-      // Fire handlers on the event path
-      i = 0;
-      while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-        lastElement = cur;
-        event.type = i > 1 ?
-            bubbleType :
-            special.bindType || type;
-
-        // jQuery handler
-        handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
-            dataPriv.get( cur, "handle" );
-        if ( handle ) {
-          handle.apply( cur, data );
-        }
-
-        // Native handler
-        handle = ontype && cur[ ontype ];
-        if ( handle && handle.apply && acceptData( cur ) ) {
-          event.result = handle.apply( cur, data );
-          if ( event.result === false ) {
-            event.preventDefault();
-          }
-        }
-      }
-      event.type = type;
-
-      // If nobody prevented the default action, do it now
-      if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-        if ( ( !special._default ||
-            special._default.apply( eventPath.pop(), data ) === false ) &&
-            acceptData( elem ) ) {
-
-          // Call a native DOM method on the target with the same name as the event.
-          // Don't do default actions on window, that's where global variables be (#6170)
-          if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
-
-            // Don't re-trigger an onFOO event when we call its FOO() method
-            tmp = elem[ ontype ];
-
-            if ( tmp ) {
-              elem[ ontype ] = null;
-            }
-
-            // Prevent re-triggering of the same event, since we already bubbled it above
-            jQuery.event.triggered = type;
-
-            if ( event.isPropagationStopped() ) {
-              lastElement.addEventListener( type, stopPropagationCallback );
-            }
-
-            elem[ type ]();
-
-            if ( event.isPropagationStopped() ) {
-              lastElement.removeEventListener( type, stopPropagationCallback );
-            }
-
-            jQuery.event.triggered = undefined;
-
-            if ( tmp ) {
-              elem[ ontype ] = tmp;
-            }
-          }
-        }
-      }
-
-      return event.result;
-    },
-
-    // Piggyback on a donor event to simulate a different one
-    // Used only for `focus(in | out)` events
-    simulate: function( type, elem, event ) {
-      var e = jQuery.extend(
-          new jQuery.Event(),
-          event,
-          {
-            type: type,
-            isSimulated: true
-          }
-      );
-
-      jQuery.event.trigger( e, null, elem );
-    }
-
-  } );
-
-  jQuery.fn.extend( {
-
-    trigger: function( type, data ) {
-      return this.each( function() {
-        jQuery.event.trigger( type, data, this );
-      } );
-    },
-    triggerHandler: function( type, data ) {
-      var elem = this[ 0 ];
-      if ( elem ) {
-        return jQuery.event.trigger( type, data, elem, true );
-      }
-    }
-  } );
-
-
-// Support: Firefox <=44
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
-  if ( !support.focusin ) {
-    jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-      // Attach a single capturing handler on the document while someone wants focusin/focusout
-      var handler = function( event ) {
-        jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
-      };
-
-      jQuery.event.special[ fix ] = {
-        setup: function() {
-          var doc = this.ownerDocument || this,
-              attaches = dataPriv.access( doc, fix );
-
-          if ( !attaches ) {
-            doc.addEventListener( orig, handler, true );
-          }
-          dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
-        },
-        teardown: function() {
-          var doc = this.ownerDocument || this,
-              attaches = dataPriv.access( doc, fix ) - 1;
-
-          if ( !attaches ) {
-            doc.removeEventListener( orig, handler, true );
-            dataPriv.remove( doc, fix );
-
-          } else {
-            dataPriv.access( doc, fix, attaches );
-          }
-        }
-      };
-    } );
-  }
-  var location = window.location;
-
-  var nonce = Date.now();
-
-  var rquery = ( /\?/ );
-
-
-
-// Cross-browser xml parsing
-  jQuery.parseXML = function( data ) {
-    var xml;
-    if ( !data || typeof data !== "string" ) {
-      return null;
-    }
-
-    // Support: IE 9 - 11 only
-    // IE throws on parseFromString with invalid input.
-    try {
-      xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
-    } catch ( e ) {
-      xml = undefined;
-    }
-
-    if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
-      jQuery.error( "Invalid XML: " + data );
-    }
-    return xml;
-  };
-
-
-  var
-      rbracket = /\[\]$/,
-      rCRLF = /\r?\n/g,
-      rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-      rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-  function buildParams( prefix, obj, traditional, add ) {
-    var name;
-
-    if ( Array.isArray( obj ) ) {
-
-      // Serialize array item.
-      jQuery.each( obj, function( i, v ) {
-        if ( traditional || rbracket.test( prefix ) ) {
-
-          // Treat each array item as a scalar.
-          add( prefix, v );
-
-        } else {
-
-          // Item is non-scalar (array or object), encode its numeric index.
-          buildParams(
-              prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
-              v,
-              traditional,
-              add
-          );
-        }
-      } );
-
-    } else if ( !traditional && toType( obj ) === "object" ) {
-
-      // Serialize object item.
-      for ( name in obj ) {
-        buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-      }
-
-    } else {
-
-      // Serialize scalar item.
-      add( prefix, obj );
-    }
-  }
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-  jQuery.param = function( a, traditional ) {
-    var prefix,
-        s = [],
-        add = function( key, valueOrFunction ) {
-
-          // If value is a function, invoke it and use its return value
-          var value = isFunction( valueOrFunction ) ?
-              valueOrFunction() :
-              valueOrFunction;
-
-          s[ s.length ] = encodeURIComponent( key ) + "=" +
-              encodeURIComponent( value == null ? "" : value );
-        };
-
-    // If an array was passed in, assume that it is an array of form elements.
-    if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
-      // Serialize the form elements
-      jQuery.each( a, function() {
-        add( this.name, this.value );
-      } );
-
-    } else {
-
-      // If traditional, encode the "old" way (the way 1.3.2 or older
-      // did it), otherwise encode params recursively.
-      for ( prefix in a ) {
-        buildParams( prefix, a[ prefix ], traditional, add );
-      }
-    }
-
-    // Return the resulting serialization
-    return s.join( "&" );
-  };
-
-  jQuery.fn.extend( {
-    serialize: function() {
-      return jQuery.param( this.serializeArray() );
-    },
-    serializeArray: function() {
-      return this.map( function() {
-
-        // Can add propHook for "elements" to filter or add form elements
-        var elements = jQuery.prop( this, "elements" );
-        return elements ? jQuery.makeArray( elements ) : this;
-      } )
-          .filter( function() {
-            var type = this.type;
-
-            // Use .is( ":disabled" ) so that fieldset[disabled] works
-            return this.name && !jQuery( this ).is( ":disabled" ) &&
-                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-                ( this.checked || !rcheckableType.test( type ) );
-          } )
-          .map( function( i, elem ) {
-            var val = jQuery( this ).val();
-
-            if ( val == null ) {
-              return null;
-            }
-
-            if ( Array.isArray( val ) ) {
-              return jQuery.map( val, function( val ) {
-                return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-              } );
-            }
-
-            return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-          } ).get();
-    }
-  } );
-
-
-  var
-      r20 = /%20/g,
-      rhash = /#.*$/,
-      rantiCache = /([?&])_=[^&]*/,
-      rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
-
-      // #7653, #8125, #8152: local protocol detection
-      rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
-      rnoContent = /^(?:GET|HEAD)$/,
-      rprotocol = /^\/\//,
-
-      /* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-      prefilters = {},
-
-      /* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-      transports = {},
-
-      // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-      allTypes = "*/".concat( "*" ),
-
-      // Anchor tag for parsing the document origin
-      originAnchor = document.createElement( "a" );
-  originAnchor.href = location.href;
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-  function addToPrefiltersOrTransports( structure ) {
-
-    // dataTypeExpression is optional and defaults to "*"
-    return function( dataTypeExpression, func ) {
-
-      if ( typeof dataTypeExpression !== "string" ) {
-        func = dataTypeExpression;
-        dataTypeExpression = "*";
-      }
-
-      var dataType,
-          i = 0,
-          dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
-
-      if ( isFunction( func ) ) {
-
-        // For each dataType in the dataTypeExpression
-        while ( ( dataType = dataTypes[ i++ ] ) ) {
-
-          // Prepend if requested
-          if ( dataType[ 0 ] === "+" ) {
-            dataType = dataType.slice( 1 ) || "*";
-            ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
-            // Otherwise append
-          } else {
-            ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
-          }
-        }
-      }
-    };
-  }
-
-// Base inspection function for prefilters and transports
-  function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-    var inspected = {},
-        seekingTransport = ( structure === transports );
-
-    function inspect( dataType ) {
-      var selected;
-      inspected[ dataType ] = true;
-      jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-        var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-        if ( typeof dataTypeOrTransport === "string" &&
-            !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
-          options.dataTypes.unshift( dataTypeOrTransport );
-          inspect( dataTypeOrTransport );
-          return false;
-        } else if ( seekingTransport ) {
-          return !( selected = dataTypeOrTransport );
-        }
-      } );
-      return selected;
-    }
-
-    return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-  }
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-  function ajaxExtend( target, src ) {
-    var key, deep,
-        flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-    for ( key in src ) {
-      if ( src[ key ] !== undefined ) {
-        ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-      }
-    }
-    if ( deep ) {
-      jQuery.extend( true, target, deep );
-    }
-
-    return target;
-  }
-
-  /* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-  function ajaxHandleResponses( s, jqXHR, responses ) {
-
-    var ct, type, finalDataType, firstDataType,
-        contents = s.contents,
-        dataTypes = s.dataTypes;
-
-    // Remove auto dataType and get content-type in the process
-    while ( dataTypes[ 0 ] === "*" ) {
-      dataTypes.shift();
-      if ( ct === undefined ) {
-        ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
-      }
-    }
-
-    // Check if we're dealing with a known content-type
-    if ( ct ) {
-      for ( type in contents ) {
-        if ( contents[ type ] && contents[ type ].test( ct ) ) {
-          dataTypes.unshift( type );
-          break;
-        }
-      }
-    }
-
-    // Check to see if we have a response for the expected dataType
-    if ( dataTypes[ 0 ] in responses ) {
-      finalDataType = dataTypes[ 0 ];
-    } else {
-
-      // Try convertible dataTypes
-      for ( type in responses ) {
-        if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
-          finalDataType = type;
-          break;
-        }
-        if ( !firstDataType ) {
-          firstDataType = type;
-        }
-      }
-
-      // Or just use first one
-      finalDataType = finalDataType || firstDataType;
-    }
-
-    // If we found a dataType
-    // We add the dataType to the list if needed
-    // and return the corresponding response
-    if ( finalDataType ) {
-      if ( finalDataType !== dataTypes[ 0 ] ) {
-        dataTypes.unshift( finalDataType );
-      }
-      return responses[ finalDataType ];
-    }
-  }
-
-  /* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-  function ajaxConvert( s, response, jqXHR, isSuccess ) {
-    var conv2, current, conv, tmp, prev,
-        converters = {},
-
-        // Work with a copy of dataTypes in case we need to modify it for conversion
-        dataTypes = s.dataTypes.slice();
-
-    // Create converters map with lowercased keys
-    if ( dataTypes[ 1 ] ) {
-      for ( conv in s.converters ) {
-        converters[ conv.toLowerCase() ] = s.converters[ conv ];
-      }
-    }
-
-    current = dataTypes.shift();
-
-    // Convert to each sequential dataType
-    while ( current ) {
-
-      if ( s.responseFields[ current ] ) {
-        jqXHR[ s.responseFields[ current ] ] = response;
-      }
-
-      // Apply the dataFilter if provided
-      if ( !prev && isSuccess && s.dataFilter ) {
-        response = s.dataFilter( response, s.dataType );
-      }
-
-      prev = current;
-      current = dataTypes.shift();
-
-      if ( current ) {
-
-        // There's only work to do if current dataType is non-auto
-        if ( current === "*" ) {
-
-          current = prev;
-
-          // Convert response if prev dataType is non-auto and differs from current
-        } else if ( prev !== "*" && prev !== current ) {
-
-          // Seek a direct converter
-          conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-          // If none found, seek a pair
-          if ( !conv ) {
-            for ( conv2 in converters ) {
-
-              // If conv2 outputs current
-              tmp = conv2.split( " " );
-              if ( tmp[ 1 ] === current ) {
-
-                // If prev can be converted to accepted input
-                conv = converters[ prev + " " + tmp[ 0 ] ] ||
-                    converters[ "* " + tmp[ 0 ] ];
-                if ( conv ) {
-
-                  // Condense equivalence converters
-                  if ( conv === true ) {
-                    conv = converters[ conv2 ];
-
-                    // Otherwise, insert the intermediate dataType
-                  } else if ( converters[ conv2 ] !== true ) {
-                    current = tmp[ 0 ];
-                    dataTypes.unshift( tmp[ 1 ] );
-                  }
-                  break;
-                }
-              }
-            }
-          }
-
-          // Apply converter (if not an equivalence)
-          if ( conv !== true ) {
-
-            // Unless errors are allowed to bubble, catch and return them
-            if ( conv && s.throws ) {
-              response = conv( response );
-            } else {
-              try {
-                response = conv( response );
-              } catch ( e ) {
-                return {
-                  state: "parsererror",
-                  error: conv ? e : "No conversion from " + prev + " to " + current
-                };
-              }
-            }
-          }
-        }
-      }
-    }
-
-    return { state: "success", data: response };
-  }
-
-  jQuery.extend( {
-
-    // Counter for holding the number of active queries
-    active: 0,
-
-    // Last-Modified header cache for next request
-    lastModified: {},
-    etag: {},
-
-    ajaxSettings: {
-      url: location.href,
-      type: "GET",
-      isLocal: rlocalProtocol.test( location.protocol ),
-      global: true,
-      processData: true,
-      async: true,
-      contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-
-      /*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-      accepts: {
-        "*": allTypes,
-        text: "text/plain",
-        html: "text/html",
-        xml: "application/xml, text/xml",
-        json: "application/json, text/javascript"
-      },
-
-      contents: {
-        xml: /\bxml\b/,
-        html: /\bhtml/,
-        json: /\bjson\b/
-      },
-
-      responseFields: {
-        xml: "responseXML",
-        text: "responseText",
-        json: "responseJSON"
-      },
-
-      // Data converters
-      // Keys separate source (or catchall "*") and destination types with a single space
-      converters: {
-
-        // Convert anything to text
-        "* text": String,
-
-        // Text to html (true = no transformation)
-        "text html": true,
-
-        // Evaluate text as a json expression
-        "text json": JSON.parse,
-
-        // Parse text as xml
-        "text xml": jQuery.parseXML
-      },
-
-      // For options that shouldn't be deep extended:
-      // you can add your own custom options here if
-      // and when you create one that shouldn't be
-      // deep extended (see ajaxExtend)
-      flatOptions: {
-        url: true,
-        context: true
-      }
-    },
-
-    // Creates a full fledged settings object into target
-    // with both ajaxSettings and settings fields.
-    // If target is omitted, writes into ajaxSettings.
-    ajaxSetup: function( target, settings ) {
-      return settings ?
-
-          // Building a settings object
-          ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-          // Extending ajaxSettings
-          ajaxExtend( jQuery.ajaxSettings, target );
-    },
-
-    ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-    ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-    // Main method
-    ajax: function( url, options ) {
-
-      // If url is an object, simulate pre-1.5 signature
-      if ( typeof url === "object" ) {
-        options = url;
-        url = undefined;
-      }
-
-      // Force options to be an object
-      options = options || {};
-
-      var transport,
-
-          // URL without anti-cache param
-          cacheURL,
-
-          // Response headers
-          responseHeadersString,
-          responseHeaders,
-
-          // timeout handle
-          timeoutTimer,
-
-          // Url cleanup var
-          urlAnchor,
-
-          // Request state (becomes false upon send and true upon completion)
-          completed,
-
-          // To know if global events are to be dispatched
-          fireGlobals,
-
-          // Loop variable
-          i,
-
-          // uncached part of the url
-          uncached,
-
-          // Create the final options object
-          s = jQuery.ajaxSetup( {}, options ),
-
-          // Callbacks context
-          callbackContext = s.context || s,
-
-          // Context for global events is callbackContext if it is a DOM node or jQuery collection
-          globalEventContext = s.context &&
-          ( callbackContext.nodeType || callbackContext.jquery ) ?
-              jQuery( callbackContext ) :
-              jQuery.event,
-
-          // Deferreds
-          deferred = jQuery.Deferred(),
-          completeDeferred = jQuery.Callbacks( "once memory" ),
-
-          // Status-dependent callbacks
-          statusCode = s.statusCode || {},
-
-          // Headers (they are sent all at once)
-          requestHeaders = {},
-          requestHeadersNames = {},
-
-          // Default abort message
-          strAbort = "canceled",
-
-          // Fake xhr
-          jqXHR = {
-            readyState: 0,
-
-            // Builds headers hashtable if needed
-            getResponseHeader: function( key ) {
-              var match;
-              if ( completed ) {
-                if ( !responseHeaders ) {
-                  responseHeaders = {};
-                  while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
-                    responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
-                  }
-                }
-                match = responseHeaders[ key.toLowerCase() ];
-              }
-              return match == null ? null : match;
-            },
-
-            // Raw string
-            getAllResponseHeaders: function() {
-              return completed ? responseHeadersString : null;
-            },
-
-            // Caches the header
-            setRequestHeader: function( name, value ) {
-              if ( completed == null ) {
-                name = requestHeadersNames[ name.toLowerCase() ] =
-                    requestHeadersNames[ name.toLowerCase() ] || name;
-                requestHeaders[ name ] = value;
-              }
-              return this;
-            },
-
-            // Overrides response content-type header
-            overrideMimeType: function( type ) {
-              if ( completed == null ) {
-                s.mimeType = type;
-              }
-              return this;
-            },
-
-            // Status-dependent callbacks
-            statusCode: function( map ) {
-              var code;
-              if ( map ) {
-                if ( completed ) {
-
-                  // Execute the appropriate callbacks
-                  jqXHR.always( map[ jqXHR.status ] );
-                } else {
-
-                  // Lazy-add the new callbacks in a way that preserves old ones
-                  for ( code in map ) {
-                    statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-                  }
-                }
-              }
-              return this;
-            },
-
-            // Cancel the request
-            abort: function( statusText ) {
-              var finalText = statusText || strAbort;
-              if ( transport ) {
-                transport.abort( finalText );
-              }
-              done( 0, finalText );
-              return this;
-            }
-          };
-
-      // Attach deferreds
-      deferred.promise( jqXHR );
-
-      // Add protocol if not provided (prefilters might expect it)
-      // Handle falsy url in the settings object (#10093: consistency with old signature)
-      // We also use the url parameter if available
-      s.url = ( ( url || s.url || location.href ) + "" )
-          .replace( rprotocol, location.protocol + "//" );
-
-      // Alias method option to type as per ticket #12004
-      s.type = options.method || options.type || s.method || s.type;
-
-      // Extract dataTypes list
-      s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
-
-      // A cross-domain request is in order when the origin doesn't match the current origin.
-      if ( s.crossDomain == null ) {
-        urlAnchor = document.createElement( "a" );
-
-        // Support: IE <=8 - 11, Edge 12 - 15
-        // IE throws exception on accessing the href property if url is malformed,
-        // e.g. http://example.com:80x/
-        try {
-          urlAnchor.href = s.url;
-
-          // Support: IE <=8 - 11 only
-          // Anchor's host property isn't correctly set when s.url is relative
-          urlAnchor.href = urlAnchor.href;
-          s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
-              urlAnchor.protocol + "//" + urlAnchor.host;
-        } catch ( e ) {
-
-          // If there is an error parsing the URL, assume it is crossDomain,
-          // it can be rejected by the transport if it is invalid
-          s.crossDomain = true;
-        }
-      }
-
-      // Convert data if not already a string
-      if ( s.data && s.processData && typeof s.data !== "string" ) {
-        s.data = jQuery.param( s.data, s.traditional );
-      }
-
-      // Apply prefilters
-      inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-      // If request was aborted inside a prefilter, stop there
-      if ( completed ) {
-        return jqXHR;
-      }
-
-      // We can fire global events as of now if asked to
-      // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
-      fireGlobals = jQuery.event && s.global;
-
-      // Watch for a new set of requests
-      if ( fireGlobals && jQuery.active++ === 0 ) {
-        jQuery.event.trigger( "ajaxStart" );
-      }
-
-      // Uppercase the type
-      s.type = s.type.toUpperCase();
-
-      // Determine if request has content
-      s.hasContent = !rnoContent.test( s.type );
-
-      // Save the URL in case we're toying with the If-Modified-Since
-      // and/or If-None-Match header later on
-      // Remove hash to simplify url manipulation
-      cacheURL = s.url.replace( rhash, "" );
-
-      // More options handling for requests with no content
-      if ( !s.hasContent ) {
-
-        // Remember the hash so we can put it back
-        uncached = s.url.slice( cacheURL.length );
-
-        // If data is available and should be processed, append data to url
-        if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
-          cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
-
-          // #9682: remove data so that it's not used in an eventual retry
-          delete s.data;
-        }
-
-        // Add or update anti-cache param if needed
-        if ( s.cache === false ) {
-          cacheURL = cacheURL.replace( rantiCache, "$1" );
-          uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
-        }
-
-        // Put hash and anti-cache on the URL that will be requested (gh-1732)
-        s.url = cacheURL + uncached;
-
-        // Change '%20' to '+' if this is encoded form body content (gh-2658)
-      } else if ( s.data && s.processData &&
-          ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
-        s.data = s.data.replace( r20, "+" );
-      }
-
-      // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-      if ( s.ifModified ) {
-        if ( jQuery.lastModified[ cacheURL ] ) {
-          jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
-        }
-        if ( jQuery.etag[ cacheURL ] ) {
-          jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
-        }
-      }
-
-      // Set the correct header, if data is being sent
-      if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-        jqXHR.setRequestHeader( "Content-Type", s.contentType );
-      }
-
-      // Set the Accepts header for the server, depending on the dataType
-      jqXHR.setRequestHeader(
-          "Accept",
-          s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
-              s.accepts[ s.dataTypes[ 0 ] ] +
-              ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-              s.accepts[ "*" ]
-      );
-
-      // Check for headers option
-      for ( i in s.headers ) {
-        jqXHR.setRequestHeader( i, s.headers[ i ] );
-      }
-
-      // Allow custom headers/mimetypes and early abort
-      if ( s.beforeSend &&
-          ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
-
-        // Abort if not done already and return
-        return jqXHR.abort();
-      }
-
-      // Aborting is no longer a cancellation
-      strAbort = "abort";
-
-      // Install callbacks on deferreds
-      completeDeferred.add( s.complete );
-      jqXHR.done( s.success );
-      jqXHR.fail( s.error );
-
-      // Get transport
-      transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-      // If no transport, we auto-abort
-      if ( !transport ) {
-        done( -1, "No Transport" );
-      } else {
-        jqXHR.readyState = 1;
-
-        // Send global event
-        if ( fireGlobals ) {
-          globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-        }
-
-        // If request was aborted inside ajaxSend, stop there
-        if ( completed ) {
-          return jqXHR;
-        }
-
-        // Timeout
-        if ( s.async && s.timeout > 0 ) {
-          timeoutTimer = window.setTimeout( function() {
-            jqXHR.abort( "timeout" );
-          }, s.timeout );
-        }
-
-        try {
-          completed = false;
-          transport.send( requestHeaders, done );
-        } catch ( e ) {
-
-          // Rethrow post-completion exceptions
-          if ( completed ) {
-            throw e;
-          }
-
-          // Propagate others as results
-          done( -1, e );
-        }
-      }
-
-      // Callback for when everything is done
-      function done( status, nativeStatusText, responses, headers ) {
-        var isSuccess, success, error, response, modified,
-            statusText = nativeStatusText;
-
-        // Ignore repeat invocations
-        if ( completed ) {
-          return;
-        }
-
-        completed = true;
-
-        // Clear timeout if it exists
-        if ( timeoutTimer ) {
-          window.clearTimeout( timeoutTimer );
-        }
-
-        // Dereference transport for early garbage collection
-        // (no matter how long the jqXHR object will be used)
-        transport = undefined;
-
-        // Cache response headers
-        responseHeadersString = headers || "";
-
-        // Set readyState
-        jqXHR.readyState = status > 0 ? 4 : 0;
-
-        // Determine if successful
-        isSuccess = status >= 200 && status < 300 || status === 304;
-
-        // Get response data
-        if ( responses ) {
-          response = ajaxHandleResponses( s, jqXHR, responses );
-        }
-
-        // Convert no matter what (that way responseXXX fields are always set)
-        response = ajaxConvert( s, response, jqXHR, isSuccess );
-
-        // If successful, handle type chaining
-        if ( isSuccess ) {
-
-          // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-          if ( s.ifModified ) {
-            modified = jqXHR.getResponseHeader( "Last-Modified" );
-            if ( modified ) {
-              jQuery.lastModified[ cacheURL ] = modified;
-            }
-            modified = jqXHR.getResponseHeader( "etag" );
-            if ( modified ) {
-              jQuery.etag[ cacheURL ] = modified;
-            }
-          }
-
-          // if no content
-          if ( status === 204 || s.type === "HEAD" ) {
-            statusText = "nocontent";
-
-            // if not modified
-          } else if ( status === 304 ) {
-            statusText = "notmodified";
-
-            // If we have data, let's convert it
-          } else {
-            statusText = response.state;
-            success = response.data;
-            error = response.error;
-            isSuccess = !error;
-          }
-        } else {
-
-          // Extract error from statusText and normalize for non-aborts
-          error = statusText;
-          if ( status || !statusText ) {
-            statusText = "error";
-            if ( status < 0 ) {
-              status = 0;
-            }
-          }
-        }
-
-        // Set data for the fake xhr object
-        jqXHR.status = status;
-        jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-        // Success/Error
-        if ( isSuccess ) {
-          deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-        } else {
-          deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-        }
-
-        // Status-dependent callbacks
-        jqXHR.statusCode( statusCode );
-        statusCode = undefined;
-
-        if ( fireGlobals ) {
-          globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-              [ jqXHR, s, isSuccess ? success : error ] );
-        }
-
-        // Complete
-        completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-        if ( fireGlobals ) {
-          globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
-          // Handle the global AJAX counter
-          if ( !( --jQuery.active ) ) {
-            jQuery.event.trigger( "ajaxStop" );
-          }
-        }
-      }
-
-      return jqXHR;
-    },
-
-    getJSON: function( url, data, callback ) {
-      return jQuery.get( url, data, callback, "json" );
-    },
-
-    getScript: function( url, callback ) {
-      return jQuery.get( url, undefined, callback, "script" );
-    }
-  } );
-
-  jQuery.each( [ "get", "post" ], function( i, method ) {
-    jQuery[ method ] = function( url, data, callback, type ) {
-
-      // Shift arguments if data argument was omitted
-      if ( isFunction( data ) ) {
-        type = type || callback;
-        callback = data;
-        data = undefined;
-      }
-
-      // The url can be an options object (which then must have .url)
-      return jQuery.ajax( jQuery.extend( {
-        url: url,
-        type: method,
-        dataType: type,
-        data: data,
-        success: callback
-      }, jQuery.isPlainObject( url ) && url ) );
-    };
-  } );
-
-
-  jQuery._evalUrl = function( url ) {
-    return jQuery.ajax( {
-      url: url,
-
-      // Make this explicit, since user can override this through ajaxSetup (#11264)
-      type: "GET",
-      dataType: "script",
-      cache: true,
-      async: false,
-      global: false,
-      "throws": true
-    } );
-  };
-
-
-  jQuery.fn.extend( {
-    wrapAll: function( html ) {
-      var wrap;
-
-      if ( this[ 0 ] ) {
-        if ( isFunction( html ) ) {
-          html = html.call( this[ 0 ] );
-        }
-
-        // The elements to wrap the target around
-        wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
-        if ( this[ 0 ].parentNode ) {
-          wrap.insertBefore( this[ 0 ] );
-        }
-
-        wrap.map( function() {
-          var elem = this;
-
-          while ( elem.firstElementChild ) {
-            elem = elem.firstElementChild;
-          }
-
-          return elem;
-        } ).append( this );
-      }
-
-      return this;
-    },
-
-    wrapInner: function( html ) {
-      if ( isFunction( html ) ) {
-        return this.each( function( i ) {
-          jQuery( this ).wrapInner( html.call( this, i ) );
-        } );
-      }
-
-      return this.each( function() {
-        var self = jQuery( this ),
-            contents = self.contents();
-
-        if ( contents.length ) {
-          contents.wrapAll( html );
-
-        } else {
-          self.append( html );
-        }
-      } );
-    },
-
-    wrap: function( html ) {
-      var htmlIsFunction = isFunction( html );
-
-      return this.each( function( i ) {
-        jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
-      } );
-    },
-
-    unwrap: function( selector ) {
-      this.parent( selector ).not( "body" ).each( function() {
-        jQuery( this ).replaceWith( this.childNodes );
-      } );
-      return this;
-    }
-  } );
-
-
-  jQuery.expr.pseudos.hidden = function( elem ) {
-    return !jQuery.expr.pseudos.visible( elem );
-  };
-  jQuery.expr.pseudos.visible = function( elem ) {
-    return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
-  };
-
-
-
-
-  jQuery.ajaxSettings.xhr = function() {
-    try {
-      return new window.XMLHttpRequest();
-    } catch ( e ) {}
-  };
-
-  var xhrSuccessStatus = {
-
-        // File protocol always yields status code 0, assume 200
-        0: 200,
-
-        // Support: IE <=9 only
-        // #1450: sometimes IE returns 1223 when it should be 204
-        1223: 204
-      },
-      xhrSupported = jQuery.ajaxSettings.xhr();
-
-  support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-  support.ajax = xhrSupported = !!xhrSupported;
-
-  jQuery.ajaxTransport( function( options ) {
-    var callback, errorCallback;
-
-    // Cross domain only allowed if supported through XMLHttpRequest
-    if ( support.cors || xhrSupported && !options.crossDomain ) {
-      return {
-        send: function( headers, complete ) {
-          var i,
-              xhr = options.xhr();
-
-          xhr.open(
-              options.type,
-              options.url,
-              options.async,
-              options.username,
-              options.password
-          );
-
-          // Apply custom fields if provided
-          if ( options.xhrFields ) {
-            for ( i in options.xhrFields ) {
-              xhr[ i ] = options.xhrFields[ i ];
-            }
-          }
-
-          // Override mime type if needed
-          if ( options.mimeType && xhr.overrideMimeType ) {
-            xhr.overrideMimeType( options.mimeType );
-          }
-
-          // X-Requested-With header
-          // For cross-domain requests, seeing as conditions for a preflight are
-          // akin to a jigsaw puzzle, we simply never set it to be sure.
-          // (it can always be set on a per-request basis or even using ajaxSetup)
-          // For same-domain requests, won't change header if already provided.
-          if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
-            headers[ "X-Requested-With" ] = "XMLHttpRequest";
-          }
-
-          // Set headers
-          for ( i in headers ) {
-            xhr.setRequestHeader( i, headers[ i ] );
-          }
-
-          // Callback
-          callback = function( type ) {
-            return function() {
-              if ( callback ) {
-                callback = errorCallback = xhr.onload =
-                    xhr.onerror = xhr.onabort = xhr.ontimeout =
-                        xhr.onreadystatechange = null;
-
-                if ( type === "abort" ) {
-                  xhr.abort();
-                } else if ( type === "error" ) {
-
-                  // Support: IE <=9 only
-                  // On a manual native abort, IE9 throws
-                  // errors on any property access that is not readyState
-                  if ( typeof xhr.status !== "number" ) {
-                    complete( 0, "error" );
-                  } else {
-                    complete(
-
-                        // File: protocol always yields status 0; see #8605, #14207
-                        xhr.status,
-                        xhr.statusText
-                    );
-                  }
-                } else {
-                  complete(
-                      xhrSuccessStatus[ xhr.status ] || xhr.status,
-                      xhr.statusText,
-
-                      // Support: IE <=9 only
-                      // IE9 has no XHR2 but throws on binary (trac-11426)
-                      // For XHR2 non-text, let the caller handle it (gh-2498)
-                      ( xhr.responseType || "text" ) !== "text"  ||
-                      typeof xhr.responseText !== "string" ?
-                          { binary: xhr.response } :
-                          { text: xhr.responseText },
-                      xhr.getAllResponseHeaders()
-                  );
-                }
-              }
-            };
-          };
-
-          // Listen to events
-          xhr.onload = callback();
-          errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
-
-          // Support: IE 9 only
-          // Use onreadystatechange to replace onabort
-          // to handle uncaught aborts
-          if ( xhr.onabort !== undefined ) {
-            xhr.onabort = errorCallback;
-          } else {
-            xhr.onreadystatechange = function() {
-
-              // Check readyState before timeout as it changes
-              if ( xhr.readyState === 4 ) {
-
-                // Allow onerror to be called first,
-                // but that will not handle a native abort
-                // Also, save errorCallback to a variable
-                // as xhr.onerror cannot be accessed
-                window.setTimeout( function() {
-                  if ( callback ) {
-                    errorCallback();
-                  }
-                } );
-              }
-            };
-          }
-
-          // Create the abort callback
-          callback = callback( "abort" );
-
-          try {
-
-            // Do send the request (this may raise an exception)
-            xhr.send( options.hasContent && options.data || null );
-          } catch ( e ) {
-
-            // #14683: Only rethrow if this hasn't been notified as an error yet
-            if ( callback ) {
-              throw e;
-            }
-          }
-        },
-
-        abort: function() {
-          if ( callback ) {
-            callback();
-          }
-        }
-      };
-    }
-  } );
-
-
-
-
-// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
-  jQuery.ajaxPrefilter( function( s ) {
-    if ( s.crossDomain ) {
-      s.contents.script = false;
-    }
-  } );
-
-// Install script dataType
-  jQuery.ajaxSetup( {
-    accepts: {
-      script: "text/javascript, application/javascript, " +
-          "application/ecmascript, application/x-ecmascript"
-    },
-    contents: {
-      script: /\b(?:java|ecma)script\b/
-    },
-    converters: {
-      "text script": function( text ) {
-        jQuery.globalEval( text );
-        return text;
-      }
-    }
-  } );
-
-// Handle cache's special case and crossDomain
-  jQuery.ajaxPrefilter( "script", function( s ) {
-    if ( s.cache === undefined ) {
-      s.cache = false;
-    }
-    if ( s.crossDomain ) {
-      s.type = "GET";
-    }
-  } );
-
-// Bind script tag hack transport
-  jQuery.ajaxTransport( "script", function( s ) {
-
-    // This transport only deals with cross domain requests
-    if ( s.crossDomain ) {
-      var script, callback;
-      return {
-        send: function( _, complete ) {
-          script = jQuery( "<script>" ).prop( {
-            charset: s.scriptCharset,
-            src: s.url
-          } ).on(
-              "load error",
-              callback = function( evt ) {
-                script.remove();
-                callback = null;
-                if ( evt ) {
-                  complete( evt.type === "error" ? 404 : 200, evt.type );
-                }
-              }
-          );
-
-          // Use native DOM manipulation to avoid our domManip AJAX trickery
-          document.head.appendChild( script[ 0 ] );
-        },
-        abort: function() {
-          if ( callback ) {
-            callback();
-          }
-        }
-      };
-    }
-  } );
-
-
-
-
-  var oldCallbacks = [],
-      rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-  jQuery.ajaxSetup( {
-    jsonp: "callback",
-    jsonpCallback: function() {
-      var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-      this[ callback ] = true;
-      return callback;
-    }
-  } );
-
-// Detect, normalize options and install callbacks for jsonp requests
-  jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-    var callbackName, overwritten, responseContainer,
-        jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-                "url" :
-                typeof s.data === "string" &&
-                ( s.contentType || "" )
-                    .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
-                rjsonp.test( s.data ) && "data"
-        );
-
-    // Handle iff the expected data type is "jsonp" or we have a parameter to set
-    if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-      // Get callback name, remembering preexisting value associated with it
-      callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
-          s.jsonpCallback() :
-          s.jsonpCallback;
-
-      // Insert callback into url or form data
-      if ( jsonProp ) {
-        s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-      } else if ( s.jsonp !== false ) {
-        s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-      }
-
-      // Use data converter to retrieve json after script execution
-      s.converters[ "script json" ] = function() {
-        if ( !responseContainer ) {
-          jQuery.error( callbackName + " was not called" );
-        }
-        return responseContainer[ 0 ];
-      };
-
-      // Force json dataType
-      s.dataTypes[ 0 ] = "json";
-
-      // Install callback
-      overwritten = window[ callbackName ];
-      window[ callbackName ] = function() {
-        responseContainer = arguments;
-      };
-
-      // Clean-up function (fires after converters)
-      jqXHR.always( function() {
-
-        // If previous value didn't exist - remove it
-        if ( overwritten === undefined ) {
-          jQuery( window ).removeProp( callbackName );
-
-          // Otherwise restore preexisting value
-        } else {
-          window[ callbackName ] = overwritten;
-        }
-
-        // Save back as free
-        if ( s[ callbackName ] ) {
-
-          // Make sure that re-using the options doesn't screw things around
-          s.jsonpCallback = originalSettings.jsonpCallback;
-
-          // Save the callback name for future use
-          oldCallbacks.push( callbackName );
-        }
-
-        // Call if it was a function and we have a response
-        if ( responseContainer && isFunction( overwritten ) ) {
-          overwritten( responseContainer[ 0 ] );
-        }
-
-        responseContainer = overwritten = undefined;
-      } );
-
-      // Delegate to script
-      return "script";
-    }
-  } );
-
-
-
-
-// Support: Safari 8 only
-// In Safari 8 documents created via document.implementation.createHTMLDocument
-// collapse sibling forms: the second one becomes a child of the first one.
-// Because of that, this security measure has to be disabled in Safari 8.
-// https://bugs.webkit.org/show_bug.cgi?id=137337
-  support.createHTMLDocument = ( function() {
-    var body = document.implementation.createHTMLDocument( "" ).body;
-    body.innerHTML = "<form></form><form></form>";
-    return body.childNodes.length === 2;
-  } )();
-
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-  jQuery.parseHTML = function( data, context, keepScripts ) {
-    if ( typeof data !== "string" ) {
-      return [];
-    }
-    if ( typeof context === "boolean" ) {
-      keepScripts = context;
-      context = false;
-    }
-
-    var base, parsed, scripts;
-
-    if ( !context ) {
-
-      // Stop scripts or inline event handlers from being executed immediately
-      // by using document.implementation
-      if ( support.createHTMLDocument ) {
-        context = document.implementation.createHTMLDocument( "" );
-
-        // Set the base href for the created document
-        // so any parsed elements with URLs
-        // are based on the document's URL (gh-2965)
-        base = context.createElement( "base" );
-        base.href = document.location.href;
-        context.head.appendChild( base );
-      } else {
-        context = document;
-      }
-    }
-
-    parsed = rsingleTag.exec( data );
-    scripts = !keepScripts && [];
-
-    // Single tag
-    if ( parsed ) {
-      return [ context.createElement( parsed[ 1 ] ) ];
-    }
-
-    parsed = buildFragment( [ data ], context, scripts );
-
-    if ( scripts && scripts.length ) {
-      jQuery( scripts ).remove();
-    }
-
-    return jQuery.merge( [], parsed.childNodes );
-  };
-
-
-  /**
-   * Load a url into a page
-   */
-  jQuery.fn.load = function( url, params, callback ) {
-    var selector, type, response,
-        self = this,
-        off = url.indexOf( " " );
-
-    if ( off > -1 ) {
-      selector = stripAndCollapse( url.slice( off ) );
-      url = url.slice( 0, off );
-    }
-
-    // If it's a function
-    if ( isFunction( params ) ) {
-
-      // We assume that it's the callback
-      callback = params;
-      params = undefined;
-
-      // Otherwise, build a param string
-    } else if ( params && typeof params === "object" ) {
-      type = "POST";
-    }
-
-    // If we have elements to modify, make the request
-    if ( self.length > 0 ) {
-      jQuery.ajax( {
-        url: url,
-
-        // If "type" variable is undefined, then "GET" method will be used.
-        // Make value of this field explicit since
-        // user can override it through ajaxSetup method
-        type: type || "GET",
-        dataType: "html",
-        data: params
-      } ).done( function( responseText ) {
-
-        // Save response for use in complete callback
-        response = arguments;
-
-        self.html( selector ?
-
-            // If a selector was specified, locate the right elements in a dummy div
-            // Exclude scripts to avoid IE 'Permission Denied' errors
-            jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
-            // Otherwise use the full result
-            responseText );
-
-        // If the request succeeds, this function gets "data", "status", "jqXHR"
-        // but they are ignored because response was set above.
-        // If it fails, this function gets "jqXHR", "status", "error"
-      } ).always( callback && function( jqXHR, status ) {
-        self.each( function() {
-          callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
-        } );
-      } );
-    }
-
-    return this;
-  };
-
-
-
-
-// Attach a bunch of functions for handling common AJAX events
-  jQuery.each( [
-    "ajaxStart",
-    "ajaxStop",
-    "ajaxComplete",
-    "ajaxError",
-    "ajaxSuccess",
-    "ajaxSend"
-  ], function( i, type ) {
-    jQuery.fn[ type ] = function( fn ) {
-      return this.on( type, fn );
-    };
-  } );
-
-
-
-
-  jQuery.expr.pseudos.animated = function( elem ) {
-    return jQuery.grep( jQuery.timers, function( fn ) {
-      return elem === fn.elem;
-    } ).length;
-  };
-
-
-
-
-  jQuery.offset = {
-    setOffset: function( elem, options, i ) {
-      var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
-          position = jQuery.css( elem, "position" ),
-          curElem = jQuery( elem ),
-          props = {};
-
-      // Set position first, in-case top/left are set even on static elem
-      if ( position === "static" ) {
-        elem.style.position = "relative";
-      }
-
-      curOffset = curElem.offset();
-      curCSSTop = jQuery.css( elem, "top" );
-      curCSSLeft = jQuery.css( elem, "left" );
-      calculatePosition = ( position === "absolute" || position === "fixed" ) &&
-          ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
-      // Need to be able to calculate position if either
-      // top or left is auto and position is either absolute or fixed
-      if ( calculatePosition ) {
-        curPosition = curElem.position();
-        curTop = curPosition.top;
-        curLeft = curPosition.left;
-
-      } else {
-        curTop = parseFloat( curCSSTop ) || 0;
-        curLeft = parseFloat( curCSSLeft ) || 0;
-      }
-
-      if ( isFunction( options ) ) {
-
-        // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
-        options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
-      }
-
-      if ( options.top != null ) {
-        props.top = ( options.top - curOffset.top ) + curTop;
-      }
-      if ( options.left != null ) {
-        props.left = ( options.left - curOffset.left ) + curLeft;
-      }
-
-      if ( "using" in options ) {
-        options.using.call( elem, props );
-
-      } else {
-        curElem.css( props );
-      }
-    }
-  };
-
-  jQuery.fn.extend( {
-
-    // offset() relates an element's border box to the document origin
-    offset: function( options ) {
-
-      // Preserve chaining for setter
-      if ( arguments.length ) {
-        return options === undefined ?
-            this :
-            this.each( function( i ) {
-              jQuery.offset.setOffset( this, options, i );
-            } );
-      }
-
-      var rect, win,
-          elem = this[ 0 ];
-
-      if ( !elem ) {
-        return;
-      }
-
-      // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
-      // Support: IE <=11 only
-      // Running getBoundingClientRect on a
-      // disconnected node in IE throws an error
-      if ( !elem.getClientRects().length ) {
-        return { top: 0, left: 0 };
-      }
-
-      // Get document-relative position by adding viewport scroll to viewport-relative gBCR
-      rect = elem.getBoundingClientRect();
-      win = elem.ownerDocument.defaultView;
-      return {
-        top: rect.top + win.pageYOffset,
-        left: rect.left + win.pageXOffset
-      };
-    },
-
-    // position() relates an element's margin box to its offset parent's padding box
-    // This corresponds to the behavior of CSS absolute positioning
-    position: function() {
-      if ( !this[ 0 ] ) {
-        return;
-      }
-
-      var offsetParent, offset, doc,
-          elem = this[ 0 ],
-          parentOffset = { top: 0, left: 0 };
-
-      // position:fixed elements are offset from the viewport, which itself always has zero offset
-      if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
-        // Assume position:fixed implies availability of getBoundingClientRect
-        offset = elem.getBoundingClientRect();
-
-      } else {
-        offset = this.offset();
-
-        // Account for the *real* offset parent, which can be the document or its root element
-        // when a statically positioned element is identified
-        doc = elem.ownerDocument;
-        offsetParent = elem.offsetParent || doc.documentElement;
-        while ( offsetParent &&
-        ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
-        jQuery.css( offsetParent, "position" ) === "static" ) {
-
-          offsetParent = offsetParent.parentNode;
-        }
-        if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
-
-          // Incorporate borders into its offset, since they are outside its content origin
-          parentOffset = jQuery( offsetParent ).offset();
-          parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
-          parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
-        }
-      }
-
-      // Subtract parent offsets and element margins
-      return {
-        top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-        left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
-      };
-    },
-
-    // This method will return documentElement in the following cases:
-    // 1) For the element inside the iframe without offsetParent, this method will return
-    //    documentElement of the parent window
-    // 2) For the hidden or detached element
-    // 3) For body or html element, i.e. in case of the html node - it will return itself
-    //
-    // but those exceptions were never presented as a real life use-cases
-    // and might be considered as more preferable results.
-    //
-    // This logic, however, is not guaranteed and can change at any point in the future
-    offsetParent: function() {
-      return this.map( function() {
-        var offsetParent = this.offsetParent;
-
-        while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
-          offsetParent = offsetParent.offsetParent;
-        }
-
-        return offsetParent || documentElement;
-      } );
-    }
-  } );
-
-// Create scrollLeft and scrollTop methods
-  jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
-    var top = "pageYOffset" === prop;
-
-    jQuery.fn[ method ] = function( val ) {
-      return access( this, function( elem, method, val ) {
-
-        // Coalesce documents and windows
-        var win;
-        if ( isWindow( elem ) ) {
-          win = elem;
-        } else if ( elem.nodeType === 9 ) {
-          win = elem.defaultView;
-        }
-
-        if ( val === undefined ) {
-          return win ? win[ prop ] : elem[ method ];
-        }
-
-        if ( win ) {
-          win.scrollTo(
-              !top ? val : win.pageXOffset,
-              top ? val : win.pageYOffset
-          );
-
-        } else {
-          elem[ method ] = val;
-        }
-      }, method, val, arguments.length );
-    };
-  } );
-
-// Support: Safari <=7 - 9.1, Chrome <=37 - 49
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-  jQuery.each( [ "top", "left" ], function( i, prop ) {
-    jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
-        function( elem, computed ) {
-          if ( computed ) {
-            computed = curCSS( elem, prop );
-
-            // If curCSS returns percentage, fallback to offset
-            return rnumnonpx.test( computed ) ?
-                jQuery( elem ).position()[ prop ] + "px" :
-                computed;
-          }
-        }
-    );
-  } );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-  jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-    jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-        function( defaultExtra, funcName ) {
-
-          // Margin is only for outerHeight, outerWidth
-          jQuery.fn[ funcName ] = function( margin, value ) {
-            var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-            return access( this, function( elem, type, value ) {
-              var doc;
-
-              if ( isWindow( elem ) ) {
-
-                // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
-                return funcName.indexOf( "outer" ) === 0 ?
-                    elem[ "inner" + name ] :
-                    elem.document.documentElement[ "client" + name ];
-              }
-
-              // Get document width or height
-              if ( elem.nodeType === 9 ) {
-                doc = elem.documentElement;
-
-                // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
-                // whichever is greatest
-                return Math.max(
-                    elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-                    elem.body[ "offset" + name ], doc[ "offset" + name ],
-                    doc[ "client" + name ]
-                );
-              }
-
-              return value === undefined ?
-
-                  // Get width or height on the element, requesting but not forcing parseFloat
-                  jQuery.css( elem, type, extra ) :
-
-                  // Set width or height on the element
-                  jQuery.style( elem, type, value, extra );
-            }, type, chainable ? margin : undefined, chainable );
-          };
-        } );
-  } );
-
-
-  jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
-      "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-      "change select submit keydown keypress keyup contextmenu" ).split( " " ),
-      function( i, name ) {
-
-        // Handle event binding
-        jQuery.fn[ name ] = function( data, fn ) {
-          return arguments.length > 0 ?
-              this.on( name, null, data, fn ) :
-              this.trigger( name );
-        };
-      } );
-
-  jQuery.fn.extend( {
-    hover: function( fnOver, fnOut ) {
-      return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-    }
-  } );
-
-
-
-
-  jQuery.fn.extend( {
-
-    bind: function( types, data, fn ) {
-      return this.on( types, null, data, fn );
-    },
-    unbind: function( types, fn ) {
-      return this.off( types, null, fn );
-    },
-
-    delegate: function( selector, types, data, fn ) {
-      return this.on( types, selector, data, fn );
-    },
-    undelegate: function( selector, types, fn ) {
-
-      // ( namespace ) or ( selector, types [, fn] )
-      return arguments.length === 1 ?
-          this.off( selector, "**" ) :
-          this.off( types, selector || "**", fn );
-    }
-  } );
-
-// Bind a function to a context, optionally partially applying any
-// arguments.
-// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
-// However, it is not slated for removal any time soon
-  jQuery.proxy = function( fn, context ) {
-    var tmp, args, proxy;
-
-    if ( typeof context === "string" ) {
-      tmp = fn[ context ];
-      context = fn;
-      fn = tmp;
-    }
-
-    // Quick check to determine if target is callable, in the spec
-    // this throws a TypeError, but we will just return undefined.
-    if ( !isFunction( fn ) ) {
-      return undefined;
-    }
-
-    // Simulated bind
-    args = slice.call( arguments, 2 );
-    proxy = function() {
-      return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-    };
-
-    // Set the guid of unique handler to the same of original handler, so it can be removed
-    proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-    return proxy;
-  };
-
-  jQuery.holdReady = function( hold ) {
-    if ( hold ) {
-      jQuery.readyWait++;
-    } else {
-      jQuery.ready( true );
-    }
-  };
-  jQuery.isArray = Array.isArray;
-  jQuery.parseJSON = JSON.parse;
-  jQuery.nodeName = nodeName;
-  jQuery.isFunction = isFunction;
-  jQuery.isWindow = isWindow;
-  jQuery.camelCase = camelCase;
-  jQuery.type = toType;
-
-  jQuery.now = Date.now;
-
-  jQuery.isNumeric = function( obj ) {
-
-    // As of jQuery 3.0, isNumeric is limited to
-    // strings and numbers (primitives or objects)
-    // that can be coerced to finite numbers (gh-2662)
-    var type = jQuery.type( obj );
-    return ( type === "number" || type === "string" ) &&
-
-        // parseFloat NaNs numeric-cast false positives ("")
-        // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-        // subtraction forces infinities to NaN
-        !isNaN( obj - parseFloat( obj ) );
-  };
-
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-  if ( typeof define === "function" && define.amd ) {
-    define( "jquery", [], function() {
-      return jQuery;
-    } );
-  }
-
-
-
-
-  var
-
-      // Map over jQuery in case of overwrite
-      _jQuery = window.jQuery,
-
-      // Map over the $ in case of overwrite
-      _$ = window.$;
-
-  jQuery.noConflict = function( deep ) {
-    if ( window.$ === jQuery ) {
-      window.$ = _$;
-    }
-
-    if ( deep && window.jQuery === jQuery ) {
-      window.jQuery = _jQuery;
-    }
-
-    return jQuery;
-  };
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-  if ( !noGlobal ) {
-    window.jQuery = window.$ = jQuery;
-  }
-
-
-
-
-  return jQuery;
-} );
\ No newline at end of file
diff --git a/ui/legacy/lib/jquery.md5.js b/ui/legacy/lib/jquery.md5.js
deleted file mode 100644
index aa17b91..0000000
--- a/ui/legacy/lib/jquery.md5.js
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * jQuery MD5 Plugin 1.2.1
- * https://github.com/blueimp/jQuery-MD5
- *
- * Copyright 2010, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://creativecommons.org/licenses/MIT/
- * 
- * Based on
- * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
- * Digest Algorithm, as defined in RFC 1321.
- * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
- * Distributed under the BSD License
- * See http://pajhome.org.uk/crypt/md5 for more info.
- */
-
-/*jslint bitwise: true */
-/*global unescape, jQuery */
-
-(function ($) {
-  'use strict';
-
-  /*
-   * Add integers, wrapping at 2^32. This uses 16-bit operations internally
-   * to work around bugs in some JS interpreters.
-   */
-  function safe_add(x, y) {
-    var lsw = (x & 0xFFFF) + (y & 0xFFFF),
-        msw = (x >> 16) + (y >> 16) + (lsw >> 16);
-    return (msw << 16) | (lsw & 0xFFFF);
-  }
-
-  /*
-   * Bitwise rotate a 32-bit number to the left.
-   */
-  function bit_rol(num, cnt) {
-    return (num << cnt) | (num >>> (32 - cnt));
-  }
-
-  /*
-   * These functions implement the four basic operations the algorithm uses.
-   */
-  function md5_cmn(q, a, b, x, s, t) {
-    return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
-  }
-  function md5_ff(a, b, c, d, x, s, t) {
-    return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
-  }
-  function md5_gg(a, b, c, d, x, s, t) {
-    return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
-  }
-  function md5_hh(a, b, c, d, x, s, t) {
-    return md5_cmn(b ^ c ^ d, a, b, x, s, t);
-  }
-  function md5_ii(a, b, c, d, x, s, t) {
-    return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
-  }
-
-  /*
-   * Calculate the MD5 of an array of little-endian words, and a bit length.
-   */
-  function binl_md5(x, len) {
-    /* append padding */
-    x[len >> 5] |= 0x80 << ((len) % 32);
-    x[(((len + 64) >>> 9) << 4) + 14] = len;
-
-    var i, olda, oldb, oldc, oldd,
-        a =  1732584193,
-        b = -271733879,
-        c = -1732584194,
-        d =  271733878;
-
-    for (i = 0; i < x.length; i += 16) {
-      olda = a;
-      oldb = b;
-      oldc = c;
-      oldd = d;
-
-      a = md5_ff(a, b, c, d, x[i],       7, -680876936);
-      d = md5_ff(d, a, b, c, x[i +  1], 12, -389564586);
-      c = md5_ff(c, d, a, b, x[i +  2], 17,  606105819);
-      b = md5_ff(b, c, d, a, x[i +  3], 22, -1044525330);
-      a = md5_ff(a, b, c, d, x[i +  4],  7, -176418897);
-      d = md5_ff(d, a, b, c, x[i +  5], 12,  1200080426);
-      c = md5_ff(c, d, a, b, x[i +  6], 17, -1473231341);
-      b = md5_ff(b, c, d, a, x[i +  7], 22, -45705983);
-      a = md5_ff(a, b, c, d, x[i +  8],  7,  1770035416);
-      d = md5_ff(d, a, b, c, x[i +  9], 12, -1958414417);
-      c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
-      b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
-      a = md5_ff(a, b, c, d, x[i + 12],  7,  1804603682);
-      d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
-      c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
-      b = md5_ff(b, c, d, a, x[i + 15], 22,  1236535329);
-
-      a = md5_gg(a, b, c, d, x[i +  1],  5, -165796510);
-      d = md5_gg(d, a, b, c, x[i +  6],  9, -1069501632);
-      c = md5_gg(c, d, a, b, x[i + 11], 14,  643717713);
-      b = md5_gg(b, c, d, a, x[i],      20, -373897302);
-      a = md5_gg(a, b, c, d, x[i +  5],  5, -701558691);
-      d = md5_gg(d, a, b, c, x[i + 10],  9,  38016083);
-      c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
-      b = md5_gg(b, c, d, a, x[i +  4], 20, -405537848);
-      a = md5_gg(a, b, c, d, x[i +  9],  5,  568446438);
-      d = md5_gg(d, a, b, c, x[i + 14],  9, -1019803690);
-      c = md5_gg(c, d, a, b, x[i +  3], 14, -187363961);
-      b = md5_gg(b, c, d, a, x[i +  8], 20,  1163531501);
-      a = md5_gg(a, b, c, d, x[i + 13],  5, -1444681467);
-      d = md5_gg(d, a, b, c, x[i +  2],  9, -51403784);
-      c = md5_gg(c, d, a, b, x[i +  7], 14,  1735328473);
-      b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
-
-      a = md5_hh(a, b, c, d, x[i +  5],  4, -378558);
-      d = md5_hh(d, a, b, c, x[i +  8], 11, -2022574463);
-      c = md5_hh(c, d, a, b, x[i + 11], 16,  1839030562);
-      b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
-      a = md5_hh(a, b, c, d, x[i +  1],  4, -1530992060);
-      d = md5_hh(d, a, b, c, x[i +  4], 11,  1272893353);
-      c = md5_hh(c, d, a, b, x[i +  7], 16, -155497632);
-      b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
-      a = md5_hh(a, b, c, d, x[i + 13],  4,  681279174);
-      d = md5_hh(d, a, b, c, x[i],      11, -358537222);
-      c = md5_hh(c, d, a, b, x[i +  3], 16, -722521979);
-      b = md5_hh(b, c, d, a, x[i +  6], 23,  76029189);
-      a = md5_hh(a, b, c, d, x[i +  9],  4, -640364487);
-      d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
-      c = md5_hh(c, d, a, b, x[i + 15], 16,  530742520);
-      b = md5_hh(b, c, d, a, x[i +  2], 23, -995338651);
-
-      a = md5_ii(a, b, c, d, x[i],       6, -198630844);
-      d = md5_ii(d, a, b, c, x[i +  7], 10,  1126891415);
-      c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
-      b = md5_ii(b, c, d, a, x[i +  5], 21, -57434055);
-      a = md5_ii(a, b, c, d, x[i + 12],  6,  1700485571);
-      d = md5_ii(d, a, b, c, x[i +  3], 10, -1894986606);
-      c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
-      b = md5_ii(b, c, d, a, x[i +  1], 21, -2054922799);
-      a = md5_ii(a, b, c, d, x[i +  8],  6,  1873313359);
-      d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
-      c = md5_ii(c, d, a, b, x[i +  6], 15, -1560198380);
-      b = md5_ii(b, c, d, a, x[i + 13], 21,  1309151649);
-      a = md5_ii(a, b, c, d, x[i +  4],  6, -145523070);
-      d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
-      c = md5_ii(c, d, a, b, x[i +  2], 15,  718787259);
-      b = md5_ii(b, c, d, a, x[i +  9], 21, -343485551);
-
-      a = safe_add(a, olda);
-      b = safe_add(b, oldb);
-      c = safe_add(c, oldc);
-      d = safe_add(d, oldd);
-    }
-    return [a, b, c, d];
-  }
-
-  /*
-   * Convert an array of little-endian words to a string
-   */
-  function binl2rstr(input) {
-    var i,
-        output = '';
-    for (i = 0; i < input.length * 32; i += 8) {
-      output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
-    }
-    return output;
-  }
-
-  /*
-   * Convert a raw string to an array of little-endian words
-   * Characters >255 have their high-byte silently ignored.
-   */
-  function rstr2binl(input) {
-    var i,
-        output = [];
-    output[(input.length >> 2) - 1] = undefined;
-    for (i = 0; i < output.length; i += 1) {
-      output[i] = 0;
-    }
-    for (i = 0; i < input.length * 8; i += 8) {
-      output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
-    }
-    return output;
-  }
-
-  /*
-   * Calculate the MD5 of a raw string
-   */
-  function rstr_md5(s) {
-    return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
-  }
-
-  /*
-   * Calculate the HMAC-MD5, of a key and some data (raw strings)
-   */
-  function rstr_hmac_md5(key, data) {
-    var i,
-        bkey = rstr2binl(key),
-        ipad = [],
-        opad = [],
-        hash;
-    ipad[15] = opad[15] = undefined;                        
-    if (bkey.length > 16) {
-      bkey = binl_md5(bkey, key.length * 8);
-    }
-    for (i = 0; i < 16; i += 1) {
-      ipad[i] = bkey[i] ^ 0x36363636;
-      opad[i] = bkey[i] ^ 0x5C5C5C5C;
-    }
-    hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
-    return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
-  }
-
-  /*
-   * Convert a raw string to a hex string
-   */
-  function rstr2hex(input) {
-    var hex_tab = '0123456789abcdef',
-        output = '',
-        x,
-        i;
-    for (i = 0; i < input.length; i += 1) {
-      x = input.charCodeAt(i);
-      output += hex_tab.charAt((x >>> 4) & 0x0F) +
-        hex_tab.charAt(x & 0x0F);
-    }
-    return output;
-  }
-
-  /*
-   * Encode a string as utf-8
-   */
-  function str2rstr_utf8(input) {
-    return unescape(encodeURIComponent(input));
-  }
-
-  /*
-   * Take string arguments and return either raw or hex encoded strings
-   */
-  function raw_md5(s) {
-    return rstr_md5(str2rstr_utf8(s));
-  }
-  function hex_md5(s) {
-    return rstr2hex(raw_md5(s));
-  }
-  function raw_hmac_md5(k, d) {
-    return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d));
-  }
-  function hex_hmac_md5(k, d) {
-    return rstr2hex(raw_hmac_md5(k, d));
-  }
-  
-  $.md5 = function (string, key, raw) {
-    if (!key) {
-      if (!raw) {
-        return hex_md5(string);
-      } else {
-        return raw_md5(string);
-      }
-    }
-    if (!raw) {
-      return hex_hmac_md5(key, string);
-    } else {
-      return raw_hmac_md5(key, string);
-    }
-  };
-  
-}(typeof jQuery === 'function' ? jQuery : this));
diff --git a/ui/legacy/lib/jquery.tokeninput.js b/ui/legacy/lib/jquery.tokeninput.js
deleted file mode 100644
index e4b341c..0000000
--- a/ui/legacy/lib/jquery.tokeninput.js
+++ /dev/null
@@ -1,928 +0,0 @@
-/*
- * jQuery Plugin: Tokenizing Autocomplete Text Entry
- * Version 1.6.0
- *
- * Copyright (c) 2009 James Smith (http://loopj.com)
- * Licensed jointly under the GPL and MIT licenses,
- * choose which one suits your project best!
- *
- */
-
-(function ($) {
-// Default settings
-var DEFAULT_SETTINGS = {
-	// Search settings
-    method: "GET",
-    contentType: "json",
-    queryParam: "q",
-    searchDelay: 300,
-    minChars: 1,
-    propertyToSearch: "name",
-    jsonContainer: null,
-
-	// Display settings
-    hintText: "Type in a search term",
-    noResultsText: "No results",
-    searchingText: "Searching...",
-    deleteText: "&times;",
-    animateDropdown: true,
-
-	// Tokenization settings
-    tokenLimit: null,
-    tokenDelimiter: ",",
-    preventDuplicates: false,
-
-	// Output settings
-    tokenValue: "id",
-
-	// Prepopulation settings
-    prePopulate: null,
-    processPrePopulate: false,
-
-	// Manipulation settings
-    idPrefix: "token-input-",
-
-	// Formatters
-    resultsFormatter: function(item){ return "<li>" + item[this.propertyToSearch]+ "</li>" },
-    tokenFormatter: function(item) { return "<li><p>" + item[this.propertyToSearch] + "</p></li>" },
-
-	// Callbacks
-    onResult: null,
-    onAdd: null,
-    onDelete: null,
-    onReady: null
-};
-
-// Default classes to use when theming
-var DEFAULT_CLASSES = {
-    tokenList: "token-input-list",
-    token: "token-input-token",
-    tokenDelete: "token-input-delete-token",
-    selectedToken: "token-input-selected-token",
-    highlightedToken: "token-input-highlighted-token",
-    dropdown: "token-input-dropdown",
-    dropdownItem: "token-input-dropdown-item",
-    dropdownItem2: "token-input-dropdown-item2",
-    selectedDropdownItem: "token-input-selected-dropdown-item",
-    inputToken: "token-input-input-token"
-};
-
-// Input box position "enum"
-var POSITION = {
-    BEFORE: 0,
-    AFTER: 1,
-    END: 2
-};
-
-// Keys "enum"
-var KEY = {
-    BACKSPACE: 8,
-    TAB: 9,
-    ENTER: 13,
-    ESCAPE: 27,
-    SPACE: 32,
-    PAGE_UP: 33,
-    PAGE_DOWN: 34,
-    END: 35,
-    HOME: 36,
-    LEFT: 37,
-    UP: 38,
-    RIGHT: 39,
-    DOWN: 40,
-    NUMPAD_ENTER: 108,
-    COMMA: 188
-};
-
-// Additional public (exposed) methods
-var methods = {
-    init: function(url_or_data_or_function, options) {
-        var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
-
-        return this.each(function () {
-            $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
-        });
-    },
-    clear: function() {
-        this.data("tokenInputObject").clear();
-        return this;
-    },
-    add: function(item) {
-        this.data("tokenInputObject").add(item);
-        return this;
-    },
-    remove: function(item) {
-        this.data("tokenInputObject").remove(item);
-        return this;
-    },
-    get: function() {
-    	return this.data("tokenInputObject").getTokens();
-   	}
-}
-
-//jquery function that sets the position of the cursor inside a text input
-$.fn.selectRange = function(start, end) {
-    return this.each(function() {
-        if (this.setSelectionRange) {
-            this.focus();
-            this.setSelectionRange(start, end);
-        } else if (this.createTextRange) {
-            var range = this.createTextRange();
-            range.collapse(true);
-            range.moveEnd('character', end);
-            range.moveStart('character', start);
-            range.select();
-        }
-    });
-};
-
-// Expose the .tokenInput function to jQuery as a plugin
-$.fn.tokenInput = function (method) {
-    // Method calling and initialization logic
-    if(methods[method]) {
-        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-    } else {
-        return methods.init.apply(this, arguments);
-    }
-};
-
-// TokenList class for each input
-$.TokenList = function (input, url_or_data, settings) {
-    //
-    // Initialization
-    //
-
-    // Configure the data source
-    if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") {
-        // Set the url to query against
-        settings.url = url_or_data;
-
-        // If the URL is a function, evaluate it here to do our initalization work
-        var url = computeURL();
-
-        // Make a smart guess about cross-domain if it wasn't explicitly specified
-        if(settings.crossDomain === undefined) {
-            if(url.indexOf("://") === -1) {
-                settings.crossDomain = false;
-            } else {
-                settings.crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]);
-            }
-        }
-    } else if(typeof(url_or_data) === "object") {
-        // Set the local data to search through
-        settings.local_data = url_or_data;
-    }
-
-    // Build class names
-    if(settings.classes) {
-        // Use custom class names
-        settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes);
-    } else if(settings.theme) {
-        // Use theme-suffixed default class names
-        settings.classes = {};
-        $.each(DEFAULT_CLASSES, function(key, value) {
-            settings.classes[key] = value + "-" + settings.theme;
-        });
-    } else {
-        settings.classes = DEFAULT_CLASSES;
-    }
-
-
-    // Save the tokens
-    var saved_tokens = [];
-
-    // Keep track of the number of tokens in the list
-    var token_count = 0;
-
-    // Basic cache to save on db hits
-    var cache = new $.TokenList.Cache();
-
-    // Keep track of the timeout, old vals
-    var timeout;
-    var input_val;
-
-    // Create a new text input an attach keyup events
-    var input_box = $("<input type=\"text\"  autocomplete=\"off\">")
-        .css({
-            outline: "none"
-        })
-        .attr("id", settings.idPrefix + input.id)
-        .attr("name", settings.idPrefix + input.id)
-        .focus(function () {
-            if (settings.tokenLimit === null || settings.tokenLimit !== token_count) {
-                show_dropdown_hint();
-            }
-        })
-        .keyup(function() {
-            var contenu = $(this).val();
-            var longueur = contenu.length;
-            var lastChar = contenu.substr(contenu.length - 1);
-
-            if ((lastChar === ',' || lastChar === ' ') && ($.trim($(this).val()).length >= 1))
-            {
-                var custom_token = { id : $.trim($(this).val().substring(0, longueur - 1)), name : $.trim($(this).val().substring(0, longueur - 1)) };
-
-                add_token(custom_token);
-                $(this).val("");
-            }
-        })
-        .blur(function() {
-            hide_dropdown();
-
-            if ($.trim($(this).val()) != '')
-            {
-                var custom_token = { id : $.trim($(this).val()), name : $.trim($(this).val()) };
-
-                add_token(custom_token);
-                $(this).val("");
-            }
-        })
-        .bind("keyup keydown blur update", resize_input)
-        .keydown(function (event) {
-            var previous_token;
-            var next_token;
-
-            switch(event.keyCode) {
-                case KEY.LEFT:
-                case KEY.RIGHT:
-                case KEY.UP:
-                case KEY.DOWN:
-                    if(!$(this).val()) {
-                        previous_token = input_token.prev();
-                        next_token = input_token.next();
-
-                        if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) {
-                            // Check if there is a previous/next token and it is selected
-                            if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) {
-                                deselect_token($(selected_token), POSITION.BEFORE);
-                            } else {
-                                deselect_token($(selected_token), POSITION.AFTER);
-                            }
-                        } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) {
-                            // We are moving left, select the previous token if it exists
-                            select_token($(previous_token.get(0)));
-                        } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) {
-                            // We are moving right, select the next token if it exists
-                            select_token($(next_token.get(0)));
-                        }
-                    } else {
-                        var dropdown_item = null;
-
-                        if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) {
-                            dropdown_item = $(selected_dropdown_item).next();
-                        } else {
-                            dropdown_item = $(selected_dropdown_item).prev();
-                        }
-
-                        if(dropdown_item.length) {
-                            select_dropdown_item(dropdown_item);
-                        }
-                        return false;
-                    }
-                    break;
-
-                case KEY.BACKSPACE:
-                    previous_token = input_token.prev();
-
-                    if(!$(this).val().length) {
-                        if(selected_token) {
-                            delete_token($(selected_token));
-                            hidden_input.change();
-                        } else if(previous_token.length) {
-                            select_token($(previous_token.get(0)));
-                        }
-
-                        return false;
-                    } else if($(this).val().length === 1) {
-                        hide_dropdown();
-                    } else {
-                        // set a timeout just long enough to let this function finish.
-                        setTimeout(function(){do_search();}, 5);
-                    }
-                    break;
-
-                case KEY.TAB:
-                case KEY.ENTER: if(selected_dropdown_item) {
-                    add_token($(selected_dropdown_item).data("tokeninput"));
-                    hidden_input.change();
-                    return false;
-                  }
-                  break;
-                case KEY.NUMPAD_ENTER: if(selected_dropdown_item) {
-                    add_token($(selected_dropdown_item).data("tokeninput"));
-                    hidden_input.change();
-                    return false;
-                  }
-                  break;
-                case KEY.COMMA:
-
-                case KEY.ESCAPE:
-                  hide_dropdown();
-                  return true;
-
-                default:
-                    if(String.fromCharCode(event.which)) {
-                        // set a timeout just long enough to let this function finish.
-                        setTimeout(function(){do_search();}, 5);
-                    }
-                    break;
-            }
-        })
-        .keyup(function(event) {
-            var previous_token;
-            var next_token;
-
-            switch(event.keyCode) {
-                case KEY.ENTER:
-                    break;
-        }});
-
-    // Keep a reference to the original input box
-    var hidden_input = $(input)
-                           .hide()
-                           .val("")
-                           .focus(function () {
-                               input_box.focus();
-                           })
-                           .blur(function () {
-                               input_box.blur();
-                           });
-
-    // Keep a reference to the selected token and dropdown item
-    var selected_token = null;
-    var selected_token_index = 0;
-    var selected_dropdown_item = null;
-
-    // The list to store the token items in
-    var token_list = $("<ul />")
-        .addClass(settings.classes.tokenList)
-        .click(function (event) {
-            var li = $(event.target).closest("li");
-            if(li && li.get(0) && $.data(li.get(0), "tokeninput")) {
-                toggle_select_token(li);
-            } else {
-                // Deselect selected token
-                if(selected_token) {
-                    deselect_token($(selected_token), POSITION.END);
-                }
-
-                // Focus input box
-                input_box.focus();
-            }
-        })
-        .mouseover(function (event) {
-            var li = $(event.target).closest("li");
-            if(li && selected_token !== this) {
-                li.addClass(settings.classes.highlightedToken);
-            }
-        })
-        .mouseout(function (event) {
-            var li = $(event.target).closest("li");
-            if(li && selected_token !== this) {
-                li.removeClass(settings.classes.highlightedToken);
-            }
-        })
-        .insertBefore(hidden_input);
-
-    // The token holding the input box
-    var input_token = $("<li />")
-        .addClass(settings.classes.inputToken)
-        .appendTo(token_list)
-        .append(input_box);
-
-    // The list to store the dropdown items in
-    var dropdown = $("<div>")
-        .addClass(settings.classes.dropdown)
-        .appendTo("body")
-        .hide();
-
-    // Magic element to help us resize the text input
-    var input_resizer = $("<tester/>")
-        .insertAfter(input_box)
-        .css({
-            position: "absolute",
-            top: -9999,
-            left: -9999,
-            width: "auto",
-            fontSize: input_box.css("fontSize"),
-            fontFamily: input_box.css("fontFamily"),
-            fontWeight: input_box.css("fontWeight"),
-            letterSpacing: input_box.css("letterSpacing"),
-            whiteSpace: "nowrap"
-        });
-
-    // Pre-populate list if items exist
-    hidden_input.val("");
-    var li_data = settings.prePopulate || hidden_input.data("pre");
-    if(settings.processPrePopulate && $.isFunction(settings.onResult)) {
-        li_data = settings.onResult.call(hidden_input, li_data);
-    }
-    if(li_data && li_data.length) {
-        $.each(li_data, function (index, value) {
-            insert_token(value);
-            checkTokenLimit();
-        });
-    }
-
-    // Initialization is done
-    if($.isFunction(settings.onReady)) {
-        settings.onReady.call();
-    }
-
-    //
-    // Public functions
-    //
-
-    this.clear = function() {
-        token_list.children("li").each(function() {
-            if ($(this).children("input").length === 0) {
-                delete_token($(this));
-            }
-        });
-    }
-
-    this.add = function(item) {
-        add_token(item);
-    }
-
-    this.remove = function(item) {
-        token_list.children("li").each(function() {
-            if ($(this).children("input").length === 0) {
-                var currToken = $(this).data("tokeninput");
-                var match = true;
-                for (var prop in item) {
-                    if (item[prop] !== currToken[prop]) {
-                        match = false;
-                        break;
-                    }
-                }
-                if (match) {
-                    delete_token($(this));
-                }
-            }
-        });
-    }
-
-    this.getTokens = function() {
-   		return saved_tokens;
-   	}
-
-    //
-    // Private functions
-    //
-
-    function checkTokenLimit() {
-        if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
-            input_box.hide();
-            hide_dropdown();
-            return;
-        }
-    }
-
-    function resize_input() {
-        if(input_val === (input_val = input_box.val())) {return;}
-
-        // Enter new content into resizer and resize input accordingly
-        var escaped = input_val.replace(/&/g, '&amp;').replace(/\s/g,' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');
-        input_resizer.html(escaped);
-        input_box.width(input_resizer.width() + 30);
-    }
-
-    function is_printable_character(keycode) {
-        return ((keycode >= 48 && keycode <= 90) ||     // 0-1a-z
-                (keycode >= 96 && keycode <= 111) ||    // numpad 0-9 + - / * .
-                (keycode >= 186 && keycode <= 192) ||   // ; = , - . / ^
-                (keycode >= 219 && keycode <= 222));    // ( \ ) '
-    }
-
-    // Inner function to a token to the list
-    function insert_token(item) {
-        var this_token = settings.tokenFormatter(item);
-        this_token = $(this_token)
-          .addClass(settings.classes.token)
-          .insertBefore(input_token);
-
-        // The 'delete token' button
-        $("<span>" + settings.deleteText + "</span>")
-            .addClass(settings.classes.tokenDelete)
-            .appendTo(this_token)
-            .click(function () {
-                delete_token($(this).parent());
-                hidden_input.change();
-                return false;
-            });
-
-        // Store data on the token
-        var token_data = {"id": item.id};
-        token_data[settings.propertyToSearch] = item[settings.propertyToSearch];
-        $.data(this_token.get(0), "tokeninput", item);
-
-        // Save this token for duplicate checking
-        saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index));
-        selected_token_index++;
-
-        // Update the hidden input
-        update_hidden_input(saved_tokens, hidden_input);
-
-        token_count += 1;
-
-        // Check the token limit
-        if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
-            input_box.hide();
-            hide_dropdown();
-        }
-
-        return this_token;
-    }
-
-    // Add a token to the token list based on user input
-    function add_token (item) {
-        var callback = settings.onAdd;
-
-        // See if the token already exists and select it if we don't want duplicates
-        if(token_count > 0 && settings.preventDuplicates) {
-            var found_existing_token = null;
-            token_list.children().each(function () {
-                var existing_token = $(this);
-                var existing_data = $.data(existing_token.get(0), "tokeninput");
-                if(existing_data && existing_data.name === item.name) {
-                    found_existing_token = existing_token;
-                    return false;
-                }
-            });
-
-            if (found_existing_token) {
-                found_existing_token.addClass(settings.classes.selectedToken).delay(900).queue(function() {
-                    $(this).removeClass(settings.classes.selectedToken);
-                    $(this).dequeue();
-                });
-
-                input_box.val("");
-
-                return;
-            }
-        }
-
-        // Insert the new tokens
-        if(settings.tokenLimit == null || token_count < settings.tokenLimit) {
-            insert_token(item);
-            checkTokenLimit();
-        }
-
-        // Clear input box
-        input_box.val("");
-
-        // Don't show the help dropdown, they've got the idea
-        hide_dropdown();
-
-        // Execute the onAdd callback if defined
-        if($.isFunction(callback)) {
-            callback.call(hidden_input,item);
-        }
-    }
-
-    // Select a token in the token list
-    function select_token (token) {
-        token.addClass(settings.classes.selectedToken);
-        selected_token = token.get(0);
-
-        // Hide input box
-        input_box.val("");
-
-        // Hide dropdown if it is visible (eg if we clicked to select token)
-        hide_dropdown();
-    }
-
-    // Deselect a token in the token list
-    function deselect_token (token, position) {
-        token.removeClass(settings.classes.selectedToken);
-        selected_token = null;
-
-        if(position === POSITION.BEFORE) {
-            input_token.insertBefore(token);
-            selected_token_index--;
-        } else if(position === POSITION.AFTER) {
-            input_token.insertAfter(token);
-            selected_token_index++;
-        } else {
-            input_token.appendTo(token_list);
-            selected_token_index = token_count;
-        }
-
-        // Show the input box and give it focus again
-        input_box.focus();
-    }
-
-    // Toggle selection of a token in the token list
-    function toggle_select_token(token) {
-        var previous_selected_token = selected_token;
-
-        if(selected_token) {
-            deselect_token($(selected_token), POSITION.END);
-        }
-
-        if(previous_selected_token === token.get(0)) {
-            deselect_token(token, POSITION.END);
-        } else {
-            select_token(token);
-        }
-    }
-
-    // Delete a token from the token list
-    function delete_token (token) {
-        // Remove the id from the saved list
-        var token_data = $.data(token.get(0), "tokeninput");
-        var callback = settings.onDelete;
-
-        var index = token.prevAll().length;
-        if(index > selected_token_index) index--;
-
-        // Delete the token
-        token.remove();
-        selected_token = null;
-
-        // Show the input box and give it focus again
-        input_box.focus();
-
-        // Remove this token from the saved list
-        saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1));
-        if(index < selected_token_index) selected_token_index--;
-
-        // Update the hidden input
-        update_hidden_input(saved_tokens, hidden_input);
-
-        token_count -= 1;
-
-        if(settings.tokenLimit !== null) {
-            input_box
-                .show()
-                .val("")
-                .focus();
-        }
-
-        // Execute the onDelete callback if defined
-        if($.isFunction(callback)) {
-            callback.call(hidden_input,token_data);
-        }
-    }
-
-    // Update the hidden input box value
-    function update_hidden_input(saved_tokens, hidden_input) {
-        var token_values = $.map(saved_tokens, function (el) {
-            return el[settings.tokenValue];
-        });
-        hidden_input.val(token_values.join(settings.tokenDelimiter));
-
-    }
-
-    // Hide and clear the results dropdown
-    function hide_dropdown () {
-        dropdown.hide().empty();
-        selected_dropdown_item = null;
-    }
-
-    function show_dropdown() {
-        dropdown
-            .css({
-                position: "absolute",
-                top: $(token_list).offset().top + $(token_list).outerHeight(),
-                left: $(token_list).offset().left,
-                zindex: 2147483647
-            })
-            .show();
-    }
-
-    function show_dropdown_searching () {
-        if(settings.searchingText) {
-            dropdown.html("<p>"+settings.searchingText+"</p>");
-            show_dropdown();
-        }
-    }
-
-    function show_dropdown_hint () {
-        if(settings.hintText) {
-            dropdown.html("<p>"+settings.hintText+"</p>");
-            show_dropdown();
-        }
-    }
-
-    function regexSanitize(str) {
-        return str.replace(/([.+*?:\[\](){}|\\])/g, "\\$1");
-    }
-
-    // Highlight the query part of the search term
-    function highlight_term(value, term) {
-        return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + regexSanitize(term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
-    }
-
-    function find_value_and_highlight_term(template, value, term) {
-         try {
-             b = regexSanitize(value);
-             a = template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" +  regexSanitize(value) + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term));
-         }
-         catch (e)
-         {
-             alert(e);
-
-             return false;
-         }
-
-          return a;
-    }
-
-    // Populate the results dropdown with some results
-    function populate_dropdown (query, results) {
-        if(results && results.length) {
-            dropdown.empty();
-            var dropdown_ul = $("<ul>")
-                .appendTo(dropdown)
-                .mouseover(function (event) {
-                    select_dropdown_item($(event.target).closest("li"));
-                })
-                .mousedown(function (event) {
-                    add_token($(event.target).closest("li").data("tokeninput"));
-                    hidden_input.change();
-                    return false;
-                })
-                .hide();
-
-            $.each(results, function(index, value) {
-                var this_li = settings.resultsFormatter(value);
-
-                this_li = find_value_and_highlight_term(this_li ,value[settings.propertyToSearch], query);
-
-                this_li = $(this_li).appendTo(dropdown_ul);
-
-                if(index % 2) {
-                    this_li.addClass(settings.classes.dropdownItem);
-                } else {
-                    this_li.addClass(settings.classes.dropdownItem2);
-                }
-
-                if(index === 0) {
-                    select_dropdown_item(this_li);
-                }
-
-                $.data(this_li.get(0), "tokeninput", value);
-            });
-
-            show_dropdown();
-
-            if(settings.animateDropdown) {
-                dropdown_ul.slideDown("fast");
-            } else {
-                dropdown_ul.show();
-            }
-        } else {
-            if(settings.noResultsText) {
-                dropdown.html("<p>"+settings.noResultsText+"</p>");
-                show_dropdown();
-            }
-        }
-    }
-
-    // Highlight an item in the results dropdown
-    function select_dropdown_item (item) {
-        if(item) {
-            if(selected_dropdown_item) {
-                deselect_dropdown_item($(selected_dropdown_item));
-            }
-
-            item.addClass(settings.classes.selectedDropdownItem);
-            selected_dropdown_item = item.get(0);
-        }
-    }
-
-    // Remove highlighting from an item in the results dropdown
-    function deselect_dropdown_item (item) {
-        item.removeClass(settings.classes.selectedDropdownItem);
-        selected_dropdown_item = null;
-    }
-
-    // Do a search and show the "searching" dropdown if the input is longer
-    // than settings.minChars
-    function do_search() {
-        var query = input_box.val().toLowerCase();
-
-        if(query && query.length) {
-            if(selected_token) {
-                deselect_token($(selected_token), POSITION.AFTER);
-            }
-
-            if(query.length >= settings.minChars) {
-                show_dropdown_searching();
-                clearTimeout(timeout);
-
-                timeout = setTimeout(function(){
-                    run_search(query);
-                }, settings.searchDelay);
-            } else {
-                hide_dropdown();
-            }
-        }
-    }
-
-    // Do the actual search
-    function run_search(query) {
-        var cache_key = query + computeURL();
-        var cached_results = cache.get(cache_key);
-        if(cached_results) {
-            populate_dropdown(query, cached_results);
-        } else {
-            // Are we doing an ajax search or local data search?
-            if(settings.url) {
-                var url = computeURL();
-                // Extract exisiting get params
-                var ajax_params = {};
-                ajax_params.data = {};
-                if(url.indexOf("?") > -1) {
-                    var parts = url.split("?");
-                    ajax_params.url = parts[0];
-
-                    var param_array = parts[1].split("&");
-                    $.each(param_array, function (index, value) {
-                        var kv = value.split("=");
-                        ajax_params.data[kv[0]] = kv[1];
-                    });
-                } else {
-                    ajax_params.url = url;
-                }
-
-                // Prepare the request
-                ajax_params.data[settings.queryParam] = query;
-                ajax_params.type = settings.method;
-                ajax_params.dataType = settings.contentType;
-                if(settings.crossDomain) {
-                    ajax_params.dataType = "jsonp";
-                }
-
-                // Attach the success callback
-                ajax_params.success = function(results) {
-                  if($.isFunction(settings.onResult)) {
-                      results = settings.onResult.call(hidden_input, results);
-                  }
-                  cache.add(cache_key, settings.jsonContainer ? results[settings.jsonContainer] : results);
-
-                  // only populate the dropdown if the results are associated with the active search query
-                  if(input_box.val().toLowerCase() === query) {
-                      populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
-                  }
-                };
-
-                // Make the request
-                $.ajax(ajax_params);
-            } else if(settings.local_data) {
-                // Do the search through local data
-                var results = $.grep(settings.local_data, function (row) {
-                    return row[settings.propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1;
-                });
-
-                if($.isFunction(settings.onResult)) {
-                    results = settings.onResult.call(hidden_input, results);
-                }
-                cache.add(cache_key, results);
-                populate_dropdown(query, results);
-            }
-        }
-    }
-
-    // compute the dynamic URL
-    function computeURL() {
-        var url = settings.url;
-        if(typeof settings.url == 'function') {
-            url = settings.url.call();
-        }
-        return url;
-    }
-};
-
-// Really basic cache for the results
-$.TokenList.Cache = function (options) {
-    var settings = $.extend({
-        max_size: 500
-    }, options);
-
-    var data = {};
-    var size = 0;
-
-    var flush = function () {
-        data = {};
-        size = 0;
-    };
-
-    this.add = function (query, results) {
-        if(size > settings.max_size) {
-            flush();
-        }
-
-        if(!data[query]) {
-            size += 1;
-        }
-
-        data[query] = results;
-    };
-
-    this.get = function (query) {
-        return data[query];
-    };
-};
-}(jQuery));
diff --git a/ui/legacy/lib/jquery.validate.additional-methods.js b/ui/legacy/lib/jquery.validate.additional-methods.js
deleted file mode 100644
index 668cb51..0000000
--- a/ui/legacy/lib/jquery.validate.additional-methods.js
+++ /dev/null
@@ -1,1158 +0,0 @@
-/*!
- * jQuery Validation Plugin v1.17.0
- *
- * https://jqueryvalidation.org/
- *
- * Copyright (c) 2017 Jörn Zaefferer
- * Released under the MIT license
- */
-(function( factory ) {
-  if ( typeof define === "function" && define.amd ) {
-    define( ["jquery", "./jquery.validate"], factory );
-  } else if (typeof module === "object" && module.exports) {
-    module.exports = factory( require( "jquery" ) );
-  } else {
-    factory( jQuery );
-  }
-}(function( $ ) {
-
-  ( function() {
-
-    function stripHtml( value ) {
-
-      // Remove html tags and space chars
-      return value.replace( /<.[^<>]*?>/g, " " ).replace( /&nbsp;|&#160;/gi, " " )
-
-      // Remove punctuation
-          .replace( /[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "" );
-    }
-
-    $.validator.addMethod( "maxWords", function( value, element, params ) {
-      return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length <= params;
-    }, $.validator.format( "Please enter {0} words or less." ) );
-
-    $.validator.addMethod( "minWords", function( value, element, params ) {
-      return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length >= params;
-    }, $.validator.format( "Please enter at least {0} words." ) );
-
-    $.validator.addMethod( "rangeWords", function( value, element, params ) {
-      var valueStripped = stripHtml( value ),
-          regex = /\b\w+\b/g;
-      return this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];
-    }, $.validator.format( "Please enter between {0} and {1} words." ) );
-
-  }() );
-
-// Accept a value from a file input based on a required mimetype
-  $.validator.addMethod( "accept", function( value, element, param ) {
-
-    // Split mime on commas in case we have multiple types we can accept
-    var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*",
-        optionalValue = this.optional( element ),
-        i, file, regex;
-
-    // Element is optional
-    if ( optionalValue ) {
-      return optionalValue;
-    }
-
-    if ( $( element ).attr( "type" ) === "file" ) {
-
-      // Escape string to be used in the regex
-      // see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
-      // Escape also "/*" as "/.*" as a wildcard
-      typeParam = typeParam
-          .replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" )
-          .replace( /,/g, "|" )
-          .replace( /\/\*/g, "/.*" );
-
-      // Check if the element has a FileList before checking each file
-      if ( element.files && element.files.length ) {
-        regex = new RegExp( ".?(" + typeParam + ")$", "i" );
-        for ( i = 0; i < element.files.length; i++ ) {
-          file = element.files[ i ];
-
-          // Grab the mimetype from the loaded file, verify it matches
-          if ( !file.type.match( regex ) ) {
-            return false;
-          }
-        }
-      }
-    }
-
-    // Either return true because we've validated each file, or because the
-    // browser does not support element.files and the FileList feature
-    return true;
-  }, $.validator.format( "Please enter a value with a valid mimetype." ) );
-
-  $.validator.addMethod( "alphanumeric", function( value, element ) {
-    return this.optional( element ) || /^\w+$/i.test( value );
-  }, "Letters, numbers, and underscores only please" );
-
-  /*
-   * Dutch bank account numbers (not 'giro' numbers) have 9 digits
-   * and pass the '11 check'.
-   * We accept the notation with spaces, as that is common.
-   * acceptable: 123456789 or 12 34 56 789
-   */
-  $.validator.addMethod( "bankaccountNL", function( value, element ) {
-    if ( this.optional( element ) ) {
-      return true;
-    }
-    if ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {
-      return false;
-    }
-
-    // Now '11 check'
-    var account = value.replace( / /g, "" ), // Remove spaces
-        sum = 0,
-        len = account.length,
-        pos, factor, digit;
-    for ( pos = 0; pos < len; pos++ ) {
-      factor = len - pos;
-      digit = account.substring( pos, pos + 1 );
-      sum = sum + factor * digit;
-    }
-    return sum % 11 === 0;
-  }, "Please specify a valid bank account number" );
-
-  $.validator.addMethod( "bankorgiroaccountNL", function( value, element ) {
-    return this.optional( element ) ||
-        ( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||
-        ( $.validator.methods.giroaccountNL.call( this, value, element ) );
-  }, "Please specify a valid bank or giro account number" );
-
-  /**
-   * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.
-   *
-   * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
-   *
-   * Validation is case-insensitive. Please make sure to normalize input yourself.
-   *
-   * BIC definition in detail:
-   * - First 4 characters - bank code (only letters)
-   * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
-   * - Next 2 characters - location code (letters and digits)
-   *   a. shall not start with '0' or '1'
-   *   b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)
-   * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
-   */
-  $.validator.addMethod( "bic", function( value, element ) {
-    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );
-  }, "Please specify a valid BIC code" );
-
-  /*
-   * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
-   * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
-   *
-   * Spanish CIF structure:
-   *
-   * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]
-   *
-   * Where:
-   *
-   * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]
-   * P: 2 characters. Province.
-   * N: 5 characters. Secuencial Number within the province.
-   * C: 1 character. Control Digit: [0-9A-J].
-   *
-   * [ T ]: Kind of Organizations. Possible values:
-   *
-   *   A. Corporations
-   *   B. LLCs
-   *   C. General partnerships
-   *   D. Companies limited partnerships
-   *   E. Communities of goods
-   *   F. Cooperative Societies
-   *   G. Associations
-   *   H. Communities of homeowners in horizontal property regime
-   *   J. Civil Societies
-   *   K. Old format
-   *   L. Old format
-   *   M. Old format
-   *   N. Nonresident entities
-   *   P. Local authorities
-   *   Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
-   *   R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
-   *   S. Organs of State Administration and regions
-   *   V. Agrarian Transformation
-   *   W. Permanent establishments of non-resident in Spain
-   *
-   * [ C ]: Control Digit. It can be a number or a letter depending on T value:
-   * [ T ]  -->  [ C ]
-   * ------    ----------
-   *   A         Number
-   *   B         Number
-   *   E         Number
-   *   H         Number
-   *   K         Letter
-   *   P         Letter
-   *   Q         Letter
-   *   S         Letter
-   *
-   */
-  $.validator.addMethod( "cifES", function( value, element ) {
-    "use strict";
-
-    if ( this.optional( element ) ) {
-      return true;
-    }
-
-    var cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi );
-    var letter  = value.substring( 0, 1 ), // [ T ]
-        number  = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]
-        control = value.substring( 8, 9 ), // [ C ]
-        all_sum = 0,
-        even_sum = 0,
-        odd_sum = 0,
-        i, n,
-        control_digit,
-        control_letter;
-
-    function isOdd( n ) {
-      return n % 2 === 0;
-    }
-
-    // Quick format test
-    if ( value.length !== 9 || !cifRegEx.test( value ) ) {
-      return false;
-    }
-
-    for ( i = 0; i < number.length; i++ ) {
-      n = parseInt( number[ i ], 10 );
-
-      // Odd positions
-      if ( isOdd( i ) ) {
-
-        // Odd positions are multiplied first.
-        n *= 2;
-
-        // If the multiplication is bigger than 10 we need to adjust
-        odd_sum += n < 10 ? n : n - 9;
-
-        // Even positions
-        // Just sum them
-      } else {
-        even_sum += n;
-      }
-    }
-
-    all_sum = even_sum + odd_sum;
-    control_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();
-    control_digit = parseInt( control_digit, 10 ) > 9 ? "0" : control_digit;
-    control_letter = "JABCDEFGHI".substr( control_digit, 1 ).toString();
-
-    // Control must be a digit
-    if ( letter.match( /[ABEH]/ ) ) {
-      return control === control_digit;
-
-      // Control must be a letter
-    } else if ( letter.match( /[KPQS]/ ) ) {
-      return control === control_letter;
-    }
-
-    // Can be either
-    return control === control_digit || control === control_letter;
-
-  }, "Please specify a valid CIF number." );
-
-  /*
-   * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.
-   * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
-   */
-  $.validator.addMethod( "cpfBR", function( value ) {
-
-    // Removing special characters from value
-    value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
-
-    // Checking value to have 11 digits only
-    if ( value.length !== 11 ) {
-      return false;
-    }
-
-    var sum = 0,
-        firstCN, secondCN, checkResult, i;
-
-    firstCN = parseInt( value.substring( 9, 10 ), 10 );
-    secondCN = parseInt( value.substring( 10, 11 ), 10 );
-
-    checkResult = function( sum, cn ) {
-      var result = ( sum * 10 ) % 11;
-      if ( ( result === 10 ) || ( result === 11 ) ) {
-        result = 0;
-      }
-      return ( result === cn );
-    };
-
-    // Checking for dump data
-    if ( value === "" ||
-        value === "00000000000" ||
-        value === "11111111111" ||
-        value === "22222222222" ||
-        value === "33333333333" ||
-        value === "44444444444" ||
-        value === "55555555555" ||
-        value === "66666666666" ||
-        value === "77777777777" ||
-        value === "88888888888" ||
-        value === "99999999999"
-    ) {
-      return false;
-    }
-
-    // Step 1 - using first Check Number:
-    for ( i = 1; i <= 9; i++ ) {
-      sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );
-    }
-
-    // If first Check Number (CN) is valid, move to Step 2 - using second Check Number:
-    if ( checkResult( sum, firstCN ) ) {
-      sum = 0;
-      for ( i = 1; i <= 10; i++ ) {
-        sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );
-      }
-      return checkResult( sum, secondCN );
-    }
-    return false;
-
-  }, "Please specify a valid CPF number" );
-
-// https://jqueryvalidation.org/creditcard-method/
-// based on https://en.wikipedia.org/wiki/Luhn_algorithm
-  $.validator.addMethod( "creditcard", function( value, element ) {
-    if ( this.optional( element ) ) {
-      return "dependency-mismatch";
-    }
-
-    // Accept only spaces, digits and dashes
-    if ( /[^0-9 \-]+/.test( value ) ) {
-      return false;
-    }
-
-    var nCheck = 0,
-        nDigit = 0,
-        bEven = false,
-        n, cDigit;
-
-    value = value.replace( /\D/g, "" );
-
-    // Basing min and max length on
-    // https://developer.ean.com/general_info/Valid_Credit_Card_Types
-    if ( value.length < 13 || value.length > 19 ) {
-      return false;
-    }
-
-    for ( n = value.length - 1; n >= 0; n-- ) {
-      cDigit = value.charAt( n );
-      nDigit = parseInt( cDigit, 10 );
-      if ( bEven ) {
-        if ( ( nDigit *= 2 ) > 9 ) {
-          nDigit -= 9;
-        }
-      }
-
-      nCheck += nDigit;
-      bEven = !bEven;
-    }
-
-    return ( nCheck % 10 ) === 0;
-  }, "Please enter a valid credit card number." );
-
-  /* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
-   * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
-   * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
-   */
-  $.validator.addMethod( "creditcardtypes", function( value, element, param ) {
-    if ( /[^0-9\-]+/.test( value ) ) {
-      return false;
-    }
-
-    value = value.replace( /\D/g, "" );
-
-    var validTypes = 0x0000;
-
-    if ( param.mastercard ) {
-      validTypes |= 0x0001;
-    }
-    if ( param.visa ) {
-      validTypes |= 0x0002;
-    }
-    if ( param.amex ) {
-      validTypes |= 0x0004;
-    }
-    if ( param.dinersclub ) {
-      validTypes |= 0x0008;
-    }
-    if ( param.enroute ) {
-      validTypes |= 0x0010;
-    }
-    if ( param.discover ) {
-      validTypes |= 0x0020;
-    }
-    if ( param.jcb ) {
-      validTypes |= 0x0040;
-    }
-    if ( param.unknown ) {
-      validTypes |= 0x0080;
-    }
-    if ( param.all ) {
-      validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
-    }
-    if ( validTypes & 0x0001 && /^(5[12345])/.test( value ) ) { // Mastercard
-      return value.length === 16;
-    }
-    if ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa
-      return value.length === 16;
-    }
-    if ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex
-      return value.length === 15;
-    }
-    if ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub
-      return value.length === 14;
-    }
-    if ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute
-      return value.length === 15;
-    }
-    if ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover
-      return value.length === 16;
-    }
-    if ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb
-      return value.length === 16;
-    }
-    if ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb
-      return value.length === 15;
-    }
-    if ( validTypes & 0x0080 ) { // Unknown
-      return true;
-    }
-    return false;
-  }, "Please enter a valid credit card number." );
-
-  /**
-   * Validates currencies with any given symbols by @jameslouiz
-   * Symbols can be optional or required. Symbols required by default
-   *
-   * Usage examples:
-   *  currency: ["£", false] - Use false for soft currency validation
-   *  currency: ["$", false]
-   *  currency: ["RM", false] - also works with text based symbols such as "RM" - Malaysia Ringgit etc
-   *
-   *  <input class="currencyInput" name="currencyInput">
-   *
-   * Soft symbol checking
-   *  currencyInput: {
-   *     currency: ["$", false]
-   *  }
-   *
-   * Strict symbol checking (default)
-   *  currencyInput: {
-   *     currency: "$"
-   *     //OR
-   *     currency: ["$", true]
-   *  }
-   *
-   * Multiple Symbols
-   *  currencyInput: {
-   *     currency: "$,£,¢"
-   *  }
-   */
-  $.validator.addMethod( "currency", function( value, element, param ) {
-    var isParamString = typeof param === "string",
-        symbol = isParamString ? param : param[ 0 ],
-        soft = isParamString ? true : param[ 1 ],
-        regex;
-
-    symbol = symbol.replace( /,/g, "" );
-    symbol = soft ? symbol + "]" : symbol + "]?";
-    regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$";
-    regex = new RegExp( regex );
-    return this.optional( element ) || regex.test( value );
-
-  }, "Please specify a valid currency" );
-
-  $.validator.addMethod( "dateFA", function( value, element ) {
-    return this.optional( element ) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );
-  }, $.validator.messages.date );
-
-  /**
-   * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
-   *
-   * @example $.validator.methods.date("01/01/1900")
-   * @result true
-   *
-   * @example $.validator.methods.date("01/13/1990")
-   * @result false
-   *
-   * @example $.validator.methods.date("01.01.1900")
-   * @result false
-   *
-   * @example <input name="pippo" class="{dateITA:true}" />
-   * @desc Declares an optional input element whose value must be a valid date.
-   *
-   * @name $.validator.methods.dateITA
-   * @type Boolean
-   * @cat Plugins/Validate/Methods
-   */
-  $.validator.addMethod( "dateITA", function( value, element ) {
-    var check = false,
-        re = /^\d{1,2}\/\d{1,2}\/\d{4}$/,
-        adata, gg, mm, aaaa, xdata;
-    if ( re.test( value ) ) {
-      adata = value.split( "/" );
-      gg = parseInt( adata[ 0 ], 10 );
-      mm = parseInt( adata[ 1 ], 10 );
-      aaaa = parseInt( adata[ 2 ], 10 );
-      xdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );
-      if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
-        check = true;
-      } else {
-        check = false;
-      }
-    } else {
-      check = false;
-    }
-    return this.optional( element ) || check;
-  }, $.validator.messages.date );
-
-  $.validator.addMethod( "dateNL", function( value, element ) {
-    return this.optional( element ) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test( value );
-  }, $.validator.messages.date );
-
-// Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
-  $.validator.addMethod( "extension", function( value, element, param ) {
-    param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif";
-    return this.optional( element ) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) );
-  }, $.validator.format( "Please enter a value with a valid extension." ) );
-
-  /**
-   * Dutch giro account numbers (not bank numbers) have max 7 digits
-   */
-  $.validator.addMethod( "giroaccountNL", function( value, element ) {
-    return this.optional( element ) || /^[0-9]{1,7}$/.test( value );
-  }, "Please specify a valid giro account number" );
-
-  /**
-   * IBAN is the international bank account number.
-   * It has a country - specific format, that is checked here too
-   *
-   * Validation is case-insensitive. Please make sure to normalize input yourself.
-   */
-  $.validator.addMethod( "iban", function( value, element ) {
-
-    // Some quick simple tests to prevent needless work
-    if ( this.optional( element ) ) {
-      return true;
-    }
-
-    // Remove spaces and to upper case
-    var iban = value.replace( / /g, "" ).toUpperCase(),
-        ibancheckdigits = "",
-        leadingZeroes = true,
-        cRest = "",
-        cOperator = "",
-        countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
-
-    // Check for IBAN code length.
-    // It contains:
-    // country code ISO 3166-1 - two letters,
-    // two check digits,
-    // Basic Bank Account Number (BBAN) - up to 30 chars
-    var minimalIBANlength = 5;
-    if ( iban.length < minimalIBANlength ) {
-      return false;
-    }
-
-    // Check the country code and find the country specific format
-    countrycode = iban.substring( 0, 2 );
-    bbancountrypatterns = {
-      "AL": "\\d{8}[\\dA-Z]{16}",
-      "AD": "\\d{8}[\\dA-Z]{12}",
-      "AT": "\\d{16}",
-      "AZ": "[\\dA-Z]{4}\\d{20}",
-      "BE": "\\d{12}",
-      "BH": "[A-Z]{4}[\\dA-Z]{14}",
-      "BA": "\\d{16}",
-      "BR": "\\d{23}[A-Z][\\dA-Z]",
-      "BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
-      "CR": "\\d{17}",
-      "HR": "\\d{17}",
-      "CY": "\\d{8}[\\dA-Z]{16}",
-      "CZ": "\\d{20}",
-      "DK": "\\d{14}",
-      "DO": "[A-Z]{4}\\d{20}",
-      "EE": "\\d{16}",
-      "FO": "\\d{14}",
-      "FI": "\\d{14}",
-      "FR": "\\d{10}[\\dA-Z]{11}\\d{2}",
-      "GE": "[\\dA-Z]{2}\\d{16}",
-      "DE": "\\d{18}",
-      "GI": "[A-Z]{4}[\\dA-Z]{15}",
-      "GR": "\\d{7}[\\dA-Z]{16}",
-      "GL": "\\d{14}",
-      "GT": "[\\dA-Z]{4}[\\dA-Z]{20}",
-      "HU": "\\d{24}",
-      "IS": "\\d{22}",
-      "IE": "[\\dA-Z]{4}\\d{14}",
-      "IL": "\\d{19}",
-      "IT": "[A-Z]\\d{10}[\\dA-Z]{12}",
-      "KZ": "\\d{3}[\\dA-Z]{13}",
-      "KW": "[A-Z]{4}[\\dA-Z]{22}",
-      "LV": "[A-Z]{4}[\\dA-Z]{13}",
-      "LB": "\\d{4}[\\dA-Z]{20}",
-      "LI": "\\d{5}[\\dA-Z]{12}",
-      "LT": "\\d{16}",
-      "LU": "\\d{3}[\\dA-Z]{13}",
-      "MK": "\\d{3}[\\dA-Z]{10}\\d{2}",
-      "MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
-      "MR": "\\d{23}",
-      "MU": "[A-Z]{4}\\d{19}[A-Z]{3}",
-      "MC": "\\d{10}[\\dA-Z]{11}\\d{2}",
-      "MD": "[\\dA-Z]{2}\\d{18}",
-      "ME": "\\d{18}",
-      "NL": "[A-Z]{4}\\d{10}",
-      "NO": "\\d{11}",
-      "PK": "[\\dA-Z]{4}\\d{16}",
-      "PS": "[\\dA-Z]{4}\\d{21}",
-      "PL": "\\d{24}",
-      "PT": "\\d{21}",
-      "RO": "[A-Z]{4}[\\dA-Z]{16}",
-      "SM": "[A-Z]\\d{10}[\\dA-Z]{12}",
-      "SA": "\\d{2}[\\dA-Z]{18}",
-      "RS": "\\d{18}",
-      "SK": "\\d{20}",
-      "SI": "\\d{15}",
-      "ES": "\\d{20}",
-      "SE": "\\d{20}",
-      "CH": "\\d{5}[\\dA-Z]{12}",
-      "TN": "\\d{20}",
-      "TR": "\\d{5}[\\dA-Z]{17}",
-      "AE": "\\d{3}\\d{16}",
-      "GB": "[A-Z]{4}\\d{14}",
-      "VG": "[\\dA-Z]{4}\\d{16}"
-    };
-
-    bbanpattern = bbancountrypatterns[ countrycode ];
-
-    // As new countries will start using IBAN in the
-    // future, we only check if the countrycode is known.
-    // This prevents false negatives, while almost all
-    // false positives introduced by this, will be caught
-    // by the checksum validation below anyway.
-    // Strict checking should return FALSE for unknown
-    // countries.
-    if ( typeof bbanpattern !== "undefined" ) {
-      ibanregexp = new RegExp( "^[A-Z]{2}\\d{2}" + bbanpattern + "$", "" );
-      if ( !( ibanregexp.test( iban ) ) ) {
-        return false; // Invalid country specific format
-      }
-    }
-
-    // Now check the checksum, first convert to digits
-    ibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );
-    for ( i = 0; i < ibancheck.length; i++ ) {
-      charAt = ibancheck.charAt( i );
-      if ( charAt !== "0" ) {
-        leadingZeroes = false;
-      }
-      if ( !leadingZeroes ) {
-        ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( charAt );
-      }
-    }
-
-    // Calculate the result of: ibancheckdigits % 97
-    for ( p = 0; p < ibancheckdigits.length; p++ ) {
-      cChar = ibancheckdigits.charAt( p );
-      cOperator = "" + cRest + "" + cChar;
-      cRest = cOperator % 97;
-    }
-    return cRest === 1;
-  }, "Please specify a valid IBAN" );
-
-  $.validator.addMethod( "integer", function( value, element ) {
-    return this.optional( element ) || /^-?\d+$/.test( value );
-  }, "A positive or negative non-decimal number please" );
-
-  $.validator.addMethod( "ipv4", function( value, element ) {
-    return this.optional( element ) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test( value );
-  }, "Please enter a valid IP v4 address." );
-
-  $.validator.addMethod( "ipv6", function( value, element ) {
-    return this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );
-  }, "Please enter a valid IP v6 address." );
-
-  $.validator.addMethod( "lettersonly", function( value, element ) {
-    return this.optional( element ) || /^[a-z]+$/i.test( value );
-  }, "Letters only please" );
-
-  $.validator.addMethod( "letterswithbasicpunc", function( value, element ) {
-    return this.optional( element ) || /^[a-z\-.,()'"\s]+$/i.test( value );
-  }, "Letters or punctuation only please" );
-
-  $.validator.addMethod( "mobileNL", function( value, element ) {
-    return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
-  }, "Please specify a valid mobile number" );
-
-  /* For UK phone functions, do the following server side processing:
-   * Compare original input with this RegEx pattern:
-   * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
-   * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
-   * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
-   * A number of very detailed GB telephone number RegEx patterns can also be found at:
-   * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
-   */
-  $.validator.addMethod( "mobileUK", function( phone_number, element ) {
-    phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
-    return this.optional( element ) || phone_number.length > 9 &&
-        phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ );
-  }, "Please specify a valid mobile number" );
-
-  $.validator.addMethod( "netmask", function( value, element ) {
-    return this.optional( element ) || /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test( value );
-  }, "Please enter a valid netmask." );
-
-  /*
-   * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish
-   * authorities to any foreigner.
-   *
-   * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal
-   * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to
-   * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.
-   */
-  $.validator.addMethod( "nieES", function( value, element ) {
-    "use strict";
-
-    if ( this.optional( element ) ) {
-      return true;
-    }
-
-    var nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );
-    var validChars = "TRWAGMYFPDXBNJZSQVHLCKET",
-        letter = value.substr( value.length - 1 ).toUpperCase(),
-        number;
-
-    value = value.toString().toUpperCase();
-
-    // Quick format test
-    if ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {
-      return false;
-    }
-
-    // X means same number
-    // Y means number + 10000000
-    // Z means number + 20000000
-    value = value.replace( /^[X]/, "0" )
-        .replace( /^[Y]/, "1" )
-        .replace( /^[Z]/, "2" );
-
-    number = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );
-
-    return validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;
-
-  }, "Please specify a valid NIE number." );
-
-  /*
-   * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
-   */
-  $.validator.addMethod( "nifES", function( value, element ) {
-    "use strict";
-
-    if ( this.optional( element ) ) {
-      return true;
-    }
-
-    value = value.toUpperCase();
-
-    // Basic format test
-    if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
-      return false;
-    }
-
-    // Test NIF
-    if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
-      return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
-    }
-
-    // Test specials NIF (starts with K, L or M)
-    if ( /^[KLM]{1}/.test( value ) ) {
-      return ( value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 1 ) % 23 ) );
-    }
-
-    return false;
-
-  }, "Please specify a valid NIF number." );
-
-  /*
-   * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies
-   */
-  $.validator.addMethod( "nipPL", function( value ) {
-    "use strict";
-
-    value = value.replace( /[^0-9]/g, "" );
-
-    if ( value.length !== 10 ) {
-      return false;
-    }
-
-    var arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];
-    var intSum = 0;
-    for ( var i = 0; i < 9; i++ ) {
-      intSum += arrSteps[ i ] * value[ i ];
-    }
-    var int2 = intSum % 11;
-    var intControlNr = ( int2 === 10 ) ? 0 : int2;
-
-    return ( intControlNr === parseInt( value[ 9 ], 10 ) );
-  }, "Please specify a valid NIP number." );
-
-  $.validator.addMethod( "notEqualTo", function( value, element, param ) {
-    return this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );
-  }, "Please enter a different value, values must not be the same." );
-
-  $.validator.addMethod( "nowhitespace", function( value, element ) {
-    return this.optional( element ) || /^\S+$/i.test( value );
-  }, "No white space please" );
-
-  /**
-   * Return true if the field value matches the given format RegExp
-   *
-   * @example $.validator.methods.pattern("AR1004",element,/^AR\d{4}$/)
-   * @result true
-   *
-   * @example $.validator.methods.pattern("BR1004",element,/^AR\d{4}$/)
-   * @result false
-   *
-   * @name $.validator.methods.pattern
-   * @type Boolean
-   * @cat Plugins/Validate/Methods
-   */
-  $.validator.addMethod( "pattern", function( value, element, param ) {
-    if ( this.optional( element ) ) {
-      return true;
-    }
-    if ( typeof param === "string" ) {
-      param = new RegExp( "^(?:" + param + ")$" );
-    }
-    return param.test( value );
-  }, "Invalid format." );
-
-  /**
-   * Dutch phone numbers have 10 digits (or 11 and start with +31).
-   */
-  $.validator.addMethod( "phoneNL", function( value, element ) {
-    return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
-  }, "Please specify a valid phone number." );
-
-  /* For UK phone functions, do the following server side processing:
-   * Compare original input with this RegEx pattern:
-   * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
-   * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
-   * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
-   * A number of very detailed GB telephone number RegEx patterns can also be found at:
-   * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
-   */
-
-// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
-  $.validator.addMethod( "phonesUK", function( phone_number, element ) {
-    phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
-    return this.optional( element ) || phone_number.length > 9 &&
-        phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ );
-  }, "Please specify a valid uk phone number" );
-
-  /* For UK phone functions, do the following server side processing:
-   * Compare original input with this RegEx pattern:
-   * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
-   * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
-   * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
-   * A number of very detailed GB telephone number RegEx patterns can also be found at:
-   * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
-   */
-  $.validator.addMethod( "phoneUK", function( phone_number, element ) {
-    phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
-    return this.optional( element ) || phone_number.length > 9 &&
-        phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/ );
-  }, "Please specify a valid phone number" );
-
-  /**
-   * Matches US phone number format
-   *
-   * where the area code may not start with 1 and the prefix may not start with 1
-   * allows '-' or ' ' as a separator and allows parens around area code
-   * some people may want to put a '1' in front of their number
-   *
-   * 1(212)-999-2345 or
-   * 212 999 2344 or
-   * 212-999-0983
-   *
-   * but not
-   * 111-123-5434
-   * and not
-   * 212 123 4567
-   */
-  $.validator.addMethod( "phoneUS", function( phone_number, element ) {
-    phone_number = phone_number.replace( /\s+/g, "" );
-    return this.optional( element ) || phone_number.length > 9 &&
-        phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/ );
-  }, "Please specify a valid phone number" );
-
-  /*
-  * Valida CEPs do brasileiros:
-  *
-  * Formatos aceitos:
-  * 99999-999
-  * 99.999-999
-  * 99999999
-  */
-  $.validator.addMethod( "postalcodeBR", function( cep_value, element ) {
-    return this.optional( element ) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
-  }, "Informe um CEP válido." );
-
-  /**
-   * Matches a valid Canadian Postal Code
-   *
-   * @example jQuery.validator.methods.postalCodeCA( "H0H 0H0", element )
-   * @result true
-   *
-   * @example jQuery.validator.methods.postalCodeCA( "H0H0H0", element )
-   * @result false
-   *
-   * @name jQuery.validator.methods.postalCodeCA
-   * @type Boolean
-   * @cat Plugins/Validate/Methods
-   */
-  $.validator.addMethod( "postalCodeCA", function( value, element ) {
-    return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value );
-  }, "Please specify a valid postal code" );
-
-  /* Matches Italian postcode (CAP) */
-  $.validator.addMethod( "postalcodeIT", function( value, element ) {
-    return this.optional( element ) || /^\d{5}$/.test( value );
-  }, "Please specify a valid postal code" );
-
-  $.validator.addMethod( "postalcodeNL", function( value, element ) {
-    return this.optional( element ) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test( value );
-  }, "Please specify a valid postal code" );
-
-// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)
-  $.validator.addMethod( "postcodeUK", function( value, element ) {
-    return this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test( value );
-  }, "Please specify a valid UK postcode" );
-
-  /*
-   * Lets you say "at least X inputs that match selector Y must be filled."
-   *
-   * The end result is that neither of these inputs:
-   *
-   *	<input class="productinfo" name="partnumber">
-   *	<input class="productinfo" name="description">
-   *
-   *	...will validate unless at least one of them is filled.
-   *
-   * partnumber:	{require_from_group: [1,".productinfo"]},
-   * description: {require_from_group: [1,".productinfo"]}
-   *
-   * options[0]: number of fields that must be filled in the group
-   * options[1]: CSS selector that defines the group of conditionally required fields
-   */
-  $.validator.addMethod( "require_from_group", function( value, element, options ) {
-    var $fields = $( options[ 1 ], element.form ),
-        $fieldsFirst = $fields.eq( 0 ),
-        validator = $fieldsFirst.data( "valid_req_grp" ) ? $fieldsFirst.data( "valid_req_grp" ) : $.extend( {}, this ),
-        isValid = $fields.filter( function() {
-          return validator.elementValue( this );
-        } ).length >= options[ 0 ];
-
-    // Store the cloned validator for future validation
-    $fieldsFirst.data( "valid_req_grp", validator );
-
-    // If element isn't being validated, run each require_from_group field's validation rules
-    if ( !$( element ).data( "being_validated" ) ) {
-      $fields.data( "being_validated", true );
-      $fields.each( function() {
-        validator.element( this );
-      } );
-      $fields.data( "being_validated", false );
-    }
-    return isValid;
-  }, $.validator.format( "Please fill at least {0} of these fields." ) );
-
-  /*
-   * Lets you say "either at least X inputs that match selector Y must be filled,
-   * OR they must all be skipped (left blank)."
-   *
-   * The end result, is that none of these inputs:
-   *
-   *	<input class="productinfo" name="partnumber">
-   *	<input class="productinfo" name="description">
-   *	<input class="productinfo" name="color">
-   *
-   *	...will validate unless either at least two of them are filled,
-   *	OR none of them are.
-   *
-   * partnumber:	{skip_or_fill_minimum: [2,".productinfo"]},
-   * description: {skip_or_fill_minimum: [2,".productinfo"]},
-   * color:		{skip_or_fill_minimum: [2,".productinfo"]}
-   *
-   * options[0]: number of fields that must be filled in the group
-   * options[1]: CSS selector that defines the group of conditionally required fields
-   *
-   */
-  $.validator.addMethod( "skip_or_fill_minimum", function( value, element, options ) {
-    var $fields = $( options[ 1 ], element.form ),
-        $fieldsFirst = $fields.eq( 0 ),
-        validator = $fieldsFirst.data( "valid_skip" ) ? $fieldsFirst.data( "valid_skip" ) : $.extend( {}, this ),
-        numberFilled = $fields.filter( function() {
-          return validator.elementValue( this );
-        } ).length,
-        isValid = numberFilled === 0 || numberFilled >= options[ 0 ];
-
-    // Store the cloned validator for future validation
-    $fieldsFirst.data( "valid_skip", validator );
-
-    // If element isn't being validated, run each skip_or_fill_minimum field's validation rules
-    if ( !$( element ).data( "being_validated" ) ) {
-      $fields.data( "being_validated", true );
-      $fields.each( function() {
-        validator.element( this );
-      } );
-      $fields.data( "being_validated", false );
-    }
-    return isValid;
-  }, $.validator.format( "Please either skip these fields or fill at least {0} of them." ) );
-
-  /* Validates US States and/or Territories by @jdforsythe
-   * Can be case insensitive or require capitalization - default is case insensitive
-   * Can include US Territories or not - default does not
-   * Can include US Military postal abbreviations (AA, AE, AP) - default does not
-   *
-   * Note: "States" always includes DC (District of Colombia)
-   *
-   * Usage examples:
-   *
-   *  This is the default - case insensitive, no territories, no military zones
-   *  stateInput: {
-   *     caseSensitive: false,
-   *     includeTerritories: false,
-   *     includeMilitary: false
-   *  }
-   *
-   *  Only allow capital letters, no territories, no military zones
-   *  stateInput: {
-   *     caseSensitive: false
-   *  }
-   *
-   *  Case insensitive, include territories but not military zones
-   *  stateInput: {
-   *     includeTerritories: true
-   *  }
-   *
-   *  Only allow capital letters, include territories and military zones
-   *  stateInput: {
-   *     caseSensitive: true,
-   *     includeTerritories: true,
-   *     includeMilitary: true
-   *  }
-   *
-   */
-  $.validator.addMethod( "stateUS", function( value, element, options ) {
-    var isDefault = typeof options === "undefined",
-        caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
-        includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
-        includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary,
-        regex;
-
-    if ( !includeTerritories && !includeMilitary ) {
-      regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
-    } else if ( includeTerritories && includeMilitary ) {
-      regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
-    } else if ( includeTerritories ) {
-      regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
-    } else {
-      regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
-    }
-
-    regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" );
-    return this.optional( element ) || regex.test( value );
-  }, "Please specify a valid state" );
-
-// TODO check if value starts with <, otherwise don't try stripping anything
-  $.validator.addMethod( "strippedminlength", function( value, element, param ) {
-    return $( value ).text().length >= param;
-  }, $.validator.format( "Please enter at least {0} characters" ) );
-
-  $.validator.addMethod( "time", function( value, element ) {
-    return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value );
-  }, "Please enter a valid time, between 00:00 and 23:59" );
-
-  $.validator.addMethod( "time12h", function( value, element ) {
-    return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value );
-  }, "Please enter a valid time in 12-hour am/pm format" );
-
-// Same as url, but TLD is optional
-  $.validator.addMethod( "url2", function( value, element ) {
-    return this.optional( element ) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
-  }, $.validator.messages.url );
-
-  /**
-   * Return true, if the value is a valid vehicle identification number (VIN).
-   *
-   * Works with all kind of text inputs.
-   *
-   * @example <input type="text" size="20" name="VehicleID" class="{required:true,vinUS:true}" />
-   * @desc Declares a required input element whose value must be a valid vehicle identification number.
-   *
-   * @name $.validator.methods.vinUS
-   * @type Boolean
-   * @cat Plugins/Validate/Methods
-   */
-  $.validator.addMethod( "vinUS", function( v ) {
-    if ( v.length !== 17 ) {
-      return false;
-    }
-
-    var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ],
-        VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],
-        FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],
-        rs = 0,
-        i, n, d, f, cd, cdv;
-
-    for ( i = 0; i < 17; i++ ) {
-      f = FL[ i ];
-      d = v.slice( i, i + 1 );
-      if ( i === 8 ) {
-        cdv = d;
-      }
-      if ( !isNaN( d ) ) {
-        d *= f;
-      } else {
-        for ( n = 0; n < LL.length; n++ ) {
-          if ( d.toUpperCase() === LL[ n ] ) {
-            d = VL[ n ];
-            d *= f;
-            if ( isNaN( cdv ) && n === 8 ) {
-              cdv = LL[ n ];
-            }
-            break;
-          }
-        }
-      }
-      rs += d;
-    }
-    cd = rs % 11;
-    if ( cd === 10 ) {
-      cd = "X";
-    }
-    if ( cd === cdv ) {
-      return true;
-    }
-    return false;
-  }, "The specified vehicle identification number (VIN) is invalid." );
-
-  $.validator.addMethod( "zipcodeUS", function( value, element ) {
-    return this.optional( element ) || /^\d{5}(-\d{4})?$/.test( value );
-  }, "The specified US ZIP Code is invalid" );
-
-  $.validator.addMethod( "ziprange", function( value, element ) {
-    return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value );
-  }, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx" );
-  return $;
-}));
\ No newline at end of file
diff --git a/ui/legacy/lib/jquery.validate.js b/ui/legacy/lib/jquery.validate.js
deleted file mode 100644
index abc357d1..0000000
--- a/ui/legacy/lib/jquery.validate.js
+++ /dev/null
@@ -1,1601 +0,0 @@
-/*!

- * jQuery Validation Plugin v1.17.0

- *

- * https://jqueryvalidation.org/

- *

- * Copyright (c) 2017 Jörn Zaefferer

- * Released under the MIT license

- */

-(function( factory ) {

-	if ( typeof define === "function" && define.amd ) {

-		define( ["jquery"], factory );

-	} else if (typeof module === "object" && module.exports) {

-		module.exports = factory( require( "jquery" ) );

-	} else {

-		factory( jQuery );

-	}

-}(function( $ ) {

-

-$.extend( $.fn, {
-
-	// https://jqueryvalidation.org/validate/
-	validate: function( options ) {
-
-		// If nothing is selected, return nothing; can't chain anyway
-		if ( !this.length ) {
-			if ( options && options.debug && window.console ) {
-				console.warn( "Nothing selected, can't validate, returning nothing." );
-			}
-			return;
-		}
-
-		// Check if a validator for this form was already created
-		var validator = $.data( this[ 0 ], "validator" );
-		if ( validator ) {
-			return validator;
-		}
-
-		// Add novalidate tag if HTML5.
-		this.attr( "novalidate", "novalidate" );
-
-		validator = new $.validator( options, this[ 0 ] );
-		$.data( this[ 0 ], "validator", validator );
-
-		if ( validator.settings.onsubmit ) {
-
-			this.on( "click.validate", ":submit", function( event ) {
-
-				// Track the used submit button to properly handle scripted
-				// submits later.
-				validator.submitButton = event.currentTarget;
-
-				// Allow suppressing validation by adding a cancel class to the submit button
-				if ( $( this ).hasClass( "cancel" ) ) {
-					validator.cancelSubmit = true;
-				}
-
-				// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
-				if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
-					validator.cancelSubmit = true;
-				}
-			} );
-
-			// Validate the form on submit
-			this.on( "submit.validate", function( event ) {
-				if ( validator.settings.debug ) {
-
-					// Prevent form submit to be able to see console output
-					event.preventDefault();
-				}
-				function handle() {
-					var hidden, result;
-
-					// Insert a hidden input as a replacement for the missing submit button
-					// The hidden input is inserted in two cases:
-					//   - A user defined a `submitHandler`
-					//   - There was a pending request due to `remote` method and `stopRequest()`
-					//     was called to submit the form in case it's valid
-					if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
-						hidden = $( "<input type='hidden'/>" )
-							.attr( "name", validator.submitButton.name )
-							.val( $( validator.submitButton ).val() )
-							.appendTo( validator.currentForm );
-					}
-
-					if ( validator.settings.submitHandler ) {
-						result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
-						if ( hidden ) {
-
-							// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
-							hidden.remove();
-						}
-						if ( result !== undefined ) {
-							return result;
-						}
-						return false;
-					}
-					return true;
-				}
-
-				// Prevent submit for invalid forms or custom submit handlers
-				if ( validator.cancelSubmit ) {
-					validator.cancelSubmit = false;
-					return handle();
-				}
-				if ( validator.form() ) {
-					if ( validator.pendingRequest ) {
-						validator.formSubmitted = true;
-						return false;
-					}
-					return handle();
-				} else {
-					validator.focusInvalid();
-					return false;
-				}
-			} );
-		}
-
-		return validator;
-	},
-
-	// https://jqueryvalidation.org/valid/
-	valid: function() {
-		var valid, validator, errorList;
-
-		if ( $( this[ 0 ] ).is( "form" ) ) {
-			valid = this.validate().form();
-		} else {
-			errorList = [];
-			valid = true;
-			validator = $( this[ 0 ].form ).validate();
-			this.each( function() {
-				valid = validator.element( this ) && valid;
-				if ( !valid ) {
-					errorList = errorList.concat( validator.errorList );
-				}
-			} );
-			validator.errorList = errorList;
-		}
-		return valid;
-	},
-
-	// https://jqueryvalidation.org/rules/
-	rules: function( command, argument ) {
-		var element = this[ 0 ],
-			settings, staticRules, existingRules, data, param, filtered;
-
-		// If nothing is selected, return empty object; can't chain anyway
-		if ( element == null ) {
-			return;
-		}
-
-		if ( !element.form && element.hasAttribute( "contenteditable" ) ) {
-			element.form = this.closest( "form" )[ 0 ];
-			element.name = this.attr( "name" );
-		}
-
-		if ( element.form == null ) {
-			return;
-		}
-
-		if ( command ) {
-			settings = $.data( element.form, "validator" ).settings;
-			staticRules = settings.rules;
-			existingRules = $.validator.staticRules( element );
-			switch ( command ) {
-			case "add":
-				$.extend( existingRules, $.validator.normalizeRule( argument ) );
-
-				// Remove messages from rules, but allow them to be set separately
-				delete existingRules.messages;
-				staticRules[ element.name ] = existingRules;
-				if ( argument.messages ) {
-					settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
-				}
-				break;
-			case "remove":
-				if ( !argument ) {
-					delete staticRules[ element.name ];
-					return existingRules;
-				}
-				filtered = {};
-				$.each( argument.split( /\s/ ), function( index, method ) {
-					filtered[ method ] = existingRules[ method ];
-					delete existingRules[ method ];
-				} );
-				return filtered;
-			}
-		}
-
-		data = $.validator.normalizeRules(
-		$.extend(
-			{},
-			$.validator.classRules( element ),
-			$.validator.attributeRules( element ),
-			$.validator.dataRules( element ),
-			$.validator.staticRules( element )
-		), element );
-
-		// Make sure required is at front
-		if ( data.required ) {
-			param = data.required;
-			delete data.required;
-			data = $.extend( { required: param }, data );
-		}
-
-		// Make sure remote is at back
-		if ( data.remote ) {
-			param = data.remote;
-			delete data.remote;
-			data = $.extend( data, { remote: param } );
-		}
-
-		return data;
-	}
-} );
-
-// Custom selectors
-$.extend( $.expr.pseudos || $.expr[ ":" ], {		// '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
-
-	// https://jqueryvalidation.org/blank-selector/
-	blank: function( a ) {
-		return !$.trim( "" + $( a ).val() );
-	},
-
-	// https://jqueryvalidation.org/filled-selector/
-	filled: function( a ) {
-		var val = $( a ).val();
-		return val !== null && !!$.trim( "" + val );
-	},
-
-	// https://jqueryvalidation.org/unchecked-selector/
-	unchecked: function( a ) {
-		return !$( a ).prop( "checked" );
-	}
-} );
-
-// Constructor for validator
-$.validator = function( options, form ) {
-	this.settings = $.extend( true, {}, $.validator.defaults, options );
-	this.currentForm = form;
-	this.init();
-};
-
-// https://jqueryvalidation.org/jQuery.validator.format/
-$.validator.format = function( source, params ) {
-	if ( arguments.length === 1 ) {
-		return function() {
-			var args = $.makeArray( arguments );
-			args.unshift( source );
-			return $.validator.format.apply( this, args );
-		};
-	}
-	if ( params === undefined ) {
-		return source;
-	}
-	if ( arguments.length > 2 && params.constructor !== Array  ) {
-		params = $.makeArray( arguments ).slice( 1 );
-	}
-	if ( params.constructor !== Array ) {
-		params = [ params ];
-	}
-	$.each( params, function( i, n ) {
-		source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
-			return n;
-		} );
-	} );
-	return source;
-};
-
-$.extend( $.validator, {
-
-	defaults: {
-		messages: {},
-		groups: {},
-		rules: {},
-		errorClass: "error",
-		pendingClass: "pending",
-		validClass: "valid",
-		errorElement: "label",
-		focusCleanup: false,
-		focusInvalid: true,
-		errorContainer: $( [] ),
-		errorLabelContainer: $( [] ),
-		onsubmit: true,
-		ignore: ":hidden",
-		ignoreTitle: false,
-		onfocusin: function( element ) {
-			this.lastActive = element;
-
-			// Hide error label and remove error class on focus if enabled
-			if ( this.settings.focusCleanup ) {
-				if ( this.settings.unhighlight ) {
-					this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
-				}
-				this.hideThese( this.errorsFor( element ) );
-			}
-		},
-		onfocusout: function( element ) {
-			if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
-				this.element( element );
-			}
-		},
-		onkeyup: function( element, event ) {
-
-			// Avoid revalidate the field when pressing one of the following keys
-			// Shift       => 16
-			// Ctrl        => 17
-			// Alt         => 18
-			// Caps lock   => 20
-			// End         => 35
-			// Home        => 36
-			// Left arrow  => 37
-			// Up arrow    => 38
-			// Right arrow => 39
-			// Down arrow  => 40
-			// Insert      => 45
-			// Num lock    => 144
-			// AltGr key   => 225
-			var excludedKeys = [
-				16, 17, 18, 20, 35, 36, 37,
-				38, 39, 40, 45, 144, 225
-			];
-
-			if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
-				return;
-			} else if ( element.name in this.submitted || element.name in this.invalid ) {
-				this.element( element );
-			}
-		},
-		onclick: function( element ) {
-
-			// Click on selects, radiobuttons and checkboxes
-			if ( element.name in this.submitted ) {
-				this.element( element );
-
-			// Or option elements, check parent select in that case
-			} else if ( element.parentNode.name in this.submitted ) {
-				this.element( element.parentNode );
-			}
-		},
-		highlight: function( element, errorClass, validClass ) {
-			if ( element.type === "radio" ) {
-				this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
-			} else {
-				$( element ).addClass( errorClass ).removeClass( validClass );
-			}
-		},
-		unhighlight: function( element, errorClass, validClass ) {
-			if ( element.type === "radio" ) {
-				this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
-			} else {
-				$( element ).removeClass( errorClass ).addClass( validClass );
-			}
-		}
-	},
-
-	// https://jqueryvalidation.org/jQuery.validator.setDefaults/
-	setDefaults: function( settings ) {
-		$.extend( $.validator.defaults, settings );
-	},
-
-	messages: {
-		required: "This field is required.",
-		remote: "Please fix this field.",
-		email: "Please enter a valid email address.",
-		url: "Please enter a valid URL.",
-		date: "Please enter a valid date.",
-		dateISO: "Please enter a valid date (ISO).",
-		number: "Please enter a valid number.",
-		digits: "Please enter only digits.",
-		equalTo: "Please enter the same value again.",
-		maxlength: $.validator.format( "Please enter no more than {0} characters." ),
-		minlength: $.validator.format( "Please enter at least {0} characters." ),
-		rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
-		range: $.validator.format( "Please enter a value between {0} and {1}." ),
-		max: $.validator.format( "Please enter a value less than or equal to {0}." ),
-		min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
-		step: $.validator.format( "Please enter a multiple of {0}." )
-	},
-
-	autoCreateRanges: false,
-
-	prototype: {
-
-		init: function() {
-			this.labelContainer = $( this.settings.errorLabelContainer );
-			this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
-			this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
-			this.submitted = {};
-			this.valueCache = {};
-			this.pendingRequest = 0;
-			this.pending = {};
-			this.invalid = {};
-			this.reset();
-
-			var groups = ( this.groups = {} ),
-				rules;
-			$.each( this.settings.groups, function( key, value ) {
-				if ( typeof value === "string" ) {
-					value = value.split( /\s/ );
-				}
-				$.each( value, function( index, name ) {
-					groups[ name ] = key;
-				} );
-			} );
-			rules = this.settings.rules;
-			$.each( rules, function( key, value ) {
-				rules[ key ] = $.validator.normalizeRule( value );
-			} );
-
-			function delegate( event ) {
-
-				// Set form expando on contenteditable
-				if ( !this.form && this.hasAttribute( "contenteditable" ) ) {
-					this.form = $( this ).closest( "form" )[ 0 ];
-					this.name = $( this ).attr( "name" );
-				}
-
-				var validator = $.data( this.form, "validator" ),
-					eventType = "on" + event.type.replace( /^validate/, "" ),
-					settings = validator.settings;
-				if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
-					settings[ eventType ].call( validator, this, event );
-				}
-			}
-
-			$( this.currentForm )
-				.on( "focusin.validate focusout.validate keyup.validate",
-					":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
-					"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
-					"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
-					"[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
-
-				// Support: Chrome, oldIE
-				// "select" is provided as event.target when clicking a option
-				.on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
-
-			if ( this.settings.invalidHandler ) {
-				$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
-			}
-		},
-
-		// https://jqueryvalidation.org/Validator.form/
-		form: function() {
-			this.checkForm();
-			$.extend( this.submitted, this.errorMap );
-			this.invalid = $.extend( {}, this.errorMap );
-			if ( !this.valid() ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
-			}
-			this.showErrors();
-			return this.valid();
-		},
-
-		checkForm: function() {
-			this.prepareForm();
-			for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
-				this.check( elements[ i ] );
-			}
-			return this.valid();
-		},
-
-		// https://jqueryvalidation.org/Validator.element/
-		element: function( element ) {
-			var cleanElement = this.clean( element ),
-				checkElement = this.validationTargetFor( cleanElement ),
-				v = this,
-				result = true,
-				rs, group;
-
-			if ( checkElement === undefined ) {
-				delete this.invalid[ cleanElement.name ];
-			} else {
-				this.prepareElement( checkElement );
-				this.currentElements = $( checkElement );
-
-				// If this element is grouped, then validate all group elements already
-				// containing a value
-				group = this.groups[ checkElement.name ];
-				if ( group ) {
-					$.each( this.groups, function( name, testgroup ) {
-						if ( testgroup === group && name !== checkElement.name ) {
-							cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
-							if ( cleanElement && cleanElement.name in v.invalid ) {
-								v.currentElements.push( cleanElement );
-								result = v.check( cleanElement ) && result;
-							}
-						}
-					} );
-				}
-
-				rs = this.check( checkElement ) !== false;
-				result = result && rs;
-				if ( rs ) {
-					this.invalid[ checkElement.name ] = false;
-				} else {
-					this.invalid[ checkElement.name ] = true;
-				}
-
-				if ( !this.numberOfInvalids() ) {
-
-					// Hide error containers on last error
-					this.toHide = this.toHide.add( this.containers );
-				}
-				this.showErrors();
-
-				// Add aria-invalid status for screen readers
-				$( element ).attr( "aria-invalid", !rs );
-			}
-
-			return result;
-		},
-
-		// https://jqueryvalidation.org/Validator.showErrors/
-		showErrors: function( errors ) {
-			if ( errors ) {
-				var validator = this;
-
-				// Add items to error list and map
-				$.extend( this.errorMap, errors );
-				this.errorList = $.map( this.errorMap, function( message, name ) {
-					return {
-						message: message,
-						element: validator.findByName( name )[ 0 ]
-					};
-				} );
-
-				// Remove items from success list
-				this.successList = $.grep( this.successList, function( element ) {
-					return !( element.name in errors );
-				} );
-			}
-			if ( this.settings.showErrors ) {
-				this.settings.showErrors.call( this, this.errorMap, this.errorList );
-			} else {
-				this.defaultShowErrors();
-			}
-		},
-
-		// https://jqueryvalidation.org/Validator.resetForm/
-		resetForm: function() {
-			if ( $.fn.resetForm ) {
-				$( this.currentForm ).resetForm();
-			}
-			this.invalid = {};
-			this.submitted = {};
-			this.prepareForm();
-			this.hideErrors();
-			var elements = this.elements()
-				.removeData( "previousValue" )
-				.removeAttr( "aria-invalid" );
-
-			this.resetElements( elements );
-		},
-
-		resetElements: function( elements ) {
-			var i;
-
-			if ( this.settings.unhighlight ) {
-				for ( i = 0; elements[ i ]; i++ ) {
-					this.settings.unhighlight.call( this, elements[ i ],
-						this.settings.errorClass, "" );
-					this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
-				}
-			} else {
-				elements
-					.removeClass( this.settings.errorClass )
-					.removeClass( this.settings.validClass );
-			}
-		},
-
-		numberOfInvalids: function() {
-			return this.objectLength( this.invalid );
-		},
-
-		objectLength: function( obj ) {
-			/* jshint unused: false */
-			var count = 0,
-				i;
-			for ( i in obj ) {
-
-				// This check allows counting elements with empty error
-				// message as invalid elements
-				if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
-					count++;
-				}
-			}
-			return count;
-		},
-
-		hideErrors: function() {
-			this.hideThese( this.toHide );
-		},
-
-		hideThese: function( errors ) {
-			errors.not( this.containers ).text( "" );
-			this.addWrapper( errors ).hide();
-		},
-
-		valid: function() {
-			return this.size() === 0;
-		},
-
-		size: function() {
-			return this.errorList.length;
-		},
-
-		focusInvalid: function() {
-			if ( this.settings.focusInvalid ) {
-				try {
-					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
-					.filter( ":visible" )
-					.focus()
-
-					// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
-					.trigger( "focusin" );
-				} catch ( e ) {
-
-					// Ignore IE throwing errors when focusing hidden elements
-				}
-			}
-		},
-
-		findLastActive: function() {
-			var lastActive = this.lastActive;
-			return lastActive && $.grep( this.errorList, function( n ) {
-				return n.element.name === lastActive.name;
-			} ).length === 1 && lastActive;
-		},
-
-		elements: function() {
-			var validator = this,
-				rulesCache = {};
-
-			// Select all valid inputs inside the form (no submit or reset buttons)
-			return $( this.currentForm )
-			.find( "input, select, textarea, [contenteditable]" )
-			.not( ":submit, :reset, :image, :disabled" )
-			.not( this.settings.ignore )
-			.filter( function() {
-				var name = this.name || $( this ).attr( "name" ); // For contenteditable
-				if ( !name && validator.settings.debug && window.console ) {
-					console.error( "%o has no name assigned", this );
-				}
-
-				// Set form expando on contenteditable
-				if ( this.hasAttribute( "contenteditable" ) ) {
-					this.form = $( this ).closest( "form" )[ 0 ];
-					this.name = name;
-				}
-
-				// Select only the first element for each name, and only those with rules specified
-				if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
-					return false;
-				}
-
-				rulesCache[ name ] = true;
-				return true;
-			} );
-		},
-
-		clean: function( selector ) {
-			return $( selector )[ 0 ];
-		},
-
-		errors: function() {
-			var errorClass = this.settings.errorClass.split( " " ).join( "." );
-			return $( this.settings.errorElement + "." + errorClass, this.errorContext );
-		},
-
-		resetInternals: function() {
-			this.successList = [];
-			this.errorList = [];
-			this.errorMap = {};
-			this.toShow = $( [] );
-			this.toHide = $( [] );
-		},
-
-		reset: function() {
-			this.resetInternals();
-			this.currentElements = $( [] );
-		},
-
-		prepareForm: function() {
-			this.reset();
-			this.toHide = this.errors().add( this.containers );
-		},
-
-		prepareElement: function( element ) {
-			this.reset();
-			this.toHide = this.errorsFor( element );
-		},
-
-		elementValue: function( element ) {
-			var $element = $( element ),
-				type = element.type,
-				val, idx;
-
-			if ( type === "radio" || type === "checkbox" ) {
-				return this.findByName( element.name ).filter( ":checked" ).val();
-			} else if ( type === "number" && typeof element.validity !== "undefined" ) {
-				return element.validity.badInput ? "NaN" : $element.val();
-			}
-
-			if ( element.hasAttribute( "contenteditable" ) ) {
-				val = $element.text();
-			} else {
-				val = $element.val();
-			}
-
-			if ( type === "file" ) {
-
-				// Modern browser (chrome & safari)
-				if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
-					return val.substr( 12 );
-				}
-
-				// Legacy browsers
-				// Unix-based path
-				idx = val.lastIndexOf( "/" );
-				if ( idx >= 0 ) {
-					return val.substr( idx + 1 );
-				}
-
-				// Windows-based path
-				idx = val.lastIndexOf( "\\" );
-				if ( idx >= 0 ) {
-					return val.substr( idx + 1 );
-				}
-
-				// Just the file name
-				return val;
-			}
-
-			if ( typeof val === "string" ) {
-				return val.replace( /\r/g, "" );
-			}
-			return val;
-		},
-
-		check: function( element ) {
-			element = this.validationTargetFor( this.clean( element ) );
-
-			var rules = $( element ).rules(),
-				rulesCount = $.map( rules, function( n, i ) {
-					return i;
-				} ).length,
-				dependencyMismatch = false,
-				val = this.elementValue( element ),
-				result, method, rule, normalizer;
-
-			// Prioritize the local normalizer defined for this element over the global one
-			// if the former exists, otherwise user the global one in case it exists.
-			if ( typeof rules.normalizer === "function" ) {
-				normalizer = rules.normalizer;
-			} else if (	typeof this.settings.normalizer === "function" ) {
-				normalizer = this.settings.normalizer;
-			}
-
-			// If normalizer is defined, then call it to retreive the changed value instead
-			// of using the real one.
-			// Note that `this` in the normalizer is `element`.
-			if ( normalizer ) {
-				val = normalizer.call( element, val );
-
-				if ( typeof val !== "string" ) {
-					throw new TypeError( "The normalizer should return a string value." );
-				}
-
-				// Delete the normalizer from rules to avoid treating it as a pre-defined method.
-				delete rules.normalizer;
-			}
-
-			for ( method in rules ) {
-				rule = { method: method, parameters: rules[ method ] };
-				try {
-					result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
-
-					// If a method indicates that the field is optional and therefore valid,
-					// don't mark it as valid when there are no other rules
-					if ( result === "dependency-mismatch" && rulesCount === 1 ) {
-						dependencyMismatch = true;
-						continue;
-					}
-					dependencyMismatch = false;
-
-					if ( result === "pending" ) {
-						this.toHide = this.toHide.not( this.errorsFor( element ) );
-						return;
-					}
-
-					if ( !result ) {
-						this.formatAndAdd( element, rule );
-						return false;
-					}
-				} catch ( e ) {
-					if ( this.settings.debug && window.console ) {
-						console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
-					}
-					if ( e instanceof TypeError ) {
-						e.message += ".  Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
-					}
-
-					throw e;
-				}
-			}
-			if ( dependencyMismatch ) {
-				return;
-			}
-			if ( this.objectLength( rules ) ) {
-				this.successList.push( element );
-			}
-			return true;
-		},
-
-		// Return the custom message for the given element and validation method
-		// specified in the element's HTML5 data attribute
-		// return the generic message if present and no method specific message is present
-		customDataMessage: function( element, method ) {
-			return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
-				method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
-		},
-
-		// Return the custom message for the given element name and validation method
-		customMessage: function( name, method ) {
-			var m = this.settings.messages[ name ];
-			return m && ( m.constructor === String ? m : m[ method ] );
-		},
-
-		// Return the first defined argument, allowing empty strings
-		findDefined: function() {
-			for ( var i = 0; i < arguments.length; i++ ) {
-				if ( arguments[ i ] !== undefined ) {
-					return arguments[ i ];
-				}
-			}
-			return undefined;
-		},
-
-		// The second parameter 'rule' used to be a string, and extended to an object literal
-		// of the following form:
-		// rule = {
-		//     method: "method name",
-		//     parameters: "the given method parameters"
-		// }
-		//
-		// The old behavior still supported, kept to maintain backward compatibility with
-		// old code, and will be removed in the next major release.
-		defaultMessage: function( element, rule ) {
-			if ( typeof rule === "string" ) {
-				rule = { method: rule };
-			}
-
-			var message = this.findDefined(
-					this.customMessage( element.name, rule.method ),
-					this.customDataMessage( element, rule.method ),
-
-					// 'title' is never undefined, so handle empty string as undefined
-					!this.settings.ignoreTitle && element.title || undefined,
-					$.validator.messages[ rule.method ],
-					"<strong>Warning: No message defined for " + element.name + "</strong>"
-				),
-				theregex = /\$?\{(\d+)\}/g;
-			if ( typeof message === "function" ) {
-				message = message.call( this, rule.parameters, element );
-			} else if ( theregex.test( message ) ) {
-				message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
-			}
-
-			return message;
-		},
-
-		formatAndAdd: function( element, rule ) {
-			var message = this.defaultMessage( element, rule );
-
-			this.errorList.push( {
-				message: message,
-				element: element,
-				method: rule.method
-			} );
-
-			this.errorMap[ element.name ] = message;
-			this.submitted[ element.name ] = message;
-		},
-
-		addWrapper: function( toToggle ) {
-			if ( this.settings.wrapper ) {
-				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
-			}
-			return toToggle;
-		},
-
-		defaultShowErrors: function() {
-			var i, elements, error;
-			for ( i = 0; this.errorList[ i ]; i++ ) {
-				error = this.errorList[ i ];
-				if ( this.settings.highlight ) {
-					this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
-				}
-				this.showLabel( error.element, error.message );
-			}
-			if ( this.errorList.length ) {
-				this.toShow = this.toShow.add( this.containers );
-			}
-			if ( this.settings.success ) {
-				for ( i = 0; this.successList[ i ]; i++ ) {
-					this.showLabel( this.successList[ i ] );
-				}
-			}
-			if ( this.settings.unhighlight ) {
-				for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
-					this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
-				}
-			}
-			this.toHide = this.toHide.not( this.toShow );
-			this.hideErrors();
-			this.addWrapper( this.toShow ).show();
-		},
-
-		validElements: function() {
-			return this.currentElements.not( this.invalidElements() );
-		},
-
-		invalidElements: function() {
-			return $( this.errorList ).map( function() {
-				return this.element;
-			} );
-		},
-
-		showLabel: function( element, message ) {
-			var place, group, errorID, v,
-				error = this.errorsFor( element ),
-				elementID = this.idOrName( element ),
-				describedBy = $( element ).attr( "aria-describedby" );
-
-			if ( error.length ) {
-
-				// Refresh error/success class
-				error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
-
-				// Replace message on existing label
-				error.html( message );
-			} else {
-
-				// Create error element
-				error = $( "<" + this.settings.errorElement + ">" )
-					.attr( "id", elementID + "-error" )
-					.addClass( this.settings.errorClass )
-					.html( message || "" );
-
-				// Maintain reference to the element to be placed into the DOM
-				place = error;
-				if ( this.settings.wrapper ) {
-
-					// Make sure the element is visible, even in IE
-					// actually showing the wrapped element is handled elsewhere
-					place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
-				}
-				if ( this.labelContainer.length ) {
-					this.labelContainer.append( place );
-				} else if ( this.settings.errorPlacement ) {
-					this.settings.errorPlacement.call( this, place, $( element ) );
-				} else {
-					place.insertAfter( element );
-				}
-
-				// Link error back to the element
-				if ( error.is( "label" ) ) {
-
-					// If the error is a label, then associate using 'for'
-					error.attr( "for", elementID );
-
-					// If the element is not a child of an associated label, then it's necessary
-					// to explicitly apply aria-describedby
-				} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
-					errorID = error.attr( "id" );
-
-					// Respect existing non-error aria-describedby
-					if ( !describedBy ) {
-						describedBy = errorID;
-					} else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
-
-						// Add to end of list if not already present
-						describedBy += " " + errorID;
-					}
-					$( element ).attr( "aria-describedby", describedBy );
-
-					// If this element is grouped, then assign to all elements in the same group
-					group = this.groups[ element.name ];
-					if ( group ) {
-						v = this;
-						$.each( v.groups, function( name, testgroup ) {
-							if ( testgroup === group ) {
-								$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
-									.attr( "aria-describedby", error.attr( "id" ) );
-							}
-						} );
-					}
-				}
-			}
-			if ( !message && this.settings.success ) {
-				error.text( "" );
-				if ( typeof this.settings.success === "string" ) {
-					error.addClass( this.settings.success );
-				} else {
-					this.settings.success( error, element );
-				}
-			}
-			this.toShow = this.toShow.add( error );
-		},
-
-		errorsFor: function( element ) {
-			var name = this.escapeCssMeta( this.idOrName( element ) ),
-				describer = $( element ).attr( "aria-describedby" ),
-				selector = "label[for='" + name + "'], label[for='" + name + "'] *";
-
-			// 'aria-describedby' should directly reference the error element
-			if ( describer ) {
-				selector = selector + ", #" + this.escapeCssMeta( describer )
-					.replace( /\s+/g, ", #" );
-			}
-
-			return this
-				.errors()
-				.filter( selector );
-		},
-
-		// See https://api.jquery.com/category/selectors/, for CSS
-		// meta-characters that should be escaped in order to be used with JQuery
-		// as a literal part of a name/id or any selector.
-		escapeCssMeta: function( string ) {
-			return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
-		},
-
-		idOrName: function( element ) {
-			return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
-		},
-
-		validationTargetFor: function( element ) {
-
-			// If radio/checkbox, validate first element in group instead
-			if ( this.checkable( element ) ) {
-				element = this.findByName( element.name );
-			}
-
-			// Always apply ignore filter
-			return $( element ).not( this.settings.ignore )[ 0 ];
-		},
-
-		checkable: function( element ) {
-			return ( /radio|checkbox/i ).test( element.type );
-		},
-
-		findByName: function( name ) {
-			return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
-		},
-
-		getLength: function( value, element ) {
-			switch ( element.nodeName.toLowerCase() ) {
-			case "select":
-				return $( "option:selected", element ).length;
-			case "input":
-				if ( this.checkable( element ) ) {
-					return this.findByName( element.name ).filter( ":checked" ).length;
-				}
-			}
-			return value.length;
-		},
-
-		depend: function( param, element ) {
-			return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
-		},
-
-		dependTypes: {
-			"boolean": function( param ) {
-				return param;
-			},
-			"string": function( param, element ) {
-				return !!$( param, element.form ).length;
-			},
-			"function": function( param, element ) {
-				return param( element );
-			}
-		},
-
-		optional: function( element ) {
-			var val = this.elementValue( element );
-			return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
-		},
-
-		startRequest: function( element ) {
-			if ( !this.pending[ element.name ] ) {
-				this.pendingRequest++;
-				$( element ).addClass( this.settings.pendingClass );
-				this.pending[ element.name ] = true;
-			}
-		},
-
-		stopRequest: function( element, valid ) {
-			this.pendingRequest--;
-
-			// Sometimes synchronization fails, make sure pendingRequest is never < 0
-			if ( this.pendingRequest < 0 ) {
-				this.pendingRequest = 0;
-			}
-			delete this.pending[ element.name ];
-			$( element ).removeClass( this.settings.pendingClass );
-			if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
-				$( this.currentForm ).submit();
-
-				// Remove the hidden input that was used as a replacement for the
-				// missing submit button. The hidden input is added by `handle()`
-				// to ensure that the value of the used submit button is passed on
-				// for scripted submits triggered by this method
-				if ( this.submitButton ) {
-					$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
-				}
-
-				this.formSubmitted = false;
-			} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
-				this.formSubmitted = false;
-			}
-		},
-
-		previousValue: function( element, method ) {
-			method = typeof method === "string" && method || "remote";
-
-			return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
-				old: null,
-				valid: true,
-				message: this.defaultMessage( element, { method: method } )
-			} );
-		},
-
-		// Cleans up all forms and elements, removes validator-specific events
-		destroy: function() {
-			this.resetForm();
-
-			$( this.currentForm )
-				.off( ".validate" )
-				.removeData( "validator" )
-				.find( ".validate-equalTo-blur" )
-					.off( ".validate-equalTo" )
-					.removeClass( "validate-equalTo-blur" );
-		}
-
-	},
-
-	classRuleSettings: {
-		required: { required: true },
-		email: { email: true },
-		url: { url: true },
-		date: { date: true },
-		dateISO: { dateISO: true },
-		number: { number: true },
-		digits: { digits: true },
-		creditcard: { creditcard: true }
-	},
-
-	addClassRules: function( className, rules ) {
-		if ( className.constructor === String ) {
-			this.classRuleSettings[ className ] = rules;
-		} else {
-			$.extend( this.classRuleSettings, className );
-		}
-	},
-
-	classRules: function( element ) {
-		var rules = {},
-			classes = $( element ).attr( "class" );
-
-		if ( classes ) {
-			$.each( classes.split( " " ), function() {
-				if ( this in $.validator.classRuleSettings ) {
-					$.extend( rules, $.validator.classRuleSettings[ this ] );
-				}
-			} );
-		}
-		return rules;
-	},
-
-	normalizeAttributeRule: function( rules, type, method, value ) {
-
-		// Convert the value to a number for number inputs, and for text for backwards compability
-		// allows type="date" and others to be compared as strings
-		if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
-			value = Number( value );
-
-			// Support Opera Mini, which returns NaN for undefined minlength
-			if ( isNaN( value ) ) {
-				value = undefined;
-			}
-		}
-
-		if ( value || value === 0 ) {
-			rules[ method ] = value;
-		} else if ( type === method && type !== "range" ) {
-
-			// Exception: the jquery validate 'range' method
-			// does not test for the html5 'range' type
-			rules[ method ] = true;
-		}
-	},
-
-	attributeRules: function( element ) {
-		var rules = {},
-			$element = $( element ),
-			type = element.getAttribute( "type" ),
-			method, value;
-
-		for ( method in $.validator.methods ) {
-
-			// Support for <input required> in both html5 and older browsers
-			if ( method === "required" ) {
-				value = element.getAttribute( method );
-
-				// Some browsers return an empty string for the required attribute
-				// and non-HTML5 browsers might have required="" markup
-				if ( value === "" ) {
-					value = true;
-				}
-
-				// Force non-HTML5 browsers to return bool
-				value = !!value;
-			} else {
-				value = $element.attr( method );
-			}
-
-			this.normalizeAttributeRule( rules, type, method, value );
-		}
-
-		// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
-		if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
-			delete rules.maxlength;
-		}
-
-		return rules;
-	},
-
-	dataRules: function( element ) {
-		var rules = {},
-			$element = $( element ),
-			type = element.getAttribute( "type" ),
-			method, value;
-
-		for ( method in $.validator.methods ) {
-			value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
-			this.normalizeAttributeRule( rules, type, method, value );
-		}
-		return rules;
-	},
-
-	staticRules: function( element ) {
-		var rules = {},
-			validator = $.data( element.form, "validator" );
-
-		if ( validator.settings.rules ) {
-			rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
-		}
-		return rules;
-	},
-
-	normalizeRules: function( rules, element ) {
-
-		// Handle dependency check
-		$.each( rules, function( prop, val ) {
-
-			// Ignore rule when param is explicitly false, eg. required:false
-			if ( val === false ) {
-				delete rules[ prop ];
-				return;
-			}
-			if ( val.param || val.depends ) {
-				var keepRule = true;
-				switch ( typeof val.depends ) {
-				case "string":
-					keepRule = !!$( val.depends, element.form ).length;
-					break;
-				case "function":
-					keepRule = val.depends.call( element, element );
-					break;
-				}
-				if ( keepRule ) {
-					rules[ prop ] = val.param !== undefined ? val.param : true;
-				} else {
-					$.data( element.form, "validator" ).resetElements( $( element ) );
-					delete rules[ prop ];
-				}
-			}
-		} );
-
-		// Evaluate parameters
-		$.each( rules, function( rule, parameter ) {
-			rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter;
-		} );
-
-		// Clean number parameters
-		$.each( [ "minlength", "maxlength" ], function() {
-			if ( rules[ this ] ) {
-				rules[ this ] = Number( rules[ this ] );
-			}
-		} );
-		$.each( [ "rangelength", "range" ], function() {
-			var parts;
-			if ( rules[ this ] ) {
-				if ( $.isArray( rules[ this ] ) ) {
-					rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
-				} else if ( typeof rules[ this ] === "string" ) {
-					parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
-					rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
-				}
-			}
-		} );
-
-		if ( $.validator.autoCreateRanges ) {
-
-			// Auto-create ranges
-			if ( rules.min != null && rules.max != null ) {
-				rules.range = [ rules.min, rules.max ];
-				delete rules.min;
-				delete rules.max;
-			}
-			if ( rules.minlength != null && rules.maxlength != null ) {
-				rules.rangelength = [ rules.minlength, rules.maxlength ];
-				delete rules.minlength;
-				delete rules.maxlength;
-			}
-		}
-
-		return rules;
-	},
-
-	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
-	normalizeRule: function( data ) {
-		if ( typeof data === "string" ) {
-			var transformed = {};
-			$.each( data.split( /\s/ ), function() {
-				transformed[ this ] = true;
-			} );
-			data = transformed;
-		}
-		return data;
-	},
-
-	// https://jqueryvalidation.org/jQuery.validator.addMethod/
-	addMethod: function( name, method, message ) {
-		$.validator.methods[ name ] = method;
-		$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
-		if ( method.length < 3 ) {
-			$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
-		}
-	},
-
-	// https://jqueryvalidation.org/jQuery.validator.methods/
-	methods: {
-
-		// https://jqueryvalidation.org/required-method/
-		required: function( value, element, param ) {
-
-			// Check if dependency is met
-			if ( !this.depend( param, element ) ) {
-				return "dependency-mismatch";
-			}
-			if ( element.nodeName.toLowerCase() === "select" ) {
-
-				// Could be an array for select-multiple or a string, both are fine this way
-				var val = $( element ).val();
-				return val && val.length > 0;
-			}
-			if ( this.checkable( element ) ) {
-				return this.getLength( value, element ) > 0;
-			}
-			return value.length > 0;
-		},
-
-		// https://jqueryvalidation.org/email-method/
-		email: function( value, element ) {
-
-			// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
-			// Retrieved 2014-01-14
-			// If you have a problem with this implementation, report a bug against the above spec
-			// Or use custom methods to implement your own email validation
-			return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/url-method/
-		url: function( value, element ) {
-
-			// Copyright (c) 2010-2013 Diego Perini, MIT licensed
-			// https://gist.github.com/dperini/729294
-			// see also https://mathiasbynens.be/demo/url-regex
-			// modified to allow protocol-relative URLs
-			return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
-		},
-
-		// https://jqueryvalidation.org/date-method/
-		date: function( value, element ) {
-			return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
-		},
-
-		// https://jqueryvalidation.org/dateISO-method/
-		dateISO: function( value, element ) {
-			return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/number-method/
-		number: function( value, element ) {
-			return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/digits-method/
-		digits: function( value, element ) {
-			return this.optional( element ) || /^\d+$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/minlength-method/
-		minlength: function( value, element, param ) {
-			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
-			return this.optional( element ) || length >= param;
-		},
-
-		// https://jqueryvalidation.org/maxlength-method/
-		maxlength: function( value, element, param ) {
-			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
-			return this.optional( element ) || length <= param;
-		},
-
-		// https://jqueryvalidation.org/rangelength-method/
-		rangelength: function( value, element, param ) {
-			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
-			return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
-		},
-
-		// https://jqueryvalidation.org/min-method/
-		min: function( value, element, param ) {
-			return this.optional( element ) || value >= param;
-		},
-
-		// https://jqueryvalidation.org/max-method/
-		max: function( value, element, param ) {
-			return this.optional( element ) || value <= param;
-		},
-
-		// https://jqueryvalidation.org/range-method/
-		range: function( value, element, param ) {
-			return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
-		},
-
-		// https://jqueryvalidation.org/step-method/
-		step: function( value, element, param ) {
-			var type = $( element ).attr( "type" ),
-				errorMessage = "Step attribute on input type " + type + " is not supported.",
-				supportedTypes = [ "text", "number", "range" ],
-				re = new RegExp( "\\b" + type + "\\b" ),
-				notSupported = type && !re.test( supportedTypes.join() ),
-				decimalPlaces = function( num ) {
-					var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
-					if ( !match ) {
-						return 0;
-					}
-
-					// Number of digits right of decimal point.
-					return match[ 1 ] ? match[ 1 ].length : 0;
-				},
-				toInt = function( num ) {
-					return Math.round( num * Math.pow( 10, decimals ) );
-				},
-				valid = true,
-				decimals;
-
-			// Works only for text, number and range input types
-			// TODO find a way to support input types date, datetime, datetime-local, month, time and week
-			if ( notSupported ) {
-				throw new Error( errorMessage );
-			}
-
-			decimals = decimalPlaces( param );
-
-			// Value can't have too many decimals
-			if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
-				valid = false;
-			}
-
-			return this.optional( element ) || valid;
-		},
-
-		// https://jqueryvalidation.org/equalTo-method/
-		equalTo: function( value, element, param ) {
-
-			// Bind to the blur event of the target in order to revalidate whenever the target field is updated
-			var target = $( param );
-			if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
-				target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
-					$( element ).valid();
-				} );
-			}
-			return value === target.val();
-		},
-
-		// https://jqueryvalidation.org/remote-method/
-		remote: function( value, element, param, method ) {
-			if ( this.optional( element ) ) {
-				return "dependency-mismatch";
-			}
-
-			method = typeof method === "string" && method || "remote";
-
-			var previous = this.previousValue( element, method ),
-				validator, data, optionDataString;
-
-			if ( !this.settings.messages[ element.name ] ) {
-				this.settings.messages[ element.name ] = {};
-			}
-			previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
-			this.settings.messages[ element.name ][ method ] = previous.message;
-
-			param = typeof param === "string" && { url: param } || param;
-			optionDataString = $.param( $.extend( { data: value }, param.data ) );
-			if ( previous.old === optionDataString ) {
-				return previous.valid;
-			}
-
-			previous.old = optionDataString;
-			validator = this;
-			this.startRequest( element );
-			data = {};
-			data[ element.name ] = value;
-			$.ajax( $.extend( true, {
-				mode: "abort",
-				port: "validate" + element.name,
-				dataType: "json",
-				data: data,
-				context: validator.currentForm,
-				success: function( response ) {
-					var valid = response === true || response === "true",
-						errors, message, submitted;
-
-					validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
-					if ( valid ) {
-						submitted = validator.formSubmitted;
-						validator.resetInternals();
-						validator.toHide = validator.errorsFor( element );
-						validator.formSubmitted = submitted;
-						validator.successList.push( element );
-						validator.invalid[ element.name ] = false;
-						validator.showErrors();
-					} else {
-						errors = {};
-						message = response || validator.defaultMessage( element, { method: method, parameters: value } );
-						errors[ element.name ] = previous.message = message;
-						validator.invalid[ element.name ] = true;
-						validator.showErrors( errors );
-					}
-					previous.valid = valid;
-					validator.stopRequest( element, valid );
-				}
-			}, param ) );
-			return "pending";
-		}
-	}
-
-} );
-

-// Ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
-
-var pendingRequests = {},
-	ajax;
-
-// Use a prefilter if available (1.5+)
-if ( $.ajaxPrefilter ) {
-	$.ajaxPrefilter( function( settings, _, xhr ) {
-		var port = settings.port;
-		if ( settings.mode === "abort" ) {
-			if ( pendingRequests[ port ] ) {
-				pendingRequests[ port ].abort();
-			}
-			pendingRequests[ port ] = xhr;
-		}
-	} );
-} else {
-
-	// Proxy ajax
-	ajax = $.ajax;
-	$.ajax = function( settings ) {
-		var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
-			port = ( "port" in settings ? settings : $.ajaxSettings ).port;
-		if ( mode === "abort" ) {
-			if ( pendingRequests[ port ] ) {
-				pendingRequests[ port ].abort();
-			}
-			pendingRequests[ port ] = ajax.apply( this, arguments );
-			return pendingRequests[ port ];
-		}
-		return ajax.apply( this, arguments );
-	};
-}
-return $;

-}));
\ No newline at end of file
diff --git a/ui/legacy/lib/qunit/qunit.css b/ui/legacy/lib/qunit/qunit.css
deleted file mode 100644
index 2b15668..0000000
--- a/ui/legacy/lib/qunit/qunit.css
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * QUnit v1.4.0pre - A JavaScript Unit Testing Framework
- *
- * http://docs.jquery.com/QUnit
- *
- * Copyright (c) 2012 John Resig, Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * or GPL (GPL-LICENSE.txt) licenses.
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
-	margin: 0;
-	padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-	padding: 0.5em 0 0.5em 1em;
-
-	color: #8699a4;
-	background-color: #0d3349;
-
-	font-size: 1.5em;
-	line-height: 1em;
-	font-weight: normal;
-
-	border-radius: 15px 15px 0 0;
-	-moz-border-radius: 15px 15px 0 0;
-	-webkit-border-top-right-radius: 15px;
-	-webkit-border-top-left-radius: 15px;
-}
-
-#qunit-header a {
-	text-decoration: none;
-	color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-	color: #fff;
-}
-
-#qunit-header label {
-	display: inline-block;
-}
-
-#qunit-banner {
-	height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-	padding: 0.5em 0 0.5em 2em;
-	color: #5E740B;
-	background-color: #eee;
-}
-
-#qunit-userAgent {
-	padding: 0.5em 0 0.5em 2.5em;
-	background-color: #2b81af;
-	color: #fff;
-	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-	list-style-position: inside;
-}
-
-#qunit-tests li {
-	padding: 0.4em 0.5em 0.4em 2.5em;
-	border-bottom: 1px solid #fff;
-	list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-	display: none;
-}
-
-#qunit-tests li strong {
-	cursor: pointer;
-}
-
-#qunit-tests li a {
-	padding: 0.5em;
-	color: #c2ccd1;
-	text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-	color: #000;
-}
-
-#qunit-tests ol {
-	margin-top: 0.5em;
-	padding: 0.5em;
-
-	background-color: #fff;
-
-	border-radius: 15px;
-	-moz-border-radius: 15px;
-	-webkit-border-radius: 15px;
-
-	box-shadow: inset 0px 2px 13px #999;
-	-moz-box-shadow: inset 0px 2px 13px #999;
-	-webkit-box-shadow: inset 0px 2px 13px #999;
-}
-
-#qunit-tests table {
-	border-collapse: collapse;
-	margin-top: .2em;
-}
-
-#qunit-tests th {
-	text-align: right;
-	vertical-align: top;
-	padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-	vertical-align: top;
-}
-
-#qunit-tests pre {
-	margin: 0;
-	white-space: pre-wrap;
-	word-wrap: break-word;
-}
-
-#qunit-tests del {
-	background-color: #e0f2be;
-	color: #374e0c;
-	text-decoration: none;
-}
-
-#qunit-tests ins {
-	background-color: #ffcaca;
-	color: #500;
-	text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-	margin: 0.5em;
-	padding: 0.4em 0.5em 0.4em 0.5em;
-	background-color: #fff;
-	border-bottom: none;
-	list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-	color: #5E740B;
-	background-color: #fff;
-	border-left: 26px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-	color: #710909;
-	background-color: #fff;
-	border-left: 26px solid #EE5757;
-	white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-	border-radius: 0 0 15px 15px;
-	-moz-border-radius: 0 0 15px 15px;
-	-webkit-border-bottom-right-radius: 15px;
-	-webkit-border-bottom-left-radius: 15px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-	padding: 0.5em 0.5em 0.5em 2.5em;
-
-	color: #2b81af;
-	background-color: #D2E0E6;
-
-	border-bottom: 1px solid white;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-	position: absolute;
-	top: -10000px;
-	left: -10000px;
-	width: 1000px;
-	height: 1000px;
-}
-
diff --git a/ui/legacy/lib/qunit/qunit.js b/ui/legacy/lib/qunit/qunit.js
deleted file mode 100644
index 65f7c66..0000000
--- a/ui/legacy/lib/qunit/qunit.js
+++ /dev/null
@@ -1,1633 +0,0 @@
-/**
- * QUnit v1.4.0pre - A JavaScript Unit Testing Framework
- *
- * http://docs.jquery.com/QUnit
- *
- * Copyright (c) 2012 John Resig, Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * or GPL (GPL-LICENSE.txt) licenses.
- */
-
-(function(window) {
-
-var defined = {
-	setTimeout: typeof window.setTimeout !== "undefined",
-	sessionStorage: (function() {
-		var x = "qunit-test-string";
-		try {
-			sessionStorage.setItem(x, x);
-			sessionStorage.removeItem(x);
-			return true;
-		} catch(e) {
-			return false;
-		}
-	})()
-};
-
-var	testId = 0,
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty;
-
-var Test = function(name, testName, expected, async, callback) {
-	this.name = name;
-	this.testName = testName;
-	this.expected = expected;
-	this.async = async;
-	this.callback = callback;
-	this.assertions = [];
-};
-Test.prototype = {
-	init: function() {
-		var tests = id("qunit-tests");
-		if (tests) {
-			var b = document.createElement("strong");
-				b.innerHTML = "Running " + this.name;
-			var li = document.createElement("li");
-				li.appendChild( b );
-				li.className = "running";
-				li.id = this.id = "test-output" + testId++;
-			tests.appendChild( li );
-		}
-	},
-	setup: function() {
-		if (this.module != config.previousModule) {
-			if ( config.previousModule ) {
-				runLoggingCallbacks('moduleDone', QUnit, {
-					name: config.previousModule,
-					failed: config.moduleStats.bad,
-					passed: config.moduleStats.all - config.moduleStats.bad,
-					total: config.moduleStats.all
-				} );
-			}
-			config.previousModule = this.module;
-			config.moduleStats = { all: 0, bad: 0 };
-			runLoggingCallbacks( 'moduleStart', QUnit, {
-				name: this.module
-			} );
-		} else if (config.autorun) {
-			runLoggingCallbacks( 'moduleStart', QUnit, {
-				name: this.module
-			} );
-		}
-
-		config.current = this;
-		this.testEnvironment = extend({
-			setup: function() {},
-			teardown: function() {}
-		}, this.moduleTestEnvironment);
-
-		runLoggingCallbacks( 'testStart', QUnit, {
-			name: this.testName,
-			module: this.module
-		});
-
-		// allow utility functions to access the current test environment
-		// TODO why??
-		QUnit.current_testEnvironment = this.testEnvironment;
-
-		try {
-			if ( !config.pollution ) {
-				saveGlobal();
-			}
-
-			this.testEnvironment.setup.call(this.testEnvironment);
-		} catch(e) {
-			QUnit.ok( false, "Setup failed on " + this.testName + ": " + e.message );
-		}
-	},
-	run: function() {
-		config.current = this;
-		if ( this.async ) {
-			QUnit.stop();
-		}
-
-		if ( config.notrycatch ) {
-			this.callback.call(this.testEnvironment);
-			return;
-		}
-		try {
-			this.callback.call(this.testEnvironment);
-		} catch(e) {
-			fail("Test " + this.testName + " died, exception and test follows", e, this.callback);
-			QUnit.ok( false, "Died on test #" + (this.assertions.length + 1) + ": " + e.message + " - " + QUnit.jsDump.parse(e) );
-			// else next test will carry the responsibility
-			saveGlobal();
-
-			// Restart the tests if they're blocking
-			if ( config.blocking ) {
-				QUnit.start();
-			}
-		}
-	},
-	teardown: function() {
-		config.current = this;
-		try {
-			this.testEnvironment.teardown.call(this.testEnvironment);
-			checkPollution();
-		} catch(e) {
-			QUnit.ok( false, "Teardown failed on " + this.testName + ": " + e.message );
-		}
-	},
-	finish: function() {
-		config.current = this;
-		if ( this.expected != null && this.expected != this.assertions.length ) {
-			QUnit.ok( false, "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" );
-		}
-
-		var good = 0, bad = 0,
-			tests = id("qunit-tests");
-
-		config.stats.all += this.assertions.length;
-		config.moduleStats.all += this.assertions.length;
-
-		if ( tests ) {
-			var ol = document.createElement("ol");
-
-			for ( var i = 0; i < this.assertions.length; i++ ) {
-				var assertion = this.assertions[i];
-
-				var li = document.createElement("li");
-				li.className = assertion.result ? "pass" : "fail";
-				li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed");
-				ol.appendChild( li );
-
-				if ( assertion.result ) {
-					good++;
-				} else {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-
-			// store result when possible
-			if ( QUnit.config.reorder && defined.sessionStorage ) {
-				if (bad) {
-					sessionStorage.setItem("qunit-" + this.module + "-" + this.testName, bad);
-				} else {
-					sessionStorage.removeItem("qunit-" + this.module + "-" + this.testName);
-				}
-			}
-
-			if (bad == 0) {
-				ol.style.display = "none";
-			}
-
-			var b = document.createElement("strong");
-			b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-			var a = document.createElement("a");
-			a.innerHTML = "Rerun";
-			a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
-
-			addEvent(b, "click", function() {
-				var next = b.nextSibling.nextSibling,
-					display = next.style.display;
-				next.style.display = display === "none" ? "block" : "none";
-			});
-
-			addEvent(b, "dblclick", function(e) {
-				var target = e && e.target ? e.target : window.event.srcElement;
-				if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
-					target = target.parentNode;
-				}
-				if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-					window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
-				}
-			});
-
-			var li = id(this.id);
-			li.className = bad ? "fail" : "pass";
-			li.removeChild( li.firstChild );
-			li.appendChild( b );
-			li.appendChild( a );
-			li.appendChild( ol );
-
-		} else {
-			for ( var i = 0; i < this.assertions.length; i++ ) {
-				if ( !this.assertions[i].result ) {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-		}
-
-		try {
-			QUnit.reset();
-		} catch(e) {
-			fail("reset() failed, following Test " + this.testName + ", exception and reset fn follows", e, QUnit.reset);
-		}
-
-		runLoggingCallbacks( 'testDone', QUnit, {
-			name: this.testName,
-			module: this.module,
-			failed: bad,
-			passed: this.assertions.length - bad,
-			total: this.assertions.length
-		} );
-	},
-
-	queue: function() {
-		var test = this;
-		synchronize(function() {
-			test.init();
-		});
-		function run() {
-			// each of these can by async
-			synchronize(function() {
-				test.setup();
-			});
-			synchronize(function() {
-				test.run();
-			});
-			synchronize(function() {
-				test.teardown();
-			});
-			synchronize(function() {
-				test.finish();
-			});
-		}
-		// defer when previous test run passed, if storage is available
-		var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.module + "-" + this.testName);
-		if (bad) {
-			run();
-		} else {
-			synchronize(run, true);
-		};
-	}
-
-};
-
-var QUnit = {
-
-	// call on start of module test to prepend name to all tests
-	module: function(name, testEnvironment) {
-		config.currentModule = name;
-		config.currentModuleTestEnviroment = testEnvironment;
-	},
-
-	asyncTest: function(testName, expected, callback) {
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		QUnit.test(testName, expected, callback, true);
-	},
-
-	test: function(testName, expected, callback, async) {
-		var name = '<span class="test-name">' + escapeInnerText(testName) + '</span>';
-
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		if ( config.currentModule ) {
-			name = '<span class="module-name">' + config.currentModule + "</span>: " + name;
-		}
-
-		if ( !validTest(config.currentModule + ": " + testName) ) {
-			return;
-		}
-
-		var test = new Test(name, testName, expected, async, callback);
-		test.module = config.currentModule;
-		test.moduleTestEnvironment = config.currentModuleTestEnviroment;
-		test.queue();
-	},
-
-	/**
-	 * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
-	 */
-	expect: function(asserts) {
-		config.current.expected = asserts;
-	},
-
-	/**
-	 * Asserts true.
-	 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-	 */
-	ok: function(a, msg) {
-		if (!config.current) {
-			throw new Error("ok() assertion outside test context, was " + sourceFromStacktrace(2));
-		}
-		a = !!a;
-		var details = {
-			result: a,
-			message: msg
-		};
-		msg = escapeInnerText(msg);
-		runLoggingCallbacks( 'log', QUnit, details );
-		config.current.assertions.push({
-			result: a,
-			message: msg
-		});
-	},
-
-	/**
-	 * Checks that the first two arguments are equal, with an optional message.
-	 * Prints out both actual and expected values.
-	 *
-	 * Prefered to ok( actual == expected, message )
-	 *
-	 * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
-	 *
-	 * @param Object actual
-	 * @param Object expected
-	 * @param String message (optional)
-	 */
-	equal: function(actual, expected, message) {
-		QUnit.push(expected == actual, actual, expected, message);
-	},
-
-	notEqual: function(actual, expected, message) {
-		QUnit.push(expected != actual, actual, expected, message);
-	},
-
-	deepEqual: function(actual, expected, message) {
-		QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
-	},
-
-	notDeepEqual: function(actual, expected, message) {
-		QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);
-	},
-
-	strictEqual: function(actual, expected, message) {
-		QUnit.push(expected === actual, actual, expected, message);
-	},
-
-	notStrictEqual: function(actual, expected, message) {
-		QUnit.push(expected !== actual, actual, expected, message);
-	},
-
-	raises: function(block, expected, message) {
-		var actual, ok = false;
-
-		if (typeof expected === 'string') {
-			message = expected;
-			expected = null;
-		}
-
-		try {
-			block();
-		} catch (e) {
-			actual = e;
-		}
-
-		if (actual) {
-			// we don't want to validate thrown error
-			if (!expected) {
-				ok = true;
-			// expected is a regexp
-			} else if (QUnit.objectType(expected) === "regexp") {
-				ok = expected.test(actual);
-			// expected is a constructor
-			} else if (actual instanceof expected) {
-				ok = true;
-			// expected is a validation function which returns true is validation passed
-			} else if (expected.call({}, actual) === true) {
-				ok = true;
-			}
-		}
-
-		QUnit.ok(ok, message);
-	},
-
-	start: function(count) {
-		config.semaphore -= count || 1;
-		if (config.semaphore > 0) {
-			// don't start until equal number of stop-calls
-			return;
-		}
-		if (config.semaphore < 0) {
-			// ignore if start is called more often then stop
-			config.semaphore = 0;
-		}
-		// A slight delay, to avoid any current callbacks
-		if ( defined.setTimeout ) {
-			window.setTimeout(function() {
-				if (config.semaphore > 0) {
-					return;
-				}
-				if ( config.timeout ) {
-					clearTimeout(config.timeout);
-				}
-
-				config.blocking = false;
-				process(true);
-			}, 13);
-		} else {
-			config.blocking = false;
-			process(true);
-		}
-	},
-
-	stop: function(count) {
-		config.semaphore += count || 1;
-		config.blocking = true;
-
-		if ( config.testTimeout && defined.setTimeout ) {
-			clearTimeout(config.timeout);
-			config.timeout = window.setTimeout(function() {
-				QUnit.ok( false, "Test timed out" );
-				config.semaphore = 1;
-				QUnit.start();
-			}, config.testTimeout);
-		}
-	}
-};
-
-//We want access to the constructor's prototype
-(function() {
-	function F(){};
-	F.prototype = QUnit;
-	QUnit = new F();
-	//Make F QUnit's constructor so that we can add to the prototype later
-	QUnit.constructor = F;
-})();
-
-// deprecated; still export them to window to provide clear error messages
-// next step: remove entirely
-QUnit.equals = function() {
-	throw new Error("QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead");
-};
-QUnit.same = function() {
-	throw new Error("QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead");
-};
-
-// Maintain internal state
-var config = {
-	// The queue of tests to run
-	queue: [],
-
-	// block until document ready
-	blocking: true,
-
-	// when enabled, show only failing tests
-	// gets persisted through sessionStorage and can be changed in UI via checkbox
-	hidepassed: false,
-
-	// by default, run previously failed tests first
-	// very useful in combination with "Hide passed tests" checked
-	reorder: true,
-
-	// by default, modify document.title when suite is done
-	altertitle: true,
-
-	urlConfig: ['noglobals', 'notrycatch'],
-
-	//logging callback queues
-	begin: [],
-	done: [],
-	log: [],
-	testStart: [],
-	testDone: [],
-	moduleStart: [],
-	moduleDone: []
-};
-
-// Load paramaters
-(function() {
-	var location = window.location || { search: "", protocol: "file:" },
-		params = location.search.slice( 1 ).split( "&" ),
-		length = params.length,
-		urlParams = {},
-		current;
-
-	if ( params[ 0 ] ) {
-		for ( var i = 0; i < length; i++ ) {
-			current = params[ i ].split( "=" );
-			current[ 0 ] = decodeURIComponent( current[ 0 ] );
-			// allow just a key to turn on a flag, e.g., test.html?noglobals
-			current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-			urlParams[ current[ 0 ] ] = current[ 1 ];
-		}
-	}
-
-	QUnit.urlParams = urlParams;
-	config.filter = urlParams.filter;
-
-	// Figure out if we're running the tests from a server or not
-	QUnit.isLocal = !!(location.protocol === 'file:');
-})();
-
-// Expose the API as global variables, unless an 'exports'
-// object exists, in that case we assume we're in CommonJS
-if ( typeof exports === "undefined" || typeof require === "undefined" ) {
-	extend(window, QUnit);
-	window.QUnit = QUnit;
-} else {
-	module.exports = QUnit;
-}
-
-// define these after exposing globals to keep them in these QUnit namespace only
-extend(QUnit, {
-	config: config,
-
-	// Initialize the configuration options
-	init: function() {
-		extend(config, {
-			stats: { all: 0, bad: 0 },
-			moduleStats: { all: 0, bad: 0 },
-			started: +new Date,
-			updateRate: 1000,
-			blocking: false,
-			autostart: true,
-			autorun: false,
-			filter: "",
-			queue: [],
-			semaphore: 0
-		});
-
-		var qunit = id( "qunit" );
-		if ( qunit ) {
-			qunit.innerHTML =
-				'<h1 id="qunit-header">' + escapeInnerText( document.title ) + '</h1>' +
-				'<h2 id="qunit-banner"></h2>' +
-				'<div id="qunit-testrunner-toolbar"></div>' +
-				'<h2 id="qunit-userAgent"></h2>' +
-				'<ol id="qunit-tests"></ol>';
-		}
-
-		var tests = id( "qunit-tests" ),
-			banner = id( "qunit-banner" ),
-			result = id( "qunit-testresult" );
-
-		if ( tests ) {
-			tests.innerHTML = "";
-		}
-
-		if ( banner ) {
-			banner.className = "";
-		}
-
-		if ( result ) {
-			result.parentNode.removeChild( result );
-		}
-
-		if ( tests ) {
-			result = document.createElement( "p" );
-			result.id = "qunit-testresult";
-			result.className = "result";
-			tests.parentNode.insertBefore( result, tests );
-			result.innerHTML = 'Running...<br/>&nbsp;';
-		}
-	},
-
-	/**
-	 * Resets the test setup. Useful for tests that modify the DOM.
-	 *
-	 * If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
-	 */
-	reset: function() {
-		if ( window.jQuery ) {
-			jQuery( "#qunit-fixture" ).html( config.fixture );
-		} else {
-			var main = id( 'qunit-fixture' );
-			if ( main ) {
-				main.innerHTML = config.fixture;
-			}
-		}
-	},
-
-	/**
-	 * Trigger an event on an element.
-	 *
-	 * @example triggerEvent( document.body, "click" );
-	 *
-	 * @param DOMElement elem
-	 * @param String type
-	 */
-	triggerEvent: function( elem, type, event ) {
-		if ( document.createEvent ) {
-			event = document.createEvent("MouseEvents");
-			event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-				0, 0, 0, 0, 0, false, false, false, false, 0, null);
-			elem.dispatchEvent( event );
-
-		} else if ( elem.fireEvent ) {
-			elem.fireEvent("on"+type);
-		}
-	},
-
-	// Safe object type checking
-	is: function( type, obj ) {
-		return QUnit.objectType( obj ) == type;
-	},
-
-	objectType: function( obj ) {
-		if (typeof obj === "undefined") {
-				return "undefined";
-
-		// consider: typeof null === object
-		}
-		if (obj === null) {
-				return "null";
-		}
-
-		var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || '';
-
-		switch (type) {
-				case 'Number':
-						if (isNaN(obj)) {
-								return "nan";
-						} else {
-								return "number";
-						}
-				case 'String':
-				case 'Boolean':
-				case 'Array':
-				case 'Date':
-				case 'RegExp':
-				case 'Function':
-						return type.toLowerCase();
-		}
-		if (typeof obj === "object") {
-				return "object";
-		}
-		return undefined;
-	},
-
-	push: function(result, actual, expected, message) {
-		if (!config.current) {
-			throw new Error("assertion outside test context, was " + sourceFromStacktrace());
-		}
-		var details = {
-			result: result,
-			message: message,
-			actual: actual,
-			expected: expected
-		};
-
-		message = escapeInnerText(message) || (result ? "okay" : "failed");
-		message = '<span class="test-message">' + message + "</span>";
-		var output = message;
-		if (!result) {
-			expected = escapeInnerText(QUnit.jsDump.parse(expected));
-			actual = escapeInnerText(QUnit.jsDump.parse(actual));
-			output += '<table><tr class="test-expected"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';
-			if (actual != expected) {
-				output += '<tr class="test-actual"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>';
-				output += '<tr class="test-diff"><th>Diff: </th><td><pre>' + QUnit.diff(expected, actual) +'</pre></td></tr>';
-			}
-			var source = sourceFromStacktrace();
-			if (source) {
-				details.source = source;
-				output += '<tr class="test-source"><th>Source: </th><td><pre>' + escapeInnerText(source) + '</pre></td></tr>';
-			}
-			output += "</table>";
-		}
-
-		runLoggingCallbacks( 'log', QUnit, details );
-
-		config.current.assertions.push({
-			result: !!result,
-			message: output
-		});
-	},
-
-	url: function( params ) {
-		params = extend( extend( {}, QUnit.urlParams ), params );
-		var querystring = "?",
-			key;
-		for ( key in params ) {
-			if ( !hasOwn.call( params, key ) ) {
-				continue;
-			}
-			querystring += encodeURIComponent( key ) + "=" +
-				encodeURIComponent( params[ key ] ) + "&";
-		}
-		return window.location.pathname + querystring.slice( 0, -1 );
-	},
-
-	extend: extend,
-	id: id,
-	addEvent: addEvent
-});
-
-//QUnit.constructor is set to the empty F() above so that we can add to it's prototype later
-//Doing this allows us to tell if the following methods have been overwritten on the actual
-//QUnit object, which is a deprecated way of using the callbacks.
-extend(QUnit.constructor.prototype, {
-	// Logging callbacks; all receive a single argument with the listed properties
-	// run test/logs.html for any related changes
-	begin: registerLoggingCallback('begin'),
-	// done: { failed, passed, total, runtime }
-	done: registerLoggingCallback('done'),
-	// log: { result, actual, expected, message }
-	log: registerLoggingCallback('log'),
-	// testStart: { name }
-	testStart: registerLoggingCallback('testStart'),
-	// testDone: { name, failed, passed, total }
-	testDone: registerLoggingCallback('testDone'),
-	// moduleStart: { name }
-	moduleStart: registerLoggingCallback('moduleStart'),
-	// moduleDone: { name, failed, passed, total }
-	moduleDone: registerLoggingCallback('moduleDone')
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-	config.autorun = true;
-}
-
-QUnit.load = function() {
-	runLoggingCallbacks( 'begin', QUnit, {} );
-
-	// Initialize the config, saving the execution queue
-	var oldconfig = extend({}, config);
-	QUnit.init();
-	extend(config, oldconfig);
-
-	config.blocking = false;
-
-	var urlConfigHtml = '', len = config.urlConfig.length;
-	for ( var i = 0, val; i < len, val = config.urlConfig[i]; i++ ) {
-		config[val] = QUnit.urlParams[val];
-		urlConfigHtml += '<label><input name="' + val + '" type="checkbox"' + ( config[val] ? ' checked="checked"' : '' ) + '>' + val + '</label>';
-	}
-
-	var userAgent = id("qunit-userAgent");
-	if ( userAgent ) {
-		userAgent.innerHTML = navigator.userAgent;
-	}
-	var banner = id("qunit-header");
-	if ( banner ) {
-		banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' + urlConfigHtml;
-		addEvent( banner, "change", function( event ) {
-			var params = {};
-			params[ event.target.name ] = event.target.checked ? true : undefined;
-			window.location = QUnit.url( params );
-		});
-	}
-
-	var toolbar = id("qunit-testrunner-toolbar");
-	if ( toolbar ) {
-		var filter = document.createElement("input");
-		filter.type = "checkbox";
-		filter.id = "qunit-filter-pass";
-		addEvent( filter, "click", function() {
-			var ol = document.getElementById("qunit-tests");
-			if ( filter.checked ) {
-				ol.className = ol.className + " hidepass";
-			} else {
-				var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-				ol.className = tmp.replace(/ hidepass /, " ");
-			}
-			if ( defined.sessionStorage ) {
-				if (filter.checked) {
-					sessionStorage.setItem("qunit-filter-passed-tests", "true");
-				} else {
-					sessionStorage.removeItem("qunit-filter-passed-tests");
-				}
-			}
-		});
-		if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
-			filter.checked = true;
-			var ol = document.getElementById("qunit-tests");
-			ol.className = ol.className + " hidepass";
-		}
-		toolbar.appendChild( filter );
-
-		var label = document.createElement("label");
-		label.setAttribute("for", "qunit-filter-pass");
-		label.innerHTML = "Hide passed tests";
-		toolbar.appendChild( label );
-	}
-
-	var main = id('qunit-fixture');
-	if ( main ) {
-		config.fixture = main.innerHTML;
-	}
-
-	if (config.autostart) {
-		QUnit.start();
-	}
-};
-
-addEvent(window, "load", QUnit.load);
-
-// addEvent(window, "error") gives us a useless event object
-window.onerror = function( message, file, line ) {
-	if ( QUnit.config.current ) {
-		ok( false, message + ", " + file + ":" + line );
-	} else {
-		test( "global failure", function() {
-			ok( false, message + ", " + file + ":" + line );
-		});
-	}
-};
-
-function done() {
-	config.autorun = true;
-
-	// Log the last module results
-	if ( config.currentModule ) {
-		runLoggingCallbacks( 'moduleDone', QUnit, {
-			name: config.currentModule,
-			failed: config.moduleStats.bad,
-			passed: config.moduleStats.all - config.moduleStats.bad,
-			total: config.moduleStats.all
-		} );
-	}
-
-	var banner = id("qunit-banner"),
-		tests = id("qunit-tests"),
-		runtime = +new Date - config.started,
-		passed = config.stats.all - config.stats.bad,
-		html = [
-			'Tests completed in ',
-			runtime,
-			' milliseconds.<br/>',
-			'<span class="passed">',
-			passed,
-			'</span> tests of <span class="total">',
-			config.stats.all,
-			'</span> passed, <span class="failed">',
-			config.stats.bad,
-			'</span> failed.'
-		].join('');
-
-	if ( banner ) {
-		banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
-	}
-
-	if ( tests ) {
-		id( "qunit-testresult" ).innerHTML = html;
-	}
-
-	if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-		// show ✖ for good, ✔ for bad suite result in title
-		// use escape sequences in case file gets loaded with non-utf-8-charset
-		document.title = [
-			(config.stats.bad ? "\u2716" : "\u2714"),
-			document.title.replace(/^[\u2714\u2716] /i, "")
-		].join(" ");
-	}
-
-	// clear own sessionStorage items if all tests passed
-	if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-		for (var key in sessionStorage) {
-			if (sessionStorage.hasOwnProperty(key) && key.indexOf("qunit-") === 0 ) {
-				sessionStorage.removeItem(key);
-			}
-		}
-	}
-
-	runLoggingCallbacks( 'done', QUnit, {
-		failed: config.stats.bad,
-		passed: passed,
-		total: config.stats.all,
-		runtime: runtime
-	} );
-}
-
-function validTest( name ) {
-	var filter = config.filter,
-		run = false;
-
-	if ( !filter ) {
-		return true;
-	}
-
-	var not = filter.charAt( 0 ) === "!";
-	if ( not ) {
-		filter = filter.slice( 1 );
-	}
-
-	if ( name.indexOf( filter ) !== -1 ) {
-		return !not;
-	}
-
-	if ( not ) {
-		run = true;
-	}
-
-	return run;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy)
-// could be extended in the future to use something like https://github.com/csnover/TraceKit
-function sourceFromStacktrace(offset) {
-	offset = offset || 3;
-	try {
-		throw new Error();
-	} catch ( e ) {
-		if (e.stacktrace) {
-			// Opera
-			return e.stacktrace.split("\n")[offset + 3];
-		} else if (e.stack) {
-			// Firefox, Chrome
-			var stack = e.stack.split("\n");
-			if (/^error$/i.test(stack[0])) {
-				stack.shift();
-			}
-			return stack[offset];
-		} else if (e.sourceURL) {
-			// Safari, PhantomJS
-			// TODO sourceURL points at the 'throw new Error' line above, useless
-			//return e.sourceURL + ":" + e.line;
-		}
-	}
-}
-
-function escapeInnerText(s) {
-	if (!s) {
-		return "";
-	}
-	s = s + "";
-	return s.replace(/[\&<>]/g, function(s) {
-		switch(s) {
-			case "&": return "&amp;";
-			case "<": return "&lt;";
-			case ">": return "&gt;";
-			default: return s;
-		}
-	});
-}
-
-function synchronize( callback, last ) {
-	config.queue.push( callback );
-
-	if ( config.autorun && !config.blocking ) {
-		process(last);
-	}
-}
-
-function process( last ) {
-	var start = new Date().getTime();
-	config.depth = config.depth ? config.depth + 1 : 1;
-
-	while ( config.queue.length && !config.blocking ) {
-		if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-			config.queue.shift()();
-		} else {
-			window.setTimeout( function(){
-				process( last );
-			}, 13 );
-			break;
-		}
-	}
-	config.depth--;
-	if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-		done();
-	}
-}
-
-function saveGlobal() {
-	config.pollution = [];
-
-	if ( config.noglobals ) {
-		for ( var key in window ) {
-			if ( !hasOwn.call( window, key ) ) {
-				continue;
-			}
-			config.pollution.push( key );
-		}
-	}
-}
-
-function checkPollution( name ) {
-	var old = config.pollution;
-	saveGlobal();
-
-	var newGlobals = diff( config.pollution, old );
-	if ( newGlobals.length > 0 ) {
-		ok( false, "Introduced global variable(s): " + newGlobals.join(", ") );
-	}
-
-	var deletedGlobals = diff( old, config.pollution );
-	if ( deletedGlobals.length > 0 ) {
-		ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") );
-	}
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-	var result = a.slice();
-	for ( var i = 0; i < result.length; i++ ) {
-		for ( var j = 0; j < b.length; j++ ) {
-			if ( result[i] === b[j] ) {
-				result.splice(i, 1);
-				i--;
-				break;
-			}
-		}
-	}
-	return result;
-}
-
-function fail(message, exception, callback) {
-	if ( typeof console !== "undefined" && console.error && console.warn ) {
-		console.error(message);
-		console.error(exception);
-		console.error(exception.stack);
-		console.warn(callback.toString());
-
-	} else if ( window.opera && opera.postError ) {
-		opera.postError(message, exception, callback.toString);
-	}
-}
-
-function extend(a, b) {
-	for ( var prop in b ) {
-		if ( b[prop] === undefined ) {
-			delete a[prop];
-
-		// Avoid "Member not found" error in IE8 caused by setting window.constructor
-		} else if ( prop !== "constructor" || a !== window ) {
-			a[prop] = b[prop];
-		}
-	}
-
-	return a;
-}
-
-function addEvent(elem, type, fn) {
-	if ( elem.addEventListener ) {
-		elem.addEventListener( type, fn, false );
-	} else if ( elem.attachEvent ) {
-		elem.attachEvent( "on" + type, fn );
-	} else {
-		fn();
-	}
-}
-
-function id(name) {
-	return !!(typeof document !== "undefined" && document && document.getElementById) &&
-		document.getElementById( name );
-}
-
-function registerLoggingCallback(key){
-	return function(callback){
-		config[key].push( callback );
-	};
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks(key, scope, args) {
-	//debugger;
-	var callbacks;
-	if ( QUnit.hasOwnProperty(key) ) {
-		QUnit[key].call(scope, args);
-	} else {
-		callbacks = config[key];
-		for( var i = 0; i < callbacks.length; i++ ) {
-			callbacks[i].call( scope, args );
-		}
-	}
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = function () {
-
-	var innerEquiv; // the real equiv function
-	var callers = []; // stack to decide between skip/abort functions
-	var parents = []; // stack to avoiding loops from circular referencing
-
-	// Call the o related callback with the given arguments.
-	function bindCallbacks(o, callbacks, args) {
-		var prop = QUnit.objectType(o);
-		if (prop) {
-			if (QUnit.objectType(callbacks[prop]) === "function") {
-				return callbacks[prop].apply(callbacks, args);
-			} else {
-				return callbacks[prop]; // or undefined
-			}
-		}
-	}
-
-	var getProto = Object.getPrototypeOf || function (obj) {
-		return obj.__proto__;
-	};
-
-	var callbacks = function () {
-
-		// for string, boolean, number and null
-		function useStrictEquality(b, a) {
-			if (b instanceof a.constructor || a instanceof b.constructor) {
-				// to catch short annotaion VS 'new' annotation of a
-				// declaration
-				// e.g. var i = 1;
-				// var j = new Number(1);
-				return a == b;
-			} else {
-				return a === b;
-			}
-		}
-
-		return {
-			"string" : useStrictEquality,
-			"boolean" : useStrictEquality,
-			"number" : useStrictEquality,
-			"null" : useStrictEquality,
-			"undefined" : useStrictEquality,
-
-			"nan" : function(b) {
-				return isNaN(b);
-			},
-
-			"date" : function(b, a) {
-				return QUnit.objectType(b) === "date"
-						&& a.valueOf() === b.valueOf();
-			},
-
-			"regexp" : function(b, a) {
-				return QUnit.objectType(b) === "regexp"
-						&& a.source === b.source && // the regex itself
-						a.global === b.global && // and its modifers
-													// (gmi) ...
-						a.ignoreCase === b.ignoreCase
-						&& a.multiline === b.multiline;
-			},
-
-			// - skip when the property is a method of an instance (OOP)
-			// - abort otherwise,
-			// initial === would have catch identical references anyway
-			"function" : function() {
-				var caller = callers[callers.length - 1];
-				return caller !== Object && typeof caller !== "undefined";
-			},
-
-			"array" : function(b, a) {
-				var i, j, loop;
-				var len;
-
-				// b could be an object literal here
-				if (!(QUnit.objectType(b) === "array")) {
-					return false;
-				}
-
-				len = a.length;
-				if (len !== b.length) { // safe and faster
-					return false;
-				}
-
-				// track reference to avoid circular references
-				parents.push(a);
-				for (i = 0; i < len; i++) {
-					loop = false;
-					for (j = 0; j < parents.length; j++) {
-						if (parents[j] === a[i]) {
-							loop = true;// dont rewalk array
-						}
-					}
-					if (!loop && !innerEquiv(a[i], b[i])) {
-						parents.pop();
-						return false;
-					}
-				}
-				parents.pop();
-				return true;
-			},
-
-			"object" : function(b, a) {
-				var i, j, loop;
-				var eq = true; // unless we can proove it
-				var aProperties = [], bProperties = []; // collection of
-														// strings
-
-				// comparing constructors is more strict than using
-				// instanceof
-				if (a.constructor !== b.constructor) {
-					// Allow objects with no prototype to be equivalent to
-					// objects with Object as their constructor.
-					if (!((getProto(a) === null && getProto(b) === Object.prototype) ||
-						  (getProto(b) === null && getProto(a) === Object.prototype)))
-					{
-						return false;
-					}
-				}
-
-				// stack constructor before traversing properties
-				callers.push(a.constructor);
-				// track reference to avoid circular references
-				parents.push(a);
-
-				for (i in a) { // be strict: don't ensures hasOwnProperty
-								// and go deep
-					loop = false;
-					for (j = 0; j < parents.length; j++) {
-						if (parents[j] === a[i])
-							loop = true; // don't go down the same path
-											// twice
-					}
-					aProperties.push(i); // collect a's properties
-
-					if (!loop && !innerEquiv(a[i], b[i])) {
-						eq = false;
-						break;
-					}
-				}
-
-				callers.pop(); // unstack, we are done
-				parents.pop();
-
-				for (i in b) {
-					bProperties.push(i); // collect b's properties
-				}
-
-				// Ensures identical properties name
-				return eq
-						&& innerEquiv(aProperties.sort(), bProperties
-								.sort());
-			}
-		};
-	}();
-
-	innerEquiv = function() { // can take multiple arguments
-		var args = Array.prototype.slice.apply(arguments);
-		if (args.length < 2) {
-			return true; // end transition
-		}
-
-		return (function(a, b) {
-			if (a === b) {
-				return true; // catch the most you can
-			} else if (a === null || b === null || typeof a === "undefined"
-					|| typeof b === "undefined"
-					|| QUnit.objectType(a) !== QUnit.objectType(b)) {
-				return false; // don't lose time with error prone cases
-			} else {
-				return bindCallbacks(a, callbacks, [ b, a ]);
-			}
-
-			// apply transition with (1..n) arguments
-		})(args[0], args[1])
-				&& arguments.callee.apply(this, args.splice(1,
-						args.length - 1));
-	};
-
-	return innerEquiv;
-
-}();
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-	function quote( str ) {
-		return '"' + str.toString().replace(/"/g, '\\"') + '"';
-	};
-	function literal( o ) {
-		return o + '';
-	};
-	function join( pre, arr, post ) {
-		var s = jsDump.separator(),
-			base = jsDump.indent(),
-			inner = jsDump.indent(1);
-		if ( arr.join )
-			arr = arr.join( ',' + s + inner );
-		if ( !arr )
-			return pre + post;
-		return [ pre, inner + arr, base + post ].join(s);
-	};
-	function array( arr, stack ) {
-		var i = arr.length, ret = Array(i);
-		this.up();
-		while ( i-- )
-			ret[i] = this.parse( arr[i] , undefined , stack);
-		this.down();
-		return join( '[', ret, ']' );
-	};
-
-	var reName = /^function (\w+)/;
-
-	var jsDump = {
-		parse:function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
-			stack = stack || [ ];
-			var parser = this.parsers[ type || this.typeOf(obj) ];
-			type = typeof parser;
-			var inStack = inArray(obj, stack);
-			if (inStack != -1) {
-				return 'recursion('+(inStack - stack.length)+')';
-			}
-			//else
-			if (type == 'function')  {
-					stack.push(obj);
-					var res = parser.call( this, obj, stack );
-					stack.pop();
-					return res;
-			}
-			// else
-			return (type == 'string') ? parser : this.parsers.error;
-		},
-		typeOf:function( obj ) {
-			var type;
-			if ( obj === null ) {
-				type = "null";
-			} else if (typeof obj === "undefined") {
-				type = "undefined";
-			} else if (QUnit.is("RegExp", obj)) {
-				type = "regexp";
-			} else if (QUnit.is("Date", obj)) {
-				type = "date";
-			} else if (QUnit.is("Function", obj)) {
-				type = "function";
-			} else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") {
-				type = "window";
-			} else if (obj.nodeType === 9) {
-				type = "document";
-			} else if (obj.nodeType) {
-				type = "node";
-			} else if (
-				// native arrays
-				toString.call( obj ) === "[object Array]" ||
-				// NodeList objects
-				( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-			) {
-				type = "array";
-			} else {
-				type = typeof obj;
-			}
-			return type;
-		},
-		separator:function() {
-			return this.multiline ?	this.HTML ? '<br />' : '\n' : this.HTML ? '&nbsp;' : ' ';
-		},
-		indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
-			if ( !this.multiline )
-				return '';
-			var chr = this.indentChar;
-			if ( this.HTML )
-				chr = chr.replace(/\t/g,'   ').replace(/ /g,'&nbsp;');
-			return Array( this._depth_ + (extra||0) ).join(chr);
-		},
-		up:function( a ) {
-			this._depth_ += a || 1;
-		},
-		down:function( a ) {
-			this._depth_ -= a || 1;
-		},
-		setParser:function( name, parser ) {
-			this.parsers[name] = parser;
-		},
-		// The next 3 are exposed so you can use them
-		quote:quote,
-		literal:literal,
-		join:join,
-		//
-		_depth_: 1,
-		// This is the list of parsers, to modify them, use jsDump.setParser
-		parsers:{
-			window: '[Window]',
-			document: '[Document]',
-			error:'[ERROR]', //when no parser is found, shouldn't happen
-			unknown: '[Unknown]',
-			'null':'null',
-			'undefined':'undefined',
-			'function':function( fn ) {
-				var ret = 'function',
-					name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE
-				if ( name )
-					ret += ' ' + name;
-				ret += '(';
-
-				ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');
-				return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );
-			},
-			array: array,
-			nodelist: array,
-			arguments: array,
-			object:function( map, stack ) {
-				var ret = [ ];
-				QUnit.jsDump.up();
-				for ( var key in map ) {
-					var val = map[key];
-					ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(val, undefined, stack));
-				}
-				QUnit.jsDump.down();
-				return join( '{', ret, '}' );
-			},
-			node:function( node ) {
-				var open = QUnit.jsDump.HTML ? '&lt;' : '<',
-					close = QUnit.jsDump.HTML ? '&gt;' : '>';
-
-				var tag = node.nodeName.toLowerCase(),
-					ret = open + tag;
-
-				for ( var a in QUnit.jsDump.DOMAttrs ) {
-					var val = node[QUnit.jsDump.DOMAttrs[a]];
-					if ( val )
-						ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );
-				}
-				return ret + close + open + '/' + tag + close;
-			},
-			functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function
-				var l = fn.length;
-				if ( !l ) return '';
-
-				var args = Array(l);
-				while ( l-- )
-					args[l] = String.fromCharCode(97+l);//97 is 'a'
-				return ' ' + args.join(', ') + ' ';
-			},
-			key:quote, //object calls it internally, the key part of an item in a map
-			functionCode:'[code]', //function calls it internally, it's the content of the function
-			attribute:quote, //node calls it internally, it's an html attribute value
-			string:quote,
-			date:quote,
-			regexp:literal, //regex
-			number:literal,
-			'boolean':literal
-		},
-		DOMAttrs:{//attributes to dump from nodes, name=>realName
-			id:'id',
-			name:'name',
-			'class':'className'
-		},
-		HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
-		indentChar:'  ',//indentation unit
-		multiline:true //if true, items in a collection, are separated by a \n, else just a space.
-	};
-
-	return jsDump;
-})();
-
-// from Sizzle.js
-function getText( elems ) {
-	var ret = "", elem;
-
-	for ( var i = 0; elems[i]; i++ ) {
-		elem = elems[i];
-
-		// Get the text from text nodes and CDATA nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
-			ret += elem.nodeValue;
-
-		// Traverse everything else, except comment nodes
-		} else if ( elem.nodeType !== 8 ) {
-			ret += getText( elem.childNodes );
-		}
-	}
-
-	return ret;
-};
-
-//from jquery.js
-function inArray( elem, array ) {
-	if ( array.indexOf ) {
-		return array.indexOf( elem );
-	}
-
-	for ( var i = 0, length = array.length; i < length; i++ ) {
-		if ( array[ i ] === elem ) {
-			return i;
-		}
-	}
-
-	return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-	function diff(o, n) {
-		var ns = {};
-		var os = {};
-
-		for (var i = 0; i < n.length; i++) {
-			if (ns[n[i]] == null)
-				ns[n[i]] = {
-					rows: [],
-					o: null
-				};
-			ns[n[i]].rows.push(i);
-		}
-
-		for (var i = 0; i < o.length; i++) {
-			if (os[o[i]] == null)
-				os[o[i]] = {
-					rows: [],
-					n: null
-				};
-			os[o[i]].rows.push(i);
-		}
-
-		for (var i in ns) {
-			if ( !hasOwn.call( ns, i ) ) {
-				continue;
-			}
-			if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
-				n[ns[i].rows[0]] = {
-					text: n[ns[i].rows[0]],
-					row: os[i].rows[0]
-				};
-				o[os[i].rows[0]] = {
-					text: o[os[i].rows[0]],
-					row: ns[i].rows[0]
-				};
-			}
-		}
-
-		for (var i = 0; i < n.length - 1; i++) {
-			if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
-			n[i + 1] == o[n[i].row + 1]) {
-				n[i + 1] = {
-					text: n[i + 1],
-					row: n[i].row + 1
-				};
-				o[n[i].row + 1] = {
-					text: o[n[i].row + 1],
-					row: i + 1
-				};
-			}
-		}
-
-		for (var i = n.length - 1; i > 0; i--) {
-			if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
-			n[i - 1] == o[n[i].row - 1]) {
-				n[i - 1] = {
-					text: n[i - 1],
-					row: n[i].row - 1
-				};
-				o[n[i].row - 1] = {
-					text: o[n[i].row - 1],
-					row: i - 1
-				};
-			}
-		}
-
-		return {
-			o: o,
-			n: n
-		};
-	}
-
-	return function(o, n) {
-		o = o.replace(/\s+$/, '');
-		n = n.replace(/\s+$/, '');
-		var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/));
-
-		var str = "";
-
-		var oSpace = o.match(/\s+/g);
-		if (oSpace == null) {
-			oSpace = [" "];
-		}
-		else {
-			oSpace.push(" ");
-		}
-		var nSpace = n.match(/\s+/g);
-		if (nSpace == null) {
-			nSpace = [" "];
-		}
-		else {
-			nSpace.push(" ");
-		}
-
-		if (out.n.length == 0) {
-			for (var i = 0; i < out.o.length; i++) {
-				str += '<del>' + out.o[i] + oSpace[i] + "</del>";
-			}
-		}
-		else {
-			if (out.n[0].text == null) {
-				for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
-					str += '<del>' + out.o[n] + oSpace[n] + "</del>";
-				}
-			}
-
-			for (var i = 0; i < out.n.length; i++) {
-				if (out.n[i].text == null) {
-					str += '<ins>' + out.n[i] + nSpace[i] + "</ins>";
-				}
-				else {
-					var pre = "";
-
-					for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
-						pre += '<del>' + out.o[n] + oSpace[n] + "</del>";
-					}
-					str += " " + out.n[i].text + nSpace[i] + pre;
-				}
-			}
-		}
-
-		return str;
-	};
-})();
-
-// get at whatever the global object is, like window in browsers
-})( (function() {return this}).call() );
-
diff --git a/ui/legacy/lib/require.js b/ui/legacy/lib/require.js
deleted file mode 100644
index 0e7b81b..0000000
--- a/ui/legacy/lib/require.js
+++ /dev/null
@@ -1,1993 +0,0 @@
-/** vim: et:ts=4:sw=4:sts=4
- * @license RequireJS 2.1.2 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
- * Available via the MIT or new BSD license.
- * see: http://github.com/jrburke/requirejs for details
- */
-//Not using strict: uneven strict support in browsers, #392, and causes
-//problems with requirejs.exec()/transpiler plugins that may not be strict.
-/*jslint regexp: true, nomen: true, sloppy: true */
-/*global window, navigator, document, importScripts, jQuery, setTimeout, opera */
-
-var requirejs, require, define;
-(function (global) {
-    var req, s, head, baseElement, dataMain, src,
-        interactiveScript, currentlyAddingScript, mainScript, subPath,
-        version = '2.1.2',
-        commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
-        cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
-        jsSuffixRegExp = /\.js$/,
-        currDirRegExp = /^\.\//,
-        op = Object.prototype,
-        ostring = op.toString,
-        hasOwn = op.hasOwnProperty,
-        ap = Array.prototype,
-        aps = ap.slice,
-        apsp = ap.splice,
-        isBrowser = !!(typeof window !== 'undefined' && navigator && document),
-        isWebWorker = !isBrowser && typeof importScripts !== 'undefined',
-        //PS3 indicates loaded and complete, but need to wait for complete
-        //specifically. Sequence is 'loading', 'loaded', execution,
-        // then 'complete'. The UA check is unfortunate, but not sure how
-        //to feature test w/o causing perf issues.
-        readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
-                      /^complete$/ : /^(complete|loaded)$/,
-        defContextName = '_',
-        //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
-        isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',
-        contexts = {},
-        cfg = {},
-        globalDefQueue = [],
-        useInteractive = false;
-
-    function isFunction(it) {
-        return ostring.call(it) === '[object Function]';
-    }
-
-    function isArray(it) {
-        return ostring.call(it) === '[object Array]';
-    }
-
-    /**
-     * Helper function for iterating over an array. If the func returns
-     * a true value, it will break out of the loop.
-     */
-    function each(ary, func) {
-        if (ary) {
-            var i;
-            for (i = 0; i < ary.length; i += 1) {
-                if (ary[i] && func(ary[i], i, ary)) {
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Helper function for iterating over an array backwards. If the func
-     * returns a true value, it will break out of the loop.
-     */
-    function eachReverse(ary, func) {
-        if (ary) {
-            var i;
-            for (i = ary.length - 1; i > -1; i -= 1) {
-                if (ary[i] && func(ary[i], i, ary)) {
-                    break;
-                }
-            }
-        }
-    }
-
-    function hasProp(obj, prop) {
-        return hasOwn.call(obj, prop);
-    }
-
-    function getOwn(obj, prop) {
-        return hasProp(obj, prop) && obj[prop];
-    }
-
-    /**
-     * Cycles over properties in an object and calls a function for each
-     * property value. If the function returns a truthy value, then the
-     * iteration is stopped.
-     */
-    function eachProp(obj, func) {
-        var prop;
-        for (prop in obj) {
-            if (hasProp(obj, prop)) {
-                if (func(obj[prop], prop)) {
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Simple function to mix in properties from source into target,
-     * but only if target does not already have a property of the same name.
-     */
-    function mixin(target, source, force, deepStringMixin) {
-        if (source) {
-            eachProp(source, function (value, prop) {
-                if (force || !hasProp(target, prop)) {
-                    if (deepStringMixin && typeof value !== 'string') {
-                        if (!target[prop]) {
-                            target[prop] = {};
-                        }
-                        mixin(target[prop], value, force, deepStringMixin);
-                    } else {
-                        target[prop] = value;
-                    }
-                }
-            });
-        }
-        return target;
-    }
-
-    //Similar to Function.prototype.bind, but the 'this' object is specified
-    //first, since it is easier to read/figure out what 'this' will be.
-    function bind(obj, fn) {
-        return function () {
-            return fn.apply(obj, arguments);
-        };
-    }
-
-    function scripts() {
-        return document.getElementsByTagName('script');
-    }
-
-    //Allow getting a global that expressed in
-    //dot notation, like 'a.b.c'.
-    function getGlobal(value) {
-        if (!value) {
-            return value;
-        }
-        var g = global;
-        each(value.split('.'), function (part) {
-            g = g[part];
-        });
-        return g;
-    }
-
-    /**
-     * Constructs an error with a pointer to an URL with more information.
-     * @param {String} id the error ID that maps to an ID on a web page.
-     * @param {String} message human readable error.
-     * @param {Error} [err] the original error, if there is one.
-     *
-     * @returns {Error}
-     */
-    function makeError(id, msg, err, requireModules) {
-        var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);
-        e.requireType = id;
-        e.requireModules = requireModules;
-        if (err) {
-            e.originalError = err;
-        }
-        return e;
-    }
-
-    if (typeof define !== 'undefined') {
-        //If a define is already in play via another AMD loader,
-        //do not overwrite.
-        return;
-    }
-
-    if (typeof requirejs !== 'undefined') {
-        if (isFunction(requirejs)) {
-            //Do not overwrite and existing requirejs instance.
-            return;
-        }
-        cfg = requirejs;
-        requirejs = undefined;
-    }
-
-    //Allow for a require config object
-    if (typeof require !== 'undefined' && !isFunction(require)) {
-        //assume it is a config object.
-        cfg = require;
-        require = undefined;
-    }
-
-    function newContext(contextName) {
-        var inCheckLoaded, Module, context, handlers,
-            checkLoadedTimeoutId,
-            config = {
-                waitSeconds: 7,
-                baseUrl: './',
-                paths: {},
-                pkgs: {},
-                shim: {},
-                map: {},
-                config: {}
-            },
-            registry = {},
-            undefEvents = {},
-            defQueue = [],
-            defined = {},
-            urlFetched = {},
-            requireCounter = 1,
-            unnormalizedCounter = 1;
-
-        /**
-         * Trims the . and .. from an array of path segments.
-         * It will keep a leading path segment if a .. will become
-         * the first path segment, to help with module name lookups,
-         * which act like paths, but can be remapped. But the end result,
-         * all paths that use this function should look normalized.
-         * NOTE: this method MODIFIES the input array.
-         * @param {Array} ary the array of path segments.
-         */
-        function trimDots(ary) {
-            var i, part;
-            for (i = 0; ary[i]; i += 1) {
-                part = ary[i];
-                if (part === '.') {
-                    ary.splice(i, 1);
-                    i -= 1;
-                } else if (part === '..') {
-                    if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {
-                        //End of the line. Keep at least one non-dot
-                        //path segment at the front so it can be mapped
-                        //correctly to disk. Otherwise, there is likely
-                        //no path mapping for a path starting with '..'.
-                        //This can still fail, but catches the most reasonable
-                        //uses of ..
-                        break;
-                    } else if (i > 0) {
-                        ary.splice(i - 1, 2);
-                        i -= 2;
-                    }
-                }
-            }
-        }
-
-        /**
-         * Given a relative module name, like ./something, normalize it to
-         * a real name that can be mapped to a path.
-         * @param {String} name the relative name
-         * @param {String} baseName a real name that the name arg is relative
-         * to.
-         * @param {Boolean} applyMap apply the map config to the value. Should
-         * only be done if this normalization is for a dependency ID.
-         * @returns {String} normalized name
-         */
-        function normalize(name, baseName, applyMap) {
-            var pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment,
-                foundMap, foundI, foundStarMap, starI,
-                baseParts = baseName && baseName.split('/'),
-                normalizedBaseParts = baseParts,
-                map = config.map,
-                starMap = map && map['*'];
-
-            //Adjust any relative paths.
-            if (name && name.charAt(0) === '.') {
-                //If have a base name, try to normalize against it,
-                //otherwise, assume it is a top-level require that will
-                //be relative to baseUrl in the end.
-                if (baseName) {
-                    if (getOwn(config.pkgs, baseName)) {
-                        //If the baseName is a package name, then just treat it as one
-                        //name to concat the name with.
-                        normalizedBaseParts = baseParts = [baseName];
-                    } else {
-                        //Convert baseName to array, and lop off the last part,
-                        //so that . matches that 'directory' and not name of the baseName's
-                        //module. For instance, baseName of 'one/two/three', maps to
-                        //'one/two/three.js', but we want the directory, 'one/two' for
-                        //this normalization.
-                        normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
-                    }
-
-                    name = normalizedBaseParts.concat(name.split('/'));
-                    trimDots(name);
-
-                    //Some use of packages may use a . path to reference the
-                    //'main' module name, so normalize for that.
-                    pkgConfig = getOwn(config.pkgs, (pkgName = name[0]));
-                    name = name.join('/');
-                    if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {
-                        name = pkgName;
-                    }
-                } else if (name.indexOf('./') === 0) {
-                    // No baseName, so this is ID is resolved relative
-                    // to baseUrl, pull off the leading dot.
-                    name = name.substring(2);
-                }
-            }
-
-            //Apply map config if available.
-            if (applyMap && (baseParts || starMap) && map) {
-                nameParts = name.split('/');
-
-                for (i = nameParts.length; i > 0; i -= 1) {
-                    nameSegment = nameParts.slice(0, i).join('/');
-
-                    if (baseParts) {
-                        //Find the longest baseName segment match in the config.
-                        //So, do joins on the biggest to smallest lengths of baseParts.
-                        for (j = baseParts.length; j > 0; j -= 1) {
-                            mapValue = getOwn(map, baseParts.slice(0, j).join('/'));
-
-                            //baseName segment has config, find if it has one for
-                            //this name.
-                            if (mapValue) {
-                                mapValue = getOwn(mapValue, nameSegment);
-                                if (mapValue) {
-                                    //Match, update name to the new value.
-                                    foundMap = mapValue;
-                                    foundI = i;
-                                    break;
-                                }
-                            }
-                        }
-                    }
-
-                    if (foundMap) {
-                        break;
-                    }
-
-                    //Check for a star map match, but just hold on to it,
-                    //if there is a shorter segment match later in a matching
-                    //config, then favor over this star map.
-                    if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {
-                        foundStarMap = getOwn(starMap, nameSegment);
-                        starI = i;
-                    }
-                }
-
-                if (!foundMap && foundStarMap) {
-                    foundMap = foundStarMap;
-                    foundI = starI;
-                }
-
-                if (foundMap) {
-                    nameParts.splice(0, foundI, foundMap);
-                    name = nameParts.join('/');
-                }
-            }
-
-            return name;
-        }
-
-        function removeScript(name) {
-            if (isBrowser) {
-                each(scripts(), function (scriptNode) {
-                    if (scriptNode.getAttribute('data-requiremodule') === name &&
-                            scriptNode.getAttribute('data-requirecontext') === context.contextName) {
-                        scriptNode.parentNode.removeChild(scriptNode);
-                        return true;
-                    }
-                });
-            }
-        }
-
-        function hasPathFallback(id) {
-            var pathConfig = getOwn(config.paths, id);
-            if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {
-                removeScript(id);
-                //Pop off the first array value, since it failed, and
-                //retry
-                pathConfig.shift();
-                context.require.undef(id);
-                context.require([id]);
-                return true;
-            }
-        }
-
-        //Turns a plugin!resource to [plugin, resource]
-        //with the plugin being undefined if the name
-        //did not have a plugin prefix.
-        function splitPrefix(name) {
-            var prefix,
-                index = name ? name.indexOf('!') : -1;
-            if (index > -1) {
-                prefix = name.substring(0, index);
-                name = name.substring(index + 1, name.length);
-            }
-            return [prefix, name];
-        }
-
-        /**
-         * Creates a module mapping that includes plugin prefix, module
-         * name, and path. If parentModuleMap is provided it will
-         * also normalize the name via require.normalize()
-         *
-         * @param {String} name the module name
-         * @param {String} [parentModuleMap] parent module map
-         * for the module name, used to resolve relative names.
-         * @param {Boolean} isNormalized: is the ID already normalized.
-         * This is true if this call is done for a define() module ID.
-         * @param {Boolean} applyMap: apply the map config to the ID.
-         * Should only be true if this map is for a dependency.
-         *
-         * @returns {Object}
-         */
-        function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
-            var url, pluginModule, suffix, nameParts,
-                prefix = null,
-                parentName = parentModuleMap ? parentModuleMap.name : null,
-                originalName = name,
-                isDefine = true,
-                normalizedName = '';
-
-            //If no name, then it means it is a require call, generate an
-            //internal name.
-            if (!name) {
-                isDefine = false;
-                name = '_@r' + (requireCounter += 1);
-            }
-
-            nameParts = splitPrefix(name);
-            prefix = nameParts[0];
-            name = nameParts[1];
-
-            if (prefix) {
-                prefix = normalize(prefix, parentName, applyMap);
-                pluginModule = getOwn(defined, prefix);
-            }
-
-            //Account for relative paths if there is a base name.
-            if (name) {
-                if (prefix) {
-                    if (pluginModule && pluginModule.normalize) {
-                        //Plugin is loaded, use its normalize method.
-                        normalizedName = pluginModule.normalize(name, function (name) {
-                            return normalize(name, parentName, applyMap);
-                        });
-                    } else {
-                        normalizedName = normalize(name, parentName, applyMap);
-                    }
-                } else {
-                    //A regular module.
-                    normalizedName = normalize(name, parentName, applyMap);
-
-                    //Normalized name may be a plugin ID due to map config
-                    //application in normalize. The map config values must
-                    //already be normalized, so do not need to redo that part.
-                    nameParts = splitPrefix(normalizedName);
-                    prefix = nameParts[0];
-                    normalizedName = nameParts[1];
-                    isNormalized = true;
-
-                    url = context.nameToUrl(normalizedName);
-                }
-            }
-
-            //If the id is a plugin id that cannot be determined if it needs
-            //normalization, stamp it with a unique ID so two matching relative
-            //ids that may conflict can be separate.
-            suffix = prefix && !pluginModule && !isNormalized ?
-                     '_unnormalized' + (unnormalizedCounter += 1) :
-                     '';
-
-            return {
-                prefix: prefix,
-                name: normalizedName,
-                parentMap: parentModuleMap,
-                unnormalized: !!suffix,
-                url: url,
-                originalName: originalName,
-                isDefine: isDefine,
-                id: (prefix ?
-                        prefix + '!' + normalizedName :
-                        normalizedName) + suffix
-            };
-        }
-
-        function getModule(depMap) {
-            var id = depMap.id,
-                mod = getOwn(registry, id);
-
-            if (!mod) {
-                mod = registry[id] = new context.Module(depMap);
-            }
-
-            return mod;
-        }
-
-        function on(depMap, name, fn) {
-            var id = depMap.id,
-                mod = getOwn(registry, id);
-
-            if (hasProp(defined, id) &&
-                    (!mod || mod.defineEmitComplete)) {
-                if (name === 'defined') {
-                    fn(defined[id]);
-                }
-            } else {
-                getModule(depMap).on(name, fn);
-            }
-        }
-
-        function onError(err, errback) {
-            var ids = err.requireModules,
-                notified = false;
-
-            if (errback) {
-                errback(err);
-            } else {
-                each(ids, function (id) {
-                    var mod = getOwn(registry, id);
-                    if (mod) {
-                        //Set error on module, so it skips timeout checks.
-                        mod.error = err;
-                        if (mod.events.error) {
-                            notified = true;
-                            mod.emit('error', err);
-                        }
-                    }
-                });
-
-                if (!notified) {
-                    req.onError(err);
-                }
-            }
-        }
-
-        /**
-         * Internal method to transfer globalQueue items to this context's
-         * defQueue.
-         */
-        function takeGlobalQueue() {
-            //Push all the globalDefQueue items into the context's defQueue
-            if (globalDefQueue.length) {
-                //Array splice in the values since the context code has a
-                //local var ref to defQueue, so cannot just reassign the one
-                //on context.
-                apsp.apply(defQueue,
-                           [defQueue.length - 1, 0].concat(globalDefQueue));
-                globalDefQueue = [];
-            }
-        }
-
-        handlers = {
-            'require': function (mod) {
-                if (mod.require) {
-                    return mod.require;
-                } else {
-                    return (mod.require = context.makeRequire(mod.map));
-                }
-            },
-            'exports': function (mod) {
-                mod.usingExports = true;
-                if (mod.map.isDefine) {
-                    if (mod.exports) {
-                        return mod.exports;
-                    } else {
-                        return (mod.exports = defined[mod.map.id] = {});
-                    }
-                }
-            },
-            'module': function (mod) {
-                if (mod.module) {
-                    return mod.module;
-                } else {
-                    return (mod.module = {
-                        id: mod.map.id,
-                        uri: mod.map.url,
-                        config: function () {
-                            return (config.config && getOwn(config.config, mod.map.id)) || {};
-                        },
-                        exports: defined[mod.map.id]
-                    });
-                }
-            }
-        };
-
-        function cleanRegistry(id) {
-            //Clean up machinery used for waiting modules.
-            delete registry[id];
-        }
-
-        function breakCycle(mod, traced, processed) {
-            var id = mod.map.id;
-
-            if (mod.error) {
-                mod.emit('error', mod.error);
-            } else {
-                traced[id] = true;
-                each(mod.depMaps, function (depMap, i) {
-                    var depId = depMap.id,
-                        dep = getOwn(registry, depId);
-
-                    //Only force things that have not completed
-                    //being defined, so still in the registry,
-                    //and only if it has not been matched up
-                    //in the module already.
-                    if (dep && !mod.depMatched[i] && !processed[depId]) {
-                        if (getOwn(traced, depId)) {
-                            mod.defineDep(i, defined[depId]);
-                            mod.check(); //pass false?
-                        } else {
-                            breakCycle(dep, traced, processed);
-                        }
-                    }
-                });
-                processed[id] = true;
-            }
-        }
-
-        function checkLoaded() {
-            var map, modId, err, usingPathFallback,
-                waitInterval = config.waitSeconds * 1000,
-                //It is possible to disable the wait interval by using waitSeconds of 0.
-                expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
-                noLoads = [],
-                reqCalls = [],
-                stillLoading = false,
-                needCycleCheck = true;
-
-            //Do not bother if this call was a result of a cycle break.
-            if (inCheckLoaded) {
-                return;
-            }
-
-            inCheckLoaded = true;
-
-            //Figure out the state of all the modules.
-            eachProp(registry, function (mod) {
-                map = mod.map;
-                modId = map.id;
-
-                //Skip things that are not enabled or in error state.
-                if (!mod.enabled) {
-                    return;
-                }
-
-                if (!map.isDefine) {
-                    reqCalls.push(mod);
-                }
-
-                if (!mod.error) {
-                    //If the module should be executed, and it has not
-                    //been inited and time is up, remember it.
-                    if (!mod.inited && expired) {
-                        if (hasPathFallback(modId)) {
-                            usingPathFallback = true;
-                            stillLoading = true;
-                        } else {
-                            noLoads.push(modId);
-                            removeScript(modId);
-                        }
-                    } else if (!mod.inited && mod.fetched && map.isDefine) {
-                        stillLoading = true;
-                        if (!map.prefix) {
-                            //No reason to keep looking for unfinished
-                            //loading. If the only stillLoading is a
-                            //plugin resource though, keep going,
-                            //because it may be that a plugin resource
-                            //is waiting on a non-plugin cycle.
-                            return (needCycleCheck = false);
-                        }
-                    }
-                }
-            });
-
-            if (expired && noLoads.length) {
-                //If wait time expired, throw error of unloaded modules.
-                err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);
-                err.contextName = context.contextName;
-                return onError(err);
-            }
-
-            //Not expired, check for a cycle.
-            if (needCycleCheck) {
-                each(reqCalls, function (mod) {
-                    breakCycle(mod, {}, {});
-                });
-            }
-
-            //If still waiting on loads, and the waiting load is something
-            //other than a plugin resource, or there are still outstanding
-            //scripts, then just try back later.
-            if ((!expired || usingPathFallback) && stillLoading) {
-                //Something is still waiting to load. Wait for it, but only
-                //if a timeout is not already in effect.
-                if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
-                    checkLoadedTimeoutId = setTimeout(function () {
-                        checkLoadedTimeoutId = 0;
-                        checkLoaded();
-                    }, 50);
-                }
-            }
-
-            inCheckLoaded = false;
-        }
-
-        Module = function (map) {
-            this.events = getOwn(undefEvents, map.id) || {};
-            this.map = map;
-            this.shim = getOwn(config.shim, map.id);
-            this.depExports = [];
-            this.depMaps = [];
-            this.depMatched = [];
-            this.pluginMaps = {};
-            this.depCount = 0;
-
-            /* this.exports this.factory
-               this.depMaps = [],
-               this.enabled, this.fetched
-            */
-        };
-
-        Module.prototype = {
-            init: function (depMaps, factory, errback, options) {
-                options = options || {};
-
-                //Do not do more inits if already done. Can happen if there
-                //are multiple define calls for the same module. That is not
-                //a normal, common case, but it is also not unexpected.
-                if (this.inited) {
-                    return;
-                }
-
-                this.factory = factory;
-
-                if (errback) {
-                    //Register for errors on this module.
-                    this.on('error', errback);
-                } else if (this.events.error) {
-                    //If no errback already, but there are error listeners
-                    //on this module, set up an errback to pass to the deps.
-                    errback = bind(this, function (err) {
-                        this.emit('error', err);
-                    });
-                }
-
-                //Do a copy of the dependency array, so that
-                //source inputs are not modified. For example
-                //"shim" deps are passed in here directly, and
-                //doing a direct modification of the depMaps array
-                //would affect that config.
-                this.depMaps = depMaps && depMaps.slice(0);
-
-                this.errback = errback;
-
-                //Indicate this module has be initialized
-                this.inited = true;
-
-                this.ignore = options.ignore;
-
-                //Could have option to init this module in enabled mode,
-                //or could have been previously marked as enabled. However,
-                //the dependencies are not known until init is called. So
-                //if enabled previously, now trigger dependencies as enabled.
-                if (options.enabled || this.enabled) {
-                    //Enable this module and dependencies.
-                    //Will call this.check()
-                    this.enable();
-                } else {
-                    this.check();
-                }
-            },
-
-            defineDep: function (i, depExports) {
-                //Because of cycles, defined callback for a given
-                //export can be called more than once.
-                if (!this.depMatched[i]) {
-                    this.depMatched[i] = true;
-                    this.depCount -= 1;
-                    this.depExports[i] = depExports;
-                }
-            },
-
-            fetch: function () {
-                if (this.fetched) {
-                    return;
-                }
-                this.fetched = true;
-
-                context.startTime = (new Date()).getTime();
-
-                var map = this.map;
-
-                //If the manager is for a plugin managed resource,
-                //ask the plugin to load it now.
-                if (this.shim) {
-                    context.makeRequire(this.map, {
-                        enableBuildCallback: true
-                    })(this.shim.deps || [], bind(this, function () {
-                        return map.prefix ? this.callPlugin() : this.load();
-                    }));
-                } else {
-                    //Regular dependency.
-                    return map.prefix ? this.callPlugin() : this.load();
-                }
-            },
-
-            load: function () {
-                var url = this.map.url;
-
-                //Regular dependency.
-                if (!urlFetched[url]) {
-                    urlFetched[url] = true;
-                    context.load(this.map.id, url);
-                }
-            },
-
-            /**
-             * Checks is the module is ready to define itself, and if so,
-             * define it.
-             */
-            check: function () {
-                if (!this.enabled || this.enabling) {
-                    return;
-                }
-
-                var err, cjsModule,
-                    id = this.map.id,
-                    depExports = this.depExports,
-                    exports = this.exports,
-                    factory = this.factory;
-
-                if (!this.inited) {
-                    this.fetch();
-                } else if (this.error) {
-                    this.emit('error', this.error);
-                } else if (!this.defining) {
-                    //The factory could trigger another require call
-                    //that would result in checking this module to
-                    //define itself again. If already in the process
-                    //of doing that, skip this work.
-                    this.defining = true;
-
-                    if (this.depCount < 1 && !this.defined) {
-                        if (isFunction(factory)) {
-                            //If there is an error listener, favor passing
-                            //to that instead of throwing an error.
-                            if (this.events.error) {
-                                try {
-                                    exports = context.execCb(id, factory, depExports, exports);
-                                } catch (e) {
-                                    err = e;
-                                }
-                            } else {
-                                exports = context.execCb(id, factory, depExports, exports);
-                            }
-
-                            if (this.map.isDefine) {
-                                //If setting exports via 'module' is in play,
-                                //favor that over return value and exports. After that,
-                                //favor a non-undefined return value over exports use.
-                                cjsModule = this.module;
-                                if (cjsModule &&
-                                        cjsModule.exports !== undefined &&
-                                        //Make sure it is not already the exports value
-                                        cjsModule.exports !== this.exports) {
-                                    exports = cjsModule.exports;
-                                } else if (exports === undefined && this.usingExports) {
-                                    //exports already set the defined value.
-                                    exports = this.exports;
-                                }
-                            }
-
-                            if (err) {
-                                err.requireMap = this.map;
-                                err.requireModules = [this.map.id];
-                                err.requireType = 'define';
-                                return onError((this.error = err));
-                            }
-
-                        } else {
-                            //Just a literal value
-                            exports = factory;
-                        }
-
-                        this.exports = exports;
-
-                        if (this.map.isDefine && !this.ignore) {
-                            defined[id] = exports;
-
-                            if (req.onResourceLoad) {
-                                req.onResourceLoad(context, this.map, this.depMaps);
-                            }
-                        }
-
-                        //Clean up
-                        delete registry[id];
-
-                        this.defined = true;
-                    }
-
-                    //Finished the define stage. Allow calling check again
-                    //to allow define notifications below in the case of a
-                    //cycle.
-                    this.defining = false;
-
-                    if (this.defined && !this.defineEmitted) {
-                        this.defineEmitted = true;
-                        this.emit('defined', this.exports);
-                        this.defineEmitComplete = true;
-                    }
-
-                }
-            },
-
-            callPlugin: function () {
-                var map = this.map,
-                    id = map.id,
-                    //Map already normalized the prefix.
-                    pluginMap = makeModuleMap(map.prefix);
-
-                //Mark this as a dependency for this plugin, so it
-                //can be traced for cycles.
-                this.depMaps.push(pluginMap);
-
-                on(pluginMap, 'defined', bind(this, function (plugin) {
-                    var load, normalizedMap, normalizedMod,
-                        name = this.map.name,
-                        parentName = this.map.parentMap ? this.map.parentMap.name : null,
-                        localRequire = context.makeRequire(map.parentMap, {
-                            enableBuildCallback: true,
-                            skipMap: true
-                        });
-
-                    //If current map is not normalized, wait for that
-                    //normalized name to load instead of continuing.
-                    if (this.map.unnormalized) {
-                        //Normalize the ID if the plugin allows it.
-                        if (plugin.normalize) {
-                            name = plugin.normalize(name, function (name) {
-                                return normalize(name, parentName, true);
-                            }) || '';
-                        }
-
-                        //prefix and name should already be normalized, no need
-                        //for applying map config again either.
-                        normalizedMap = makeModuleMap(map.prefix + '!' + name,
-                                                      this.map.parentMap);
-                        on(normalizedMap,
-                            'defined', bind(this, function (value) {
-                                this.init([], function () { return value; }, null, {
-                                    enabled: true,
-                                    ignore: true
-                                });
-                            }));
-
-                        normalizedMod = getOwn(registry, normalizedMap.id);
-                        if (normalizedMod) {
-                            //Mark this as a dependency for this plugin, so it
-                            //can be traced for cycles.
-                            this.depMaps.push(normalizedMap);
-
-                            if (this.events.error) {
-                                normalizedMod.on('error', bind(this, function (err) {
-                                    this.emit('error', err);
-                                }));
-                            }
-                            normalizedMod.enable();
-                        }
-
-                        return;
-                    }
-
-                    load = bind(this, function (value) {
-                        this.init([], function () { return value; }, null, {
-                            enabled: true
-                        });
-                    });
-
-                    load.error = bind(this, function (err) {
-                        this.inited = true;
-                        this.error = err;
-                        err.requireModules = [id];
-
-                        //Remove temp unnormalized modules for this module,
-                        //since they will never be resolved otherwise now.
-                        eachProp(registry, function (mod) {
-                            if (mod.map.id.indexOf(id + '_unnormalized') === 0) {
-                                cleanRegistry(mod.map.id);
-                            }
-                        });
-
-                        onError(err);
-                    });
-
-                    //Allow plugins to load other code without having to know the
-                    //context or how to 'complete' the load.
-                    load.fromText = bind(this, function (text, textAlt) {
-                        /*jslint evil: true */
-                        var moduleName = map.name,
-                            moduleMap = makeModuleMap(moduleName),
-                            hasInteractive = useInteractive;
-
-                        //As of 2.1.0, support just passing the text, to reinforce
-                        //fromText only being called once per resource. Still
-                        //support old style of passing moduleName but discard
-                        //that moduleName in favor of the internal ref.
-                        if (textAlt) {
-                            text = textAlt;
-                        }
-
-                        //Turn off interactive script matching for IE for any define
-                        //calls in the text, then turn it back on at the end.
-                        if (hasInteractive) {
-                            useInteractive = false;
-                        }
-
-                        //Prime the system by creating a module instance for
-                        //it.
-                        getModule(moduleMap);
-
-                        //Transfer any config to this other module.
-                        if (hasProp(config.config, id)) {
-                            config.config[moduleName] = config.config[id];
-                        }
-
-                        try {
-                            req.exec(text);
-                        } catch (e) {
-                            throw new Error('fromText eval for ' + moduleName +
-                                            ' failed: ' + e);
-                        }
-
-                        if (hasInteractive) {
-                            useInteractive = true;
-                        }
-
-                        //Mark this as a dependency for the plugin
-                        //resource
-                        this.depMaps.push(moduleMap);
-
-                        //Support anonymous modules.
-                        context.completeLoad(moduleName);
-
-                        //Bind the value of that module to the value for this
-                        //resource ID.
-                        localRequire([moduleName], load);
-                    });
-
-                    //Use parentName here since the plugin's name is not reliable,
-                    //could be some weird string with no path that actually wants to
-                    //reference the parentName's path.
-                    plugin.load(map.name, localRequire, load, config);
-                }));
-
-                context.enable(pluginMap, this);
-                this.pluginMaps[pluginMap.id] = pluginMap;
-            },
-
-            enable: function () {
-                this.enabled = true;
-
-                //Set flag mentioning that the module is enabling,
-                //so that immediate calls to the defined callbacks
-                //for dependencies do not trigger inadvertent load
-                //with the depCount still being zero.
-                this.enabling = true;
-
-                //Enable each dependency
-                each(this.depMaps, bind(this, function (depMap, i) {
-                    var id, mod, handler;
-
-                    if (typeof depMap === 'string') {
-                        //Dependency needs to be converted to a depMap
-                        //and wired up to this module.
-                        depMap = makeModuleMap(depMap,
-                                               (this.map.isDefine ? this.map : this.map.parentMap),
-                                               false,
-                                               !this.skipMap);
-                        this.depMaps[i] = depMap;
-
-                        handler = getOwn(handlers, depMap.id);
-
-                        if (handler) {
-                            this.depExports[i] = handler(this);
-                            return;
-                        }
-
-                        this.depCount += 1;
-
-                        on(depMap, 'defined', bind(this, function (depExports) {
-                            this.defineDep(i, depExports);
-                            this.check();
-                        }));
-
-                        if (this.errback) {
-                            on(depMap, 'error', this.errback);
-                        }
-                    }
-
-                    id = depMap.id;
-                    mod = registry[id];
-
-                    //Skip special modules like 'require', 'exports', 'module'
-                    //Also, don't call enable if it is already enabled,
-                    //important in circular dependency cases.
-                    if (!hasProp(handlers, id) && mod && !mod.enabled) {
-                        context.enable(depMap, this);
-                    }
-                }));
-
-                //Enable each plugin that is used in
-                //a dependency
-                eachProp(this.pluginMaps, bind(this, function (pluginMap) {
-                    var mod = getOwn(registry, pluginMap.id);
-                    if (mod && !mod.enabled) {
-                        context.enable(pluginMap, this);
-                    }
-                }));
-
-                this.enabling = false;
-
-                this.check();
-            },
-
-            on: function (name, cb) {
-                var cbs = this.events[name];
-                if (!cbs) {
-                    cbs = this.events[name] = [];
-                }
-                cbs.push(cb);
-            },
-
-            emit: function (name, evt) {
-                each(this.events[name], function (cb) {
-                    cb(evt);
-                });
-                if (name === 'error') {
-                    //Now that the error handler was triggered, remove
-                    //the listeners, since this broken Module instance
-                    //can stay around for a while in the registry.
-                    delete this.events[name];
-                }
-            }
-        };
-
-        function callGetModule(args) {
-            //Skip modules already defined.
-            if (!hasProp(defined, args[0])) {
-                getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);
-            }
-        }
-
-        function removeListener(node, func, name, ieName) {
-            //Favor detachEvent because of IE9
-            //issue, see attachEvent/addEventListener comment elsewhere
-            //in this file.
-            if (node.detachEvent && !isOpera) {
-                //Probably IE. If not it will throw an error, which will be
-                //useful to know.
-                if (ieName) {
-                    node.detachEvent(ieName, func);
-                }
-            } else {
-                node.removeEventListener(name, func, false);
-            }
-        }
-
-        /**
-         * Given an event from a script node, get the requirejs info from it,
-         * and then removes the event listeners on the node.
-         * @param {Event} evt
-         * @returns {Object}
-         */
-        function getScriptData(evt) {
-            //Using currentTarget instead of target for Firefox 2.0's sake. Not
-            //all old browsers will be supported, but this one was easy enough
-            //to support and still makes sense.
-            var node = evt.currentTarget || evt.srcElement;
-
-            //Remove the listeners once here.
-            removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');
-            removeListener(node, context.onScriptError, 'error');
-
-            return {
-                node: node,
-                id: node && node.getAttribute('data-requiremodule')
-            };
-        }
-
-        function intakeDefines() {
-            var args;
-
-            //Any defined modules in the global queue, intake them now.
-            takeGlobalQueue();
-
-            //Make sure any remaining defQueue items get properly processed.
-            while (defQueue.length) {
-                args = defQueue.shift();
-                if (args[0] === null) {
-                    return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
-                } else {
-                    //args are id, deps, factory. Should be normalized by the
-                    //define() function.
-                    callGetModule(args);
-                }
-            }
-        }
-
-        context = {
-            config: config,
-            contextName: contextName,
-            registry: registry,
-            defined: defined,
-            urlFetched: urlFetched,
-            defQueue: defQueue,
-            Module: Module,
-            makeModuleMap: makeModuleMap,
-            nextTick: req.nextTick,
-
-            /**
-             * Set a configuration for the context.
-             * @param {Object} cfg config object to integrate.
-             */
-            configure: function (cfg) {
-                //Make sure the baseUrl ends in a slash.
-                if (cfg.baseUrl) {
-                    if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {
-                        cfg.baseUrl += '/';
-                    }
-                }
-
-                //Save off the paths and packages since they require special processing,
-                //they are additive.
-                var pkgs = config.pkgs,
-                    shim = config.shim,
-                    objs = {
-                        paths: true,
-                        config: true,
-                        map: true
-                    };
-
-                eachProp(cfg, function (value, prop) {
-                    if (objs[prop]) {
-                        if (prop === 'map') {
-                            mixin(config[prop], value, true, true);
-                        } else {
-                            mixin(config[prop], value, true);
-                        }
-                    } else {
-                        config[prop] = value;
-                    }
-                });
-
-                //Merge shim
-                if (cfg.shim) {
-                    eachProp(cfg.shim, function (value, id) {
-                        //Normalize the structure
-                        if (isArray(value)) {
-                            value = {
-                                deps: value
-                            };
-                        }
-                        if ((value.exports || value.init) && !value.exportsFn) {
-                            value.exportsFn = context.makeShimExports(value);
-                        }
-                        shim[id] = value;
-                    });
-                    config.shim = shim;
-                }
-
-                //Adjust packages if necessary.
-                if (cfg.packages) {
-                    each(cfg.packages, function (pkgObj) {
-                        var location;
-
-                        pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;
-                        location = pkgObj.location;
-
-                        //Create a brand new object on pkgs, since currentPackages can
-                        //be passed in again, and config.pkgs is the internal transformed
-                        //state for all package configs.
-                        pkgs[pkgObj.name] = {
-                            name: pkgObj.name,
-                            location: location || pkgObj.name,
-                            //Remove leading dot in main, so main paths are normalized,
-                            //and remove any trailing .js, since different package
-                            //envs have different conventions: some use a module name,
-                            //some use a file name.
-                            main: (pkgObj.main || 'main')
-                                  .replace(currDirRegExp, '')
-                                  .replace(jsSuffixRegExp, '')
-                        };
-                    });
-
-                    //Done with modifications, assing packages back to context config
-                    config.pkgs = pkgs;
-                }
-
-                //If there are any "waiting to execute" modules in the registry,
-                //update the maps for them, since their info, like URLs to load,
-                //may have changed.
-                eachProp(registry, function (mod, id) {
-                    //If module already has init called, since it is too
-                    //late to modify them, and ignore unnormalized ones
-                    //since they are transient.
-                    if (!mod.inited && !mod.map.unnormalized) {
-                        mod.map = makeModuleMap(id);
-                    }
-                });
-
-                //If a deps array or a config callback is specified, then call
-                //require with those args. This is useful when require is defined as a
-                //config object before require.js is loaded.
-                if (cfg.deps || cfg.callback) {
-                    context.require(cfg.deps || [], cfg.callback);
-                }
-            },
-
-            makeShimExports: function (value) {
-                function fn() {
-                    var ret;
-                    if (value.init) {
-                        ret = value.init.apply(global, arguments);
-                    }
-                    return ret || (value.exports && getGlobal(value.exports));
-                }
-                return fn;
-            },
-
-            makeRequire: function (relMap, options) {
-                options = options || {};
-
-                function localRequire(deps, callback, errback) {
-                    var id, map, requireMod;
-
-                    if (options.enableBuildCallback && callback && isFunction(callback)) {
-                        callback.__requireJsBuild = true;
-                    }
-
-                    if (typeof deps === 'string') {
-                        if (isFunction(callback)) {
-                            //Invalid call
-                            return onError(makeError('requireargs', 'Invalid require call'), errback);
-                        }
-
-                        //If require|exports|module are requested, get the
-                        //value for them from the special handlers. Caveat:
-                        //this only works while module is being defined.
-                        if (relMap && hasProp(handlers, deps)) {
-                            return handlers[deps](registry[relMap.id]);
-                        }
-
-                        //Synchronous access to one module. If require.get is
-                        //available (as in the Node adapter), prefer that.
-                        if (req.get) {
-                            return req.get(context, deps, relMap);
-                        }
-
-                        //Normalize module name, if it contains . or ..
-                        map = makeModuleMap(deps, relMap, false, true);
-                        id = map.id;
-
-                        if (!hasProp(defined, id)) {
-                            return onError(makeError('notloaded', 'Module name "' +
-                                        id +
-                                        '" has not been loaded yet for context: ' +
-                                        contextName +
-                                        (relMap ? '' : '. Use require([])')));
-                        }
-                        return defined[id];
-                    }
-
-                    //Grab defines waiting in the global queue.
-                    intakeDefines();
-
-                    //Mark all the dependencies as needing to be loaded.
-                    context.nextTick(function () {
-                        //Some defines could have been added since the
-                        //require call, collect them.
-                        intakeDefines();
-
-                        requireMod = getModule(makeModuleMap(null, relMap));
-
-                        //Store if map config should be applied to this require
-                        //call for dependencies.
-                        requireMod.skipMap = options.skipMap;
-
-                        requireMod.init(deps, callback, errback, {
-                            enabled: true
-                        });
-
-                        checkLoaded();
-                    });
-
-                    return localRequire;
-                }
-
-                mixin(localRequire, {
-                    isBrowser: isBrowser,
-
-                    /**
-                     * Converts a module name + .extension into an URL path.
-                     * *Requires* the use of a module name. It does not support using
-                     * plain URLs like nameToUrl.
-                     */
-                    toUrl: function (moduleNamePlusExt) {
-                        var index = moduleNamePlusExt.lastIndexOf('.'),
-                            ext = null;
-
-                        if (index !== -1) {
-                            ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
-                            moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
-                        }
-
-                        return context.nameToUrl(normalize(moduleNamePlusExt,
-                                                relMap && relMap.id, true), ext);
-                    },
-
-                    defined: function (id) {
-                        return hasProp(defined, makeModuleMap(id, relMap, false, true).id);
-                    },
-
-                    specified: function (id) {
-                        id = makeModuleMap(id, relMap, false, true).id;
-                        return hasProp(defined, id) || hasProp(registry, id);
-                    }
-                });
-
-                //Only allow undef on top level require calls
-                if (!relMap) {
-                    localRequire.undef = function (id) {
-                        //Bind any waiting define() calls to this context,
-                        //fix for #408
-                        takeGlobalQueue();
-
-                        var map = makeModuleMap(id, relMap, true),
-                            mod = getOwn(registry, id);
-
-                        delete defined[id];
-                        delete urlFetched[map.url];
-                        delete undefEvents[id];
-
-                        if (mod) {
-                            //Hold on to listeners in case the
-                            //module will be attempted to be reloaded
-                            //using a different config.
-                            if (mod.events.defined) {
-                                undefEvents[id] = mod.events;
-                            }
-
-                            cleanRegistry(id);
-                        }
-                    };
-                }
-
-                return localRequire;
-            },
-
-            /**
-             * Called to enable a module if it is still in the registry
-             * awaiting enablement. parent module is passed in for context,
-             * used by the optimizer.
-             */
-            enable: function (depMap, parent) {
-                var mod = getOwn(registry, depMap.id);
-                if (mod) {
-                    getModule(depMap).enable();
-                }
-            },
-
-            /**
-             * Internal method used by environment adapters to complete a load event.
-             * A load event could be a script load or just a load pass from a synchronous
-             * load call.
-             * @param {String} moduleName the name of the module to potentially complete.
-             */
-            completeLoad: function (moduleName) {
-                var found, args, mod,
-                    shim = getOwn(config.shim, moduleName) || {},
-                    shExports = shim.exports;
-
-                takeGlobalQueue();
-
-                while (defQueue.length) {
-                    args = defQueue.shift();
-                    if (args[0] === null) {
-                        args[0] = moduleName;
-                        //If already found an anonymous module and bound it
-                        //to this name, then this is some other anon module
-                        //waiting for its completeLoad to fire.
-                        if (found) {
-                            break;
-                        }
-                        found = true;
-                    } else if (args[0] === moduleName) {
-                        //Found matching define call for this script!
-                        found = true;
-                    }
-
-                    callGetModule(args);
-                }
-
-                //Do this after the cycle of callGetModule in case the result
-                //of those calls/init calls changes the registry.
-                mod = getOwn(registry, moduleName);
-
-                if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {
-                    if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {
-                        if (hasPathFallback(moduleName)) {
-                            return;
-                        } else {
-                            return onError(makeError('nodefine',
-                                             'No define call for ' + moduleName,
-                                             null,
-                                             [moduleName]));
-                        }
-                    } else {
-                        //A script that does not call define(), so just simulate
-                        //the call for it.
-                        callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);
-                    }
-                }
-
-                checkLoaded();
-            },
-
-            /**
-             * Converts a module name to a file path. Supports cases where
-             * moduleName may actually be just an URL.
-             * Note that it **does not** call normalize on the moduleName,
-             * it is assumed to have already been normalized. This is an
-             * internal API, not a public one. Use toUrl for the public API.
-             */
-            nameToUrl: function (moduleName, ext) {
-                var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,
-                    parentPath;
-
-                //If a colon is in the URL, it indicates a protocol is used and it is just
-                //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)
-                //or ends with .js, then assume the user meant to use an url and not a module id.
-                //The slash is important for protocol-less URLs as well as full paths.
-                if (req.jsExtRegExp.test(moduleName)) {
-                    //Just a plain path, not module name lookup, so just return it.
-                    //Add extension if it is included. This is a bit wonky, only non-.js things pass
-                    //an extension, this method probably needs to be reworked.
-                    url = moduleName + (ext || '');
-                } else {
-                    //A module that needs to be converted to a path.
-                    paths = config.paths;
-                    pkgs = config.pkgs;
-
-                    syms = moduleName.split('/');
-                    //For each module name segment, see if there is a path
-                    //registered for it. Start with most specific name
-                    //and work up from it.
-                    for (i = syms.length; i > 0; i -= 1) {
-                        parentModule = syms.slice(0, i).join('/');
-                        pkg = getOwn(pkgs, parentModule);
-                        parentPath = getOwn(paths, parentModule);
-                        if (parentPath) {
-                            //If an array, it means there are a few choices,
-                            //Choose the one that is desired
-                            if (isArray(parentPath)) {
-                                parentPath = parentPath[0];
-                            }
-                            syms.splice(0, i, parentPath);
-                            break;
-                        } else if (pkg) {
-                            //If module name is just the package name, then looking
-                            //for the main module.
-                            if (moduleName === pkg.name) {
-                                pkgPath = pkg.location + '/' + pkg.main;
-                            } else {
-                                pkgPath = pkg.location;
-                            }
-                            syms.splice(0, i, pkgPath);
-                            break;
-                        }
-                    }
-
-                    //Join the path parts together, then figure out if baseUrl is needed.
-                    url = syms.join('/');
-                    url += (ext || (/\?/.test(url) ? '' : '.js'));
-                    url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;
-                }
-
-                return config.urlArgs ? url +
-                                        ((url.indexOf('?') === -1 ? '?' : '&') +
-                                         config.urlArgs) : url;
-            },
-
-            //Delegates to req.load. Broken out as a separate function to
-            //allow overriding in the optimizer.
-            load: function (id, url) {
-                req.load(context, id, url);
-            },
-
-            /**
-             * Executes a module callack function. Broken out as a separate function
-             * solely to allow the build system to sequence the files in the built
-             * layer in the right sequence.
-             *
-             * @private
-             */
-            execCb: function (name, callback, args, exports) {
-                return callback.apply(exports, args);
-            },
-
-            /**
-             * callback for script loads, used to check status of loading.
-             *
-             * @param {Event} evt the event from the browser for the script
-             * that was loaded.
-             */
-            onScriptLoad: function (evt) {
-                //Using currentTarget instead of target for Firefox 2.0's sake. Not
-                //all old browsers will be supported, but this one was easy enough
-                //to support and still makes sense.
-                if (evt.type === 'load' ||
-                        (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {
-                    //Reset interactive script so a script node is not held onto for
-                    //to long.
-                    interactiveScript = null;
-
-                    //Pull out the name of the module and the context.
-                    var data = getScriptData(evt);
-                    context.completeLoad(data.id);
-                }
-            },
-
-            /**
-             * Callback for script errors.
-             */
-            onScriptError: function (evt) {
-                var data = getScriptData(evt);
-                if (!hasPathFallback(data.id)) {
-                    return onError(makeError('scripterror', 'Script error', evt, [data.id]));
-                }
-            }
-        };
-
-        context.require = context.makeRequire();
-        return context;
-    }
-
-    /**
-     * Main entry point.
-     *
-     * If the only argument to require is a string, then the module that
-     * is represented by that string is fetched for the appropriate context.
-     *
-     * If the first argument is an array, then it will be treated as an array
-     * of dependency string names to fetch. An optional function callback can
-     * be specified to execute when all of those dependencies are available.
-     *
-     * Make a local req variable to help Caja compliance (it assumes things
-     * on a require that are not standardized), and to give a short
-     * name for minification/local scope use.
-     */
-    req = requirejs = function (deps, callback, errback, optional) {
-
-        //Find the right context, use default
-        var context, config,
-            contextName = defContextName;
-
-        // Determine if have config object in the call.
-        if (!isArray(deps) && typeof deps !== 'string') {
-            // deps is a config object
-            config = deps;
-            if (isArray(callback)) {
-                // Adjust args if there are dependencies
-                deps = callback;
-                callback = errback;
-                errback = optional;
-            } else {
-                deps = [];
-            }
-        }
-
-        if (config && config.context) {
-            contextName = config.context;
-        }
-
-        context = getOwn(contexts, contextName);
-        if (!context) {
-            context = contexts[contextName] = req.s.newContext(contextName);
-        }
-
-        if (config) {
-            context.configure(config);
-        }
-
-        return context.require(deps, callback, errback);
-    };
-
-    /**
-     * Support require.config() to make it easier to cooperate with other
-     * AMD loaders on globally agreed names.
-     */
-    req.config = function (config) {
-        return req(config);
-    };
-
-    /**
-     * Execute something after the current tick
-     * of the event loop. Override for other envs
-     * that have a better solution than setTimeout.
-     * @param  {Function} fn function to execute later.
-     */
-    req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
-        setTimeout(fn, 4);
-    } : function (fn) { fn(); };
-
-    /**
-     * Export require as a global, but only if it does not already exist.
-     */
-    if (!require) {
-        require = req;
-    }
-
-    req.version = version;
-
-    //Used to filter out dependencies that are already paths.
-    req.jsExtRegExp = /^\/|:|\?|\.js$/;
-    req.isBrowser = isBrowser;
-    s = req.s = {
-        contexts: contexts,
-        newContext: newContext
-    };
-
-    //Create default context.
-    req({});
-
-    //Exports some context-sensitive methods on global require.
-    each([
-        'toUrl',
-        'undef',
-        'defined',
-        'specified'
-    ], function (prop) {
-        //Reference from contexts instead of early binding to default context,
-        //so that during builds, the latest instance of the default context
-        //with its config gets used.
-        req[prop] = function () {
-            var ctx = contexts[defContextName];
-            return ctx.require[prop].apply(ctx, arguments);
-        };
-    });
-
-    if (isBrowser) {
-        head = s.head = document.getElementsByTagName('head')[0];
-        //If BASE tag is in play, using appendChild is a problem for IE6.
-        //When that browser dies, this can be removed. Details in this jQuery bug:
-        //http://dev.jquery.com/ticket/2709
-        baseElement = document.getElementsByTagName('base')[0];
-        if (baseElement) {
-            head = s.head = baseElement.parentNode;
-        }
-    }
-
-    /**
-     * Any errors that require explicitly generates will be passed to this
-     * function. Intercept/override it if you want custom error handling.
-     * @param {Error} err the error object.
-     */
-    req.onError = function (err) {
-        throw err;
-    };
-
-    /**
-     * Does the request to load a module for the browser case.
-     * Make this a separate function to allow other environments
-     * to override it.
-     *
-     * @param {Object} context the require context to find state.
-     * @param {String} moduleName the name of the module.
-     * @param {Object} url the URL to the module.
-     */
-    req.load = function (context, moduleName, url) {
-        var config = (context && context.config) || {},
-            node;
-        if (isBrowser) {
-            //In the browser so use a script tag
-            node = config.xhtml ?
-                    document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
-                    document.createElement('script');
-            node.type = config.scriptType || 'text/javascript';
-            node.charset = 'utf-8';
-            node.async = true;
-
-            node.setAttribute('data-requirecontext', context.contextName);
-            node.setAttribute('data-requiremodule', moduleName);
-
-            //Set up load listener. Test attachEvent first because IE9 has
-            //a subtle issue in its addEventListener and script onload firings
-            //that do not match the behavior of all other browsers with
-            //addEventListener support, which fire the onload event for a
-            //script right after the script execution. See:
-            //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
-            //UNFORTUNATELY Opera implements attachEvent but does not follow the script
-            //script execution mode.
-            if (node.attachEvent &&
-                    //Check if node.attachEvent is artificially added by custom script or
-                    //natively supported by browser
-                    //read https://github.com/jrburke/requirejs/issues/187
-                    //if we can NOT find [native code] then it must NOT natively supported.
-                    //in IE8, node.attachEvent does not have toString()
-                    //Note the test for "[native code" with no closing brace, see:
-                    //https://github.com/jrburke/requirejs/issues/273
-                    !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&
-                    !isOpera) {
-                //Probably IE. IE (at least 6-8) do not fire
-                //script onload right after executing the script, so
-                //we cannot tie the anonymous define call to a name.
-                //However, IE reports the script as being in 'interactive'
-                //readyState at the time of the define call.
-                useInteractive = true;
-
-                node.attachEvent('onreadystatechange', context.onScriptLoad);
-                //It would be great to add an error handler here to catch
-                //404s in IE9+. However, onreadystatechange will fire before
-                //the error handler, so that does not help. If addEvenListener
-                //is used, then IE will fire error before load, but we cannot
-                //use that pathway given the connect.microsoft.com issue
-                //mentioned above about not doing the 'script execute,
-                //then fire the script load event listener before execute
-                //next script' that other browsers do.
-                //Best hope: IE10 fixes the issues,
-                //and then destroys all installs of IE 6-9.
-                //node.attachEvent('onerror', context.onScriptError);
-            } else {
-                node.addEventListener('load', context.onScriptLoad, false);
-                node.addEventListener('error', context.onScriptError, false);
-            }
-            node.src = url;
-
-            //For some cache cases in IE 6-8, the script executes before the end
-            //of the appendChild execution, so to tie an anonymous define
-            //call to the module name (which is stored on the node), hold on
-            //to a reference to this node, but clear after the DOM insertion.
-            currentlyAddingScript = node;
-            if (baseElement) {
-                head.insertBefore(node, baseElement);
-            } else {
-                head.appendChild(node);
-            }
-            currentlyAddingScript = null;
-
-            return node;
-        } else if (isWebWorker) {
-            //In a web worker, use importScripts. This is not a very
-            //efficient use of importScripts, importScripts will block until
-            //its script is downloaded and evaluated. However, if web workers
-            //are in play, the expectation that a build has been done so that
-            //only one script needs to be loaded anyway. This may need to be
-            //reevaluated if other use cases become common.
-            importScripts(url);
-
-            //Account for anonymous modules
-            context.completeLoad(moduleName);
-        }
-    };
-
-    function getInteractiveScript() {
-        if (interactiveScript && interactiveScript.readyState === 'interactive') {
-            return interactiveScript;
-        }
-
-        eachReverse(scripts(), function (script) {
-            if (script.readyState === 'interactive') {
-                return (interactiveScript = script);
-            }
-        });
-        return interactiveScript;
-    }
-
-    //Look for a data-main script attribute, which could also adjust the baseUrl.
-    if (isBrowser) {
-        //Figure out baseUrl. Get it from the script tag with require.js in it.
-        eachReverse(scripts(), function (script) {
-            //Set the 'head' where we can append children by
-            //using the script's parent.
-            if (!head) {
-                head = script.parentNode;
-            }
-
-            //Look for a data-main attribute to set main script for the page
-            //to load. If it is there, the path to data main becomes the
-            //baseUrl, if it is not already set.
-            dataMain = script.getAttribute('data-main');
-            if (dataMain) {
-                //Set final baseUrl if there is not already an explicit one.
-                if (!cfg.baseUrl) {
-                    //Pull off the directory of data-main for use as the
-                    //baseUrl.
-                    src = dataMain.split('/');
-                    mainScript = src.pop();
-                    subPath = src.length ? src.join('/')  + '/' : './';
-
-                    cfg.baseUrl = subPath;
-                    dataMain = mainScript;
-                }
-
-                //Strip off any trailing .js since dataMain is now
-                //like a module name.
-                dataMain = dataMain.replace(jsSuffixRegExp, '');
-
-                //Put the data-main script in the files to load.
-                cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];
-
-                return true;
-            }
-        });
-    }
-
-    /**
-     * The function that handles definitions of modules. Differs from
-     * require() in that a string for the module should be the first argument,
-     * and the function to execute after dependencies are loaded should
-     * return a value to define the module corresponding to the first argument's
-     * name.
-     */
-    define = function (name, deps, callback) {
-        var node, context;
-
-        //Allow for anonymous modules
-        if (typeof name !== 'string') {
-            //Adjust args appropriately
-            callback = deps;
-            deps = name;
-            name = null;
-        }
-
-        //This module may not have dependencies
-        if (!isArray(deps)) {
-            callback = deps;
-            deps = [];
-        }
-
-        //If no name, and callback is a function, then figure out if it a
-        //CommonJS thing with dependencies.
-        if (!deps.length && isFunction(callback)) {
-            //Remove comments from the callback string,
-            //look for require calls, and pull them into the dependencies,
-            //but only if there are function args.
-            if (callback.length) {
-                callback
-                    .toString()
-                    .replace(commentRegExp, '')
-                    .replace(cjsRequireRegExp, function (match, dep) {
-                        deps.push(dep);
-                    });
-
-                //May be a CommonJS thing even without require calls, but still
-                //could use exports, and module. Avoid doing exports and module
-                //work though if it just needs require.
-                //REQUIRES the function to expect the CommonJS variables in the
-                //order listed below.
-                deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);
-            }
-        }
-
-        //If in IE 6-8 and hit an anonymous define() call, do the interactive
-        //work.
-        if (useInteractive) {
-            node = currentlyAddingScript || getInteractiveScript();
-            if (node) {
-                if (!name) {
-                    name = node.getAttribute('data-requiremodule');
-                }
-                context = contexts[node.getAttribute('data-requirecontext')];
-            }
-        }
-
-        //Always save off evaluating the def call until the script onload handler.
-        //This allows multiple modules to be in a file without prematurely
-        //tracing dependencies, and allows for anonymous module support,
-        //where the module name is not known until the script onload event
-        //occurs. If no context, use the global queue, and get it processed
-        //in the onscript load callback.
-        (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);
-    };
-
-    define.amd = {
-        jQuery: true
-    };
-
-
-    /**
-     * Executes the text. Normally just uses eval, but can be modified
-     * to use a better, environment-specific call. Only used for transpiling
-     * loader plugins, not for plain JS modules.
-     * @param {String} text the text to execute/evaluate.
-     */
-    req.exec = function (text) {
-        /*jslint evil: true */
-        return eval(text);
-    };
-
-    //Set up with config info.
-    req(cfg);
-}(this));
diff --git a/ui/legacy/lib/reset.css b/ui/legacy/lib/reset.css
deleted file mode 100644
index e29c0f5..0000000
--- a/ui/legacy/lib/reset.css
+++ /dev/null
@@ -1,48 +0,0 @@
-/* http://meyerweb.com/eric/tools/css/reset/ 
-   v2.0 | 20110126
-   License: none (public domain)
-*/
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, embed, 
-figure, figcaption, footer, header, hgroup, 
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	font-size: 100%;
-	font: inherit;
-	vertical-align: baseline;
-}
-/* HTML5 display-role reset for older browsers */
-article, aside, details, figcaption, figure, 
-footer, header, hgroup, menu, nav, section {
-	display: block;
-}
-body {
-	line-height: 1;
-}
-ol, ul {
-	list-style: none;
-}
-blockquote, q {
-	quotes: none;
-}
-blockquote:before, blockquote:after,
-q:before, q:after {
-	content: '';
-	content: none;
-}
-table {
-	border-collapse: collapse;
-	border-spacing: 0;
-}
diff --git a/ui/legacy/modules/infrastructure/infrastructure.css b/ui/legacy/modules/infrastructure/infrastructure.css
deleted file mode 100644
index 2a3d3b1..0000000
--- a/ui/legacy/modules/infrastructure/infrastructure.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/ 
diff --git a/ui/legacy/modules/infrastructure/infrastructure.js b/ui/legacy/modules/infrastructure/infrastructure.js
deleted file mode 100644
index a76c2ef..0000000
--- a/ui/legacy/modules/infrastructure/infrastructure.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-  cloudStack.modules.infrastructure = function(module) {
-    module.pluginAPI.extend({
-      networkServiceProvider: function(args) {
-        var name = args.name;
-        var id = args.id;
-        var state = args.state;
-        var detailView = args.detailView;
-        var listView = args.listView;
-
-        cloudStack.sections.system.naas.networkProviders.types[id] = detailView;
-        cloudStack.sections.system.subsections[listView.id] = {
-          id: listView.id,
-          title: name,
-          listView: listView
-        };
-
-        $(window).bind('cloudStack.system.serviceProviders.makeHarcodedArray', function(event, data) {
-          var nspHardcodingArray = data.nspHardcodingArray;
-          var selectedZoneObj = data.selectedZoneObj;   
-          var selectedPhysicalNetworkObj = data.selectedPhysicalNetworkObj;
-          if(selectedZoneObj.networktype == "Advanced"){      
-            var selectedProviderObj = null;
-            $.ajax({
-              url: createURL('listNetworkServiceProviders'),
-              data: {
-                name: id, //e.g. 'CiscoVnmc'
-                physicalnetworkid: selectedPhysicalNetworkObj.id      
-              },
-              async: false,
-              success: function(json){  
-                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                if(items != null && items.length > 0) {
-                  selectedProviderObj = items[0];
-                }
-              }
-            });
-           
-            nspHardcodingArray.push({
-              id: id,
-              name: name,
-              state: selectedProviderObj? selectedProviderObj.state : 'Absent'
-            });
-          } 
-        });
-      },
-
-      resource: function(args) {
-        var type = args.type;
-
-        if (type) {
-          return cloudStack.sections.system.subsections[type];
-        } else {
-          return false;
-        }
-      }
-    });
-  };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.css b/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.css
deleted file mode 100644
index 2a3d3b1..0000000
--- a/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/ 
diff --git a/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.js b/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.js
deleted file mode 100644
index dc0713f..0000000
--- a/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.js
+++ /dev/null
@@ -1,183 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-  cloudStack.modules.vnmcAsa1000v = function(module) {
-    module.vnmcNetworkProvider.addDevice({
-      id: 'asa1000v',
-      title: 'ASA 1000v',
-      listView: {
-        id: 'asa1000vDevices',
-        fields: {
-          hostname: { label: 'label.host' },
-          insideportprofile: { label: 'label.inside.port.profile' }
-        },
-        dataProvider: function(args) {
-          $.ajax({
-            url: createURL('listCiscoAsa1000vResources'),
-            data: {
-              physicalnetworkid: args.context.physicalNetworks[0].id
-            },
-            success: function(json){
-              var items = json.listCiscoAsa1000vResources.CiscoAsa1000vResource;
-              args.response.success({ data: items });
-            }
-          });
-        },
-
-        actions: {
-          add: {
-            label: 'label.add.ciscoASA1000v',
-            messages: {
-              notification: function(args) {
-                return 'label.add.ciscoASA1000v';
-              }
-            },
-            createForm: {
-              title: 'label.add.ciscoASA1000v',
-              fields: {
-                hostname: {
-                  label: 'label.host',
-                  validation: { required: true }
-                },
-                insideportprofile: {
-                  label: 'label.inside.port.profile',
-                  validation: { required: true }
-                },
-                clusterid: {
-                  label: 'label.cluster',
-                  validation: { required: true },
-                  select: function(args){
-                    $.ajax({
-                      url: createURL('listClusters'),
-                      data: {
-                        zoneid: args.context.zones[0].id
-                      },
-                      success: function(json) {
-                        var objs = json.listclustersresponse.cluster;
-                        var items = [];
-                        if(objs != null) {
-                          for(var i = 0; i < objs.length; i++){
-                            items.push({id: objs[i].id, description: objs[i].name});
-                          }
-                        }
-                        args.response.success({data: items});
-                      }
-                    });
-                  }
-                }
-              }
-            },
-            action: function(args) {
-              var data = {
-                physicalnetworkid: args.context.physicalNetworks[0].id,
-                hostname: args.data.hostname,
-                insideportprofile: args.data.insideportprofile,
-                clusterid: args.data.clusterid
-              };
-
-              $.ajax({
-                url: createURL('addCiscoAsa1000vResource'),
-                data: data,
-                success: function(json){
-                  var item = json.addCiscoAsa1000vResource.CiscoAsa1000vResource;
-                  args.response.success({data: item});
-                },
-                error: function(data) {
-                  args.response.error(parseXMLHttpResponse(data));
-                }
-              });
-
-            },
-            notification: {
-              poll: function(args) {
-                args.complete();
-              }
-            }
-          }
-        },
-
-        detailView: {
-          name: 'CiscoASA1000v details',
-          actions: {
-            remove: {
-              label: 'label.delete.ciscoASA1000v',
-              messages: {
-                confirm: function(args) {
-                  return 'message.confirm.delete.ciscoASA1000v';
-                },
-                notification: function(args) {
-                  return 'label.delete.ciscoASA1000v';
-                }
-              },
-              action: function(args) {
-                $.ajax({
-                  url: createURL('deleteCiscoAsa1000vResource'),
-                  data: {
-                    resourceid: args.context.asa1000vDevices[0].resourceid
-                  },
-                  success: function(json) {
-                    args.response.success();
-                  },
-                  error: function(data) {
-                    args.response.error(parseXMLHttpResponse(data));
-                  }
-                });
-              },
-              notification: {
-                poll: function(args) {
-                  args.complete();
-                }
-              }
-            }
-          },
-
-          tabs: {
-            details: {
-              title: 'label.details',
-
-              fields: [
-                {
-                  hostname: {
-                    label: 'label.host'
-                  }
-                },
-                {
-                  insideportprofile: { label: 'label.inside.port.profile' },
-                  RESOURCE_NAME: { label: 'label.resource.name' },
-                  resourceid: { label: 'label.reource.id' }
-                }
-              ],
-
-              dataProvider: function(args) {
-                $.ajax({
-                  url: createURL('listCiscoAsa1000vResources'),
-                  data: {
-                    resourceid: args.context.asa1000vDevices[0].resourceid
-                  },
-                  success: function(json) {
-                    var item = json.listCiscoAsa1000vResources.CiscoAsa1000vResource[0];
-                    args.response.success({ data: item });
-                  }
-                });
-              }
-            }
-          }
-        }
-      }
-    });
-  };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.css b/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.css
deleted file mode 100644
index 2a3d3b1..0000000
--- a/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/ 
diff --git a/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.js b/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.js
deleted file mode 100644
index 4535f12..0000000
--- a/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.js
+++ /dev/null
@@ -1,612 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function ($, cloudStack) {
-    cloudStack.modules.vnmcNetworkProvider = function (module) {
-        var vnmcDeviceViewAll = window._m = [{
-            label: 'label.vnmc.devices',
-            path: '_zone.vnmcDevices'
-        }];
-
-        var vnmcListView = {
-            id: 'vnmcDevices',
-            fields: {
-                resourcename: {
-                    label: 'label.resource.name'
-                },
-                provider: {
-                    label: 'label.provider'
-                }
-            },
-            dataProvider: function (args) {
-                $.ajax({
-                    url: createURL('listCiscoVnmcResources'),
-                    data: {
-                        physicalnetworkid: args.context.physicalNetworks[0].id
-                    },
-                    success: function (json) {
-                        var items = json.listCiscoVnmcResources.CiscoVnmcResource;
-                        args.response.success({
-                            data: items
-                        });
-                    }
-                });
-            },
-            actions: {
-                add: {
-                    label: 'label.add.vnmc.device',
-
-                    messages: {
-                        notification: function (args) {
-                            return 'label.add.vnmc.device';
-                        }
-                    },
-
-                    createForm: {
-                        title: 'label.add.vnmc.device',
-                        fields: {
-                            hostname: {
-                                label: 'label.host',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            username: {
-                                label: 'label.username',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            password: {
-                                label: 'label.password',
-                                isPassword: true,
-                                validation: {
-                                    required: true
-                                }
-                            }
-                        }
-                    },
-
-                    action: function (args) {
-                        $.ajax({
-                            url: createURL('listNetworkServiceProviders'),
-                            data: {
-                                name: 'CiscoVnmc',
-                                physicalnetworkid: args.context.physicalNetworks[0].id
-                            },
-                            success: function (json) {
-                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                if (items != null && items.length > 0) {
-                                    var ciscoVnmcProvider = items[0];
-                                    if (ciscoVnmcProvider.state == 'Enabled') {
-                                        addCiscoVnmcResourceFn();
-                                    } else {
-                                        enableCiscoVnmcProviderFn(ciscoVnmcProvider);
-                                    }
-                                } else {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider"),
-                                        data: {
-                                            name: 'CiscoVnmc',
-                                            physicalnetworkid: args.context.physicalNetworks[0].id
-                                        },
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addVnmcProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; //Job has not completed
-                                                        } else {
-                                                            clearInterval(addVnmcProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                //nspMap["CiscoVnmc"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                var ciscoVnmcProvider = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                enableCiscoVnmcProviderFn(ciscoVnmcProvider);
-                                                            } else if (result.jobstatus == 2) {
-                                                                args.response.error(_s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        args.response.error(parseXMLHttpResponse(data));
-                                                    }
-                                                });
-                                            }, g_queryAsyncJobResultInterval);
-                                        }
-                                    });
-                                }
-                            }
-                        });
-
-                        var enableCiscoVnmcProviderFn = function (ciscoVnmcProvider) {
-                            $.ajax({
-                                url: createURL('updateNetworkServiceProvider'),
-                                data: {
-                                    id: ciscoVnmcProvider.id,
-                                    state: 'Enabled'
-                                },
-                                success: function (json) {
-                                    var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                    var enableVnmcProviderIntervalID = setInterval(function () {
-                                        $.ajax({
-                                            url: createURL('queryAsyncJobResult'),
-                                            data: {
-                                                jobid: jid
-                                            },
-                                            success: function (json) {
-                                                var result = json.queryasyncjobresultresponse;
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                    clearInterval(enableVnmcProviderIntervalID);
-                                                    if (result.jobstatus == 1) {
-                                                        addCiscoVnmcResourceFn();
-                                                    } else if (result.jobstatus == 2) {
-                                                        args.response.error(_s(result.jobresult.errortext));
-                                                    }
-                                                }
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        };
-
-                        var addCiscoVnmcResourceFn = function () {
-                            var data = {
-                                physicalnetworkid: args.context.physicalNetworks[0].id,
-                                hostname: args.data.hostname,
-                                username: args.data.username,
-                                password: args.data.password
-                            };
-
-                            $.ajax({
-                                url: createURL('addCiscoVnmcResource'),
-                                type: "POST",
-                                data: data,
-                                success: function (json) {
-                                    var item = json.addCiscoVnmcResource.CiscoVnmcResource;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                },
-                                error: function (data) {
-                                    args.response.error(parseXMLHttpResponse(data));
-                                }
-                            });
-                        }
-                    },
-
-                    notification: {
-                        poll: function (args) {
-                            args.complete();
-                        }
-                    }
-                }
-            },
-
-            detailView: {
-                name: 'label.ciscovnmc.resource.details',
-                actions: {
-                    remove: {
-                        label: 'label.delete.ciscovnmc.resource',
-                        messages: {
-                            confirm: function (args) {
-                                return 'message.confirm.delete.ciscovnmc.resource';
-                            },
-                            notification: function (args) {
-                                return 'label.delete.ciscovnmc.resource';
-                            }
-                        },
-                        action: function (args) {
-                            $.ajax({
-                                url: createURL('deleteCiscoVnmcResource'),
-                                data: {
-                                    resourceid: args.context.vnmcDevices[0].resourceid
-                                },
-                                success: function (json) {
-                                    args.response.success();
-                                },
-                                error: function (data) {
-                                    args.response.error(parseXMLHttpResponse(data));
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: function (args) {
-                                args.complete();
-                            }
-                        }
-                    }
-                },
-
-                tabs: {
-                    details: {
-                        title: 'label.details',
-                        fields: [{
-                            resourcename: {
-                                label: 'label.resource.name'
-                            }
-                        }, {
-                            resourceid: {
-                                label: 'label.reource.id'
-                            },
-                            provider: {
-                                label: 'label.provider'
-                            }
-                        }],
-                        dataProvider: function (args) {
-                            $.ajax({
-                                url: createURL('listCiscoVnmcResources'),
-                                data: {
-                                    resourceid: args.context.vnmcDevices[0].resourceid
-                                },
-                                success: function (json) {
-                                    var item = json.listCiscoVnmcResources.CiscoVnmcResource[0];
-                                    args.response.success({
-                                        data: item
-                                    });
-                                }
-                            });
-                        }
-                    }
-                }
-            }
-        };
-
-        var vnmcProviderDetailView = {
-            id: 'vnmcProvider',
-            label: 'label.vnmc',
-            viewAll: vnmcDeviceViewAll,
-            actions: {
-            	add: {
-            		label: 'label.add.vnmc.provider',
-
-                    messages: {
-                        confirm: function (args) {
-                            return 'message.confirm.add.vnmc.provider';
-                        },
-                        notification: function (args) {
-                            return 'label.add.vnmc.device';
-                        }
-                    },
-
-                    action: function (args) {      
-                    	$.ajax({
-                            url: createURL("addNetworkServiceProvider"),
-                            data: {
-                                name: 'CiscoVnmc',
-                                physicalnetworkid: args.context.physicalNetworks[0].id
-                            },
-                            success: function (json) {                            	
-                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                var addVnmcProviderIntervalID = setInterval(function () {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(addVnmcProviderIntervalID);
-                                                if (result.jobstatus == 1) {                                                    
-                                                    var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;        
-                                                    args.response.success({
-                                                        data: item
-                                                    });                                                    
-                                                } else if (result.jobstatus == 2) {
-                                                    args.response.error(_s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        },
-                                        error: function (XMLHttpResponse) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            }
-                        });                    	
-                    }
-            	},
-                enable: {
-                    label: 'label.enable.vnmc.provider',
-
-                    messages: {
-                        confirm: function (args) {
-                            return 'message.confirm.enable.vnmc.provider';
-                        },
-                        notification: function (args) {
-                            return 'label.enable.vnmc.device';
-                        }
-                    },
-
-                    action: function (args) {
-                        $.ajax({
-                            url: createURL('listNetworkServiceProviders'),
-                            data: {
-                                name: 'CiscoVnmc',
-                                physicalnetworkid: args.context.physicalNetworks[0].id
-                            },
-                            success: function (json) {
-                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                if (items != null && items.length > 0) {
-                                    var ciscoVnmcProvider = items[0];
-
-                                    enableCiscoVnmcProviderFn(ciscoVnmcProvider);
-                                } else {
-                                    args.response.error('message.vnmc.available.list');
-                                }
-                            }
-                        });
-
-                        var enableCiscoVnmcProviderFn = function (ciscoVnmcProvider) {
-                            $.ajax({
-                                url: createURL('updateNetworkServiceProvider'),
-                                data: {
-                                    id: ciscoVnmcProvider.id,
-                                    state: 'Enabled'
-                                },
-                                success: function (json) {
-                                    var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                    var enableVnmcProviderIntervalID = setInterval(function () {
-                                        $.ajax({
-                                            url: createURL('queryAsyncJobResult'),
-                                            data: {
-                                                jobid: jid
-                                            },
-                                            success: function (json) {
-                                                var result = json.queryasyncjobresultresponse;                                                
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                	clearInterval(enableVnmcProviderIntervalID);
-                                                    if (result.jobstatus == 1) {
-                                                        args.response.success({
-                                                            data: result.jobresult.networkserviceprovider
-                                                        });
-                                                    } else if (result.jobstatus == 2) {
-                                                        args.response.error(_s(result.jobresult.errortext));
-                                                    }
-                                                }
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        }
-
-                        var addCiscoVnmcResourceFn = function () {
-                            var data = {
-                                physicalnetworkid: args.context.physicalNetworks[0].id,
-                                hostname: args.data.hostname,
-                                username: args.data.username,
-                                password: args.data.password
-                            };
-
-                            $.ajax({
-                                url: createURL('addCiscoVnmcResource'),
-                                data: data,
-                                success: function (json) {
-                                    var item = json.addCiscoVnmcResource.CiscoVnmcResource;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                },
-                                error: function (data) {
-                                    args.response.error(parseXMLHttpResponse(data));
-                                }
-                            });
-                        }
-                    }                    
-                },
-
-                disable: {
-                    label: 'label.disable.vnmc.provider',
-
-                    messages: {
-                        confirm: function (args) {
-                            return 'message.confirm.disable.vnmc.provider';
-                        },
-                        notification: function (args) {
-                            return 'label.disbale.vnmc.device';
-                        }
-                    },
-
-                    action: function (args) {
-                        $.ajax({
-                            url: createURL('listNetworkServiceProviders'),
-                            data: {
-                                name: 'CiscoVnmc',
-                                physicalnetworkid: args.context.physicalNetworks[0].id
-                            },
-                            success: function (json) {
-                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                if (items != null && items.length > 0) {
-                                    var ciscoVnmcProvider = items[0];
-
-                                    disableCiscoVnmcProviderFn(ciscoVnmcProvider);
-                                } else {
-                                    args.response.error('message.vnmc.not.available.list');
-                                }
-                            }
-                        });
-
-                        var disableCiscoVnmcProviderFn = function (ciscoVnmcProvider) {
-                            $.ajax({
-                                url: createURL('updateNetworkServiceProvider'),
-                                data: {
-                                    id: ciscoVnmcProvider.id,
-                                    state: 'Disabled'
-                                },
-                                success: function (json) {
-                                    var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                    var disableVnmcProviderIntervalID = setInterval(function () {
-                                        $.ajax({
-                                            url: createURL('queryAsyncJobResult'),
-                                            data: {
-                                                jobid: jid
-                                            },
-                                            success: function (json) {
-                                                var result = json.queryasyncjobresultresponse;                                             
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                    clearInterval(disableVnmcProviderIntervalID);
-                                                    if (result.jobstatus == 1) {
-                                                        args.response.success({
-                                                            data: result.jobresult.networkserviceprovider
-                                                        });
-                                                    } else if (result.jobstatus == 2) {
-                                                        args.response.error(_s(result.jobresult.errortext));
-                                                    }
-                                                }
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        };
-
-                        var addCiscoVnmcResourceFn = function () {
-                            var data = {
-                                physicalnetworkid: args.context.physicalNetworks[0].id,
-                                hostname: args.data.hostname,
-                                username: args.data.username,
-                                password: args.data.password
-                            };
-
-                            $.ajax({
-                                url: createURL('addCiscoVnmcResource'),
-                                data: data,
-                                success: function (json) {
-                                    var item = json.addCiscoVnmcResource.CiscoVnmcResource;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                },
-                                error: function (data) {
-                                    args.response.error(parseXMLHttpResponse(data));
-                                }
-                            });
-                        }
-                    }                    
-                }
-            },
-            tabs: {
-                details: {
-                    title: 'label.details',
-                    fields: [{
-                        name: {
-                            label: 'label.name'
-                        }
-                    }, {
-                        state: {
-                            label: 'label.state'
-                        },
-                        id: {
-                            label: 'label.id'
-                        },
-                        servicelist: {
-                            label: 'label.services',
-                            converter: function (args) {
-                                if (args)
-                                    return args.join(', ');
-                                else
-                                    return '';
-                            }
-                        }
-                    }],
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL('listNetworkServiceProviders'),
-                            data: {
-                                name: 'CiscoVnmc',
-                                physicalnetworkid: args.context.physicalNetworks[0].id
-                            },
-                            success: function (json) {
-                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                if (items != null && items.length > 0) {
-                                    args.response.success({
-                                        data: items[0],
-                                        actionFilter: vnmcActionFilter
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: {
-                                            name: 'CiscoVnmc',
-                                            state: 'Absent'
-                                        },
-                                        actionFilter: vnmcActionFilter
-                                    });
-                                }
-                            }
-                        });
-                    }
-                }
-            }
-        };
-
-        var vnmcActionFilter = function (args) {
-        	var allowedActions = [];
-            $.ajax({
-                url: createURL('listNetworkServiceProviders'),                
-                data: {
-                    name: 'CiscoVnmc',
-                    physicalnetworkid: args.context.physicalNetworks[0].id
-                },
-                async: false,
-                success: function (json) {
-                    var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;                    
-                    if (items != null && items.length > 0) {
-                        var ciscoVnmcProvider = items[0];
-                        if (ciscoVnmcProvider.state == 'Enabled') {
-                        	allowedActions.push('disable');
-                        } else if (ciscoVnmcProvider.state == 'Disabled') {
-                        	allowedActions.push('enable');
-                        }
-                    } else {
-                    	allowedActions.push('add');
-                    }
-                }
-            });
-            return allowedActions;
-        };
-
-        module.pluginAPI.extend({
-            addDevice: function (device) {
-                cloudStack.sections.system.subsections[device.id] = device;
-                vnmcDeviceViewAll.push({
-                    label: device.title,
-                    path: '_zone.' + device.id
-                });
-            }
-        });
-
-        module.infrastructure.networkServiceProvider({
-            id: 'CiscoVnmc',
-            name: 'Cisco VNMC',
-            //state: 'Disabled', //don't know state until log in and visit Infrastructure menu > zone detail > physical network > network service providers
-            listView: vnmcListView,
-
-            detailView: vnmcProviderDetailView
-        });
-    };
-}(jQuery, cloudStack));
\ No newline at end of file
diff --git a/ui/legacy/modules/vpc/vpc.css b/ui/legacy/modules/vpc/vpc.css
deleted file mode 100644
index 0ff99db..0000000
--- a/ui/legacy/modules/vpc/vpc.css
+++ /dev/null
@@ -1,384 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-.vpc-network-chart {
-  width: 100%;
-  height: 100%;
-  overflow: auto;
-  overflow-x: hidden;
-  position: relative;
-}
-
-.vpc-network-chart .info-box {
-  font-size: 12px;
-  color: #6E6B6B;
-  padding: 9px 1px 10px 20px;
-  background: #FFFFFF;
-  border: 2px solid #CFCFCF;
-  position: absolute;
-  top: 42px;
-  left: 10px;
-  width: 737px;
-}
-
-.vpc-network-chart .info-box .color-key {
-  display: block;
-  background: #2983E3;
-  padding: 1px;
-  float: left;
-  width: 10px;
-  height: 10px;
-  margin: 0px 9px 1px 0px;
-}
-
-.vpc-network-chart .tiers {
-  margin: 66px 46px 0 0;
-  width: 362px;
-  float: right;
-}
-
-.vpc-network-chart .tier-item {
-  border: 1px solid #477FB4;
-  overflow: hidden;
-  width: 326px;
-  height: 182px;
-  margin: 18px;
-  /*+border-radius:4px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  border-radius: 4px;
-  background: #8DB1D3;
-}
-
-.vpc-network-chart .tier-item .header {
-  width: 100%;
-  float: left;
-  padding: 7px 0 6px;
-  position: relative;
-  /*+box-shadow:inset 0px 1px 1px #FFFFFF;*/
-  -moz-box-shadow: inset 0px 1px 1px #FFFFFF;
-  -webkit-box-shadow: inset 0px 1px 1px #FFFFFF;
-  -o-box-shadow: inset 0px 1px 1px #FFFFFF;
-  box-shadow: inset 0px 1px 1px #FFFFFF;
-  background: #69839D;
-  border-bottom: 1px solid #40639E;
-}
-
-.vpc-network-chart .tier-item .header .detail-link {
-  cursor: pointer;
-  background: #435667 url(../../images/sprites.png) -428px -83px;
-  /*+box-shadow:inset 0px 1px 4px #2F2F2F;*/
-  -moz-box-shadow: inset 0px 1px 4px #2F2F2F;
-  -webkit-box-shadow: inset 0px 1px 4px #2F2F2F;
-  -o-box-shadow: inset 0px 1px 4px #2F2F2F;
-  box-shadow: inset 0px 1px 4px #2F2F2F;
-  width: 16px;
-  height: 16px;
-  float: right;
-  /*+placement:shift -8px 2px;*/
-  position: relative;
-  left: -8px;
-  top: 2px;
-  /*+border-radius:10px;*/
-  -moz-border-radius: 10px;
-  -webkit-border-radius: 10px;
-  -khtml-border-radius: 10px;
-  border-radius: 10px;
-}
-
-.vpc-network-chart .tier-item .header .detail-link:hover {
-  background-color: #454545;
-}
-
-.vpc-network-chart .tier-item .header .title {
-  margin-left: 9px;
-  width: 268px;
-  height: 20px;
-  float: left;
-  overflow: hidden;
-}
-
-.vpc-network-chart .tier-item .header .title span {
-  font-size: 20px;
-  color: #FFFFFF;
-  /*+text-shadow:0px 1px 1px #000000;*/
-  -moz-text-shadow: 0px 1px 1px #000000;
-  -webkit-text-shadow: 0px 1px 1px #000000;
-  -o-text-shadow: 0px 1px 1px #000000;
-  text-shadow: 0px 1px 1px #000000;
-}
-
-.vpc-network-chart .tier-item .content {
-  width: 100%;
-  height: 100%;
-  /*+box-shadow:inset 0px 1px 1px #FFFFFF;*/
-  -moz-box-shadow: inset 0px 1px 1px #FFFFFF;
-  -webkit-box-shadow: inset 0px 1px 1px #FFFFFF;
-  -o-box-shadow: inset 0px 1px 1px #FFFFFF;
-  box-shadow: inset 0px 1px 1px #FFFFFF;
-  border-bottom: 1px solid #8DB1D3;
-}
-
-.vpc-network-chart .tier-item .content .dashboard {
-  display: inline-block;
-}
-
-.vpc-network-chart .tier-item .content .dashboard-item {
-  width: 145px;
-  height: 54px;
-  margin: 7px 9px 0;
-  background: #C1E0FE;
-  /*+border-radius:4px;*/
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  -khtml-border-radius: 4px;
-  border-radius: 4px;
-  float: left;
-  cursor: pointer;
-}
-
-.vpc-network-chart .tier-item .content .dashboard-item.disabled {
-  /*+opacity:50%;*/
-  filter: alpha(opacity=50);
-  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
-  -moz-opacity: 0.5;
-  opacity: 0.5;
-  cursor: not-allowed;
-}
-
-.vpc-network-chart .tier-item .content .dashboard-item:hover {
-  background-color: #DBEDFE;
-  /*+box-shadow:inset 0px 1px 2px #000000;*/
-  -moz-box-shadow: inset 0px 1px 2px #000000;
-  -webkit-box-shadow: inset 0px 1px 2px #000000;
-  -o-box-shadow: inset 0px 1px 2px #000000;
-  box-shadow: inset 0px 1px 2px #000000;
-}
-
-.vpc-network-chart .tier-item .content .dashboard-item .total {
-  font-size: 30px;
-  /*+placement:shift 7px 5px;*/
-  position: relative;
-  left: 7px;
-  top: 5px;
-  color: #145CA1;
-  font-weight: 100;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -moz-text-shadow: 0px 1px 1px #FFFFFF;
-  -webkit-text-shadow: 0px 1px 1px #FFFFFF;
-  -o-text-shadow: 0px 1px 1px #FFFFFF;
-  text-shadow: 0px 1px 1px #FFFFFF;
-}
-
-.vpc-network-chart .tier-item .content .dashboard-item .total.multiline {
-  font-size: 14px;
-}
-
-.vpc-network-chart .tier-item .content .dashboard-item .name {
-  font-size: 11px;
-  text-transform: uppercase;
-  color: #0861B7;
-  /*+placement:shift 8px 7px;*/
-  position: relative;
-  left: 8px;
-  top: 7px;
-  /*+text-shadow:0px 1px 1px #FFFFFF;*/
-  -moz-text-shadow: 0px 1px 1px #FFFFFF;
-  -webkit-text-shadow: 0px 1px 1px #FFFFFF;
-  -o-text-shadow: 0px 1px 1px #FFFFFF;
-  text-shadow: 0px 1px 1px #FFFFFF;
-}
-
-.vpc-network-chart .tier-item .content .info {
-  /*+placement:shift 10px 5px;*/
-  position: relative;
-  left: 10px;
-  top: 5px;
-}
-
-.vpc-network-chart .tier-item .content .info .cidr-label {
-  font-size: 10px;
-  color: #1860A7;
-}
-
-.vpc-network-chart .tier-item .content .info .cidr {
-  color: #364553;
-  font-size: 10px;
-  /*+text-shadow:0px 1px #C7D8E9;*/
-  -moz-text-shadow: 0px 1px #C7D8E9;
-  -webkit-text-shadow: 0px 1px #C7D8E9;
-  -o-text-shadow: 0px 1px #C7D8E9;
-  text-shadow: 0px 1px #C7D8E9;
-}
-
-.vpc-network-chart .tier-placeholder {
-  cursor: pointer;
-  background: #EFEFEF;
-  border: 4px dotted #B1B1B1;
-  /*+border-radius:8px;*/
-  -moz-border-radius: 8px;
-  -webkit-border-radius: 8px;
-  -khtml-border-radius: 8px;
-  border-radius: 8px;
-  width: 325px;
-  text-align: center;
-  padding: 57px 0 55px;
-  margin: 0 0 0 18px;
-}
-
-.vpc-network-chart .tier-placeholder:hover {
-  background: #DCDCDC;
-  /*+border-radius:8px;*/
-  -moz-border-radius: 8px;
-  -webkit-border-radius: 8px;
-  -khtml-border-radius: 8px;
-  border-radius: 8px;
-  /*+box-shadow:inset 0px 1px 4px #000000;*/
-  -moz-box-shadow: inset 0px 1px 4px #000000;
-  -webkit-box-shadow: inset 0px 1px 4px #000000;
-  -o-box-shadow: inset 0px 1px 4px #000000;
-  box-shadow: inset 0px 1px 4px #000000;
-  /*+text-shadow:0px 1px #FFFFFF;*/
-  -moz-text-shadow: 0px 1px #FFFFFF;
-  -webkit-text-shadow: 0px 1px #FFFFFF;
-  -o-text-shadow: 0px 1px #FFFFFF;
-  text-shadow: 0px 1px #FFFFFF;
-}
-
-.vpc-network-chart .tier-placeholder:hover span {
-  color: #535353;
-}
-
-.vpc-network-chart .tier-placeholder span {
-  color: #AFAFAF;
-  font-size: 24px;
-  font-weight: 200;
-}
-
-.vpc-network-chart .tier-item.router {
-  width: 258px;
-  height: 224px;
-  background: #BDBDBD;
-  border: 1px solid #808080;
-  float: left;
-  /*+placement:shift 10px 176px;*/
-  position: relative;
-  left: 10px;
-  top: 176px;
-  left: 0px;
-  top: 237px;
-}
-
-.vpc-network-chart .tier-item.router .header {
-  padding: 15px 0 14px;
-  border-bottom: 1px solid #808080;
-  background: #C3C6C9;
-  /*Old browsers*/
-  background: -moz-linear-gradient(top, #c3c6c9 0%, #909497 100%);
-  /*FF3.6+*/
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#c3c6c9), color-stop(100%,#909497));
-  /*Chrome,Safari4+*/
-  background: -webkit-linear-gradient(top, #c3c6c9 0%,#909497 100%);
-  /*Chrome10+,Safari5.1+*/
-  background: -o-linear-gradient(top, #c3c6c9 0%,#909497 100%);
-  /*Opera 11.10+*/
-  background: -ms-linear-gradient(top, #c3c6c9 0%,#909497 100%);
-  /*IE10+*/
-  background: linear-gradient(to bottom, #c3c6c9 0%,#909497 100%);
-  /*W3C*/
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c3c6c9', endColorstr='#909497',GradientType=0 );
-  /*IE6-8*/
-}
-
-.vpc-network-chart .tier-item.router .header .title {
-  width: 212px;
-  margin-top: 3px;
-}
-
-.vpc-network-chart .tier-item.router .header .title span {
-  padding: 0 0 0 50px;
-}
-
-.vpc-network-chart .tier-item.router .header span.icon {
-  background: url(../../images/sprites.png) -589px -1175px;
-  padding: 10px 10px 10px 20px;
-  float: left;
-  position: absolute;
-  top: 7px;
-  left: 10px;
-}
-
-.vpc-network-chart .tier-item.router .dashboard-item {
-  width: 100px;
-  /*[empty]margin:;*/
-  padding: 0px 2px 0px 6px;
-  height: 73px;
-  background: #A7A7A7;
-}
-
-.vpc-network-chart .tier-item.router .dashboard-item span {
-  padding-right: 10px;
-  color: #FFFFFF;
-  /*+text-shadow:0px 1px #000000;*/
-  -moz-text-shadow: 0px 1px #000000;
-  -webkit-text-shadow: 0px 1px #000000;
-  -o-text-shadow: 0px 1px #000000;
-  text-shadow: 0px 1px #000000;
-}
-
-.vpc-network-chart .tier-item.router .dashboard-item:hover {
-  background-color: #818181;
-}
-
-.vpc-network-chart .connector-line {
-}
-
-.vpc-network-chart .connector-line .connector-start,
-.vpc-network-chart .connector-line .connector-mid,
-.vpc-network-chart .connector-line .connector-end {
-  position: absolute;
-  top: 0px;
-  left: 0px;
-  background: #CCCCCC;
-}
-
-.vpc-network-chart .connector-line.highlighted .connector-start,
-.vpc-network-chart .connector-line.highlighted .connector-mid,
-.vpc-network-chart .connector-line.highlighted .connector-end {
-  background: #2983E3;
-}
-
-.vpc-network-chart .connector-line .connector-start,
-.vpc-network-chart .connector-line .connector-end {
-  height: 3px;
-}
-
-.vpc-network-chart .connector-line .connector-start {
-  width: 50px;
-  margin-left: 18px;
-}
-
-.vpc-network-chart .connector-line .connector-mid {
-  width: 3px;
-}
-
-.vpc-network-chart .connector-line .connector-end {
-}
-
diff --git a/ui/legacy/modules/vpc/vpc.js b/ui/legacy/modules/vpc/vpc.js
deleted file mode 100644
index ceeea3e..0000000
--- a/ui/legacy/modules/vpc/vpc.js
+++ /dev/null
@@ -1,427 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-  var addTierDialog = function(args) {
-    var $placeholder = args.$placeholder;
-    var context = args.context;
-    var addAction = cloudStack.vpc.tiers.actions.add;
-
-    cloudStack.dialog.createForm({
-      context: context,
-      form: addAction.createForm,
-      after: function(args) {
-        var $loading = $('<div>').addClass('loading-overlay')
-          .prependTo($placeholder);
-
-        addAction.action({
-          context: context,
-          data: args.data,
-          $form: args.$form,
-          response: {
-            success: function(args) {
-              cloudStack.ui.notifications.add(
-                // Notification
-                {
-                  desc: addAction.label
-                },
-
-                // Success
-                function(args) {
-                  $loading.remove();
-                  $placeholder.closest('.vpc-network-chart').trigger('reload');
-                },
-
-                {},
-
-                // Error
-                function(args) {
-                  $loading.remove();
-                }
-              );
-            },
-            error: function(errorMsg) {
-              cloudStack.dialog.notice({ message: _s(errorMsg) });
-              $loading.remove();
-            }
-          }
-        });
-      }
-    });
-  };
-
-  var elems = {
-    tier: function(args) {
-      var tier = args.tier;
-      var context = $.extend(true, {}, args.context, {
-        networks: [tier]
-      });
-      var dashboardItems = args.dashboardItems;
-      var $tier = $('<div>').addClass('tier-item');
-      var $header = $('<div>').addClass('header');
-      var $title = $('<div>').addClass('title').append($('<span>'));
-      var $content = $('<div>').addClass('content');
-      var $browser = $('#browser .container');
-      var $dashboard = elems.dashboard({
-        context: context,
-        dashboardItems: dashboardItems
-      });
-      var $detailLink = $('<div>').addClass('detail-link');
-      var $info = $('<div>').addClass('info');
-      var $cidrLabel = $('<span>').addClass('cidr-label');
-      var $cidr = $('<span>').addClass('cidr');
-
-      $detailLink.click(function() {
-        $browser.cloudBrowser('addPanel', {
-          title: tier.displayname ? tier.displayname : tier.name,
-          complete: function($panel) {
-            var $detailView = $('<div>').detailView(
-              $.extend(true, {}, cloudStack.vpc.tiers.detailView, {
-                section: 'networks',
-                $browser: $browser,
-                context: context,
-                onActionComplete: function() {
-                  $tier.closest('.vpc-network-chart').trigger('reload');
-                }
-              })
-            );
-
-            $detailView.appendTo($panel);
-          }
-        });
-      });
-
-      $cidrLabel.html('CIDR: ');
-      $cidr.html(tier.cidr);
-      $title.find('span').html(tier.displayname ? tier.displayname : tier.name);
-      $header.append($title, $detailLink);
-      $info.append($cidrLabel, $cidr);
-      $content.append($dashboard, $info);
-      $tier.append($header, $content);
-
-      return $tier;
-    },
-
-    connectorLine: function(args) {
-      var $connector = $('<div></div>').addClass('connector-line');
-      var $router = args.$router;
-      var $tier = args.$tier;
-      var isHighlighted = args.isHighlighted;
-      var $connectorStart = $('<div></div>').addClass('connector-start');
-      var $connectorMid = $('<div></div>').addClass('connector-mid');
-      var $connectorEnd = $('<div></div>').addClass('connector-end');
-
-      $connector.append($connectorStart, $connectorMid, $connectorEnd);
-
-      if (isHighlighted) {
-        $connector.addClass('highlighted');
-      }
-
-      var posStartOffsetLeft = 5;
-      var posStartOffsetTop = 10;
-      var posStart = {
-        top: $router.position().top + ($router.outerHeight() / 2 + ($tier.index() * posStartOffsetTop)),
-        left: $router.position().left + $router.outerWidth()
-      };
-      var posStartWidth = 60 - ($tier.index() > 2 ? (($tier.index() + 1) * posStartOffsetLeft) : 0);
-
-      var posEndOffset = 15;
-      var posEndWidthOffset = 3;
-      var posEnd = {
-        top: $tier.position().top + ($tier.outerHeight() / 2),
-        left: posStart.left + posStartWidth + posEndOffset
-      };
-      var posEndWidth = Math.abs($tier.position().left -
-                                 (posStart.left + posStartWidth)) + posEndWidthOffset;
-
-      // Start line (next to router)
-      $connectorStart.css({
-        top: posStart.top,
-        left: posStart.left
-      });
-      $connectorStart.width(posStartWidth);
-
-      // End line (next to tier)
-      $connectorEnd.css({
-        top: posEnd.top,
-        left: posEnd.left
-      });
-      $connectorEnd.width(posEndWidth);
-
-      // Mid line (connect start->end)
-      if (posStart.top > posEnd.top) { // Tier above router
-        $connectorMid.css({
-          top: posEnd.top,
-          left: posEnd.left
-        });
-        $connectorMid.height(posStart.top - posEnd.top);
-      } else { // Tier below router
-        $connectorMid.css({
-          top: posStart.top,
-          left: posStart.left + posStartWidth + posEndOffset
-        });
-        $connectorMid.height(posEnd.top - posStart.top);
-      }
-
-      return $connector;
-    },
-
-    router: function(args) {
-      var $router = elems.tier({
-        context: args.context,
-        tier: {
-          name: 'Router'
-        },
-        dashboardItems: args.dashboardItems
-      }).addClass('router');
-
-      $router.find('.info, .detail-link').remove();
-      $router.find('.header').prepend($('<span></span>').addClass('icon').html('&nbsp;'));
-
-      return $router;
-    },
-
-    tierPlaceholder: function(args) {
-      var context = args.context;
-      var $placeholder = $('<div>').addClass('tier-placeholder');
-
-      $placeholder.append($('<span>').append('Create network'));
-      $placeholder.click(function() {
-        addTierDialog({
-          context: context,
-          $placeholder: $placeholder
-        });
-      });
-
-      return $placeholder;
-    },
-
-    dashboard: function(args) {
-      var $dashboard = $('<div>').addClass('dashboard');
-      var context = args.context;
-      var tier = context.networks[0];
-
-      $(args.dashboardItems).map(function(index, dashboardItem) {
-        var $dashboardItem = $('<div>').addClass('dashboard-item');
-        var $name = $('<div>').addClass('name').append($('<span>'));
-        var $total = $('<div>').addClass('total').append($('<span>'));
-        var id = dashboardItem.id;
-
-        $name.find('span').html(dashboardItem.name);
-
-
-        if (dashboardItem.totalMultiLine) {
-          $total.find('span').html(dashboardItem.totalMultiLine);
-          $total.addClass('multiline');
-        } else {
-          $total.find('span').html(dashboardItem.total ? dashboardItem.total : 0);
-        }
-
-        $dashboardItem.append($total, $name);
-        $dashboardItem.appendTo($dashboard);
-
-        if (dashboardItem._disabled) {
-          $dashboardItem.addClass('disabled');
-        }
-
-        $dashboardItem.click(function() {
-          if ($dashboardItem.is('.disabled')) {
-            return false;
-          }
-          
-          var section = cloudStack.vpc.sections[id];
-          var $section = $('<div>');
-          var $loading = $('<div>').addClass('loading-overlay');
-
-          if ($.isFunction(section)) {
-            section = cloudStack.vpc.sections[id]();
-          }
-
-          var before = section.before;
-          var load = function() {
-            $('#browser .container').cloudBrowser('addPanel', {
-              title: tier.name + ' - ' + dashboardItem.name,
-              maximizeIfSelected: true,
-              complete: function($panel) {
-                if (section.listView) {
-                  $section.listView($.extend(true, {}, section, {
-                    onActionComplete: function() {
-                      $dashboardItem.closest('.vpc-network-chart').trigger('reload');
-                    },
-                    context: context
-                  }));
-                }
-
-                $section.appendTo($panel);
-              }
-            });
-          };
-
-          if (before) {
-            before.check({
-              context: context,
-              response: {
-                success: function(result) {
-                  // true means content exists
-                  if (result) {
-                    load();
-                  } else {
-                    cloudStack.dialog.confirm({
-                      message: before.messages.confirm,
-                      action: function() {
-                        $loading.appendTo($dashboardItem.closest('.vpc-network-chart'));
-                        before.action({
-                          context: context,
-                          response: {
-                            success: function() {
-                              $loading.remove();
-                              $dashboardItem.closest('.vpc-network-chart').trigger('reload');
-                              load();
-                            }
-                          }
-                        });
-                      }
-                    })
-                  }
-                }
-              }
-            });
-          } else {
-            load();
-          }
-        });
-      });
-
-      return $dashboard;
-    }
-  };
-
-  cloudStack.modules.vpc = function(module) {
-    var vpc = cloudStack.vpc;
-    var vpcSection = cloudStack.sections.network.sections.vpc;
-    var listConfigureAction = vpcSection.listView.actions.configureVpc.action;
-    var detailsConfigureAction = vpcSection.listView.detailView.actions.configureVpc.action;
-
-    var vpcChart = function(args) {
-      var context = args.context;
-      var vpcItem = context.vpc[0];
-
-      var chart = function(args) {
-        args = args ? args : {};
-
-        var $chart = $('<div>').addClass('vpc-network-chart');
-        var $tiers = $('<div>').addClass('tiers');
-        var $toolbar = $('<div>').addClass('toolbar');
-        var $info = $('<div>').addClass('info-box');
-
-        $toolbar.appendTo($chart);
-        $tiers.appendTo($chart);
-
-        // Get tiers
-        var $loading = $('<div>').addClass('loading-overlay').prependTo($chart);
-        vpc.tiers.dataProvider({
-          context: context,
-          response: {
-            success: function(data) {
-              var tiers = data.tiers;
-              var $router;
-              var $placeholder = elems.tierPlaceholder({
-                context: context
-              });
-
-              // Router
-              $router = elems.router({
-                context: context,
-                dashboardItems: data.routerDashboard
-              }).appendTo($chart);
-
-              $(tiers).map(function(index, tier) {
-                var $tier = elems.tier({
-                  context: context,
-                  tier: tier,
-                  dashboardItems: tier._dashboardItems
-                });
-                $tier.appendTo($tiers);
-
-                // Connect tier to router via line
-                //
-                // -- Needs to execute after chart generation is complete,
-                //    so that chart elements have positioning in place.
-                $chart.bind('cloudStack.vpc.chartReady', function() {
-                  elems.connectorLine({
-                    $tier: $tier,
-                    $router: $router,
-                    isHighlighted: tier._highlighted
-                  }).appendTo($chart);
-                });
-              });
-
-              // Add placeholder tier
-              $tiers.append($placeholder);
-              $loading.remove();
-
-              if (!tiers.length) {
-                addTierDialog({
-                  context: context,
-                  $placeholder: $placeholder
-                });
-              }
-
-              if (args.complete) {
-                args.complete($chart);
-              }
-
-              if ($chart.find('.connector-line.highlighted').length) {
-                $info.appendTo($chart).append(
-                  $('<span>').addClass('color-key'),
-                  $('<span>').html('= Contains a public network')
-                );
-              }
-            }
-          }
-        });
-
-        $chart.bind('reload', function() {
-          chart({
-            complete: function($newChart) {
-              $chart.replaceWith($newChart);
-              $newChart.trigger('cloudStack.vpc.chartReady');
-            }
-          });
-        });
-
-        return $chart;
-      };
-
-      $('#browser .container').cloudBrowser('addPanel', {
-        title: vpcItem.displaytext ? vpcItem.displaytext : vpcItem.name,
-        maximizeIfSelected: true,
-        complete: function($panel) {
-          var $chart = chart({
-            complete: function($chart) {
-              $chart.trigger('cloudStack.vpc.chartReady');
-            }
-          });
-
-          $chart.appendTo($panel);
-        }
-      });
-    };
-
-    listConfigureAction.custom = vpcChart;
-    detailsConfigureAction.custom = vpcChart;
-  };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/plugins/cks/cks.css b/ui/legacy/plugins/cks/cks.css
deleted file mode 100644
index acdd1e6..0000000
--- a/ui/legacy/plugins/cks/cks.css
+++ /dev/null
@@ -1,43 +0,0 @@
-/*[fmt]1C20-1C0D-E*/
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-.downloadKubernetesClusterKubeConfig .icon {
-  background-position: -35px -125px;
-}
-
-.downloadKubernetesClusterKubeConfig:hover .icon {
-  background-position: -35px -707px;
-}
-
-.scaleKubernetesCluster .icon {
-  background-position: -264px -2px;
-}
-
-.scaleKubernetesCluster:hover .icon {
-  background-position: -263px -583px;
-}
-
-.upgradeKubernetesCluster .icon {
-  background-position: -138px -65px;
-}
-
-.upgradeKubernetesCluster:hover .icon {
-  background-position: -138px -647px;
-}
diff --git a/ui/legacy/plugins/cks/cks.js b/ui/legacy/plugins/cks/cks.js
deleted file mode 100644
index c353c24..0000000
--- a/ui/legacy/plugins/cks/cks.js
+++ /dev/null
@@ -1,1581 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function (cloudStack) {
-
-    var rootCaCert = "";
-    var downloadCaCert = function() {
-        var blob = new Blob([rootCaCert], {type: 'application/x-x509-ca-cert'});
-        var filename = "cloudstack-ca.pem";
-        if(window.navigator.msSaveOrOpenBlob) {
-            window.navigator.msSaveBlob(blob, filename);
-        } else{
-            var elem = window.document.createElement('a');
-            elem.href = window.URL.createObjectURL(blob);
-            elem.download = filename;
-            document.body.appendChild(elem)
-            elem.click();
-            document.body.removeChild(elem);
-        }
-    };
-    var clusterKubeConfig = "";
-    var downloadClusterKubeConfig = function() {
-        var blob = new Blob([clusterKubeConfig], {type: 'text/plain'});
-        var filename = "kube.conf";
-        if(window.navigator.msSaveOrOpenBlob) {
-            window.navigator.msSaveBlob(blob, filename);
-        } else{
-            var elem = window.document.createElement('a');
-            elem.href = window.URL.createObjectURL(blob);
-            elem.download = filename;
-            document.body.appendChild(elem)
-            elem.click();
-            document.body.removeChild(elem);
-        }
-    };
-    var minCpu = 0;
-    var minRamSize = 0;
-    cloudStack.plugins.cks = function(plugin) {
-        plugin.ui.addSection({
-            id: 'cks',
-            title: 'label.kubernetes.service',
-            preFilter: function(args) {
-                var pluginEnabled = false;
-                $.ajax({
-                    url: createURL('listCapabilities'),
-                    async: false,
-                    success: function(json) {
-                        pluginEnabled = json.listcapabilitiesresponse.capability.kubernetesserviceenabled;
-                    },
-                    error: function(XMLHttpResponse) {
-                        pluginEnabled = false;
-                    }
-                });
-                return pluginEnabled;
-            },
-            showOnNavigation: true,
-            sectionSelect: {
-                label: 'label.select-view',
-                preFilter: function() {
-                    return ['kubernetesclusters', 'kubernetesversions'];
-                }
-            },
-            sections: {
-                kubernetesclusters: {
-                    id: 'kubernetesclusters',
-                    type: 'select',
-                    title: "label.clusters",
-                    listView: {
-                        filters: {
-                            all: {
-                                label: 'ui.listView.filters.all'
-                            },
-                            running: {
-                                label: 'state.Running'
-                            },
-                            stopped: {
-                                label: 'state.Stopped'
-                            },
-                            destroyed: {
-                                label: 'state.Destroyed'
-                            }
-                        },
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            zonename: {
-                                label: 'label.zone.name'
-                            },
-                            size : {
-                                label: 'label.size'
-                            },
-                            cpunumber: {
-                                label: 'label.num.cpu.cores'
-                            },
-                            memory: {
-                                label: 'label.memory.mb'
-                            },
-                            state: {
-                                label: 'label.state',
-                                indicator: {
-                                    'Running': 'on',
-                                    'Stopped': 'off',
-                                    'Destroyed': 'off',
-                                    'Error': 'off'
-                                }
-                            }
-                        },
-                        advSearchFields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            zoneid: {
-                                label: 'label.zone',
-                                select: function(args) {
-                                    $.ajax({
-                                        url: createURL('listZones'),
-                                        data: {
-                                            listAll: true
-                                        },
-                                        success: function(json) {
-                                            var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                            args.response.success({
-                                                data: $.map(zones, function(zone) {
-                                                    return {
-                                                        id: zone.id,
-                                                        description: zone.name
-                                                    };
-                                                })
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-                        },
-                        // List view actions
-                        actions: {
-                            add: {
-                                label: 'label.add.kubernetes.cluster',
-                                createForm: {
-                                    title: 'label.add.kubernetes.cluster',
-                                    preFilter: function(args) {
-                                        args.$form.find('.form-item[rel=masternodes]').find('input[name=masternodes]').val('2');
-                                        args.$form.find('.form-item[rel=size]').find('input[name=size]').val('1');
-                                        var experimentalFeaturesEnabled = false;
-                                        $.ajax({
-                                            url: createURL('listCapabilities'),
-                                            async: false,
-                                            success: function(json) {
-                                                experimentalFeaturesEnabled = json.listcapabilitiesresponse.capability.kubernetesclusterexperimentalfeaturesenabled;
-                                            }
-                                        });
-                                        if (experimentalFeaturesEnabled == true) {
-                                            args.$form.find('.form-item[rel=supportPrivateRegistry]').css('display', 'inline-block');
-                                        }
-                                    },
-                                    fields: {
-                                        name: {
-                                            label: 'label.name',
-                                            //docID: 'Name of the cluster',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        description: {
-                                            label: 'label.description',
-                                            //docID: 'helpKubernetesClusterDesc',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        zone: {
-                                            label: 'label.zone',
-                                            //docID: 'helpKubernetesClusterZone',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listZones&available=true"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var zoneObjs = json.listzonesresponse.zone;
-                                                        if (zoneObjs != null) {
-                                                            for (var i = 0; i < zoneObjs.length; i++) {
-                                                                items.push({
-                                                                    id: zoneObjs[i].id,
-                                                                    description: zoneObjs[i].name
-                                                                });
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        kubernetesversion: {
-                                            label: 'label.kubernetes.version',
-                                            dependsOn: ['zone'],
-                                            //docID: 'helpKubernetesClusterZone',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                var versionObjs;
-                                                var filterData = { zoneid: args.zone };
-                                                $.ajax({
-                                                    url: createURL("listKubernetesSupportedVersions"),
-                                                    data: filterData,
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion;
-                                                        if (versionObjs != null) {
-                                                            for (var i = 0; i < versionObjs.length; i++) {
-                                                                if (versionObjs[i].state == 'Enabled' && versionObjs[i].isostate == 'Ready') {
-                                                                    items.push({
-                                                                        id: versionObjs[i].id,
-                                                                        description: versionObjs[i].name
-                                                                    });
-                                                                }
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-
-                                                args.$select.change(function() {
-                                                    var $form = $(this).closest("form");
-                                                    $form.find('.form-item[rel=multimaster]').find('input[name=multimaster]').prop('checked', false);
-                                                    $form.find('.form-item[rel=multimaster]').hide();
-                                                    $form.find('.form-item[rel=masternodes]').hide();
-                                                    var currentVersionId = $(this).val();
-                                                    if (currentVersionId != null  && versionObjs != null) {
-                                                        for (var i = 0; i < versionObjs.length; i++) {
-                                                            if (currentVersionId == versionObjs[i].id) {
-                                                                if (versionObjs[i].supportsha === true) {
-                                                                    $form.find('.form-item[rel=multimaster]').css('display', 'inline-block');
-                                                                }
-                                                                minCpu = 0;
-                                                                if (versionObjs[i].mincpunumber != null && versionObjs[i].mincpunumber != undefined) {
-                                                                    minCpu = versionObjs[i].mincpunumber;
-                                                                }
-                                                                minRamSize = 0;
-                                                                if (versionObjs[i].minmemory != null && versionObjs[i].minmemory != undefined) {
-                                                                    minRamSize = versionObjs[i].minmemory;
-                                                                }
-                                                                break;
-                                                            }
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        serviceoffering: {
-                                            label: 'label.menu.service.offerings',
-                                            dependsOn: ['kubernetesversion'],
-                                            //docID: 'helpKubernetesClusterServiceOffering',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listServiceOfferings"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var offeringObjs = [];
-                                                        var items = json.listserviceofferingsresponse.serviceoffering;
-                                                        if (items != null) {
-                                                            for (var i = 0; i < items.length; i++) {
-                                                                if (items[i].iscustomized == false &&
-                                                                    items[i].cpunumber >= minCpu && items[i].memory >= minRamSize) {
-                                                                    offeringObjs.push({
-                                                                        id: items[i].id,
-                                                                        description: items[i].name
-                                                                    });
-                                                                }
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: offeringObjs
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        noderootdisksize: {
-                                            label: 'label.node.root.disk.size.gb',
-                                            //docID: 'helpKubernetesClusterNodeRootDiskSize',
-                                            validation: {
-                                                number: true
-                                            }
-                                        },
-                                        network: {
-                                            label: 'label.network',
-                                            //docID: 'helpKubernetesClusterNetwork',
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listNetworks"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var networkObjs = [];
-                                                        networkObjs.push({
-                                                            id: "",
-                                                            description: ""
-                                                        });
-                                                        var items = json.listnetworksresponse.network;
-                                                        if (items != null) {
-                                                            for (var i = 0; i < items.length; i++) {
-                                                                networkObjs.push({
-                                                                    id: items[i].id,
-                                                                    description: items[i].name
-                                                                });
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: networkObjs
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        multimaster: {
-                                            label: "label.ha.enabled",
-                                            dependsOn: 'kubernetesversion',
-                                            isBoolean: true,
-                                            isChecked: false,
-                                        },
-                                        masternodes: {
-                                            label: 'label.master.nodes',
-                                            //docID: 'helpKubernetesClusterSize',
-                                            validation: {
-                                                required: true,
-                                                multiplecountnumber: true
-                                            },
-                                            dependsOn: "multimaster",
-                                            isHidden: true,
-                                        },
-                                        externalloadbalanceripaddress: {
-                                            label: 'label.external.loadbalancer.ip.address',
-                                            validation: {
-                                                ipv4AndIpv6AddressValidator: true
-                                            },
-                                            dependsOn: "multimaster",
-                                            isHidden: true,
-                                        },
-                                        size: {
-                                            label: 'label.cluster.size.worker.nodes',
-                                            //docID: 'helpKubernetesClusterSize',
-                                            validation: {
-                                                required: true,
-                                                naturalnumber: true
-                                            },
-                                        },
-                                        sshkeypair: {
-                                            label: 'label.ssh.key.pair',
-                                            //docID: 'helpKubernetesClusterSSH',
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listSSHKeyPairs"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var keypairObjs = [];
-                                                        keypairObjs.push({
-                                                            id: "",
-                                                            description: ""
-                                                        });
-                                                        var items = json.listsshkeypairsresponse.sshkeypair;
-                                                        if (items != null) {
-                                                            for (var i = 0; i < items.length; i++) {
-                                                                keypairObjs.push({
-                                                                    id: items[i].name,
-                                                                    description: items[i].name
-                                                                });
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: keypairObjs
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        supportPrivateRegistry: {
-                                            label: 'label.private.registry',
-                                            isBoolean: true,
-                                            isChecked: false,
-                                            isHidden: true
-                                        },
-                                        username: {
-                                            label: 'label.username',
-                                            dependsOn: 'supportPrivateRegistry',
-                                            validation: {
-                                                required: true
-                                            },
-                                            isHidden: true
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            dependsOn: 'supportPrivateRegistry',
-                                            validation: {
-                                                required: true
-                                            },
-                                            isHidden: true,
-                                            isPassword: true
-                                        },
-                                        url: {
-                                            label: 'label.url',
-                                            dependsOn: 'supportPrivateRegistry',
-                                            validation: {
-                                                required: true
-                                            },
-                                            isHidden: true,
-                                        },
-                                        email: {
-                                            label: 'label.email',
-                                            dependsOn: 'supportPrivateRegistry',
-                                            validation: {
-                                                required: true
-                                            },
-                                            isHidden: true,
-                                        }
-                                    }
-                                },
-
-                                action: function(args) {
-                                    var data = {
-                                        name: args.data.name,
-                                        description: args.data.description,
-                                        zoneid: args.data.zone,
-                                        kubernetesversionid: args.data.kubernetesversion,
-                                        serviceofferingid: args.data.serviceoffering,
-                                        size: args.data.size,
-                                        keypair: args.data.sshkeypair
-                                    };
-
-                                    if (args.data.noderootdisksize != null && args.data.noderootdisksize != "" && args.data.noderootdisksize > 0) {
-                                        $.extend(data, {
-                                            noderootdisksize: args.data.noderootdisksize
-                                        });
-                                    }
-
-                                    var masterNodes = 1;
-                                    if (args.data.multimaster === 'on') {
-                                        masterNodes = args.data.masternodes;
-                                        if (args.data.externalloadbalanceripaddress != null && args.data.externalloadbalanceripaddress != "") {
-                                            $.extend(data, {
-                                                externalloadbalanceripaddress: args.data.externalloadbalanceripaddress
-                                            });
-                                        }
-                                    }
-                                    $.extend(data, {
-                                        masternodes: masterNodes
-                                    });
-
-                                    if (args.data.supportPrivateRegistry) {
-                                        $.extend(data, {
-                                            dockerregistryusername: args.data.username,
-                                            dockerregistrypassword: args.data.password,
-                                            dockerregistryurl: args.data.url,
-                                            dockerregistryemail: args.data.email
-                                        });
-                                    }
-
-                                    if (args.data.network != null && args.data.network.length > 0) {
-                                        $.extend(data, {
-                                            networkid: args.data.network
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('createKubernetesCluster'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.createkubernetesclusterresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            args.response.error(errorMsg);
-                                        }
-                                    });
-                                },
-
-
-                                messages: {
-                                    notification: function(args) {
-                                        return 'Kubernetes Cluster Add';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        dataProvider: function(args) {
-                            var data = {
-                                    page: args.page,
-                                    pagesize: pageSize
-                                };
-                            listViewDataProvider(args, data);
-                            if (args.filterBy != null) { //filter dropdown
-                                if (args.filterBy.kind != null) {
-                                    switch (args.filterBy.kind) {
-                                        case "all":
-                                        break;
-                                        case "running":
-                                        $.extend(data, {
-                                            state: 'Running'
-                                        });
-                                        break;
-                                        case "stopped":
-                                        $.extend(data, {
-                                            state: 'Stopped'
-                                        });
-                                        break;
-                                        case "destroyed":
-                                        $.extend(data, {
-                                            state: 'Destroyed'
-                                        });
-                                        break;
-                                    }
-                                }
-                            }
-
-                            $.ajax({
-                                url: createURL("listKubernetesClusters"),
-                                data: data,
-                                dataType: "json",
-                                sync: true,
-                                success: function(json) {
-                                    var items = [];
-                                    if (json.listkubernetesclustersresponse.kubernetescluster != null) {
-                                        items = json.listkubernetesclustersresponse.kubernetescluster;
-                                    }
-                                    args.response.success({
-                                        actionFilter: cksActionfilter,
-                                        data: items
-                                    });
-                                }
-                            });
-                        },
-
-                        detailView: {
-                            name: 'label.kubernetes.cluster.details',
-                            isMaximized: true,
-                            actions: {
-                                start: {
-                                    label: 'label.start.kuberentes.cluster',
-                                    action: function(args) {
-                                        $.ajax({
-                                            url: createURL("startKubernetesCluster"),
-                                            data: {"id": args.context.kubernetesclusters[0].id},
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var jid = json.startkubernetesclusterresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.confirm.start.kubernetes.cluster';
-                                        },
-                                        notification: function(args) {
-                                            return 'Started Kubernetes cluster.';
-                                        }
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                },
-                                stop: {
-                                    label: 'label.stop.kuberentes.cluster',
-                                    action: function(args) {
-                                        $.ajax({
-                                            url: createURL("stopKubernetesCluster"),
-                                            data: {"id": args.context.kubernetesclusters[0].id},
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var jid = json.stopkubernetesclusterresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.confirm.stop.kubernetes.cluster';
-                                        },
-                                        notification: function(args) {
-                                            return 'Stopped Kubernetes cluster.';
-                                        }
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                },
-                                destroy: {
-                                    label: 'label.destroy.kubernetes.cluster',
-                                    compactLabel: 'label.destroy',
-                                    createForm: {
-                                        title: 'label.destroy.kubernetes.cluster',
-                                        desc: 'label.destroy.kubernetes.cluster',
-                                        isWarning: true,
-                                        fields: {
-                                        }
-                                    },
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.confirm.destroy.kubernetes.cluster';
-                                        },
-                                        notification: function(args) {
-                                            return 'Destroyed Kubernetes cluster.';
-                                        }
-                                    },
-                                    action: function(args) {
-                                        var data = {
-                                            id: args.context.kubernetesclusters[0].id
-                                        };
-                                        $.ajax({
-                                            url: createURL('deleteKubernetesCluster'),
-                                            data: data,
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: json.deletekubernetesclusterresponse.jobid,
-                                                        getUpdatedItem: function(json) {
-                                                            return { 'toRemove': true };
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                },
-                                downloadKubernetesClusterKubeConfig: {
-                                    label: 'label.download.kubernetes.cluster.config',
-                                    messages: {
-                                        notification: function(args) {
-                                            return 'label.download.kubernetes.cluster.config';
-                                        }
-                                    },
-                                    action: function(args) {
-                                        var data = {
-                                            id: args.context.kubernetesclusters[0].id
-                                        }
-                                        $.ajax({
-                                            url: createURL("getKubernetesClusterConfig"),
-                                            dataType: "json",
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                var jsonObj;
-                                                if (json.getkubernetesclusterconfigresponse.clusterconfig != null &&
-                                                    json.getkubernetesclusterconfigresponse.clusterconfig.configdata != null ) {
-                                                    jsonObj = json.getkubernetesclusterconfigresponse.clusterconfig;
-                                                    clusterKubeConfig = jsonObj.configdata;
-                                                    downloadClusterKubeConfig();
-                                                    args.response.success({});
-                                                } else {
-                                                    args.response.error("Unable to retrieve Kubernetes cluster config");
-                                                }
-                                            },
-                                            error: function(XMLHttpResponse) {
-                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                args.response.error(errorMsg);
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: function(args) {
-                                            args.complete();
-                                        }
-                                    }
-                                },
-                                scaleKubernetesCluster: {
-                                    label: 'label.scale.kubernetes.cluster',
-                                    messages: {
-                                        notification: function(args) {
-                                            return 'label.scale.kubernetes.cluster';
-                                        }
-                                    },
-                                    createForm: {
-                                        title: 'label.scale.kubernetes.cluster',
-                                        desc: '',
-                                        preFilter: function(args) {
-                                            var options = args.$form.find('.form-item[rel=serviceoffering]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                if ($(option).val() === args.context.kubernetesclusters[0].serviceofferingid) {
-                                                    $(option).attr('selected','selected');
-                                                }
-                                            });
-                                            args.$form.find('.form-item[rel=size]').find('input[name=size]').val(args.context.kubernetesclusters[0].size);
-                                        },
-                                        fields: {
-                                            serviceoffering: {
-                                                label: 'label.menu.service.offerings',
-                                                //docID: 'helpKubernetesClusterServiceOffering',
-                                                validation: {
-                                                    required: true
-                                                },
-                                                select: function(args) {
-                                                    $.ajax({
-                                                        url: createURL("listKubernetesSupportedVersions"),
-                                                        data: {id: args.context.kubernetesclusters[0].kubernetesversionid},
-                                                        dataType: "json",
-                                                        async: false,
-                                                        success: function(json) {
-                                                            var versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion;
-                                                            if (versionObjs != null && versionObjs.length > 0) {
-                                                                minCpu = 0;
-                                                                if (versionObjs[0].mincpunumber != null && versionObjs[0].mincpunumber != undefined) {
-                                                                    minCpu = versionObjs[0].mincpunumber;
-                                                                }
-                                                                minRamSize = 0;
-                                                                if (versionObjs[0].minmemory != null && versionObjs[0].minmemory != undefined) {
-                                                                    minRamSize = versionObjs[0].minmemory;
-                                                                }
-                                                            }
-                                                        }
-                                                    });
-                                                    $.ajax({
-                                                        url: createURL("listServiceOfferings"),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function(json) {
-                                                            var offeringObjs = [];
-                                                            var items = json.listserviceofferingsresponse.serviceoffering;
-                                                            if (items != null) {
-                                                                for (var i = 0; i < items.length; i++) {
-                                                                    if (items[i].iscustomized == false &&
-                                                                        items[i].cpunumber >= minCpu && items[i].memory >= minRamSize) {
-                                                                        offeringObjs.push({
-                                                                            id: items[i].id,
-                                                                            description: items[i].name
-                                                                        });
-                                                                    }
-                                                                }
-                                                            }
-                                                            args.response.success({
-                                                                data: offeringObjs
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            size: {
-                                                label: 'label.cluster.size',
-                                                //docID: 'helpKubernetesClusterSize',
-                                                validation: {
-                                                    required: true,
-                                                    number: true
-                                                },
-                                            }
-                                        }
-                                    },
-                                    action: function(args) {
-                                        var data = {
-                                            id: args.context.kubernetesclusters[0].id,
-                                            serviceofferingid: args.data.serviceoffering,
-                                            size: args.data.size
-                                        };
-                                        $.ajax({
-                                            url: createURL('scaleKubernetesCluster'),
-                                            data: data,
-                                            dataType: "json",
-                                            success: function (json) {
-                                                var jid = json.scalekubernetesclusterresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid,
-                                                        getActionFilter: function() {
-                                                            return cksActionfilter;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        }); //end ajax
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                },
-                                upgradeKubernetesCluster: {
-                                    label: 'label.upgrade.kubernetes.cluster',
-                                    messages: {
-                                        notification: function(args) {
-                                            return 'label.upgrade.kubernetes.cluster';
-                                        }
-                                    },
-                                    createForm: {
-                                        title: 'label.upgrade.kubernetes.cluster',
-                                        desc: '',
-                                        preFilter: function(args) {},
-                                        fields: {
-                                            kubernetesversion: {
-                                                label: 'label.kubernetes.version',
-                                                //docID: 'helpKubernetesClusterZone',
-                                                validation: {
-                                                    required: true
-                                                },
-                                                select: function(args) {
-                                                    var filterData = { minimumkubernetesversionid: args.context.kubernetesclusters[0].kubernetesversionid };
-                                                    $.ajax({
-                                                        url: createURL("listKubernetesSupportedVersions"),
-                                                        data: filterData,
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function(json) {
-                                                            var items = [];
-                                                            var versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion;
-                                                            if (versionObjs != null) {
-                                                                var clusterVersion = null;
-                                                                for (var j = 0; j < versionObjs.length; j++) {
-                                                                    if (versionObjs[j].id == args.context.kubernetesclusters[0].kubernetesversionid) {
-                                                                        clusterVersion = versionObjs[j];
-                                                                        break;
-                                                                    }
-                                                                }
-                                                                for (var i = 0; i < versionObjs.length; i++) {
-                                                                    if (versionObjs[i].id != args.context.kubernetesclusters[0].kubernetesversionid &&
-                                                                        (clusterVersion == null || (clusterVersion != null && versionObjs[i].semanticversion != clusterVersion.semanticversion)) &&
-                                                                        versionObjs[i].state == 'Enabled' && versionObjs[i].isostate == 'Ready') {
-                                                                        items.push({
-                                                                            id: versionObjs[i].id,
-                                                                            description: versionObjs[i].name
-                                                                        });
-                                                                    }
-                                                                }
-                                                            }
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                        }
-                                    },
-                                    action: function(args) {
-                                        var data = {
-                                            id: args.context.kubernetesclusters[0].id,
-                                            kubernetesversionid: args.data.kubernetesversion
-                                        };
-                                        $.ajax({
-                                            url: createURL('upgradeKubernetesCluster'),
-                                            data: data,
-                                            dataType: "json",
-                                            success: function (json) {
-                                                var jid = json.upgradekubernetesclusterresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid,
-                                                        getActionFilter: function() {
-                                                            return cksActionfilter;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        }); //end ajax
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                },
-                            },
-                            tabs: {
-                                // Details tab
-                                details: {
-                                    title: 'label.details',
-                                    fields: [{
-                                        id: {
-                                            label: 'label.id'
-                                        },
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        zonename: {
-                                            label: 'label.zone.name'
-                                        },
-                                        kubernetesversionname: {
-                                            label: 'label.kubernetes.version'
-                                        },
-                                        masternodes : {
-                                            label: 'label.master.nodes'
-                                        },
-                                        size : {
-                                            label: 'label.cluster.size'
-                                        },
-                                        cpunumber: {
-                                            label: 'label.num.cpu.cores'
-                                        },
-                                        memory: {
-                                            label: 'label.memory.mb'
-                                        },
-                                        state: {
-                                            label: 'label.state',
-                                        },
-                                        serviceofferingname: {
-                                            label: 'label.compute.offering'
-                                        },
-                                        associatednetworkname: {
-                                            label: 'label.network'
-                                        },
-                                        keypair: {
-                                            label: 'label.ssh.key.pair'
-                                        }
-                                    }],
-
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL("listKubernetesClusters&id=" + args.context.kubernetesclusters[0].id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var jsonObj;
-                                                if (json.listkubernetesclustersresponse.kubernetescluster != null && json.listkubernetesclustersresponse.kubernetescluster.length > 0) {
-                                                    jsonObj = json.listkubernetesclustersresponse.kubernetescluster[0];
-                                                }
-                                                args.response.success({
-                                                    actionFilter: cksActionfilter,
-                                                    data: jsonObj
-                                                });
-                                            }
-                                        });
-                                    }
-                                },
-                                clusteraccess: {
-                                    title: 'label.access',
-                                    custom : function (args) {
-                                        var showAccess = function() {
-                                            var state = args.context.kubernetesclusters[0].state;
-                                            if (state == "Created") { // Created
-                                                return jQuery('<br><p>').html("Kubernetes cluster setup is under progress, please check again in few minutes.");
-                                            } else if (state == "Error") { // Error
-                                                return jQuery('<br><p>').html("Kubernetes cluster is in error state, it cannot be accessed.");
-                                            } else if (state == "Destroying") { // Destroying
-                                                return jQuery('<br><p>').html("Kubernetes cluster is in destroying state, it cannot be accessed.");
-                                            } else if (state == "Destroyed") { // Destroyed
-                                                return jQuery('<br><p>').html("Kubernetes cluster is already destroyed, it cannot be accessed.");
-                                            }
-                                            var data = {
-                                                id: args.context.kubernetesclusters[0].kubernetesversionid
-                                            }
-                                            var version = '';
-                                            $.ajax({
-                                                url: createURL("listKubernetesSupportedVersions"),
-                                                dataType: "json",
-                                                data: data,
-                                                async: false,
-                                                success: function(json) {
-                                                    var jsonObj;
-                                                    if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null) {
-                                                        version = json.listkubernetessupportedversionsresponse.kubernetessupportedversion[0].semanticversion;
-                                                    }
-                                                }
-                                            });
-                                            return jQuery('<br><p>').html("Access Kubernetes cluster<br><br>Download cluster's kubeconfig file using action from Details tab.<br>Download kubectl tool for cluster's Kubernetes version from,<br>Linux: <a href='https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/linux/amd64/kubectl'>https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/linux/amd64/kubectl</a><br>MacOS: <a href='https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/darwin/amd64/kubectl'>https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/darwin/amd64/kubectl</a><br>Windows: <a href='https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/windows/amd64/kubectl.exe'>https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/windows/amd64/kubectl.exe</a><br><br>Using kubectl and kubeconfig file to access cluster<br><code>kubectl --kubeconfig /custom/path/kube.conf {COMMAND}</code><br><br>List pods<br><code>kubectl --kubeconfig /custom/path/kube.conf get pods --all-namespaces</code><br>List nodes<br><code>kubectl --kubeconfig /custom/path/kube.conf get nodes --all-namespaces</code><br>List services<br><code>kubectl --kubeconfig /custom/path/kube.conf get services --all-namespaces</code><br><br>Access dashboard web UI<br>Run proxy locally<br><code>kubectl --kubeconfig /custom/path/kube.conf proxy</code><br>Open URL in browser<br><code><a href='http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/'>http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/</a></code><br><br>Token for dashboard login can be retrieved using following command<br><code>kubectl --kubeconfig /custom/path/kube.conf describe secret $(kubectl --kubeconfig /custom/path/kube.conf get secrets -n kubernetes-dashboard | grep kubernetes-dashboard-token | awk '{print $1}') -n kubernetes-dashboard</code><br><br>More about accessing dashboard UI, https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/#accessing-the-dashboard-ui");
-                                        };
-                                        return showAccess();
-                                    }
-                                },
-                                clusterinstances: {
-                                    title: 'label.instances',
-                                    listView: {
-                                        section: 'clusterinstances',
-                                        preFilter: function(args) {
-                                            var hiddenFields = [];
-                                            if (!isAdmin()) {
-                                                hiddenFields.push('instancename');
-                                            }
-                                            return hiddenFields;
-                                        },
-                                        fields: {
-                                            name: {
-                                                label: 'label.name',
-                                                truncate: true
-                                            },
-                                            instancename: {
-                                                label: 'label.internal.name'
-                                            },
-                                            displayname: {
-                                                label: 'label.display.name',
-                                                truncate: true
-                                            },
-                                            ipaddress: {
-                                                label: 'label.ip.address'
-                                            },
-                                            zonename: {
-                                                label: 'label.zone.name'
-                                            },
-                                            state: {
-                                                label: 'label.state',
-                                                indicator: {
-                                                    'Running': 'on',
-                                                    'Stopped': 'off',
-                                                    'Destroyed': 'off',
-                                                    'Error': 'off'
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function(args) {
-                                            var data = {};
-                                            listViewDataProvider(args, data);
-
-                                            $.ajax({
-                                                url: createURL("listKubernetesClusters"),
-                                                data: {"id": args.context.kubernetesclusters[0].id},
-                                                success: function(json) {
-                                                    var items = json.listkubernetesclustersresponse.kubernetescluster;
-
-                                                    var vmlist = [];
-                                                    $.each(items, function(idx, item) {
-                                                        if ("virtualmachineids" in item) {
-                                                            vmlist = vmlist.concat(item.virtualmachineids);
-                                                        }
-                                                    });
-
-                                                    $.extend(data, {
-                                                        ids: vmlist.join()
-                                                    });
-
-                                                    if (items && items.length > 0 && items[0].projectid != null &&
-                                                        items[0].projectid != undefined && items[0].projectid.length > 0) {
-                                                        $.extend(data, {
-                                                            projectid: items[0].projectid
-                                                        });
-                                                    }
-
-                                                    if (data.ids.length == 0) {
-                                                        args.response.success({
-                                                            data: []
-                                                        });
-                                                    } else {
-                                                        $.ajax({
-                                                            url: createURL('listVirtualMachines'),
-                                                            data: data,
-                                                            success: function(json) {
-                                                                var items = json.listvirtualmachinesresponse.virtualmachine;
-                                                                if (items) {
-                                                                    $.each(items, function(idx, vm) {
-                                                                        if (vm.nic && vm.nic.length > 0 && vm.nic[0].ipaddress) {
-                                                                            items[idx].ipaddress = vm.nic[0].ipaddress;
-                                                                        }
-                                                                    });
-                                                                }
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-                                                            },
-                                                            error: function(XMLHttpResponse) {
-                                                                cloudStack.dialog.notice({
-                                                                    message: parseXMLHttpResponse(XMLHttpResponse)
-                                                                });
-                                                                args.response.error();
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                       },
-                                    }
-                                },
-                                firewall: {
-                                    title: 'label.firewall',
-                                    custom: function(args) {
-                                        var data = {
-                                            id: args.context.kubernetesclusters[0].networkid,
-                                            listAll: true
-                                        }
-                                        if (args.context.kubernetesclusters[0].projectid != null &&
-                                            args.context.kubernetesclusters[0].projectid != undefined &&
-                                            args.context.kubernetesclusters[0].projectid.length > 0) {
-                                            $.extend(data, {
-                                                projectid: args.context.kubernetesclusters[0].projectid
-                                            });
-                                            $.extend(args.context, {"projectid": args.context.kubernetesclusters[0].projectid});
-                                        }
-                                        $.ajax({
-                                            url: createURL('listNetworks'),
-                                            data: data,
-                                            async: false,
-                                            dataType: "json",
-                                            success: function(json) {
-                                                var network = json.listnetworksresponse.network;
-                                                $.extend(args.context, {"networks": [network]});
-                                            }
-                                        });
-                                        data = {
-                                            associatedNetworkId: args.context.kubernetesclusters[0].networkid,
-                                            listAll: true,
-                                            forvirtualnetwork: true
-                                        }
-                                        if (args.context.kubernetesclusters[0].projectid != null &&
-                                            args.context.kubernetesclusters[0].projectid != undefined &&
-                                            args.context.kubernetesclusters[0].projectid.length > 0) {
-                                            $.extend(data, {
-                                                projectid: args.context.kubernetesclusters[0].projectid
-                                            });
-                                        }
-                                        $.ajax({
-                                            url: createURL('listPublicIpAddresses'),
-                                            data: data,
-                                            async: false,
-                                            dataType: "json",
-                                            success: function(json) {
-                                                var ips = json.listpublicipaddressesresponse.publicipaddress;
-                                                var fwip = ips[0];
-                                                $.each(ips, function(idx, ip) {
-                                                    if (ip.issourcenat || ip.isstaticnat) {
-                                                        fwip = ip;
-                                                        return false;
-                                                    }
-                                                });
-                                                $.extend(args.context, {"ipAddresses": [fwip]});
-                                            }
-                                        });
-                                        return cloudStack.sections.network.sections.ipAddresses.listView.detailView.tabs.ipRules.custom(args);
-                                    },
-                                },
-                            }
-                        }
-                    }
-                },
-                kubernetesversions: {
-                    id: 'kubernetesversions',
-                    type: 'select',
-                    title: "label.versions",
-                    listView: {
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            semanticversion: {
-                                label: 'label.kubernetes.version'
-                            },
-                            zonename: {
-                                label: 'label.zone.name'
-                            },
-                            isoname: {
-                                label: 'label.iso.name'
-                            },
-                            isostate: {
-                                label: 'label.iso.state'
-                            },
-                            mincpunumber: {
-                                label: 'label.min.cpu.cores'
-                            },
-                            minmemory: {
-                                label: 'label.memory.minimum.mb'
-                            },
-                            state: {
-                                label: 'label.state',
-                                indicator: {
-                                    'Enabled': 'on',
-                                    'Disabled': 'off'
-                                }
-                            }
-                        },
-                        advSearchFields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            zoneid: {
-                                label: 'label.zone',
-                                select: function(args) {
-                                    $.ajax({
-                                        url: createURL('listZones'),
-                                        data: {
-                                            listAll: true
-                                        },
-                                        success: function(json) {
-                                            var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                            args.response.success({
-                                                data: $.map(zones, function(zone) {
-                                                    return {
-                                                        id: zone.id,
-                                                        description: zone.name
-                                                    };
-                                                })
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-                        },
-                        // List view actions
-                        actions: {
-                            add: {
-                                label: 'label.add.kubernetes.version',
-                                preFilter: function(args) { return isAdmin(); },
-                                createForm: {
-                                    title: 'label.add.kubernetes.version',
-                                    preFilter: cloudStack.preFilter.createTemplate,
-                                    fields: {
-                                        version: {
-                                            label: 'label.semantic.version',
-                                            //docID: 'Name of the cluster',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        name: {
-                                            label: 'label.name',
-                                            //docID: 'Name of the cluster',
-                                        },
-                                        zone: {
-                                            label: 'label.zone',
-                                            //docID: 'helpKubernetesClusterZone',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listZones&available=true"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var zoneObjs = json.listzonesresponse.zone;
-                                                        if (zoneObjs != null) {
-                                                            for (var i = 0; i < zoneObjs.length; i++) {
-                                                                items.push({
-                                                                    id: zoneObjs[i].id,
-                                                                    description: zoneObjs[i].name
-                                                                });
-                                                            }
-                                                        }
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        items.unshift({
-                                                            id: -1,
-                                                            description: 'label.all.zones'
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        isourl: {
-                                            label: 'label.url',
-                                            //docID: 'Name of the cluster',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        isochecksum: {
-                                            label: 'label.checksum',
-                                            //docID: 'Name of the cluster',
-                                        },
-                                        mincpunumber: {
-                                            label: 'label.min.cpu.cores',
-                                            validation: {
-                                                required: true,
-                                                number: true
-                                            },
-                                        },
-                                        minmemory: {
-                                            label: 'label.memory.minimum.mb',
-                                            validation: {
-                                                required: true,
-                                                number: true
-                                            }
-                                        }
-                                    }
-                                },
-
-                                action: function(args) {
-                                    var data = {
-                                        name: args.data.name,
-                                        semanticversion: args.data.version,
-                                        url: args.data.isourl,
-                                        checksum: args.data.isochecksum
-                                    };
-                                    if (args.data.zone != null && args.data.zone != -1) {
-                                        $.extend(data, {
-                                            zoneid: args.data.zone
-                                        });
-                                    }
-                                    if (args.data.mincpunumber != null && args.data.mincpunumber != "" && args.data.mincpunumber > 0) {
-                                        $.extend(data, {
-                                            mincpunumber: args.data.mincpunumber
-                                        });
-                                    }
-                                    if (args.data.minmemory != null && args.data.minmemory != "" && args.data.minmemory > 0) {
-                                        $.extend(data, {
-                                            minmemory: args.data.minmemory
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('addKubernetesSupportedVersion'),
-                                        data: data,
-                                        success: function(json) {
-                                            var version = json.addkubernetessupportedversionresponse.kubernetessupportedversion;
-                                            args.response.success({
-                                                data: version
-                                            });
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            args.response.error(errorMsg);
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    notification: function(args) {
-                                        return 'Kubernetes Supported Version Add';
-                                    }
-                                }
-                            }
-                        },
-                        dataProvider: function(args) {
-                            var data = {
-                                    page: args.page,
-                                    pagesize: pageSize
-                                };
-                            listViewDataProvider(args, data);
-                            $.ajax({
-                                url: createURL("listKubernetesSupportedVersions"),
-                                data: data,
-                                dataType: "json",
-                                sync: true,
-                                success: function(json) {
-                                    var items = [];
-                                    if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null) {
-                                        items = json.listkubernetessupportedversionsresponse.kubernetessupportedversion;
-                                    }
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            });
-                        },
-
-                        detailView: {
-                            name: 'label.kubernetes.version.details',
-                            isMaximized: true,
-                            actions: {
-                                update: {
-                                    label: 'label.edit',
-                                    messages: {
-                                        notification: function(args) {
-                                            return 'label.update.kubernetes.version';
-                                        }
-                                    },
-                                    createForm: {
-                                        title: 'label.update.kubernetes.version',
-                                        desc: '',
-                                        preFilter: function(args) {
-                                            var formVersion = args.context.kubernetesversions[0];
-                                            $.ajax({
-                                                url: createURL('listKubernetesSupportedVersions'),
-                                                data: {
-                                                    id: args.context.kubernetesversions[0].id
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null &&
-                                                        json.listkubernetessupportedversionsresponse.kubernetessupportedversion.length > 0) {
-                                                        formVersion = json.listkubernetessupportedversionsresponse.kubernetessupportedversion[0];
-                                                    }
-                                                }
-                                            });
-                                            if (formVersion.state != null) {
-                                                var options = args.$form.find('.form-item[rel=state]').find('option');
-                                                $.each(options, function(optionIndex, option) {
-                                                    if ($(option).val() === formVersion.state) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        fields: {
-                                            state: {
-                                                label: 'label.state',
-                                                //docID: 'helpKubernetesClusterZone',
-                                                validation: {
-                                                    required: true
-                                                },
-                                                select: function(args) {
-                                                    var items = [];
-                                                    items.push({
-                                                        id: 'Enabled',
-                                                        description: 'state.Enabled'
-                                                    }, {
-                                                        id: 'Disabled',
-                                                        description: 'state.Disabled'
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            },
-                                        }
-                                    },
-                                    action: function(args) {
-                                        var data = {
-                                            id: args.context.kubernetesversions[0].id,
-                                            state: args.data.state
-                                        };
-                                        $.ajax({
-                                            url: createURL('updateKubernetesSupportedVersion'),
-                                            data: data,
-                                            dataType: "json",
-                                            success: function (json) {
-                                                var jsonObj;
-                                                if (json.updatekubernetessupportedversionresponse.kubernetessupportedversion != null) {
-                                                    jsonObj = json.updatekubernetessupportedversionresponse.kubernetessupportedversion;
-                                                }
-                                                args.response.success({
-                                                    data: jsonObj
-                                                });
-                                            },
-                                            error: function(XMLHttpResponse) {
-                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                args.response.error(errorMsg);
-                                            }
-                                        }); //end ajax
-                                    }
-                                },
-                                destroy: {
-                                    label: 'label.delete.kubernetes.version',
-                                    compactLabel: 'label.delete',
-                                    preFilter: function(args) { return isAdmin(); },
-                                    createForm: {
-                                        title: 'label.delete.kubernetes.version',
-                                        desc: 'label.delete.kubernetes.version',
-                                        isWarning: true,
-                                        fields: {}
-                                    },
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.confirm.delete.kubernetes.version';
-                                        },
-                                        notification: function(args) {
-                                            return 'Deleted Kubernetes version.';
-                                        }
-                                    },
-                                    action: function(args) {
-                                        var data = {
-                                            id: args.context.kubernetesversions[0].id
-                                        };
-                                        $.ajax({
-                                            url: createURL('deleteKubernetesSupportedVersion'),
-                                            data: data,
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: json.deletekubernetessupportedversionresponse.jobid,
-                                                        getUpdatedItem: function(json) {
-                                                            return { 'toRemove': true };
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                }
-                            },
-                            tabs: {
-                                // Details tab
-                                details: {
-                                    title: 'label.details',
-                                    fields: [{
-                                        id: {
-                                            label: 'label.id'
-                                        },
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        zonename: {
-                                            label: 'label.zone.name'
-                                        },
-                                        isoid: {
-                                            label: 'label.iso.id'
-                                        },
-                                        isoname: {
-                                            label: 'label.iso.name'
-                                        },
-                                        isostate: {
-                                            label: 'label.iso.name'
-                                        }
-                                    }],
-
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL("listKubernetesSupportedVersions&id=" + args.context.kubernetesversions[0].id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var jsonObj;
-                                                if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null && json.listkubernetessupportedversionsresponse.kubernetessupportedversion.length > 0) {
-                                                    jsonObj = json.listkubernetessupportedversionsresponse.kubernetessupportedversion[0];
-                                                }
-                                                args.response.success({
-                                                    data: jsonObj
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        }
-                    }
-                },
-            }
-        });
-    };
-
-    var cksActionfilter = cloudStack.actionFilter.cksActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        if (jsonObj.state != "Destroyed" && jsonObj.state != "Destroying") {
-            if (jsonObj.state == "Stopped") {
-                allowedActions.push("start");
-            } else {
-                allowedActions.push("downloadKubernetesClusterKubeConfig");
-                allowedActions.push("stop");
-            }
-            if (jsonObj.state == "Created" || jsonObj.state == "Running") {
-                allowedActions.push("scaleKubernetesCluster");
-                allowedActions.push("upgradeKubernetesCluster");
-            }
-            allowedActions.push("destroy");
-        }
-        return allowedActions;
-    }
-
-}(cloudStack));
diff --git a/ui/legacy/plugins/cks/config.js b/ui/legacy/plugins/cks/config.js
deleted file mode 100644
index a5ea163..0000000
--- a/ui/legacy/plugins/cks/config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function (cloudStack) {
-  cloudStack.plugins.cks.config = {
-    title: 'Kubernetes Service',
-    desc: 'Kubernetes Service',
-    externalLink: 'http://www.cloudstack.org/',
-    authorName: 'Apache CloudStack',
-    authorEmail: 'dev@cloudstack.apache.org'
-  };
-}(cloudStack));
diff --git a/ui/legacy/plugins/cks/icon.png b/ui/legacy/plugins/cks/icon.png
deleted file mode 100644
index 1d04967..0000000
--- a/ui/legacy/plugins/cks/icon.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/plugins/cloudian/cloudian.css b/ui/legacy/plugins/cloudian/cloudian.css
deleted file mode 100644
index 447cf43..0000000
--- a/ui/legacy/plugins/cloudian/cloudian.css
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
diff --git a/ui/legacy/plugins/cloudian/cloudian.js b/ui/legacy/plugins/cloudian/cloudian.js
deleted file mode 100644
index 1b8a35a..0000000
--- a/ui/legacy/plugins/cloudian/cloudian.js
+++ /dev/null
@@ -1,66 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function (cloudStack) {
-  cloudStack.plugins.cloudian = function(plugin) {
-
-    plugin.ui.addSection({
-      id: 'cloudian',
-      title: 'Cloudian Storage',
-      showOnNavigation: true,
-      preFilter: function(args) {
-        var pluginEnabled = false;
-        $.ajax({
-            url: createURL('cloudianIsEnabled'),
-            async: false,
-            success: function(json) {
-                var response = json.cloudianisenabledresponse.cloudianisenabled;
-                pluginEnabled = response.enabled;
-                if (pluginEnabled) {
-                    var cloudianLogoutUrl = response.url + "logout.htm?";
-                    onLogoutCallback = function() {
-                        g_loginResponse = null;
-                        var csUrl = window.location.href;
-                        var redirect = "redirect=" + encodeURIComponent(csUrl);
-                        window.location.replace(cloudianLogoutUrl + redirect);
-                        return false;
-                    };
-                }
-            }
-        });
-        return pluginEnabled;
-      },
-
-      show: function() {
-        var description = 'Cloudian Management Console should open in another window.';
-        $.ajax({
-            url: createURL('cloudianSsoLogin'),
-            async: false,
-            success: function(json) {
-                var response = json.cloudianssologinresponse.cloudianssologin;
-                var cmcWindow = window.open(response.url, "CMCWindow");
-                cmcWindow.focus();
-            },
-            error: function(data) {
-                description = 'Single-Sign-On failed for Cloudian Management Console. Please ask your administrator to fix integration issues.';
-            }
-        });
-        return $('<div style="margin: 20px;">').html(description);
-      }
-    });
-  };
-}(cloudStack));
diff --git a/ui/legacy/plugins/cloudian/config.js b/ui/legacy/plugins/cloudian/config.js
deleted file mode 100644
index b72cd5f..0000000
--- a/ui/legacy/plugins/cloudian/config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function (cloudStack) {
-  cloudStack.plugins.cloudian.config = {
-    title: 'Cloudian Storage',
-    desc: 'Cloudian Storage',
-    externalLink: 'https://cloudian.com/',
-    authorName: 'Cloudian Inc.',
-    authorEmail: 'info@cloudian.com '
-  };
-}(cloudStack));
diff --git a/ui/legacy/plugins/cloudian/icon.png b/ui/legacy/plugins/cloudian/icon.png
deleted file mode 100644
index d18ec23..0000000
--- a/ui/legacy/plugins/cloudian/icon.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/plugins/plugins.js b/ui/legacy/plugins/plugins.js
deleted file mode 100644
index 30cdf4f..0000000
--- a/ui/legacy/plugins/plugins.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-  cloudStack.plugins = [
-    //'testPlugin',
-    'cloudian',
-    'quota',
-    'cks'
-  ];
-}(jQuery, cloudStack));
diff --git a/ui/legacy/plugins/quota/config.js b/ui/legacy/plugins/quota/config.js
deleted file mode 100644
index 186d507..0000000
--- a/ui/legacy/plugins/quota/config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function (cloudStack) {
-  cloudStack.plugins.quota.config = {
-    title: 'Quota',
-    desc: 'CloudStack Quota',
-    externalLink: 'http://www.cloudstack.org/',
-    authorName: 'Apache CloudStack',
-    authorEmail: 'dev@cloudstack.apache.org'
-  };
-}(cloudStack));
diff --git a/ui/legacy/plugins/quota/icon.png b/ui/legacy/plugins/quota/icon.png
deleted file mode 100644
index 0f80bb7..0000000
--- a/ui/legacy/plugins/quota/icon.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/plugins/quota/quota.css b/ui/legacy/plugins/quota/quota.css
deleted file mode 100644
index e9c0d8f..0000000
--- a/ui/legacy/plugins/quota/quota.css
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-.quota-tariff-edit {
-    float: right;
-}
-
-.quota-bold {
-    font-size: 12px;
-    font-weight: bold;
-    color: #6D6D6D;
-}
-
-.quota-text {
-    font-size: 11px;
-    color: #282828;
-}
-
-.quota-element {
-    margin: 5px;
-    margin-left: 13px;
-}
-
-.quota-input {
-    background: #F6F6F6;
-    border: 1px solid #AFAFAF;
-    border-radius: 4px;
-}
-
-.quota-button {
-    border:1px solid #0077c7; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px;
-    font-size:11px;
-    padding: 8px;
-    margin-top: 12px;
-    text-shadow: -1px -1px 0 rgba(0,0,0,0.3);font-weight:bold; color: #FFFFFF;
-    background-color: #0099FF; background-image: -webkit-gradient(linear, left top, left bottom, from(#0099FF), to(#004FF7));
-    background-image: -webkit-linear-gradient(top, #0099FF, #004FF7);
-    background-image: -moz-linear-gradient(top, #0099FF, #004FF7);
-    background-image: -ms-linear-gradient(top, #0099FF, #004FF7);
-    background-image: -o-linear-gradient(top, #0099FF, #004FF7);
-    background-image: linear-gradient(to bottom, #0099FF, #004FF7);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#0099FF, endColorstr=#004FF7);
-}
-
-.quota-button:hover {
-    border:1px solid #005c99;
-    background-color: #0039B3; background-image: -webkit-gradient(linear, left top, left bottom, from(#0039B3), to(#004FF7));
-    background-image: -webkit-linear-gradient(top, #0039B3, #004FF7);
-    background-image: -moz-linear-gradient(top, #0039B3, #004FF7);
-    background-image: -ms-linear-gradient(top, #0039B3, #004FF7);
-    background-image: -o-linear-gradient(top, #0039B3, #004FF7);
-    background-image: linear-gradient(to bottom, #0039B3, #004FF7);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#0039B3, endColorstr=#004FF7);
-}
diff --git a/ui/legacy/plugins/quota/quota.js b/ui/legacy/plugins/quota/quota.js
deleted file mode 100644
index 4505b96..0000000
--- a/ui/legacy/plugins/quota/quota.js
+++ /dev/null
@@ -1,969 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function (cloudStack) {
-    var now = new Date();
-    var newstartdate;
-    var newenddate;
-    var currency;
-    cloudStack.plugins.quota = function(plugin) {
-        plugin.ui.addSection({
-          id: 'quota',
-          title: 'Quota',
-          preFilter: function(args) {
-                var pluginEnabled = false;
-                $.ajax({
-                    url: createURL("quotaIsEnabled"),
-                    async: false,
-                    success: function(json) {
-                        pluginEnabled = json.quotaisenabledresponse.isenabled.isenabled;
-                    },
-                    error: function(data) {
-                        pluginEnabled = false;
-                    }
-                });
-                return pluginEnabled;
-          },
-          showOnNavigation: true,
-          sectionSelect: {
-              label: 'label.select-view',
-              preFilter: function(args) {
-              if (isAdmin())
-                  return ['summary', 'fullSummary', 'tariffEdit', 'emailTemplates'];
-              else
-                  return  ['summary', 'tariffView'];
-              }
-          },
-          sections: {
-
-              summary: {
-                  type: 'select',
-                  title: 'label.quota.summary',
-                  listView: {
-                      label: 'label.quota.summary',
-                      disableInfiniteScrolling: true,
-                      fields: {
-                          account: {
-                              label: 'label.account',
-                              truncate: true
-                          },
-                          domain: {
-                              label: 'label.domain'
-                          },
-                          balance: {
-                              label: 'label.quota.balance',
-                              limitcolor: true,
-                              limits: {
-                                  upperlimit: 'upperlimit',
-                                  lowerlimit: 'lowerlimit'
-                              },
-                              converter: function(args){
-                                  return currency + args.toString();
-                              }
-                          },
-                          quota: {
-                              label: 'label.quota.totalusage',
-                              editable: true,
-                              truncate: true
-                          },
-                          state: {
-                              label: 'label.quota.state',
-                              indicator: {
-                                  'enabled': 'on',
-                                  'disabled': 'off',
-                                  'locked': 'off'
-                              }
-                          }
-                      },
-                      dataProvider: function(args) {
-                          var data = {
-                              page: args.page,
-                              pagesize: pageSize
-                          };
-
-                          // TODO: add logic in mgmt server to filter by account
-                          if (args.filterBy.search.value) {
-                              data.search = args.filterBy.search.value;
-                          }
-
-                          $.ajax({
-                              url: createURL('quotaSummary'),
-                              data: data,
-                              dataType: "json",
-                              async: true,
-                              success: function(json) {
-                                  var items = json.quotasummaryresponse.summary;
-                                  if(items){
-                                      var array=[];
-                                      for (var i = 0; i < items.length; i++) {
-                                          if (typeof data.search != 'undefine' && items[i].account.search(data.search) < 0 && items[i].domain.search(data.search) < 0) {
-                                              continue;
-                                          }
-                                          currency = items[i].currency;
-                                          items[i].quota = currency + ' ' + items[i].quota;
-                                          items[i].lowerlimit = -1;
-                                          items[i].upperlimit = 0;
-                                          array.push(items[i]);
-                                      }
-                                      args.response.success({
-                                          data: array
-                                      });
-                                  }
-                                  else {
-                                      args.response.success({
-                                          data: 0
-                                      });
-                                  }
-                              },
-                              error: function(data) {
-                                  cloudStack.dialog.notice({
-                                      message: parseXMLHttpResponse(data)
-                                  });
-                              }
-                          });
-                      },
-                      detailView: {
-                          viewAll: [{
-                              path: 'quota.quotastatement',
-                              label: 'label.quota.statement.quota'
-                          },{
-                              path: 'quota.balancestatement',
-                              label: 'label.quota.statement.balance'
-                          }],
-                          actions: {
-                             add: {
-                                label: 'label.quota.add.credits',
-                                preFilter: function(args) { return isAdmin(); },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'label.quota.add.credits';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.quota.add.credits';
-                                    }
-                                },
-
-                                createForm: {
-                                    title: 'label.quota.credits',
-                                    desc: '',
-                                    fields: {
-                                         value: {
-                                            label: 'label.quota.credits',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        min_balance: {
-                                            label: 'label.quota.minbalance',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        quota_enforce: {
-                                            label: 'label.quota.enforcequota',
-                                            isBoolean: true,
-                                            isChecked: false
-                                        }
-                                    }
-
-                                },
-
-                                action: function(args) {
-                                    var enforce=args.data.quota_enforce == 'on' ? true: false;
-                                    $.ajax({
-                                        url: createURL('quotaCredits'),
-                                        data: {
-                                            domainid: args.context.summary[0].domainid,
-                                            account: args.context.summary[0].account,
-                                            value: args.data.value,
-                                            min_balance: args.data.min_balance,
-                                            quota_enforce: enforce
-                                        },
-                                        async: false,
-                                        success: function(json) {
-                                            args.response.success({
-                                                data: json.quotacreditsresponse.totalquota
-                                            });
-                                        }
-                                    });
-                                    $(window).trigger('cloudStack.fullRefresh');
-                                 }
-                            }
-                          },
-                          tabs: {
-                             details: {
-                                    title: 'label.details',
-                                    fields: [{
-                                        id: {
-                                            label: 'label.quota.statement.balance'
-                                        }
-                                    }, {
-                                        startdate: {
-                                            label: 'label.quota.date'
-                                        },
-                                        startquota: {
-                                            label: 'label.quota.value'
-                                        }
-                                    }],
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('quotaBalance'),
-                                            dataType: 'json',
-                                            async: true,
-                                            data: {
-                                                domainid: args.context.summary[0].domainid,
-                                                account: args.context.summary[0].account
-                                            },
-                                            success: function(json) {
-                                                var item = json.quotabalanceresponse.balance;
-                                                item.startdate = now.toJSON().slice(0,10);
-                                                item.startquota = item.currency + ' ' + item.startquota;
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            } ,
-                                            error:function(data) {
-                                                args.response.error(parseXMLHttpResponse(data));
-                                            }
-                                        });
-                                    }
-                                }
-                          }
-                      }
-                  }
-              },
-
-              fullSummary: {
-                  type: 'select',
-                  title: 'label.quota.fullsummary',
-                  listView: {
-                      label: 'label.quota.fullsummary',
-                      disableInfiniteScrolling: true,
-                      fields: {
-                          account: {
-                              label: 'label.account',
-                              truncate: true
-                          },
-                          domain: {
-                              label: 'label.domain'
-                          },
-                          balance: {
-                              label: 'label.quota.balance',
-                              limitcolor: true,
-                              limits: {
-                                  upperlimit: 'upperlimit',
-                                  lowerlimit: 'lowerlimit'
-                              },
-                              converter: function(args){
-                                  return currency + args.toString();
-                              }
-                          },
-                          quota: {
-                              label: 'label.quota.totalusage',
-                              editable: true,
-                              truncate: true
-                          },
-                          state: {
-                              label: 'label.quota.state',
-                              indicator: {
-                                  'enabled': 'on',
-                                  'disabled': 'off',
-                                  'locked': 'off'
-                              }
-                          }
-                      },
-                      dataProvider: function(args) {
-                          var data = {
-                              page: args.page,
-                              pagesize: pageSize
-                          };
-
-                          // TODO: add logic in mgmt server to filter by account
-                          if (args.filterBy.search.value) {
-                              data.search = args.filterBy.search.value;
-                          }
-
-                          $.ajax({
-                              url: createURL('quotaSummary&listall=true'),
-                              data: data,
-                              dataType: "json",
-                              async: true,
-                              success: function(json) {
-                                  var items = json.quotasummaryresponse.summary;
-                                  if(items){
-                                      var array=[];
-                                      for (var i = 0; i < items.length; i++) {
-                                          if (typeof data.search != 'undefine' && items[i].account.search(data.search) < 0 && items[i].domain.search(data.search) < 0) {
-                                              continue;
-                                          }
-                                          currency = items[i].currency;
-                                          items[i].quota = currency + ' ' + items[i].quota;
-                                          items[i].lowerlimit = -1;
-                                          items[i].upperlimit = 0;
-                                          array.push(items[i]);
-                                      }
-                                      args.response.success({
-                                          data: array
-                                      });
-                                  }
-                                  else {
-                                      args.response.success({
-                                          data: 0
-                                      });
-                                  }
-                              },
-                              error: function(data) {
-                                  cloudStack.dialog.notice({
-                                      message: parseXMLHttpResponse(data)
-                                  });
-                              }
-                          });
-                      },
-                      detailView: {
-                          actions: {
-                             add: {
-                                label: 'label.quota.add.credits',
-                                preFilter: function(args) { return isAdmin(); },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'label.quota.add.credits';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.quota.add.credits';
-                                    }
-                                },
-
-                                createForm: {
-                                    title: 'label.quota.credits',
-                                    desc: '',
-                                    fields: {
-                                         value: {
-                                            label: 'label.quota.credits',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        min_balance: {
-                                            label: 'label.quota.minbalance',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        quota_enforce: {
-                                            label: 'label.quota.enforcequota',
-                                            isBoolean: true,
-                                            isChecked: false
-                                        }
-                                    }
-
-                                },
-
-                                action: function(args) {
-                                     var enforce=args.data.quota_enforce == 'on' ? true: false;
-                                     $.ajax({
-                                         url: createURL('quotaCredits'),
-                                         data: {
-                                             domainid: args.context.fullSummary[0].domainid,
-                                             account: args.context.fullSummary[0].account,
-                                             value: args.data.value,
-                                             min_balance: args.data.min_balance,
-                                             quota_enforce: enforce
-                                         },
-                                        async: false,
-                                        success: function(json) {
-                                            args.response.success({
-                                                data: json.quotacreditsresponse.totalquota
-                                            });
-                                        }
-                                    });
-                                    $(window).trigger('cloudStack.fullRefresh');
-                                 }
-                            }
-                          },
-                          tabs: {
-                             details: {
-                                    title: 'label.details',
-                                    fields: [{
-                                        id: {
-                                            label: 'label.quota.statement.balance'
-                                        }
-                                    }, {
-                                        startdate: {
-                                            label: 'label.quota.date'
-                                        },
-                                        startquota: {
-                                            label: 'label.quota.value'
-                                        }
-                                    }],
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('quotaBalance'),
-                                            dataType: 'json',
-                                            async: true,
-                                            data: {
-                                                domainid: args.context.fullSummary[0].domainid,
-                                                account: args.context.fullSummary[0].account
-                                            },
-                                            success: function(json) {
-                                                var item = json.quotabalanceresponse.balance;
-                                                item.startdate = now.toJSON().slice(0,10);
-                                                item.startquota = item.currency + ' ' + item.startquota;
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            } ,
-                                            error:function(data) {
-                                                args.response.error(parseXMLHttpResponse(data));
-                                            }
-                                        });
-                                    }
-                                }
-                           }
-                      }
-                  }
-              },
-
-             quotastatement:{
-                  id: 'statementbalance',
-                  title: 'label.quota.statement',
-                  preFilter: function(args) {
-                      return false;
-                  },
-                  listView: {
-                      label: 'label.quota.statement.quota',
-                      disableInfiniteScrolling: true,
-                      fields: {
-                            name: {
-                                label: 'label.quota.type.name'
-                            },
-                            unit: {
-                                label: 'label.quota.type.unit'
-                            },
-                            quota: {
-                                label: 'label.quota.usage'
-                            }
-                      },
-                      actions: {
-                              add: {
-                                    label: 'label.quota.dates',
-                                    createForm: {
-                                          title: 'label.quota.dates',
-                                          fields: {
-                                            startdate: {
-                                                label: 'label.quota.startdate',
-                                                isDatepicker: true,
-                                                maxDate: '+0d',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            enddate: {
-                                                label: 'label.quota.enddate',
-                                                isDatepicker: true,
-                                                maxDate: '+0d',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            }
-                                        }
-                                      },
-                                     action: function(args) {
-                                        newstartdate= args.data.startdate.slice(0,10);
-                                        newenddate= args.data.enddate.slice(0,10);
-                                        $(window).trigger('cloudStack.fullRefresh');
-                                    }
-                            }
-                       },
-                      dataProvider: function(args) {
-                          $.ajax({
-                              url: createURL('quotaStatement'),
-                              dataType: 'json',
-                              async: true,
-                              data: {
-                                  domainid: args.context.summary[0].domainid,
-                                  account: args.context.summary[0].account,
-                                  startdate: function() {
-                                         if (typeof newstartdate == 'undefined') {
-                                             return  args.context.summary[0].startdate.slice(0,10);
-                                         } else {
-                                             return newstartdate;
-                                         }
-                                },
-                                  enddate: function() {
-                                     if (typeof newenddate == 'undefined') {
-                                          return  now.toJSON().slice(0,10);
-                              } else {
-                                                      return newenddate;
-                              }
-                   }
-                              },
-                              success: function(json) {
-                                  var usages = json.quotastatementresponse.statement.quotausage;
-                                  var currency = json.quotastatementresponse.statement.currency;
-                                  $.each(usages, function(idx, item) {
-                                      usages[idx].quota = currency + ' ' + usages[idx].quota;
-                                  });
-                                  usages.push({
-                                        name: _l('label.quota.total') + ' : ',
-                                        unit:'',
-                                        quota: currency + ' ' + json.quotastatementresponse.statement.totalquota
-                                    });
-
-                                  usages.unshift({
-                                      name: _l('label.quota.startdate')  + ' : ' + json.quotastatementresponse.statement.startdate.slice(0,10),
-                                      unit: _l('label.quota.enddate')  + ' : ' + json.quotastatementresponse.statement.enddate.slice(0,10),
-                                      quota: ''
-                                  });
-
-
-                                  args.response.success({
-                                      data: usages
-                                  });
-                              },
-                              error:function(data) {
-                                  cloudStack.dialog.notice({
-                                      message: parseXMLHttpResponse(data)
-                                  });
-                              }
-                          });
-                      }
-                  } // end list view
-              }, // end statement
-
-
-              balancestatement:{
-                  id: 'balancestatement',
-                  title: 'label.quota.statement.balance',
-                  listView: {
-                      label: 'label.quota.statement.balance',
-                      disableInfiniteScrolling: true,
-                      fields: {
-                            date: {
-                                label: 'label.quota.date'
-                            },
-                            quota: {
-                                label: 'label.quota.value'
-                            },
-                            credit: {
-                                label: 'label.quota.credit'
-                            }
-                      },
-
-                      actions: {
-                              add: {
-                                    label: 'label.quota.dates',
-                                    createForm: {
-                                          title: 'label.quota.dates',
-                                          fields: {
-                                            startdate: {
-                                                label: 'label.quota.startdate',
-                                                isDatepicker: true,
-                                                maxDate: '+0d',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            enddate: {
-                                                label: 'label.quota.enddate',
-                                                isDatepicker: true,
-                                                maxDate: '+0d',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            }
-                                        }
-                                      },
-                                    action: function(args) {
-                                            newstartdate= args.data.startdate.slice(0,10);
-                                            newenddate= args.data.enddate.slice(0,10);
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                  }
-                           },
-
-                      dataProvider: function(args) {
-                          $.ajax({
-                              url: createURL('quotaBalance'),
-                              dataType: 'json',
-                              async: true,
-                              data: {
-                                  domainid: args.context.summary[0].domainid,
-                                  account: args.context.summary[0].account,
-                                  startdate: function() {
-                                       if (typeof newstartdate == 'undefined') {
-                                           return  args.context.summary[0].startdate.slice(0,10);
-                                       } else {
-                                           return newstartdate;
-                                       }
-                                    },
-                                   enddate: function() {
-                             if (typeof newenddate == 'undefined') {
-                                  return  now.toJSON().slice(0,10);
-                          } else {
-                                           return newenddate;
-                          }
-                                  }
-                              },
-                              success: function(json) {
-                                  var bal = json.quotabalanceresponse.balance;
-                                  var currency = bal.currency;
-                                  var array=[{
-                                               date: bal.startdate.slice(0,10),
-                                               quota: currency + ' ' + bal.startquota,
-                                               credit: ''
-                                  }];
-                                  //now add all credits
-                                  for (var i = 0; i < bal.credits.length; i++) {
-                                        array.push({
-                                            date: bal.credits[i].updated_on.slice(0,10),
-                                            quota: '',
-                                            credit:  currency + ' ' + bal.credits[i].credits
-                                        });
-                                    }
-                                  array.push({
-                                            date: bal.enddate.slice(0,10),
-                                            quota:  currency + ' ' + bal.endquota,
-                                            credit: ''
-                                        });
-                                  args.response.success({
-                                      data: array
-                                  });
-                              },
-                              error:function(data) {
-                  cloudStack.dialog.notice({
-                                      message: parseXMLHttpResponse(data)
-                                  });
-                              }
-                          });
-                      }
-                  } // end list view
-              }, // end statement
-
-
-              tariffEdit: {
-                  type: 'select',
-                  title: 'label.quota.tariff',
-                  listView: {
-                      label: 'label.quota.tariff',
-                      disableInfiniteScrolling: true,
-                      actions: {
-                          edit: {
-                              label: 'label.change.value',
-                              action: function(args) {
-                                  if (isAdmin()) {
-                                       var data = {
-                                            usagetype: args.data.jsonObj.usageType
-                                       };
-                                      var tariffVal = args.data.tariffValue.split(' ');
-                                      if (tariffVal.length==2){
-                                          data.value = tariffVal[1];
-                                      }
-                                      else {
-                                          data.value = tariffVal[0];
-                                      }
-                                      if (!isNaN(parseFloat(data.value)) && isFinite(data.value)){
-                                          var updateTariffForm = cloudStack.dialog.createForm({
-                                              form: {
-                                                  title: 'label.quota.configuration',
-                                                  fields: {
-                                                      tariffValue: {
-                                                          label: 'label.quota.value',
-                                                          number: true,
-                                                          validation: {
-                                                              required: true
-                                                          }
-                                                      },
-                                                      effectiveDate: {
-                                                          label: 'label.quota.tariff.effectivedate',
-                                                          isDatepicker: true,
-                                                          dependsOn: 'startdate',
-                                                          minDate: '+1d',
-                                                          validation: {
-                                                              required: true
-                                                          }
-                                                      }
-                                                  }
-                                              },
-                                              after: function(argsLocal) {
-                                                  data.startDate = argsLocal.data.effectiveDate;
-                                                  data.value = argsLocal.data.tariffValue;
-                                                  $.ajax({
-                                                      url: createURL('quotaTariffUpdate'),
-                                                      data: data,
-                                                      type: "POST",
-                                                      success: function(json) {
-                                                          // Refresh listings on chosen date to reflect new tariff
-                                                          $($.find('div.search-bar input')).val(data.startDate);
-                                                          $('#basic_search').click();
-                                                      }
-                                                  });
-                                              }
-                                          });
-                                          updateTariffForm.find('input[name=tariffValue]').val(data.value);
-                                          updateTariffForm.find('input[name=effectiveDate]').focus();
-                                      }
-                                      else {
-                                          alert("Bad tariff value, this should be a number " + data.value);
-                                          $(window).trigger('cloudStack.fullRefresh');
-                                      }//bad data.value - NaN
-                                  } // if is ADMIN
-                              } // end action
-                          }//edits
-                      },//actions
-                      fields: {
-                          usageName: {
-                              label: 'label.usage.type',
-                              id: true,
-                              truncate: true
-                          },
-                          usageUnit: {
-                              label: 'label.usage.unit'
-                          },
-                          tariffValue: {
-                              label: 'label.quota.tariff.value',
-                              editable: true
-                          },
-                          description: {
-                              label: 'label.quota.description',
-                              truncate: true
-                          }
-                      },
-                      dataProvider: function(args) {
-                          var data = {};
-                          if (args.filterBy.search.value) {
-                              data.startdate = args.filterBy.search.value;
-                          }
-                          $.ajax({
-                              url: createURL('quotaTariffList'),
-                              data: data,
-                              dataType: "json",
-                              async: true,
-                              success: function(json) {
-                                  var items = json.quotatarifflistresponse.quotatariff;
-                                  $.each(items, function(idx, item) {
-                                      items[idx].tariffValue =  items[idx].currency + ' ' + items[idx].tariffValue;
-                                  });
-                                  args.response.success({
-                                      data: items
-                                  });
-
-                                  $($.find('.list-view')).data('end-of-table', true);
-                                  // Hook up date picker
-                                  var input = $($.find('div.search-bar input'));
-                                  input.datepicker({
-                                      defaultDate: new Date(),
-                                      changeMonth: true,
-                                      dateFormat: "yy-mm-dd"
-                                  });
-                                  input.parent().attr('title', _l('label.quota.effectivedate'));
-                              },
-                              error: function(data) {
-                                  cloudStack.dialog.notice({
-                                      message: parseXMLHttpResponse(data)
-                                  });
-                              }
-                          });
-                      }
-                  }
-              },
-
-
-              tariffView: {
-                  type: 'select',
-                  title: 'label.quota.tariff',
-                  listView: {
-                      label: 'label.quota.tariff',
-                      disableInfiniteScrolling: true,
-                      fields: {
-                          usageName: {
-                              label: 'label.usage.type',
-                              id: true,
-                              truncate: true
-                          },
-                          usageUnit: {
-                              label: 'label.usage.unit'
-                          },
-                          tariffValue: {
-                              label: 'label.quota.tariff.value'
-                          },
-                          description: {
-                              label: 'label.quota.description',
-                              truncate: true
-                          }
-                      },
-                      dataProvider: function(args) {
-                          var data = {};
-                          if (args.filterBy.search.value) {
-                              data.startdate = args.filterBy.search.value;
-                          }
-                          $.ajax({
-                              url: createURL('quotaTariffList'),
-                              data: data,
-                              dataType: "json",
-                              async: true,
-                              success: function(json) {
-                                  var items = json.quotatarifflistresponse.quotatariff;
-                                  $.each(items, function(idx, item) {
-                                      items[idx].tariffValue =  items[idx].currency + ' ' + items[idx].tariffValue;
-                                  });
-                                  args.response.success({
-                                      data: items
-                                  });
-
-                                  $($.find('.list-view')).data('end-of-table', true);
-                                  // Hook up date picker
-                                  var input = $($.find('div.search-bar input'));
-                                  input.datepicker({
-                                      defaultDate: new Date(),
-                                      changeMonth: true,
-                                      dateFormat: "yy-mm-dd"
-                                  });
-                                  input.parent().attr('title', _l('label.quota.effectivedate'));
-                              },
-                              error: function(data) {
-                                  cloudStack.dialog.notice({
-                                      message: parseXMLHttpResponse(data)
-                                  });
-                              }
-                          });
-                      }
-                  }
-              },
-
-              emailTemplates: {
-                  type: 'select',
-                  title: 'label.quota.email.template',
-                  listView: {
-                      label: 'label.quota.email.template',
-                      disableInfiniteScrolling: true,
-                      fields: {
-                          templatetype: {
-                              label: 'label.quota.email.template'
-                          },
-                          templatesubject: {
-                              label: 'label.quota.email.subject',
-                              truncate: true
-                          },
-                          templatebody: {
-                              label: 'label.quota.email.body',
-                              truncate: true
-                          },
-                          last_updated: {
-                              label: 'label.quota.email.lastupdated',
-                              truncate: true
-                          }
-                      },
-                      dataProvider: function(args) {
-                          var data = {};
-                          if (args.filterBy.search.value) {
-                              data.templatetype = args.filterBy.search.value;
-                          }
-
-                          $.ajax({
-                              url: createURL('quotaEmailTemplateList'),
-                              data: data,
-                              dataType: "json",
-                              async: true,
-                              success: function(json) {
-                                  if (!json.hasOwnProperty('quotaemailtemplatelistresponse') || !json.quotaemailtemplatelistresponse.hasOwnProperty('quotaemailtemplate')) {
-                                      return;
-                                  }
-                                  var items = json.quotaemailtemplatelistresponse.quotaemailtemplate;
-                                  args.response.success({
-                                      data: items
-                                  });
-                              },
-                              error: function(data) {
-                                  cloudStack.dialog.notice({
-                                      message: parseXMLHttpResponse(data)
-                                  });
-                              }
-                          });
-                      },
-                      detailView: {
-                          actions: {
-                              edit: {
-                                  label: 'label.quota.email.edit',
-                                  messages: {
-                                      notification: function(args) {
-                                          return 'label.quota.email.edit';
-                                      }
-                                  },
-                                  action: function(args) {
-                                      args.data.templatetype = args.context.emailTemplates[0].templatetype;
-                                      $.ajax({
-                                          url: createURL('quotaEmailTemplateUpdate'),
-                                          data: args.data,
-                                          success: function(json) {
-                                              args.response.success({
-                                                  _custom: {
-                                                      success: true
-                                                  }
-                                              });
-                                          }
-                                      });
-                                  }
-                              }
-                          },
-
-                          tabs: {
-                              details: {
-                                  title: 'label.details',
-                                  fields: [{
-                                      templatetype: {
-                                          label: 'label.quota.email.template'
-                                      }
-                                  }, {
-                                      templatesubject: {
-                                          label: 'label.quota.email.subject',
-                                          isEditable: true,
-                                          textArea: true
-                                      },
-                                      templatebody: {
-                                          label: 'label.quota.email.body',
-                                          isEditable: true,
-                                          textArea: true
-                                      },
-                                      last_updated: {
-                                          label: 'label.quota.email.lastupdated'
-                                      }
-                                  }],
-
-                                  dataProvider: function(args) {
-                                      $.ajax({
-                                          url: createURL('quotaEmailTemplateList'),
-                                          data: {
-                                              templatetype: args.context.emailTemplates[0].templatetype
-                                          },
-                                          success: function(json) {
-                                              var item = json.quotaemailtemplatelistresponse.quotaemailtemplate[0];
-                                              args.response.success({
-                                                  data: item
-                                              });
-                                          }
-                                      });
-                                  }
-                              }
-                          }
-                      }
-                  }
-              }
-
-          }
-      });
-  };
-}(cloudStack));
diff --git a/ui/legacy/plugins/testPlugin/config.js b/ui/legacy/plugins/testPlugin/config.js
deleted file mode 100644
index 71cb379..0000000
--- a/ui/legacy/plugins/testPlugin/config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function (cloudStack) {
-  cloudStack.plugins.testPlugin.config = {
-    title: 'Test Plugin',
-    desc: 'Sample plugin',
-    externalLink: 'http://www.cloudstack.org/',
-    authorName: 'Test Plugin Developer',
-    authorEmail: 'plugin.developer@example.com'
-  };
-}(cloudStack));
\ No newline at end of file
diff --git a/ui/legacy/plugins/testPlugin/icon.png b/ui/legacy/plugins/testPlugin/icon.png
deleted file mode 100644
index a313d35..0000000
--- a/ui/legacy/plugins/testPlugin/icon.png
+++ /dev/null
Binary files differ
diff --git a/ui/legacy/plugins/testPlugin/testPlugin.css b/ui/legacy/plugins/testPlugin/testPlugin.css
deleted file mode 100644
index f26216f..0000000
--- a/ui/legacy/plugins/testPlugin/testPlugin.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-/* Put your CSS here */
diff --git a/ui/legacy/plugins/testPlugin/testPlugin.js b/ui/legacy/plugins/testPlugin/testPlugin.js
deleted file mode 100644
index 66ce56f..0000000
--- a/ui/legacy/plugins/testPlugin/testPlugin.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function (cloudStack) {
-  cloudStack.plugins.testPlugin = function(plugin) {
-    plugin.ui.addSection({
-      id: 'testPlugin',
-      title: 'TestPlugin',
-      showOnNavigation: true,
-      preFilter: function(args) {
-        return isAdmin();
-      },
-      show: function() {
-        return $('<div>').html('Test plugin section');
-      }
-    });
-  };
-}(cloudStack));
\ No newline at end of file
diff --git a/ui/legacy/scripts/accounts.js b/ui/legacy/scripts/accounts.js
deleted file mode 100644
index 5112dcc..0000000
--- a/ui/legacy/scripts/accounts.js
+++ /dev/null
@@ -1,2268 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-
-    var domainObjs;
-    var roleObjs;
-
-    cloudStack.sections.accounts = {
-        title: 'label.accounts',
-        id: 'accounts',
-        sectionSelect: {
-            label: 'label.select-view',
-            preFilter: function() {
-                return ['accounts', 'sshkeypairs'];
-            }
-        },
-        sections: {
-            accounts: {
-                type: 'select',
-                id: 'accounts',
-                title: 'label.accounts',
-                listView: {
-                    id: 'accounts',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        rolename: {
-                            label: 'label.role'
-                        },
-                        roletype: {
-                            label: 'label.roletype'
-                        },
-                        domainpath: {
-                            label: 'label.domain'
-                        },
-                        state: {
-                            converter: function(str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.state',
-                            indicator: {
-                                'enabled': 'on',
-                                'Destroyed': 'off',
-                                'disabled': 'off'
-                            }
-                        }
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.account',
-                            preFilter: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return true;
-                                else
-                                    return false;
-                            },
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.account';
-                                }
-                            },
-                            notification: {
-                                poll: function(args) {
-                                    args.complete({
-                                        actionFilter: accountActionfilter
-                                    });
-                                }
-                            },
-
-                            action: {
-                                custom: cloudStack.uiCustom.accountsWizard(
-                                    cloudStack.accountsWizard,
-                                    false
-                                )
-                            }
-
-                        },
-
-                        addLdapAccount: {
-                            label: 'label.add.ldap.account',
-                            isHeader: true,
-                            preFilter: function(args) {
-                                if (isAdmin() && isLdapEnabled()) {
-                                    return true;
-                                } else {
-                                    return false;
-                                }
-                            },
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.ldap.account';
-                                }
-                            },
-                            notification: {
-                                poll: function(args) {
-                                    args.complete({
-                                        actionFilter: accountActionfilter
-                                    });
-                                }
-                            },
-
-                            action: {
-                                custom: cloudStack.uiCustom.accountsWizard(
-                                    cloudStack.accountsWizard,
-                                    true
-                                )
-                            }
-
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        if ("domains" in args.context) {
-                            $.extend(data, {
-                                domainid: args.context.domains[0].id
-                            });
-                        }
-
-                        if ("routers" in args.context) {
-                            if ("account" in args.context.routers[0]) {
-                                $.extend(data, {
-                                    name: args.context.routers[0].account
-                                });
-                            }
-                            if ("domainid" in args.context.routers[0]) {
-                                $.extend(data, {
-                                    domainid: args.context.routers[0].domainid
-                                });
-                            }
-                        }
-
-                        $.extend(data, {
-                            details: 'min'
-                        });
-
-                        $.ajax({
-                            url: createURL('listAccounts'),
-                            data: data,
-                            async: true,
-                            success: function(json) {
-                                var items = json.listaccountsresponse.account;
-                                args.response.success({
-                                    actionFilter: accountActionfilter,
-                                    data: items
-                                });
-                            }
-                        });
-
-                        // SAML: Check Append Domain Setting
-                        if (g_idpList) {
-                            $.ajax({
-                                type: 'GET',
-                                url: createURL('listConfigurations&name=saml2.append.idpdomain'),
-                                dataType: 'json',
-                                async: false,
-                                success: function(data, textStatus, xhr) {
-                                    if (data && data.listconfigurationsresponse && data.listconfigurationsresponse.configuration) {
-                                        g_appendIdpDomain = (data.listconfigurationsresponse.configuration[0].value === 'true');
-                                    }
-                                },
-                                error: function(xhr) {
-                                }
-                            });
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.account.details',
-                        isMaximized: true,
-                        viewAll: {
-                            path: 'accounts.users',
-                            label: 'label.users'
-                        },
-
-                        actions: {
-                            edit: {
-                                label: 'message.edit.account',
-                                compactLabel: 'label.edit',
-                                action: function(args) {
-                                    var accountObj = args.context.accounts[0];
-
-                                    var data = {
-                                        domainid: accountObj.domainid,
-                                        account: accountObj.name,
-                                        newname: args.data.name,
-                                        networkdomain: args.data.networkdomain
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('updateAccount'),
-                                        data: data,
-                                        async: false,
-                                        success: function(json) {
-                                            accountObj = json.updateaccountresponse.account;
-                                        },
-                                        error: function(json) {
-                                            var errorMsg = parseXMLHttpResponse(json);
-                                            args.response.error(errorMsg);
-                                        }
-                                    });
-
-                                    if (args.data.vmLimit != null) {
-                                        var data = {
-                                            resourceType: 0,
-                                            max: args.data.vmLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["vmLimit"] = args.data.vmLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.ipLimit != null) {
-                                        var data = {
-                                            resourceType: 1,
-                                            max: args.data.ipLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["ipLimit"] = args.data.ipLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.volumeLimit != null) {
-                                        var data = {
-                                            resourceType: 2,
-                                            max: args.data.volumeLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["volumeLimit"] = args.data.volumeLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.snapshotLimit != null) {
-                                        var data = {
-                                            resourceType: 3,
-                                            max: args.data.snapshotLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["snapshotLimit"] = args.data.snapshotLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.templateLimit != null) {
-                                        var data = {
-                                            resourceType: 4,
-                                            max: args.data.templateLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["templateLimit"] = args.data.templateLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.vpcLimit != null) {
-                                        var data = {
-                                            resourceType: 7,
-                                            max: args.data.vpcLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["vpcLimit"] = args.data.vpcLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.cpuLimit != null) {
-                                        var data = {
-                                            resourceType: 8,
-                                            max: args.data.cpuLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["cpuLimit"] = args.data.cpuLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.memoryLimit != null) {
-                                        var data = {
-                                            resourceType: 9,
-                                            max: args.data.memoryLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["memoryLimit"] = args.data.memoryLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.networkLimit != null) {
-                                        var data = {
-                                            resourceType: 6,
-                                            max: args.data.networkLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["networkLimit"] = args.data.networkLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.primaryStorageLimit != null) {
-                                        var data = {
-                                            resourceType: 10,
-                                            max: args.data.primaryStorageLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["primaryStorageLimit"] = args.data.primaryStorageLimit;
-                                            }
-                                        });
-                                    }
-
-                                    if (args.data.secondaryStorageLimit != null) {
-                                        var data = {
-                                            resourceType: 11,
-                                            max: args.data.secondaryStorageLimit,
-                                            domainid: accountObj.domainid,
-                                            account: accountObj.name
-                                        };
-
-                                        $.ajax({
-                                            url: createURL('updateResourceLimit'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                accountObj["secondaryStorageLimit"] = args.data.secondaryStorageLimit;
-                                            }
-                                        });
-                                    }
-                                    args.response.success({
-                                        data: accountObj
-                                    });
-                                }
-                            },
-
-                            updateResourceCount: {
-                                label: 'label.action.update.resource.count',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.update.resource.count';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.update.resource.count';
-                                    }
-                                },
-                                action: function(args) {
-                                    var accountObj = args.context.accounts[0];
-                                    var data = {
-                                        domainid: accountObj.domainid,
-                                        account: accountObj.name
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('updateResourceCount'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            var resourcecounts= json.updateresourcecountresponse.resourcecount;
-                                            //pop up API response in a dialog box since only updateResourceCount API returns resourcecount (listResourceLimits API does NOT return resourcecount)
-                                            var msg = '';
-                                            if (resourcecounts != null) {
-                                                for (var i = 0; i < resourcecounts.length; i++) {
-                                                    switch (resourcecounts[i].resourcetype) {
-                                                    case '0':
-                                                        msg += 'Instance'; //vmLimit
-                                                        break;
-                                                    case '1':
-                                                        msg += 'Public IP'; //ipLimit
-                                                        break;
-                                                    case '2':
-                                                        msg += 'Volume'; //volumeLimit
-                                                        break;
-                                                    case '3':
-                                                        msg += 'Snapshot'; //snapshotLimit
-                                                        break;
-                                                    case '4':
-                                                        msg += 'Template'; //templateLimit
-                                                        break;
-                                                    case '5':
-                                                        continue; //resourcetype 5 is not in use. so, skip to next item.
-                                                        break;
-                                                    case '6':
-                                                        msg += 'Network'; //networkLimit
-                                                        break;
-                                                    case '7':
-                                                        msg += 'VPC'; //vpcLimit
-                                                        break;
-                                                    case '8':
-                                                        msg += 'CPU'; //cpuLimit
-                                                        break;
-                                                    case '9':
-                                                        msg += 'Memory'; //memoryLimit
-                                                        break;
-                                                    case '10':
-                                                        msg += 'Primary Storage'; //primaryStorageLimit
-                                                        break;
-                                                    case '11':
-                                                        msg += 'Secondary Storage'; //secondaryStorageLimit
-                                                        break;
-                                                    }
-
-                                                    msg += ' Count: ' + resourcecounts[i].resourcecount + ' <br> ';
-                                                }
-                                            }
-
-
-                                            cloudStack.dialog.notice({
-                                                message: msg
-                                            });
-
-                                            args.response.success();
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            disable: {
-                                label: 'label.action.disable.account',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.disable.account';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.disable.account';
-                                    }
-                                },
-                                action: function(args) {
-                                    var accountObj = args.context.accounts[0];
-                                    var data = {
-                                        lock: false,
-                                        domainid: accountObj.domainid,
-                                        account: accountObj.name
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('disableAccount'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.disableaccountresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.account;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return accountActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            lock: {
-                                label: 'label.action.lock.account',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.lock.account';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.lock.account';
-                                    }
-                                },
-                                action: function(args) {
-                                    var accountObj = args.context.accounts[0];
-                                    var data = {
-                                        lock: true,
-                                        domainid: accountObj.domainid,
-                                        account: accountObj.name
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('disableAccount'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.disableaccountresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.account;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return accountActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.action.enable.account',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.enable.account';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.enable.account';
-                                    }
-                                },
-                                action: function(args) {
-                                    var accountObj = args.context.accounts[0];
-                                    var data = {
-                                        domainid: accountObj.domainid,
-                                        account: accountObj.name
-                                    };
-                                    $.ajax({
-                                        url: createURL('enableAccount'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            args.response.success({
-                                                data: json.enableaccountresponse.account
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                state: 'enabled'
-                                            }
-                                        });
-                                    }
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.account',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.delete.account';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.account';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.accounts[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteAccount'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.deleteaccountresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return {}; //nothing in this account needs to be updated, in fact, this whole account has being deleted
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return accountActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-
-                        },
-
-                        tabFilter: function(args) {
-                            var hiddenTabs = [];
-                            if(!isAdmin()) {
-                                hiddenTabs.push('settings');
-                            }
-                            return hiddenTabs;
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    rolename: {
-                                        label: 'label.role'
-                                    },
-                                    roletype: {
-                                        label: 'label.roletype'
-                                    },
-                                    domainpath: {
-                                        label: 'label.domain'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    networkdomain: {
-                                        label: 'label.network.domain',
-                                        isEditable: true
-                                    },
-                                    vmLimit: {
-                                        label: 'label.instance.limits',
-                                        isEditable: function(context) {
-
-                                            if (context.accounts == undefined)
-                                                return false;
-                                            else {
-                                                if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                    return true;
-                                                else
-                                                    return false;
-                                            }
-                                        }
-                                    },
-                                    ipLimit: {
-                                        label: 'label.ip.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    volumeLimit: {
-                                        label: 'label.volume.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    snapshotLimit: {
-                                        label: 'label.snapshot.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    templateLimit: {
-                                        label: 'label.template.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    vpcLimit: {
-                                        label: 'label.VPC.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    cpuLimit: {
-                                        label: 'label.cpu.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    memoryLimit: {
-                                        label: 'label.memory.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    networkLimit: {
-                                        label: 'label.network.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    primaryStorageLimit: {
-                                        label: 'label.primary.storage.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-                                    secondaryStorageLimit: {
-                                        label: 'label.secondary.storage.limits',
-                                        isEditable: function(context) {
-                                            if (context.accounts[0].accounttype == roleTypeUser || context.accounts[0].accounttype == roleTypeDomainAdmin) //updateResourceLimits is only allowed on account whose type is user or domain-admin
-                                                return true;
-                                            else
-                                                return false;
-                                        }
-                                    },
-
-                                    vmtotal: {
-                                        label: 'label.total.of.vm'
-                                    },
-                                    iptotal: {
-                                        label: 'label.total.of.ip'
-                                    },
-                                    receivedbytes: {
-                                        label: 'label.bytes.received',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    sentbytes: {
-                                        label: 'label.bytes.sent',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return cloudStack.converters.convertBytes(args);
-                                        }
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    var data = {
-                                        id: args.context.accounts[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('listAccounts'),
-                                        data: data,
-                                        success: function(json) {
-                                            var accountObj = json.listaccountsresponse.account[0];
-                                            var data = {
-                                                domainid: accountObj.domainid,
-                                                account: accountObj.name
-                                            };
-                                            $.ajax({
-                                                url: createURL('listResourceLimits'),
-                                                data: data,
-                                                success: function(json) {
-                                                    var limits = json.listresourcelimitsresponse.resourcelimit;
-                                                    if (limits != null) {
-                                                        for (var i = 0; i < limits.length; i++) {
-                                                            var limit = limits[i];
-                                                            switch (limit.resourcetype) {
-                                                                case "0":
-                                                                    accountObj["vmLimit"] = limit.max;
-                                                                    break;
-                                                                case "1":
-                                                                    accountObj["ipLimit"] = limit.max;
-                                                                    break;
-                                                                case "2":
-                                                                    accountObj["volumeLimit"] = limit.max;
-                                                                    break;
-                                                                case "3":
-                                                                    accountObj["snapshotLimit"] = limit.max;
-                                                                    break;
-                                                                case "4":
-                                                                    accountObj["templateLimit"] = limit.max;
-                                                                    break;
-                                                                case "6":
-                                                                    accountObj["networkLimit"] = limit.max;
-                                                                    break;
-                                                                case "7":
-                                                                    accountObj["vpcLimit"] = limit.max;
-                                                                    break;
-                                                                case "8":
-                                                                    accountObj["cpuLimit"] = limit.max;
-                                                                    break;
-                                                                case "9":
-                                                                    accountObj["memoryLimit"] = limit.max;
-                                                                    break;
-                                                                case "10":
-                                                                    accountObj["primaryStorageLimit"] = limit.max;
-                                                                    break;
-                                                                case "11":
-                                                                    accountObj["secondaryStorageLimit"] = limit.max;
-                                                                    break;
-                                                            }
-                                                        }
-                                                    }
-                                                    args.response.success({
-                                                        actionFilter: accountActionfilter,
-                                                        data: accountObj
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            sslCertificates: {
-                                title: 'label.sslcertificates',
-                                listView: {
-                                    id: 'sslCertificates',
-                                    
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        id: {
-                                            label: 'label.certificateid'
-                                        }
-                                    },
-                                    
-                                    dataProvider: function(args) {
-                                        var data = {};
-                                        listViewDataProvider(args, data);
-                                        if (args.context != null) {
-                                            if ("accounts" in args.context) {
-                                                $.extend(data, {
-                                                    accountid: args.context.accounts[0].id
-                                                });
-                                            }
-                                        }
-                                        $.ajax({
-                                            url: createURL('listSslCerts'),
-                                            data: data,
-                                            success: function(json) {
-                                                var items = json.listsslcertsresponse.sslcert;
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    },
-                                    
-                                    actions: {
-                                        add: {
-                                            label: 'label.add.certificate',
-
-                                            messages: {
-                                                notification: function(args) {
-                                                    return 'label.add.certificate';
-                                                }
-                                            },
-
-                                            createForm: {
-                                                title: 'label.add.certificate',
-                                                fields: {
-                                                    name: {
-                                                        label: 'label.name',
-                                                        validation: {
-                                                            required: true
-                                                        }
-                                                    },
-                                                    certificate: {
-                                                        label: 'label.certificate.name',
-                                                        isTextarea: true,
-                                                        validation: {
-                                                            required: true
-                                                        },
-                                                    },
-                                                    privatekey: {
-                                                        label: 'label.privatekey.name',
-                                                        isTextarea: true,
-                                                        validation: {
-                                                            required: true
-                                                        }
-                                                    },
-                                                    certchain: {
-                                                        label: "label.chain",
-                                                        isTextarea: true,
-                                                        validation: {
-                                                            required: false
-                                                        }
-                                                    },
-                                                    password: {
-                                                        label: "label.privatekey.password",
-                                                        isPassword: true,
-                                                        validation: {
-                                                            required: false
-                                                        }
-                                                    }
-                                                }
-                                            },
-
-                                            action: function(args) {
-                                                var data = {
-                                                    name: args.data.name,
-                                                    certificate: args.data.certificate,
-                                                    privatekey: args.data.privatekey
-                                                };
-
-                                                if (args.data.certchain != null && args.data.certchain.length > 0) {
-                                                    $.extend(data, {
-                                                        certchain: args.data.certchain
-                                                    });
-                                                }
-
-                                                if (args.data.password != null && args.data.password.length > 0) {
-                                                    $.extend(data, {
-                                                        password: args.data.password
-                                                    });
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('uploadSslCert'),
-                                                    type: "POST",
-                                                    data: data,
-                                                    success: function(json) {
-                                                        var item = json.uploadsslcertresponse.sslcert;
-                                                        args.response.success({
-                                                            data: item
-                                                        });
-                                                    },
-                                                    error: function(json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    },
-                                    
-                                    detailView: {
-                                        actions: {
-                                            remove: {
-                                                label: 'label.delete.sslcertificate',
-                                                messages: {
-                                                    confirm: function(args) {
-                                                        return 'message.delete.sslcertificate';
-                                                    },
-                                                    notification: function(args) {
-                                                        return 'label.delete.sslcertificate';
-                                                    }
-                                                },
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('deleteSslCert'),
-                                                        data: {
-                                                            id: args.context.sslCertificates[0].id
-                                                        },
-                                                        success: function(json) {
-                                                            var items = json.deletesslcertresponse.sslcert;
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-
-                                        tabs: {
-                                            details: {
-                                                title: 'label.certificate.details',
-                                                fields: {
-                                                    name: {
-                                                        label: 'label.name'
-                                                    },
-                                                    certificate: {
-                                                        label: 'label.certificate.name'
-                                                    },
-                                                    certchain: {
-                                                        label: 'label.chain'
-                                                    }
-                                                },
-
-                                                dataProvider: function(args) {
-                                                    var data = {};
-                                                
-                                                    if (args.context != null) {
-                                                        if ("sslCertificates" in args.context) {
-                                                            $.extend(data, {
-                                                                certid: args.context.sslCertificates[0].id
-                                                            });
-                                                        }
-                                                    }
-                                                    $.ajax({
-                                                        url: createURL('listSslCerts'),
-                                                        data: data,
-                                                        success: function(json) {
-                                                            var items = json.listsslcertsresponse.sslcert[0];
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            },
-
-                            // Granular settings for account
-                            settings: {
-                                title: 'label.settings',
-                                custom: cloudStack.uiCustom.granularSettings({
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('listConfigurations&accountid=' + args.context.accounts[0].id),
-                                            data: listViewDataProvider(args, {}, { searchBy: 'name' }),
-                                            success: function(json) {
-                                                args.response.success({
-                                                    data: json.listconfigurationsresponse.configuration
-                                                });
-
-                                            },
-
-                                            error: function(json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-
-                                            }
-                                        });
-
-                                    },
-                                    actions: {
-                                        edit: function(args) {
-                                            // call updateAccountLevelParameters
-                                            var data = {
-                                                name: args.data.jsonObj.name,
-                                                value: args.data.value
-                                            };
-
-                                            $.ajax({
-                                                url: createURL('updateConfiguration&accountid=' + args.context.accounts[0].id),
-                                                data: data,
-                                                success: function(json) {
-                                                    var item = json.updateconfigurationresponse.configuration;
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                },
-
-                                                error: function(json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-
-                                            });
-
-                                        }
-                                    }
-                                })
-                            }
-                        }
-                    }
-                }
-            },
-            users: {
-                type: 'select',
-                id: 'users',
-                title: 'label.users',
-                listView: {
-                    id: 'users',
-                    fields: {
-                        username: {
-                            label: 'label.username',
-                            editable: true
-                        },
-                        firstname: {
-                            label: 'label.first.name'
-                        },
-                        lastname: {
-                            label: 'label.last.name'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var accountObj = args.context.accounts[0];
-
-                        if (isAdmin() || isDomainAdmin()) {
-                            var data = {
-                                domainid: accountObj.domainid,
-                                account: accountObj.name
-                            };
-                            listViewDataProvider(args, data);
-
-                            $.ajax({
-                                url: createURL('listUsers'),
-                                data: data,
-                                success: function(json) {
-                                    args.response.success({
-                                        actionFilter: userActionfilter,
-                                        data: json.listusersresponse.user
-                                    });
-                                }
-                            })
-                        } else { //normal user doesn't have access listUsers API until Bug 14127 is fixed.
-                            args.response.success({
-                                actionFilter: userActionfilter,
-                                data: accountObj.user
-                            });
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.user',
-
-                            preFilter: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return true;
-                                else
-                                    return false;
-                            },
-
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.user';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.user',
-                                fields: {
-                                    username: {
-                                        label: 'label.username',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpUserUsername'
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        id: 'password',
-                                        docID: 'helpUserPassword'
-                                    },
-                                    'password-confirm': {
-                                        label: 'label.confirm.password',
-                                        docID: 'helpUserConfirmPassword',
-                                        validation: {
-                                            required: true,
-                                            equalTo: '#password'
-                                        },
-                                        isPassword: true
-                                    },
-                                    email: {
-                                        label: 'label.email',
-                                        docID: 'helpUserEmail',
-                                        validation: {
-                                            required: true,
-                                            email: true
-                                        }
-                                    },
-                                    firstname: {
-                                        label: 'label.first.name',
-                                        docID: 'helpUserFirstName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    lastname: {
-                                        label: 'label.last.name',
-                                        docID: 'helpUserLastName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    timezone: {
-                                        label: 'label.timezone',
-                                        docID: 'helpUserTimezone',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            for (var p in timezoneMap)
-                                                items.push({
-                                                    id: p,
-                                                    description: timezoneMap[p]
-                                                });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    samlEnable: {
-                                        label: 'label.saml.enable',
-                                        docID: 'helpSamlEnable',
-                                        isBoolean: true,
-                                        validation: {
-                                            required: false
-                                        },
-                                        isHidden: function (args) {
-                                            if (g_idpList) return false;
-                                            return true;
-                                        }
-                                    },
-                                    samlEntity: {
-                                        label: 'label.saml.entity',
-                                        docID: 'helpSamlEntity',
-                                        validation: {
-                                            required: false
-                                        },
-                                        select: function(args) {
-                                            var samlChecked = false;
-                                            var idpUrl = args.$form.find('select[name=samlEntity]').children(':selected').val();
-                                            var appendDomainToUsername = function() {
-                                                if (!g_appendIdpDomain) {
-                                                    return;
-                                                }
-                                                var username = args.$form.find('input[name=username]').val();
-                                                if (username) {
-                                                    username = username.split('@')[0];
-                                                }
-                                                if (samlChecked) {
-                                                    var link = document.createElement('a');
-                                                    link.setAttribute('href', idpUrl);
-                                                    args.$form.find('input[name=username]').val(username + "@" + link.host.split('.').splice(-2).join('.'));
-                                                } else {
-                                                    args.$form.find('input[name=username]').val(username);
-                                                }
-                                            };
-                                            args.$form.find('select[name=samlEntity]').change(function() {
-                                                idpUrl = $(this).children(':selected').val();
-                                                appendDomainToUsername();
-                                            });
-                                            args.$form.find('input[name=samlEnable]').change(function() {
-                                                samlChecked = $(this).context.checked;
-                                                appendDomainToUsername();
-                                            });
-
-                                            var items = [];
-                                            $(g_idpList).each(function() {
-                                                items.push({
-                                                    id: this.id,
-                                                    description: this.orgName
-                                                });
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        },
-                                        isHidden: function (args) {
-                                            if (g_idpList) return false;
-                                            return true;
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var accountObj = args.context.accounts[0];
-
-                                var data = {
-                                    username: args.data.username
-                                };
-
-                                var password = args.data.password;
-                                $.extend(data, {
-                                    password: password
-                                });
-
-                                $.extend(data, {
-                                    email: args.data.email,
-                                    firstname: args.data.firstname,
-                                    lastname: args.data.lastname
-                                });
-
-                                if (args.data.timezone != null && args.data.timezone.length > 0) {
-                                    $.extend(data, {
-                                        timezone: args.data.timezone
-                                    });
-                                }
-
-                                $.extend(data, {
-                                    domainid: accountObj.domainid,
-                                    account: accountObj.name,
-                                    accounttype: accountObj.accounttype
-                                });
-
-
-                                var authorizeUsersForSamlSSO = function (users, entity) {
-                                    for (var i = 0; i < users.length; i++) {
-                                        $.ajax({
-                                            url: createURL('authorizeSamlSso&enable=true&userid=' + users[i].id + "&entityid=" + entity),
-                                            error: function(XMLHttpResponse) {
-                                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                            }
-                                        });
-                                    }
-                                    return;
-                                };
-
-                                $.ajax({
-                                    url: createURL('createUser'),
-                                    type: "POST",
-                                    data: data,
-                                    success: function(json) {
-                                        var item = json.createuserresponse.user;
-                                        if (args.data.samlEnable && args.data.samlEnable === 'on') {
-                                            var entity = args.data.samlEntity;
-                                            if (item && entity)
-                                                authorizeUsersForSamlSSO([item], entity);
-                                        }
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function(XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.user.details',
-                        isMaximized: true,
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.users[0].id,
-                                        username: args.data.username,
-                                        email: args.data.email,
-                                        firstname: args.data.firstname,
-                                        lastname: args.data.lastname,
-                                        timezone: args.data.timezone
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateUser'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updateuserresponse.user;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-
-                                }
-                            },
-
-                            changePassword: {
-                                label: 'label.action.change.password',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.change.password';
-                                    }
-                                },
-
-                                action: {
-                                    custom: function(args) {
-                                        var start = args.start;
-                                        var complete = args.complete;
-                                        var context = args.context;
-
-                                        var userSource = context.users[0].usersource;
-                                        if (userSource == "native") {
-                                            cloudStack.dialog.createForm({
-                                                form: {
-                                                    title: 'label.action.change.password',
-                                                    fields: {
-                                                        currentPassword: {
-                                                            label: 'label.current.password',
-                                                            isPassword: true,
-                                                            validation: {
-                                                                required: !(isAdmin() || isDomainAdmin())
-                                                            },
-                                                            id: 'currentPassword'
-                                                        },
-                                                        newPassword: {
-                                                            label: 'label.new.password',
-                                                            isPassword: true,
-                                                            validation: {
-                                                                required: true
-                                                            },
-                                                            id: 'newPassword'
-                                                        },
-                                                        'password-confirm': {
-                                                            label: 'label.confirm.password',
-                                                            validation: {
-                                                                required: true,
-                                                                equalTo: '#newPassword'
-                                                            },
-                                                            isPassword: true
-                                                        }
-                                                    }
-                                                },
-                                                after: function(args) {
-                                                    start();
-                                                    var currentPassword = args.data.currentPassword;
-                                                    var password = args.data.newPassword;
-                                                    $.ajax({
-                                                        url: createURL('updateUser'),
-                                                        data: {
-                                                            id: context.users[0].id,
-                                                            currentPassword: currentPassword,
-                                                            password: password
-                                                        },
-                                                        type: "POST",
-                                                        success: function(json) {
-                                                            complete();
-                                                        },
-                                                        error: function(json) {
-                                                            complete({ error: parseXMLHttpResponse(json) });
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                            if(isAdmin() || isDomainAdmin()){
-                                                $('div[rel=currentPassword]').hide();
-                                            }
-                                        } else {
-                                            cloudStack.dialog.notice({ message: _l('error.could.not.change.your.password.because.non.native.user') });
-                                        }
-                                    }
-                                }
-                            },
-
-                            configureSamlAuthorization: {
-                                label: 'label.action.configure.samlauthorization',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.configure.samlauthorization';
-                                    }
-                                },
-                                action: {
-                                    custom: function(args) {
-                                        var start = args.start;
-                                        var complete = args.complete;
-                                        var context = args.context;
-
-                                        if (g_idpList) {
-                                            $.ajax({
-                                                url: createURL('listSamlAuthorization'),
-                                                data: {
-                                                    userid: context.users[0].id
-                                                },
-                                                success: function(json) {
-                                                    var authorization = json.listsamlauthorizationsresponse.samlauthorization[0];
-                                                    cloudStack.dialog.createForm({
-                                                        form: {
-                                                            title: 'label.action.configure.samlauthorization',
-                                                            fields: {
-                                                                samlEnable: {
-                                                                    label: 'label.saml.enable',
-                                                                    docID: 'helpSamlEnable',
-                                                                    isBoolean: true,
-                                                                    isChecked: authorization.status,
-                                                                    validation: {
-                                                                        required: false
-                                                                    }
-                                                                },
-                                                                samlEntity: {
-                                                                    label: 'label.saml.entity',
-                                                                    docID: 'helpSamlEntity',
-                                                                    validation: {
-                                                                        required: false
-                                                                    },
-                                                                    select: function(args) {
-                                                                        var items = [];
-                                                                        $(g_idpList).each(function() {
-                                                                            items.push({
-                                                                                id: this.id,
-                                                                                description: this.orgName
-                                                                            });
-                                                                        });
-                                                                        args.response.success({
-                                                                            data: items
-                                                                        });
-                                                                        args.$select.change(function() {
-                                                                            $('select[name="samlEntity"] option[value="' + authorization.idpid  + '"]').attr("selected", "selected");
-                                                                        });
-                                                                    }
-                                                                }
-                                                            }
-                                                        },
-                                                        after: function(args) {
-                                                            start();
-                                                            var enableSaml = false;
-                                                            var idpId = '';
-                                                            if (args.data.hasOwnProperty('samlEnable')) {
-                                                                enableSaml = (args.data.samlEnable === 'on');
-                                                            }
-                                                            if (args.data.hasOwnProperty('samlEntity')) {
-                                                                idpId = args.data.samlEntity;
-                                                            }
-                                                            $.ajax({
-                                                                url: createURL('authorizeSamlSso'),
-                                                                data: {
-                                                                    userid: context.users[0].id,
-                                                                    enable: enableSaml,
-                                                                    entityid: idpId
-                                                                },
-                                                                type: "POST",
-                                                                success: function(json) {
-                                                                    complete();
-                                                                },
-                                                                error: function(json) {
-                                                                    complete({ error: parseXMLHttpResponse(json) });
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                error: function(json) {
-                                                    complete({ error: parseXMLHttpResponse(json) });
-                                                }
-                                            });
-
-                                        }
-                                    }
-                                }
-                            },
-
-                            generateKeys: {
-                                label: 'label.action.generate.keys',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.generate.keys';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.generate.keys';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.users[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('registerUserKeys'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success({
-                                                data: json.registeruserkeysresponse.userkeys
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            disable: {
-                                label: 'label.action.disable.user',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.disable.user';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.disable.user';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.users[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('disableUser'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.disableuserresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.user;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return userActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.action.enable.user',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.enable.user';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.enable.user';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.users[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('enableUser'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success({
-                                                data: json.enableuserresponse.user
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.user',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.delete.user';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.user';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.users[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteUser'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success();
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    username: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    account: {
-                                        label: 'label.account.name'
-                                    },
-                                    rolename: {
-                                        label: 'label.role'
-                                    },
-                                    roletype: {
-                                        label: 'label.roletype'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    apikey: {
-                                        label: 'label.api.key',
-                                        isCopyPaste: true
-                                    },
-                                    secretkey: {
-                                        label: 'label.secret.key',
-                                        isCopyPaste: true
-                                    },
-                                    email: {
-                                        label: 'label.email',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true,
-                                            email: true
-                                        }
-                                    },
-                                    firstname: {
-                                        label: 'label.first.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    lastname: {
-                                        label: 'label.last.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    timezone: {
-                                        label: 'label.timezone',
-                                        converter: function(args) {
-                                            if (args == null || args.length == 0)
-                                                return "";
-                                            else
-                                                return args;
-                                        },
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            for (var p in timezoneMap)
-                                                items.push({
-                                                    id: p,
-                                                    description: timezoneMap[p]
-                                                });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listUsers'),
-                                            data: {
-                                                id: args.context.users[0].id
-                                            },
-                                            success: function(json) {
-                                                var items = json.listusersresponse.user[0];
-                                                    $.ajax({
-                                                        url: createURL('getUserKeys'),//change
-                                                        data: {
-                                                            id: args.context.users[0].id//change
-                                                        },
-                                                        success: function(json) {
-                                                            $.extend(items, {
-                                                                secretkey: json.getuserkeysresponse.userkeys.secretkey//change
-                                                            });
-                                                        args.response.success({
-                                                            actionFilter: userActionfilter,
-                                                                data: items
-                                                        });
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    else { //normal user doesn't have access listUsers API until Bug 14127 is fixed.
-                                        args.response.success({
-                                            actionFilter: userActionfilter,
-                                            data: args.context.users[0]
-                                        });
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            sshkeypairs: {
-                type: 'select',
-                id: 'sshkeypairs',
-                title: 'label.ssh.key.pairs',
-                listView: {
-                    name: 'sshkeypairs',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        domain: {
-                           label: 'label.domain'
-                        },
-                        account: {
-                           label: 'label.account'
-                        },
-                        privatekey: {
-                            label: 'label.private.key',
-                            span: false
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {
-//                            domainid: g_domainid,
-//                            account: g_account
-                        };
-
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listSSHKeyPairs'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listsshkeypairsresponse.sshkeypair;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.create.ssh.key.pair',
-
-                            preFilter: function(args) {
-                                return true;
-                            },
-
-                            messages: {
-                                notification: function(args) {
-                                    return _l('message.desc.created.ssh.key.pair');
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.create.ssh.key.pair',
-                                desc: 'message.desc.create.ssh.key.pair',
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    publickey: {
-                                        label: 'label.public.key'
-                                    },
-                                    domain: {
-                                        label: 'label.domain',
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin())
-                                                return false;
-                                            else
-                                                return true;
-                                        },
-                                        select: function(args) {
-                                            if (isAdmin() || isDomainAdmin()) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        items.push({
-                                                            id: "",
-                                                            description: ""
-                                                        });
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        $(domainObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.path
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                                args.$select.change(function() {
-                                                    var $form = $(this).closest('form');
-                                                    if ($(this).val() == "") {
-                                                        $form.find('.form-item[rel=account]').hide();
-                                                    } else {
-                                                        $form.find('.form-item[rel=account]').css('display', 'inline-block');
-                                                    }
-                                                });
-                                            } else {
-                                                var items = [];
-                                                items.push({
-                                                    id: "",
-                                                    description: ""
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        }
-                                    },
-                                    account: {
-                                        label: 'label.account',
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin())
-                                                return false;
-                                            else
-                                                return true;
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-
-                                var data = {
-                                    name: args.data.name
-                                };
-
-                                if (args.data.domain != null && args.data.domain.length > 0) {
-                                    $.extend(data, {
-                                        domainid: args.data.domain
-                                    });
-                                    if (args.data.account != null && args.data.account.length > 0) {
-                                        $.extend(data, {
-                                            account: args.data.account
-                                        });
-                                    }
-                                }
-
-                                if (args.data.publickey != null && args.data.publickey.length > 0) {
-                                    $.extend(data, {
-                                        publickey: args.data.publickey
-                                    });
-                                    $.ajax({
-                                        url: createURL('registerSSHKeyPair'),
-                                        data: data,
-                                        type: "POST",
-                                        success: function(json) {
-                                            var item = json.registersshkeypairresponse.keypair;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            args.response.error(errorMsg);
-                                        }
-                                    });
-                                } else {
-                                    $.ajax({
-                                        url: createURL('createSSHKeyPair'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.createsshkeypairresponse.keypair;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            args.response.error(errorMsg);
-                                        }
-                                    });
-                                }
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.ssh.key.pair.details',
-                        isMaximized: true,
-                        viewAll: {
-                            label: 'label.instances',
-                            path: 'instances'
-                        },
-                        actions: {
-                            remove: {
-                                label: 'label.remove.ssh.key.pair',
-                                messages: {
-                                    confirm: function(args) {
-                                        return _l('message.please.confirm.remove.ssh.key.pair');
-                                    },
-                                    notification: function(args) {
-                                        return _l('message.removed.ssh.key.pair');
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        name: args.context.sshkeypairs[0].name
-                                    };
-                                    if (!args.context.projects) {
-                                        $.extend(data, {
-                                            domainid: args.context.sshkeypairs[0].domainid,
-                                            account: args.context.sshkeypairs[0].account
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('deleteSSHKeyPair'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success();
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    privatekey: {
-                                        label: 'label.private.key',
-                                        span: false
-                                    },
-                                    fingerprint: {
-                                        label: 'label.fingerprint'
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    var data = {
-                                        name: args.context.sshkeypairs[0].name
-                                    };
-                                    $.ajax({
-                                        url: createURL('listSSHKeyPairs&listAll=true'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success({
-                                                actionFilter: sshkeypairActionfilter,
-                                                data: json.listsshkeypairsresponse.sshkeypair[0]
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    var accountActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-
-        if (jsonObj.state == 'Destroyed') return [];
-
-        if (isAdmin() && jsonObj.isdefault == false)
-            allowedActions.push("remove");
-
-        if (isAdmin()) {
-            allowedActions.push("edit"); //updating networkdomain is allowed on any account, including system-generated default admin account
-            if (!(jsonObj.domain == "ROOT" && jsonObj.name == "admin" && jsonObj.accounttype == 1)) { //if not system-generated default admin account
-                if (jsonObj.state == "enabled") {
-                    allowedActions.push("disable");
-                    allowedActions.push("lock");
-                } else if (jsonObj.state == "disabled" || jsonObj.state == "locked") {
-                    allowedActions.push("enable");
-                }
-                allowedActions.push("remove");
-            }
-            allowedActions.push("updateResourceCount");
-        } else if (isDomainAdmin()) {
-            if (jsonObj.name != g_account) {
-                allowedActions.push("edit"); //updating networkdomain is allowed on any account, including system-generated default admin account
-                if (jsonObj.state == "enabled") {
-                    allowedActions.push("disable");
-                    allowedActions.push("lock");
-                } else if (jsonObj.state == "disabled" || jsonObj.state == "locked") {
-                    allowedActions.push("enable");
-                }
-                allowedActions.push("remove");
-            }
-            allowedActions.push("updateResourceCount");
-        }
-        return allowedActions;
-    }
-
-    var userActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-
-        if (isAdmin() && jsonObj.isdefault == false)
-            allowedActions.push("remove");
-
-        if (isAdmin()) {
-            allowedActions.push("edit");
-            allowedActions.push("changePassword");
-            allowedActions.push("generateKeys");
-            if (g_idpList) {
-                allowedActions.push("configureSamlAuthorization");
-            }
-            if (!(jsonObj.domain == "ROOT" && jsonObj.account == "admin" && jsonObj.accounttype == 1)) { //if not system-generated default admin account user
-                if (jsonObj.state == "enabled")
-                    allowedActions.push("disable");
-                if (jsonObj.state == "disabled")
-                    allowedActions.push("enable");
-                allowedActions.push("remove");
-            }
-        } else { //domain-admin, regular-user
-            if (jsonObj.username == g_username) { //selected user is self
-                allowedActions.push("changePassword");
-                allowedActions.push("generateKeys");
-            } else if (isDomainAdmin()) { //if selected user is not self, and the current login is domain-admin
-                allowedActions.push("edit");
-                if (jsonObj.state == "enabled")
-                    allowedActions.push("disable");
-                if (jsonObj.state == "disabled")
-                    allowedActions.push("enable");
-                allowedActions.push("remove");
-
-                allowedActions.push("changePassword");
-                allowedActions.push("generateKeys");
-                if (g_idpList) {
-                    allowedActions.push("configureSamlAuthorization");
-                }
-            }
-        }
-        return allowedActions;
-    }
-
-    var sshkeypairActionfilter = function(args) {
-        var allowedActions = [];
-        allowedActions.push("remove");
-        return allowedActions;
-    }
-})(cloudStack);
diff --git a/ui/legacy/scripts/accountsWizard.js b/ui/legacy/scripts/accountsWizard.js
deleted file mode 100644
index 3f87ea8..0000000
--- a/ui/legacy/scripts/accountsWizard.js
+++ /dev/null
@@ -1,341 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function(cloudStack, $) {
-    var rootDomainId;
-
-
-    cloudStack.accountsWizard = {
-
-        informationWithinLdap: {
-            username: {
-                label: 'label.username',
-                validation: {
-                    required: true
-                },
-                docID: 'helpAccountUsername'
-            },
-            password: {
-                label: 'label.password',
-                validation: {
-                    required: true
-                },
-                isPassword: true,
-                id: 'password',
-                docID: 'helpAccountPassword'
-            },
-            'password-confirm': {
-                label: 'label.confirm.password',
-                validation: {
-                    required: true,
-                    equalTo: '#password'
-                },
-                isPassword: true,
-                docID: 'helpAccountConfirmPassword'
-            },
-            email: {
-                label: 'label.email',
-                validation: {
-                    required: true,
-                    email: true
-                },
-                docID: 'helpAccountEmail'
-            },
-            firstname: {
-                label: 'label.first.name',
-                validation: {
-                    required: true
-                },
-                docID: 'helpAccountFirstName'
-            },
-            lastname: {
-                label: 'label.last.name',
-                validation: {
-                    required: true
-                },
-                docID: 'helpAccountLastName'
-            },
-            conflictingusersource: {
-                 label: 'label.user.conflict',
-                 validation: {
-                     required: true
-                 },
-                 docID: 'helpConflictSource'
-             }
-        },
-
-        informationNotInLdap: {
-            filter: {
-                label: 'label.filterBy',
-                docID: 'helpLdapUserFilter',
-                select: function(args) {
-                    var items = [];
-                    items.push({
-                        id: "NoFilter",
-                        description: "No filter"
-                    });
-                    items.push({
-                        id: "LocalDomain",
-                        description: "Local domain"
-                    });
-                    items.push({
-                        id: "AnyDomain",
-                        description: "Any domain"
-                    });
-                    items.push({
-                        id: "PotentialImport",
-                        description: "Potential import"
-                    });
-                    args.response.success({
-                        data: items
-                    });
-                }
-            },
-            domainid: {
-                label: 'label.domain',
-                docID: 'helpAccountDomain',
-                validation: {
-                    required: true
-                },
-                select: function(args) {
-                    $.ajax({
-                        url: createURL("listDomains"),
-                        success: function(json) {
-                            var items = [];
-                            domainObjs = json.listdomainsresponse.domain;
-                            $(domainObjs).each(function() {
-                                items.push({
-                                    id: this.id,
-                                    description: this.path
-                                });
-
-                                if (this.level === 0)
-                                    rootDomainId = this.id;
-                            });
-                            items.sort(function(a, b) {
-                                return a.description.localeCompare(b.description);
-                            });
-                            args.response.success({
-                                data: items
-                            });
-                        }
-                    });
-                }
-            },
-            account: {
-                label: 'label.account',
-                docID: 'helpAccountAccount',
-                validation: {
-                    required: false
-                }
-            },
-            roleid: {
-                label: 'label.role',
-                docID: 'helpAccountType',
-                validation: {
-                    required: true
-                },
-                select: function(args) {
-                    $.ajax({
-                        url: createURL("listRoles"),
-                        success: function(json) {
-                            var items = [];
-                            roleObjs = json.listrolesresponse.role;
-                            $(roleObjs).each(function() {
-                                items.push({
-                                    id: this.id,
-                                    description: this.name + ' (' + this.type + ')'
-                                });
-                            });
-                            args.response.success({
-                                data: items
-                            });
-                        }
-                    });
-                }
-            },
-            timezone: {
-                label: 'label.timezone',
-                docID: 'helpAccountTimezone',
-                select: function(args) {
-                    var items = [];
-                    items.push({
-                        id: "",
-                        description: ""
-                    });
-                    for (var p in timezoneMap)
-                        items.push({
-                            id: p,
-                            description: timezoneMap[p]
-                        });
-                    args.response.success({
-                        data: items
-                    });
-                }
-            },
-            networkdomain: {
-                label: 'label.network.domain',
-                docID: 'helpAccountNetworkDomain',
-                validation: {
-                    required: false
-                }
-            },
-            ldapGroupName: {
-                label: 'label.ldap.group.name',
-                docID: 'helpLdapGroupName',
-                validation: {
-                    required: false
-                }
-            },
-            samlEnable: {
-                label: 'label.saml.enable',
-                docID: 'helpSamlEnable',
-                isBoolean: true,
-                validation: {
-                    required: false
-                }
-            },
-            samlEntity: {
-                label: 'label.saml.entity',
-                docID: 'helpSamlEntity',
-                validation: {
-                    required: false
-                },
-                select: function(args) {
-                    var items = [];
-                    $(g_idpList).each(function() {
-                        items.push({
-                            id: this.id,
-                            description: this.orgName
-                        });
-                    });
-                    args.response.success({
-                        data: items
-                    });
-                }
-            }
-        },
-
-        action: function(args) {
-            var array1 = [];
-            var ldapStatus = args.isLdap;
-            if (args.username) {
-                array1.push("&username=" + args.username);
-            }
-
-            if (!ldapStatus) {
-                array1.push("&email=" + args.data.email);
-                array1.push("&firstname=" + args.data.firstname);
-                array1.push("&lastname=" + args.data.lastname);
-
-                cloudStack.addPasswordToCommandUrlParameterArray(array1, args.data.password);
-            }
-
-            array1.push("&domainid=" + args.data.domainid);
-
-            var account = args.data.account;
-
-            if (account !== null && account.length > 0) {
-                array1.push("&account=" + account);
-            }
-
-            if (args.data.roleid) {
-                array1.push("&roleid=" + args.data.roleid);
-            }
-
-            if (args.data.timezone !== null && args.data.timezone.length > 0) {
-                array1.push("&timezone=" + args.data.timezone);
-            }
-
-            if (args.data.networkdomain !== null && args.data.networkdomain.length > 0) {
-                array1.push("&networkdomain=" + args.data.networkdomain);
-            }
-            if (args.groupname && args.groupname !== null && args.groupname.length > 0) {
-                array1.push("&group=" + args.groupname);
-            }
-
-            var authorizeUsersForSamlSSO = function (users, entity) {
-                for (var i = 0; i < users.length; i++) {
-                    $.ajax({
-                        url: createURL('authorizeSamlSso&enable=true&userid=' + users[i].id + "&entityid=" + entity),
-                        error: function(XMLHttpResponse) {
-                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                        }
-                    });
-                }
-                return;
-            };
-
-            if (ldapStatus) {
-                if (args.groupname) {
-                    $.ajax({
-                        url: createURL('importLdapUsers' + array1.join("")),
-                        dataType: "json",
-                        type: "POST",
-                        async: false,
-                        success: function (json) {
-                            if (json.ldapuserresponse && args.data.samlEnable && args.data.samlEnable === 'on') {
-                                cloudStack.dialog.notice({
-                                    message: "Unable to find users IDs to enable SAML Single Sign On, kindly enable it manually."
-                                });
-                            }
-                        },
-                        error: function(XMLHttpResponse) {
-                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                        }
-                    });
-                } else if (args.username) {
-                    $.ajax({
-                        url: createURL('ldapCreateAccount' + array1.join("")),
-                        dataType: "json",
-                        type: "POST",
-                        async: false,
-                        success: function(json) {
-                            if (args.data.samlEnable && args.data.samlEnable === 'on') {
-                                var users = json.createaccountresponse.account.user;
-                                var entity = args.data.samlEntity;
-                                if (users && entity)
-                                    authorizeUsersForSamlSSO(users, entity);
-                            }
-                        },
-                        error: function(XMLHttpResponse) {
-                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                        }
-                    });
-                }
-            } else {
-                $.ajax({
-                    url: createURL('createAccount' + array1.join("")),
-                    dataType: "json",
-                    type: "POST",
-                    async: false,
-                    success: function(json) {
-                        if (args.data.samlEnable && args.data.samlEnable === 'on') {
-                            var users = json.createaccountresponse.account.user;
-                            var entity = args.data.samlEntity;
-                            if (users && entity)
-                                authorizeUsersForSamlSSO(users, entity);
-                        }
-                    },
-                    error: function(XMLHttpResponse) {
-                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                    }
-                });
-            }
-        }
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/affinity.js b/ui/legacy/scripts/affinity.js
deleted file mode 100644
index aecb4d6..0000000
--- a/ui/legacy/scripts/affinity.js
+++ /dev/null
@@ -1,219 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-    cloudStack.sections.affinityGroups = {
-        title: 'label.affinity.groups',
-        listView: {
-            id: 'affinityGroups',
-            fields: {
-                name: {
-                    label: 'label.name'
-                },
-                type: {
-                    label: 'label.type'
-                }
-            },
-            dataProvider: function(args) {
-                var data = {};
-                listViewDataProvider(args, data);
-                if (args.context != null) {
-                    if ("instances" in args.context) {
-                        $.extend(data, {
-                            virtualmachineid: args.context.instances[0].id
-                        });
-                    }
-                }
-                $.ajax({
-                    url: createURL('listAffinityGroups'),
-                    data: data,
-                    success: function(json) {
-                        var items = json.listaffinitygroupsresponse.affinitygroup;
-                        args.response.success({
-                            data: items
-                        });
-                    }
-                });
-            },
-            actions: {
-                add: {
-                    label: 'label.add.affinity.group',
-
-                    messages: {
-                        notification: function(args) {
-                            return 'label.add.affinity.group';
-                        }
-                    },
-
-                    createForm: {
-                        title: 'label.add.affinity.group',
-                        fields: {
-                            name: {
-                                label: 'label.name',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            description: {
-                                label: 'label.description'
-                            },
-                            type: {
-                                label: 'label.type',
-                                select: function(args) {
-                                    $.ajax({
-                                        url: createURL('listAffinityGroupTypes'),
-                                        success: function(json) {
-                                            var types = [];
-                                            var items = json.listaffinitygrouptypesresponse.affinityGroupType;
-                                            if (items != null) {
-                                                for (var i = 0; i < items.length; i++) {
-                                                    types.push({
-                                                        id: items[i].type,
-                                                        description: items[i].type
-                                                    });
-                                                }
-                                            }
-                                            args.response.success({
-                                                data: types
-                                            })
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    },
-
-                    action: function(args) {
-                        var data = {
-                            name: args.data.name,
-                            type: args.data.type
-                        };
-                        if (args.data.description != null && args.data.description.length > 0)
-                            $.extend(data, {
-                                description: args.data.description
-                            });
-
-                        $.ajax({
-                            url: createURL('createAffinityGroup'),
-                            data: data,
-                            success: function(json) {
-                                var jid = json.createaffinitygroupresponse.jobid;
-                                args.response.success({
-                                    _custom: {
-                                        jobId: jid,
-                                        getUpdatedItem: function(json) {
-                                            return json.queryasyncjobresultresponse.jobresult.affinitygroup;
-                                        }
-                                    }
-                                });
-                            }
-                        });
-                    },
-
-                    notification: {
-                        poll: pollAsyncJobResult
-                    }
-                }
-            },
-            detailView: {
-                actions: {
-                    remove: {
-                        label: 'label.delete.affinity.group',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.delete.affinity.group';
-                            },
-                            notification: function(args) {
-                                return 'label.delete.affinity.group';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL('deleteAffinityGroup'),
-                                data: {
-                                    id: args.context.affinityGroups[0].id
-                                },
-                                success: function(json) {
-                                    var jid = json.deleteaffinitygroupresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    }
-                },
-
-                viewAll: {
-                    path: 'instances',
-                    label: 'label.instances'
-                },
-
-                tabs: {
-                    details: {
-                        title: 'label.details',
-                        fields: [{
-                            name: {
-                                label: 'label.name'
-                            }
-                        }, {
-                            description: {
-                                label: 'label.description'
-                            },
-                            type: {
-                                label: 'label.type'
-                            },
-                            id: {
-                                label: 'label.id'
-                            }
-                        }],
-
-                        dataProvider: function(args) {
-                            $.ajax({
-                                url: createURL('listAffinityGroups'),
-                                data: {
-                                    id: args.context.affinityGroups[0].id
-                                },
-                                success: function(json) {
-                                    var item = json.listaffinitygroupsresponse.affinitygroup[0];
-                                    args.response.success({
-                                        actionFilter: affinitygroupActionfilter,
-                                        data: item
-                                    });
-                                }
-                            });
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    var affinitygroupActionfilter = cloudStack.actionFilter.affinitygroupActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        if (jsonObj.type != 'ExplicitDedication' || isAdmin()) {
-            allowedActions.push("remove");
-        }
-        return allowedActions;
-    }
-
-})(cloudStack);
diff --git a/ui/legacy/scripts/autoscaler.js b/ui/legacy/scripts/autoscaler.js
deleted file mode 100644
index da963fc..0000000
--- a/ui/legacy/scripts/autoscaler.js
+++ /dev/null
@@ -1,1489 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudstack) {
-    var scaleUpData = [];
-    var totalScaleUpCondition = 0;
-    var scaleDownData = [];
-    var totalScaleDownCondition = 0;
-
-    cloudStack.autoscaler = {
-        // UI actions to appear in dialog
-        autoscaleActions: {
-            enable: {
-                label: 'label.enable.autoscale',
-                action: function(args) {
-                    $.ajax({
-                        url: createURL('enableAutoScaleVmGroup'),
-                        data: {
-                            id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id
-                        },
-                        success: function(json) {
-                            var jid = json.enableautoscalevmGroupresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        return json.queryasyncjobresultresponse.jobresult.autoscalevmgroup;
-                                    },
-                                    getActionFilter: function() {
-                                        return cloudStack.autoscaler.actionFilter;
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        }
-                    });
-                }
-            },
-            disable: {
-                label: 'label.disable.autoscale',
-                action: function(args) {
-                    $.ajax({
-                        url: createURL('disableAutoScaleVmGroup'),
-                        data: {
-                            id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id
-                        },
-                        success: function(json) {
-                            var jid = json.disableautoscalevmGroupresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        return json.queryasyncjobresultresponse.jobresult.autoscalevmgroup;
-                                    },
-                                    getActionFilter: function() {
-                                        return cloudStack.autoscaler.actionFilter;
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        }
-                    });
-                }
-            }
-        },
-        actionFilter: function(args) {
-            var allowedActions = [];
-            if (args.context.originalAutoscaleData == null) { //new LB rule
-                //no actions  for new LB rule
-            } else { //existing LB rule
-                if (args.context.originalAutoscaleData[0].afterActionIsComplete == null) {
-                    if (args.context.originalAutoscaleData[0].context.autoscaleVmGroup.state == 'disabled')
-                        allowedActions.push('enable');
-                    else if (args.context.originalAutoscaleData[0].context.autoscaleVmGroup.state == 'enabled')
-                        allowedActions.push('disable');
-                } else {
-                    if (args.context.originalAutoscaleData[0].afterActionIsComplete.state == 'disabled')
-                        allowedActions.push('enable');
-                    else if (args.context.originalAutoscaleData[0].afterActionIsComplete.state == 'enabled')
-                        allowedActions.push('disable');
-                }
-            }
-            return allowedActions;
-        },
-        dataProvider: function(args) {
-            // Reset data
-            scaleUpData = [];
-            totalScaleUpCondition = 0;
-            scaleDownData = [];
-            totalScaleDownCondition = 0;
-
-            if (!('multiRules' in args.context)) { //from a new LB
-                args.response.success({
-                    data: null
-                });
-            } else { //from an existing LB
-                $.ajax({
-                    url: createURL('listAutoScaleVmGroups'),
-                    data: {
-                        listAll: true,
-                        lbruleid: args.context.multiRules[0].id
-                    },
-                    success: function(json) {
-                        var autoscaleVmGroup = json.listautoscalevmgroupsresponse.autoscalevmgroup[0];
-
-                        $.ajax({
-                            url: createURL('listAutoScaleVmProfiles'),
-                            data: {
-                                listAll: true,
-                                id: autoscaleVmGroup.vmprofileid
-                            },
-                            success: function(json) {
-                                var autoscaleVmProfile = json.listautoscalevmprofilesresponse.autoscalevmprofile[0];
-
-                                var scaleUpPolicy = {
-                                    id: autoscaleVmGroup.scaleuppolicies[0].id,
-                                    duration: autoscaleVmGroup.scaleuppolicies[0].duration,
-                                    conditions: []
-                                };
-                                $(autoscaleVmGroup.scaleuppolicies[0].conditions).each(function() {
-                                    var condition = {
-                                        id: this.id,
-                                        counterid: this.counter[0].id,
-                                        relationaloperator: this.relationaloperator,
-                                        threshold: this.threshold
-                                    };
-                                    scaleUpPolicy.conditions.push(condition);
-                                });
-
-                                var scaleDownPolicy = {
-                                    id: autoscaleVmGroup.scaledownpolicies[0].id,
-                                    duration: autoscaleVmGroup.scaledownpolicies[0].duration,
-                                    conditions: []
-                                };
-                                $(autoscaleVmGroup.scaledownpolicies[0].conditions).each(function() {
-                                    var condition = {
-                                        id: this.id,
-                                        counterid: this.counter[0].id,
-                                        relationaloperator: this.relationaloperator,
-                                        threshold: this.threshold.toString()
-                                    };
-                                    scaleDownPolicy.conditions.push(condition);
-                                });
-
-                                var diskOfferingId, securityGroups;
-                                var otherdeployparams = autoscaleVmProfile.otherdeployparams;
-                                if (otherdeployparams != null && otherdeployparams.length > 0) {
-                                    var array1 = otherdeployparams.split('&');
-                                    $(array1).each(function() {
-                                        var array2 = this.split('=');
-                                        if (array2[0] == 'diskofferingid')
-                                            diskOfferingId = array2[1];
-                                        if (array2[0] == 'securitygroupids')
-                                            securityGroups = array2[1];
-                                    });
-                                }
-
-                                var originalAutoscaleData = {
-                                    templateNames: autoscaleVmProfile.templateid,
-                                    serviceOfferingId: autoscaleVmProfile.serviceofferingid,
-                                    minInstance: autoscaleVmGroup.minmembers,
-                                    maxInstance: autoscaleVmGroup.maxmembers,
-                                    scaleUpPolicy: scaleUpPolicy,
-                                    scaleDownPolicy: scaleDownPolicy,
-                                    interval: autoscaleVmGroup.interval,
-                                    quietTime: autoscaleVmGroup.scaleuppolicies[0].quiettime,
-                                    destroyVMgracePeriod: autoscaleVmProfile.destroyvmgraceperiod,
-                                    securityGroups: securityGroups,
-                                    diskOfferingId: diskOfferingId,
-                                    snmpCommunity: autoscaleVmProfile.counterparam.snmpcommunity,
-                                    snmpPort: autoscaleVmProfile.counterparam.snmpport,
-                                    username: autoscaleVmProfile.autoscaleuserid,
-                                    context: {
-                                        autoscaleVmGroup: autoscaleVmGroup,
-                                        autoscaleVmProfile: autoscaleVmProfile
-                                    }
-                                    //isAdvanced: false // Set this to true if any advanced field data is present
-                                };
-
-                                args.response.success({
-                                    data: originalAutoscaleData
-                                });
-                            }
-                        });
-                    }
-                });
-            }
-        },
-
-        // --
-        // Add the following object blocks:
-        //
-        // topFields: { <standard createForm field format> }
-        // bottomFields: { <standard createForm field format> },
-        // scaleUpPolicy: { <standard multiEdit field format> },
-        // scaleDownPolicy: { <standard multiEdit field format> }
-        // --
-        //
-        forms: {
-            topFields: {
-                //**
-                //** Disabled due to UI issues
-                //**
-                // templateCategory: {
-                //   label: 'Template',
-                //   id: 'templatecategory',
-                //   select: function(args) {
-                //     args.response.success({
-                //       data: [
-                //         { id: 'all', description: _l('ui.listView.filters.all') },
-                //         { id: 'featured', description: _l('label.featured') },
-                //         { id: 'Community', description: _l('label.menu.community.templates') },
-                //         { id: 'self', description: _l('ui.listView.filters.mine') }
-                //       ]
-                //     });
-                //   }
-                // },
-                //**
-
-                templateNames: {
-                    label: 'label.template',
-                    id: 'templatename',
-                    select: function(args) {
-                        var templates;
-                        var templateIdMap = {};
-                        $.ajax({
-                            url: createURL('listTemplates'),
-                            data: {
-                                templatefilter: 'featured',
-                                zoneid: args.context.networks[0].zoneid
-                            },
-                            async: false,
-                            success: function(json) {
-                                templates = json.listtemplatesresponse.template;
-                                if (templates == null)
-                                    templates = [];
-                                $(templates).each(function() {
-                                    templateIdMap[this.id] = 1;
-                                });
-                            }
-                        });
-
-                        $.ajax({
-                            url: createURL('listTemplates'),
-                            data: {
-                                templatefilter: 'community',
-                                zoneid: args.context.networks[0].zoneid
-                            },
-                            async: false,
-                            success: function(json) {
-                                var items = json.listtemplatesresponse.template;
-                                $(items).each(function() {
-                                    if (!(this.id in templateIdMap)) {
-                                        templates.push(this);
-                                        templateIdMap[this.id] = 1;
-                                    }
-                                });
-                            }
-                        });
-
-                        $.ajax({
-                            url: createURL('listTemplates'),
-                            data: {
-                                templatefilter: 'selfexecutable',
-                                zoneid: args.context.networks[0].zoneid
-                            },
-                            async: false,
-                            success: function(json) {
-                                var items = json.listtemplatesresponse.template;
-                                $(items).each(function() {
-                                    if (!(this.id in templateIdMap)) {
-                                        templates.push(this);
-                                        templateIdMap[this.id] = 1;
-                                    }
-                                });
-                            }
-                        });
-
-                        args.response.success({
-                            data: $.map(templates, function(template) {
-                                return {
-                                    id: template.id,
-                                    description: template.name
-                                };
-                            })
-                        });
-                    }
-                },
-
-                serviceOfferingId: {
-                    label: 'label.compute.offering',
-                    select: function(args) {
-                        $.ajax({
-                            url: createURL("listServiceOfferings&issystem=false"),
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
-                                args.response.success({
-                                    data: $.map(serviceofferings, function(serviceoffering) {
-                                        return {
-                                            id: serviceoffering.id,
-                                            description: serviceoffering.name
-                                        };
-                                    })
-                                });
-                            }
-                        });
-                    }
-                },
-
-                minInstance: {
-                    label: 'label.min.instances',
-                    defaultValue: '3',
-                    validation: {
-                        required: true,
-                        number: true
-                    }
-                },
-
-                maxInstance: {
-                    label: 'label.max.instances',
-                    defaultValue: '10',
-                    validation: {
-                        required: true,
-                        number: true
-                    }
-                }
-            },
-
-            bottomFields: {
-                isAdvanced: {
-                    isBoolean: true,
-                    label: 'label.show.advanced.settings'
-                },
-                interval: {
-                    label: 'label.polling.interval.sec',
-                    defaultValue: '30',
-                    validation: {
-                        required: true,
-                        number: true
-                    }
-                },
-
-                quietTime: {
-                    label: 'label.quiet.time.sec',
-                    defaultValue: '300',
-                    validation: {
-                        required: true,
-                        number: true
-                    }
-                },
-
-                destroyVMgracePeriod: {
-                    label: 'label.destroy.vm.graceperiod',
-                    defaultValue: '30',
-                    isHidden: true,
-                    dependsOn: 'isAdvanced',
-                    validation: {
-                        required: true,
-                        number: true
-                    }
-                },
-                securityGroups: {
-                    label: 'label.menu.security.groups',
-                    isHidden: true,
-                    dependsOn: 'isAdvanced',
-                    select: function(args) {
-                        $.ajax({
-                            url: createURL("listSecurityGroups&listAll=true"),
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var securitygroups = json.listsecuritygroupsresponse.securitygroup;
-                                var items = [];
-                                items.push({
-                                    id: "",
-                                    description: ""
-                                });
-                                $(securitygroups).each(function() {
-                                    items.push({
-                                        id: this.id,
-                                        description: this.name
-                                    });
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    }
-                },
-
-                diskOfferingId: {
-                    label: 'label.menu.disk.offerings',
-                    isHidden: true,
-                    dependsOn: 'isAdvanced',
-                    select: function(args) {
-                        var diskOfferings = cloudStack.listDiskOfferings({listAll: true});
-                        var items = [];
-                        items.push({
-                            id: "",
-                            description: ""
-                        });
-                        $(diskOfferings).each(function() {
-                            items.push({
-                                id: this.id,
-                                description: this.name
-                            });
-                        });
-                        args.response.success({
-                            data: items
-                        });
-                    }
-                },
-
-                snmpCommunity: {
-                    isHidden: true,
-                    dependsOn: 'isAdvanced',
-                    label: 'label.SNMP.community',
-                    defaultValue: 'public',
-                    validation: {
-                        required: true
-                    }
-                },
-
-                snmpPort: {
-                    isHidden: true,
-                    dependsOn: 'isAdvanced',
-                    label: 'label.SNMP.port',
-                    defaultValue: '161',
-                    validation: {
-                        required: true,
-                        number: true
-                    }
-                },
-
-                username: {
-                    isHidden: true,
-                    dependsOn: 'isAdvanced',
-                    label: 'label.user',
-                    select: function(args) {
-                        var items = [];
-                        if (args.context.originalAutoscaleData == null) { //new LB rule
-                            if (isAdmin() || isDomainAdmin()) {
-                                $.ajax({
-                                    url: createURL('listUsers'),
-                                    data: {
-                                        domainid: g_domainid,
-                                        account: g_account
-                                    },
-                                    success: function(json) {
-                                        var users = json.listusersresponse.user;
-                                        $(users).each(function() {
-                                            items.push({
-                                                id: this.id,
-                                                description: this.username
-                                            });
-                                        });
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    }
-                                });
-                            } else { //regular user doesn't have access to listUers API call.
-                                items.push({
-                                    id: "",
-                                    description: ""
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        } else { //existing LB rule
-                            if (isAdmin() || isDomainAdmin()) {
-                                $.ajax({
-                                    url: createURL('listUsers'),
-                                    data: {
-                                        domainid: args.context.originalAutoscaleData.context.autoscaleVmProfile.domainid,
-                                        account: args.context.originalAutoscaleData.context.autoscaleVmProfile.account
-                                    },
-                                    success: function(json) {
-                                        var users = json.listusersresponse.user;
-                                        $(users).each(function() {
-                                            items.push({
-                                                id: this.id,
-                                                description: this.username
-                                            });
-                                        });
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    }
-                                });
-                            } else { //regular user doesn't have access to listUers API call.
-                                items.push({
-                                    id: "",
-                                    description: ""
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        }
-                    }
-                }
-            },
-            scaleUpPolicy: {
-                title: 'label.scaleup.policy',
-                label: 'label.scale.up.policy',
-                noSelect: true,
-                noHeaderActionsColumn: true,
-                ignoreEmptyFields: true,
-                fields: {
-                    'counterid': {
-                        label: 'label.counter',
-                        select: function(args) {
-                            $.ajax({
-                                url: createURL("listCounters"),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var counters = json.counterresponse.counter;
-
-                                    args.response.success({
-                                        data: $.map(counters, function(counter) {
-                                            return {
-                                                name: counter.id,
-                                                description: counter.name
-                                            };
-                                        })
-                                    });
-                                }
-                            });
-                        }
-                    },
-                    'relationaloperator': {
-                        label: 'label.operator',
-                        select: function(args) {
-                            args.response.success({
-                                data: [{
-                                    name: 'GT',
-                                    description: 'greater-than'
-                                }, {
-                                    name: 'GE',
-                                    description: 'greater-than or equals to'
-                                }, {
-                                    name: 'LT',
-                                    description: 'less-than'
-                                }, {
-                                    name: 'LE',
-                                    description: 'less-than or equals to'
-                                }, {
-                                    name: 'EQ',
-                                    description: 'equals-to'
-                                }]
-                            });
-                        }
-                    },
-                    'threshold': {
-                        edit: true,
-                        label: 'label.threshold'
-                    },
-                    'add-scaleUpcondition': {
-                        label: 'label.add',
-                        addButton: true
-                    }
-                },
-                add: {
-                    label: 'label.add',
-                    action: function(args) {
-                        scaleUpData.push($.extend(args.data, {
-                            index: totalScaleUpCondition
-                        }));
-
-                        totalScaleUpCondition++;
-                        args.response.success();
-                    }
-                },
-                actions: {
-                    destroy: {
-                        label: '',
-                        action: function(args) {
-                            scaleUpData = $.grep(scaleUpData, function(item) {
-                                return item.index != args.context.multiRule[0].index;
-                            });
-                            totalScaleUpCondition--;
-                            args.response.success();
-                        }
-                    }
-                },
-                dataProvider: function(args) {
-                    var data = scaleUpData;
-                    var $autoscaler = $('.ui-dialog .autoscaler');
-                    var initialData = $autoscaler.data('autoscaler-scale-up-data');
-
-                    if ($.isArray(initialData)) {
-                        $(initialData).each(function() {
-                            this.index = totalScaleUpCondition;
-                            totalScaleUpCondition++;
-                            scaleUpData.push(this);
-                        });
-
-                        $autoscaler.data('autoscaler-scale-up-data', null);
-                    }
-
-                    args.response.success({
-                        data: scaleUpData
-                    });
-                }
-            },
-
-            scaleDownPolicy: {
-                title: 'label.scaledown.policy',
-                noSelect: true,
-                noHeaderActionsColumn: true,
-                ignoreEmptyFields: true,
-                fields: {
-                    'counterid': {
-                        label: 'label.counter',
-                        select: function(args) {
-                            $.ajax({
-                                url: createURL("listCounters"),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var counters = json.counterresponse.counter;
-
-                                    args.response.success({
-                                        data: $.map(counters, function(counter) {
-                                            return {
-                                                name: counter.id,
-                                                description: counter.name
-                                            };
-                                        })
-                                    });
-                                }
-                            });
-                        }
-                    },
-                    'relationaloperator': {
-                        label: 'label.operator',
-                        select: function(args) {
-                            args.response.success({
-                                data: [{
-                                    name: 'GT',
-                                    description: 'greater-than'
-                                }, {
-                                    name: 'GE',
-                                    description: 'greater-than or equals to'
-                                }, {
-                                    name: 'LT',
-                                    description: 'less-than'
-                                }, {
-                                    name: 'LE',
-                                    description: 'less-than or equals to'
-                                }, {
-                                    name: 'EQ',
-                                    description: 'equals-to'
-                                }]
-                            });
-                        }
-                    },
-                    'threshold': {
-                        edit: true,
-                        label: 'label.threshold'
-                    },
-                    'add-scaleDowncondition': {
-                        label: 'label.add',
-                        addButton: true
-                    }
-                },
-                add: {
-                    label: 'label.add',
-                    action: function(args) {
-                        scaleDownData.push($.extend(args.data, {
-                            index: totalScaleDownCondition
-                        }));
-                        totalScaleDownCondition++;
-                        args.response.success();
-                    }
-                },
-                actions: {
-                    destroy: {
-                        label: '',
-                        action: function(args) {
-                            scaleDownData = $.grep(scaleDownData, function(item) {
-                                return item.index != args.context.multiRule[0].index;
-                            });
-                            totalScaleDownCondition--;
-                            args.response.success();
-                        }
-                    }
-                },
-                dataProvider: function(args) {
-                    var data = scaleDownData;
-                    var $autoscaler = $('.ui-dialog .autoscaler');
-                    var initialData = $autoscaler.data('autoscaler-scale-down-data');
-
-                    if ($.isArray(initialData)) {
-                        $(initialData).each(function() {
-                            this.index = totalScaleDownCondition;
-                            totalScaleDownCondition++;
-                            scaleDownData.push(this);
-                        });
-
-                        $autoscaler.data('autoscaler-scale-down-data', null);
-                    }
-
-                    args.response.success({
-                        data: scaleDownData
-                    });
-                }
-            }
-        },
-
-        actions: {
-            apply: function(args) {
-                //validation (begin) *****
-                if (!('multiRules' in args.context)) { //from a new LB
-                    if (args.formData.name == '' || args.formData.publicport == '' || args.formData.privateport == '') {
-                        args.response.error('Name, Public Port, Private Port of Load Balancing are required. Please close this dialog box and fill Name, Public Port, Private Port first.');
-                        return;
-                    }
-                } else { //from an existing LB
-                    if (args.context.originalAutoscaleData.afterActionIsComplete == null) {
-                        if (args.context.originalAutoscaleData.context.autoscaleVmGroup.state != 'disabled') {
-                            args.response.error('An Autoscale VM Group can be updated only if it is in disabled state. Please disable the Autoscale VM Group first.');
-                            return;
-                        }
-                    } else {
-                        if (args.context.originalAutoscaleData.afterActionIsComplete.state != 'disabled') {
-                            args.response.error('An Autoscale VM Group can be updated only if it is in disabled state. Please disable the Autoscale VM Group first.');
-                            return;
-                        }
-                    }
-                }
-
-                if (isAdmin() || isDomainAdmin()) { //only admin and domain-admin has access to listUers API
-                    var havingApiKeyAndSecretKey = false;
-                    $.ajax({
-                        url: createURL('listUsers'),
-                        data: {
-                            id: args.data.username
-                        },
-                        async: false,
-                        success: function(json) {
-                            if (json.listusersresponse.user[0].apikey != null && json.listusersresponse.user[0].secretkey != null) {
-                                havingApiKeyAndSecretKey = true;
-                            }
-                        }
-                    });
-                    if (havingApiKeyAndSecretKey == false) {
-                        args.response.error('The selected user in advanced settings does not have API key or secret key');
-                        return;
-                    }
-                }
-
-                if (isAdmin()) { //only admin has access to listConfigurations API
-                    var hasValidEndpointeUrl = false;
-                    $.ajax({
-                        url: createURL('listConfigurations'),
-                        data: {
-                            name: 'endpointe.url'
-                        },
-                        async: false,
-                        success: function(json) {
-                            if (json.listconfigurationsresponse.configuration != null) {
-                                if (json.listconfigurationsresponse.configuration[0].value.indexOf('localhost') == -1) {
-                                    hasValidEndpointeUrl = true;
-                                }
-                            }
-                        }
-                    });
-                    if (hasValidEndpointeUrl == false) {
-                        args.response.error("Global setting endpointe.url has to be set to the Management Server's API end point");
-                        return;
-                    }
-                }
-
-                //Scale Up Policy
-                if (args.data.scaleUpDuration == null || args.data.scaleUpDuration.length == 0) {
-                    args.response.error("Duration of Scale Up Policy is required.");
-                    return;
-                }
-                if (isNaN(args.data.scaleUpDuration)) {
-                    args.response.error("Duration of Scale Up Policy should be a number.");
-                    return;
-                }
-                if (parseInt(args.data.scaleUpDuration) < parseInt(args.data.interval)) {
-                    args.response.error("Duration of Scale Up Policy must be greater than or equal to Polling Interval.");
-                    return;
-                }
-                if (scaleUpData.length == 0) {
-                    args.response.error("At least one condition is required in Scale Up Policy.");
-                    return;
-                }
-
-                //Scale Down Policy
-                if (args.data.scaleDownDuration == null || args.data.scaleDownDuration.length == 0) {
-                    args.response.error("Duration of Scale Down Policy is required.");
-                    return;
-                }
-                if (isNaN(args.data.scaleDownDuration)) {
-                    args.response.error("Duration of Scale Down Policy should be a number.");
-                    return;
-                }
-                if (parseInt(args.data.scaleDownDuration) < parseInt(args.data.interval)) {
-                    args.response.error("Duration of Scale Down Policy must be greater than or equal to Polling Interval.");
-                    return;
-                }
-                if (scaleDownData.length == 0) {
-                    args.response.error("At least one condition is required in Scale Down Policy.");
-                    return;
-                }
-                //validation (end) *****
-
-                var scaleVmProfileResponse = [];
-                var loadBalancerResponse = [];
-                var scaleVmGroupResponse = [];
-                var scaleUpConditionIds = [];
-                var scaleDownConditionIds = [];
-
-                var scaleUp = function(args) {
-                    var scaleUpConditionIds = [];
-                    $(scaleUpData).each(function() {
-                        var data = {
-                            counterid: this.counterid,
-                            relationaloperator: this.relationaloperator,
-                            threshold: this.threshold
-                        };
-                        $.ajax({
-                            url: createURL('createCondition'),
-                            data: data,
-                            success: function(json) {
-                                var createConditionIntervalID = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobid=" + json.conditionresponse.jobid),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return;
-                                            } else {
-                                                clearInterval(createConditionIntervalID);
-                                                if (result.jobstatus == 1) {
-                                                    var item = json.queryasyncjobresultresponse.jobresult.condition;
-                                                    scaleUpConditionIds.push(item.id);
-                                                    if (scaleUpConditionIds.length == scaleUpData.length) {
-                                                        if (!('multiRules' in args.context)) { //from a new LB
-                                                            var data = {
-                                                                action: 'scaleup',
-                                                                conditionids: scaleUpConditionIds.join(","),
-                                                                duration: args.data.scaleUpDuration,
-                                                                quiettime: args.data.quietTime
-                                                            };
-                                                            $.ajax({
-                                                                url: createURL('createAutoScalePolicy'),
-                                                                data: data,
-                                                                success: function(json) {
-                                                                    var jobId = json.autoscalepolicyresponse.jobid;
-                                                                    var createAutoScalePolicyInterval = setInterval(function() {
-                                                                        $.ajax({
-                                                                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                            dataType: "json",
-                                                                            success: function(json) {
-                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                if (result.jobstatus == 0) {
-                                                                                    return; //Job has not completed
-                                                                                } else {
-                                                                                    clearInterval(createAutoScalePolicyInterval);
-                                                                                    if (result.jobstatus == 1) { //AutoScalePolicy successfully created
-                                                                                        var item = result.jobresult.autoscalepolicy;
-                                                                                        scaleDown($.extend(args, {
-                                                                                            scaleUpPolicyResponse: item
-                                                                                        }));
-                                                                                    } else if (result.jobstatus == 2) {
-                                                                                        args.response.error(_s(result.jobresult.errortext));
-                                                                                    }
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    }, g_queryAsyncJobResultInterval);
-                                                                },
-                                                                error: function(XMLHttpResponse) {
-                                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                                }
-                                                            });
-                                                        } else { //from an existing LB
-                                                            var data = {
-                                                                id: args.context.originalAutoscaleData.scaleUpPolicy.id,
-                                                                conditionids: scaleUpConditionIds.join(","),
-                                                                duration: args.data.scaleUpDuration,
-                                                                quiettime: args.data.quietTime
-                                                            };
-
-                                                            $.ajax({
-                                                                url: createURL('updateAutoScalePolicy'),
-                                                                data: data,
-                                                                success: function(json) {
-                                                                    var updateAutoScalePolicyInterval = setInterval(function() {
-                                                                        $.ajax({
-                                                                            url: createURL("queryAsyncJobResult&jobId=" + json.updateautoscalepolicyresponse.jobid),
-                                                                            dataType: "json",
-                                                                            success: function(json) {
-                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                if (result.jobstatus == 0) {
-                                                                                    return; //Job has not completed
-                                                                                } else {
-                                                                                    clearInterval(updateAutoScalePolicyInterval);
-                                                                                    if (result.jobstatus == 1) {
-                                                                                        var item = result.jobresult.autoscalepolicy;
-
-                                                                                        //delete old conditions which are orphans now. Don't need to call queryAsyncJobResult because subsequent API calls have no dependency on deleteCondition.
-                                                                                        $(args.context.originalAutoscaleData.scaleUpPolicy.conditions).each(function() {
-                                                                                            $.ajax({
-                                                                                                url: createURL('deleteCondition'),
-                                                                                                data: {
-                                                                                                    id: this.id
-                                                                                                }
-                                                                                            });
-                                                                                        });
-
-                                                                                        scaleDown($.extend(args, {
-                                                                                            scaleUpPolicyResponse: item
-                                                                                        }));
-                                                                                    } else if (result.jobstatus == 2) {
-                                                                                        args.response.error(_s(result.jobresult.errortext));
-                                                                                    }
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    }, g_queryAsyncJobResultInterval);
-                                                                },
-                                                                error: function(XMLHttpResponse) {
-                                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                                }
-                                                            });
-                                                        }
-                                                    }
-                                                } else if (result.jobstatus == 2) {
-                                                    args.response.error(_s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            },
-                            error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    });
-                };
-
-                var scaleDown = function(args) {
-                    var scaleDownConditionIds = [];
-                    $(scaleDownData).each(function() {
-                        var data = {
-                            counterid: this.counterid,
-                            relationaloperator: this.relationaloperator,
-                            threshold: this.threshold
-                        };
-                        $.ajax({
-                            url: createURL('createCondition'),
-                            data: data,
-                            success: function(json) {
-                                var createConditionIntervalID = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobid=" + json.conditionresponse.jobid),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return;
-                                            } else {
-                                                clearInterval(createConditionIntervalID);
-                                                if (result.jobstatus == 1) {
-                                                    var item = json.queryasyncjobresultresponse.jobresult.condition;
-                                                    scaleDownConditionIds.push(item.id);
-                                                    if (scaleDownConditionIds.length == scaleDownData.length) {
-                                                        if (!('multiRules' in args.context)) { //from a new LB
-                                                            var data = {
-                                                                action: 'scaledown',
-                                                                conditionids: scaleDownConditionIds.join(","),
-                                                                duration: args.data.scaleDownDuration,
-                                                                quiettime: args.data.quietTime
-                                                            };
-                                                            $.ajax({
-                                                                url: createURL('createAutoScalePolicy'),
-                                                                data: data,
-                                                                success: function(json) {
-                                                                    var jobId = json.autoscalepolicyresponse.jobid;
-                                                                    var createAutoScalePolicyInterval = setInterval(function() {
-                                                                        $.ajax({
-                                                                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                            dataType: "json",
-                                                                            success: function(json) {
-                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                if (result.jobstatus == 0) {
-                                                                                    return; //Job has not completed
-                                                                                } else {
-                                                                                    clearInterval(createAutoScalePolicyInterval);
-                                                                                    if (result.jobstatus == 1) { //AutoScalePolicy successfully created
-                                                                                        var item = result.jobresult.autoscalepolicy;
-                                                                                        createOrUpdateVmProfile($.extend(args, {
-                                                                                            scaleDownPolicyResponse: item
-                                                                                        }));
-                                                                                    } else if (result.jobstatus == 2) {
-                                                                                        args.response.error(_s(result.jobresult.errortext));
-                                                                                    }
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    }, g_queryAsyncJobResultInterval);
-                                                                },
-                                                                error: function(XMLHttpResponse) {
-                                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                                }
-                                                            });
-                                                        } else { //from an existing LB
-                                                            var data = {
-                                                                id: args.context.originalAutoscaleData.scaleDownPolicy.id,
-                                                                conditionids: scaleDownConditionIds.join(","),
-                                                                duration: args.data.scaleDownDuration,
-                                                                quiettime: args.data.quietTime
-                                                            };
-
-                                                            $.ajax({
-                                                                url: createURL('updateAutoScalePolicy'),
-                                                                data: data,
-                                                                success: function(json) {
-                                                                    var jobId = json.updateautoscalepolicyresponse.jobid;
-                                                                    var updateAutoScalePolicyInterval = setInterval(function() {
-                                                                        $.ajax({
-                                                                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                            dataType: "json",
-                                                                            success: function(json) {
-                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                if (result.jobstatus == 0) {
-                                                                                    return; //Job has not completed
-                                                                                } else {
-                                                                                    clearInterval(updateAutoScalePolicyInterval);
-                                                                                    if (result.jobstatus == 1) {
-                                                                                        var item = result.jobresult.autoscalepolicy;
-
-                                                                                        //delete old conditions which are orphans now. Don't need to call queryAsyncJobResult because subsequent API calls have no dependency on deleteCondition.
-                                                                                        $(args.context.originalAutoscaleData.scaleDownPolicy.conditions).each(function() {
-                                                                                            $.ajax({
-                                                                                                url: createURL('deleteCondition'),
-                                                                                                data: {
-                                                                                                    id: this.id
-                                                                                                }
-                                                                                            });
-                                                                                        });
-
-                                                                                        createOrUpdateVmProfile($.extend(args, {
-                                                                                            scaleDownPolicyResponse: item
-                                                                                        }));
-                                                                                    } else if (result.jobstatus == 2) {
-                                                                                        args.response.error(_s(result.jobresult.errortext));
-                                                                                    }
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    }, g_queryAsyncJobResultInterval);
-                                                                },
-                                                                error: function(XMLHttpResponse) {
-                                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                                }
-                                                            });
-                                                        }
-                                                    }
-                                                } else if (result.jobstatus == 2) {
-                                                    args.response.error(_s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            }
-                        });
-                    });
-                };
-
-                var createOrUpdateVmProfile = function(args) {
-                    var array1 = [];
-                    var apiCmd, apiCmdRes;
-                    if (!('multiRules' in args.context)) { //from a new LB
-                        var data = {
-                            zoneid: args.context.networks[0].zoneid ? args.context.networks[0].zoneid : args.context.ipAddresses[0].zoneid, //get zoneid from args.context.networks[0]. If it is not null then get it from args.context.ipAddresses[0] because args.context.ipAddresses is null when adding AutoScale rule from Add Load Balancer tab in Network page
-                            serviceofferingid: args.data.serviceOfferingId,
-                            templateid: args.data.templateNames,
-                            destroyvmgraceperiod: args.data.destroyVMgracePeriod,
-                            snmpcommunity: args.data.snmpCommunity,
-                            snmpport: args.data.snmpPort
-                        };
-
-                        var allParamNames = $.map(data, function(value, key) {
-                            return key;
-                        });
-
-                        var notParams = ['zoneid', 'serviceofferingid', 'templateid', 'destroyvmgraceperiod'];
-                        var index = 0;
-                        $(allParamNames).each(function() {
-                            var param = 'counterparam[' + index + ']';
-                            var name = this.toString();
-                            var value = data[name];
-                            if (!value || $.inArray(name, notParams) > -1) return true;
-                            data[param + '.name'] = name;
-                            data[param + '.value'] = value;
-                            index++;
-                            delete data[name];
-
-                            return true;
-                        });
-
-
-                        if (args.data.username != null && args.data.username.length > 0) {
-                            $.extend(data, {
-                                autoscaleuserid: args.data.username
-                            });
-                        }
-
-                        var array2 = [];
-                        if (args.data.diskOfferingId != null && args.data.diskOfferingId.length > 0)
-                            array2.push("diskofferingid=" + args.data.diskOfferingId);
-                        if (args.data.securityGroups != null && args.data.securityGroups.length > 0) {
-                            if (array2.length > 0)
-                                array2.push("&securitygroupids=" + args.data.securityGroups);
-                            else
-                                array2.push("securitygroupids=" + args.data.securityGroups);
-                        }
-                        if (array2.length > 0) {
-                            $.extend(data, {
-                                otherdeployparams: array2.join("")
-                            });
-                        }
-
-                        $.ajax({
-                            url: createURL('createAutoScaleVmProfile'),
-                            data: data,
-                            success: function(json) {
-                                var jobId = json.autoscalevmprofileresponse.jobid;
-                                var autoscaleVmProfileTimer = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(autoscaleVmProfileTimer);
-                                                if (result.jobstatus == 1) {
-                                                    scaleVmProfileResponse = result.jobresult.autoscalevmprofile;
-                                                    loadBalancer(args); //create a load balancer rule
-                                                } else if (result.jobstatus == 2) {
-                                                    args.response.error(_s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            },
-                            error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    } else { //from an existing LB
-                        var data = {
-                            id: args.context.originalAutoscaleData.context.autoscaleVmProfile.id,
-                            templateid: args.data.templateNames,
-                            destroyvmgraceperiod: args.data.destroyVMgracePeriod,
-                            snmpcommunity: args.data.snmpCommunity,
-                            snmpport: args.data.snmpPort
-                        };
-
-                        var allParamNames = $.map(data, function(value, key) {
-                            return key;
-                        });
-
-                        var notParams = ['id', 'templateid', 'destroyvmgraceperiod'];
-                        var index = 0;
-                        $(allParamNames).each(function() {
-                            var param = 'counterparam[' + index + ']';
-                            var name = this.toString();
-                            var value = data[name];
-                            if (!value || $.inArray(name, notParams) > -1) return true;
-                            data[param + '.name'] = name;
-                            data[param + '.value'] = value;
-                            index++;
-                            delete data[name];
-
-                            return true;
-                        });
-
-
-
-
-                        if (args.data.username != null && args.data.username.length > 0) {
-                            $.extend(data, {
-                                autoscaleuserid: args.data.username
-                            });
-                        }
-
-                        $.ajax({
-                            url: createURL('updateAutoScaleVmProfile'),
-                            data: data,
-                            success: function(json) {
-                                var jobId = json.updateautoscalevmprofileresponse.jobid;
-                                var autoscaleVmProfileTimer = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(autoscaleVmProfileTimer);
-                                                if (result.jobstatus == 1) {
-                                                    scaleVmProfileResponse = result.jobresult.autoscalevmprofile;
-                                                    autoScaleVmGroup(args); //update autoScaleVmGroup
-                                                } else if (result.jobstatus == 2) {
-                                                    args.response.error(_s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            },
-                            error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    }
-                };
-
-                var loadBalancer = function(args) {
-                    var networkid;
-                    if ('vpc' in args.context) { //from VPC section
-                        if (args.data.tier == null) {
-                            cloudStack.dialog.notice({
-                                message: 'message.tier.required'
-                            });
-                            return;
-                        }
-                        networkid = args.data.tier;
-                    } else if ('networks' in args.context) { //from Guest Network section
-                        networkid = args.context.networks[0].id;
-                    }
-                    var data = {
-                        algorithm: args.formData.algorithm,
-                        name: args.formData.name,
-                        privateport: args.formData.privateport,
-                        publicport: args.formData.publicport,
-                        openfirewall: false,
-                        networkid: networkid
-                    };
-                    if (args.context.ipAddresses != null) {
-                        data = $.extend(data, {
-                            publicipid: args.context.ipAddresses[0].id
-                        });
-                    } else {
-                        data = $.extend(data, {
-                            domainid: g_domainid,
-                            account: g_account
-                        });
-                    }
-
-                    $.ajax({
-                        url: createURL('createLoadBalancerRule'),
-                        dataType: 'json',
-                        data: data,
-                        async: true,
-                        success: function(json) {
-                            var jobId = json.createloadbalancerruleresponse.jobid;
-                            var loadBalancerTimer = setInterval(function() {
-                                $.ajax({
-                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                    dataType: "json",
-                                    success: function(json) {
-                                        var result = json.queryasyncjobresultresponse;
-                                        if (result.jobstatus == 0) {
-                                            return; //Job has not completed
-                                        } else {
-                                            clearInterval(loadBalancerTimer);
-                                            if (result.jobstatus == 1) { //LoadBalancerRule successfully created
-                                                loadBalancerResponse = result.jobresult.loadbalancer;
-                                                autoScaleVmGroup(args);
-                                            } else if (result.jobstatus == 2) {
-                                                args.response.error(_s(result.jobresult.errortext));
-                                            }
-                                        }
-                                    }
-                                });
-                            }, g_queryAsyncJobResultInterval);
-                        },
-                        error: function(XMLHttpResponse) {
-                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                        }
-                    });
-                };
-
-                var autoScaleVmGroup = function(args) {
-                    if (!('multiRules' in args.context)) { //from a new LB
-                        var array1 = [];
-                        array1.push("&lbruleid=" + loadBalancerResponse.id);
-                        array1.push("&minMembers=" + args.data.minInstance);
-                        array1.push("&maxMembers=" + args.data.maxInstance);
-                        array1.push("&vmprofileid=" + scaleVmProfileResponse.id);
-                        array1.push("&interval=" + args.data.interval);
-                        array1.push("&scaleuppolicyids=" + args.scaleUpPolicyResponse.id);
-                        array1.push("&scaledownpolicyids=" + args.scaleDownPolicyResponse.id);
-
-                        $.ajax({
-                            url: createURL('createAutoScaleVmGroup' + array1.join("")),
-                            dataType: 'json',
-                            async: true,
-                            success: function(json) {
-                                var jobId = json.autoscalevmgroupresponse.jobid;
-                                var scaleVmGroupTimer = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(scaleVmGroupTimer);
-                                                if (result.jobstatus == 1) { //autoscale Vm group successfully created
-                                                    scaleVmGroupResponse = result.jobresult.autoscalevmgroup;
-                                                    args.response.success();
-                                                } else if (result.jobstatus == 2) {
-                                                    args.response.error(_s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            },
-                            error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    } else { //from an existing LB
-                        var data = {
-                            id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id,
-                            minmembers: args.data.minInstance,
-                            maxmembers: args.data.maxInstance,
-                            interval: args.data.interval,
-                            scaleuppolicyids: args.context.originalAutoscaleData.scaleUpPolicy.id,
-                            scaledownpolicyids: args.context.originalAutoscaleData.scaleDownPolicy.id
-                        };
-
-                        $.ajax({
-                            url: createURL('updateAutoScaleVmGroup'),
-                            data: data,
-                            success: function(json) {
-                                var jobId = json.updateautoscalevmgroupresponse.jobid;
-                                var updateAutoScaleVmGroupTimer = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(updateAutoScaleVmGroupTimer);
-                                                if (result.jobstatus == 1) { //autoscale Vm group successfully created
-                                                    args.response.success();
-                                                } else if (result.jobstatus == 2) {
-                                                    args.response.error(_s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            },
-                            error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    }
-                };
-
-                // Get hypervisor;
-                // if VMware, show notification to user about additional configuration required
-                $.ajax({
-                    url: createURL('listTemplates'),
-                    data: {
-                        id: args.data.templateNames,
-                        templatefilter: 'executable'
-                    },
-                    async: false,
-                    success: function(json) {
-                        var template = json.listtemplatesresponse.template;
-
-                        if (template && template[0].hypervisor === 'VMware') {
-                            cloudStack.dialog.confirm({
-                                message: 'message.admin.guide.read',
-                                action: function() {
-                                    //*** API calls start!!! ********
-                                    scaleUp(args);
-                                },
-                                cancelAction: function() {
-                                    $('.loading-overlay').remove();
-                                }
-                            });
-                        } else {
-                            //*** API calls start!!! ********
-                            scaleUp(args);
-                        }
-                    }
-                });
-
-            },
-            destroy: function(args) {
-                $.ajax({
-                    url: createURL('')
-                });
-            }
-        },
-
-        dialog: function(args) {
-            return function(args) {
-                var context = args.context;
-
-                var $dialog = $('<div>');
-                $dialog.dialog({
-                    title: 'label.autoscale.configuration.wizard',
-                    closeonEscape: false,
-
-                    draggable: true,
-                    width: 825,
-                    height: 600,
-                    buttons: {
-                        'Cancel': function() {
-                            $(this).dialog("close");
-                            $('.overlay').remove();
-                        },
-
-
-                        'Apply': function() {
-                            $(':ui-dialog').remove();
-                            $('.overlay').remove();
-                        }
-                    }
-                }).closest('.ui-dialog').overlay();
-
-                $("buttons").each(function() {
-                    $(this).attr('style', 'float: right');
-                });
-                var $field = $('<div>').addClass('field username');
-                var $input = $('<input>').attr({
-                    name: 'username'
-                });
-                var $inputLabel = $('<label>').html('Username');
-
-                $field.append($input, $inputLabel);
-                $field.appendTo($dialog);
-            }
-        }
-    }
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/cloud.core.callbacks.js b/ui/legacy/scripts/cloud.core.callbacks.js
deleted file mode 100644
index aad5deb..0000000
--- a/ui/legacy/scripts/cloud.core.callbacks.js
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-$.urlParam = function(name) {
-    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
-    if (!results) {
-        return 0;
-    }
-    return results[1] || 0;
-}
-
-/*
-This file is meant to help with implementing single signon integration.  If you are using the
-default Apache CloudStack UI, there is no need to touch this file.
-*/
-
-/*
-This callback function is called when either the session has timed out for the user,
-the session ID has been changed (i.e. another user logging into the UI via a different tab),
-or it's the first time the user has come to this page.
-*/
-
-function onLogoutCallback() {
-    g_loginResponse = null; //clear single signon variable g_loginResponse
-
-
-    return true; // return true means the login page will show
-    /*
-    window.location.replace("http://www.google.com"); //redirect to a different location
-  return false;    //return false means it will stay in the location window.location.replace() sets it to (i.e. "http://www.google.com")
-    */
-}
-
-var g_loginResponse = null;
-
-/*
-For single signon purposes, you just need to make sure that after a successful login, you set the
-global variable "g_loginResponse"
-
-You can also pass in a special param called loginUrl that is pregenerated and sent to the CloudStack, it will
-automatically log you in.
-
-Below is a sample login attempt
-*/
-
-var clientApiUrl = "/client/api";
-var clientConsoleUrl = "/client/console";
-
-$(document).ready(function() {
-
-    var url = $.urlParam("loginUrl");
-    if (url != undefined && url != null && url.length > 0) {
-        url = unescape(clientApiUrl + "?" + url);
-        $.ajax({
-            type: 'POST',
-            url: url,
-            dataType: "json",
-            async: false,
-            success: function(json) {
-                g_loginResponse = json.loginresponse;
-            },
-            error: function() {
-                onLogoutCallback();
-                // This means the login failed.  You should redirect to your login page.
-            },
-            beforeSend: function(XMLHttpRequest) {
-                return true;
-            }
-        });
-    }
-});
diff --git a/ui/legacy/scripts/cloudStack.js b/ui/legacy/scripts/cloudStack.js
deleted file mode 100644
index 9e01271..0000000
--- a/ui/legacy/scripts/cloudStack.js
+++ /dev/null
@@ -1,546 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    $.extend(cloudStack, {
-        home: 'dashboard',
-
-        sectionPreFilter: function(args) {
-            var sections = [];
-
-            if (isAdmin()) {
-                sections = ["dashboard", "instances", "storage", "network", "templates", "roles", "accounts", "domains", "events", "system", "global-settings", "configuration", "projects", "regions", "affinityGroups"];
-            } else if (isDomainAdmin()) {
-                sections = ["dashboard", "instances", "storage", "network", "templates", "accounts", "domains", "events", "projects", "configuration", "regions", "affinityGroups"];
-            } else if (g_userProjectsEnabled) {
-                sections = ["dashboard", "instances", "storage", "network", "templates", "accounts", "events", "projects", "regions", "affinityGroups"];
-            } else { //normal user
-                sections = ["dashboard", "instances", "storage", "network", "templates", "accounts", "events", "regions", "affinityGroups"];
-            }
-
-            $.each(cloudStack.plugins, function(idx, plugin) {
-                if (cloudStack.sections.hasOwnProperty(plugin) && !cloudStack.sections[plugin].showOnNavigation) {
-                    sections.push('plugins');
-                    return false;
-                }
-            });
-
-            return sections;
-        },
-        sections: {
-            /**
-             * Dashboard
-             */
-            dashboard: {},
-            instances: {},
-            affinityGroups: {},
-            storage: {},
-            network: {},
-            templates: {},
-            events: {},
-            projects: {},
-            roles: {},
-            accounts: {},
-
-            domains: {}, //domain-admin and root-admin only
-
-            regions: {}, //root-admin only
-            system: {}, //root-admin only
-            'global-settings': {}, //root-admin only
-            configuration: {}, //root-admin only
-            plugins: {}
-        }
-    });
-
-    $(window).bind('cloudStack.pluginReady', function() {
-        // Get language
-        g_lang = $.cookie('lang') ? $.cookie('lang') : 'en';
-
-        /**
-         * Generic error handling
-         */
-
-        $.ajaxSetup({
-            url: clientApiUrl,
-            async: true,
-            dataType: 'json',
-            cache: false,
-            error: function(data) {
-                var clickAction = false;
-                if (isValidJsonString(data.responseText)) {
-                    var json = JSON.parse(data.responseText);
-                    if (json != null) {
-                        var property;
-                        for (property in json) {}
-                        var errorObj = json[property];
-                        if (errorObj.errorcode == 401 && errorObj.errortext == "unable to verify user credentials and/or request signature") {
-                            clickAction = function() {
-                                $('#user-options a').eq(0).trigger('click');
-                            };
-                        }
-                    }
-                }
-                cloudStack.dialog.notice({
-                    message: parseXMLHttpResponse(data),
-                    clickAction: clickAction
-                });
-            }
-        });
-
-        var $container = $('#cloudStack3-container');
-
-        var updateSharedConfigs = function() {
-            // Update global pagesize for list APIs in UI
-            $.ajax({
-                type: 'GET',
-                url: createURL('listConfigurations'),
-                data: {name: 'default.ui.page.size'},
-                dataType: 'json',
-                async: false,
-                success: function(data, textStatus, xhr) {
-                    if (data && data.listconfigurationsresponse && data.listconfigurationsresponse.configuration) {
-                        var config = data.listconfigurationsresponse.configuration[0];
-                        if (config && config.name == 'default.ui.page.size') {
-                            pageSize = parseInt(config.value);
-                        }
-                    }
-                },
-                error: function(xhr) { // ignore any errors, fallback to the default
-                }
-            });
-
-            // Update global pagesize for sort key in UI
-            $.ajax({
-                type: 'GET',
-                url: createURL('listConfigurations'),
-                data: {name: 'sortkey.algorithm'},
-                dataType: 'json',
-                async: false,
-                success: function(data, textStatus, xhr) {
-                    if (data && data.listconfigurationsresponse && data.listconfigurationsresponse.configuration) {
-                        var config = data.listconfigurationsresponse.configuration[0];
-                        if (config && config.name == 'sortkey.algorithm') {
-                            g_sortKeyIsAscending = config.value == 'true';
-                        }
-                    }
-                },
-                error: function(xhr) { // ignore any errors, fallback to the default
-                }
-            });
-
-            // Update global router health checks enabled
-            $.ajax({
-                type: 'GET',
-                url: createURL('listConfigurations'),
-                data: {name: 'router.health.checks.enabled'},
-                dataType: 'json',
-                async: false,
-                success: function(data, textStatus, xhr) {
-                    if (data && data.listconfigurationsresponse && data.listconfigurationsresponse.configuration) {
-                        var config = data.listconfigurationsresponse.configuration[0];
-                        if (config && config.name == 'router.health.checks.enabled') {
-                            g_routerHealthChecksEnabled = config.value == 'true';
-                        }
-                    }
-                },
-                error: function(xhr) { // ignore any errors, fallback to the default
-                }
-            });
-        }
-        var loginArgs = {
-            $container: $container,
-
-            // Use this for checking the session, to bypass login screen
-            bypassLoginCheck: function(args) { //determine to show or bypass login screen
-                if (g_loginResponse == null) { //show login screen
-                    var unBoxCookieValue = function (cookieName) {
-                        return decodeURIComponent($.cookie(cookieName)).replace(/"([^"]+(?="))"/g, '$1');
-                    };
-                    // sessionkey is a HttpOnly cookie now, no need to pass as API param
-                    g_sessionKey = null;
-                    g_role = unBoxCookieValue('role');
-                    g_userid = unBoxCookieValue('userid');
-                    g_domainid = unBoxCookieValue('domainid');
-                    g_account = unBoxCookieValue('account');
-                    g_username = unBoxCookieValue('username');
-                    g_userfullname = unBoxCookieValue('userfullname');
-                    g_timezone = unBoxCookieValue('timezone');
-                    g_timezoneoffset = unBoxCookieValue('timezoneoffset');
-                } else { //single-sign-on (bypass login screen)
-                    g_sessionKey = encodeURIComponent(g_loginResponse.sessionkey);
-                    g_role = g_loginResponse.type;
-                    g_username = g_loginResponse.username;
-                    g_userid = g_loginResponse.userid;
-                    g_account = g_loginResponse.account;
-                    g_domainid = g_loginResponse.domainid;
-                    g_userfullname = g_loginResponse.firstname + ' ' + g_loginResponse.lastname;
-                    g_timezone = g_loginResponse.timezone;
-                    g_timezoneoffset = g_loginResponse.timezoneoffset;
-                }
-
-                var userValid = false;
-                $.ajax({
-                    url: createURL("listCapabilities"),
-                    dataType: "json",
-                    async: false,
-                    success: function(json) {
-                        g_capabilities = json.listcapabilitiesresponse.capability;
-                        g_supportELB = json.listcapabilitiesresponse.capability.supportELB.toString(); //convert boolean to string if it's boolean
-                        g_kvmsnapshotenabled = json.listcapabilitiesresponse.capability.kvmsnapshotenabled; //boolean
-                        g_regionsecondaryenabled = json.listcapabilitiesresponse.capability.regionsecondaryenabled; //boolean
-                        if (json.listcapabilitiesresponse.capability.userpublictemplateenabled != null) {
-                            g_userPublicTemplateEnabled = json.listcapabilitiesresponse.capability.userpublictemplateenabled.toString(); //convert boolean to string if it's boolean
-                        }
-
-                        g_allowUserExpungeRecoverVm = json.listcapabilitiesresponse.capability.allowuserexpungerecovervm;
-                        g_allowUserExpungeRecoverVolume = json.listcapabilitiesresponse.capability.allowuserexpungerecovervolume;
-                        g_userProjectsEnabled = json.listcapabilitiesresponse.capability.allowusercreateprojects;
-
-                        g_cloudstackversion = json.listcapabilitiesresponse.capability.cloudstackversion;
-                        // Allow users to see all accounts within a domain
-                        g_allowUserViewAllDomainAccounts = json.listcapabilitiesresponse.capability.allowuserviewalldomainaccounts;
-
-                        if (json.listcapabilitiesresponse.capability.apilimitinterval != null && json.listcapabilitiesresponse.capability.apilimitmax != null) {
-                            var intervalLimit = ((json.listcapabilitiesresponse.capability.apilimitinterval * 1000) / json.listcapabilitiesresponse.capability.apilimitmax) * 3; //multiply 3 to be on safe side
-                            //intervalLimit = 9999; //this line is for testing only, comment it before check in
-                            if (intervalLimit > g_queryAsyncJobResultInterval)
-                                g_queryAsyncJobResultInterval = intervalLimit;
-                        }
-
-                        userValid = true;
-                    },
-                    error: function(xmlHTTP) { //override default error handling, do nothing instead of showing error "unable to verify user credentials" on login screen
-                    },
-                    beforeSend: function(XMLHttpResponse) {
-                        return true;
-                    }
-                });
-
-               updateSharedConfigs()
-
-               // Populate IDP list
-               $.ajax({
-                   type: 'GET',
-                   url: createURL('listIdps'),
-                   dataType: 'json',
-                   async: false,
-                   success: function(data, textStatus, xhr) {
-                       if (data && data.listidpsresponse && data.listidpsresponse.idp) {
-                           var idpList = data.listidpsresponse.idp.sort(function (a, b) {
-                               return a.orgName.localeCompare(b.orgName);
-                           });
-                           g_idpList = idpList;
-                       }
-                   },
-                   error: function(xhr) {
-                   }
-               });
-
-                return userValid ? {
-                    user: {
-                        userid: g_userid,
-                        username: g_username,
-                        account: g_account,
-                        name: g_userfullname,
-                        role: g_role,
-                        domainid: g_domainid
-                    }
-                } : false;
-            },
-
-            // Actual login process, via form
-            loginAction: function(args) {
-                var array1 = [];
-                array1.push("&username=" + encodeURIComponent(args.data.username));
-
-                cloudStack.addPasswordToCommandUrlParameterArray(array1, args.data.password);
-                var domain;
-                if (args.data.domain != null && args.data.domain.length > 0) {
-                    if (args.data.domain.charAt(0) != "/")
-                        domain = "/" + args.data.domain;
-                    else
-                        domain = args.data.domain;
-                    array1.push("&domain=" + encodeURIComponent(domain));
-                } else {
-                    array1.push("&domain=" + encodeURIComponent("/"));
-                }
-
-                var loginCmdText = array1.join("");
-
-                // Logout before login is called to purge any duplicate sessionkey cookies
-                // to handle edge cases around upgrades and using legacy UI with Primate
-                $.ajax({
-                    url: createURL('logout'),
-                    async: false,
-                    success: function() {},
-                    error: function() {}
-                });
-
-                $.ajax({
-                    type: "POST",
-                    data: "command=login" + loginCmdText + "&response=json",
-                    dataType: "json",
-                    async: false,
-                    success: function(json) {
-                        var loginresponse = json.loginresponse;
-                        // sessionkey is recevied as a HttpOnly cookie
-                        // therefore reset any g_sessionKey value, an explicit
-                        // param in the API call is no longer needed
-                        g_sessionKey = null;
-                        g_role = loginresponse.type;
-                        g_username = loginresponse.username;
-                        g_userid = loginresponse.userid;
-                        g_account = loginresponse.account;
-                        g_domainid = loginresponse.domainid;
-                        g_timezone = loginresponse.timezone;
-                        g_timezoneoffset = loginresponse.timezoneoffset;
-                        g_userfullname = loginresponse.firstname + ' ' + loginresponse.lastname;
-
-                        $.cookie('username', g_username, {
-                            expires: 1
-                        });
-                        $.cookie('account', g_account, {
-                            expires: 1
-                        });
-                        $.cookie('domainid', g_domainid, {
-                            expires: 1
-                        });
-                        $.cookie('role', g_role, {
-                            expires: 1
-                        });
-                        $.cookie('timezone', g_timezone, {
-                            expires: 1
-                        });
-                        $.cookie('timezoneoffset', g_timezoneoffset, {
-                            expires: 1
-                        });
-                        $.cookie('userfullname', g_userfullname, {
-                            expires: 1
-                        });
-                        $.cookie('userid', g_userid, {
-                            expires: 1
-                        });
-
-                        $.ajax({
-                            url: createURL("listCapabilities"),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                g_capabilities = json.listcapabilitiesresponse.capability;
-                                g_supportELB = json.listcapabilitiesresponse.capability.supportELB.toString(); //convert boolean to string if it's boolean
-                                g_kvmsnapshotenabled = json.listcapabilitiesresponse.capability.kvmsnapshotenabled; //boolean
-                                g_regionsecondaryenabled = json.listcapabilitiesresponse.capability.regionsecondaryenabled; //boolean
-                                if (json.listcapabilitiesresponse.capability.userpublictemplateenabled != null) {
-                                    g_userPublicTemplateEnabled = json.listcapabilitiesresponse.capability.userpublictemplateenabled.toString(); //convert boolean to string if it's boolean
-                                }
-                                g_allowUserExpungeRecoverVm = json.listcapabilitiesresponse.capability.allowuserexpungerecovervm;
-                                g_allowUserExpungeRecoverVolume = json.listcapabilitiesresponse.capability.allowuserexpungerecovervolume;
-                                g_userProjectsEnabled = json.listcapabilitiesresponse.capability.allowusercreateprojects;
-
-                                g_cloudstackversion = json.listcapabilitiesresponse.capability.cloudstackversion;
-                                // Allow users to see all accounts within a domain
-                                g_allowUserViewAllDomainAccounts = json.listcapabilitiesresponse.capability.allowuserviewalldomainaccounts;
-
-                                if (json.listcapabilitiesresponse.capability.apilimitinterval != null && json.listcapabilitiesresponse.capability.apilimitmax != null) {
-                                    var intervalLimit = ((json.listcapabilitiesresponse.capability.apilimitinterval * 1000) / json.listcapabilitiesresponse.capability.apilimitmax) * 3; //multiply 3 to be on safe side
-                                    //intervalLimit = 8888; //this line is for testing only, comment it before check in
-                                    if (intervalLimit > g_queryAsyncJobResultInterval)
-                                        g_queryAsyncJobResultInterval = intervalLimit;
-                                }
-
-                                args.response.success({
-                                    data: {
-                                        user: $.extend(true, {}, loginresponse, {
-                                            name: loginresponse.firstname + ' ' + loginresponse.lastname,
-                                            role: loginresponse.type == 1 ? 'admin' : 'user',
-                                            type: loginresponse.type
-                                        })
-                                    }
-                                });
-                                updateSharedConfigs();
-                            },
-                            error: function(xmlHTTP) {
-                                args.response.error();
-                            }
-                        });
-
-                        // Get project configuration
-                        // TEMPORARY -- replace w/ output of capability response, etc., once implemented
-                        window.g_projectsInviteRequired = false;
-                    },
-                    error: function(XMLHttpRequest) {
-                        var errorMsg = parseXMLHttpResponse(XMLHttpRequest);
-                        if (errorMsg.length == 0 && XMLHttpRequest.status == 0)
-                            errorMsg = dictionary['error.unable.to.reach.management.server'];
-                        else
-                            errorMsg = _l('error.invalid.username.password'); //override error message
-                        args.response.error(errorMsg);
-                    },
-                    beforeSend: function(XMLHttpResponse) {
-                        return true;
-                    }
-                });
-            },
-
-            logoutAction: function(args) {
-                $.ajax({
-                    url: createURL('logout'),
-                    async: false,
-                    success: function() {
-                        g_sessionKey = null;
-                        g_username = null;
-                        g_account = null;
-                        g_domainid = null;
-                        g_timezoneoffset = null;
-                        g_timezone = null;
-                        g_supportELB = null;
-                        g_kvmsnapshotenabled = null;
-                        g_regionsecondaryenabled = null;
-                        g_loginCmdText = null;
-                        g_allowUserViewAllDomainAccounts = null;
-                        g_routerHealthChecksEnabled = false;
-
-                        // Remove any cookies
-                        var cookies = document.cookie.split(";");
-                        for (var i = 0; i < cookies.length; i++) {
-                            var cookieName = $.trim(cookies[i].split("=")[0]);
-                            if (['login-option', 'lang'].indexOf(cookieName) < 0) {
-                                $.cookie(cookieName, null);
-                            }
-                        }
-
-                        if (onLogoutCallback()) { //onLogoutCallback() will set g_loginResponse(single-sign-on variable) to null, then bypassLoginCheck() will show login screen.
-                            document.location.reload(); //when onLogoutCallback() returns true, reload the current document.
-                        }
-                    },
-                    error: function() {
-                        if (onLogoutCallback()) { //onLogoutCallback() will set g_loginResponse(single-sign-on variable) to null, then bypassLoginCheck() will show login screen.
-                            document.location.reload(); //when onLogoutCallback() returns true, reload the current document.
-                        }
-                    },
-                    beforeSend: function(XMLHttpResponse) {
-                        return true;
-                    }
-                });
-            },
-
-            samlLoginAction: function(args) {
-                g_sessionKey = null;
-                g_username = null;
-                g_account = null;
-                g_domainid = null;
-                g_timezoneoffset = null;
-                g_timezone = null;
-                g_supportELB = null;
-                g_kvmsnapshotenabled = null;
-                g_regionsecondaryenabled = null;
-                g_loginCmdText = null;
-                g_allowUserViewAllDomainAccounts = null;
-
-                // Remove any cookies
-                var cookies = document.cookie.split(";");
-                for (var i = 0; i < cookies.length; i++) {
-                    var cookieName = $.trim(cookies[i].split("=")[0]);
-                    if (['login-option', 'lang'].indexOf(cookieName) < 0) {
-                        $.cookie(cookieName, null);
-                    }
-                }
-
-                var url = 'samlSso';
-                if (args.data.idpid) {
-                    url = url + '&idpid=' + args.data.idpid;
-                }
-                if (args.data.domain) {
-                    url = url + '&domain=' + args.data.domain;
-                }
-                window.location.href = createURL(url);
-            },
-
-            // Show cloudStack main UI widget
-            complete: function(args) {
-                var context = {
-                    users: [args.user]
-                };
-                var cloudStackArgs = $.extend(cloudStack, {
-                    context: context
-                });
-
-                // Check to invoke install wizard
-                cloudStack.installWizard.check({
-                    context: context,
-                    response: {
-                        success: function(args) {
-                            if (args.doInstall && isAdmin()) {
-                                var initInstallWizard = function() {
-                                    cloudStack.uiCustom.installWizard({
-                                        $container: $container,
-                                        context: context,
-                                        complete: function() {
-                                            // Show cloudStack main UI
-                                            $container.cloudStack($.extend(cloudStackArgs, {
-                                                hasLogo: false
-                                            }));
-                                        }
-                                    });
-                                };
-
-                                initInstallWizard();
-                            } else {
-                                // Show cloudStack main UI
-                                $container.cloudStack($.extend(cloudStackArgs, {
-                                    hasLogo: false
-                                }));
-                            }
-                        }
-                    }
-                });
-
-                // Logout action
-                $(document).on('click', '#user-options a', function() {
-                  loginArgs.logoutAction({
-                    context: cloudStack.context
-                  });
-                });
-
-                window._reloadUI = function() {
-                    $('#container').html('');
-                    $('#container').cloudStack(window.cloudStack);
-                };
-            }
-        };
-
-        if ($.urlParam('loginUrl') != 0) {
-            // SSO
-            loginArgs.hideLoginScreen = true;
-        }
-
-        // Localization
-        if (!$.isFunction(cloudStack.localizationFn)) { // i.e., localize is overridden by a plugin/module
-            cloudStack.localizationFn = function(str) {
-                var localized = dictionary[str];
-
-                return localized ? localized : str;
-            };
-        }
-
-        // Localize validation messages
-        cloudStack.localizeValidatorMessages();
-
-        cloudStack.uiCustom.login(loginArgs);
-
-        document.title = _l(cloudStackOptions.docTitle);
-    });
-})(cloudStack, jQuery);
diff --git a/ui/legacy/scripts/configuration.js b/ui/legacy/scripts/configuration.js
deleted file mode 100644
index c20c4ac..0000000
--- a/ui/legacy/scripts/configuration.js
+++ /dev/null
@@ -1,6004 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function(cloudStack, $) {
-
-    var requiredNetworkOfferingExists = false;
-    var networkServiceObjs = [],
-        serviceCheckboxNames = [];
-    var serviceFields = [];
-
-    cloudStack.sections.configuration = {
-        title: 'label.menu.service.offerings',
-        id: 'configuration',
-        sectionSelect: {
-            preFilter: function(args) {
-               if(isAdmin())
-                   return ["serviceOfferings", "systemServiceOfferings", "diskOfferings", "networkOfferings", "vpcOfferings", "backupOfferings"];
-               else if(isDomainAdmin())
-                   return ["serviceOfferings", "diskOfferings"];
-               else
-                   return null;
-            },
-            label: 'label.select.offering'
-        },
-        sections: {
-            serviceOfferings: {
-                type: 'select',
-                title: 'label.compute.offerings',
-                listView: {
-                    id: 'serviceOfferings',
-                    label: 'label.menu.service.offerings',
-                    fields: {
-                        name: {
-                            label: 'label.name',
-                            editable: true
-                        },
-                        displaytext: {
-                            label: 'label.description'
-                        }
-                    },
-
-                    reorder: cloudStack.api.actions.sort('updateServiceOffering', 'serviceOfferings'),
-
-                    actions: {
-                        add: {
-                            label: 'label.add.compute.offering',
-
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.add.service.offering';
-                                },
-                                notification: function(args) {
-                                    return 'label.add.compute.offering';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.compute.offering',
-                                preFilter: function(args) {
-                                    if (isAdmin()) {
-                                    } else {
-                                        args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                        args.$form.find('.form-item[rel=isPublic]').hide();
-                                        args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                        args.$form.find('.form-item[rel=deploymentPlanner]').hide();
-                                        args.$form.find('.form-item[rel=plannerMode]').hide();
-                                        args.$form.find('.form-item[rel=storageTags]').hide();
-                                        args.$form.find('.form-item[rel=hostTags]').hide();
-                                    }
-                                },
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpComputeOfferingName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        docID: 'helpComputeOfferingDescription',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    storageType: {
-                                        label: 'label.storage.type',
-                                        docID: 'helpComputeOfferingStorageType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'shared',
-                                                description: 'shared'
-                                            });
-                                            items.push({
-                                                id: 'local',
-                                                description: 'local'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    provisioningType: {
-                                        label: 'label.disk.provisioningtype',
-                                        docID: 'helpComputeOfferingProvisioningType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'thin',
-                                                description: 'thin'
-                                            });
-                                            items.push({
-                                                id: 'sparse',
-                                                description: 'sparse'
-                                            });
-                                            items.push({
-                                                id: 'fat',
-                                                description: 'fat'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    cacheMode: {
-                                        label: 'label.cache.mode',
-                                        docID: 'helpDiskOfferingCacheMode',
-                                        select: function (args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'none',
-                                                description: 'No disk cache'
-                                            });
-                                            items.push({
-                                                id: 'writeback',
-                                                description: 'Write-back disk caching'
-                                            });
-                                            items.push({
-                                                id: "writethrough",
-                                                description: 'Write-through'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            })
-                                        }
-                                    },
-                                    offeringType: {
-                                        label: 'label.compute.offering.type',
-                                        docID: 'helpComputeOfferingType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'fixed',
-                                                description: _l('label.compute.offering.fixed')
-                                            });
-                                            items.push({
-                                                id: 'customConstrained',
-                                                description: _l('label.compute.offering.custom.constrained')
-                                            });
-                                            items.push({
-                                                id: 'customUnconstrained',
-                                                description: _l('label.compute.offering.custom.unconstrained')
-                                            });
-
-                                            args.response.success({
-                                                data: items
-                                            });
-
-                                            args.$select.change(function() {
-                                                var $form = $(this).closest('form');
-
-                                                var $cpuNumber = $form.find('.form-item[rel=cpuNumber]');
-                                                var $cpuSpeed = $form.find('.form-item[rel=cpuSpeed]');
-                                                var $memory = $form.find('.form-item[rel=memory]');
-
-                                                var $minCPUNumber = $form.find('.form-item[rel=minCPUNumber]');
-                                                var $maxCPUNumber = $form.find('.form-item[rel=maxCPUNumber]');
-                                                var $minMemory = $form.find('.form-item[rel=minMemory]');
-                                                var $maxMemory = $form.find('.form-item[rel=maxMemory]');
-
-                                                var type = $(this).val();
-                                                if (type == 'fixed') {
-                                                    $minCPUNumber.hide();
-                                                    $maxCPUNumber.hide();
-                                                    $minMemory.hide();
-                                                    $maxMemory.hide();
-
-                                                    $cpuNumber.css('display', 'inline-block');
-                                                    $cpuSpeed.css('display', 'inline-block');
-                                                    $memory.css('display', 'inline-block');
-                                                } else if (type == 'customConstrained') {
-                                                    $cpuNumber.hide();
-                                                    $memory.hide();
-
-                                                    $cpuSpeed.css('display', 'inline-block');
-                                                    $minCPUNumber.css('display', 'inline-block');
-                                                    $maxCPUNumber.css('display', 'inline-block');
-                                                    $minMemory.css('display', 'inline-block');
-                                                    $maxMemory.css('display', 'inline-block');
-                                                } else {
-                                                    $cpuNumber.hide();
-                                                    $memory.hide();
-                                                    $cpuSpeed.hide();
-                                                    $minCPUNumber.hide();
-                                                    $maxCPUNumber.hide();
-                                                    $minMemory.hide();
-                                                    $maxMemory.hide();
-                                                }
-                                            });
-                                        }
-                                    },
-                                    cpuNumber: {
-                                        label: 'label.num.cpu.cores',
-                                        dependsOn: 'isCustomized',
-                                        docID: 'helpComputeOfferingCPUCores',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    cpuSpeed: {
-                                        label: 'label.cpu.mhz',
-                                        dependsOn: 'isCustomized',
-                                        docID: 'helpComputeOfferingCPUMHz',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    memory: {
-                                        label: 'label.memory.mb',
-                                        dependsOn: 'isCustomized',
-                                        docID: 'helpComputeOfferingMemory',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    // Custom Compute Offering
-                                    minCPUNumber: {
-                                        label: 'label.min.cpu.cores',
-                                        docID: 'helpComputeOfferingMinCPUCores',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    maxCPUNumber: {
-                                        label: 'label.max.cpu.cores',
-                                        docID: 'helpComputeOfferingMaxCPUCores',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    minMemory: {
-                                        label: 'label.memory.minimum.mb',
-                                        docID: 'helpComputeOfferingMinMemory',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    maxMemory: {
-                                        label: 'label.memory.maximum.mb',
-                                        docID: 'helpComputeOfferingMaxMemory',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    networkRate: {
-                                        label: 'label.network.rate',
-                                        docID: 'helpComputeOfferingNetworkRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    qosType: {
-                                        label: 'label.qos.type',
-                                        docID: 'helpDiskOfferingQoSType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: ''
-                                            });
-                                            items.push({
-                                                id: 'hypervisor',
-                                                description: 'hypervisor'
-                                            });
-                                            items.push({
-                                                id: 'storage',
-                                                description: 'storage'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-
-                                            args.$select.change(function() {
-                                                var $form = $(this).closest('form');
-                                                var $isCustomizedIops = $form.find('.form-item[rel=isCustomizedIops]');
-                                                var $minIops = $form.find('.form-item[rel=minIops]');
-                                                var $maxIops = $form.find('.form-item[rel=maxIops]');
-                                                var $hypervisorSnapshotReserve = $form.find('.form-item[rel=hypervisorSnapshotReserve]');
-                                                var $diskBytesReadRate = $form.find('.form-item[rel=diskBytesReadRate]');
-                                                var $diskBytesWriteRate = $form.find('.form-item[rel=diskBytesWriteRate]');
-                                                var $diskIopsReadRate = $form.find('.form-item[rel=diskIopsReadRate]');
-                                                var $diskIopsWriteRate = $form.find('.form-item[rel=diskIopsWriteRate]');
-
-                                                var qosId = $(this).val();
-
-                                                if (qosId == 'storage') { // Storage QoS
-                                                    $diskBytesReadRate.hide();
-                                                    $diskBytesWriteRate.hide();
-                                                    $diskIopsReadRate.hide();
-                                                    $diskIopsWriteRate.hide();
-
-                                                    $isCustomizedIops.css('display', 'inline-block');
-
-                                                    if ($isCustomizedIops.find('input[type=checkbox]').is(':checked')) {
-                                                        $minIops.hide();
-                                                        $maxIops.hide();
-                                                    } else {
-                                                        $minIops.css('display', 'inline-block');
-                                                        $maxIops.css('display', 'inline-block');
-                                                    }
-
-                                                    $hypervisorSnapshotReserve.css('display', 'inline-block');
-                                                } else if (qosId == 'hypervisor') { // Hypervisor Qos
-                                                    $isCustomizedIops.hide();
-                                                    $minIops.hide();
-                                                    $maxIops.hide();
-                                                    $hypervisorSnapshotReserve.hide();
-
-                                                    $diskBytesReadRate.css('display', 'inline-block');
-                                                    $diskBytesWriteRate.css('display', 'inline-block');
-                                                    $diskIopsReadRate.css('display', 'inline-block');
-                                                    $diskIopsWriteRate.css('display', 'inline-block');
-                                                } else { // No Qos
-                                                    $diskBytesReadRate.hide();
-                                                    $diskBytesWriteRate.hide();
-                                                    $diskIopsReadRate.hide();
-                                                    $diskIopsWriteRate.hide();
-                                                    $isCustomizedIops.hide();
-                                                    $minIops.hide();
-                                                    $maxIops.hide();
-                                                    $hypervisorSnapshotReserve.hide();
-                                                }
-                                            });
-                                        }
-                                    },
-                                    isCustomizedIops: {
-                                        label: 'label.custom.disk.iops',
-                                        docID: 'helpDiskOfferingCustomDiskIops',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false
-                                    },
-                                    minIops: {
-                                        label: 'label.disk.iops.min',
-                                        docID: 'helpDiskOfferingDiskIopsMin',
-                                        dependsOn: 'isCustomizedIops',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    maxIops: {
-                                        label: 'label.disk.iops.max',
-                                        docID: 'helpDiskOfferingDiskIopsMax',
-                                        dependsOn: 'isCustomizedIops',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    hypervisorSnapshotReserve: {
-                                        label: 'label.hypervisor.snapshot.reserve',
-                                        docID: 'helpDiskOfferingHypervisorSnapshotReserve',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    diskBytesReadRate: {
-                                        label: 'label.disk.bytes.read.rate',
-                                        docID: 'helpComputeOfferingDiskBytesReadRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskBytesWriteRate: {
-                                        label: 'label.disk.bytes.write.rate',
-                                        docID: 'helpComputeOfferingDiskBytesWriteRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskIopsReadRate: {
-                                        label: 'label.disk.iops.read.rate',
-                                        docID: 'helpComputeOfferingDiskIopsReadRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskIopsWriteRate: {
-                                        label: 'label.disk.iops.write.rate',
-                                        docID: 'helpComputeOfferingDiskIopsWriteRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    offerHA: {
-                                        label: 'label.offer.ha',
-                                        docID: 'helpComputeOfferingHA',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    },
-                                    rootDiskSize: {
-                                        label: 'label.root.disk.size',
-                                        docID: 'helpRootDiskSizeGb',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    storageTags: {
-                                        label: 'label.storage.tags',
-                                        docID: 'helpComputeOfferingStorageType',
-                                        isTokenInput: true,
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL("listStorageTags"),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var item = json.liststoragetagsresponse.storagetag;
-                                                    var tags = [];
-
-                                                    if (item != null)
-                                                    {
-                                                        tags = $.map(item, function(tag) {
-                                                            return {
-                                                                       id: tag.name,
-                                                                       name: tag.name
-                                                                   };
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: tags,
-                                                        hintText: _l('hint.type.part.storage.tag'),
-                                                        noResultsText: _l('hint.no.storage.tags')
-                                                    });
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        }
-                                    },
-                                    hostTags: { //Only one single host tag is supported at server-side. Multiple host tags are NOT supported at server-side.
-                                        label: 'label.host.tag',
-                                        docID: 'helpComputeOfferingHostTags'
-                                    },
-                                    cpuCap: {
-                                        label: 'label.CPU.cap',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        docID: 'helpComputeOfferingCPUCap'
-                                    },
-                                    isPublic: {
-                                        label: 'label.public',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false,
-                                        docID: 'helpComputeOfferingPublic'
-                                    },
-
-                                    isVolatile: {
-                                        label: 'label.volatile',
-                                        isBoolean: true,
-                                        isChecked: false
-
-                                    },
-
-                                    deploymentPlanner: {
-                                        label: 'label.deployment.planner',
-                                        select: function(args) {
-                                          if (isAdmin()) {
-                                            $.ajax({
-                                                url: createURL('listDeploymentPlanners'),
-                                                dataType: 'json',
-                                                success: function(json) {
-                                                    var items = [{
-                                                        id: '',
-                                                        description: ''
-                                                    }];
-                                                    var plannerObjs = json.listdeploymentplannersresponse.deploymentPlanner;
-                                                    $(plannerObjs).each(function() {
-                                                        items.push({
-                                                            id: this.name,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                    args.$select.change(function() {
-                                                        var $form = $(this).closest('form');
-                                                        var $fields = $form.find('.field');
-                                                        if ($(this).val() == "ImplicitDedicationPlanner") {
-                                                            $form.find('[rel=plannerMode]').css('display', 'block');
-                                                        } else {
-                                                            $form.find('[rel=plannerMode]').hide();
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                          }
-                                        }
-                                    },
-
-                                    // plannerKey:{label:'Planner Key' , docID:'helpImplicitPlannerKey'},
-                                    plannerMode: {
-                                        label: 'label.planner.mode',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: ''
-                                            });
-                                            items.push({
-                                                id: 'Strict',
-                                                description: 'Strict'
-                                            });
-                                            items.push({
-                                                id: 'Preferred',
-                                                description: 'Preferred'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    pciDevice: {
-                                        label: 'label.gpu',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: ''
-                                            });
-                                            items.push({
-                                                id: 'Group of NVIDIA Corporation GK107GL [GRID K1] GPUs',
-                                                description: 'NVIDIA GRID K1'
-                                            });
-                                            items.push({
-                                                id: 'Group of NVIDIA Corporation GK104GL [GRID K2] GPUs',
-                                                description: 'NVIDIA GRID K2'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-
-                                            var vGpuMap = {};
-                                            vGpuMap['Group of NVIDIA Corporation GK107GL [GRID K1] GPUs'] = ['passthrough', 'GRID K100', 'GRID K120Q', 'GRID K140Q', 'GRID K160Q', 'GRID K180Q'];
-                                            vGpuMap['Group of NVIDIA Corporation GK104GL [GRID K2] GPUs'] = ['passthrough', 'GRID K200', 'GRID K220Q', 'GRID K240Q', 'GRID K260Q', 'GRID K280Q'];
-
-                                            args.$select.change(function() {
-                                                var gpu = $(this).val();
-
-                                                if (gpu == '') {
-                                                    $(this).closest('form').find('.form-item[rel=\"vgpuType\"]').hide();
-                                                }
-                                                else {
-                                                    $(this).closest('form').find('.form-item[rel=\"vgpuType\"]').css('display', 'inline-block');
-
-                                                    // enable/disable vGPU type options, depending on selected GPU
-                                                    var $vGpuTypeSelect = $(this).closest('form').find('select[name=vgpuType]');
-                                                    var $vGpuTypeOptions = $vGpuTypeSelect.find('option');
-                                                    $vGpuTypeOptions.each(function(index) {
-                                                        var vGpuTypeOption = $(this).val();
-                                                        if (vGpuTypeOption == '' || (gpu in vGpuMap && $.inArray(vGpuTypeOption, vGpuMap[gpu]) > -1))
-                                                            $(this).attr('disabled', false);
-                                                        else
-                                                            $(this).attr('disabled', true);
-                                                    });
-
-                                                    //if selected option is disabled, select the first enabled option instead
-                                                    if ($vGpuTypeSelect.find('option:selected:disabled').length > 0) {
-                                                        $vGpuTypeSelect.val($vGpuTypeSelect.find('option:enabled:first').val());
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    vgpuType: {
-                                        label: 'label.vgpu.type',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: ''
-                                            });
-                                            items.push({
-                                                id: 'passthrough',
-                                                description: 'passthrough'
-                                            });
-                                            items.push({
-                                                id: 'GRID K100',
-                                                description: 'GRID K100'
-                                            });
-                                            items.push({
-                                                id: 'GRID K120Q',
-                                                description: 'GRID K120Q'
-                                            });
-                                            items.push({
-                                                id: 'GRID K140Q',
-                                                description: 'GRID K140Q'
-                                            });
-                                            items.push({
-                                                id: 'GRID K160Q',
-                                                description: 'GRID K160Q'
-                                            });
-                                            items.push({
-                                                id: 'GRID K180Q',
-                                                description: 'GRID K180Q'
-                                            });
-                                            items.push({
-                                                id: 'GRID K200',
-                                                description: 'GRID K200'
-                                            });
-                                            items.push({
-                                                id: 'GRID K220Q',
-                                                description: 'GRID K220Q'
-                                            });
-                                            items.push({
-                                                id: 'GRID K240Q',
-                                                description: 'GRID K240Q'
-                                            });
-                                            items.push({
-                                                id: 'GRID K260Q',
-                                                description: 'GRID K260Q'
-                                            });
-                                            items.push({
-                                                id: 'GRID K280Q',
-                                                description: 'GRID K280Q'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    domainId: {
-                                        label: 'label.domain',
-                                        docID: 'helpComputeOfferingDomain',
-                                        dependsOn: 'isPublic',
-                                        isMultiple: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    $(domainObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.path
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        isHidden: true
-                                    },
-                                    zoneId: {
-                                        label: 'label.zone',
-                                        docID: 'helpComputeOfferingZone',
-                                        isMultiple: true,
-                                        validation: {
-                                            allzonesonly: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones"),
-                                                data: {available: 'true'},
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    $(zoneObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    items.unshift({
-                                                        id: -1,
-                                                        description: "All Zones"
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var isFixedOfferingType = args.data.offeringType == 'fixed';
-                                var data = {
-                                    issystem: false,
-                                    name: args.data.name,
-                                    displaytext: args.data.description,
-                                    storageType: args.data.storageType,
-                                    provisioningType :args.data.provisioningType,
-                                    customized: !isFixedOfferingType,
-                                    cacheMode: args.data.cacheMode
-                                };
-
-                                //custom fields (begin)
-                                if (isFixedOfferingType) {
-                                    $.extend(data, {
-                                        cpuNumber: args.data.cpuNumber
-                                    });
-                                    $.extend(data, {
-                                        cpuSpeed: args.data.cpuSpeed
-                                    });
-                                    $.extend(data, {
-                                        memory: args.data.memory
-                                    });
-                                } else {
-                                    if(args.data.cpuSpeed != null && args.data.minCPUNumber != null && args.data.maxCPUNumber != null && args.data.minMemory != null && args.data.maxMemory != null){
-                                        $.extend(data, {
-                                            cpuSpeed: args.data.cpuSpeed
-                                        });
-                                        $.extend(data, {
-                                            mincpunumber: args.data.minCPUNumber
-                                        });
-                                        $.extend(data, {
-                                            maxcpunumber: args.data.maxCPUNumber
-                                        });
-                                        $.extend(data, {
-                                            minmemory: args.data.minMemory
-                                        });
-                                        $.extend(data, {
-                                            maxmemory: args.data.maxMemory
-                                        });
-                                    }
-                                }
-                                //custom fields (end)
-
-                                if (args.data.deploymentPlanner != null && args.data.deploymentPlanner.length > 0) {
-                                    $.extend(data, {
-                                        deploymentplanner: args.data.deploymentPlanner
-                                    });
-                                }
-
-                                var array1 = [];
-                                if (args.data.deploymentPlanner == "ImplicitDedicationPlanner" && args.data.plannerMode != "") {
-                                    array1.push("&serviceofferingdetails[0].key" + "=" + "ImplicitDedicationMode");
-                                    array1.push("&serviceofferingdetails[0].value" + "=" + args.data.plannerMode);
-                                }
-
-                                if (args.data.pciDevice != "") {
-                                    array1.push("&serviceofferingdetails[1].key" + "=" + "pciDevice");
-                                    array1.push("&serviceofferingdetails[1].value" + "=" + args.data.pciDevice);
-                                }
-
-                                if (args.data.vgpuType != "") {
-                                    array1.push("&serviceofferingdetails[2].key" + "=" + "vgpuType");
-                                    array1.push("&serviceofferingdetails[2].value" + "=" + args.data.vgpuType);
-                                }
-
-                                if (args.data.networkRate != null && args.data.networkRate.length > 0) {
-                                    $.extend(data, {
-                                        networkrate: args.data.networkRate
-                                    });
-                                }
-
-                                if (args.data.qosType == 'storage') {
-                                    var customIops = args.data.isCustomizedIops == "on";
-
-                                    $.extend(data, {
-                                        customizediops: customIops
-                                    });
-
-                                    if (!customIops) {
-                                        if (args.data.minIops != null && args.data.minIops.length > 0) {
-                                            $.extend(data, {
-                                                miniops: args.data.minIops
-                                            });
-                                        }
-
-                                        if (args.data.maxIops != null && args.data.maxIops.length > 0) {
-                                            $.extend(data, {
-                                                maxiops: args.data.maxIops
-                                            });
-                                        }
-                                    }
-
-                                    if (args.data.hypervisorSnapshotReserve != null && args.data.hypervisorSnapshotReserve.length > 0) {
-                                        $.extend(data, {
-                                            hypervisorsnapshotreserve: args.data.hypervisorSnapshotReserve
-                                        });
-                                    }
-                                } else if (args.data.qosType == 'hypervisor') {
-                                    if (args.data.diskBytesReadRate != null && args.data.diskBytesReadRate.length > 0) {
-                                        $.extend(data, {
-                                            bytesreadrate: args.data.diskBytesReadRate
-                                        });
-                                    }
-
-                                    if (args.data.diskBytesWriteRate != null && args.data.diskBytesWriteRate.length > 0) {
-                                        $.extend(data, {
-                                            byteswriterate: args.data.diskBytesWriteRate
-                                        });
-                                    }
-
-                                    if (args.data.diskIopsReadRate != null && args.data.diskIopsReadRate.length > 0) {
-                                        $.extend(data, {
-                                            iopsreadrate: args.data.diskIopsReadRate
-                                        });
-                                    }
-
-                                    if (args.data.diskIopsWriteRate != null && args.data.diskIopsWriteRate.length > 0) {
-                                        $.extend(data, {
-                                            iopswriterate: args.data.diskIopsWriteRate
-                                        });
-                                    }
-                                }
-
-                                $.extend(data, {
-                                    offerha: (args.data.offerHA == "on")
-                                });
-
-                                if (args.data.rootDiskSize != null && args.data.rootDiskSize > 0) {
-                                    $.extend(data, {
-                                        rootDiskSize: args.data.rootDiskSize
-                                    });
-                                }
-
-                                if (args.data.storageTags != null && args.data.storageTags.length > 0) {
-                                    $.extend(data, {
-                                        tags: args.data.storageTags
-                                    });
-                                }
-
-                                if (args.data.hostTags != null && args.data.hostTags.length > 0) {
-                                    $.extend(data, {
-                                        hosttags: args.data.hostTags
-                                    });
-                                }
-
-                                $.extend(data, {
-                                    limitcpuuse: (args.data.cpuCap == "on")
-                                });
-
-                                $.extend(data, {
-                                    isvolatile: (args.data.isVolatile == "on")
-                                });
-
-                                if (args.data.isPublic != "on") {
-                                    var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                    if (domainId) {
-                                        $.extend(data, {
-                                            domainid: domainId
-                                        });
-                                    }
-                                }
-
-                                var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : undefined;
-                                if (zoneId) {
-                                    $.extend(data, {
-                                        zoneid: zoneId
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('createServiceOffering' + array1.join("")),
-                                    data: data,
-                                    success: function(json) {
-                                        var item = json.createserviceofferingresponse.serviceoffering;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.extend(data, {
-                            issystem: false
-                        });
-
-                        $.ajax({
-                            url: createURL('listServiceOfferings&isrecursive=true'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listserviceofferingsresponse.serviceoffering;
-                                args.response.success({
-                                    actionFilter: serviceOfferingActionfilter,
-                                    data: items
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.service.offering.details',
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.serviceOfferings[0].id,
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateServiceOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updateserviceofferingresponse.serviceoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.service.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.service.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.service.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.serviceOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteServiceOffering'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            updateOfferingAccess: {
-                                label: 'label.action.update.offering.access',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.update.offering.access';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.compute.offering.access',
-                                    desc: '',
-                                    preFilter: function(args) {
-                                        if (isAdmin()) {
-                                        } else {
-                                            args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                            args.$form.find('.form-item[rel=isPublic]').hide();
-                                            args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                            args.$form.find('.form-item[rel=zoneId]').hide();
-                                        }
-                                        var formOffering = args.context.serviceOfferings[0];
-                                        $.ajax({
-                                            url: createURL('listServiceOfferings&isrecursive=true'),
-                                            data: {
-                                                id: args.context.serviceOfferings[0].id
-                                            },
-                                            dataType: "json",
-                                            async: false,
-                                            success: function (json) {
-                                                var item = json.listserviceofferingsresponse.serviceoffering[0];
-                                                formOffering = item;
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            }
-                                        }); //end ajax
-                                        var offeringDomainIds = formOffering.domainid;
-                                        if (offeringDomainIds) {
-                                            args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                            args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                            offeringDomainIds = offeringDomainIds.indexOf(",") != -1 ? offeringDomainIds.split(",") : [offeringDomainIds];
-                                            var options = args.$form.find('.form-item[rel=domainId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringDomainIds, function(domainIdIndex, domainId) {
-                                                    domainId = domainId.toString().trim();
-                                                    if ($(option).val() === domainId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        } else {
-                                            if (isAdmin()) {
-                                                args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', true);
-                                            }
-                                        }
-                                        var offeringZoneIds = formOffering.zoneid;
-                                        if (offeringZoneIds) {
-                                            offeringZoneIds = offeringZoneIds.indexOf(",") != -1 ? offeringZoneIds.split(",") : [offeringZoneIds];
-                                            var options = args.$form.find('.form-item[rel=zoneId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringZoneIds, function(zoneIdIndex, zoneId) {
-                                                    zoneId = zoneId.toString().trim();
-                                                    if ($(option).val() === zoneId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        }
-                                    },
-                                    fields: {
-                                        isPublic: {
-                                            label: 'label.public',
-                                            isBoolean: true,
-                                            isReverse: true,
-                                            isChecked: false,
-                                            docID: 'helpComputeOfferingPublic'
-                                        },
-                                        domainId: {
-                                            label: 'label.domain',
-                                            docID: 'helpComputeOfferingDomain',
-                                            dependsOn: 'isPublic',
-                                            isMultiple: true,
-                                            isHidden: true,
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        $(domainObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.path
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                        var options = args.$form.find('.form-item[rel=domainId]').children('option');
-                                                        $.each(options, function() {
-                                                            console.log($(this).val());
-                                                        });
-                                                        console.log("Hello! "+options);
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        zoneId: {
-                                            label: 'label.zone',
-                                            docID: 'helpComputeOfferingZone',
-                                            isMultiple: true,
-                                            validation: {
-                                                allzonesonly: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listZones"),
-                                                    data: {available: 'true'},
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var zoneObjs = json.listzonesresponse.zone;
-                                                        $(zoneObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        items.unshift({
-                                                            id: -1,
-                                                            description: "All Zones",
-                                                            selected: true
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.serviceOfferings[0].id
-                                    };
-                                    if (args.data.isPublic != "on") {
-                                        var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                        if (domainId) {
-                                            $.extend(data, {
-                                                domainid: domainId
-                                            });
-                                        }
-                                    } else {
-                                        $.extend(data, {
-                                            domainid: "public"
-                                        });
-                                    }
-                                    var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : "all";
-                                    if (zoneId) {
-                                        $.extend(data, {
-                                            zoneid: zoneId
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('updateServiceOffering'),
-                                        data: data,
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var item = json.updateserviceofferingresponse.serviceoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    }); //end ajax
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    storagetype: {
-                                        label: 'label.storage.type'
-                                    },
-                                    provisioningtype: {
-                                        label: 'label.disk.provisioningtype'
-                                    },
-                                    cacheMode: {
-                                        label: 'label.cache.mode'
-                                    },
-                                    cpunumber: {
-                                        label: 'label.num.cpu.cores'
-                                    },
-                                    cpuspeed: {
-                                        label: 'label.cpu.mhz',
-                                        converter: function(args) {
-                                            return cloudStack.converters.convertHz(args);
-                                        }
-                                    },
-                                    memory: {
-                                        label: 'label.memory.mb',
-                                        converter: function(args) {
-                                            if (args == undefined)
-                                                return '';
-                                            else
-                                                return cloudStack.converters.convertBytes(args * 1024 * 1024);
-                                        }
-                                    },
-                                    networkrate: {
-                                        label: 'label.network.rate'
-                                    },
-                                    iscustomizediops: {
-                                        label: 'label.custom.disk.iops',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    miniops: {
-                                        label: 'label.disk.iops.min',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    maxiops: {
-                                        label: 'label.disk.iops.max',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    hypervisorsnapshotreserve: {
-                                        label: 'label.hypervisor.snapshot.reserve',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    diskBytesReadRate: {
-                                        label: 'label.disk.bytes.read.rate'
-                                    },
-                                    diskBytesWriteRate: {
-                                        label: 'label.disk.bytes.write.rate'
-                                    },
-                                    diskIopsReadRate: {
-                                        label: 'label.disk.iops.read.rate'
-                                    },
-                                    diskIopsWriteRate: {
-                                        label: 'label.disk.iops.write.rate'
-                                    },
-                                    offerha: {
-                                        label: 'label.offer.ha',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    limitcpuuse: {
-                                        label: 'label.CPU.cap',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    isvolatile: {
-                                        label: 'label.volatile',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    deploymentplanner: {
-                                        label: 'label.deployment.planner'
-                                    },
-                                    plannerMode: {
-                                        label: 'label.planner.mode'
-                                    },
-                                    pciDevice: {
-                                        label: 'label.gpu'
-                                    },
-                                    vgpuType: {
-                                        label: 'label.vgpu.type'
-                                    },
-                                    tags: {
-                                        label: 'label.storage.tags'
-                                    },
-                                    hosttags: {
-                                        label: 'label.host.tag'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    zone: {
-                                        label: 'label.zone'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    var data = {
-                                        issystem: false,
-                                        id: args.context.serviceOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('listServiceOfferings&isrecursive=true'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.listserviceofferingsresponse.serviceoffering[0];
-
-                                            if (item.deploymentplanner != null && item.serviceofferingdetails != null) {
-                                                if (item.deploymentplanner == 'ImplicitDedicationPlanner' && item.serviceofferingdetails.ImplicitDedicationMode != null) {
-                                                    item.plannerMode = item.serviceofferingdetails.ImplicitDedicationMode;
-                                                }
-                                            }
-
-                                            if (item.serviceofferingdetails != null) {
-                                                item.pciDevice = item.serviceofferingdetails.pciDevice;
-                                                item.vgpuType = item.serviceofferingdetails.vgpuType;
-                                            }
-
-                                            args.response.success({
-                                                actionFilter: serviceOfferingActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            systemServiceOfferings: {
-                type: 'select',
-                title: 'label.menu.system.service.offerings',
-                listView: {
-                    id: 'systemServiceOfferings',
-                    label: 'label.menu.system.service.offerings',
-                    fields: {
-                        name: {
-                            label: 'label.name',
-                            editable: true
-                        },
-                        displaytext: {
-                            label: 'label.description'
-                        }
-                    },
-
-                    reorder: cloudStack.api.actions.sort('updateServiceOffering', 'systemServiceOfferings'),
-
-                    actions: {
-                        add: {
-                            label: 'label.add.system.service.offering',
-
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.add.system.service.offering';
-                                },
-                                notification: function(args) {
-                                    return 'label.add.system.service.offering';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.system.service.offering',
-                                preFilter: function(args) {
-                                    if (isAdmin()) {
-                                    } else {
-                                        args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                        args.$form.find('.form-item[rel=isPublic]').hide();
-                                        args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                    }
-                                },
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpSystemOfferingName'
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpSystemOfferingDescription'
-                                    },
-                                    systemvmtype: {
-                                        label: 'label.system.vm.type',
-                                        docID: 'helpSystemOfferingVMType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'domainrouter',
-                                                description: _l('label.domain.router')
-                                            });
-                                            items.push({
-                                                id: 'consoleproxy',
-                                                description: _l('label.console.proxy')
-                                            });
-                                            items.push({
-                                                id: 'secondarystoragevm',
-                                                description: _l('label.secondary.storage.vm')
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    storageType: {
-                                        label: 'label.storage.type',
-                                        docID: 'helpSystemOfferingStorageType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'shared',
-                                                description: 'shared'
-                                            });
-                                            items.push({
-                                                id: 'local',
-                                                description: 'local'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    provisioningType: {
-                                        label: 'label.disk.provisioningtype',
-                                        docID: 'helpDiskOfferingProvisioningType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'thin',
-                                                description: 'thin'
-                                            });
-                                            items.push({
-                                                id: 'sparse',
-                                                description: 'sparse'
-                                            });
-                                            items.push({
-                                                id: 'fat',
-                                                description: 'fat'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    cacheMode: {
-                                        label: 'label.cache.mode',
-                                        docID: 'helpDiskOfferingCacheMode',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'none',
-                                                description: 'No disk cache'
-                                            });
-                                            items.push({
-                                                id: 'writeback',
-                                                description: 'Write-back disk caching'
-                                            });
-                                            items.push({
-                                                id: 'writethrough',
-                                                description: 'Write-through disk caching'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            })
-                                        }
-                                    },
-                                    cpuNumber: {
-                                        label: 'label.num.cpu.cores',
-                                        docID: 'helpSystemOfferingCPUCores',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    cpuSpeed: {
-                                        label: 'label.cpu.mhz',
-                                        docID: 'helpSystemOfferingCPUMHz',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    memory: {
-                                        label: 'label.memory.mb',
-                                        docID: 'helpSystemOfferingMemory',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    networkRate: {
-                                        label: 'label.network.rate',
-                                        docID: 'helpSystemOfferingNetworkRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    qosType: {
-                                        label: 'label.qos.type',
-                                        docID: 'helpDiskOfferingQoSType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: ''
-                                            });
-                                            items.push({
-                                                id: 'hypervisor',
-                                                description: 'hypervisor'
-                                            });
-                                            items.push({
-                                                id: 'storage',
-                                                description: 'storage'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-
-                                            args.$select.change(function() {
-                                                var $form = $(this).closest('form');
-                                                var $isCustomizedIops = $form.find('.form-item[rel=isCustomizedIops]');
-                                                var $minIops = $form.find('.form-item[rel=minIops]');
-                                                var $maxIops = $form.find('.form-item[rel=maxIops]');
-                                                var $diskBytesReadRate = $form.find('.form-item[rel=diskBytesReadRate]');
-                                                var $diskBytesWriteRate = $form.find('.form-item[rel=diskBytesWriteRate]');
-                                                var $diskIopsReadRate = $form.find('.form-item[rel=diskIopsReadRate]');
-                                                var $diskIopsWriteRate = $form.find('.form-item[rel=diskIopsWriteRate]');
-
-                                                var qosId = $(this).val();
-
-                                                if (qosId == 'storage') { // Storage QoS
-                                                    $diskBytesReadRate.hide();
-                                                    $diskBytesWriteRate.hide();
-                                                    $diskIopsReadRate.hide();
-                                                    $diskIopsWriteRate.hide();
-
-                                                    $minIops.css('display', 'inline-block');
-                                                    $maxIops.css('display', 'inline-block');
-                                                } else if (qosId == 'hypervisor') { // Hypervisor Qos
-                                                    $minIops.hide();
-                                                    $maxIops.hide();
-
-                                                    $diskBytesReadRate.css('display', 'inline-block');
-                                                    $diskBytesWriteRate.css('display', 'inline-block');
-                                                    $diskIopsReadRate.css('display', 'inline-block');
-                                                    $diskIopsWriteRate.css('display', 'inline-block');
-                                                } else { // No Qos
-                                                    $diskBytesReadRate.hide();
-                                                    $diskBytesWriteRate.hide();
-                                                    $diskIopsReadRate.hide();
-                                                    $diskIopsWriteRate.hide();
-                                                    $minIops.hide();
-                                                    $maxIops.hide();
-                                                }
-                                            });
-                                        }
-                                    },
-                                    minIops: {
-                                        label: 'label.disk.iops.min',
-                                        docID: 'helpDiskOfferingDiskIopsMin',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    maxIops: {
-                                        label: 'label.disk.iops.max',
-                                        docID: 'helpDiskOfferingDiskIopsMax',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    diskBytesReadRate: {
-                                        label: 'label.disk.bytes.read.rate',
-                                        docID: 'helpSystemOfferingDiskBytesReadRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskBytesWriteRate: {
-                                        label: 'label.disk.bytes.write.rate',
-                                        docID: 'helpSystemOfferingDiskBytesWriteRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskIopsReadRate: {
-                                        label: 'label.disk.iops.read.rate',
-                                        docID: 'helpSystemOfferingDiskIopsReadRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskIopsWriteRate: {
-                                        label: 'label.disk.iops.write.rate',
-                                        docID: 'helpSystemOfferingDiskIopsWriteRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    offerHA: {
-                                        label: 'label.offer.ha',
-                                        docID: 'helpSystemOfferingHA',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    },
-                                    storageTags: {
-                                        label: 'label.storage.tags',
-                                        docID: 'helpSystemOfferingStorageTags'
-                                    },
-                                    hostTags: {
-                                        label: 'label.host.tags',
-                                        docID: 'helpSystemOfferingHostTags'
-                                    },
-                                    cpuCap: {
-                                        label: 'label.CPU.cap',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        docID: 'helpSystemOfferingCPUCap'
-                                    },
-                                    isPublic: {
-                                        label: 'label.public',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false,
-                                        docID: 'helpSystemOfferingPublic'
-                                    },
-                                    domainId: {
-                                        label: 'label.domain',
-                                        docID: 'helpSystemOfferingDomain',
-                                        dependsOn: 'isPublic',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    $(domainObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.path
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        isHidden: true
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var data = {
-                                    issystem: true,
-                                    name: args.data.name,
-                                    displaytext: args.data.description,
-                                    systemvmtype: args.data.systemvmtype,
-                                    storageType: args.data.storageType,
-                                    provisioningType: args.data.provisioningType,
-                                    cpuNumber: args.data.cpuNumber,
-                                    cpuSpeed: args.data.cpuSpeed,
-                                    memory: args.data.memory,
-                                    cacheMode: args.data.cacheMode
-                                };
-
-                                if (args.data.networkRate != null && args.data.networkRate.length > 0) {
-                                    $.extend(data, {
-                                        networkrate: args.data.networkRate
-                                    });
-                                }
-
-                                if (args.data.qosType == 'storage') {
-                                    if (args.data.minIops != null && args.data.minIops.length > 0) {
-                                        $.extend(data, {
-                                            miniops: args.data.minIops
-                                        });
-                                    }
-
-                                    if (args.data.maxIops != null && args.data.maxIops.length > 0) {
-                                        $.extend(data, {
-                                            maxiops: args.data.maxIops
-                                        });
-                                    }
-                                } else if (args.data.qosType == 'hypervisor') {
-                                    if (args.data.diskBytesReadRate != null && args.data.diskBytesReadRate.length > 0) {
-                                        $.extend(data, {
-                                            bytesreadrate: args.data.diskBytesReadRate
-                                        });
-                                    }
-
-                                    if (args.data.diskBytesWriteRate != null && args.data.diskBytesWriteRate.length > 0) {
-                                        $.extend(data, {
-                                            byteswriterate: args.data.diskBytesWriteRate
-                                        });
-                                    }
-
-                                    if (args.data.diskIopsReadRate != null && args.data.diskIopsReadRate.length > 0) {
-                                        $.extend(data, {
-                                            iopsreadrate: args.data.diskIopsReadRate
-                                        });
-                                    }
-
-                                    if (args.data.diskIopsWriteRate != null && args.data.diskIopsWriteRate.length > 0) {
-                                        $.extend(data, {
-                                            iopswriterate: args.data.diskIopsWriteRate
-                                        });
-                                    }
-                                }
-
-                                $.extend(data, {
-                                    offerha: (args.data.offerHA == "on")
-                                });
-
-                                if (args.data.storageTags != null && args.data.storageTags.length > 0) {
-                                    $.extend(data, {
-                                        tags: args.data.storageTags
-                                    });
-                                }
-
-                                if (args.data.hostTags != null && args.data.hostTags.length > 0) {
-                                    $.extend(data, {
-                                        hosttags: args.data.hostTags
-                                    });
-                                }
-
-                                $.extend(data, {
-                                    limitcpuuse: (args.data.cpuCap == "on")
-                                });
-
-                                if (args.data.isPublic != "on") {
-                                    $.extend(data, {
-                                        domainid: args.data.domainId
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('createServiceOffering'),
-                                    data: data,
-                                    success: function(json) {
-                                        var item = json.createserviceofferingresponse.serviceoffering;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.extend(data, {
-                            issystem: true
-                        });
-
-                        $.ajax({
-                            url: createURL('listServiceOfferings&isrecursive=true'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listserviceofferingsresponse.serviceoffering;
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.system.service.offering.details',
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.systemServiceOfferings[0].id,
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateServiceOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updateserviceofferingresponse.serviceoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.system.service.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.system.service.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.system.service.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.systemServiceOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteServiceOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    systemvmtype: {
-                                        label: 'label.system.vm.type',
-                                        converter: function(args) {
-                                            var text = '';
-                                            switch (args) {
-                                                case 'domainrouter':
-                                                    text = _l('label.domain.router');
-                                                    break;
-                                                case 'consoleproxy':
-                                                    text = _l('label.console.proxy');
-                                                    break;
-                                                case 'secondarystoragevm':
-                                                    text = _l('label.secondary.storage.vm');
-                                                    break;
-                                            }
-                                            return text;
-                                        }
-                                    },
-                                    storagetype: {
-                                        label: 'label.storage.type'
-                                    },
-                                    provisioningtype: {
-                                        label: 'label.disk.provisioningtype'
-                                    },
-                                    cacheMode: {
-                                        label: 'label.cache.mode'
-                                    },
-                                    cpunumber: {
-                                        label: 'label.num.cpu.cores'
-                                    },
-                                    cpuspeed: {
-                                        label: 'label.cpu.mhz',
-                                        converter: function(args) {
-                                            return cloudStack.converters.convertHz(args);
-                                        }
-                                    },
-                                    memory: {
-                                        label: 'label.memory.mb',
-                                        converter: function(args) {
-                                            if (args == undefined)
-                                                return '';
-                                            else
-                                                return cloudStack.converters.convertBytes(args * 1024 * 1024);
-                                        }
-                                    },
-                                    networkrate: {
-                                        label: 'label.network.rate'
-                                    },
-                                    miniops: {
-                                        label: 'label.disk.iops.min',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    maxiops: {
-                                        label: 'label.disk.iops.max',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    diskBytesReadRate: {
-                                        label: 'label.disk.bytes.read.rate'
-                                    },
-                                    diskBytesWriteRate: {
-                                        label: 'label.disk.bytes.write.rate'
-                                    },
-                                    diskIopsReadRate: {
-                                        label: 'label.disk.iops.read.rate'
-                                    },
-                                    diskIopsWriteRate: {
-                                        label: 'label.disk.iops.write.rate'
-                                    },
-                                    offerha: {
-                                        label: 'label.offer.ha',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    limitcpuuse: {
-                                        label: 'label.CPU.cap',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    tags: {
-                                        label: 'label.storage.tags'
-                                    },
-                                    hosttags: {
-                                        label: 'label.host.tags'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    var data = {
-                                        issystem: true,
-                                        id: args.context.systemServiceOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('listServiceOfferings&isrecursive=true'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.listserviceofferingsresponse.serviceoffering[0];
-                                            args.response.success({
-                                                actionFilter: systemServiceOfferingActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            diskOfferings: {
-                type: 'select',
-                title: 'label.menu.disk.offerings',
-                listView: {
-                    id: 'diskOfferings',
-                    label: 'label.menu.disk.offerings',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        displaytext: {
-                            label: 'label.description'
-                        },
-                        iscustomized: {
-                            label: 'label.custom.disk.size',
-                            converter: cloudStack.converters.toBooleanText
-                        },
-                        disksize: {
-                            label: 'label.disk.size.gb',
-                            converter: function(args) {
-                                if (args != 0)
-                                    return args;
-                                else
-                                    return "N/A";
-                            }
-                        }
-                    },
-
-                    reorder: cloudStack.api.actions.sort('updateDiskOffering', 'diskOfferings'),
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-                        var listDiskOfferingsOptions = {
-                            isRecursive: true,
-                            data: data,
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        };
-                        var diskOfferings = cloudStack.listDiskOfferings(listDiskOfferingsOptions);
-                        args.response.success({
-                            data: diskOfferings
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.disk.offering',
-
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.add.disk.offering';
-                                },
-                                notification: function(args) {
-                                    return 'label.add.disk.offering';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.disk.offering',
-                                preFilter: function(args) {
-                                    if (isAdmin()) {
-                                    } else {
-                                        args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                        args.$form.find('.form-item[rel=isPublic]').hide();
-                                        args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                        args.$form.find('.form-item[rel=tags]').hide();
-                                    }
-                                },
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpDiskOfferingName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        docID: 'helpDiskOfferingDescription',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    storageType: {
-                                        label: 'label.storage.type',
-                                        docID: 'helpDiskOfferingStorageType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'shared',
-                                                description: 'shared'
-                                            });
-                                            items.push({
-                                                id: 'local',
-                                                description: 'local'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    provisioningType: {
-                                        label: 'label.disk.provisioningtype',
-                                        docID: 'helpDiskOfferingProvisioningType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'thin',
-                                                description: 'thin'
-                                            });
-                                            items.push({
-                                                id: 'sparse',
-                                                description: 'sparse'
-                                            });
-                                            items.push({
-                                                id: 'fat',
-                                                description: 'fat'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    isCustomized: {
-                                        label: 'label.custom.disk.size',
-                                        docID: 'helpDiskOfferingCustomDiskSize',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false
-                                    },
-                                    disksize: {
-                                        label: 'label.disk.size.gb',
-                                        docID: 'helpDiskOfferingDiskSize',
-                                        dependsOn: 'isCustomized',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        }
-                                    },
-                                    qosType: {
-                                        label: 'label.qos.type',
-                                        docID: 'helpDiskOfferingQoSType',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: ''
-                                            });
-                                            items.push({
-                                                id: 'hypervisor',
-                                                description: 'hypervisor'
-                                            });
-                                            items.push({
-                                                id: 'storage',
-                                                description: 'storage'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-
-                                            args.$select.change(function() {
-                                                var $form = $(this).closest('form');
-                                                var $isCustomizedIops = $form.find('.form-item[rel=isCustomizedIops]');
-                                                var $minIops = $form.find('.form-item[rel=minIops]');
-                                                var $maxIops = $form.find('.form-item[rel=maxIops]');
-                                                var $hypervisorSnapshotReserve = $form.find('.form-item[rel=hypervisorSnapshotReserve]');
-                                                var $diskBytesReadRate = $form.find('.form-item[rel=diskBytesReadRate]');
-                                                var $diskBytesWriteRate = $form.find('.form-item[rel=diskBytesWriteRate]');
-                                                var $diskIopsReadRate = $form.find('.form-item[rel=diskIopsReadRate]');
-                                                var $diskIopsWriteRate = $form.find('.form-item[rel=diskIopsWriteRate]');
-
-                                                var qosId = $(this).val();
-
-                                                if (qosId == 'storage') { // Storage QoS
-                                                    $diskBytesReadRate.hide();
-                                                    $diskBytesWriteRate.hide();
-                                                    $diskIopsReadRate.hide();
-                                                    $diskIopsWriteRate.hide();
-
-                                                    $isCustomizedIops.css('display', 'inline-block');
-
-                                                    if ($isCustomizedIops.find('input[type=checkbox]').is(':checked')) {
-                                                        $minIops.hide();
-                                                        $maxIops.hide();
-                                                    } else {
-                                                        $minIops.css('display', 'inline-block');
-                                                        $maxIops.css('display', 'inline-block');
-                                                    }
-
-                                                    $hypervisorSnapshotReserve.css('display', 'inline-block');
-                                                } else if (qosId == 'hypervisor') { // Hypervisor Qos
-                                                    $isCustomizedIops.hide();
-                                                    $minIops.hide();
-                                                    $maxIops.hide();
-                                                    $hypervisorSnapshotReserve.hide();
-
-                                                    $diskBytesReadRate.css('display', 'inline-block');
-                                                    $diskBytesWriteRate.css('display', 'inline-block');
-                                                    $diskIopsReadRate.css('display', 'inline-block');
-                                                    $diskIopsWriteRate.css('display', 'inline-block');
-                                                } else { // No Qos
-                                                    $diskBytesReadRate.hide();
-                                                    $diskBytesWriteRate.hide();
-                                                    $diskIopsReadRate.hide();
-                                                    $diskIopsWriteRate.hide();
-                                                    $isCustomizedIops.hide();
-                                                    $minIops.hide();
-                                                    $maxIops.hide();
-                                                    $hypervisorSnapshotReserve.hide();
-                                                }
-                                            });
-                                        }
-                                    },
-                                    isCustomizedIops: {
-                                        label: 'label.custom.disk.iops',
-                                        docID: 'helpDiskOfferingCustomDiskIops',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false
-                                    },
-                                    minIops: {
-                                        label: 'label.disk.iops.min',
-                                        docID: 'helpDiskOfferingDiskIopsMin',
-                                        dependsOn: 'isCustomizedIops',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    maxIops: {
-                                        label: 'label.disk.iops.max',
-                                        docID: 'helpDiskOfferingDiskIopsMax',
-                                        dependsOn: 'isCustomizedIops',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    hypervisorSnapshotReserve: {
-                                        label: 'label.hypervisor.snapshot.reserve',
-                                        docID: 'helpDiskOfferingHypervisorSnapshotReserve',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    diskBytesReadRate: {
-                                        label: 'label.disk.bytes.read.rate',
-                                        docID: 'helpDiskOfferingDiskBytesReadRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskBytesWriteRate: {
-                                        label: 'label.disk.bytes.write.rate',
-                                        docID: 'helpDiskOfferingDiskBytesWriteRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskIopsReadRate: {
-                                        label: 'label.disk.iops.read.rate',
-                                        docID: 'helpDiskOfferingDiskIopsReadRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    diskIopsWriteRate: {
-                                        label: 'label.disk.iops.write.rate',
-                                        docID: 'helpDiskOfferingDiskIopsWriteRate',
-                                        validation: {
-                                            required: false, //optional
-                                            number: true
-                                        }
-                                    },
-                                    cacheMode: {
-                                        label: 'label.cache.mode',
-                                        docID: 'helpDiskOfferingCacheMode',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'none',
-                                                description: 'No disk cache'
-                                            });
-                                            items.push({
-                                                id: 'writeback',
-                                                description: 'Write-back disk caching'
-                                            });
-                                            items.push({
-                                                id: 'writethrough',
-                                                description: 'Write-through disk caching'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    tags: {
-                                        label: 'label.storage.tags',
-                                        docID: 'helpDiskOfferingStorageTags',
-                                        isTokenInput: true,
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL("listStorageTags"),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var item = json.liststoragetagsresponse.storagetag;
-                                                    var tags = [];
-
-                                                    if (item != null)
-                                                    {
-                                                        tags = $.map(item, function(tag) {
-                                                            return {
-                                                                       id: tag.name,
-                                                                       name: tag.name
-                                                                   };
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: tags,
-                                                        hintText: _l('hint.type.part.storage.tag'),
-                                                        noResultsText: _l('hint.no.storage.tags')
-                                                    });
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        }
-                                    },
-                                    isPublic: {
-                                        label: 'label.public',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false,
-                                        docID: 'helpDiskOfferingPublic'
-                                    },
-                                    domainId: {
-                                        label: 'label.domain',
-                                        docID: 'helpDiskOfferingDomain',
-                                        dependsOn: 'isPublic',
-                                        isMultiple: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    $(domainObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.path
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        isHidden: true
-                                    },
-                                    zoneId: {
-                                        label: 'label.zone',
-                                        docID: 'helpDiskOfferingZone',
-                                        isMultiple: true,
-                                        validation: {
-                                            allzonesonly: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones"),
-                                                data: {available: 'true'},
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    $(zoneObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    items.unshift({
-                                                        id: -1,
-                                                        description: "All Zones"
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var data = {
-                                    isMirrored: false,
-                                    name: args.data.name,
-                                    displaytext: args.data.description,
-                                    storageType: args.data.storageType,
-                                    cacheMode: args.data.cacheMode,
-                                    provisioningType: args.data.provisioningType,
-                                    customized: (args.data.isCustomized == "on")
-                                };
-
-                                if (args.data.isCustomized != "on") {
-                                    $.extend(data, {
-                                        disksize: args.data.disksize
-                                    });
-                                }
-
-                                if (args.data.qosType == 'storage') {
-                                    var customIops = args.data.isCustomizedIops == "on";
-
-                                    $.extend(data, {
-                                        customizediops: customIops
-                                    });
-
-                                    if (!customIops) {
-                                        if (args.data.minIops != null && args.data.minIops.length > 0) {
-                                            $.extend(data, {
-                                                miniops: args.data.minIops
-                                            });
-                                        }
-
-                                        if (args.data.maxIops != null && args.data.maxIops.length > 0) {
-                                            $.extend(data, {
-                                                maxiops: args.data.maxIops
-                                            });
-                                        }
-                                    }
-
-                                    if (args.data.hypervisorSnapshotReserve != null && args.data.hypervisorSnapshotReserve.length > 0) {
-                                        $.extend(data, {
-                                            hypervisorsnapshotreserve: args.data.hypervisorSnapshotReserve
-                                        });
-                                    }
-                                } else if (args.data.qosType == 'hypervisor') {
-                                    if (args.data.diskBytesReadRate != null && args.data.diskBytesReadRate.length > 0) {
-                                        $.extend(data, {
-                                            bytesreadrate: args.data.diskBytesReadRate
-                                        });
-                                    }
-
-                                    if (args.data.diskBytesWriteRate != null && args.data.diskBytesWriteRate.length > 0) {
-                                        $.extend(data, {
-                                            byteswriterate: args.data.diskBytesWriteRate
-                                        });
-                                    }
-
-                                    if (args.data.diskIopsReadRate != null && args.data.diskIopsReadRate.length > 0) {
-                                        $.extend(data, {
-                                            iopsreadrate: args.data.diskIopsReadRate
-                                        });
-                                    }
-
-                                    if (args.data.diskIopsWriteRate != null && args.data.diskIopsWriteRate.length > 0) {
-                                        $.extend(data, {
-                                            iopswriterate: args.data.diskIopsWriteRate
-                                        });
-                                    }
-                                }
-
-                                if (args.data.tags != null && args.data.tags.length > 0) {
-                                    $.extend(data, {
-                                        tags: args.data.tags
-                                    });
-                                }
-
-                                if (args.data.isPublic != "on") {
-                                    var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                    if (domainId) {
-                                        $.extend(data, {
-                                            domainid: domainId
-                                        });
-                                    }
-                                }
-
-                                var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : undefined;
-                                if (zoneId) {
-                                    $.extend(data, {
-                                        zoneid: zoneId
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('createDiskOffering'),
-                                    data: data,
-                                    success: function(json) {
-                                        var item = json.creatediskofferingresponse.diskoffering;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.disk.offering.details',
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.diskOfferings[0].id,
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext,
-                                        tags: args.data.tags
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateDiskOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updatediskofferingresponse.diskoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.disk.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.disk.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.disk.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.diskOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteDiskOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            updateOfferingAccess: {
-                                label: 'label.action.update.offering.access',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.update.offering.access';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.disk.offering.access',
-                                    desc: '',
-                                    preFilter: function(args) {
-                                        if (isAdmin()) {
-                                        } else {
-                                            args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                            args.$form.find('.form-item[rel=isPublic]').hide();
-                                            args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                            args.$form.find('.form-item[rel=zoneId]').hide();
-                                        }
-                                        var formOffering = args.context.diskOfferings[0];
-                                        $.ajax({
-                                            url: createURL('listDiskOfferings'),
-                                            data: {
-                                                id: args.context.diskOfferings[0].id
-                                            },
-                                            dataType: "json",
-                                            async: false,
-                                            success: function (json) {
-                                            var item = json.listdiskofferingsresponse.diskoffering[0];
-                                                formOffering = item;
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            }
-                                        }); //end ajax
-                                        var offeringDomainIds = formOffering.domainid;
-                                        if (offeringDomainIds) {
-                                            args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                            args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                            offeringDomainIds = offeringDomainIds.indexOf(",") != -1 ? offeringDomainIds.split(",") : [offeringDomainIds];
-                                            var options = args.$form.find('.form-item[rel=domainId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringDomainIds, function(domainIdIndex, domainId) {
-                                                    domainId = domainId.toString().trim();
-                                                    if ($(option).val() === domainId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        } else {
-                                            if (isAdmin()) {
-                                                args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', true);
-                                            }
-                                        }
-                                        var offeringZoneIds = formOffering.zoneid;
-                                        if (offeringZoneIds) {
-                                            offeringZoneIds = offeringZoneIds.indexOf(",") != -1 ? offeringZoneIds.split(",") : [offeringZoneIds];
-                                            var options = args.$form.find('.form-item[rel=zoneId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringZoneIds, function(zoneIdIndex, zoneId) {
-                                                    zoneId = zoneId.toString().trim();
-                                                    if ($(option).val() === zoneId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        }
-                                    },
-                                    fields: {
-                                        isPublic: {
-                                            label: 'label.public',
-                                            isBoolean: true,
-                                            isReverse: true,
-                                            isChecked: false,
-                                            docID: 'helpDiskOfferingPublic'
-                                        },
-                                        domainId: {
-                                            label: 'label.domain',
-                                            docID: 'helpDiskOfferingDomain',
-                                            dependsOn: 'isPublic',
-                                            isMultiple: true,
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        $(domainObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.path
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            isHidden: true
-                                        },
-                                        zoneId: {
-                                            label: 'label.zone',
-                                            docID: 'helpDiskOfferingZone',
-                                            isMultiple: true,
-                                            validation: {
-                                                allzonesonly: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listZones"),
-                                                    data: {available: 'true'},
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var zoneObjs = json.listzonesresponse.zone;
-                                                        $(zoneObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        items.unshift({
-                                                            id: -1,
-                                                            description: "All Zones"
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.diskOfferings[0].id
-                                    };
-                                    if (args.data.isPublic != "on") {
-                                        var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                        if (domainId) {
-                                            $.extend(data, {
-                                                domainid: domainId
-                                            });
-                                        }
-                                    } else {
-                                        $.extend(data, {
-                                            domainid: "public"
-                                        });
-                                    }
-                                    var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : "all";
-                                    if (zoneId) {
-                                        $.extend(data, {
-                                            zoneid: zoneId
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('updateDiskOffering'),
-                                        data: data,
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var item = json.updatediskofferingresponse.diskoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    }); //end ajax
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    iscustomized: {
-                                        label: 'label.custom.disk.size',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    disksize: {
-                                        label: 'label.disk.size.gb',
-                                        converter: function(args) {
-                                            if (args != 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    iscustomizediops: {
-                                        label: 'label.custom.disk.iops',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    miniops: {
-                                        label: 'label.disk.iops.min',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    maxiops: {
-                                        label: 'label.disk.iops.max',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    hypervisorsnapshotreserve: {
-                                        label: 'label.hypervisor.snapshot.reserve',
-                                        converter: function(args) {
-                                            if (args > 0)
-                                                return args;
-                                            else
-                                                return "N/A";
-                                        }
-                                    },
-                                    diskBytesReadRate: {
-                                        label: 'label.disk.bytes.read.rate'
-                                    },
-                                    diskBytesWriteRate: {
-                                        label: 'label.disk.bytes.write.rate'
-                                    },
-                                    diskIopsReadRate: {
-                                        label: 'label.disk.iops.read.rate'
-                                    },
-                                    diskIopsWriteRate: {
-                                        label: 'label.disk.iops.write.rate'
-                                    },
-                                    cacheMode: {
-                                        label: 'label.cache.mode'
-                                    },
-                                    tags: {
-                                        label: 'label.storage.tags',
-                                        docID: 'helpPrimaryStorageTags',
-                                        isEditable: true,
-                                        isTokenInput: true,
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL("listStorageTags"),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var item = json.liststoragetagsresponse.storagetag;
-                                                    var tags = [];
-
-                                                    if (item != null)
-                                                    {
-                                                        tags = $.map(item, function(tag) {
-                                                            return {
-                                                                id: tag.name,
-                                                                name: tag.name
-                                                            };
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: tags,
-                                                        hintText: _l('hint.type.part.storage.tag'),
-                                                        noResultsText: _l('hint.no.storage.tags')
-                                                    });
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        }
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    zone: {
-                                        label: 'label.zone'
-                                    },
-                                    storagetype: {
-                                        label: 'label.storage.type'
-                                    },
-                                    provisioningtype: {
-                                        label: 'label.disk.provisioningtype'
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    var data = {
-                                        isrecursive: true,
-                                        id: args.context.diskOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('listDiskOfferings'),
-                                        dataType: "json",
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.listdiskofferingsresponse.diskoffering[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            backupOfferings: {
-                type: 'select',
-                title: 'label.menu.backup.offerings',
-                listView: {
-                    id: 'backupOfferings',
-                    label: 'label.menu.backup.offerings',
-                    fields: {
-                        name: {
-                            label: 'label.name',
-                            editable: true
-                        },
-                        description: {
-                            label: 'label.description'
-                        },
-                        zonename: {
-                            label: 'label.zone',
-                        }
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.import.backup.offering',
-                            createForm: {
-                                title: 'label.import.backup.offering',
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    zoneid: {
-                                        label: 'label.zone',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones"),
-                                                data: {available: 'true'},
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    $(zoneObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    items.unshift({
-                                                      id: -1,
-                                                      description: ''
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                    args.$select.change(function() {
-                                                        var $form = $(this).closest('form');
-                                                        var zoneId = $form.find('select#label_zone').val();
-                                                        var extSelect = $form.find('select#label_external_id');
-                                                        extSelect.empty();
-                                                        if (zoneId === -1) {
-                                                          return;
-                                                        }
-                                                        $.ajax({
-                                                            url: createURL("listBackupProviderOfferings"),
-                                                            data: {zoneid: zoneId},
-                                                            dataType: "json",
-                                                            success: function(json) {
-                                                                var items = [];
-                                                                var offerings = json.listbackupproviderofferingsresponse.backupoffering;
-                                                                $(offerings).each(function() {
-                                                                    extSelect.append(new Option(this.name, this.externalid))
-                                                                });
-                                                            }
-                                                        });
-                                                    })
-                                                }
-                                            });
-                                        }
-                                    },
-                                    externalid: {
-                                        label: 'label.external.id',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: []
-                                            });
-                                        }
-                                    },
-                                    allowuserdrivenbackups: {
-                                        label: 'label.backup.user.driven',
-                                        isBoolean: true,
-                                        isChecked: true
-                                    }
-                                }//end of fields
-                            }, //end of createForm
-
-                            action: function(args) {
-                                $.ajax({
-                                    url: createURL('importBackupOffering'),
-                                    data: {
-                                      name: args.data.name,
-                                      description: args.data.description,
-                                      zoneid: args.data.zoneid,
-                                      externalid: args.data.externalid,
-                                      allowuserdrivenbackups: args.data.allowuserdrivenbackups === 'on'
-                                    },
-                                    dataType: 'json',
-                                    success: function(json) {
-                                        var jid = json.importbackupofferingresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getActionFilter: function() {
-                                                    return backupOfferingActionfilter;
-                                                }
-                                            }
-
-                                        });
-                                    },
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: pollAsyncJobResult
-                            },
-
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.import.backup.offering';
-                                }
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listBackupOfferings'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listbackupofferingsresponse.backupoffering;
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.system.backup.offering.details',
-                        actions: {
-                            remove: {
-                                label: 'label.action.delete.backup.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.backup.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.backup.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.backupOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteBackupOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    externalid: {
-                                        label: 'label.external.id',
-                                    },
-                                    allowuserdrivenbackups: {
-                                        label: 'label.backup.user.driven'
-                                    },
-                                    zoneid: {
-                                        label: 'label.zone.id'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    var data = {
-                                        id: args.context.backupOfferings[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('listBackupOfferings'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.listbackupofferingsresponse.backupoffering[0];
-                                            args.response.success({
-                                                actionFilter: backupOfferingActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            networkOfferings: {
-                type: 'select',
-                title: 'label.menu.network.offerings',
-                listView: {
-                    id: 'networkOfferings',
-                    label: 'label.menu.network.offerings',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        state: {
-                            label: 'label.state',
-                            indicator: {
-                                'Enabled': 'on',
-                                'Disabled': 'off',
-                                'Destroyed': 'off'
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listNetworkOfferings'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listnetworkofferingsresponse.networkoffering;
-
-                                $(items).each(function() {
-                                    if (this.availability == "Required") {
-                                        requiredNetworkOfferingExists = true;
-                                        return false; //break each loop
-                                    }
-                                });
-
-                                args.response.success({
-                                    actionFilter: networkOfferingActionfilter,
-                                    data: items
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.network.offering',
-
-                            createForm: {
-                                title: 'label.add.network.offering',
-                                preFilter: function(args) {
-                                    var $availability = args.$form.find('.form-item[rel=availability]');
-                                    var $lbType = args.$form.find('.form-item[rel=lbType]');
-                                    var $serviceofferingid = args.$form.find('.form-item[rel=serviceofferingid]');
-                                    var $conservemode = args.$form.find('.form-item[rel=conservemode]');
-                                    var $supportsstrechedl2subnet = args.$form.find('.form-item[rel=supportsstrechedl2subnet]');
-                                    var $supportspublicaccess = args.$form.find('.form-item[rel=supportspublicaccess]');
-                                    var $serviceSourceNatRedundantRouterCapabilityCheckbox = args.$form.find('.form-item[rel="service.SourceNat.redundantRouterCapabilityCheckbox"]');
-                                    var hasAdvancedZones = false;
-
-                                    // Check whether there are any advanced zones
-                                    $.ajax({
-                                        url: createURL('listZones'),
-                                        data: {},
-                                        async: false,
-                                        success: function(json) {
-                                            var zones = json.listzonesresponse.zone;
-                                            if (zones != null && zones.length > 0) {
-                                                for (var i = 0; i < zones.length; i++) {
-                                                    if (zones[i].networktype == "Advanced")
-                                                        hasAdvancedZones = true;
-                                                }
-                                            }
-                                        }
-                                    });
-
-                                    args.$form.bind('change', function() { //when any field in the dialog is changed
-                                        //check whether to show or hide availability field
-                                        var $sourceNATField = args.$form.find('input[name=\"service.SourceNat.isEnabled\"]');
-                                        var $guestTypeField = args.$form.find('select[name=guestIpType]');
-
-                                        //*** VPC checkbox ***
-                                        var $useVpc = args.$form.find('.form-item[rel=\"useVpc\"]');
-                                        var $useVpcCb = $useVpc.find("input[type=checkbox]");
-                                        var $supportedServices = args.$form.find('.form-item[rel=\"supportedServices\"]');
-                                        var $userDataL2 = args.$form.find('.form-item[rel=\"userDataL2\"]');
-                                        if ($guestTypeField.val() == 'Shared') { //Shared network offering
-                                            $useVpc.hide();
-                                            $userDataL2.hide();
-                                            $supportedServices.css('display', 'inline-block');
-                                            if ($useVpcCb.is(':checked')) { //if useVpc is checked,
-                                                $useVpcCb.prop("checked", false); //remove "checked" attribute in useVpc
-                                            }
-                                            $conservemode.css('display', 'inline-block');
-                                        } else if ($guestTypeField.val() == 'Isolated') { //Isolated network offering
-                                            $useVpc.css('display', 'inline-block');
-                                            $supportedServices.css('display', 'inline-block');
-                                            $userDataL2.hide();
-                                            $conservemode.css('display', 'inline-block');
-                                        } else if ($guestTypeField.val() == 'L2') {
-                                            $useVpc.hide();
-                                            $supportedServices.hide();
-                                            $userDataL2.css('display', 'inline-block');
-                                            $conservemode.hide();
-                                        }
-                                        var $providers = $useVpcCb.closest('form').find('.dynamic-input select[name!="service.Connectivity.provider"]');
-                                        var $optionsOfProviders = $providers.find('option');
-                                        //p.s. Netscaler is supported in both vpc and non-vpc
-                                        if ($useVpc.is(':visible') && $useVpcCb.is(':checked')) { //*** vpc ***
-                                            $optionsOfProviders.each(function(index) {
-                                                if ($(this).val() == 'InternalLbVm' || $(this).val() == 'VpcVirtualRouter' || $(this).val() == 'Netscaler'  || $(this).val() == 'BigSwitchBcf' || $(this).val() == 'ConfigDrive') {
-                                                    $(this).attr('disabled', false);
-                                                } else {
-                                                    $(this).attr('disabled', true);
-                                                }
-                                            });
-                                        } else { //*** non-vpc ***
-                                            $optionsOfProviders.each(function(index) {
-                                                if ($(this).val() == 'InternalLbVm' || $(this).val() == 'VpcVirtualRouter') {
-                                                    $(this).attr('disabled', true);
-                                                } else {
-                                                    $(this).attr('disabled', false);
-                                                }
-                                            });
-                                        }
-                                        $providers.each(function() {
-                                            //if selected option is disabled, select the first enabled option instead
-                                            if ($(this).find('option:selected:disabled').length > 0) {
-                                                $(this).val($(this).find('option:first'));
-                                            }
-                                        });
-
-
-
-                                        if (!requiredNetworkOfferingExists &&
-                                            $sourceNATField.is(':checked') &&
-                                            $guestTypeField.val() == 'Isolated') {
-                                            $availability.css('display', 'inline-block');
-                                        } else {
-                                            $availability.hide();
-                                        }
-
-
-                                        //*** LB providers ***
-                                        var $lbProvider = args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select');
-                                        var $lbProviderOptions = $lbProvider.find('option');
-                                        //when useVpc is checked and service.Lb.isEnabled is checked
-                                        if ($useVpcCb.is(':checked') && $("input[name='service.Lb.isEnabled']").is(":checked") == true) {
-                                            $lbType.css('display', 'inline-block');
-
-                                            if ($lbType.find('select').val() == 'publicLb') { //disable all providers except the ones in lbProviderMap.publicLb.vpc => ["VpcVirtualRouter", "Netscaler"]
-                                                for (var i = 0; i < $lbProviderOptions.length; i++) {
-                                                    var $option = $lbProviderOptions.eq(i);
-                                                    var supportedProviders = lbProviderMap.publicLb.vpc;
-                                                    var thisOpionIsSupported = false;
-                                                    for (var k = 0; k < supportedProviders.length; k++) {
-                                                        if ($option.val() == supportedProviders[k]) {
-                                                            thisOpionIsSupported = true;
-                                                            break;
-                                                        }
-                                                    }
-                                                    if (thisOpionIsSupported == true) {
-                                                        $option.attr('disabled', false);
-                                                    } else {
-                                                        $option.attr('disabled', true);
-                                                    }
-                                                }
-                                            } else if ($lbType.find('select').val() == 'internalLb') { //disable all providers except the ones in lbProviderMap.internalLb.vpc => ["InternalLbVm"]
-                                                for (var i = 0; i < $lbProviderOptions.length; i++) {
-                                                    var $option = $lbProviderOptions.eq(i);
-                                                    var supportedProviders = lbProviderMap.internalLb.vpc;
-                                                    var thisOpionIsSupported = false;
-                                                    for (var k = 0; k < supportedProviders.length; k++) {
-                                                        if ($option.val() == supportedProviders[k]) {
-                                                            thisOpionIsSupported = true;
-                                                            break;
-                                                        }
-                                                    }
-                                                    if (thisOpionIsSupported == true) {
-                                                        $option.attr('disabled', false);
-                                                    } else {
-                                                        $option.attr('disabled', true);
-                                                    }
-                                                }
-                                            }
-
-                                            //if selected option is disabled, select the first enabled option instead
-                                            if ($lbProvider.find('option:selected:disabled').length > 0) {
-                                                $lbProvider.val($lbProvider.find('option:first'));
-                                            }
-                                        } else {
-                                            $lbType.hide();
-                                        }
-
-                                        //when service(s) has Virtual Router as provider.....
-                                        var havingVirtualRouterForAtLeastOneService = false;
-                                        $(serviceCheckboxNames).each(function() {
-                                            var checkboxName = this;
-                                            if ($("input[name='" + checkboxName + "']").is(":checked") == true) {
-                                                var providerFieldName = checkboxName.replace(".isEnabled", ".provider"); //either dropdown or input hidden field
-                                                var providerName = $("[name='" + providerFieldName + "']").val();
-                                                if (providerName == "VirtualRouter" || providerName == "VpcVirtualRouter") {
-                                                    havingVirtualRouterForAtLeastOneService = true;
-                                                    return false; //break each loop
-                                                }
-                                            }
-                                        });
-                                        if (havingVirtualRouterForAtLeastOneService == true) {
-                                            $serviceofferingid.css('display', 'inline-block');
-                                        } else {
-                                            $serviceofferingid.hide();
-                                        }
-
-
-                                        /*
-                                        when service(s) has VPC Virtual Router as provider:
-                    (1) conserve mode is set to unchecked and grayed out.
-                    (2) redundant router capability checkbox is set to unchecked and grayed out.
-                    (3) remove Firewall service, SecurityGroup service.
-                    */
-                                        var havingVpcVirtualRouterForAtLeastOneService = false;
-                                        $(serviceCheckboxNames).each(function() {
-                                            var checkboxName = this;
-                                            if ($("input[name='" + checkboxName + "']").is(":checked") == true) {
-                                                var providerFieldName = checkboxName.replace(".isEnabled", ".provider"); //either dropdown or input hidden field
-                                                var providerName = $("[name='" + providerFieldName + "']").val();
-                                                if (providerName == "VpcVirtualRouter") {
-                                                    havingVpcVirtualRouterForAtLeastOneService = true;
-                                                    return false; //break each loop
-                                                }
-                                            }
-                                        });
-                                        if (havingVpcVirtualRouterForAtLeastOneService == true) {
-                                            $conservemode.find("input[type=checkbox]").attr("disabled", "disabled");
-                                            $conservemode.find("input[type=checkbox]").attr('checked', false);
-
-                                            $serviceSourceNatRedundantRouterCapabilityCheckbox.find("input[type=checkbox]").attr("disabled", "disabled");
-                                            $serviceSourceNatRedundantRouterCapabilityCheckbox.find("input[type=checkbox]").attr('checked', false);
-                                        } else {
-                                            $serviceSourceNatRedundantRouterCapabilityCheckbox.find("input[type=checkbox]").removeAttr("disabled");
-                                            $conservemode.find("input[type=checkbox]").removeAttr("disabled");
-                                        }
-
-                                        $('div.ui-dialog').css('top', '24px');
-
-                                        //CS-16612 show all services regardless of guestIpType(Shared/Isolated)
-                                        /*
-                                        //hide/show service fields ***** (begin) *****
-                                        var serviceFieldsToHide = [];
-                                        if($guestTypeField.val() == 'Shared') { //Shared network offering
-                                          serviceFieldsToHide = [
-                                                'service.SourceNat.isEnabled',
-                                                'service.PortForwarding.isEnabled',
-                                                'service.Firewall.isEnabled',
-                                                'service.Vpn.isEnabled'
-                                            ];
-                                            if(havingVpcVirtualRouterForAtLeastOneService == true) { //add SecurityGroup to to-hide-list
-                                              serviceFieldsToHide.push('service.SecurityGroup.isEnabled');
-                                            }
-                                            else { //remove SecurityGroup from to-hide-list
-                                              var temp = $.map(serviceFieldsToHide, function(item) {
-                                                    if (item != 'service.SecurityGroup.isEnabled') {
-                                                      return item;
-                                                    }
-                                                });
-                                                serviceFieldsToHide = temp;
-                                            }
-                                        }
-                                        else { //Isolated network offering
-                                          serviceFieldsToHide = [
-                                              'service.SecurityGroup.isEnabled'
-                                            ];
-                                            if(havingVpcVirtualRouterForAtLeastOneService == true) { //add firewall to to-hide-list
-                                              serviceFieldsToHide.push('service.Firewall.isEnabled');
-                                            }
-                                            else { //remove firewall from to-hide-list
-                                              var temp = $.map(serviceFieldsToHide, function(item) {
-                                                    if (item != 'service.Firewall.isEnabled') {
-                                                      return item;
-                                                    }
-                                                });
-                                                serviceFieldsToHide = temp;
-                                            }
-                                        }
-                    */
-
-
-                                        //CS-16687: NetworkACL should be removed when the guest_type is SHARED
-                                        //hide/show service fields ***** (begin) *****
-                                        var serviceFieldsToHide = [];
-                                        if ($guestTypeField.val() == 'Shared') { //Shared network offering
-                                            serviceFieldsToHide = [
-                                                'service.NetworkACL.isEnabled'
-                                            ];
-                                        } else { //Isolated network offering
-                                            serviceFieldsToHide = [];
-                                        }
-
-                                        //hide service fields that are included in serviceFieldsToHide
-                                        var $serviceCheckboxesToHide = args.$form.find('.form-item').filter(function() {
-                                            if ($.inArray($(this).attr('rel'), serviceFieldsToHide) > -1) {
-                                                return true;
-                                            }
-                                            return false;
-                                        });
-                                        $serviceCheckboxesToHide.hide();
-                                        $serviceCheckboxesToHide.find('input[type=checkbox]').attr('checked', false);
-
-                                        var $serviceProviderDropdownsToHide = args.$form.find('.form-item').filter(function() {
-                                            if ($.inArray($(this).attr('depends-on'), serviceFieldsToHide) > -1) {
-                                                return true;
-                                            }
-                                            return false;
-                                        });
-                                        $serviceProviderDropdownsToHide.hide();
-
-                                        //show service fields that are not included in serviceFieldsToHide
-                                        for (var i = 0; i < serviceFields.length; i++) {
-                                            var serviceField = serviceFields[i];
-                                            if ($.inArray(serviceField, serviceFieldsToHide) == -1) {
-                                                if (args.$form.find('.form-item[rel=\"' + serviceField + '\"]').css('display') == 'none') {
-                                                    args.$form.find('.form-item[rel=\"' + serviceField + '\"]').css('display', 'inline-block');
-                                                }
-                                            }
-                                        }
-                                        //hide/show service fields ***** (end) *****
-
-                                        //show LB InlineMode dropdown only when (1)LB service is checked and LB service provider is F5BigIp (2)Firewall service is checked and Firewall service provider is JuniperSRX
-                                        if ((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && ((args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'F5BigIp') || (args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'Netscaler')) &&
-                                            (args.$form.find('.form-item[rel=\"service.Firewall.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.Firewall.provider\"]').find('select').val() == 'JuniperSRX')) {
-                                            args.$form.find('.form-item[rel=\"service.Lb.inlineModeDropdown\"]').css('display', 'inline-block');
-                                        } else {
-                                            args.$form.find('.form-item[rel=\"service.Lb.inlineModeDropdown\"]').hide();
-                                        }
-
-                                        if (args.$form.find('.form-item[rel=\"service.Firewall.isEnabled\"] input[type=checkbox]').is(':checked') == true) {
-                                            args.$form.find('.form-item[rel=\"egressdefaultpolicy\"]').css('display', 'inline-block');
-                                        } else {
-                                            args.$form.find('.form-item[rel=\"egressdefaultpolicy\"]').css('display', 'none');
-                                        }
-
-                                        //show Netscaler service packages only when (1)LB Service is checked (2)Service Provider is Netscaler
-                                        if ((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'Netscaler')) {
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages\"]').css('display', 'inline-block');
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').css('display', 'inline-block');
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").attr("disabled", "disabled");
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").text(args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages\"]').find('#label_netscaler_service_packages option:selected').data("json-obj").desc);
-                                        } else {
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages\"]').hide();
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').hide();
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").attr("disabled", "disabled");
-                                            args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").text("");
-                                        }
-
-                                        //show Elastic LB checkbox only when (1)LB Service is checked (2)Service Provider is Netscaler (3)Guest IP Type is Shared
-                                        if ((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'Netscaler') && (args.$form.find('.form-item[rel=\"guestIpType\"]').find('select').val() == 'Shared')) {
-                                            args.$form.find('.form-item[rel=\"service.Lb.elasticLbCheckbox\"]').css('display', 'inline-block');
-                                        } else {
-                                            args.$form.find('.form-item[rel=\"service.Lb.elasticLbCheckbox\"]').hide();
-                                            args.$form.find('.form-item[rel=\"service.Lb.elasticLbCheckbox\"]').find('input[type=checkbox]').attr('checked', false);
-                                        }
-
-                                        //show Elastic IP checkbox only when (1)StaticNat service is checked (2)StaticNat service provider is Netscaler
-                                        if ((args.$form.find('.form-item[rel=\"service.StaticNat.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.StaticNat.provider\"]').find('select').val() == 'Netscaler')) {
-                                            args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').css('display', 'inline-block');
-                                        } else {
-                                            args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').hide();
-                                            args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').find('input[type=checkbox]').attr('checked', false);
-                                        }
-
-                                        //show Associate Public IP checkbox only when (1)StaticNat Service is checked (2)Service Provider is Netscaler (3)Guest IP Type is Shared (4) Elastic IP checkbox is checked
-                                        if ((args.$form.find('.form-item[rel=\"service.StaticNat.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.StaticNat.provider\"]').find('select').val() == 'Netscaler') && (args.$form.find('.form-item[rel=\"guestIpType\"]').find('select').val() == 'Shared') && (args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').find('input[type=checkbox]').attr('checked') == "checked")) {
-                                            args.$form.find('.form-item[rel=\"service.StaticNat.associatePublicIP\"]').css('display', 'inline-block');
-                                        } else {
-                                            args.$form.find('.form-item[rel=\"service.StaticNat.associatePublicIP\"]').hide();
-                                            args.$form.find('.form-item[rel=\"service.StaticNat.associatePublicIP\"]').find('input[type=checkbox]').attr('checked', false);
-                                        }
-
-                                        //StretchedL2Subnet checkbox should be displayed only when 'Connectivity' service is checked
-                                        if (args.$form.find('.form-item[rel=\"service.Connectivity.isEnabled\"]').find('input[type=checkbox]').is(':checked')) {
-                                            $supportsstrechedl2subnet.css('display', 'inline-block');
-                                        } else {
-                                            $supportsstrechedl2subnet.hide();
-                                        }
-
-                                        $supportspublicaccess.hide();
-                                    });
-
-                                    args.$form.change();
-                                },
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpNetworkOfferingName'
-                                    },
-
-                                    displayText: {
-                                        label: 'label.description',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpNetworkOfferingDescription'
-                                    },
-
-                                    networkRate: {
-                                        label: 'label.network.rate',
-                                        docID: 'helpNetworkOfferingNetworkRate'
-                                    },
-
-                                    /*
-                  trafficType: {
-                    label: 'label.traffic.type', validation: { required: true },
-                    select: function(args) {
-                      args.response.success({
-                        data: [
-                          { id: 'GUEST', description: 'Guest' }
-                        ]
-                      });
-                    }
-                  },
-                                    */
-
-                                    guestIpType: {
-                                        label: 'label.guest.type',
-                                        docID: 'helpNetworkOfferingGuestType',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: 'Isolated',
-                                                    description: 'Isolated'
-                                                }, {
-                                                    id: 'Shared',
-                                                    description: 'Shared'
-                                                }, {
-                                                    id: 'L2',
-                                                    description: 'L2'
-                                                }]
-                                            });
-
-                                            args.$select.change(function() {
-                                                var $form = $(this).closest("form");
-
-                                                if ($(this).val() == "Shared") {
-                                                    $form.find('.form-item[rel=specifyVlan]').find('input[type=checkbox]').attr("disabled", "disabled"); //make it read-only
-                                                    $form.find('.form-item[rel=specifyVlan]').find('input[type=checkbox]').attr('checked', true); //make it checked
-                                                    $form.find('.form-item[rel=isPersistent]').find('input[type=checkbox]').attr("disabled", "disabled");
-
-
-                                                } else if ($(this).val() == "Isolated" || $(this).val() == "L2") {
-                                                    $form.find('.form-item[rel=specifyVlan]').find('input[type=checkbox]').removeAttr("disabled"); //make it editable
-                                                    $form.find('.form-item[rel=isPersistent]').find('input[type=checkbox]').removeAttr("disabled");
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    isPersistent: {
-                                        label: 'label.persistent',
-                                        isBoolean: true,
-                                        isChecked: false
-
-                                    },
-
-
-                                    specifyVlan: {
-                                        label: 'label.specify.vlan',
-                                        isBoolean: true,
-                                        docID: 'helpNetworkOfferingSpecifyVLAN'
-                                    },
-
-                                    useVpc: {
-                                        label: 'label.vpc',
-                                        docID: 'helpNetworkOfferingVPC',
-                                        isBoolean: true
-                                    },
-
-                                    userDataL2: {
-                                        label: 'label.user.data',
-                                        docID: 'helpL2UserData',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-
-                                    lbType: { //only shown when VPC is checked and LB service is checked
-                                        label: 'label.load.balancer.type',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: 'publicLb',
-                                                    description: 'Public LB'
-                                                }, {
-                                                    id: 'internalLb',
-                                                    description: 'Internal LB'
-                                                }]
-                                            });
-                                        }
-                                    },
-
-                                    promiscuousMode: {
-                                        label: 'label.promiscuous.mode',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: '',
-                                                    description: ''
-                                                }, {
-                                                    id: 'true',
-                                                    description: 'Accept'
-                                                }, {
-                                                    id: 'false',
-                                                    description: 'Reject'
-                                                }]
-                                            });
-                                        }
-                                    },
-
-                                    macAddressChanges: {
-                                        label: 'label.mac.address.changes',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: '',
-                                                    description: ''
-                                                }, {
-                                                    id: 'true',
-                                                    description: 'Accept'
-                                                }, {
-                                                    id: 'false',
-                                                    description: 'Reject'
-                                                }]
-                                            });
-                                        }
-                                    },
-
-                                    forgedTransmits: {
-                                        label: 'label.forged.transmits',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: '',
-                                                    description: ''
-                                                }, {
-                                                    id: 'true',
-                                                    description: 'Accept'
-                                                }, {
-                                                    id: 'false',
-                                                    description: 'Reject'
-                                                }]
-                                            });
-                                        }
-                                    },
-
-                                    supportedServices: {
-                                        label: 'label.supported.services',
-
-                                        dynamic: function(args) {
-                                            $.ajax({
-                                                url: createURL('listSupportedNetworkServices'),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    networkServiceObjs = data.listsupportednetworkservicesresponse.networkservice;
-                                                    serviceFields = [];
-                                                    var fields = {}, providerCanenableindividualserviceMap = {}, providerServicesMap = {}, providerDropdownsForciblyChangedTogether = {};
-                                                    $(networkServiceObjs).each(function() {
-                                                        var serviceName = this.name;
-                                                        var providerObjs = this.provider;
-                                                        var serviceDisplayName;
-
-                                                        // Sanitize names
-                                                        switch (serviceName) {
-                                                            case 'Vpn':
-                                                                serviceDisplayName = _l('label.vpn');
-                                                                break;
-                                                            case 'Dhcp':
-                                                                serviceDisplayName = _l('label.dhcp');
-                                                                break;
-                                                            case 'Dns':
-                                                                serviceDisplayName = _l('label.dns');
-                                                                break;
-                                                            case 'Lb':
-                                                                serviceDisplayName = _l('label.load.balancer');
-                                                                break;
-                                                            case 'SourceNat':
-                                                                serviceDisplayName = _l('label.source.nat');
-                                                                break;
-                                                            case 'StaticNat':
-                                                                serviceDisplayName = _l('label.static.nat');
-                                                                break;
-                                                            case 'PortForwarding':
-                                                                serviceDisplayName = _l('label.port.forwarding');
-                                                                break;
-                                                            case 'SecurityGroup':
-                                                                serviceDisplayName = _l('label.security.groups');
-                                                                break;
-                                                            case 'UserData':
-                                                                serviceDisplayName = _l('label.user.data');
-                                                                break;
-                                                            case 'Connectivity':
-                                                                serviceDisplayName = _l('label.virtual.networking');
-                                                                break;
-                                                            default:
-                                                                serviceDisplayName = serviceName;
-                                                                break;
-                                                        }
-
-                                                        var id = {
-                                                            isEnabled: 'service' + '.' + serviceName + '.' + 'isEnabled',
-                                                            capabilities: 'service' + '.' + serviceName + '.' + 'capabilities',
-                                                            provider: 'service' + '.' + serviceName + '.' + 'provider'
-                                                        };
-
-                                                        serviceCheckboxNames.push(id.isEnabled);
-
-                                                        fields[id.isEnabled] = {
-                                                            label: serviceDisplayName,
-                                                            isBoolean: true
-                                                        };
-                                                        serviceFields.push(id.isEnabled);
-
-                                                        if (providerObjs != null && providerObjs.length > 1) { //present provider dropdown when there are multiple providers for a service
-                                                            fields[id.provider] = {
-                                                                label: serviceDisplayName + ' Provider',
-                                                                isHidden: true,
-                                                                dependsOn: id.isEnabled,
-                                                                select: function(args) {
-                                                                    //Virtual Router needs to be the first choice in provider dropdown (Bug 12509)
-                                                                    var items = [];
-                                                                    $(providerObjs).each(function() {
-                                                                        if (this.name == "VirtualRouter")
-                                                                            items.unshift({
-                                                                                id: this.name,
-                                                                                description: this.name
-                                                                            });
-                                                                        else
-                                                                            items.push({
-                                                                                id: this.name,
-                                                                                description: this.name
-                                                                            });
-
-                                                                        if (!(this.name in providerCanenableindividualserviceMap))
-                                                                            providerCanenableindividualserviceMap[this.name] = this.canenableindividualservice;
-
-                                                                        if (!(this.name in providerServicesMap))
-                                                                            providerServicesMap[this.name] = [serviceName];
-                                                                        else
-                                                                            providerServicesMap[this.name].push(serviceName);
-                                                                    });
-
-                                                                    args.response.success({
-                                                                        data: items
-                                                                    });
-
-                                                                    // Disable VPC virtual router by default
-                                                                    args.$select.find('option[value=VpcVirtualRouter]').attr('disabled', true);
-
-                                                                    args.$select.change(function() {
-                                                                        var $thisProviderDropdown = $(this);
-                                                                        var providerName = $(this).val();
-                                                                        var canenableindividualservice = providerCanenableindividualserviceMap[providerName];
-                                                                        if (canenableindividualservice == false) { //This provider can NOT enable individual service, therefore, force all services supported by this provider have this provider selected in provider dropdown
-                                                                            var serviceNames = providerServicesMap[providerName];
-                                                                            if (serviceNames != null && serviceNames.length > 1) {
-                                                                                providerDropdownsForciblyChangedTogether = {}; //reset
-                                                                                $(serviceNames).each(function() {
-                                                                                    var providerDropdownId = 'service' + '.' + this + '.' + 'provider';
-                                                                                    providerDropdownsForciblyChangedTogether[providerDropdownId] = 1;
-                                                                                    $("select[name='" + providerDropdownId + "']").val(providerName);
-                                                                                });
-                                                                            }
-                                                                        } else { //canenableindividualservice == true
-                                                                            if (this.name in providerDropdownsForciblyChangedTogether) { //if this provider dropdown is one of provider dropdowns forcibly changed together earlier, make other forcibly changed provider dropdowns restore default option (i.e. 1st option in dropdown)
-                                                                                for (var key in providerDropdownsForciblyChangedTogether) {
-                                                                                    if (key == this.name)
-                                                                                        continue; //skip to next item in for loop
-                                                                                    else
-                                                                                        $("select[name='" + key + "'] option:first").attr("selected", "selected");
-                                                                                }
-                                                                                providerDropdownsForciblyChangedTogether = {}; //reset
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                }
-                                                            };
-                                                        } else if (providerObjs != null && providerObjs.length == 1) { //present hidden field when there is only one provider for a service
-                                                            fields[id.provider] = {
-                                                                label: serviceDisplayName + ' Provider',
-                                                                isHidden: true,
-                                                                defaultValue: providerObjs[0].name
-                                                            };
-                                                        }
-                                                    });
-
-                                                    args.response.success({
-                                                        fields: fields
-                                                    });
-                                                },
-                                                error: function(data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    //show or hide upon checked services and selected providers above (begin)
-                                    serviceofferingid: {
-                                        label: 'label.system.offering.for.router',
-                                        isHidden: true,
-                                        docID: 'helpNetworkOfferingSystemOffering',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listServiceOfferings&issystem=true&systemvmtype=domainrouter'),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    var serviceOfferings = data.listserviceofferingsresponse.serviceoffering;
-
-                                                    args.response.success({
-                                                        data: $.merge(
-                                                            [{
-                                                                id: null,
-                                                                description: 'None'
-                                                            }],
-                                                            $.map(serviceOfferings, function(elem) {
-                                                                return {
-                                                                    id: elem.id,
-                                                                    description: elem.name
-                                                                };
-                                                            })
-                                                        )
-                                                    });
-                                                },
-                                                error: function(data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    "service.SourceNat.redundantRouterCapabilityCheckbox": {
-                                        label: 'label.redundant.router.capability',
-                                        isHidden: true,
-                                        dependsOn: 'service.SourceNat.isEnabled',
-                                        docID: 'helpNetworkOfferingRedundantRouterCapability',
-                                        isBoolean: true
-                                    },
-
-                                    "service.SourceNat.sourceNatTypeDropdown": {
-                                        label: 'label.supported.source.NAT.type',
-                                        isHidden: true,
-                                        dependsOn: 'service.SourceNat.isEnabled',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: 'peraccount',
-                                                    description: 'Per account'
-                                                }, {
-                                                    id: 'perzone',
-                                                    description: 'Per zone'
-                                                }]
-                                            });
-                                        }
-                                    },
-
-                                    "service.Lb.elasticLbCheckbox": {
-                                        label: "label.elastic.LB",
-                                        isHidden: true,
-                                        isBoolean: true
-                                    },
-
-                                    "service.Lb.inlineModeDropdown": {
-                                        label: 'label.mode',
-                                        docID: 'helpNetworkOfferingMode',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: "false",
-                                                description: "side by side"
-                                            });
-                                            items.push({
-                                                id: "true",
-                                                description: "inline"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    "service.Lb.Netscaler.servicePackages": {
-                                        label: 'label.netscaler.service.packages',
-                                        docID: 'helpNetscalerServicePackages',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listRegisteredServicePackages'),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    var servicePackages = data.listregisteredservicepackage.registeredServicepackage;
-
-                                                    if (servicePackages == undefined || servicePackages == null || !servicePackages) {
-                                                        servicePackages = data.listregisteredservicepackage;
-                                                    }
-
-                                                    args.response.success({
-                                                        data:   $.map(servicePackages, function(elem) {
-                                                            return {
-                                                                id: elem.id,
-                                                                description: elem.name,
-                                                                desc: elem.description
-                                                            };
-                                                        })
-                                                    });
-                                                },
-                                                error: function(data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    "service.Lb.Netscaler.servicePackages.description": {
-                                        label: 'label.netscaler.service.packages.description',
-                                        isHidden: true,
-                                        isTextarea: true
-                                    },
-
-                                    "service.Lb.lbIsolationDropdown": {
-                                        label: 'label.LB.isolation',
-                                        docID: 'helpNetworkOfferingLBIsolation',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: 'dedicated',
-                                                    description: 'Dedicated'
-                                                }, {
-                                                    id: 'shared',
-                                                    description: 'Shared'
-                                                }]
-                                            })
-                                        }
-                                    },
-
-                                    "service.StaticNat.elasticIpCheckbox": {
-                                        label: "label.elastic.IP",
-                                        isHidden: true,
-                                        isBoolean: true
-                                    },
-
-                                    "service.StaticNat.associatePublicIP": {
-                                        label: 'label.associate.public.ip',
-                                        docID: 'helpNetworkOfferingAssociatePublicIP',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-                                    //show or hide upon checked services and selected providers above (end)
-
-                                    supportsstrechedl2subnet: {
-                                        label: 'label.supportsstrechedl2subnet',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        isHidden: true
-                                    },
-
-                                    supportspublicaccess: {
-                                        label: 'label.supportspublicaccess',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        isHidden: true
-                                    },
-
-                                    conservemode: {
-                                        label: 'label.conserve.mode',
-                                        isBoolean: true,
-                                        isChecked: true,
-                                        docID: 'helpNetworkOfferingConserveMode'
-                                    },
-
-                                    tags: {
-                                        label: 'label.tags',
-                                        docID: 'helpNetworkOfferingTags'
-                                    },
-
-                                    availability: {
-                                        label: 'label.availability',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: 'Optional',
-                                                    description: 'label.optional'
-                                                }, {
-                                                    id: 'Required',
-                                                    description: 'label.required'
-                                                }]
-                                            });
-                                        }
-                                    },
-
-                                    egressdefaultpolicy: {
-                                        label: 'label.default.egress.policy',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [
-                                                    { id: 'ALLOW', description: 'label.allow' },
-                                                    { id: 'DENY', description: 'label.deny' }
-                                                ]
-                                            });
-                                        }
-                                    },
-                                    isPublic: {
-                                        label: 'label.public',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false,
-                                        docID: 'helpNetworkOfferingPublic'
-                                    },
-                                    domainId: {
-                                        label: 'label.domain',
-                                        docID: 'helpNetworkOfferingDomain',
-                                        dependsOn: 'isPublic',
-                                        isMultiple: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    $(domainObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.path
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        isHidden: true
-                                    },
-                                    zoneId: {
-                                        label: 'label.zone',
-                                        docID: 'helpNetworkOfferingZone',
-                                        isMultiple: true,
-                                        validation: {
-                                            allzonesonly: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones"),
-                                                data: {available: 'true'},
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    $(zoneObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    items.unshift({
-                                                        id: -1,
-                                                        description: "All Zones"
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var formData = args.data;
-                                var inputData = {};
-                                var serviceProviderMap = {};
-                                var serviceCapabilityIndex = 0;
-
-                                $.each(formData, function(key, value) {
-                                    var serviceData = key.split('.');
-
-                                    if (key == 'service.Lb.Netscaler.servicePackages' && value != "") {
-                                       inputData['details[' + 0 + '].servicepackageuuid'] = value;
-                                       inputData['details[' + 1 + '].servicepackagedescription'] = args.$form.find('#label_netscaler_service_packages option:selected').data().jsonObj.desc;
-                                    }
-
-
-                                    if (serviceData.length > 1) {
-                                        if (serviceData[0] == 'service' &&
-                                            serviceData[2] == 'isEnabled' &&
-                                            value == 'on') { // Services field
-
-                                            serviceProviderMap[serviceData[1]] = formData[
-                                                'service.' + serviceData[1] + '.provider'
-                                            ];
-                                        } else if ((key == 'service.SourceNat.redundantRouterCapabilityCheckbox') && ("SourceNat" in serviceProviderMap)) { //if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat';
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = "RedundantRouter";
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.SourceNat.sourceNatTypeDropdown') && ("SourceNat" in serviceProviderMap)) {
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'SourceNat';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedSourceNatTypes';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = value;
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.Lb.elasticLbCheckbox') && ("Lb" in serviceProviderMap)) { //if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticLb';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.Lb.inlineModeDropdown') && ("Lb" in serviceProviderMap) && ((serviceProviderMap.Lb == "F5BigIp") || (serviceProviderMap.Lb == "Netscaler"))) {
-                                            if (value == 'true') { //CS-16605 do not pass parameter if value is 'false'(side by side)
-                                                inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb';
-                                                inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'InlineMode';
-                                                inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = value;
-                                                serviceCapabilityIndex++;
-                                            }
-                                        } else if ((key == 'service.Lb.lbIsolationDropdown') && ("Lb" in serviceProviderMap)) {
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedLbIsolation';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = value;
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.StaticNat.elasticIpCheckbox') && ("StaticNat" in serviceProviderMap)) { //if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticIp';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.StaticNat.associatePublicIP') && ("StaticNat" in serviceProviderMap)) { //if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'associatePublicIP';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.Lb.provider') && ("Lb" in serviceProviderMap) && (serviceProviderMap.Lb == "InternalLbVm")) {
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'lbSchemes';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = 'internal';
-                                            serviceCapabilityIndex++;
-                                        }
-                                    } else if (value != '') { // normal data (serviceData.length ==1), e.g. "name", "displayText", "networkRate", "guestIpType", "lbType" (unwanted), "availability" (unwated when value is "Optional"), "egressdefaultpolicy", "state" (unwanted), "status" (unwanted), "allocationstate" (unwanted)
-                                        if (key == "useVpc") {
-                                            inputData['forvpc'] = value;
-                                        } else if (!(key ==  "lbType"  || (key == "availability" && value == "Optional") || key == "state" || key == "status" || key == "allocationstate" || key == "useVpc" || key == "isPublic" || key == "domainId" || key == "zoneId")) {
-                                            inputData[key] = value;
-                                        }
-                                    }
-                                });
-
-                                for (var key1 in inputData) {
-                                    /* When capability ElasticIp=true is passed to API, if capability associatePublicIP is not passed to API, cloudStack API will assume associatePublicIP=true.
-                                    So, UI has to explicitly pass associatePublicIP=false to API if its checkbox is unchecked. */
-                                    if (inputData[key1] == 'ElasticIp') { //ElasticIp checkbox is checked
-                                        var associatePublicIPExists = false;
-                                        for (var key2 in inputData) {
-                                            if (inputData[key2] == 'associatePublicIP') {
-                                                associatePublicIPExists = true;
-                                                break; //break key2 for loop
-                                            }
-                                        }
-                                        if (associatePublicIPExists == false) { //but associatePublicIP checkbox is unchecked
-                                            //UI explicitly passes associatePublicIP=false to API
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'associatePublicIP';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = false; //associatePublicIP checkbox is unchecked
-                                            serviceCapabilityIndex++;
-                                        }
-                                        break; //break key1 for loop
-                                    }
-                                }
-
-                                //passing supportsstrechedl2subnet and supportspublicaccess's value as capability
-                                for (var k in inputData) {
-                                    if (k == 'supportsstrechedl2subnet' && ("Connectivity" in serviceProviderMap)) {
-                                        inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'Connectivity';
-                                        inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'StretchedL2Subnet';
-                                        inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true;
-                                        serviceCapabilityIndex++;
-                                    } else if (k == 'supportspublicaccess' && ("Connectivity" in serviceProviderMap)) {
-                                        inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'Connectivity';
-                                        inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'PublicAccess';
-                                        inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true;
-                                        serviceCapabilityIndex++;
-                                    }
-                                }
-                                //removing supportsstrechedl2subnet and supportspublicaccess from parameters, it has been set as capability
-                                delete inputData['supportsstrechedl2subnet'];
-                                delete inputData['supportspublicaccess'];
-
-                                // Make supported services list
-                                inputData['supportedServices'] = $.map(serviceProviderMap, function(value, key) {
-                                    return key;
-                                }).join(',');
-
-
-                                if (inputData['guestIpType'] == "Shared") { //specifyVlan checkbox is disabled, so inputData won't include specifyVlan
-                                    var $specifyVlanCheckbox = args.$form.find('.form-item[rel=specifyVlan]').find('input[type=checkbox]');
-                                    inputData['specifyVlan'] = $specifyVlanCheckbox.is(':checked'); //hardcode inputData['specifyVlan']
-                                    inputData['specifyIpRanges'] = true;
-                                    delete inputData.isPersistent; //if Persistent checkbox is unchecked, do not pass isPersistent parameter to API call since we need to keep API call's size as small as possible (p.s. isPersistent is defaulted as false at server-side)
-                                } else if (inputData['guestIpType'] == "Isolated") { //specifyVlan checkbox is shown
-                                    //inputData['specifyIpRanges'] = false;
-                                    delete inputData.specifyIpRanges; //if specifyIpRanges should be false, do not pass specifyIpRanges parameter to API call since we need to keep API call's size as small as possible (p.s. specifyIpRanges is defaulted as false at server-side)
-
-                                    if (inputData['specifyVlan'] == 'on') { //specifyVlan checkbox is checked
-                                        inputData['specifyVlan'] = true;
-                                    } else { //specifyVlan checkbox is unchecked
-                                        delete inputData.specifyVlan; //if specifyVlan checkbox is unchecked, do not pass specifyVlan parameter to API call since we need to keep API call's size as small as possible (p.s. specifyVlan is defaulted as false at server-side)
-                                    }
-
-                                    if (inputData['isPersistent'] == 'on') { //It is a persistent network
-                                        inputData['isPersistent'] = true;
-                                    } else { //Isolated Network with Non-persistent network
-                                        delete inputData.isPersistent; //if Persistent checkbox is unchecked, do not pass isPersistent parameter to API call since we need to keep API call's size as small as possible (p.s. isPersistent is defaulted as false at server-side)
-                                    }
-                                } else if (inputData['guestIpType'] == "L2") {
-                                    if (inputData['specifyVlan'] == 'on') { //specifyVlan checkbox is checked
-                                        inputData['specifyVlan'] = true;
-                                    } else { //specifyVlan checkbox is unchecked
-                                        delete inputData.specifyVlan; //if specifyVlan checkbox is unchecked, do not pass specifyVlan parameter to API call since we need to keep API call's size as small as possible (p.s. specifyVlan is defaulted as false at server-side)
-                                    }
-
-                                    if (inputData['userDataL2'] == 'on') {
-                                        inputData['serviceProviderList[0].service'] = 'UserData';
-                                        inputData['serviceProviderList[0].provider'] = 'ConfigDrive';
-                                        inputData['supportedServices'] = 'UserData';
-                                    } else {
-                                        delete inputData.serviceProviderList;
-                                    }
-
-                                    //Conserve mode is irrelevant on L2 network offerings as there are no resources to conserve, do not pass it, true by default on server side
-                                    delete inputData.conservemode;
-                                }
-
-                                if (inputData['forvpc'] == 'on') {
-                                    inputData['forvpc'] = true;
-                                   } else {
-                                    delete inputData.forvpc; //if forVpc checkbox is unchecked, do not pass forVpc parameter to API call since we need to keep API call's size as small as possible (p.s. forVpc is defaulted as false at server-side)
-                                }
-
-                                if (inputData['guestIpType'] == "Shared" || inputData['guestIpType'] == "Isolated") {
-                                    if (inputData['conservemode'] == 'on') {
-                                        delete inputData.conservemode; //if ConserveMode checkbox is checked, do not pass conservemode parameter to API call since we need to keep API call's size as small as possible (p.s. conservemode is defaulted as true at server-side)
-                                    } else {
-                                        inputData['conservemode'] = false;
-                                    }
-                                }
-
-                                // Make service provider map
-                                var serviceProviderIndex = 0;
-                                $.each(serviceProviderMap, function(key, value) {
-                                    inputData['serviceProviderList[' + serviceProviderIndex + '].service'] = key;
-                                    inputData['serviceProviderList[' + serviceProviderIndex + '].provider'] = value;
-                                    serviceProviderIndex++;
-                                });
-
-                                if (args.$form.find('.form-item[rel=egressdefaultpolicy]').is(':visible')) {
-                                    if (formData.egressdefaultpolicy === 'ALLOW') {
-                                        delete inputData.egressdefaultpolicy; //do not pass egressdefaultpolicy to API call  since we need to keep API call's size as small as possible (p.s. egressdefaultpolicy is defaulted as true at server-side)
-                                    } else {
-                                        inputData['egressdefaultpolicy'] = false;
-                                    }
-                                } else {
-                                    delete inputData.egressdefaultpolicy;
-                                }
-
-                                if ("promiscuousMode" in inputData) {
-                                    inputData['details[0].promiscuousMode'] = inputData.promiscuousMode;
-                                    delete inputData.promiscuousMode;
-                                }
-
-                                if ("macAddressChanges" in inputData) {
-                                    inputData['details[0].macAddressChanges'] = inputData.macAddressChanges;
-                                    delete inputData.macAddressChanges;
-                                }
-
-                                if ("forgedTransmits" in inputData) {
-                                    inputData['details[0].forgedTransmits'] = inputData.forgedTransmits;
-                                    delete inputData.forgedTransmits;
-                                }
-
-
-                                if (args.$form.find('.form-item[rel=serviceofferingid]').css("display") == "none")
-                                    delete inputData.serviceofferingid;
-
-                                if (args.data.isPublic != "on") {
-                                    var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                    if (domainId) {
-                                        $.extend(inputData, {
-                                            domainid: domainId
-                                        });
-                                    }
-                                }
-
-                                var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : undefined;
-                                if (zoneId) {
-                                    $.extend(inputData, {
-                                        zoneid: zoneId
-                                    });
-                                }
-
-                                inputData['traffictype'] = 'GUEST'; //traffic type dropdown has been removed since it has only one option ('Guest'). Hardcode traffic type value here.
-
-                                $.ajax({
-                                    url: createURL('createNetworkOffering'),
-                                    data: inputData,
-                                    type: "POST", //use POST instead of GET since the API call might be overlong and exceed size limit
-                                    success: function(data) {
-                                        var item = data.createnetworkofferingresponse.networkoffering;
-
-                                        if (inputData['availability'] == "Required")
-                                            requiredNetworkOfferingExists = true;
-
-                                        args.response.success({
-                                            data: item,
-                                            actionFilter: networkOfferingActionfilter
-                                        });
-                                    },
-
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete({
-                                        actionFilter: networkOfferingActionfilter
-                                    });
-                                }
-                            },
-
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.network.offering';
-                                }
-                            }
-                        }
-                    },
-
-                    reorder: cloudStack.api.actions.sort('updateNetworkOffering', 'networkOfferings'),
-
-                    detailView: {
-                        name: 'label.network.offering.details',
-                        viewAll: {
-                            label: 'label.networks',
-                            path: 'network'
-                        },
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.networkOfferings[0].id,
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext,
-                                        availability: args.data.availability
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('updateNetworkOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            //if availability is being updated from Required to Optional
-                                            if (args.context.networkOfferings[0].availability == "Required" && args.data.availability == "Optional")
-                                                requiredNetworkOfferingExists = false;
-                                            //if availability is being updated from Optional to Required
-                                            if (args.context.networkOfferings[0].availability == "Optional" && args.data.availability == "Required")
-                                                requiredNetworkOfferingExists = true;
-
-                                            var item = json.updatenetworkofferingresponse.networkoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.enable.network.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.enable.network.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'message.enabling.network.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkOffering&id=" + args.context.networkOfferings[0].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.updatenetworkofferingresponse.networkoffering;
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                state: 'Enabled'
-                                            }
-                                        });
-                                    }
-                                }
-                            },
-
-                            disable: {
-                                label: 'label.disable.network.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.disable.network.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'message.disabling.network.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkOffering&id=" + args.context.networkOfferings[0].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.updatenetworkofferingresponse.networkoffering;
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                state: 'Disabled'
-                                            }
-                                        });
-                                    }
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.remove.network.offering',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('deleteNetworkOffering'),
-                                        data: {
-                                            id: args.context.networkOfferings[0].id
-                                        },
-                                        success: function(json) {
-                                            if (args.context.networkOfferings[0].availability == "Required")
-                                                requiredNetworkOfferingExists = false; //since only one or zero Required network offering can exist
-
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function() {
-                                        return 'message.confirm.remove.network.offering';
-                                    },
-                                    notification: function() {
-                                        return 'label.remove.network.offering';
-                                    }
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                state: 'Destroyed'
-                                            },
-                                            actionFilter: networkOfferingActionfilter
-                                        });
-                                    }
-                                }
-                            },
-
-                            updateOfferingAccess: {
-                                label: 'label.action.update.offering.access',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.update.offering.access';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.network.offering.access',
-                                    desc: '',
-                                    preFilter: function(args) {
-                                        var formOffering = args.context.networkOfferings[0];
-                                        $.ajax({
-                                            url: createURL('listNetworkOfferings'),
-                                            data: {
-                                                id: args.context.networkOfferings[0].id
-                                            },
-                                            dataType: "json",
-                                            async: false,
-                                            success: function (json) {
-                                            var item = json.listnetworkofferingsresponse.networkoffering[0];
-                                                formOffering = item;
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            }
-                                        }); //end ajax
-                                        var offeringDomainIds = formOffering.domainid;
-                                        if (offeringDomainIds) {
-                                            args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                            args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                            offeringDomainIds = offeringDomainIds.indexOf(",") != -1 ? offeringDomainIds.split(",") : [offeringDomainIds];
-                                            var options = args.$form.find('.form-item[rel=domainId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringDomainIds, function(domainIdIndex, domainId) {
-                                                    domainId = domainId.toString().trim();
-                                                    if ($(option).val() === domainId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        } else {
-                                            if (isAdmin()) {
-                                                args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', true);
-                                            }
-                                        }
-                                        var offeringZoneIds = formOffering.zoneid;
-                                        if (offeringZoneIds) {
-                                            offeringZoneIds = offeringZoneIds.indexOf(",") != -1 ? offeringZoneIds.split(",") : [offeringZoneIds];
-                                            var options = args.$form.find('.form-item[rel=zoneId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringZoneIds, function(zoneIdIndex, zoneId) {
-                                                    zoneId = zoneId.toString().trim();
-                                                    if ($(option).val() === zoneId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        }
-                                    },
-                                    fields: {
-                                        isPublic: {
-                                            label: 'label.public',
-                                            isBoolean: true,
-                                            isReverse: true,
-                                            isChecked: false,
-                                            docID: 'helpNetworkOfferingPublic'
-                                        },
-                                        domainId: {
-                                            label: 'label.domain',
-                                            docID: 'helpNetworkOfferingDomain',
-                                            dependsOn: 'isPublic',
-                                            isMultiple: true,
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        $(domainObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.path
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            isHidden: true
-                                        },
-                                        zoneId: {
-                                            label: 'label.zone',
-                                            docID: 'helpNetworkOfferingZone',
-                                            isMultiple: true,
-                                            validation: {
-                                                allzonesonly: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listZones"),
-                                                    data: {available: 'true'},
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var zoneObjs = json.listzonesresponse.zone;
-                                                        $(zoneObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        items.unshift({
-                                                            id: -1,
-                                                            description: "All Zones"
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.networkOfferings[0].id
-                                    };
-                                    if (args.data.isPublic != "on") {
-                                        var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                        if (domainId) {
-                                            $.extend(data, {
-                                                domainid: domainId
-                                            });
-                                        }
-                                    } else {
-                                        $.extend(data, {
-                                            domainid: "public"
-                                        });
-                                    }
-                                    var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : "all";
-                                    if (zoneId) {
-                                        $.extend(data, {
-                                            zoneid: zoneId
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('updateNetworkOffering'),
-                                        data: data,
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var item = json.updatenetworkofferingresponse.networkoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    }); //end ajax
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    guestiptype: {
-                                        label: 'label.guest.type'
-                                    },
-
-                                    ispersistent: {
-                                        label: 'label.persistent',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    egressdefaultpolicy: {
-                                        label: 'label.egress.default.policy',
-                                        converter: function(str) {
-                                            return str === true ? 'Allow' : 'Deny';
-                                        }
-                                    },
-
-                                    availability: {
-                                        label: 'label.availability',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'Required',
-                                                description: 'Required'
-                                            });
-                                            items.push({
-                                                id: 'Optional',
-                                                description: 'Optional'
-                                            });
-                                            //items.push({id: 'Unavailable', description: 'Unavailable'});
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    isdefault: { //created by system by default
-                                        label: 'label.created.by.system',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    specifyvlan: {
-                                        label: 'label.specify.vlan',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    specifyipranges: {
-                                        label: 'label.specify.IP.ranges',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    conservemode: {
-                                        label: 'label.conserve.mode',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    networkrate: {
-                                        label: 'label.network.rate',
-                                        converter: function(args) {
-                                            var networkRate = args;
-                                            if (args == null || args == -1) {
-                                                return "Unlimited";
-                                            } else {
-                                                return _s(args) + " Mb/s";
-
-                                            }
-                                        }
-                                    },
-                                    traffictype: {
-                                        label: 'label.traffic.type'
-                                    },
-                                    supportsstrechedl2subnet: {
-                                        label: 'label.supportsstrechedl2subnet',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    supportspublicaccess: {
-                                        label: 'label.supportspublicaccess',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    },
-                                    serviceCapabilities: {
-                                        label: 'label.service.capabilities'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    zone: {
-                                        label: 'label.zone'
-                                    },
-                                    tags: {
-                                        label: 'label.tags'
-                                    },
-                                    details: {
-                                        label: 'label.details'
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listNetworkOfferings&id=' + args.context.networkOfferings[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.listnetworkofferingsresponse.networkoffering[0];
-                                            if (!item.hasOwnProperty('details')) {
-                                                item.details = {};
-                                            }
-                                            args.response.success({
-                                                actionFilter: networkOfferingActionfilter,
-                                                data: $.extend(item, {
-                                                    details: $.map(item.details, function(val, key) {
-                                                        return key + "=" + val;
-                                                    }).join(', '),
-
-                                                    supportedServices: $.map(item.service, function(service) {
-                                                        return service.name;
-                                                    }).join(', '),
-
-                                                    serviceCapabilities: $.map(item.service, function(service) {
-                                                        return service.provider ? $.map(service.provider, function(capability) {
-                                                            return service.name + ': ' + capability.name;
-                                                        }).join(', ') : null;
-                                                    }).join(', ')
-                                                })
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            vpcOfferings: {
-                type: 'select',
-                title: 'label.menu.vpc.offerings',
-                listView: {
-                    id: 'vpcOfferings',
-                    label: 'label.menu.vpc.offerings',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        state: {
-                            label: 'label.state',
-                            indicator: {
-                                'Enabled': 'on',
-                                'Disabled': 'off',
-                                'Destroyed': 'off'
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listVPCOfferings'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listvpcofferingsresponse.vpcoffering;
-                                args.response.success({
-                                    actionFilter: vpcOfferingActionfilter,
-                                    data: items
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.vpc.offering',
-
-                            createForm: {
-                                title: 'label.add.vpc.offering',
-
-                                preFilter: function(args) {
-                                    var hasAdvancedZones = false;
-
-                                    // Check whether there are any advanced zones
-                                    $.ajax({
-                                        url: createURL('listZones'),
-                                        data: {},
-                                        async: false,
-                                        success: function(json) {
-                                            var zones = json.listzonesresponse.zone;
-                                            if (zones != null && zones.length > 0) {
-                                                for (var i = 0; i < zones.length; i++) {
-                                                    if (zones[i].networktype == "Advanced")
-                                                        hasAdvancedZones = true;
-                                                }
-                                            }
-                                        }
-                                    });
-
-                                    args.$form.bind('change', function() { //when any field in the dialog is changed
-
-                                        var $providers = args.$form.find('.dynamic-input select');
-                                        var $optionsOfProviders = $providers.find('option');
-
-                                        $providers.each(function() {
-                                            //if selected option is disabled, select the first enabled option instead
-                                            if ($(this).find('option:selected:disabled').length > 0) {
-                                                $(this).val($(this).find('option:first'));
-                                            }
-                                        });
-                                    });
-
-                                    args.$form.change();
-                                },
-
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpVpcOfferingName'
-                                    },
-
-                                    displayText: {
-                                        label: 'label.description',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpVpcOfferingDescription'
-                                    },
-
-                                    supportedServices: {
-                                        label: 'label.supported.services',
-
-                                        dynamic: function(args) {
-                                            var networkServiceObjs = [];
-                                            networkServiceObjs.push({
-                                                name: 'Dhcp',
-                                                provider: [
-                                                       {name: 'VpcVirtualRouter'}
-                                                ]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'Dns',
-                                                provider: [{name: 'VpcVirtualRouter'}]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'Lb',
-                                                provider: [
-                                                       {name: 'VpcVirtualRouter'},
-                                                       {name: 'InternalLbVm'}
-                                                ]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'Gateway',
-                                                provider: [{name: 'VpcVirtualRouter'},
-                                                           {name: 'BigSwitchBcf'}]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'StaticNat',
-                                                provider: [
-                                                       {name: 'VpcVirtualRouter'},
-                                                       {name: 'BigSwitchBcf'}]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'SourceNat',
-                                                provider: [
-                                                       {name: 'VpcVirtualRouter'},
-                                                       {name: 'BigSwitchBcf'}]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'NetworkACL',
-                                                provider: [
-                                                       {name: 'VpcVirtualRouter'},
-                                                       {name: 'BigSwitchBcf'}]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'PortForwarding',
-                                                provider: [{name: 'VpcVirtualRouter'}]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'UserData',
-                                                provider: [{name: 'VpcVirtualRouter'},
-                                                           {name: 'ConfigDrive'}]
-                                            });
-                                            networkServiceObjs.push({
-                                                name: 'Vpn',
-                                                provider: [{name: 'VpcVirtualRouter'},
-                                                           {name: 'BigSwitchBcf'}]
-                                            });
-
-                                            networkServiceObjs.push({
-                                                name: 'Connectivity',
-                                                provider: [
-                                                    {name: 'BigSwitchBcf'},
-                                                    {name: 'NiciraNvp'},
-                                                    {name: 'Ovs'},
-                                                    {name: 'JuniperContrailVpcRouter'}
-                                                ]
-                                            });
-
-                                            serviceFields = [];
-                                            var fields = {};
-                                            $(networkServiceObjs).each(function() {
-                                                var serviceName = this.name;
-                                                var providerObjs = this.provider;
-                                                var serviceDisplayName;
-
-                                                // Sanitize names
-                                                switch (serviceName) {
-                                                    case 'Vpn':
-                                                        serviceDisplayName = _l('label.vpn');
-                                                        break;
-                                                    case 'Dhcp':
-                                                        serviceDisplayName = _l('label.dhcp');
-                                                        break;
-                                                    case 'Dns':
-                                                        serviceDisplayName = _l('label.dns');
-                                                        break;
-                                                    case 'Lb':
-                                                        serviceDisplayName = _l('label.load.balancer');
-                                                        break;
-                                                    case 'SourceNat':
-                                                        serviceDisplayName = _l('label.source.nat');
-                                                        break;
-                                                    case 'StaticNat':
-                                                        serviceDisplayName = _l('label.static.nat');
-                                                        break;
-                                                    case 'PortForwarding':
-                                                        serviceDisplayName = _l('label.port.forwarding');
-                                                        break;
-                                                    case 'UserData':
-                                                        serviceDisplayName = _l('label.user.data');
-                                                        break;
-                                                    default:
-                                                        serviceDisplayName = serviceName;
-                                                        break;
-                                                }
-
-                                                var id = {
-                                                    isEnabled: 'service' + '.' + serviceName + '.' + 'isEnabled',
-                                                    capabilities: 'service' + '.' + serviceName + '.' + 'capabilities',
-                                                    provider: 'service' + '.' + serviceName + '.' + 'provider'
-                                                };
-
-                                                serviceCheckboxNames.push(id.isEnabled);
-
-                                                fields[id.isEnabled] = {
-                                                    label: serviceDisplayName,
-                                                    isBoolean: true
-                                                };
-
-                                                serviceFields.push(id.isEnabled);
-
-                                                fields[id.provider] = {
-                                                    label: serviceDisplayName + ' Provider',
-                                                    isHidden: true,
-                                                    dependsOn: id.isEnabled,
-                                                    select: function(args) {
-                                                        var items = [];
-                                                        $(providerObjs).each(function() {
-                                                               items.push({
-                                                                    id: this.name,
-                                                                    description: this.name
-                                                                });
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                }
-                                            });
-
-                                            args.response.success({
-                                                fields: fields
-                                            });
-                                        }
-                                    }, //end of supportedservices field
-
-                                    "service.Connectivity.regionLevelVpcCapabilityCheckbox": {
-                                        label: 'label.regionlevelvpc',
-                                        isHidden: true,
-                                        dependsOn: 'service.Connectivity.isEnabled',
-                                        isBoolean: true
-                                    },
-
-                                    "service.Connectivity.distributedRouterCapabilityCheckbox": {
-                                        label: 'label.distributedrouter',
-                                        isHidden: true,
-                                        dependsOn: 'service.Connectivity.isEnabled',
-                                        isBoolean: true
-                                    },
-
-                                    "service.SourceNat.redundantRouterCapabilityCheckbox": {
-                                        label: 'label.redundant.router.capability',
-                                        isHidden: true,
-                                        dependsOn: 'service.SourceNat.isEnabled',
-                                        isBoolean: true
-                                    },
-                                    isPublic: {
-                                        label: 'label.public',
-                                        isBoolean: true,
-                                        isReverse: true,
-                                        isChecked: false,
-                                        docID: 'helpVpcOfferingPublic'
-                                    },
-                                    domainId: {
-                                        label: 'label.domain',
-                                        docID: 'helpVpcOfferingDomain',
-                                        dependsOn: 'isPublic',
-                                        isMultiple: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    $(domainObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.path
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        isHidden: true
-                                    },
-                                    zoneId: {
-                                        label: 'label.zone',
-                                        docID: 'helpVpcOfferingZone',
-                                        isMultiple: true,
-                                        validation: {
-                                            allzonesonly: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones"),
-                                                data: {available: 'true'},
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    $(zoneObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-                                                    items.unshift({
-                                                        id: -1,
-                                                        description: "All Zones"
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                }//end of fields
-                            }, //end of createForm
-
-                            action: function(args) {
-                                var formData = args.data;
-                                var inputData = {};
-                                var serviceProviderMap = {};
-                                var serviceCapabilityIndex = 0;
-                                var excludedKeys = ['isPublic', 'domainId', 'zoneId', 'state', 'status', 'allocationstate']
-                                $.each(formData, function(key, value) {
-                                    var serviceData = key.split('.');
-                                    if (serviceData.length > 1) {
-                                        if (serviceData[0] == 'service' &&
-                                            serviceData[2] == 'isEnabled' &&
-                                            value == 'on') { // Services field
-
-                                            serviceProviderMap[serviceData[1]] = formData[
-                                                'service.' + serviceData[1] + '.provider'
-                                            ];
-                                        } else if ((key == 'service.Connectivity.regionLevelVpcCapabilityCheckbox') && ("Connectivity" in serviceProviderMap)) {
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity';
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = "RegionLevelVpc";
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true;
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.Connectivity.distributedRouterCapabilityCheckbox') && ("Connectivity" in serviceProviderMap)) {
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'Connectivity';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'DistributedRouter';
-                                            inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true;
-                                            serviceCapabilityIndex++;
-                                        } else if ((key == 'service.SourceNat.redundantRouterCapabilityCheckbox') && ("SourceNat" in serviceProviderMap)) {
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat';
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = "RedundantRouter";
-                                            inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true;
-                                            serviceCapabilityIndex++;
-                                        }
-
-                                    } else if (value != '' && $.inArray(key, excludedKeys) == -1) { // Normal data
-                                        inputData[key] = value;
-                                    }
-                                });
-
-                                // Make supported services list
-                                inputData['supportedServices'] = $.map(serviceProviderMap, function(value, key) {
-                                    return key;
-                                }).join(',');
-
-
-                                // Make service provider map
-                                var serviceProviderIndex = 0;
-                                $.each(serviceProviderMap, function(key, value) {
-                                    inputData['serviceProviderList[' + serviceProviderIndex + '].service'] = key;
-                                    inputData['serviceProviderList[' + serviceProviderIndex + '].provider'] = value;
-                                    serviceProviderIndex++;
-                                });
-
-                                if (args.data.isPublic != "on") {
-                                    var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                    if (domainId) {
-                                        $.extend(inputData, {
-                                            domainid: domainId
-                                        });
-                                    }
-                                }
-
-                                var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : undefined;
-                                if (zoneId) {
-                                    $.extend(inputData, {
-                                        zoneid: zoneId
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('createVPCOffering'),
-                                    data: inputData,
-                                    dataType: 'json',
-                                    async: true,
-                                    success: function(data) {
-                                        var item = data.createvpcofferingresponse;
-
-                                        args.response.success({
-                                            data: item,
-                                            actionFilter: vpcOfferingActionfilter
-                                        });
-                                    },
-
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete({
-                                        actionFilter: vpcOfferingActionfilter
-                                    });
-                                }
-                            },
-
-                            messages: {
-                                notification: function(args) {
-                                    return 'message.added.vpc.offering';
-                                }
-                            }
-                        }
-                    },
-
-                    reorder: cloudStack.api.actions.sort('updateVPCOffering', 'vpcOfferings'),
-
-                    detailView: {
-                        name: 'label.vpc.offering.details',
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.vpcOfferings[0].id,
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext,
-                                        availability: args.data.availability
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('updateVPCOffering'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updatevpcofferingresponse.vpcoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.enable.vpc.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.enable.vpc.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'message.enabling.vpc.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateVPCOffering&id=" + args.context.vpcOfferings[0].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.updatevpcofferingresponse.vpcoffering;
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                state: 'Enabled'
-                                            }
-                                        });
-                                    }
-                                }
-                            },
-
-                            disable: {
-                                label: 'label.disable.vpc.offering',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.disable.vpc.offering';
-                                    },
-                                    notification: function(args) {
-                                        return 'message.disabling.vpc.offering';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateVPCOffering&id=" + args.context.vpcOfferings[0].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.updatevpcofferingresponse.vpcoffering;
-                                            args.response.success();
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                state: 'Disabled'
-                                            }
-                                        });
-                                    }
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.remove.vpc.offering',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('deleteVPCOffering'),
-                                        data: {
-                                            id: args.context.vpcOfferings[0].id
-                                        },
-                                        success: function(json) {
-                                            var jid = json.deletevpcofferingresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function() {
-                                                        return vpcOfferingActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function() {
-                                        return 'message.confirm.remove.vpc.offering';
-                                    },
-                                    notification: function() {
-                                        return 'label.remove.vpc.offering';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            updateOfferingAccess: {
-                                label: 'label.action.update.offering.access',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.update.offering.access';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.vpc.offering.access',
-                                    desc: '',
-                                    preFilter: function(args) {
-                                        var formOffering = args.context.vpcOfferings[0];
-                                        $.ajax({
-                                            url: createURL('listVPCOfferings'),
-                                            data: {
-                                                id: args.context.vpcOfferings[0].id
-                                            },
-                                            dataType: "json",
-                                            async: false,
-                                            success: function (json) {
-                                            var item = json.listvpcofferingsresponse.vpcoffering[0];
-                                                formOffering = item;
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            }
-                                        }); //end ajax
-                                        var offeringDomainIds = formOffering.domainid;
-                                        if (offeringDomainIds) {
-                                            args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', false);
-                                            args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //shown
-                                            offeringDomainIds = offeringDomainIds.indexOf(",") != -1 ? offeringDomainIds.split(",") : [offeringDomainIds];
-                                            var options = args.$form.find('.form-item[rel=domainId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringDomainIds, function(domainIdIndex, domainId) {
-                                                    domainId = domainId.toString().trim();
-                                                    if ($(option).val() === domainId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        } else {
-                                            if (isAdmin()) {
-                                                args.$form.find('.form-item[rel=isPublic]').find('input[name=isPublic]').prop('checked', true);
-                                            }
-                                        }
-                                        var offeringZoneIds = formOffering.zoneid;
-                                        if (offeringZoneIds) {
-                                            offeringZoneIds = offeringZoneIds.indexOf(",") != -1 ? offeringZoneIds.split(",") : [offeringZoneIds];
-                                            var options = args.$form.find('.form-item[rel=zoneId]').find('option');
-                                            $.each(options, function(optionIndex, option) {
-                                                $.each(offeringZoneIds, function(zoneIdIndex, zoneId) {
-                                                    zoneId = zoneId.toString().trim();
-                                                    if ($(option).val() === zoneId) {
-                                                        $(option).attr('selected','selected');
-                                                    }
-                                                });
-                                            });
-                                        }
-                                    },
-                                    fields: {
-                                        isPublic: {
-                                            label: 'label.public',
-                                            isBoolean: true,
-                                            isReverse: true,
-                                            isChecked: false,
-                                            docID: 'helpVpcOfferingPublic'
-                                        },
-                                        domainId: {
-                                            label: 'label.domain',
-                                            docID: 'helpVpcOfferingDomain',
-                                            dependsOn: 'isPublic',
-                                            isMultiple: true,
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        $(domainObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.path
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            isHidden: true
-                                        },
-                                        zoneId: {
-                                            label: 'label.zone',
-                                            docID: 'helpVpcOfferingZone',
-                                            isMultiple: true,
-                                            validation: {
-                                                allzonesonly: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listZones"),
-                                                    data: {available: 'true'},
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        var zoneObjs = json.listzonesresponse.zone;
-                                                        $(zoneObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        items.unshift({
-                                                            id: -1,
-                                                            description: "All Zones"
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.vpcOfferings[0].id
-                                    };
-                                    if (args.data.isPublic != "on") {
-                                        var domainId = (args.data.domainId && Array.isArray(args.data.domainId)) ? args.data.domainId.join(',') : args.data.domainId;
-                                        if (domainId) {
-                                            $.extend(data, {
-                                                domainid: domainId
-                                            });
-                                        }
-                                    } else {
-                                        $.extend(data, {
-                                            domainid: "public"
-                                        });
-                                    }
-                                    var zoneId = (args.data.zoneId && Array.isArray(args.data.zoneId)) ? args.data.zoneId.join(',') : args.data.zoneId != -1 ? args.data.zoneId : "all";
-                                    if (zoneId) {
-                                        $.extend(data, {
-                                            zoneid: zoneId
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('updateVPCOffering'),
-                                        data: data,
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var item = json.updatevpcofferingresponse.vpcoffering;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    }); //end ajax
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-
-                                    isdefault: { //created by system by default
-                                        label: 'label.created.by.system',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    },
-                                    serviceCapabilities: {
-                                        label: 'label.service.capabilities'
-                                    },
-                                    distributedvpcrouter: {
-                                        label: 'label.vpc.distributedvpcrouter',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    supportsregionLevelvpc: {
-                                        label: 'label.vpc.supportsregionlevelvpc',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    serviceCapabilities: {
-                                        label: 'label.service.capabilities'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    zone: {
-                                        label: 'label.zone'
-                                    },
-                                    tags: {
-                                        label: 'label.tags'
-                                    }
-
-                                }],
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listVPCOfferings&id=' + args.context.vpcOfferings[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.listvpcofferingsresponse.vpcoffering[0];
-                                            args.response.success({
-                                                actionFilter: vpcOfferingActionfilter,
-                                                data: $.extend(item, {
-                                                    supportedServices: $.map(item.service, function(service) {
-                                                        return service.name;
-                                                    }).join(', '),
-
-                                                    serviceCapabilities: $.map(item.service, function(service) {
-                                                        return service.provider ? $.map(service.provider, function(capability) {
-                                                            return service.name + ': ' + capability.name;
-                                                        }).join(', ') : null;
-                                                    }).join(', ')
-                                                })
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-}
-
-
-    var serviceOfferingActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        allowedActions.push("edit");
-        allowedActions.push("remove");
-        allowedActions.push("updateOfferingAccess");
-        return allowedActions;
-    };
-
-    var systemServiceOfferingActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        allowedActions.push("edit");
-        allowedActions.push("remove");
-        return allowedActions;
-    };
-
-    var backupOfferingActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        allowedActions.push("remove");
-        return allowedActions;
-    };
-
-    var diskOfferingActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        allowedActions.push("edit");
-        allowedActions.push("remove");
-        allowedActions.push("updateOfferingAccess");
-        return allowedActions;
-    };
-
-    var networkOfferingActionfilter = function(args) {
-        var jsonObj = args.context.item;
-
-        if (jsonObj.state == 'Destroyed')
-            return [];
-
-        var allowedActions = [];
-        allowedActions.push("edit");
-
-        if (jsonObj.state == "Enabled")
-            allowedActions.push("disable");
-        else if (jsonObj.state == "Disabled")
-            allowedActions.push("enable");
-
-        if (jsonObj.isdefault == false)
-            allowedActions.push("remove");
-        allowedActions.push("updateOfferingAccess");
-
-        return allowedActions;
-    };
-
-    var vpcOfferingActionfilter = function(args) {
-        var jsonObj = args.context.item;
-
-        if (jsonObj.state == 'Destroyed')
-            return [];
-
-        var allowedActions = [];
-        allowedActions.push("edit");
-
-        if (jsonObj.state == "Enabled")
-            allowedActions.push("disable");
-        else if (jsonObj.state == "Disabled")
-            allowedActions.push("enable");
-
-        if (jsonObj.isdefault == false)
-            allowedActions.push("remove");
-        allowedActions.push("updateOfferingAccess");
-
-        return allowedActions;
-    };
-
-})(cloudStack, jQuery);
diff --git a/ui/legacy/scripts/dashboard.js b/ui/legacy/scripts/dashboard.js
deleted file mode 100644
index a30e1cd..0000000
--- a/ui/legacy/scripts/dashboard.js
+++ /dev/null
@@ -1,291 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    // Admin dashboard
-    cloudStack.sections.dashboard = {
-        title: 'label.menu.dashboard',
-        show: cloudStack.uiCustom.dashboard,
-
-        adminCheck: function(args) {
-            return isAdmin() ? true : false;
-        },
-
-        // User dashboard
-        user: {
-            dataProvider: function(args) {
-                var dataFns = {
-                    instances: function(data) {
-                        var totalInstanceCount = 0;
-                        $.ajax({
-                            url: createURL("listVirtualMachines"),
-                            data: {
-                                listAll: true,
-                                page: 1,
-                                pageSize: 1
-                            },
-                            async: false,
-                            success: function(json) {
-                                if (json.listvirtualmachinesresponse.count != undefined) {
-                                    totalInstanceCount = json.listvirtualmachinesresponse.count;
-                                }
-                            }
-                        });
-
-                        var RunningInstanceCount = 0;
-                        $.ajax({
-                            url: createURL("listVirtualMachines"),
-                            data: {
-                                listAll: true,
-                                page: 1,
-                                pageSize: 1,
-                                state: "Running"
-                            },
-                            async: false,
-                            success: function(json) {
-                                if (json.listvirtualmachinesresponse.count != undefined) {
-                                    RunningInstanceCount = json.listvirtualmachinesresponse.count;
-                                }
-                            }
-                        });
-
-                        var stoppedInstanceCount = 0;
-                        $.ajax({
-                            url: createURL("listVirtualMachines"),
-                            data: {
-                                listAll: true,
-                                page: 1,
-                                pageSize: 1,
-                                state: "Stopped"
-                            },
-                            async: false,
-                            success: function(json) {
-                                if (json.listvirtualmachinesresponse.count != undefined) {
-                                    stoppedInstanceCount = json.listvirtualmachinesresponse.count;
-                                }
-                            }
-                        });
-
-                        dataFns.account($.extend(data, {
-                            runningInstances: RunningInstanceCount,
-                            stoppedInstances: stoppedInstanceCount,
-                            totalInstances: totalInstanceCount
-                        }));
-                    },
-
-                    account: function(data) {
-                        var user = cloudStack.context.users[0];
-                        dataFns.events($.extend(data, {
-                            accountID: user.userid,
-                            accountName: user.account,
-                            userName: user.username,
-                            accountType: user.role,
-                            accountDomainID: user.domainid
-                        }));
-                    },
-
-                    events: function(data) {
-                        $.ajax({
-                            url: createURL('listEvents'),
-                            data: {
-                                listAll: true,
-                                page: 1,
-                                pageSize: (pageSize > 4? 4: pageSize) //if default.page.size > 4, show 4 items only (since space on dashboard is limited)
-                                //pageSize: 1 //for testing only
-                            },
-                            success: function(json) {
-                                dataFns.ipAddresses($.extend(data, {
-                                    events: json.listeventsresponse.event ? json.listeventsresponse.event : []
-                                }));
-                            }
-                        });
-                    },
-
-                    ipAddresses: function(data) {
-                        $.ajax({
-                            url: createURL('listNetworks'),
-                            data: {
-                                listAll: true,
-                                page: 1,
-                                pageSize: 1,
-                                type: 'isolated',
-                                supportedServices: 'SourceNat'
-                            },
-                            success: function(json) {
-                                var netTotal = json.listnetworksresponse.count ?
-                                    json.listnetworksresponse.count : 0;
-
-                                $.ajax({
-                                    url: createURL('listPublicIpAddresses'),
-                                    data: {
-                                        page: 1,
-                                        pageSize: 1
-                                    },
-                                    success: function(json) {
-                                        var ipTotal = json.listpublicipaddressesresponse.count ?
-                                            json.listpublicipaddressesresponse.count : 0;
-
-                                        complete($.extend(data, {
-                                            netTotal: netTotal,
-                                            ipTotal: ipTotal
-                                        }));
-                                    }
-                                });
-                            }
-                        });
-                    }
-                };
-
-                var complete = function(data) {
-                    args.response.success({
-                        data: data
-                    });
-                };
-
-                dataFns.instances({});
-            }
-        },
-
-        // Admin dashboard
-        admin: {
-            zoneDetailView: {
-                tabs: {
-                    resources: {
-                        title: 'label.resources',
-                        custom: cloudStack.uiCustom.systemChart('resources')
-                    }
-                }
-            },
-
-            dataProvider: function(args) {
-                var dataFns = {
-                    zones: function(data) {
-                        $.ajax({
-                            url: createURL('listZones'),
-                            success: function(json) {
-                                dataFns.capacity({
-                                    zones: json.listzonesresponse.zone
-                                });
-                            }
-                        });
-                    },
-                    capacity: function(data) {
-                        if (window.fetchLatestflag == 1) {
-                            data.fetchLatest = true;
-                        } else {
-                            data.fetchLatest = false;
-                        }
-                        window.fetchLatestflag = 0;
-                        dataFns.alerts(data);
-                    },
-
-                    alerts: function(data) {
-                        $.ajax({
-                            url: createURL('listAlerts'),
-                            data: {
-                                page: 1,
-                                pageSize: (pageSize > 4? 4: pageSize) //if default.page.size > 4, show 4 items only (since space on dashboard is limited)
-                            },
-                            success: function(json) {
-                                var alerts = json.listalertsresponse.alert ?
-                                    json.listalertsresponse.alert : [];
-
-                                dataFns.hostAlerts($.extend(data, {
-                                    alerts: $.map(alerts, function(alert) {
-                                        return {
-                                            name: cloudStack.converters.toAlertType(alert.type),
-                                            description: alert.description,
-                                            sent: cloudStack.converters.toLocalDate(alert.sent)
-                                        };
-                                    })
-                                }));
-                            }
-                        });
-                    },
-
-                    hostAlerts: function(data) {
-                        $.ajax({
-                            url: createURL('listHosts'),
-                            data: {
-                                state: 'Alert',
-                                page: 1,
-                                pageSize: (pageSize > 4? 4: pageSize) //if default.page.size > 4, show 4 items only (since space on dashboard is limited)
-                            },
-                            success: function(json) {
-                                var hosts = json.listhostsresponse.host ?
-                                    json.listhostsresponse.host : [];
-
-                                dataFns.zoneCapacity($.extend(data, {
-                                    hostAlerts: $.map(hosts, function(host) {
-                                        return {
-                                            name: host.name,
-                                            description: 'message.alert.state.detected'
-                                        };
-                                    })
-                                }));
-                            }
-                        });
-                    },
-
-                    zoneCapacity: function(data) {
-                        $.ajax({
-                            url: createURL('listCapacity'),
-                            data: {
-                                fetchLatest: data.fetchLatest,
-                                sortBy: 'usage',
-                            },
-                            success: function(json) {
-                                var capacities = json.listcapacityresponse.capacity ?
-                                    json.listcapacityresponse.capacity : [];
-
-                                complete($.extend(data, {
-                                    zoneCapacities: $.map(capacities, function(capacity) {
-                                        if (capacity.podname) {
-                                            capacity.zonename = capacity.zonename.concat(', ' + _l('label.pod') + ': ' + capacity.podname);
-                                        }
-
-                                        if (capacity.clustername) {
-                                            capacity.zonename = capacity.zonename.concat(', ' + _l('label.cluster') + ': ' + capacity.clustername);
-                                        }
-
-                                        capacity.zonename.replace('Zone:', _l('label.zone') + ':');
-
-                                        return {
-                                            zoneID: capacity.zoneid, // Temporary fix for dashboard
-                                            zoneName: capacity.zonename,
-                                            type: cloudStack.converters.toCapacityCountType(capacity.type),
-                                            percent: capacity.percentused,
-                                            used: cloudStack.converters.convertByType(capacity.type, capacity.capacityused),
-                                            total: cloudStack.converters.convertByType(capacity.type, capacity.capacitytotal)
-                                        };
-                                    })
-                                }));
-                            }
-                        });
-                    }
-                };
-
-                var complete = function(data) {
-                    args.response.success({
-                        data: data
-                    });
-                };
-
-                dataFns.zones({});
-            }
-        }
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/docs.js b/ui/legacy/scripts/docs.js
deleted file mode 100755
index 504a7a2..0000000
--- a/ui/legacy/scripts/docs.js
+++ /dev/null
@@ -1,1417 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-cloudStack.docs = {
-
-    //Dedicate Resource
-
-    helpDedicateResource: {
-
-        desc: 'Check this box to dedicate the resources to specific domain/account',
-        externalLink: ''
-
-    },
-
-    helpAccountForDedication: {
-
-        desc: 'Please enter an account name which belongs to the above selected domain in order to dedicate this resource to this account',
-        externalLink: ''
-
-    },
-
-
-    //Delete/archive events
-    helpEventsDeleteType: {
-
-        desc: 'Delete all the events by specifying its TYPE (e.g., USER.LOGIN)',
-        externalLink: ''
-
-    },
-
-    helpEventsDeleteDate: {
-
-        desc: 'Delete all the events which have been created in date range (specify start and end date)',
-        externalLink: ''
-    },
-
-    helpEventsArchiveType: {
-
-        desc: 'Archive all the events by specifying its TYPE (i.e., USER.LOGIN)',
-        externalLink: ''
-    },
-
-    helpEventsArchiveDate: {
-
-        desc: 'Archive all the events which have been created in date range (specify start and end date)',
-        externalLink: ''
-    },
-
-    //Delete/archive Alerts
-    helpAlertsDeleteType: {
-
-        desc: 'Delete all the alerts by specifying its TYPE (integer number)',
-        externalLink: ''
-
-    },
-
-    helpAlertsDeleteDate: {
-
-        desc: 'Delete all the alerts which have been created in date range (specify start and end date)',
-        externalLink: ''
-    },
-
-    helpAlertsArchiveType: {
-
-        desc: 'Archive all the alerts by specifying its TYPE (integer number)',
-        externalLink: ''
-    },
-
-    helpAlertsArchiveDate: {
-
-        desc: 'Archive all the alerts which have been created in date range (specify start and end date)',
-        externalLink: ''
-    },
-
-    helpManaged: {
-
-        desc: 'True if CloudStack manages the storage; else, false (check with storage provider if unknown)',
-        externalLink: ''
-    },
-
-    helpCapacityBytes: {
-
-        desc: 'Number of bytes for the primary storage to have',
-        externalLink: ''
-    },
-
-    helpCapacityIops: {
-
-        desc: 'Number of IOPS for the primary storage to have',
-        externalLink: ''
-    },
-
-    helpUrl: {
-
-        desc: 'Arbitrary data to be sent to the storage provider for configuration purposes',
-        externalLink: ''
-    },
-
-    //Ldap
-    helpLdapUserFilter: {
-        desc: 'Filter to apply to listing of ldap accounts\n\t"NoFilter": no filtering is done\n\t"LocalDomain": shows only users not in the current or requested domain\n\t"AnyDomain": shows only users not currently known to cloudstack (in any domain)\n\t"PotentialImport": shows all users that (would be) automatically imported to cloudstack with their current usersource',
-        externalLink: ''
-    },
-
-    helpLdapQueryFilter: {
-
-        desc: 'Query filter is used to find a mapped user in the external LDAP server.Cloudstack provides some wildchars to represent the unique attributes in its database . Example - If Cloudstack account-name is same as the LDAP uid, then following will be a valid filter: Queryfilter :  (&(uid=%u) ,  Queryfilter: .incase of Active Directory , Email _ID :(&(mail=%e)) , displayName :(&(displayName=%u)',
-
-        externalLink: ''
-    },
-
-
-    //IP Reservation tooltips
-    helpIPReservationCidr: {
-        desc: 'Edit CIDR when you want to configure IP Reservation in isolated guest Network',
-        externalLink: ''
-
-    },
-
-    helpIPReservationNetworkCidr: {
-        desc: 'The CIDR of the entire network when IP reservation is configured',
-        externalLink: ''
-
-    },
-
-    helpReservedIPRange: {
-        desc: 'The IP Range which is not used by CloudStack to allocate to Guest VMs.Can be used for Non Cloudstack purposes.',
-        externalLink: ''
-    },
-
-    // Add account
-    helpAccountUsername: {
-        desc: 'Any desired login ID. Must be unique in the current domain. The same username can exist in other domains, including sub-domains.',
-        externalLink: ''
-    },
-
-    helpOverridePublicNetwork: {
-        desc: 'Choose to override zone wide traffic label for guest traffic for this cluster',
-        externalLink: ''
-
-    },
-
-    helpOverrideGuestNetwork: {
-
-        desc: 'Choose to override zone wide traffic label for guest traffic for this cluster',
-        externalLink: ''
-
-    },
-
-    helpAccountPassword: {
-        desc: 'Any desired password',
-        externalLink: ''
-    },
-    helpAccountConfirmPassword: {
-        desc: 'Type the same password again',
-        externalLink: ''
-    },
-    helpAccountEmail: {
-        desc: 'The account\'s email address',
-        externalLink: ''
-    },
-    helpAccountFirstName: {
-        desc: 'The first name, also known as the given name, of a person; or the first part of the entity represented by the account, such as a customer or department',
-        externalLink: ''
-    },
-    helpAccountLastName: {
-        desc: 'The last name, also known as the family name, of a person; or the second part of the name of a customer or department',
-        externalLink: ''
-    },
-    helpAccountDomain: {
-        desc: 'Domain in which the account is to be created',
-        externalLink: ''
-    },
-    helpAccountAccount: {
-        desc: 'Multiple users can exist in an account. Set the parent account name here.',
-        externalLink: ''
-    },
-    helpAccountType: {
-        desc: 'Root admin can access all resources. Domain admin can access the domain\'s users, but not physical servers. User sees only their own resources, such as VMs.',
-        externalLink: ''
-    },
-    helpAccountTimezone: {
-        desc: 'Set the time zone that corresponds to the account\'s locale',
-        externalLink: ''
-    },
-    helpAccountNetworkDomain: {
-        desc: 'If you want to assign a special domain name to the account\'s guest VM network, specify the DNS suffix',
-        externalLink: ''
-    },
-    // Add cluster
-    helpClusterZone: {
-        desc: 'The zone in which you want to create the cluster',
-        externalLink: ''
-    },
-    helpClusterHypervisor: {
-        desc: 'The type of hypervisor software that runs on the hosts in this cluster. All hosts in a cluster run the same hypervisor.',
-        externalLink: ''
-    },
-    helpClusterPod: {
-        desc: 'The pod in which you want to create the cluster',
-        externalLink: ''
-    },
-    helpClusterName: {
-        desc: 'Cluster name. Used for display only. For VMware hypervisor, this must be a predefined name in VCenter.',
-        externalLink: ''
-    },
-    helpClustervCenterHost: {
-        desc: 'The hostname or IP address of the vCenter server',
-        externalLink: ''
-    },
-    helpClustervCenterUsername: {
-        desc: 'ID of a user with all administrative privileges on vCenter',
-        externalLink: ''
-    },
-    helpClustervCenterPassword: {
-        desc: 'Password of the user in Username',
-        externalLink: ''
-    },
-    helpClustervCenterDatacenter: {
-        desc: 'The vCenter datacenter that the cluster is in. For example, cloud.dc.VM',
-        externalLink: ''
-    },
-    // Add compute offering
-    helpComputeOfferingName: {
-        desc: 'Any desired name for the offering',
-        externalLink: ''
-    },
-    helpComputeOfferingDescription: {
-        desc: 'A short description of the offering that can be displayed to users',
-        externalLink: ''
-    },
-    helpComputeOfferingStorageType: {
-        desc: 'Type of disk for the VM. Local storage is attached to the hypervisor host where the VM is running. Shared storage is accessible via NFS.',
-        externalLink: ''
-    },
-    helpComputeOfferingProvisioningType: {
-        desc: 'Provisioning type to create a volume. Thin and sparse is lazy allocation. fat is eager allocation.',
-        externalLink: ''
-    },
-    helpComputeOfferingCPUCores: {
-        desc: 'The number of cores which should be allocated to a VM with this offering',
-        externalLink: ''
-    },
-    helpComputeOfferingCPUMHz: {
-        desc: 'The CPU speed of the cores that the VM is allocated. For example, 2000 provides a 2 GHz clock.',
-        externalLink: ''
-    },
-    helpComputeOfferingMemory: {
-        desc: 'The amount of memory in megabytes to allocate for the system VM. For example, 2048 provides 2 GB RAM.',
-        externalLink: ''
-    },
-    helpComputeOfferingNetworkRate: {
-        desc: 'Allowed data transfer rate in megabits(Mb) per second',
-        externalLink: ''
-    },
-    helpComputeOfferingDiskBytesReadRate: {
-        desc: 'Allowed disk read rate in bytes per second',
-        externalLink: ''
-    },
-    helpComputeOfferingDiskBytesWriteRate: {
-        desc: 'Allowed disk write rate in bytes per second',
-        externalLink: ''
-    },
-    helpComputeOfferingDiskIopsReadRate: {
-        desc: 'Allowed disk read rate in I/O requests per second',
-        externalLink: ''
-    },
-    helpComputeOfferingDiskIopsWriteRate: {
-        desc: 'Allowed disk write rate in I/O requests per second',
-        externalLink: ''
-    },
-    helpComputeOfferingHA: {
-        desc: 'If yes, the administrator can choose to have the VM be monitored and as highly available as possible',
-        externalLink: ''
-    },
-    helpComputeOfferingStorageTags: {
-        desc: 'Comma-separated list of attributes that should be associated with the primary storage used by the VM. For example "ssd,blue".',
-        externalLink: ''
-    },
-    helpComputeOfferingHostTags: {
-        desc: 'Any tags that you use to organize your hosts',
-        externalLink: ''
-    },
-    helpComputeOfferingCPUCap: {
-        desc: 'If yes, the system will limit the level of CPU usage even if spare capacity is available',
-        externalLink: ''
-    },
-    helpComputeOfferingPublic: {
-        desc: 'Yes makes the offering available to all domains. No limits the scope to a subdomain; you will be prompted for the subdomain\'s name.',
-        externalLink: ''
-    },
-    helpComputeOfferingDomain: {
-        desc: 'Select the domains in which this offering is available (Tip: Use Ctrl to choose multiple domains)',
-    },
-    helpComputeOfferingZone: {
-        desc: 'Select the zones in which this offering is available (Tip: Use Ctrl to choose multiple zones)',
-        externalLink: ''
-    },
-    // Create Instance Snapshot
-    helpCreateInstanceSnapshotName: {
-        desc: 'Give the snapshot a name. A unique name will be automatically generated if you leave this blank'
-    },
-    helpCreateInstanceSnapshotDescription: {
-        desc: 'A short description of for the snapshot'
-    },
-    helpCreateInstanceSnapshotMemory: {
-        desc: 'Check this to include CPU/memory state. Does not quiesce the VM. If not checked, the snapshot contain only volumes.'
-    },
-    // Create instance storage snapshot
-    helpCreateInstanceStorageSnapshotVolume: {
-        desc: 'Choose a volume that you want to take a snapshot of'
-    },
-    helpCreateInstanceStorageSnapshotName: {
-        desc: 'Give the snapshot a name. A unique name will be automatically generated if you leave this blank'
-    },
-    // Add disk offering
-    helpDiskOfferingName: {
-        desc: 'Any desired name for the offering',
-        externalLink: ''
-    },
-    helpDiskOfferingDescription: {
-        desc: 'A short description of the offering that can be displayed to users',
-        externalLink: ''
-    },
-    helpDiskOfferingProvisioningType: {
-        desc: 'Provisioning type to create a volume. Thin and sparse is lazy allocation. fat is eager allocation.',
-        externalLink: ''
-    },
-    helpDiskOfferingStorageType: {
-        desc: 'Type of disk for the VM. Local is attached to the hypervisor host where the VM is running. Shared is storage accessible via NFS.',
-        externalLink: ''
-    },
-    helpDiskOfferingQoSType: {
-        desc: 'Type of Quality of Service desired, if any.',
-        externalLink: ''
-    },
-    helpDiskOfferingCustomDiskSize: {
-        desc: 'If checked, the user can set their own disk size. If not checked, the root administrator must define a value in Disk Size.',
-        externalLink: ''
-    },
-    helpDiskOfferingDiskSize: {
-        desc: 'Appears only if Custom Disk Size is not selected. Define the volume size in GB. (1GB = 1,073,741,824 bytes)',
-        externalLink: ''
-    },
-    helpDiskOfferingDiskBytesReadRate: {
-        desc: 'Allowed disk read rate in bytes per second',
-        externalLink: ''
-    },
-    helpDiskOfferingDiskBytesWriteRate: {
-        desc: 'Allowed disk write rate in bytes per second',
-        externalLink: ''
-    },
-    helpDiskOfferingDiskIopsReadRate: {
-        desc: 'Allowed disk read rate in I/O requests per second',
-        externalLink: ''
-    },
-    helpDiskOfferingDiskIopsWriteRate: {
-        desc: 'Allowed disk write rate in I/O requests per second',
-        externalLink: ''
-    },
-    helpDiskOfferingCustomDiskIops: {
-        desc: 'If checked, the user can set Min and Max IOPS. If not checked, the root administrator can define such values.',
-        externalLink: ''
-    },
-    helpDiskOfferingDiskIopsMin: {
-        desc: 'Appears only if Custom IOPS is not selected. Define the minimum volume IOPS.',
-        externalLink: ''
-    },
-    helpDiskOfferingDiskIopsMax: {
-        desc: 'Appears only if Custom IOPS is not selected. Define the maximum volume IOPS.',
-        externalLink: ''
-    },
-    helpDiskOfferingHypervisorSnapshotReserve: {
-        desc: 'Hypervisor snapshot reserve space as a percent of a volume (for managed storage using XenServer or VMware) (Ex. The value 25 means 25%.)).'
-    },
-    helpDiskOfferingCacheMode: {
-        desc: 'The write caching mode to use for disks created with this disk offering. This can improve write performance.',
-        externalLink: ''
-    },
-    helpDiskOfferingStorageTags: {
-        desc: 'Comma-separated list of attributes that should be associated with the primary storage for this disk. For example "ssd,blue".',
-        externalLink: ''
-    },
-    helpDiskOfferingPublic: {
-        desc: 'Yes makes the offering available to all domains. No limits the scope to a subdomain; you will be prompted for the subdomain\'s name.',
-        externalLink: ''
-    },
-    helpDiskOfferingDomain: {
-        desc: 'Select the domains in which this offering is available (Tip: Use Ctrl to choose multiple domains)',
-        externalLink: ''
-    },
-    helpDiskOfferingZone: {
-        desc: 'Select the zones in which this offering is available (Tip: Use Ctrl to choose multiple zones)',
-        externalLink: ''
-    },
-    // Add domain
-    helpDomainName: {
-        desc: 'Any desired name for the new sub-domain. Must be unique within the current domain.',
-        externalLink: ''
-    },
-    helpDomainNetworkDomain: {
-        desc: 'If you want to assign a special domain name to this domain\'s guest VM network, specify the DNS suffix',
-        externalLink: ''
-    },
-    helpDomainId: {
-        desc: 'A valid domain id. CloudStack will generate one for you if empty.',
-        externalLink: ''
-    },
-    // Add F5
-    helpF5IPAddress: {
-        desc: 'The IP address of the device',
-        externalLink: ''
-    },
-    helpF5Username: {
-        desc: 'A user ID with valid authentication credentials that provide to access the device',
-        externalLink: ''
-    },
-    helpF5Password: {
-        desc: 'The password for the user ID provided in Username',
-        externalLink: ''
-    },
-    helpF5Type: {
-        desc: 'The type of device that is being added',
-        externalLink: ''
-    },
-    helpF5PublicInterface: {
-        desc: 'Interface of device that is configured to be part of the public network',
-        externalLink: ''
-    },
-    helpF5PrivateInterface: {
-        desc: 'Interface of device that is configured to be part of the private network',
-        externalLink: ''
-    },
-    helpF5Retries: {
-        desc: 'Number of times to attempt a command on the device before considering the operation failed. Default is 2.',
-        externalLink: ''
-    },
-    helpF5Mode: {
-        desc: 'Side by side mode is supported for the F5.',
-        externalLink: ''
-    },
-    helpF5Dedicated: {
-        desc: 'Check this box to dedicate the device to a single account. The value in the Capacity field will be ignored.',
-        externalLink: ''
-    },
-    helpF5Capacity: {
-        desc: 'Number of guest networks/accounts that will share this device',
-        externalLink: ''
-    },
-    // Add guest network
-    helpGuestNetworkName: {
-        desc: 'The name of the network. This will be user-visible.',
-        externalLink: ''
-    },
-    helpGuestNetworkDisplayText: {
-        desc: 'The description of the network. This will be user-visible.',
-        externalLink: ''
-    },
-    helpGuestNetworkZone: {
-        desc: 'The name of the zone this network applies to. The administrator must configure the IP range for the guest networks in each zone.',
-        externalLink: ''
-    },
-    helpGuestNetworkNetworkOffering: {
-        desc: 'If the administrator has configured multiple network offerings, select the one you want to use for this network',
-        externalLink: ''
-    },
-    helpGuestNetworkGateway: {
-        desc: 'The gateway that the guests should use.',
-        externalLink: ''
-    },
-    helpGuestNetworkNetmask: {
-        desc: 'The netmask in use on the subnet the guests will use.',
-        externalLink: ''
-    },
-    // Add guest network from zone
-    helpGuestNetworkZoneName: {
-        desc: 'The name of the network. This will be user-visible.',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneDescription: {
-        desc: 'The description of the network. This will be user-visible.',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneVLANID: {
-        desc: 'The VLAN tag for this network',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneScope: {
-        desc: 'Scope',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneNetworkOffering: {
-        desc: 'If the administrator has configured multiple network offerings, select the one you want to use for this network',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneGateway: {
-        desc: 'The gateway that the guests should use.',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneNetmask: {
-        desc: 'The netmask in use on the subnet the guests will use.',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneStartIP: {
-        desc: 'The first IP address to define a range that can be assigned to guests. We strongly recommend the use of multiple NICs.',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneEndIP: {
-        desc: 'The final IP address to define a range that can be assigned to guests. We strongly recommend the use of multiple NICs.',
-        externalLink: ''
-    },
-    helpGuestNetworkZoneNetworkDomain: {
-        desc: 'If you want to assign a special domain name to this guest VM network, specify the DNS suffix',
-        externalLink: ''
-    },
-    helpGuestNetworkHideIpAddressUsage: {
-        desc: 'If you want the IP address usage records hidden for the network',
-        externalLink: ''
-    },
-    // Add host
-    helpHostZone: {
-        desc: 'The zone where you want to add the host',
-        externalLink: ''
-    },
-    helpHostPod: {
-        desc: 'The pod where you want to add the host',
-        externalLink: ''
-    },
-    helpHostCluster: {
-        desc: 'The cluster where you want to add the host',
-        externalLink: ''
-    },
-    helpHostName: {
-        desc: 'The DNS name or IP address of the host',
-        externalLink: ''
-    },
-    helpHostUsername: {
-        desc: 'Usually root',
-        externalLink: ''
-    },
-    helpHostPassword: {
-        desc: 'The password for the user named in Username. The password was set during hypervisor installation on the host.',
-        externalLink: ''
-    },
-    helpHostTags: {
-        desc: 'Any labels that you use to categorize hosts for ease of maintenance or to enable HA.',
-        externalLink: ''
-    },
-    // Add Netscaler
-    helpNetScalerIPAddress: {
-        desc: 'The IP address of the device',
-        externalLink: ''
-    },
-    helpNetScalerUsername: {
-        desc: 'A user ID with valid authentication credentials that provide to access the device',
-        externalLink: ''
-    },
-    helpNetScalerPassword: {
-        desc: 'The password for the user ID provided in Username',
-        externalLink: ''
-    },
-    helpNetScalerType: {
-        desc: 'The type of device that is being added',
-        externalLink: ''
-    },
-    helpNetScalerPublicInterface: {
-        desc: 'Interface of device that is configured to be part of the public network',
-        externalLink: ''
-    },
-    helpNetScalerPrivateInterface: {
-        desc: 'Interface of device that is configured to be part of the private network',
-        externalLink: ''
-    },
-    helpNetScalerRetries: {
-        desc: 'Number of times to attempt a command on the device before considering the operation failed. Default is 2.',
-        externalLink: ''
-    },
-    helpNetScalerDedicated: {
-        desc: 'Check this box to dedicate the device to a single account. The value in the Capacity field will be ignored.',
-        externalLink: ''
-    },
-    helpNetScalerCapacity: {
-        desc: 'Number of guest networks/accounts that will share this device',
-        externalLink: ''
-    },
-    helpNetscalerServicePackages: {
-        desc: 'Choose the Netscaler Service Package you want to use.',
-        externalLink: ''
-    },
-    // Add network offering
-    helpNetworkOfferingName: {
-        desc: 'Any desired name for the network offering',
-        externalLink: ''
-    },
-    helpNetworkOfferingDescription: {
-        desc: 'A short description of the offering that can be displayed to users',
-        externalLink: ''
-    },
-    helpNetworkOfferingNetworkRate: {
-        desc: 'Allowed data transfer rate in megabits(Mb) per second',
-        externalLink: ''
-    },
-    helpNetworkOfferingTrafficType: {
-        desc: 'The type of network traffic that will be carried on the network',
-        externalLink: ''
-    },
-    helpNetworkOfferingGuestType: {
-        desc: 'Choose whether the guest network is isolated or shared.',
-        externalLink: ''
-    },
-    helpNetworkOfferingSpecifyVLAN: {
-        desc: '(Isolated guest networks only) Indicate whether a VLAN should be specified when this offering is used',
-        externalLink: ''
-    },
-    helpNetworkOfferingVPC: {
-        desc: 'Specify whether this offering is for a virtual private cloud',
-        externalLink: ''
-    },
-    helpNetworkOfferingSystemOffering: {
-        desc: 'Choose the system service offering that you want the virtual routers to use in this network',
-        externalLink: ''
-    },
-    helpNetworkOfferingLBIsolation: {
-        desc: 'Specify what type of load balancer isolation you want for the network: Shared or Dedicated',
-        externalLink: ''
-    },
-    helpNetworkOfferingMode: {
-        desc: 'Choose Inline or Side by Side to specify whether a firewall is placed in front of the load balancing device (inline) or in parallel with it (side-by-side)',
-        externalLink: ''
-    },
-    helpNetworkOfferingAssociatePublicIP: {
-        desc: 'Select this option if you want to assign a public IP address to the VMs deployed in the guest network',
-        externalLink: ''
-    },
-    helpNetworkOfferingRedundantRouterCapability: {
-        desc: 'Select this option if you want to use two virtual routers in the network for uninterrupted connection: one operating as the master virtual router and the other as the backup',
-        externalLink: ''
-    },
-    helpNetworkOfferingConserveMode: {
-        desc: 'Check this box to use conserve mode, where network resources are allocated only when the first VM starts. You can define more than one service on the same public IP only when conserve mode is on.',
-        externalLink: ''
-    },
-    helpNetworkOfferingTags: {
-        desc: 'Network tag to specify which physical network to use',
-        externalLink: ''
-    },
-    helpNetworkOfferingPublic: {
-        desc: 'Yes makes the offering available to all domains. No limits the scope to a subdomain; you will be prompted for the subdomain\'s name.',
-        externalLink: ''
-    },
-    helpNetworkOfferingDomain: {
-        desc: 'Select the domains in which this offering is available (Tip: Use Ctrl to choose multiple domains)',
-    },
-    helpNetworkOfferingZone: {
-        desc: 'Select the zones in which this offering is available (Tip: Use Ctrl to choose multiple zones)',
-        externalLink: ''
-    },
-    // Add pod
-    helpPodZone: {
-        desc: 'The zone where you want to add the pod',
-        externalLink: ''
-    },
-    helpPodName: {
-        desc: 'Set a name for the pod',
-        externalLink: ''
-    },
-    helpPodGateway: {
-        desc: 'The gateway for the hosts in the pod',
-        externalLink: ''
-    },
-    helpPodNetmask: {
-        desc: 'The network prefix that defines the pod\'s subnet.',
-        externalLink: ''
-    },
-    helpPodStartIP: {
-        desc: 'The first IP address to define a range in the management network that is used to manage various system VMs',
-        externalLink: ''
-    },
-    helpPodEndIP: {
-        desc: 'The last IP address to define a range in the management network that is used to manage various system VMs',
-        externalLink: ''
-    },
-    // Add primary storage
-    helpPrimaryStorageZone: {
-        desc: 'The zone in which you want to create the primary storage',
-        externalLink: ''
-    },
-    helpPrimaryStoragePod: {
-        desc: 'The pod in which you want to create the primary storage',
-        externalLink: ''
-    },
-    helpPrimaryStorageCluster: {
-        desc: 'The cluster in which you want to create the primary storage',
-        externalLink: ''
-    },
-    helpPrimaryStorageName: {
-        desc: 'The name of the storage device',
-        externalLink: ''
-    },
-    helpPrimaryStorageProtocol: {
-        desc: 'For XenServer, choose NFS, iSCSI, or PreSetup. For KVM, choose NFS, SharedMountPoint, RDB, CLVM or Gluster. For vSphere, choose PreSetup (VMFS or iSCSI or FiberChannel or vSAN or vVols) or NFS. For Hyper-V, choose SMB/CIFS. For LXC, choose NFS or SharedMountPoint. For OVM, choose NFS or ocfs2.',
-        externalLink: ''
-    },
-    helpPrimaryStorageServer: {
-        desc: 'NFS, iSCSI, or PreSetup: IP address or DNS name of the storage device. VMFS: IP address or DNS name of the vCenter server.',
-        externalLink: ''
-    },
-    helpPrimaryStoragePath: {
-        desc: 'NFS: exported path from the server. VMFS: /datacenter name/datastore name. SharedMountPoint: path where primary storage is mounted, such as "/mnt/primary"',
-        externalLink: ''
-    },
-    helpPrimaryStorageSRNameLabel: {
-        desc: 'The name-label of the SR that has been set up independently of the cloud management system',
-        externalLink: ''
-    },
-    helpPrimaryStorageTargetIQN: {
-        desc: 'In iSCSI, this is the IQN of the target. For example, iqn.1986-03.com.sun:02:01ec9bb549-1271378984',
-        externalLink: ''
-    },
-    helpPrimaryStorageLun: {
-        desc: 'In iSCSI, this is the LUN number. For example, 3.',
-        externalLink: ''
-    },
-    helpPrimaryStorageRBDMonitor: {
-        desc: 'The address of a Ceph monitor. Can also be a Round Robin DNS record',
-        externalLink: ''
-    },
-    helpPrimaryStorageRBDPool: {
-        desc: 'The pool to use on the Ceph cluster. This pool should already exist',
-        externalLink: ''
-    },
-    helpPrimaryStorageRBDId: {
-        desc: 'The cephx user to use without the client. prefix. For example: admin',
-        externalLink: ''
-    },
-    helpPrimaryStorageRBDSecret: {
-        desc: 'The base64 encoded secret of the cephx user.',
-        externalLink: ''
-    },
-    helpPrimaryStorageTags: {
-        desc: 'Comma-separated list of tags for this storage device. Must be the same set or a superset of the tags on your disk offerings.',
-        externalLink: ''
-    },
-    // Add secondary storage
-    helpSecondaryStorageZone: {
-        desc: 'The zone in which you want to create the secondary storage',
-        externalLink: ''
-    },
-    helpSecondaryStorageNFSServer: {
-        desc: 'The IP address of the server',
-        externalLink: ''
-    },
-    helpSecondaryStoragePath: {
-        desc: 'The exported path from the server',
-        externalLink: ''
-    },
-    // S3
-    helpS3AccessKey: {
-        desc: 'This identifies the S3 user account',
-        externalLink: ''
-    },
-    helpS3SecretKey: {
-        desc: 'The password matching the S3 Access Key',
-        externalLink: ''
-    },
-    helpS3Bucket: {
-        desc: 'The S3 bucket to store CloudStack data in. The bucket must be created and owned by the same user identified by the S3 Access Key',
-        externalLink: ''
-    },
-    helpS3Endpoint: {
-        desc: 'The S3 server to use. Non-standard ports can be appended to the hostname as per s3.amazonaws.com:8080',
-        externalLink: ''
-    },
-    helpS3ConnectionTimeout: {
-        desc: 'The number of milliseconds to wait when establishing an S3 connection. This is optional',
-        externalLink: ''
-    },
-    helpS3MaxErrorRetry: {
-        desc: 'The number of times to retry S3 requests before failing. This is optional',
-        externalLink: ''
-    },
-    helpS3SocketTimeout: {
-        desc: 'The number of milliseconds to wait while reading an S3 response. This is optional',
-        externalLink: ''
-    },
-    helpNFSStagingServer: {
-        desc: 'The name or IP address of the NFS secondary staging server',
-        externalLink: ''
-    },
-    helpNFSStagingPath: {
-        desc: 'The exported path to use on the NFS staging server',
-        externalLink: ''
-    },
-    // Add SRX
-    helpSRXIPAddress: {
-        desc: 'The IP address of the device',
-        externalLink: ''
-    },
-    helpSRXUsername: {
-        desc: 'A user ID with valid authentication credentials that provide to access the device',
-        externalLink: ''
-    },
-    helpSRXPassword: {
-        desc: 'The password for the user ID provided in Username',
-        externalLink: ''
-    },
-    helpSRXType: {
-        desc: 'The type of device that is being added',
-        externalLink: ''
-    },
-    helpSRXPublicInterface: {
-        desc: 'Interface of device that is configured to be part of the public network. For example, ge-0/0/2',
-        externalLink: ''
-    },
-    helpSRXPrivateInterface: {
-        desc: 'Interface of device that is configured to be part of the private network. For example, ge-0/0/1',
-        externalLink: ''
-    },
-    helpSRXUsageInterface: {
-        desc: 'Interface used to meter traffic. If you don\'t want to use the public interface, specify a different interface name here.',
-        externalLink: ''
-    },
-    helpSRXRetries: {
-        desc: 'Number of times to attempt a command on the device before considering the operation failed. Default is 2.',
-        externalLink: ''
-    },
-    helpSRXTimeout: {
-        desc: 'The time to wait for a command on the SRX before considering it failed. Default is 300 seconds.',
-        externalLink: ''
-    },
-    helpSRXMode: {
-        desc: 'Side by side mode is supported for the SRX.',
-        externalLink: ''
-    },
-    helpSRXPublicNetwork: {
-        desc: 'The name of the public network on the SRX. For example, trust.',
-        externalLink: ''
-    },
-    helpSRXPrivateNetwork: {
-        desc: 'The name of the private network on the SRX. For example, untrust.',
-        externalLink: ''
-    },
-    helpSRXDedicated: {
-        desc: 'Check this box to dedicate the device to a single account. The value in the Capacity field will be ignored.',
-        externalLink: ''
-    },
-    helpSRXCapacity: {
-        desc: 'Number of guest networks/accounts that will share this device',
-        externalLink: ''
-    },
-    // Add Palo Alto
-    helpPaloAltoIPAddress: {
-        desc: 'The IP address of the device',
-        externalLink: ''
-    },
-    helpPaloAltoUsername: {
-        desc: 'A user ID with valid authentication credentials that provide to access the device',
-        externalLink: ''
-    },
-    helpPaloAltoPassword: {
-        desc: 'The password for the user ID provided in Username',
-        externalLink: ''
-    },
-    helpPaloAltoType: {
-        desc: 'The type of device that is being added',
-        externalLink: ''
-    },
-    helpPaloAltoPublicInterface: {
-        desc: 'Interface of device that is configured to be part of the public network. For example, ge-0/0/2',
-        externalLink: ''
-    },
-    helpPaloAltoPrivateInterface: {
-        desc: 'Interface of device that is configured to be part of the private network. For example, ge-0/0/1',
-        externalLink: ''
-    },
-    helpPaloAltoUsageInterface: {
-        desc: 'Interface used to meter traffic. If you don\'t want to use the public interface, specify a different interface name here.',
-        externalLink: ''
-    },
-    helpPaloAltoRetries: {
-        desc: 'Number of times to attempt a command on the device before considering the operation failed. Default is 2.',
-        externalLink: ''
-    },
-    helpPaloAltoTimeout: {
-        desc: 'The time to wait for a command on the Palo Alto before considering it failed. Default is 300 seconds.',
-        externalLink: ''
-    },
-    helpPaloAltoMode: {
-        desc: 'Side by side mode is supported for the Palo Alto.',
-        externalLink: ''
-    },
-    helpPaloAltoPublicNetwork: {
-        desc: 'The name of the public network on the Palo Alto. For example, trust.',
-        externalLink: ''
-    },
-    helpPaloAltoPrivateNetwork: {
-        desc: 'The name of the private network on the Palo Alto. For example, untrust.',
-        externalLink: ''
-    },
-    helpPaloAltoVirtualRouter: {
-        desc: 'The name of the virtual router on the Palo Alto.',
-        externalLink: ''
-    },
-    helpPaloAltoThreatProfile: {
-        desc: 'The threat profile name/group to associate with allow firewall policies.',
-        externalLink: ''
-    },
-    helpPaloAltoLogProfile: {
-        desc: 'The log profile name/group to associate with allow firewall policies.',
-        externalLink: ''
-    },
-    helpPaloAltoDedicated: {
-        desc: 'Check this box to dedicate the device to a single account. The value in the Capacity field will be ignored.',
-        externalLink: ''
-    },
-    helpPaloAltoCapacity: {
-        desc: 'Number of guest networks/accounts that will share this device',
-        externalLink: ''
-    },
-    // Add system service offering
-    helpSystemOfferingName: {
-        desc: 'Any desired name for the offering',
-        externalLink: ''
-    },
-    helpSystemOfferingDescription: {
-        desc: 'A short description of the offering that can be displayed to the root administrator',
-        externalLink: ''
-    },
-    helpSystemOfferingVMType: {
-        desc: 'The type of system VM that is being offered',
-        externalLink: ''
-    },
-    helpSystemOfferingStorageType: {
-        desc: 'Type of disk for the system VM. Local storage is attached to the host where the system VM is running. Shared storage is accessible via NFS.',
-        externalLink: ''
-    },
-    helpSystemOfferingCPUCores: {
-        desc: 'The number of cores which should be allocated to a system VM with this offering',
-        externalLink: ''
-    },
-    helpSystemOfferingCPUMHz: {
-        desc: 'The CPU speed of the cores that the system VM is allocated. For example, 2000 would provide for a 2 GHz clock.',
-        externalLink: ''
-    },
-    helpSystemOfferingMemory: {
-        desc: 'The amount of memory in megabytes to allocate for the system VM. For example, 2048 provides 2 GB RAM.',
-        externalLink: ''
-    },
-    helpSystemOfferingNetworkRate: {
-        desc: 'Allowed data transfer rate in megabits(Mb) per second',
-        externalLink: ''
-    },
-    helpSystemOfferingDiskBytesReadRate: {
-        desc: 'Allowed disk read rate in bytes per second',
-        externalLink: ''
-    },
-    helpSystemOfferingDiskBytesWriteRate: {
-        desc: 'Allowed disk write rate in bytes per second',
-        externalLink: ''
-    },
-    helpSystemOfferingDiskIopsReadRate: {
-        desc: 'Allowed disk read rate in I/O requests per second',
-        externalLink: ''
-    },
-    helpSystemOfferingDiskIopsWriteRate: {
-        desc: 'Allowed disk write rate in I/O requests per second',
-        externalLink: ''
-    },
-    helpSystemOfferingHA: {
-        desc: 'If yes, the administrator can choose to have the system VM be monitored and as highly available as possible',
-        externalLink: ''
-    },
-    helpSystemOfferingStorageTags: {
-        desc: 'Comma-separated list of attributes that should be associated with the primary storage used by the system VM. For example "ssd,blue".',
-        externalLink: ''
-    },
-    helpSystemOfferingHostTags: {
-        desc: 'Any tags that you use to organize your hosts',
-        externalLink: ''
-    },
-    helpSystemOfferingCPUCap: {
-        desc: 'If yes, the system will limit the level of CPU usage even if spare capacity is available',
-        externalLink: ''
-    },
-    helpSystemOfferingPublic: {
-        desc: 'Yes makes the offering available to all domains. No limits the scope to a subdomain; you will be prompted for the subdomain\'s name.',
-        externalLink: ''
-    },
-    helpSystemOfferingDomain: {
-        desc: 'Select the subdomain in which this offering is available',
-        externalLink: ''
-    },
-    // Add tier
-    helpTierName: {
-        desc: 'A unique name for the tier',
-        externalLink: ''
-    },
-    helpTierNetworkOffering: {
-        desc: 'If the administrator has configured multiple network offerings, select the one you want to use for this tier',
-        externalLink: ''
-    },
-    helpTierGateway: {
-        desc: 'The gateway for the tier. Must be in the Super CIDR range of the VPC and not overlapping the CIDR of any other tier in this VPC.',
-        externalLink: ''
-    },
-    helpTierNetmask: {
-        desc: 'Netmask for the tier. For example, with VPC CIDR of 10.0.0.0/16 and network tier CIDR of 10.0.1.0/24, gateway is 10.0.1.1 and netmask is 255.255.255.0',
-        externalLink: ''
-    },
-    // Add user
-    helpUserUsername: {
-        desc: 'Any desired user ID. Must be unique in the current domain. The same username can exist in other domains, including sub-domains.',
-        externalLink: ''
-    },
-    helpUserPassword: {
-        desc: 'Any desired user password',
-        externalLink: ''
-    },
-    helpUserConfirmPassword: {
-        desc: 'Type the same password again',
-        externalLink: ''
-    },
-    helpUserEmail: {
-        desc: 'The user\'s email address',
-        externalLink: ''
-    },
-    helpUserFirstName: {
-        desc: 'The user\'s first name, also known as the given name',
-        externalLink: ''
-    },
-    helpUserLastName: {
-        desc: 'The user\'s last name, also known as the family name',
-        externalLink: ''
-    },
-    helpUserTimezone: {
-        desc: 'Set the time zone that corresponds to the user\'s locale',
-        externalLink: ''
-    },
-    // Add volume
-    helpVolumeName: {
-        desc: 'Give a unique volume name. If it is not provided, a name will be generated randomly.',
-        externalLink: ''
-    },
-    helpVolumeAvailabilityZone: {
-        desc: 'Where do you want the storage to reside? This should be close to the VM that will use the volume.',
-        externalLink: ''
-    },
-    helpVolumeDiskOffering: {
-        desc: 'Choose the characteristics of the storage.',
-        externalLink: ''
-    },
-    helpVolumeSizeGb: {
-        desc: 'Volume size in GB (1GB = 1,073,741,824 bytes)',
-        externalLink: ''
-    },
-    helpRootDiskSizeGb: {
-        desc: 'Root disk size in GB',
-        externalLink: ''
-    },
-    // Add VPC
-    helpVPCName: {
-        desc: 'A name for the new VPC',
-        externalLink: ''
-    },
-    helpVPCDescription: {
-        desc: 'Display text about the VPC',
-        externalLink: ''
-    },
-    helpVPCZone: {
-        desc: 'Zone where you want the VPC to be available',
-        externalLink: ''
-    },
-    helpVPCSuperCIDR: {
-        desc: 'CIDR range for all the tiers within a VPC. Each tier\'s CIDR must be within the Super CIDR.',
-        externalLink: ''
-    },
-    helpVPCDomain: {
-        desc: 'If you want to assign a special domain name to this VPC\'s guest VM network, specify the DNS suffix',
-        externalLink: ''
-    },
-    // Add VPC gateway
-    helpVPCGatewayPhysicalNetwork: {
-        desc: 'Name of a physical network that has been created in the zone',
-        externalLink: ''
-    },
-    helpVPCGatewayVLAN: {
-        desc: 'The VLAN associated with the VPC gateway',
-        externalLink: ''
-    },
-    helpVPCGatewayIP: {
-        desc: 'The IP address associated with the VPC gateway',
-        externalLink: ''
-    },
-    helpVPCGatewayGateway: {
-        desc: 'The gateway through which the traffic is routed to and from the VPC',
-        externalLink: ''
-    },
-    helpVPCGatewayNetmask: {
-        desc: 'The netmask associated with the VPC gateway',
-        externalLink: ''
-    },
-    // Add VPN customer gateway
-    helpVPNGatewayName: {
-        desc: 'A unique name for the VPN customer gateway',
-        externalLink: ''
-    },
-    helpVPNGatewayGateway: {
-        desc: 'The IP address for the remote gateway',
-        externalLink: ''
-    },
-    helpVPNGatewayCIDRList: {
-        desc: 'The guest CIDR list of the remote subnets. Enter a CIDR or a comma-separated list. Do not overlap the VPC\'s CIDR or another guest CIDR.',
-        externalLink: ''
-    },
-    helpVPNGatewayIPsecPresharedKey: {
-        desc: 'Enter a secret key value. The endpoints of the VPN share a secret key. This is used to authenticate the customer gateway and the VPC VPN gateway to each other.',
-        externalLink: ''
-    },
-    helpVPNGatewayIKEEncryption: {
-        desc: 'Enter AES128, AES192, AES256, or 3DES to specify the Internet Key Exchange (IKE) policy for phase-1. Authentication is accomplished with Preshared Keys.',
-        externalLink: ''
-    },
-    helpVPNGatewayIKEHash: {
-        desc: 'Enter SHA1 or MD5 to specify the IKE hash algorithm for phase-1',
-        externalLink: ''
-    },
-    helpVPNGatewayIKEDH: {
-        desc: 'Enter Group-5 (1536-bit), Group-2 (1024-bit), or None to specify the public-key cryptography protocol to use. The 1536-bit Diffie-Hellman group is used within IKE to establish session keys.',
-        externalLink: ''
-    },
-    helpVPNGatewayESPEncryption: {
-        desc: 'Enter AES128, AES192, AES256, or 3DES to specify the Encapsulating Security Payload (ESP) algorithm within phase-2',
-        externalLink: ''
-    },
-    helpVPNGatewayESPHash: {
-        desc: 'Enter SHA1 or MD5 to specify the Encapsulating Security Payload (ESP) hash for phase-2',
-        externalLink: ''
-    },
-    helpVPNGatewayPerfectForwardSecrecy: {
-        desc: 'Choose Group-5 (1536-bit), Group-2 (1024-bit), or None to specify whether to enforce a new Diffie-Hellman key exchange and, if so, what size of DH group to use',
-        externalLink: ''
-    },
-    helpVPNGatewayIKELifetime: {
-        desc: 'The phase-1 lifetime of the security association in seconds. Whenever the time expires, a new phase-1 exchange is performed.',
-        externalLink: ''
-    },
-    helpVPNGatewayESPLifetime: {
-        desc: 'The phase-2 lifetime of the security association in seconds. Whenever the time expires, a re-key is initiated to provide a new IPsec encryption and authentication session keys.',
-        externalLink: ''
-    },
-    helpVPNGatewayDeadPeerDetection: {
-        desc: 'Check this to make the virtual router query its IKE peer at regular intervals to ensure continued availability. It is recommended to have the same DPD setting on both sides of the VPN connection.',
-        externalLink: ''
-    },
-    helpVPNGatewayForceEncapsulation: {
-        desc: 'Force UDP encapsulation for ESP packets even if no NAT situation is detected. This may help to surmount restrictive firewalls. In order to force the peer to encapsulate packets, NAT detection payloads are faked',
-        externalLink: ''
-    },
-    // Copy template
-    helpCopyTemplateDestination: {
-        desc: 'The zone to which you want to copy the template',
-        externalLink: ''
-    },
-    // Enter token
-    helpEnterTokenProjectID: {
-        desc: 'Unique identifying number for the project. Use the number you received in the invitation email',
-        externalLink: ''
-    },
-    helpEnterTokenToken: {
-        desc: 'Unique security code that authorizes you to accept the project invitation. Use the token you received in the invitation email',
-        externalLink: ''
-    },
-    // Register template
-    helpRegisterTemplate: {
-        desc: '',
-        externalLink: ''
-    },
-    // Register template
-    helpRegisterTemplate: {
-        desc: '',
-        externalLink: ''
-    },
-    // Register ISO
-    helpRegisterISOName: {
-        desc: 'A unique name for the ISO. This will be visible to users, so choose something descriptive.',
-        externalLink: ''
-    },
-    helpRegisterISODescription: {
-        desc: 'Display text describing the ISO. This will be visible to users, so choose something descriptive.',
-        externalLink: ''
-    },
-    helpRegisterISOURL: {
-        desc: 'The Management Server will download the file from the specified URL, such as http://my.web.server/filename.iso',
-        externalLink: ''
-    },
-    helpRegisterISODirectDownload: {
-        desc: 'KVM Only: Secondary Storage is bypassed and ISO is downloaded to Primary Storage on deployment',
-        externalLink: ''
-    },
-    helpRegisterISOZone: {
-        desc: 'Choose the zone where you want the ISO to be available, or All Zones to make it available throughout the cloud',
-        externalLink: ''
-    },
-    helpRegisterISOBootable: {
-        desc: 'Indicate whether the machine can be booted using this ISO',
-        externalLink: ''
-    },
-    helpRegisterISOOSType: {
-        desc: 'Operating system of the VM represented by the ISO. If the OS type of the ISO is not listed, choose Other.',
-        externalLink: ''
-    },
-    helpRegisterISOExtractable: {
-        desc: 'Whether the ISO is downloadable by users or not',
-        externalLink: ''
-    },
-    helpRegisterISOPublic: {
-        desc: 'Check this to make the ISO accessible to all users. The ISO will appear in the Community ISOs list.',
-        externalLink: ''
-    },
-    helpRegisterISOFeatured: {
-        desc: 'Check this to make the ISO more prominent for users. The ISO will appear in the Featured ISOs list.',
-        externalLink: ''
-    },
-    // Register template
-    helpRegisterTemplateName: {
-        desc: 'A unique name for the template. This will be visible to users, so choose something descriptive.',
-        externalLink: ''
-    },
-    helpRegisterTemplateDescription: {
-        desc: 'Display text describing the template. This will be visible to users, so choose something descriptive.',
-        externalLink: ''
-    },
-    helpRegisterTemplateURL: {
-        desc: 'The Management Server will download the file from the specified URL, such as http://my.web.server/filename.vhd.gz',
-        externalLink: ''
-    },
-    helpRegisterTemplateDirectDownload: {
-        desc: 'KVM Only: Secondary Storage is bypassed and template/ISO is downloaded to Primary Storage on deployment',
-        externalLink: ''
-    },
-    helpRegisterTemplateZone: {
-        desc: 'Choose one or more zones where you want the template to be available, or All Zones to make it available throughout the cloud. (Tip: Use Ctrl to choose multiple zones)',
-        externalLink: ''
-    },
-    helpRegisterTemplateHypervisor: {
-        desc: 'The hypervisor software from which this template is being imported; this determines the value of Format',
-        externalLink: ''
-    },
-    helpRegisterTemplateFormat: {
-        desc: 'The data format of the template upload file',
-        externalLink: ''
-    },
-    helpRegisterTemplateOSType: {
-        desc: 'Operating system of the VM represented by the template. If the OS type of the template is not listed, choose Other.',
-        externalLink: ''
-    },
-    helpRegisterTemplateExtractable: {
-        desc: 'Whether the template is downloadable by users or not',
-        externalLink: ''
-    },
-    helpRegisterTemplateDynamicallyScalable: {
-        desc: 'Check this if the template contains XS/VMWare tools to support dynamic scaling of VM cpu/memory.',
-        externalLink: ''
-    },
-    helpRegisterTemplatePasswordEnabled: {
-        desc: 'Check this if the template has the password change script installed.',
-        externalLink: ''
-    },
-    helpRegisterTemplatePublic: {
-        desc: 'Check this to make the template accessible to all users. The template will appear in the Community Templates list.',
-        externalLink: ''
-    },
-    helpRegisterTemplateFeatured: {
-        desc: 'Check this to make the template more prominent for users. The template will appear in the Featured Templates list.',
-        externalLink: ''
-    },
-    helpRegisterTemplateRouting: {
-        desc: 'Check this if the template is used for deploying router.',
-        externalLink: ''
-    },
-    helpRegisterTemplateHvm: {
-        desc: 'Check this if the template requires hvm.',
-        externalLink: ''
-    },
-    // Upload volume
-    helpUploadVolumeName: {
-        desc: 'A unique name for the volume. This will be visible to users, so choose something descriptive.',
-        externalLink: ''
-    },
-    helpUploadVolumeZone: {
-        desc: 'Choose the zone where you want to store the volume. VMs running on hosts in this zone can attach the volume.',
-        externalLink: ''
-    },
-    helpUploadVolumeFormat: {
-        desc: 'The disk image format of the volume. XenServer is VHD, VMware is OVA, and KVM is QCOW2. Hyper-V is VHD or VHDX. OVM is RAW.',
-        externalLink: ''
-    },
-    helpUploadVolumeURL: {
-        desc: 'Secure HTTP or HTTPS URL that can be used to get the disk. File type must match Format. For example, if Format is VHD, http://yourFileServerIP/userdata/myDataDisk.vhd',
-        externalLink: ''
-    },
-    helpUploadVolumeChecksum: {
-        desc: 'Use the hash that you created at the start of the volume upload procedure',
-        externalLink: ''
-    },
-    helpLdapGroupName: {
-        desc: 'The group name from which you want to import LDAP users',
-        externalLink: ''
-    },
-    helpSamlEnable: {
-        desc: 'Enable SAML Single Sign On for the user(s)',
-        externalLink: ''
-    },
-    helpSamlEntity: {
-        desc: 'Choose the SAML Identity Provider Entity ID with which you want to enable the Single Sign On for the user(s)',
-        externalLink: ''
-    },
-    helpVpcOfferingName: {
-        desc: 'Any desired name for the VPC offering',
-        externalLink: ''
-    },
-    helpVpcOfferingDescription: {
-        desc: 'A short description of the offering that can be displayed to users',
-        externalLink: ''
-    },
-    helpVpcOfferingPublic: {
-        desc: 'Yes makes the offering available to all domains. No limits the scope to a subdomain; you will be prompted for the subdomain\'s name.',
-        externalLink: ''
-    },
-    helpVpcOfferingDomain: {
-        desc: 'Select the domains in which this offering is available (Tip: Use Ctrl to choose multiple domains)',
-    },
-    helpVpcOfferingZone: {
-        desc: 'Select the zones in which this offering is available (Tip: Use Ctrl to choose multiple zones)',
-        externalLink: ''
-    },
-    helpOvm3pool: {
-        desc: 'Pool the Ovm3 nodes in this cluster, required for vm node migrations',
-        externalLink: ''
-    },
-    helpOvm3cluster: {
-        desc: 'Use the native Ovm3 OCFS2 clustering, required for native HA and requires pooling',
-        externalLink: ''
-    },
-    helpOvm3Vip: {
-        desc: 'The VIP used by the pool and cluster',
-        externalLink: ''
-    },
-    helpLdapGroupName: {
-        desc: 'Fully qualified name of OU/GROUP in LDAP',
-        externalLink: ''
-    },
-    helpLdapGroupType: {
-        desc: 'Type of LDAP name provided. Can be either GROUP/OU',
-        externalLink: ''
-    },
-    helpLdapLinkDomainAdmin: {
-        desc: 'domain admin of the linked domain. Specify a username in GROUP/OU of LDAP'
-    },
-    helpSetReservationSystemVms: {
-        desc: 'If enabled, IP range reservation is set for SSVM & CPVM. Global setting "system.vm.public.ip.reservation.mode.strictness" is used to control whether reservation is strict or not (preferred)'
-    },
-    helpL2UserData: {
-        desc: 'Pass user and meta data to VMs (via ConfigDrive)',
-        externalLink: ''
-    },
-    helpComputeOfferingMinCPUCores: {
-        desc: 'This will be used for the setting the range (min-max) of the number of cpu cores that should be allowed for VMs using this custom offering.',
-        externalLink: ''
-    },
-    helpComputeOfferingMaxCPUCores: {
-        desc: 'This will be used for the setting the range (min-max) of the number of cpu cores that should be allowed for VMs using this custom offering.',
-        externalLink: ''
-    },
-    helpComputeOfferingMinMemory: {
-        desc: 'This will be used for the setting the range (min-max) amount of memory that should be allowed for VMs using this custom offering.',
-        externalLink: ''
-    },
-    helpComputeOfferingMaxMemory: {
-        desc: 'This will be used for the setting the range (min-max) amount of memory that should be allowed for VMs using this custom offering.',
-        externalLink: ''
-    },
-    helpComputeOfferingType: {
-        desc: 'This will be used for setting the type of compute offering - whether it is fixed, custom constrained or custom unconstrained.',
-        externalLink: ''
-    },
-
-    // Update Template Permissions Helper
-    helpUpdateTemplateOperation: {
-        desc: 'Select the permission operator. Add is for sharing with user/project and Reset simply removes all the accounts and projects which template has been shared with.'
-    },
-    helpUpdateTemplateShareWith: {
-        desc: 'Select account or project with which template is to be shared with.'
-    },
-    helpUpdateTemplateAccounts: {
-        desc: 'Choose one or more accounts to share this template. Ctrl+Click to select multiple accounts to share with. Selecting "Add > Accounts" shows list of accounts that do not have permissions. Selecting "Remove > Accounts" shows list of accounts that already have permissions.'
-    },
-    helpUpdateTemplateProjectIds: {
-        desc: 'Choose one or more projects to share this template. Ctrl+Click to select multiple projects to share with. Selecting "Add > Projects" shows list of projects that do not have permissions. Selecting "Remove > Projects" shows list of projects that already have permissions.'
-    },
-    helpUpdateTemplateAccountList: {
-        desc: 'A comma seperated list of accounts to share the template with. Must be specified with the Add/Remove operation, leave Project ID blank if this is specified.'
-    }
-};
diff --git a/ui/legacy/scripts/domains.js b/ui/legacy/scripts/domains.js
deleted file mode 100644
index 9e96f49..0000000
--- a/ui/legacy/scripts/domains.js
+++ /dev/null
@@ -1,837 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-    cloudStack.sections.domains = {
-        title: 'label.menu.domains',
-        id: 'domains',
-
-        // Domain tree
-        treeView: {
-        overflowScroll: true,
-            // Details
-            detailView: {
-                name: 'label.domain.details',
-                viewAll: {
-                    label: 'label.accounts',
-                    path: 'accounts'
-                },
-
-                // Detail actions
-                actions: {
-                    'delete': {
-                        label: 'label.action.delete.domain',
-                        messages: {
-                            notification: function(args) {
-                                return 'label.action.delete.domain';
-                            }
-                        },
-
-                        createForm: {
-                            title: 'label.action.delete.domain',
-                            desc: 'message.action.delete.domain',
-                            createLabel: 'label.delete',
-                            preFilter: function(args) {
-                                if (isAdmin()) {
-                                    args.$form.find('.form-item[rel=isForced]').css('display', 'inline-block');
-                                }
-                            },
-                            fields: {
-                                isForced: {
-                                    label: 'force.delete',
-                                    isBoolean: true,
-                                    isHidden: true
-                                }
-                            }
-                        },
-
-                        action: function(args) {
-                            var array1 = [];
-                            if (args.$form.find('.form-item[rel=isForced]').css("display") != "none") //uncomment after Brian fix it to include $form in args
-                                array1.push("&cleanup=" + (args.data.isForced == "on"));
-
-                            $.ajax({
-                                url: createURL("deleteDomain&id=" + args.context.domains[0].id + array1.join("")),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var jid = json.deletedomainresponse.jobid;
-                                    var wasDomainDeletedWithSuccess = false;
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + jid),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function(json) {
-                                            wasDomainDeletedWithSuccess = json.queryasyncjobresultresponse.jobresultcode ==  0;
-                                        }
-                                    });
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid
-                                        }
-                                    });
-                                    if(!wasDomainDeletedWithSuccess){
-                                        return;
-                                    }
-
-                                    // Quick fix for proper UI reaction to delete domain
-                                    var $item = $('.name.selected').closest('li');
-                                    var $itemParent = $item.closest('li');
-                                    $itemParent.parent().parent().find('.name:first').click();
-                                    $item.remove();
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    // Edit domain
-                    edit: {
-                        label: 'label.action.edit.domain',
-                        messages: {
-                            notification: function(args) {
-                                return 'label.action.edit.domain';
-                            }
-                        },
-                        action: function(args) {
-                            var domainObj;
-
-                            var data = {
-                                id: args.context.domains[0].id
-                            };
-
-                            if (args.data.name != null) { //args.data.name == undefined means name field is not editable (when log in as normal user or domain admin)
-                                $.extend(data, {
-                                    name: args.data.name
-                                });
-                            }
-
-                            if (args.data.networkdomain != null) { //args.data.networkdomain == undefined means networkdomain field is not editable (when log in as normal user or domain admin)
-                                $.extend(data, {
-                                    networkdomain: args.data.networkdomain
-                                });
-                            }
-
-                            if('name' in data || 'networkdomain' in data)  {
-                                $.ajax({
-                                    url: createURL("updateDomain"),
-                                    async: false,
-                                    data: data,
-                                    success: function(json) {
-                                        domainObj = json.updatedomainresponse.domain;
-                                    }
-                                });
-                            }
-
-                            if (args.data.vmLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=0&max=" + args.data.vmLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["vmLimit"] = args.data.vmLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.ipLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=1&max=" + args.data.ipLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["ipLimit"] = args.data.ipLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.volumeLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=2&max=" + args.data.volumeLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["volumeLimit"] = args.data.volumeLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.snapshotLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=3&max=" + args.data.snapshotLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["snapshotLimit"] = args.data.snapshotLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.templateLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=4&max=" + args.data.templateLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["templateLimit"] = args.data.templateLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.vpcLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=7&max=" + args.data.vpcLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["vpcLimit"] = args.data.vpcLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.cpuLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=8&max=" + args.data.cpuLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["cpuLimit"] = args.data.cpuLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.memoryLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=9&max=" + args.data.memoryLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["memoryLimit"] = args.data.memoryLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.networkLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=6&max=" + args.data.networkLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["networkLimit"] = args.data.networkLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.primaryStorageLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=10&max=" + args.data.primaryStorageLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["primaryStorageLimit"] = args.data.primaryStorageLimit;
-                                    }
-                                });
-                            }
-
-                            if (args.data.secondaryStorageLimit != null) {
-                                $.ajax({
-                                    url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=11&max=" + args.data.secondaryStorageLimit),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        domainObj["secondaryStorageLimit"] = args.data.secondaryStorageLimit;
-                                    }
-                                });
-                            }
-
-                            args.response.success({
-                                data: domainObj
-                            });
-                        }
-                    },
-
-                    // Add domain
-                    create: {
-                        label: 'label.add.domain',
-
-                        action: function(args) {
-                            var data = {
-                                parentdomainid: args.context.domains[0].id,
-                                name: args.data.name
-                            };
-
-                            if (args.data.networkdomain != null && args.data.networkdomain.length > 0) {
-                                $.extend(data, {
-                                    networkdomain: args.data.networkdomain
-                                });
-                            }
-
-                            if (args.data.domainid != null && args.data.domainid.length > 0) {
-                                $.extend(data, {
-                                    domainid: args.data.domainid
-                                });
-                            }
-
-                            $.ajax({
-                                url: createURL('createDomain'),
-                                data: data,
-                                success: function(json) {
-                                    var item = json.createdomainresponse.domain;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                },
-                                error: function(XMLHttpResponse) {
-                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                    args.response.error(errorMsg);
-                                }
-                            });
-                        },
-
-                        messages: {
-                            notification: function(args) {
-                                return 'label.add.domain';
-                            }
-                        },
-
-                        createForm: {
-                            title: 'label.add.domain',
-                            desc: 'message.add.domain',
-                            fields: {
-                                name: {
-                                    label: 'label.name',
-                                    docID: 'helpDomainName',
-                                    validation: {
-                                        required: true
-                                    }
-                                },
-                                networkdomain: {
-                                    label: 'label.network.domain',
-                                    docID: 'helpDomainNetworkDomain',
-                                    validation: {
-                                        required: false
-                                    }
-                                },
-                                domainid: {
-                                    label: 'label.domain.id',
-                                    docID: 'helpDomainId',
-                                    validation: {
-                                        required: false
-                                        }
-                                    }
-                            }
-                        }
-                    },
-
-                    linktoldap: {
-                            label: 'label.link.domain.to.ldap',
-
-                            action: function(args) {
-                                var data = {
-                                    domainid: args.context.domains[0].id,
-                                    type: args.data.type,
-                                    name: args.data.name,
-                                    accounttype: args.data.accounttype
-                                };
-
-                                if (args.data.admin != null && args.data.admin.length > 0) {
-                                    $.extend(data, {
-                                        admin: args.data.admin
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('linkDomainToLdap'),
-                                    data: data,
-                                    success: function(json) {
-                                        var item = json.linkdomaintoldapresponse.LinkDomainToLdap.domainid;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function(XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.link.domain.to.ldap';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.link.domain.to.ldap',
-                                desc: 'message.link.domain.to.ldap',
-                                fields: {
-                                    type: {
-                                        label: 'label.ldap.link.type',
-                                        docID: 'helpLdapGroupType',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                             var items = [];
-                                             items.push({
-                                                 id: "GROUP",
-                                                 description: "GROUP"
-                                             }); //regular-user
-                                             items.push({
-                                                 id: "OU",
-                                                 description: "OU"
-                                             }); //root-admin
-                                             args.response.success({
-                                                 data: items
-                                             });
-                                        }
-                                    },
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpLdapGroupName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    accounttype: {
-                                        label: 'label.account.type',
-                                        docID: 'helpAccountType',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                             var items = [];
-                                             items.push({
-                                                 id: 0,
-                                                 description: "Normal User"
-                                             }); //regular-user
-                                             items.push({
-                                                 id: 2,
-                                                 description: "Domain Admin"
-                                             }); //root-admin
-                                             args.response.success({
-                                                 data: items
-                                             });
-                                        }
-                                    },
-                                    admin: {
-                                        label: 'label.domain.admin',
-                                        docID: 'helpLdapLinkDomainAdmin',
-                                        validation: {
-                                            required: false
-                                        }
-                                    }
-                                }
-                            }
-                    },
-
-                    updateResourceCount: {
-                        label: 'label.action.update.resource.count',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.update.resource.count';
-                            },
-                            notification: function(args) {
-                                return 'label.action.update.resource.count';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("updateResourceCount&domainid=" + args.context.domains[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    //var resourcecounts= json.updateresourcecountresponse.resourcecount;   //do nothing
-                                    args.response.success();
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: function(args) {
-                                args.complete();
-                            }
-                        }
-                    }
-                },
-
-                tabFilter: function(args) {
-                    var hiddenTabs = [];
-                    if(!isAdmin()) {
-                        hiddenTabs.push('settings');
-                    }
-                    return hiddenTabs;
-                },
-
-                tabs: {
-                    details: {
-                        title: 'label.details',
-                        fields: [{
-                            name: {
-                                label: 'label.name',
-                                isEditable: function(args) {
-                                    if (isAdmin() && args.domains[0].level != 0) //ROOT domain (whose level is 0) is not allowed to change domain name
-                                        return true;
-                                    else
-                                        return false;
-                                }
-                            }
-                        }, {
-                            id: {
-                                label: 'label.id'
-                            },
-
-                            path: {
-                                label: 'label.full.path'
-                            },
-
-                            networkdomain: {
-                                label: 'label.network.domain',
-                                isEditable: function(args) {
-                                    if (isAdmin())
-                                        return true;
-                                    else
-                                        return false;
-                                }
-                            },
-                            vmLimit: {
-                                label: 'label.instance.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            ipLimit: {
-                                label: 'label.ip.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            volumeLimit: {
-                                label: 'label.volume.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            snapshotLimit: {
-                                label: 'label.snapshot.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            templateLimit: {
-                                label: 'label.template.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            vpcLimit: {
-                                label: 'label.VPC.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            cpuLimit: {
-                                label: 'label.cpu.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            memoryLimit: {
-                                label: 'label.memory.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            networkLimit: {
-                                label: 'label.network.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            primaryStorageLimit: {
-                                label: 'label.primary.storage.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            secondaryStorageLimit: {
-                                label: 'label.secondary.storage.limits',
-                                isEditable: function(args) {
-                                    if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as
-                                        return false;
-                                    else
-                                        return true;
-                                }
-                            },
-                            accountTotal: {
-                                label: 'label.accounts'
-                            },
-                            vmTotal: {
-                                label: 'label.instances'
-                            },
-                            volumeTotal: {
-                                label: 'label.volumes'
-                            }
-                        }],
-                        dataProvider: function(args) {
-                            var domainObj = args.context.domains[0];
-                            var totalVMs = 0;
-                            var totalVolumes = 0;
-
-                            $.ajax({
-                                url: createURL("listAccounts&domainid=" + domainObj.id),
-                                async: false,
-                                data: {},
-                                success: function(json) {
-                                    var items = json.listaccountsresponse.account;
-                                    if (items != null) {
-                                        domainObj["accountTotal"] = items.length;
-                                        for (var i = 0; i < items.length; i++) {
-                                            totalVMs += items[i].vmtotal;
-                                            totalVolumes += items[i].volumetotal;
-                                        }
-                                    } else {
-                                        domainObj["accountTotal"] = 0;
-                                    }
-                                }
-                            });
-
-                            $.ajax({
-                                url: createURL("listProjects&domainid=" + domainObj.id),
-                                async: false,
-                                data: {},
-                                success: function(json) {
-                                    var items = json.listprojectsresponse.project;
-                                    if (items != null) {
-                                        for (var i = 0; i < items.length; i++) {
-                                            totalVMs += items[i].vmtotal;
-                                            totalVolumes += items[i].volumetotal;
-                                        }
-                                    }
-                                }
-                            });
-
-                            domainObj["vmTotal"] = totalVMs;
-                            domainObj["volumeTotal"] = totalVolumes;
-
-                            $.ajax({
-                                url: createURL("listResourceLimits&domainid=" + domainObj.id),
-                                async: false,
-                                dataType: "json",
-                                success: function(json) {
-                                    var limits = json.listresourcelimitsresponse.resourcelimit;
-                                    if (limits != null) {
-                                        for (var i = 0; i < limits.length; i++) {
-                                            var limit = limits[i];
-                                            switch (limit.resourcetype) {
-                                                case "0":
-                                                    domainObj["vmLimit"] = limit.max;
-                                                    break;
-                                                case "1":
-                                                    domainObj["ipLimit"] = limit.max;
-                                                    break;
-                                                case "2":
-                                                    domainObj["volumeLimit"] = limit.max;
-                                                    break;
-                                                case "3":
-                                                    domainObj["snapshotLimit"] = limit.max;
-                                                    break;
-                                                case "4":
-                                                    domainObj["templateLimit"] = limit.max;
-                                                    break;
-                                                case "6":
-                                                    domainObj["networkLimit"] = limit.max;
-                                                    break;
-                                                case "7":
-                                                    domainObj["vpcLimit"] = limit.max;
-                                                    break;
-                                                case "8":
-                                                    domainObj["cpuLimit"] = limit.max;
-                                                    break;
-                                                case "9":
-                                                    domainObj["memoryLimit"] = limit.max;
-                                                    break;
-                                                case "10":
-                                                    domainObj["primaryStorageLimit"] = limit.max;
-                                                    break;
-                                                case "11":
-                                                    domainObj["secondaryStorageLimit"] = limit.max;
-                                                    break;
-                                            }
-                                        }
-                                    }
-                                }
-                            });
-
-                            args.response.success({
-                                data: domainObj,
-                                actionFilter: domainActionfilter
-                            });
-                        }
-                    },
-                    // Granular settings for domains
-                    settings: {
-                        title: 'label.settings',
-                        custom: cloudStack.uiCustom.granularSettings({
-                            dataProvider: function(args) {
-                                $.ajax({
-                                    url: createURL('listConfigurations&domainid=' + args.context.domains[0].id),
-                                    data: listViewDataProvider(args, {}, { searchBy: 'name' }),
-                                    success: function(json) {
-                                        args.response.success({
-                                            data: json.listconfigurationsresponse.configuration
-                                        });
-
-                                    },
-
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-
-                                    }
-                                });
-
-                            },
-                            actions: {
-                                edit: function(args) {
-                                    // call updateDomainLevelParameters
-                                    var data = {
-                                        name: args.data.jsonObj.name,
-                                        value: args.data.value
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('updateConfiguration&domainid=' + args.context.domains[0].id),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updateconfigurationresponse.configuration;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-
-                                    });
-
-                                }
-                            }
-                        })
-                    }
-
-                }
-            },
-            labelField: 'name',
-            dataProvider: function(args) {
-                var parentDomain = args.context.parentDomain;
-                if (parentDomain == null) { //draw root node
-                    $.ajax({
-                        url: createURL("listDomains&id=" + g_domainid + '&listAll=true'),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            var domainObjs = json.listdomainsresponse.domain;
-                            if (domainObjs != null && domainObjs.length > 0) {
-                                domainObjs.sort(function(a, b) {
-                                    return a.name.localeCompare(b.name);
-                                });
-                            }
-                            args.response.success({
-                                actionFilter: domainActionfilter,
-                                data: domainObjs
-                            });
-                        }
-                    });
-                } else {
-                    $.ajax({
-                        url: createURL("listDomainChildren&id=" + parentDomain.id),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            var domainObjs = json.listdomainchildrenresponse.domain;
-                            if (domainObjs != null && domainObjs.length > 0) {
-                                domainObjs.sort(function(a, b) {
-                                    return a.name.localeCompare(b.name);
-                                });
-                            }
-                            args.response.success({
-                                actionFilter: domainActionfilter,
-                                data: domainObjs
-                            });
-                        }
-                    });
-                }
-            }
-        }
-    };
-
-    var domainActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        if (isAdmin()) {
-            allowedActions.push("create");
-            allowedActions.push("edit"); //merge updateResourceLimit into edit
-            if (jsonObj.level != 0) { //ROOT domain (whose level is 0) is not allowed to delete
-                allowedActions.push("delete");
-            }
-            if(isLdapEnabled()) {
-                allowedActions.push("linktoldap")
-            }
-        } else if (isDomainAdmin()) {
-            if (args.context.domains[0].id != g_domainid) {
-                allowedActions.push("edit"); //merge updateResourceLimit into edit
-                allowedActions.push("delete");
-            }
-            allowedActions.push("create");
-        }
-        allowedActions.push("updateResourceCount");
-        return allowedActions;
-    }
-
-})(cloudStack);
diff --git a/ui/legacy/scripts/events.js b/ui/legacy/scripts/events.js
deleted file mode 100644
index 948f881..0000000
--- a/ui/legacy/scripts/events.js
+++ /dev/null
@@ -1,804 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-    cloudStack.sections.events = {
-        title: 'label.menu.events',
-        id: 'events',
-        sectionSelect: {
-            preFilter: function(args) {
-                if (isAdmin())
-                    return ["events", "alerts"];
-                else
-                    return ["events"];
-            },
-            label: 'label.select-view'
-        },
-        sections: {
-            events: {
-                type: 'select',
-                title: 'label.menu.events',
-                listView: {
-                    id: 'events',
-                    label: 'label.menu.events',
-                    multiSelect: true,
-                    fields: {
-                        description: {
-                            label: 'label.description'
-                        },
-                        level: {
-                            label: 'label.level'
-                        },
-                        type: {
-                            label: 'label.type',
-                            truncate: true
-                        },
-                        account: {
-                            label: 'label.account'
-                        },
-                        username: {
-                            label: 'label.username'
-                        },
-                        domain: {
-                            label: 'label.domain'
-                        },
-                        created: {
-                            label: 'label.date',
-                            converter: cloudStack.converters.toLocalDate
-                        }
-                    },
-
-                    actions: {
-                        // Remove multiple events
-                        removeMulti: {
-                            label: 'label.delete.events',
-                            isHeader: true,
-                            addRow: false,
-                            isMultiSelectAction: true,
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.confirm.remove.selected.events';
-                                },
-                                notification: function(args) {
-                                    return 'label.delete.events';
-                                }
-                            },
-                            action: function(args) {
-                                var events = args.context.events;
-
-                                $.ajax({
-                                    url: createURL("deleteEvents"),
-                                    data: {
-                                        ids: $(events).map(function(index, event) {
-                                            return event.id;
-                                        }).toArray().join(',')
-                                    },
-                                    success: function(data) {
-                                        args.response.success();
-                                        $(window).trigger('cloudStack.fullRefresh');
-                                    },
-                                    error:function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            }
-                        },
-
-                        remove: {
-                            label: 'label.delete.events',
-                            isHeader: true,
-                            addRow: false,
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.delete.events';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.delete.events',
-                                desc: '',
-                                fields: {
-                                    type: {
-                                        label: 'label.by.event.type',
-                                        docID: 'helpEventsDeleteType'
-                                    },
-                                    startdate: {
-                                        label: 'label.by.date.start',
-                                        docID: 'helpEventsDeleteDate',
-                                        isDatepicker: true
-                                    },
-                                    enddate: {
-                                        label: 'label.by.date.end',
-                                        docID: 'helpEventsDeleteDate',
-                                        isDatepicker: true
-                                    }
-                                }
-                            },
-                            action: function(args) {
-
-                                var data = {};
-
-                                if (args.data.type != "")
-                                    $.extend(data, {
-                                        type: args.data.type
-                                    });
-
-                                if (args.data.startdate != "")
-                                    $.extend(data, {
-                                        startdate: args.data.startdate
-                                    });
-
-                                if (args.data.enddate != "")
-                                    $.extend(data, {
-                                        enddate: args.data.enddate
-                                    });
-
-                                $.ajax({
-                                    url: createURL("deleteEvents"),
-                                    data: data,
-                                    success: function(data) {
-                                        args.response.success();
-                                    },
-                                    error:function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            }
-                        },
-
-                        archive: {
-                            label: 'label.archive.events',
-                            isHeader: true,
-                            addRow: false,
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.archive.events';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.archive.events',
-                                desc: '',
-                                fields: {
-                                    type: {
-                                        label: 'label.by.event.type',
-                                        docID: 'helpEventsArchiveType'
-                                    },
-                                    startdate: {
-                                        label: 'label.by.date.start',
-                                        docID: 'helpEventsArchiveDate',
-                                        isDatepicker: true
-                                    },
-                                    enddate: {
-                                        label: 'label.by.date.end',
-                                        docID: 'helpEventsArchiveDate',
-                                        isDatepicker: true
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var data = {};
-
-                                if (args.data.type != "")
-                                    $.extend(data, {
-                                        type: args.data.type
-                                    });
-
-                                if (args.data.startdate != "")
-                                    $.extend(data, {
-                                        startdate: args.data.startdate
-                                    });
-
-                                if (args.data.enddate != "")
-                                    $.extend(data, {
-                                        enddate: args.data.enddate
-                                    });
-
-                                $.ajax({
-                                    url: createURL("archiveEvents"),
-                                    data: data,
-                                    dataType: 'json',
-                                    async: false,
-
-                                    success: function(data) {
-                                        args.response.success();
-                                    }
-                                });
-
-                            }
-                        },
-
-                        // Archive multiple events
-                        archiveMulti: {
-                            label: 'label.archive.events',
-                            isHeader: true,
-                            addRow: false,
-                            isMultiSelectAction: true,
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.confirm.archive.selected.events';
-                                },
-                                notification: function(args) {
-                                    return 'label.archive.events';
-                                }
-                            },
-                            action: function(args) {
-                                var events = args.context.events;
-
-                                $.ajax({
-                                    url: createURL("archiveEvents"),
-                                    data: {
-                                        ids: $(events).map(function(index, event) {
-                                            return event.id;
-                                        }).toArray().join(',')
-                                    },
-                                    success: function(data) {
-                                        args.response.success();
-                                        $(window).trigger('cloudStack.fullRefresh');
-                                    },
-                                    error:function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            }
-                        }
-
-                    },
-
-
-
-                    advSearchFields: {
-                        level: {
-                            label: 'label.level',
-                            select: function(args) {
-                                args.response.success({
-                                    data: [{
-                                        id: '',
-                                        description: ''
-                                    }, {
-                                        id: 'INFO',
-                                        description: 'label.info.upper'
-                                    }, {
-                                        id: 'WARN',
-                                        description: 'label.warn.upper'
-                                    }, {
-                                        id: 'ERROR',
-                                        description: 'label.error.upper'
-                                    }]
-                                });
-                            }
-                        },
-
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        account: {
-                            label: 'label.account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-                        username: {
-                            label: 'label.username',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        if ("events" in args.context) {
-                            var startId = args.context.events[0].parentid;
-                            if (!startId) {
-                                startId = args.context.events[0].id;
-                            }
-                            data.startid = startId;
-                        }
-
-                        $.ajax({
-                            url: createURL('listEvents'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listeventsresponse.event;
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                cloudStack.dialog.notice({
-                                    message: parseXMLHttpResponse(XMLHttpResponse)
-                                });
-                                args.response.error();
-                             }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.details',
-                        viewAll: {
-                            path: 'events',
-                            label: 'label.event.timeline',
-                        },
-
-                        actions: {
-                            // Remove single event
-                            remove: {
-                                label: 'label.delete',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.event.deleted';
-                                    },
-                                    confirm: function() {
-                                        return 'message.confirm.remove.event';
-                                    }
-                                },
-                                action: function(args) {
-
-                                    $.ajax({
-                                        url: createURL("deleteEvents&ids=" + args.context.events[0].id),
-                                        success: function(json) {
-                                            args.response.success();
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-
-                                    });
-                                }
-                            },
-
-                            // Archive single event
-                            archive: {
-                                label: 'label.archive',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.event.archived';
-                                    },
-                                    confirm: function() {
-                                        return 'message.confirm.archive.event';
-                                    }
-                                },
-                                action: function(args) {
-
-                                    $.ajax({
-                                        url: createURL("archiveEvents&ids=" + args.context.events[0].id),
-                                        success: function(json) {
-                                            args.response.success();
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    description: {
-                                        label: 'label.description'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    level: {
-                                        label: 'label.level'
-                                    },
-                                    type: {
-                                        label: 'label.type'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    username: {
-                                        label: 'label.initiated.by'
-                                    },
-                                    created: {
-                                        label: 'label.date',
-                                        converter: cloudStack.converters.toLocalDate
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listEvents&id=" + args.context.events[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.listeventsresponse.event[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            alerts: {
-                type: 'select',
-                title: 'label.menu.alerts',
-                listView: {
-                    id: 'alerts',
-                    label: 'label.menu.alerts',
-                    multiSelect: true,
-                    fields: {
-                        description: {
-                            label: 'label.description'
-                        },
-                        type: {
-                            label: 'label.type'
-                        },
-                        sent: {
-                            label: 'label.date',
-                            converter: cloudStack.converters.toLocalDate
-                        }
-                    },
-
-                    actions: {
-                        // Remove multiple Alerts
-                        removeMulti: {
-                            label: 'label.delete.alerts',
-                            isHeader: true,
-                            addRow: false,
-                            isMultiSelectAction: true,
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.confirm.remove.selected.alerts';
-                                },
-                                notification: function(args) {
-                                    return 'label.delete.alerts';
-                                }
-                            },
-                            action: function(args) {
-                                var events = args.context.alerts;
-
-                                $.ajax({
-                                    url: createURL("deleteAlerts"),
-                                    data: {
-                                        ids: $(events).map(function(index, event) {
-                                            return event.id;
-                                        }).toArray().join(',')
-                                    },
-                                    success: function(data) {
-                                        args.response.success();
-                                        $(window).trigger('cloudStack.fullRefresh');
-                                    },
-                                    error:function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            }
-                        },
-
-                        remove: {
-                            label: 'label.delete.alerts',
-                            isHeader: true,
-                            addRow: false,
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.delete.alerts';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.delete.alerts',
-                                desc: '',
-                                fields: {
-                                    type: {
-                                        label: 'label.by.alert.type',
-                                        docID: 'helpAlertsDeleteType'
-                                    },
-                                    startdate: {
-                                        label: 'label.by.date.start',
-                                        docID: 'helpAlertsDeleteDate',
-                                        isDatepicker: true
-                                    },
-                                    enddate: {
-                                        label: 'label.by.date.end',
-                                        docID: 'helpAlertsDeleteDate',
-                                        isDatepicker: true
-                                    }
-                                }
-                            },
-                            action: function(args) {
-
-                                var data = {};
-
-                                if (args.data.type != "")
-                                    $.extend(data, {
-                                        type: args.data.type
-                                    });
-
-                                if (args.data.startdate != "")
-                                    $.extend(data, {
-                                        startdate: args.data.startdate
-                                    });
-
-                                if (args.data.enddate != "")
-                                    $.extend(data, {
-                                        enddate: args.data.enddate
-                                    });
-
-                                $.ajax({
-                                    url: createURL("deleteAlerts"),
-                                    data: data,
-                                    dataType: 'json',
-                                    async: false,
-
-                                    success: function(data) {
-                                        args.response.success();
-                                    },
-                                    error:function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            }
-                        },
-
-                        // Archive multiple Alerts
-                        archiveMulti: {
-                            label: 'label.archive.alerts',
-                            isHeader: true,
-                            addRow: false,
-                            isMultiSelectAction: true,
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.confirm.archive.selected.alerts';
-                                },
-                                notification: function(args) {
-                                    return 'label.archive.alerts';
-                                }
-                            },
-                            action: function(args) {
-                                var events = args.context.alerts;
-
-                                $.ajax({
-                                    url: createURL("archiveAlerts"),
-                                    data: {
-                                        ids: $(events).map(function(index, event) {
-                                            return event.id;
-                                        }).toArray().join(',')
-                                    },
-                                    success: function(data) {
-                                        args.response.success();
-                                        $(window).trigger('cloudStack.fullRefresh');
-                                    },
-                                    error:function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            }
-                        },
-
-                        archive: {
-                            label: 'label.archive.alerts',
-                            isHeader: true,
-                            addRow: false,
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.archive.alerts';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.archive.alerts',
-                                desc: '',
-                                fields: {
-                                    type: {
-                                        label: 'label.by.alert.type',
-                                        docID: 'helpAlertsArchiveType'
-                                    },
-                                    startdate: {
-                                        label: 'label.by.date.start',
-                                        docID: 'helpAlertsArchiveDate',
-                                        isDatepicker: true
-                                    },
-                                    enddate: {
-                                        label: 'label.by.date.end',
-                                        docID: 'helpAlertsArchiveDate',
-                                        isDatepicker: true
-                                    }
-
-                                }
-                            },
-                            action: function(args) {
-                                var data = {};
-
-                                if (args.data.type != "")
-                                    $.extend(data, {
-                                        type: args.data.type
-                                    });
-
-                                if (args.data.startdate != "")
-                                    $.extend(data, {
-                                        startdate: args.data.startdate
-                                    });
-
-                                if (args.data.enddate != "")
-                                    $.extend(data, {
-                                        enddate: args.data.enddate
-                                    });
-
-                                $.ajax({
-                                    url: createURL("archiveAlerts"),
-                                    data: data,
-                                    dataType: 'json',
-                                    async: false,
-
-                                    success: function(data) {
-                                        args.response.success();
-                                    }
-                                });
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listAlerts'),
-                            data: data,
-                            async: true,
-                            success: function(json) {
-                                var items = json.listalertsresponse.alert;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.alert.details',
-                        actions: {
-
-                            // Remove single Alert
-                            remove: {
-                                label: 'label.delete',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.alert.deleted';
-                                    },
-                                    confirm: function() {
-                                        return 'message.confirm.delete.alert';
-                                    }
-                                },
-                                action: function(args) {
-
-                                    $.ajax({
-                                        url: createURL("deleteAlerts&ids=" + args.context.alerts[0].id),
-                                        success: function(json) {
-                                            args.response.success();
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-
-                                }
-                            },
-
-                            archive: {
-                                label: 'label.archive',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.alert.archived';
-                                    },
-                                    confirm: function() {
-                                        return 'message.confirm.archive.alert';
-                                    }
-                                },
-                                action: function(args) {
-
-                                    $.ajax({
-                                        url: createURL("archiveAlerts&ids=" + args.context.alerts[0].id),
-                                        success: function(json) {
-                                            args.response.success();
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                }
-                            }
-
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    description: {
-                                        label: 'label.description'
-                                    },
-                                    sent: {
-                                        label: 'label.date',
-                                        converter: cloudStack.converters.toLocalDate
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listAlerts&id=" + args.context.alerts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.listalertsresponse.alert[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-})(cloudStack);
diff --git a/ui/legacy/scripts/globalSettings.js b/ui/legacy/scripts/globalSettings.js
deleted file mode 100644
index 5d34982..0000000
--- a/ui/legacy/scripts/globalSettings.js
+++ /dev/null
@@ -1,464 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function(cloudStack) {
-    cloudStack.sections['global-settings'] = {
-        title: 'label.menu.global.settings',
-        id: 'global-settings',
-        sectionSelect: {
-            label: 'label.select-view'
-        },
-        sections: {
-            globalSettings: {
-                type: 'select',
-                title: 'label.menu.global.settings',
-                listView: {
-                    label: 'label.menu.global.settings',
-                    actions: {
-                        edit: {
-                            label: 'label.change.value',
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.jsonObj.name,
-                                    value: args.data.value
-                                };
-                                $.ajax({
-                                    url: createURL('updateConfiguration'),
-                                    data: data,
-                                    success: function(json) {
-                                        var item = json.updateconfigurationresponse.configuration;
-                                        if (item.category == "Usage" && item.isdynamic == false)
-                                            cloudStack.dialog.notice({
-                                                message: _l('message.restart.mgmt.usage.server')
-                                            });
-                                        else if (item.isdynamic == false)
-                                            cloudStack.dialog.notice({
-                                                message: _l('message.restart.mgmt.server')
-                                            });
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            }
-                        }
-                    },
-                    fields: {
-                        name: {
-                            label: 'label.name',
-                            id: true,
-                            truncate: true
-                        },
-                        description: {
-                            label: 'label.description'
-                        },
-                        value: {
-                            label: 'label.value',
-                            editable: true,
-                            truncate: true
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {
-                            page: args.page,
-                            pagesize: pageSize
-                        };
-
-                        if (args.filterBy.search.value) {
-                            data.name = args.filterBy.search.value;
-                        }
-
-                        $.ajax({
-                            url: createURL('listConfigurations'),
-                            data: data,
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var items = json.listconfigurationsresponse.configuration;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    }
-                }
-            },
-            ldapConfiguration: {
-                type: 'select',
-                title: 'label.ldap.configuration',
-                listView: {
-                    id: 'ldap',
-                    label: 'label.ldap.configuration',
-                    fields: {
-                        hostname: {
-                            label: 'label.host.name'
-                        },
-                        port: {
-                            label: 'label.ldap.port'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-                        $.ajax({
-                            url: createURL('listLdapConfigurations'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.ldapconfigurationresponse.LdapConfiguration;
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.details',
-                        actions: {
-                            remove: {
-                                label: 'label.remove.ldap',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.remove.ldap';
-                                    },
-                                    confirm: function() {
-                                        return 'message.remove.ldap';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteLdapConfiguration&hostname=" + args.context.ldapConfiguration[0].hostname),
-                                        success: function(json) {
-                                            args.response.success();
-                                        }
-                                    });
-                                    $(window).trigger('cloudStack.fullRefresh');
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.ldap.configuration',
-                                fields: [{
-                                    hostname: {
-                                        label: 'label.host.name'
-                                    },
-                                    port: {
-                                        label: 'label.port'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    var items = [];
-                                    $.ajax({
-                                        url: createURL("listLdapConfigurations&hostname=" + args.context.ldapConfiguration[0].hostname),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.ldapconfigurationresponse.LdapConfiguration;
-                                            args.response.success({
-                                                data: item[0]
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.configure.ldap',
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.configure.ldap';
-                                },
-                                notification: function(args) {
-                                    return 'label.configure.ldap';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.configure.ldap',
-                                fields: {
-                                    hostname: {
-                                        label: 'label.host.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    port: {
-                                        label: 'label.port',
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var array = [];
-                                array.push("&hostname=" + encodeURIComponent(args.data.hostname));
-                                array.push("&port=" + encodeURIComponent(args.data.port));
-                                $.ajax({
-                                    url: createURL("addLdapConfiguration" + array.join("")),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function(json) {
-                                        var items = json.ldapconfigurationresponse.LdapAddConfiguration;
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    },
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            }
-                        }
-                    }
-                }
-            },
-            baremetalRct: {
-                type: 'select',
-                title: 'label.baremetal.rack.configuration',
-                listView: {
-                    id: 'baremetalRct',
-                    label: 'label.baremetal.rack.configuration',
-                    fields: {
-                        id: {
-                            label: 'label.id'
-                        },
-                        url: {
-                            label: 'label.url'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL("listBaremetalRct"),
-                            data: data,
-                            success: function(json) {
-                                args.response.success({ data: json.listbaremetalrctresponse.baremetalrct });
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.baremetal.rack.configuration',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.baremetal.rack.configuration';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.add.baremetal.rack.configuration',
-                                fields: {
-                                    url: {
-                                        label: 'label.url',
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                $.ajax({
-                                    url: createURL("addBaremetalRct"),
-                                    data: {
-                                        baremetalrcturl: args.data.url
-                                    },
-                                    success: function(json) {
-                                        var jid = json.addbaremetalrctresponse.jobid
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.baremetalrct;
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: "details",
-                        actions: {
-                            remove: {
-                                label: 'label.delete.baremetal.rack.configuration',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.delete.baremetal.rack.configuration';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.delete.baremetal.rack.configuration';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.baremetalRct[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteBaremetalRct'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.deletebaremetalrctresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    url: {
-                                        label: 'label.url'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    var data = {
-                                        id: args.context.baremetalRct[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL("listBaremetalRct"),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success({ data: json.listbaremetalrctresponse.baremetalrct[0] });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            hypervisorCapabilities: {
-                type: 'select',
-                title: 'label.hypervisor.capabilities',
-                listView: {
-                    id: 'hypervisorCapabilities',
-                    label: 'label.hypervisor.capabilities',
-                    fields: {
-                        hypervisor: {
-                            label: 'label.hypervisor'
-                        },
-                        hypervisorversion: {
-                            label: 'label.hypervisor.version'
-                        },
-                        maxguestslimit: {
-                            label: 'label.max.guest.limit'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listHypervisorCapabilities'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listhypervisorcapabilitiesresponse.hypervisorCapabilities;
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.details',
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.hypervisorCapabilities[0].id,
-                                        maxguestslimit: args.data.maxguestslimit
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('updateHypervisorCapabilities'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updatehypervisorcapabilitiesresponse['null'];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    hypervisor: {
-                                        label: 'label.hypervisor'
-                                    },
-                                    hypervisorversion: {
-                                        label: 'label.hypervisor.version'
-                                    },
-                                    maxguestslimit: {
-                                        label: 'label.max.guest.limit',
-                                        isEditable: true
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    args.response.success({
-                                        data: args.context.hypervisorCapabilities[0]
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-})(cloudStack);
diff --git a/ui/legacy/scripts/installWizard.js b/ui/legacy/scripts/installWizard.js
deleted file mode 100644
index 8ba82dd..0000000
--- a/ui/legacy/scripts/installWizard.js
+++ /dev/null
@@ -1,359 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    cloudStack.installWizard = {
-        // Check if install wizard should be invoked
-        check: function(args) {
-            $.ajax({
-                url: createURL('listZones'),
-                dataType: 'json',
-                async: true,
-                success: function(data) {
-                    args.response.success({
-                        doInstall: !data.listzonesresponse.zone
-                    });
-                }
-            });
-        },
-
-        changeUser: function(args) {
-            $.ajax({
-                url: createURL('updateUser'),
-                data: {
-                    id: cloudStack.context.users[0].userid,
-                    password: args.data.password
-                },
-                type: 'POST',
-                dataType: 'json',
-                async: true,
-                success: function(data) {
-                    args.response.success({
-                        data: {
-                            newUser: data.updateuserresponse.user
-                        }
-                    });
-                }
-            });
-        },
-
-        // Copy text
-        copy: {
-            // Tooltips
-            'tooltip.addZone.name': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addZone.name'
-                });
-            },
-
-            'tooltip.addZone.ip4dns1': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addZone.dns1'
-                });
-            },
-
-            'tooltip.addZone.ip4dns2': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addZone.dns2'
-                });
-            },
-
-            'tooltip.addZone.internaldns1': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addZone.internaldns1'
-                });
-            },
-
-            'tooltip.addZone.internaldns2': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addZone.internaldns2'
-                });
-            },
-
-            'tooltip.configureGuestTraffic.name': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.configureGuestTraffic.name'
-                });
-            },
-
-            'tooltip.configureGuestTraffic.description': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.configureGuestTraffic.description'
-                });
-            },
-
-            'tooltip.configureGuestTraffic.guestGateway': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.configureGuestTraffic.guestGateway'
-                });
-            },
-
-            'tooltip.configureGuestTraffic.guestNetmask': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.configureGuestTraffic.guestNetmask'
-                });
-            },
-
-            'tooltip.configureGuestTraffic.guestStartIp': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.configureGuestTraffic.guestStartIp'
-                });
-            },
-
-            'tooltip.configureGuestTraffic.guestEndIp': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.configureGuestTraffic.guestEndIp'
-                });
-            },
-
-            'tooltip.addPod.name': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPod.name'
-                });
-            },
-
-            'tooltip.addPod.reservedSystemGateway': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPod.reservedSystemGateway'
-                });
-            },
-
-            'tooltip.addPod.reservedSystemNetmask': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPod.reservedSystemNetmask'
-                });
-            },
-
-            'tooltip.addPod.reservedSystemStartIp': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPod.reservedSystemStartIp'
-                });
-            },
-
-            'tooltip.addPod.reservedSystemEndIp': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPod.reservedSystemEndIp'
-                });
-            },
-
-            'tooltip.addCluster.name': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addCluster.name'
-                });
-            },
-
-            'tooltip.addHost.hostname': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addHost.hostname'
-                });
-            },
-
-            'tooltip.addHost.username': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addHost.username'
-                });
-            },
-
-            'tooltip.addHost.password': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addHost.password'
-                });
-            },
-
-            'tooltip.addPrimaryStorage.name': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPrimaryStorage.name'
-                });
-            },
-
-            'tooltip.addPrimaryStorage.server': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPrimaryStorage.server'
-                });
-            },
-
-            'tooltip.addPrimaryStorage.path': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addPrimaryStorage.path'
-                });
-            },
-
-            'tooltip.addSecondaryStorage.nfsServer': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addSecondaryStorage.nfsServer'
-                });
-            },
-
-            'tooltip.addSecondaryStorage.path': function(args) {
-                args.response.success({
-                    text: 'message.installWizard.tooltip.addSecondaryStorage.path'
-                });
-            },
-
-            // Intro text
-            whatIsCloudStack: function(args) {
-                args.response.success({
-                    text: 'message.installWizard.copy.whatIsCloudStack'
-                });
-            },
-
-            whatIsAZone: function(args) {
-                args.response.success({
-                    text: 'message.installWizard.copy.whatIsAZone'
-                });
-            },
-
-            whatIsAPod: function(args) {
-                args.response.success({
-                    text: 'message.installWizard.copy.whatIsAPod'
-                });
-            },
-
-            whatIsACluster: function(args) {
-                args.response.success({
-                    text: 'message.installWizard.copy.whatIsACluster'
-                });
-            },
-
-            whatIsAHost: function(args) {
-                args.response.success({
-                    text: 'message.installWizard.copy.whatIsAHost'
-                });
-            },
-
-            whatIsPrimaryStorage: function(args) {
-                args.response.success({
-                    text: 'message.installWizard.copy.whatIsPrimaryStorage'
-                });
-            },
-
-            whatIsSecondaryStorage: function(args) {
-                args.response.success({
-                    text: 'message.installWizard.copy.whatIsSecondaryStorage'
-                });
-            }
-        },
-
-        action: function(args) {
-            var success = args.response.success;
-            var message = args.response.message;
-
-            // Get default network offering
-            var selectedNetworkOffering;
-            $.ajax({
-                url: createURL("listNetworkOfferings&state=Enabled&guestiptype=Shared"),
-                dataType: "json",
-                async: false,
-                success: function(json) {
-                    selectedNetworkOffering = $.grep(
-                        json.listnetworkofferingsresponse.networkoffering,
-                        function(networkOffering) {
-                            var services = $.map(networkOffering.service, function(service) {
-                                return service.name;
-                            });
-
-                            //pick the network offering including SecurityGroup, but excluding Lb and StaticNat. (bug 13665)
-                            return (($.inArray('SecurityGroup', services) != -1) && ($.inArray('Lb', services) == -1) && ($.inArray('StaticNat', services) == -1));
-                        }
-                    )[0];
-                }
-            });
-
-            cloudStack.zoneWizard.action($.extend(true, {}, args, {
-                // Plug in hard-coded values specific to quick install
-                data: {
-                    zone: {
-                        networkType: 'Basic',
-                        networkOfferingId: selectedNetworkOffering.id
-                    },
-                    pluginFrom: {
-                        name: 'installWizard',
-                        selectedNetworkOffering: selectedNetworkOffering,
-                        selectedNetworkOfferingHavingSG: true
-                    }
-                },
-                response: {
-                    success: function(args) {
-                        var enableZone = function() {
-                            message(_l('message.enabling.zone.dots'));
-                            cloudStack.zoneWizard.enableZoneAction({
-                                data: args.data,
-                                formData: args.data,
-                                launchData: args.data,
-                                response: {
-                                    success: function(args) {
-                                        pollSystemVMs();
-                                    }
-                                }
-                            });
-                        };
-
-                        var pollSystemVMs = function() {
-                            // Poll System VMs, then enable zone
-                            message(_l('message.creating.systemVM'));
-                            var poll = setInterval(function() {
-                                $.ajax({
-                                    url: createURL('listSystemVms'),
-                                    success: function(data) {
-                                        var systemVMs = data.listsystemvmsresponse.systemvm;
-
-                                        if (systemVMs && systemVMs.length > 1) {
-                                            if (systemVMs.length == $.grep(systemVMs, function(vm) {
-                                                return vm.state == 'Running';
-                                            }).length) {
-                                                clearInterval(poll);
-                                                message('message.systems.vms.ready');
-                                                setTimeout(pollBuiltinTemplates, 500);
-                                            }
-                                        }
-                                    }
-                                });
-                            }, 5000);
-                        };
-
-                        // Wait for builtin template to be present -- otherwise VMs cannot launch
-                        var pollBuiltinTemplates = function() {
-                            message('message.waiting.for.builtin.templates.to.load');
-                            var poll = setInterval(function() {
-                                $.ajax({
-                                    url: createURL('listTemplates'),
-                                    data: {
-                                        templatefilter: 'all'
-                                    },
-                                    success: function(data) {
-                                        var templates = data.listtemplatesresponse.template ?
-                                            data.listtemplatesresponse.template : [];
-                                        var builtinTemplates = $.grep(templates, function(template) {
-                                            return template.templatetype == 'BUILTIN';
-                                        });
-
-                                        if (builtinTemplates.length) {
-                                            clearInterval(poll);
-                                            message('message.your.cloudstack.is.ready');
-                                            setTimeout(success, 1000);
-                                        }
-                                    }
-                                });
-                            }, 5000);
-                        };
-
-                        enableZone();
-                    }
-                }
-            }));
-        }
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/instanceWizard.js b/ui/legacy/scripts/instanceWizard.js
deleted file mode 100644
index 466db99..0000000
--- a/ui/legacy/scripts/instanceWizard.js
+++ /dev/null
@@ -1,1463 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    var zoneObjs, hypervisorObjs, featuredTemplateObjs, communityTemplateObjs, myTemplateObjs, sharedTemplateObjs, featuredIsoObjs, communityIsoObjs, myIsoObjs, sharedIsoObjs, serviceOfferingObjs, community, networkObjs, ovfProps;
-    var selectedZoneObj, selectedTemplateObj, selectedHypervisor, selectedDiskOfferingObj;
-    var selectedTemplateOrIso; //'select-template', 'select-iso'
-    var step6ContainerType = 'nothing-to-select'; //'nothing-to-select', 'select-network', 'select-security-group', 'select-advanced-sg'(advanced sg-enabled zone)
-
-    cloudStack.instanceWizard = {
-
-        fetchPodList: function (podcallback, parentId) {
-            var urlString = "listPods";
-            if (parentId != -1) {
-                urlString += "&zoneid=" + parentId
-            }
-            $.ajax({
-                url: createURL(urlString),
-                dataType: "json",
-                async: false,
-                success: function (json) {
-                    var pods = [{
-                        id: -1,
-                        description: 'Default',
-                        parentId: -1
-                    }];
-                    var podsObjs = json.listpodsresponse.pod;
-                    if (podsObjs !== undefined) {
-                        $(podsObjs).each(function () {
-                            pods.push({
-                                id: this.id,
-                                description: this.name,
-                                parentId: this.zoneid
-                            });
-                        });
-                    }
-                    podcallback(pods);
-                }
-            });
-        },
-
-        fetchClusterList: function (clustercallback, parentId, zoneId) {
-            var urlString = "listClusters";
-            // If Pod ID is not specified, filter clusters by Zone
-            if (parentId != -1) {
-                urlString += "&podid=" + parentId;
-            } else if (zoneId != -1) {
-                urlString += "&zoneid=" + zoneId;
-            }
-
-            $.ajax({
-                url: createURL(urlString),
-                dataType: "json",
-                async: false,
-                success: function (json) {
-                    var clusters = [{
-                        id: -1,
-                        description: 'Default',
-                        parentId: -1
-                    }];
-                    var clusterObjs = json.listclustersresponse.cluster;
-                    if (clusterObjs != undefined) {
-                        $(clusterObjs).each(function () {
-                            clusters.push({
-                                id: this.id,
-                                description: this.name,
-                                parentId: this.podid
-                            });
-                        });
-                    }
-                    clustercallback(clusters);
-                }
-            });
-        },
-
-        fetchHostList: function (hostcallback, parentId, podId, zoneId) {
-            // If Cluster ID is not specified, filter hosts by Zone or Pod
-            var urlString = "listHosts&state=Up&type=Routing";
-
-            if (parentId != -1) {
-                urlString += "&clusterid=" + parentId;
-            } else if (podId != -1) {
-                urlString += "&podid=" + podId;
-            } else if (zoneId != -1) {
-                urlString += "&zoneid=" + zoneId
-            }
-
-            $.ajax({
-                url: createURL(urlString),
-                dataType: "json",
-                async: false,
-                success: function (json) {
-                    var hosts = [{
-                        id: -1,
-                        description: 'Default',
-                        parentId: -1
-                    }];
-                    var hostObjs = json.listhostsresponse.host;
-                    if (hostObjs != undefined) {
-                        $(hostObjs).each(function () {
-                            hosts.push({
-                                id: this.id,
-                                description: this.name,
-                                parentId: this.clusterid
-                            });
-                        });
-                    }
-                    hostcallback(hosts);
-                }
-            });
-        },
-
-        //min disk offering  size when custom disk size is used
-        minDiskOfferingSize: function() {
-            return g_capabilities.customdiskofferingminsize;
-        },
-
-        //max disk offering size when custom disk size is used
-        maxDiskOfferingSize: function() {
-            return g_capabilities.customdiskofferingmaxsize;
-        },
-
-        // Determines whether 'add new network' box is shown.
-        // -- return true to show, false to hide
-        showAddNetwork: function(args) {
-            return true;
-        },
-
-        // Called in networks list, when VPC drop-down is changed
-        // -- if vpcID given, return true if in network specified by vpcID
-        // -- if vpcID == -1, always show all networks
-        vpcFilter: function(data, vpcID) {
-            return vpcID != -1 ?
-                data.vpcid == vpcID : true;
-        },
-
-        // Runs when advanced SG-enabled zone is run, before
-        // the security group step
-        //
-        // -- if it returns false, then 'Select Security Group' is skipped.
-        //
-        advSGFilter: function(args) {
-            var selectedNetworks;
-
-            if ($.isArray(args.data['my-networks'])) {
-                selectedNetworks = $(args.data['my-networks']).map(function(index, myNetwork) {
-                    return $.grep(networkObjs, function(networkObj) {
-                        return networkObj.id == myNetwork;
-                    });
-                });
-            } else {
-                selectedNetworks = $.grep(networkObjs, function(networkObj) {
-                    return networkObj.id == args.data['my-networks'];
-                });
-            }
-
-            var total = $.grep(selectedNetworks, function(network) {
-                return $.grep(network.service, function(service) {
-                    return service.name == 'SecurityGroup';
-                }).length;
-            }).length; //return total number of selected sg networks
-
-            if (total > 0 && selectedHypervisor == "KVM") {
-                return -1; // vm with multiple IPs is supported in KVM
-            }
-            return total;
-        },
-
-        // Data providers for each wizard step
-        steps: [
-            // Step 1: Setup
-            function(args) {
-                //from VPC Tier chart -- when the tier (network) has strechedl2subnet==false:
-                //only own zone is populated to the dropdown
-                if (args.initArgs.pluginForm != null && args.initArgs.pluginForm.name == "vpcTierInstanceWizard"
-                    && args.context.networks[0].strechedl2subnet) {
-                        zoneObjs = [{
-                            id: args.context.vpc[0].zoneid,
-                            name: args.context.vpc[0].zonename,
-                            networktype: 'Advanced'
-                        }];
-                        args.response.success({
-                            data: {
-                                zones: zoneObjs
-                            }
-                        });
-                }
-                //in all other cases (as well as from instance page) all zones are populated to dropdown
-                else {
-                    var postData = {};
-                    var zones = [{
-                        id: -1,
-                        name: 'Default'
-                    }];
-                    $.ajax({
-                        url: createURL("listZones&available=true"),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            zoneObjs = json.listzonesresponse.zone;
-                            $(zoneObjs).each(function() {
-                                zones.push({
-                                    id: this.id,
-                                    name: this.name
-                                });
-                            });
-                        }
-                    });
-
-                    $.extend(postData, {
-                        "zones": zones
-                    });
-
-                    if (isAdmin()) {                       
-                        pods = [{
-                            id: -1,
-                            description: 'Default',
-                            parentId: -1
-                        }];
-                        $.ajax({
-                            url: createURL("listPods"),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                if (json.listpodsresponse.pod != undefined) {
-                                    podObjs = json.listpodsresponse.pod;
-                                    $(podObjs).each(function() {
-                                        pods.push({
-                                            id: this.id,
-                                            description: this.name,
-                                            parentId: this.zoneid
-                                        });
-                                    });
-                                }
-                            }
-                        });
-                        clusters = [{
-                            id: -1,
-                            description: 'Default',
-                            parentId: -1
-                        }];
-                        $.ajax({
-                            url: createURL("listClusters"),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                  if (json.listclustersresponse.cluster != undefined) {
-                                      clusterObjs = json.listclustersresponse.cluster;
-                                      $(clusterObjs).each(function() {
-                                          clusters.push({
-                                              id: this.id,
-                                              description: this.name,
-                                              parentId: this.podid
-                                          });
-                                      });
-                                  }
-                            }
-                        });
-                        hosts = [{
-                            id: -1,
-                            description: 'Default',
-                            parentId: -1
-                        }];
-                        $.ajax({
-                            url: createURL("listHosts&state=Up&type=Routing"),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                  if (json.listhostsresponse.host != undefined) {
-                                      hostObjs = json.listhostsresponse.host;
-                                      $(hostObjs).each(function() {
-                                          hosts.push({
-                                              id: this.id,
-                                              description: this.name,
-                                              parentId: this.clusterid
-                                          });
-                                      });
-                                  }
-                            }
-                        });
-                        $.extend(postData, {
-                            "pods": pods,
-                            "clusters": clusters,
-                            "hosts": hosts
-                        });
-
-                    } 
-                    args.response.success({
-                        data: postData
-                    });
-                }
-            },
-
-            // Step 2: Select template
-            function(args) {
-                $(zoneObjs).each(function() {
-                    args.currentData.zoneid = (args.currentData.zoneid == -1)? this.id : args.currentData.zoneid ;
-                    if (this.id == args.currentData.zoneid) {
-                        selectedZoneObj = this;
-                        return false; //break the $.each() loop
-                    }
-                });
-                if (selectedZoneObj == null) {
-                    alert("error: can't find matched zone object");
-                    return;
-                }
-
-                $.ajax({
-                    url: createURL("listHypervisors&zoneid=" + args.currentData.zoneid),
-                    dataType: "json",
-                    async: false,
-                    success: function(json) {
-                        hypervisorObjs = json.listhypervisorsresponse.hypervisor;
-                    }
-                });
-
-                //***** get templates/ISOs (begin) *****
-                selectedTemplateOrIso = args.currentData['select-template'];
-                if (selectedTemplateOrIso == 'select-template') {
-                    var hypervisorArray = [];
-                    $(hypervisorObjs).each(function(index, item) {
-                        hypervisorArray.push(item.name);
-                    });
-
-                    $.ajax({
-                        url: createURL("listTemplates&templatefilter=featured&zoneid=" + args.currentData.zoneid),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listtemplatesresponse.template == null) {
-                                featuredTemplateObjs = null;
-                            } else {
-                                featuredTemplateObjs = $.grep(json.listtemplatesresponse.template, function(item, index) {
-                                    if ($.inArray(item.hypervisor, hypervisorArray) > -1)
-                                        return true;
-                                });
-                            }
-                        }
-                    });
-                    $.ajax({
-                        url: createURL("listTemplates&templatefilter=community&zoneid=" + args.currentData.zoneid),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listtemplatesresponse.template == null) {
-                                communityTemplateObjs = null;
-                            } else {
-                                communityTemplateObjs = $.grep(json.listtemplatesresponse.template, function(item, index) {
-                                    if ($.inArray(item.hypervisor, hypervisorArray) > -1)
-                                        return true;
-                                });
-                            }
-                        }
-                    });
-                    $.ajax({
-                        url: createURL("listTemplates&templatefilter=selfexecutable&zoneid=" + args.currentData.zoneid),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listtemplatesresponse.template == null) {
-                                myTemplateObjs = null;
-                            } else {
-                                myTemplateObjs = $.grep(json.listtemplatesresponse.template, function(item, index) {
-                                    if ($.inArray(item.hypervisor, hypervisorArray) > -1)
-                                        return true;
-                                });
-                            }
-                        }
-                    });
-                    $.ajax({
-                        url: createURL("listTemplates&templatefilter=sharedexecutable&zoneid=" + args.currentData.zoneid),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listtemplatesresponse.template == null) {
-                                sharedTemplateObjs = null;
-                            } else {
-                                sharedTemplateObjs = $.grep(json.listtemplatesresponse.template, function(item, index) {
-                                    if ($.inArray(item.hypervisor, hypervisorArray) > -1)
-                                        return true;
-                                });
-                            }
-                        }
-                    });
-                } else if (selectedTemplateOrIso == 'select-iso') {
-                    $.ajax({
-                        url: createURL("listIsos&isofilter=featured&zoneid=" + args.currentData.zoneid + "&bootable=true"),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listisosresponse.iso == null) {
-                                featuredIsoObjs = null;
-                            } else {
-                                featuredIsoObjs = json.listisosresponse.iso;
-                            }
-                        }
-                    });
-                    $.ajax({
-                        url: createURL("listIsos&isofilter=community&zoneid=" + args.currentData.zoneid + "&bootable=true"),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listisosresponse.iso == null) {
-                                communityIsoObjs = null;
-                            } else {
-                                communityIsoObjs = json.listisosresponse.iso;
-                            }
-                        }
-                    });
-                    $.ajax({
-                        url: createURL("listIsos&isofilter=selfexecutable&zoneid=" + args.currentData.zoneid + "&bootable=true"),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listisosresponse.iso == null) {
-                                myIsoObjs = null;
-                            } else {
-                                myIsoObjs = json.listisosresponse.iso;
-                            }
-                        }
-                    });
-                    $.ajax({
-                        url: createURL("listIsos&isofilter=sharedexecutable&zoneid=" + args.currentData.zoneid + "&bootable=true"),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (json.listisosresponse.iso == null) {
-                                sharedIsoObjs = null;
-                            } else {
-                                sharedIsoObjs = json.listisosresponse.iso;
-                            }
-                        }
-                    });
-                }
-                //***** get templates/ISOs (end) *****
-
-
-                var templatesObj = {};
-                if (selectedTemplateOrIso == 'select-template') {
-                    templatesObj = {
-                        featuredtemplates: featuredTemplateObjs,
-                        communitytemplates: communityTemplateObjs,
-                        mytemplates: myTemplateObjs,
-                        sharedtemplates: sharedTemplateObjs
-                    };
-                } else if (selectedTemplateOrIso == 'select-iso') {
-                    templatesObj = {
-                        featuredisos: featuredIsoObjs,
-                        communityisos: communityIsoObjs,
-                        myisos: myIsoObjs,
-                        sharedisos: sharedIsoObjs
-                    };
-                }
-                args.response.success({
-                    hypervisor: {
-                        idField: 'name',
-                        nameField: 'name'
-                    },
-                    data: {
-                        templates: templatesObj,
-                        hypervisors: hypervisorObjs
-                    },
-                    customHidden: function(args) {
-                        if (selectedTemplateOrIso == 'select-template') {
-                            return false; //show Root Disk Size field
-                        } else { //selectedTemplateOrIso == 'select-iso'
-                            return true;  //hide Root Disk Size field
-                        }
-                    }
-                });
-            },
-
-            // Step 3: Service offering
-            function(args) {
-                selectedTemplateObj = null; //reset
-                if (args.currentData["select-template"] == "select-template") {
-                    if (featuredTemplateObjs != null && featuredTemplateObjs.length > 0) {
-                        for (var i = 0; i < featuredTemplateObjs.length; i++) {
-                            if (featuredTemplateObjs[i].id == args.currentData.templateid) {
-                                selectedTemplateObj = featuredTemplateObjs[i];
-                                break;
-                            }
-                        }
-                    }
-                    if (selectedTemplateObj == null) {
-                        if (communityTemplateObjs != null && communityTemplateObjs.length > 0) {
-                            for (var i = 0; i < communityTemplateObjs.length; i++) {
-                                if (communityTemplateObjs[i].id == args.currentData.templateid) {
-                                    selectedTemplateObj = communityTemplateObjs[i];
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                    if (selectedTemplateObj == null) {
-                        if (myTemplateObjs != null && myTemplateObjs.length > 0) {
-                            for (var i = 0; i < myTemplateObjs.length; i++) {
-                                if (myTemplateObjs[i].id == args.currentData.templateid) {
-                                    selectedTemplateObj = myTemplateObjs[i];
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                    if (selectedTemplateObj == null) {
-                        if (sharedTemplateObjs != null && sharedTemplateObjs.length > 0) {
-                            for (var i = 0; i < sharedTemplateObjs.length; i++) {
-                                if (sharedTemplateObjs[i].id == args.currentData.templateid) {
-                                    selectedTemplateObj = sharedTemplateObjs[i];
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                    if (selectedTemplateObj == null) {
-                        alert("unable to find matched template object");
-                    } else {
-                        selectedHypervisor = selectedTemplateObj.hypervisor;
-                    }
-                } else { //(args.currentData["select-template"] == "select-iso"
-                    selectedHypervisor = args.currentData.hypervisorid;
-                }
-
-                // if the user is leveraging a template, then we can show custom IOPS, if applicable
-                var canShowCustomIopsForServiceOffering = (args.currentData["select-template"] != "select-iso" ? true : false);
-
-                // get serviceOfferingObjs
-                var zoneid = args.currentData["zoneid"];
-                $(window).removeData("cloudStack.module.instanceWizard.serviceOfferingObjs");
-                $(window).trigger("cloudStack.module.instanceWizard.serviceOffering.dataProvider", {
-                    context: args.context,
-                    currentData: args.currentData
-                });
-                if ($(window).data("cloudStack.module.instanceWizard.serviceOfferingObjs") == undefined) {
-                    $.ajax({
-                        url: createURL("listServiceOfferings&issystem=false"),
-                        dataType: "json",
-                        async: false,
-                        data: {
-                            zoneid: zoneid
-                        },
-                        success: function(json) {
-                            serviceOfferingObjs = json.listserviceofferingsresponse.serviceoffering;
-                        }
-                    });
-                } else {
-                    serviceOfferingObjs = $(window).data("cloudStack.module.instanceWizard.serviceOfferingObjs");
-                }
-
-
-                args.response.success({
-                    canShowCustomIops: canShowCustomIopsForServiceOffering,
-                    customFlag: 'iscustomized',
-                    //customFlag: 'offerha', //for testing only
-                    customIopsFlag: 'iscustomizediops',
-                    data: {
-                        serviceOfferings: serviceOfferingObjs
-                    }
-                });
-            },
-
-            // Step 4: Data disk offering
-            function(args) {
-                var isRequired = (args.currentData["select-template"] == "select-iso" ? true : false);
-                var zoneid = args.currentData["zoneid"];
-                var templateFilter = 'executable'
-                if (isAdmin()) {
-                    templateFilter = 'all'
-                }
-                $.ajax({
-                    url: createURL("listDiskOfferings"),
-                    dataType: "json",
-                    data: {
-                        zoneid: zoneid
-                    },
-                    async: true,
-                    success: function(json) {
-                        diskOfferingObjs = json.listdiskofferingsresponse.diskoffering;
-                        var multiDisks = false;
-                        if (!isRequired) {
-                            $.ajax({
-                                url: createURL("listTemplates"),
-                                data: {
-                                    id: args.currentData.templateid,
-                                    templatefilter: templateFilter
-                                },
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var templateDataDisks = json.listtemplatesresponse.template[0].childtemplates;
-                                    var count = 0;                                    if (templateDataDisks && Object.keys(templateDataDisks).length > 0) {
-                                        multiDisks = [];
-                                        $.each(templateDataDisks, function(index, item) {
-                                            count = count + 1;
-                                            multiDisks.push({
-                                                id: item.id,
-                                                label: item.name,
-                                                size: item.size,
-                                            });
-                                        });
-                                        if (count == 0){
-                                            multiDisks.push({
-                                                id: "none",
-                                                label: "No datadisk found",
-                                                size: "0"
-                                            });
-                                        }
-                                    }
-                                }
-                            });
-                        }
-
-                        args.response.success({
-                            required: isRequired,
-                            customFlag: 'iscustomized', // Field determines if custom slider is shown
-                            customIopsDoFlag: 'iscustomizediops',
-                            data: {
-                                diskOfferings: diskOfferingObjs
-                            },
-                            multiDisk: multiDisks
-                        });
-                    }
-                });
-            },
-
-            // Step 5: Affinity
-            function(args) {
-                $.ajax({
-                    url: createURL('listAffinityGroups'),
-                    success: function(json) {
-                        var affinitygroups = json.listaffinitygroupsresponse.affinitygroup;
-                        var data = {
-                            affinityGroups: affinitygroups
-                        };
-
-                        if(selectedZoneObj.domainid != null && selectedZoneObj.affinitygroupid != null) {
-                            var defaultAffinityGroup;
-                            if(affinitygroups != null) {
-                                for(var i = 0; i < affinitygroups.length; i++) {
-                                    if(affinitygroups[i].id == selectedZoneObj.affinitygroupid) {
-                                        defaultAffinityGroup = affinitygroups[i];
-                                        break;
-                                    }
-                                }
-                            }
-                            $.extend(data, {
-                                selectedObj: defaultAffinityGroup,
-                                selectedObjNonEditable: true
-                            });
-                        }
-
-                        args.response.success({
-                            data: data
-                        });
-                    }
-                });
-            },
-
-            // Step 6: Network
-            function(args) {
-                if (diskOfferingObjs != null && diskOfferingObjs.length > 0) {
-                    for (var i = 0; i < diskOfferingObjs.length; i++) {
-                        if (diskOfferingObjs[i].id == args.currentData.diskofferingid) {
-                            selectedDiskOfferingObj = diskOfferingObjs[i];
-                            break;
-                        }
-                    }
-                }
-
-                if (selectedZoneObj.networktype == "Advanced") { //Advanced zone. Show network list.
-                    var $networkStep = $(".step.network:visible .nothing-to-select");
-                    var $networkStepContainer = $('.step.network:visible');
-
-                    if (args.initArgs.pluginForm != null && args.initArgs.pluginForm.name == "vpcTierInstanceWizard") { //from VPC Tier chart
-                        step6ContainerType = 'nothing-to-select';
-                        $networkStep.find("#from_instance_page_1").hide();
-                        $networkStep.find("#from_instance_page_2").hide();
-                        $networkStep.find("#from_vpc_tier").prepend("tier " + _s(args.context.networks[0].name));
-                        $networkStep.find("#from_vpc_tier").show();
-                    } else { //from Instance page
-                        if (selectedZoneObj.securitygroupsenabled != true) { // Advanced SG-disabled zone
-                            step6ContainerType = 'select-network';
-                            $networkStep.find("#from_instance_page_1").show();
-                            $networkStep.find("#from_instance_page_2").show();
-                            $networkStep.find("#from_vpc_tier").text("");
-                            $networkStep.find("#from_vpc_tier").hide();
-                            $networkStepContainer.removeClass('next-use-security-groups');
-                        } else { // Advanced SG-enabled zone
-                            step6ContainerType = 'select-advanced-sg';
-                        }
-
-                        if ($networkStepContainer.hasClass('next-use-security-groups')) {
-                            $networkStepContainer.removeClass('repeat next-use-security-groups loaded');
-                            step6ContainerType = 'select-security-group';
-                        }
-                    }
-                } else { //Basic zone. Show securigy group list or nothing(when no SecurityGroup service in guest network)
-                    var includingSecurityGroupService = false;
-                    $.ajax({
-                        url: createURL("listNetworks&trafficType=Guest&zoneId=" + selectedZoneObj.id),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            //basic zone should have only one guest network returned in this API call
-                            var items = json.listnetworksresponse.network;
-                            if (items != null && items.length > 0) {
-                                var networkObj = items[0]; //basic zone has only one guest network
-                                var serviceObjArray = networkObj.service;
-                                for (var k = 0; k < serviceObjArray.length; k++) {
-                                    if (serviceObjArray[k].name == "SecurityGroup") {
-                                        includingSecurityGroupService = true;
-                                        break;
-                                    }
-                                }
-                            }
-                        }
-                    });
-
-                    if (includingSecurityGroupService == false || selectedHypervisor == "VMware") {
-                        step6ContainerType = 'nothing-to-select';
-                    } else {
-                        step6ContainerType = 'select-security-group';
-                    }
-                }
-
-                //step6ContainerType = 'nothing-to-select'; //for testing only, comment it out before checking in
-                if (step6ContainerType == 'select-network' || step6ContainerType == 'select-advanced-sg') {
-                    var defaultNetworkArray = [],
-                        optionalNetworkArray = [];
-                    var networkData = {
-                        zoneId: selectedZoneObj.id,
-                        canusefordeploy: true
-                    };
-
-                    if (selectedZoneObj.networktype == 'Advanced' && selectedZoneObj.securitygroupsenabled == true) {
-                        $.extend(networkData, {
-                            type: 'Shared'
-                        });
-                    }
-
-                    if (!(cloudStack.context.projects && cloudStack.context.projects[0])) {
-                        networkData.domainid = g_domainid;
-                        networkData.account = g_account;
-                    }
-
-                    var vpcObjs;
-
-                    //listVPCs without account/domainid/listAll parameter will return only VPCs belonging to the current login. That's what should happen in Instances page's VM Wizard.
-                    //i.e. If the current login is root-admin, do not show VPCs belonging to regular-user/domain-admin in Instances page's VM Wizard.
-                    $.ajax({
-                        url: createURL('listVPCs'),
-                        async: false,
-                        success: function(json) {
-                            vpcObjs = json.listvpcsresponse.vpc ? json.listvpcsresponse.vpc : [];
-                        }
-                    });
-
-                    var networkObjsToPopulate = [];
-                    $.ajax({
-                        url: createURL('listNetworks'),
-                        data: networkData,
-                        async: false,
-                        success: function(json) {
-                            networkObjs = json.listnetworksresponse.network ? json.listnetworksresponse.network : [];
-                            if (networkObjs.length > 0) {
-                                for (var i = 0; i < networkObjs.length; i++) {
-                                    var networkObj = networkObjs[i];
-                                    var includingSecurityGroup = false;
-                                    var serviceObjArray = networkObj.service;
-                                    for (var k = 0; k < serviceObjArray.length; k++) {
-                                        if (serviceObjArray[k].name == "SecurityGroup") {
-                                            networkObjs[i].type = networkObjs[i].type + ' (sg)';
-                                            includingSecurityGroup = true;
-                                            break;
-                                        }
-                                    }
-
-                                    if (networkObj.vpcid) {
-                                        networkObj._singleSelect = true;
-                                    }
-
-                                    //for Advanced SG-enabled zone, list only SG network offerings
-                                    if (selectedZoneObj.networktype == 'Advanced' && selectedZoneObj.securitygroupsenabled == true) {
-                                        if (includingSecurityGroup == false)
-                                            continue; //skip to next network offering
-                                    }
-                                    networkObjsToPopulate.push(networkObj);
-                                }
-                            }
-                        }
-                    });
-
-                    //In addition to the networks in the current zone, find networks in other zones that have stretchedL2subnet==true
-                    //capability and show them on the UI
-                    var allOtherAdvancedZones = [];
-                    $.ajax({
-                        url: createURL('listZones'),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            var result = $.grep(json.listzonesresponse.zone, function(zone) {
-                               return (zone.networktype == 'Advanced');
-                            });
-                            $(result).each(function() {
-                                if (selectedZoneObj.id != this.id)
-                                    allOtherAdvancedZones.push(this);
-                            });
-                        }
-                    });
-                    if (allOtherAdvancedZones.length > 0) {
-                        for (var i = 0; i < allOtherAdvancedZones.length; i++) {
-                            var networkDataForZone = {
-                                zoneId: allOtherAdvancedZones[i].id,
-                                canusefordeploy: true
-                            };
-                            $.ajax({
-                                url: createURL('listNetworks'),
-                                data: networkDataForZone,
-                                async: false,
-                                success: function(json) {
-                                    var networksInThisZone = json.listnetworksresponse.network ? json.listnetworksresponse.network : [];
-                                    if (networksInThisZone.length > 0) {
-                                        for (var i = 0; i < networksInThisZone.length; i++) {
-                                            if (networksInThisZone[i].strechedl2subnet) {
-                                                networkObjsToPopulate.push(networksInThisZone[i]);
-                                            }
-                                        }
-                                    }
-                                }
-                            });
-                        }
-                    }
-
-
-                    // get networkObjsToPopulate
-                    var zoneid = args.currentData["zoneid"];
-                    $(window).removeData("cloudStack.module.instanceWizard.networkObjs");
-                    $(window).trigger("cloudStack.module.instanceWizard.network.dataProvider", {
-                        context: args.context,
-                        currentData: args.currentData,
-                        networkObjsToPopulate: networkObjsToPopulate
-                    });
-                    if ($(window).data("cloudStack.module.instanceWizard.networkObjs") == undefined) {
-                        //do nothing
-                    } else {
-                        networkObjsToPopulate = $(window).data("cloudStack.module.instanceWizard.networkObjs"); //override networkObjsToPopulate
-                    }
-
-
-                    $.ajax({
-                        url: createURL("listNetworkOfferings"),
-                        dataType: "json",
-                        data: {
-                            zoneid: zoneid
-                        },
-                        data: {
-                            forvpc: false,
-                            zoneid: selectedZoneObj.id,
-                            guestiptype: 'Isolated',
-                            supportedServices: 'SourceNat',
-                            specifyvlan: false,
-                            state: 'Enabled'
-                        },
-                        async: false,
-                        success: function(json) {
-                            networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                        }
-                    });
-                    //get network offerings (end)    ***
-
-                    $networkStepContainer.removeClass('repeat next-use-security-groups');
-
-                    if (step6ContainerType == 'select-advanced-sg') {
-                        $networkStepContainer.addClass('repeat next-use-security-groups');
-
-                        // Add guest network is disabled
-                        $networkStepContainer.find('.select-network').addClass('no-add-network');
-                    } else {
-                        $networkStepContainer.find('.select-network').removeClass('no-add-network');
-                    }
-
-                    args.response.success({
-                        type: 'select-network',
-                        data: {
-                            networkObjs: networkObjsToPopulate,
-                            securityGroups: [],
-                            networkOfferings: networkOfferingObjs,
-                            vpcs: vpcObjs
-                        }
-                    });
-                } else if (step6ContainerType == 'select-security-group') {
-                    var securityGroupArray = [];
-                    var data = {
-                        domainid: g_domainid,
-                        account: g_account
-                    };
-
-                    $.ajax({
-                        url: createURL("listSecurityGroups"),
-                        dataType: "json",
-                        async: false,
-                        data: cloudStack.context.projects ? {} : data,
-                        success: function(json) {
-                            var items = json.listsecuritygroupsresponse.securitygroup;
-                            if (items != null && items.length > 0) {
-                                for (var i = 0; i < items.length; i++) {
-                                    securityGroupArray.push(items[i]);
-                                }
-                                securityGroupArray.sort(function(a, b){
-                                    if(a.name < b.name) return -1;
-                                    if(a.name > b.name) return 1;
-                                    return 0;
-                                })
-                            }
-                        }
-                    });
-                    args.response.success({
-                        type: 'select-security-group',
-                        data: {
-                            networkObjs: [],
-                            securityGroups: securityGroupArray,
-                            networkOfferings: [],
-                            vpcs: []
-                        }
-                    });
-                } else if (step6ContainerType == 'nothing-to-select') {
-                    args.response.success({
-                        type: 'nothing-to-select',
-                        data: {
-                            networkObjs: [],
-                            securityGroups: [],
-                            networkOfferings: [],
-                            vpcs: []
-                        }
-                    });
-                }
-
-            },
-
-            // Step 7: SSH Key Pairs
-            function(args) {
-                $.ajax({
-                    url: createURL('listSSHKeyPairs'),
-                    success: function(json) {
-                        var sshkeypair = json.listsshkeypairsresponse.sshkeypair;
-                        args.response.success({
-                            data: {
-                                sshkeyPairs: sshkeypair
-                            }
-                        });
-                    }
-                });
-
-                var $step = $('.step.sshkeyPairs:visible');
-                if (ovfProps == null || ovfProps.length === 0) {
-                    $step.addClass('next-skip-ovf-properties');
-                } else {
-                    $step.removeClass('next-skip-ovf-properties');
-                }
-            },
-
-            // Step 8: Review
-            function(args) {
-                var $step = $('.step.review:visible');
-                if (ovfProps == null || ovfProps.length === 0) {
-                    $step.addClass('previous-skip-ovf-properties');
-                } else {
-                    $step.removeClass('previous-skip-ovf-properties');
-                }
-            }
-        ],
-        action: function(args) {
-            // Create a new VM!!!!
-            var deployVmData = {};
-
-            //step 1 : select zone
-            zoneId = (args.data.zoneid == -1)? selectedZoneObj.id : args.data.zoneid;
-            $.extend(deployVmData, {
-                zoneid : zoneId
-            });
-
-            if (args.data.podid != -1) {
-                $.extend(deployVmData, {
-                    podid : args.data.podid
-                });
-            }
-
-            if (args.data.clusterid != -1) {
-                $.extend(deployVmData, {
-                    clusterid : args.data.clusterid
-                });
-            }
-
-            if (args.data.hostid != -1) {
-                $.extend(deployVmData, {
-                    hostid : args.data.hostid
-                });
-            }
-
-            //step 2: select template
-            $.extend(deployVmData, {
-                templateid : args.data.templateid
-            });
-
-            $.extend(deployVmData, {
-                hypervisor : selectedHypervisor
-            });
-
-            var deployOvfProperties = [];
-            if (ovfProps != null && ovfProps.length > 0) {
-                $(ovfProps).each(function(index, prop) {
-                    var selectField = args.$wizard.find('select[id="ovf-property-'+prop.key+'"]');
-                    var inputField = args.$wizard.find('input[id="ovf-property-'+prop.key+'"]');
-                    var propValue = inputField.val() ? inputField.val() : selectField.val();
-                    if (propValue !== undefined) {
-                        deployOvfProperties.push({
-                            key: prop.key,
-                            value: propValue
-                        });
-                    }
-                });
-                for (var k = 0; k < deployOvfProperties.length; k++) {
-                    deployVmData["properties[" + k + "].key"] = deployOvfProperties[k].key;
-                    deployVmData["properties[" + k + "].value"] = deployOvfProperties[k].value;
-                }
-            }
-
-            if (args.$wizard.find('input[name=rootDiskSize]').parent().css('display') != 'none')  {
-                if (args.$wizard.find('input[name=rootDiskSize]').val().length > 0) {
-                    $.extend(deployVmData, {
-                        rootdisksize : args.$wizard.find('input[name=rootDiskSize]').val()
-                    });
-                }
-            }
-
-            //step 3: select service offering
-            $.extend(deployVmData, {
-                serviceofferingid : args.data.serviceofferingid
-            });
-
-            if (args.$wizard.find('input[name=compute-cpu-cores]').parent().parent().css('display') != 'none') {
-                if (args.$wizard.find('input[name=compute-cpu-cores]').val().length > 0)  {
-                    $.extend(deployVmData, {
-                        'details[0].cpuNumber' : args.$wizard.find('input[name=compute-cpu-cores]').val()
-                    });
-                }
-                if (args.$wizard.find('input[name=compute-cpu]').val().length > 0)  {
-                    $.extend(deployVmData, {
-                        'details[0].cpuSpeed' : args.$wizard.find('input[name=compute-cpu]').val()
-                    });
-                }
-                if (args.$wizard.find('input[name=compute-memory]').val().length > 0)  {
-                    $.extend(deployVmData, {
-                        'details[0].memory' : args.$wizard.find('input[name=compute-memory]').val()
-                    });
-                }
-            } else if (args.$wizard.find('input[name=slider-compute-cpu-cores]').parent().parent().css('display') != 'none') {
-                if (args.$wizard.find('input[name=slider-compute-cpu-cores]').val().length > 0)  {
-                    $.extend(deployVmData, {
-                        'details[0].cpuNumber' : args.$wizard.find('input[name=slider-compute-cpu-cores]').val()
-                    });
-                }
-                if (args.$wizard.find('input[name=slider-compute-memory]').val().length > 0)  {
-                    $.extend(deployVmData, {
-                        'details[0].memory' : args.$wizard.find('input[name=slider-compute-memory]').val()
-                    });
-                }
-            }
-
-            if (args.$wizard.find('input[name=disk-min-iops]').parent().parent().css('display') != 'none') {
-                if (args.$wizard.find('input[name=disk-min-iops]').val().length > 0) {
-                    $.extend(deployVmData, {
-                        'details[0].minIops' : args.$wizard.find('input[name=disk-min-iops]').val()
-                    });
-                }
-                if (args.$wizard.find('input[name=disk-max-iops]').val().length > 0) {
-                    $.extend(deployVmData, {
-                        'details[0].maxIops' : args.$wizard.find('input[name=disk-max-iops]').val()
-                    });
-                }
-            }
-
-            //step 4: select disk offering
-            if (args.data.diskofferingid != null && args.data.diskofferingid != "0") {
-                $.extend(deployVmData, {
-                    diskofferingid : args.data.diskofferingid
-                });
-
-                if (selectedDiskOfferingObj.iscustomized == true) {
-                    $.extend(deployVmData, {
-                        size : args.data.size
-                    });
-                }
-
-                if (selectedDiskOfferingObj.iscustomizediops == true) {
-                    if (args.$wizard.find('input[name=disk-min-iops-do]').val().length > 0) {
-                        $.extend(deployVmData, {
-                            'details[0].minIopsDo' : args.$wizard.find('input[name=disk-min-iops-do]').val()
-                        });
-                    }
-
-                    if (args.$wizard.find('input[name=disk-max-iops-do]').val().length > 0) {
-                        $.extend(deployVmData, {
-                            'details[0].maxIopsDo' : args.$wizard.find('input[name=disk-max-iops-do]').val()
-                        });
-                    }
-                }
-            }
-
-            if (args.data["disk-offerings-multi"] != null && args.data["disk-offerings-multi"].length > 0) {
-                $(args.data["disk-offerings-multi"]).each(function(index, disk) {
-                    var diskMap = {};
-                    diskMap['datadiskofferinglist[' + index + '].datadisktemplateid'] = disk.id;
-                    diskMap['datadiskofferinglist[' + index + '].diskofferingid'] = disk._diskOfferingId;
-                    $.extend(deployVmData, diskMap);
-                });
-            }
-
-            //step 5: select an affinity group
-            var checkedAffinityGroupIdArray;
-            if (typeof(args.data["affinity-groups"]) == "object" && args.data["affinity-groups"].length != null) { //args.data["affinity-groups"] is an array of string, e.g. ["2375f8cc-8a73-4b8d-9b26-50885a25ffe0", "27c60d2a-de7f-4bb7-96e5-a602cec681df","c6301d77-99b5-4e8a-85e2-3ea2ab31c342"],
-                checkedAffinityGroupIdArray = args.data["affinity-groups"];
-            } else if (typeof(args.data["affinity-groups"]) == "string" && args.data["affinity-groups"].length > 0) { //args.data["affinity-groups"] is a string, e.g. "2375f8cc-8a73-4b8d-9b26-50885a25ffe0"
-                checkedAffinityGroupIdArray = [];
-                checkedAffinityGroupIdArray.push(args.data["affinity-groups"]);
-            } else { // typeof(args.data["affinity-groups"]) == null
-                checkedAffinityGroupIdArray = [];
-            }
-
-            if (checkedAffinityGroupIdArray.length > 0) {
-                $.extend(deployVmData, {
-                    affinitygroupids : checkedAffinityGroupIdArray.join(",")
-                });
-            }
-
-            //step 6: select network
-            if (step6ContainerType == 'select-network' || step6ContainerType == 'select-advanced-sg') {
-                var array2 = [];
-                var array3 = [];
-                var defaultNetworkId = args.data.defaultNetwork; //args.data.defaultNetwork might be equal to string "new-network" or a network ID
-
-                var checkedNetworkIdArray;
-                if (typeof(args.data["my-networks"]) == "object" && args.data["my-networks"].length != null) { //args.data["my-networks"] is an array of string, e.g. ["203", "202"],
-                    checkedNetworkIdArray = args.data["my-networks"];
-                } else if (typeof(args.data["my-networks"]) == "string" && args.data["my-networks"].length > 0) { //args.data["my-networks"] is a string, e.g. "202"
-                    checkedNetworkIdArray = [];
-                    checkedNetworkIdArray.push(args.data["my-networks"]);
-                } else { // typeof(args.data["my-networks"]) == null
-                    checkedNetworkIdArray = [];
-                }
-
-                //create new network starts here
-                if (args.data["new-network"] == "create-new-network") {
-                    var isCreateNetworkSuccessful = true;
-
-                    var createNetworkData = {
-                        networkOfferingId: args.data["new-network-networkofferingid"],
-                        name: args.data["new-network-name"],
-                        displayText: args.data["new-network-name"],
-                        zoneId: selectedZoneObj.id
-                    };
-
-                    $.ajax({
-                        url: createURL('createNetwork'),
-                        data: createNetworkData,
-                        async: false,
-                        success: function(json) {
-                            newNetwork = json.createnetworkresponse.network;
-                            checkedNetworkIdArray.push(newNetwork.id);
-                            if (defaultNetworkId == "new-network")
-                                defaultNetworkId = newNetwork.id;
-                        },
-                        error: function(XMLHttpResponse) {
-                            isCreateNetworkSuccessful = false;
-                            var errorMsg = "Failed to create new network, unable to proceed to deploy VM. Error: " + parseXMLHttpResponse(XMLHttpResponse);
-                            //alert(errorMsg);
-                            args.response.error(errorMsg); //args.response.error(errorMsg) here doesn't show errorMsg. Waiting for Brian to fix it. use alert(errorMsg) to show errorMsg for now.
-                        }
-                    });
-                    if (isCreateNetworkSuccessful == false)
-                        return;
-                }
-                //create new network ends here
-
-
-                if (defaultNetworkId == null) {
-                    cloudStack.dialog.notice({
-                        message: "Please select a default network in Network step."
-                    });
-                    return;
-                }
-
-                if (checkedNetworkIdArray.length > 0) {
-                    for (var i = 0; i < checkedNetworkIdArray.length; i++) {
-                        if (checkedNetworkIdArray[i] == defaultNetworkId) {
-                            array2.unshift(defaultNetworkId);
-
-                            var ipToNetwork = {
-                                networkid: defaultNetworkId
-                            };
-                            if (args.data["new-network"] == "create-new-network") {
-                                if (args.data['new-network-ip'] != null && args.data['new-network-ip'].length > 0) {
-                                    $.extend(ipToNetwork, {
-                                        ip: args.data['new-network-ip']
-                                    });
-                                }
-                            } else {
-                                if (args.data["my-network-ips"][i] != null && args.data["my-network-ips"][i].length > 0) {
-                                    $.extend(ipToNetwork, {
-                                        ip: args.data["my-network-ips"][i]
-                                    });
-                                }
-                            }
-                            array3.unshift(ipToNetwork);
-
-                        } else {
-                            array2.push(checkedNetworkIdArray[i]);
-
-                            var ipToNetwork = {
-                                networkid: checkedNetworkIdArray[i]
-                            };
-                            if (args.data["my-network-ips"][i] != null && args.data["my-network-ips"][i].length > 0) {
-                                $.extend(ipToNetwork, {
-                                    ip: args.data["my-network-ips"][i]
-                                });
-                            }
-                            array3.push(ipToNetwork);
-                        }
-                    }
-                }
-
-                //deployVmData.push("&networkIds=" + array2.join(","));  //ipToNetworkMap can't be specified along with networkIds or ipAddress
-
-                for (var k = 0; k < array3.length; k++) {
-                    deployVmData["iptonetworklist[" + k + "].networkid"] = array3[k].networkid;
-                    if (array3[k].ip != undefined && array3[k].ip.length > 0) {
-                        deployVmData["iptonetworklist[" + k + "].ip"] = array3[k].ip;
-                    }
-                }
-
-            } else if (step6ContainerType == 'select-security-group') {
-                var checkedSecurityGroupIdArray;
-                if (typeof(args.data["security-groups"]) == "object" && args.data["security-groups"].length != null) { //args.data["security-groups"] is an array of string, e.g. ["2375f8cc-8a73-4b8d-9b26-50885a25ffe0", "27c60d2a-de7f-4bb7-96e5-a602cec681df","c6301d77-99b5-4e8a-85e2-3ea2ab31c342"],
-                    checkedSecurityGroupIdArray = args.data["security-groups"];
-                } else if (typeof(args.data["security-groups"]) == "string" && args.data["security-groups"].length > 0) { //args.data["security-groups"] is a string, e.g. "2375f8cc-8a73-4b8d-9b26-50885a25ffe0"
-                    checkedSecurityGroupIdArray = [];
-                    checkedSecurityGroupIdArray.push(args.data["security-groups"]);
-                } else { // typeof(args.data["security-groups"]) == null
-                    checkedSecurityGroupIdArray = [];
-                }
-
-                if (checkedSecurityGroupIdArray.length > 0) {
-                    $.extend(deployVmData, {
-                        securitygroupids : checkedSecurityGroupIdArray.join(",")
-                    });
-                }
-
-                if (selectedZoneObj.networktype == "Advanced" && selectedZoneObj.securitygroupsenabled == true) { // Advanced SG-enabled zone
-                    var array2 = [];
-                    var array3 = [];
-                    var myNetworks = $('.multi-wizard:visible form').data('my-networks'); //widget limitation: If using an advanced security group zone, get the guest networks like this
-                    var defaultNetworkId = $('.multi-wizard:visible form').data('defaultNetwork');
-                    //var defaultNetworkId = $('.multi-wizard:visible form').find('input[name=defaultNetwork]:checked').val();
-
-                    var checkedNetworkIdArray;
-                    if (typeof(myNetworks) == "object" && myNetworks.length != null) { //myNetworks is an array of string, e.g. ["203", "202"],
-                        checkedNetworkIdArray = myNetworks;
-                    } else if (typeof(myNetworks) == "string" && myNetworks.length > 0) { //myNetworks is a string, e.g. "202"
-                        checkedNetworkIdArray = [];
-                        checkedNetworkIdArray.push(myNetworks);
-                    } else { // typeof(myNetworks) == null
-                        checkedNetworkIdArray = [];
-                    }
-
-                    //add default network first
-                    if (defaultNetworkId != null && defaultNetworkId.length > 0 && defaultNetworkId != 'new-network') {
-                        array2.push(defaultNetworkId);
-                    }
-
-                    var myNetworkIps = $('.multi-wizard:visible form').data('my-network-ips');
-                    if (checkedNetworkIdArray.length > 0) {
-                        for (var i = 0; i < checkedNetworkIdArray.length; i++) {
-                            if (checkedNetworkIdArray[i] == defaultNetworkId) {
-                                array2.unshift(defaultNetworkId);
-
-                                var ipToNetwork = {
-                                    networkid: defaultNetworkId
-                                };
-                                if (myNetworkIps[i] != null && myNetworkIps[i].length > 0) {
-                                    $.extend(ipToNetwork, {
-                                        ip: myNetworkIps[i]
-                                    });
-                                }
-                                array3.unshift(ipToNetwork);
-                            } else {
-                                array2.push(checkedNetworkIdArray[i]);
-
-                                var ipToNetwork = {
-                                    networkid: checkedNetworkIdArray[i]
-                                };
-                                if (myNetworkIps[i] != null && myNetworkIps[i].length > 0) {
-                                    $.extend(ipToNetwork, {
-                                        ip: myNetworkIps[i]
-                                    });
-                                }
-                                array3.push(ipToNetwork);
-                            }
-                        }
-                    }
-
-                    for (var k = 0; k < array3.length; k++) {
-                        deployVmData["iptonetworklist[" + k + "].networkid"] = array3[k].networkid;
-                        if (array3[k].ip != undefined && array3[k].ip.length > 0) {
-                            deployVmData["iptonetworklist[" + k + "].ip"] = array3[k].ip;
-                        }
-                    }
-                }
-            } else if (step6ContainerType == 'nothing-to-select') {
-                if ("vpc" in args.context) { //from VPC tier
-                    deployVmData["iptonetworklist[0].networkid"] = args.context.networks[0].id;
-                    if (args.data["vpc-specify-ip"] != undefined && args.data["vpc-specify-ip"].length > 0) {
-                        deployVmData["iptonetworklist[0].ip"] = args.data["vpc-specify-ip"];
-                    }
-
-                    $.extend(deployVmData, {
-                        domainid : args.context.vpc[0].domainid
-                    });
-                    if (args.context.vpc[0].account != null) {
-                        $.extend(deployVmData, {
-                            account : args.context.vpc[0].account
-                        });
-                    } else if (args.context.vpc[0].projectid != null) {
-                        $.extend(deployVmData, {
-                            projectid : args.context.vpc[0].projectid
-                        });
-                    }
-                }
-            }
-
-            //step 4: select ssh key pair
-            if (args.data.sshkeypair != null && args.data.sshkeypair.length > 0) {
-                $.extend(deployVmData, {
-                        keypair : args.data.sshkeypair
-                });
-            }
-
-            var displayname = args.data.displayname;
-            if (displayname != null && displayname.length > 0) {
-                $.extend(deployVmData, {
-                    displayname : displayname
-                });
-                $.extend(deployVmData, {
-                    name : displayname
-                });
-            }
-
-            var group = args.data.groupname;
-            if (group != null && group.length > 0) {
-                $.extend(deployVmData, {
-                    group : group
-                });
-            }
-
-            var keyboard = args.data.keyboardLanguage;
-            if (keyboard != null && keyboard.length > 0) {  //when blank option (default option) is selected => args.data.keyboardLanguage == ""
-                $.extend(deployVmData, {
-                    keyboard : keyboard
-                });
-            }
-            var boottype = args.data.customboot;
-            if (boottype != null && boottype.length > 0) {
-                $.extend(deployVmData, {
-                    boottype : boottype
-                });
-            }
-            var bootmode = args.data.bootmode;
-            if (bootmode != null && bootmode.length > 0) {
-                $.extend(deployVmData, {
-                    bootmode : bootmode
-                });
-            }
-            var bootintosetup = (args.data.bootintosetup == "on");
-            if (bootintosetup) {
-                $.extend(deployVmData, {
-                    bootintosetup : bootintosetup
-                });
-            }
-
-            if (g_hostid != null) {
-                $.extend(deployVmData, {
-                    hostid : g_hostid
-                });
-            }
-
-            var userdata = args.data.userdata;
-            if (userdata != null && userdata.length > 0) {
-
-                $.extend(deployVmData, {
-                    userdata : encodeURIComponent(btoa(cloudStack.sanitizeReverse(userdata)))
-                });
-            }
-
-            $(window).trigger('cloudStack.deployVirtualMachine', {
-                deployVmData: deployVmData,
-                formData: args.data
-            });
-
-            $.ajax({
-                url: createURL('deployVirtualMachine'),
-                data: deployVmData,
-                success: function(json) {
-                    var jid = json.deployvirtualmachineresponse.jobid;
-                    var vmid = json.deployvirtualmachineresponse.id;
-                    args.response.success({
-                        _custom: {
-                            jobId: jid,
-                            getUpdatedItem: function(json) {
-                                var item = json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                if (item.password != null)
-                                    cloudStack.dialog.notice({
-                                        message: "Password of new VM " + item.displayname + " is  " + item.password
-                                    });
-                                return item;
-                            },
-                            getActionFilter: function() {
-                                return cloudStack.actionFilter.vmActionFilter;
-                            },
-                            getUpdatedItemWhenAsyncJobFails: function() {
-                                var item;
-                                $.ajax({
-                                    url: createURL("listVirtualMachines&id=" + vmid),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        item = json.listvirtualmachinesresponse.virtualmachine[0];
-                                    }
-                                });
-                                return item;
-                            }
-                        }
-                    });
-                },
-                error: function(XMLHttpResponse) {
-                    args.response.error(parseXMLHttpResponse(XMLHttpResponse)); //wait for Brian to implement
-                }
-            });
-        }
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/instances.js b/ui/legacy/scripts/instances.js
deleted file mode 100644
index 0a9e025..0000000
--- a/ui/legacy/scripts/instances.js
+++ /dev/null
@@ -1,4258 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    var vmMigrationHostObjs, ostypeObjs, zoneWideStorage;
-
-    var vmStartAction = function(args) {
-      var action = {
-        messages: {
-          confirm: function() {
-            return 'message.action.start.instance';
-          },
-          notification: function() {
-            return 'label.action.start.instance';
-          }
-        },
-        label: 'label.action.start.instance',
-        compactLabel: 'label.start',
-        addRow: 'false',
-        createForm: {
-          title: 'notification.start.instance',
-          desc: 'message.action.start.instance',
-          fields: {
-            hostId: {
-              label: 'label.host',
-              isHidden: function() {
-                return !isAdmin();
-              },
-              select: function(args) {
-                if (isAdmin()) {
-                  $.ajax({
-                    url: createURL("listHosts&state=Up&type=Routing&zoneid=" + args.context.instances[0].zoneid),
-                    dataType: "json",
-                    async: true,
-                    success: function(json) {
-                      if (json.listhostsresponse.host != undefined) {
-                        hostObjs = json.listhostsresponse.host;
-                        var items = [{
-                          id: -1,
-                          description: 'Default'
-                        }];
-                        $(hostObjs).each(function() {
-                          items.push({
-                            id: this.id,
-                            description: this.name
-                          });
-                        });
-                        args.response.success({
-                          data: items
-                        });
-                      } else {
-                        cloudStack.dialog.notice({
-                          message: _l('No Hosts are avaialble')
-                        });
-                      }
-                    }
-                  });
-                } else {
-                  args.response.success({
-                    data: null
-                  });
-                }
-              }
-            },
-            bootintosetup: {
-              label: 'label.enter.hardware.setup',
-              isBoolean: true,
-              isHidden: function(args) {
-                if (args.context.instances[0].hypervisor !== 'VMware') {
-                  return true;
-                }
-                return false;
-              }
-            }
-          }
-        },
-        action: function(args) {
-          var instances = args.context.instances;
-          var skippedInstances = 0;
-          $(instances).each(function(index, instance) {
-            if (instance.state === 'Running' || instance.state === "Starting") {
-              skippedInstances++;
-            } else {
-              var data = {
-                id: instance.id
-              };
-              if (args.$form.find('.form-item[rel=hostId]').css("display") != "none" && args.data.hostId != -1) {
-                $.extend(data, {
-                  hostid: args.data.hostId
-                });
-              }
-              $.ajax({
-                url: createURL("startVirtualMachine"),
-                data: data,
-                dataType: "json",
-                async: true,
-                success: function(json) {
-                  var jid = json.startvirtualmachineresponse.jobid;
-                  args.response.success({
-                    _custom: {
-                      jobId: jid,
-                      getUpdatedItem: function(json) {
-                        return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                      },
-                      getActionFilter: function() {
-                        return cloudStack.actionFilter.vmActionFilter;
-                      }
-                    }
-                  });
-                },
-                error: function(json) {
-                  args.response.error(parseXMLHttpResponse(json));
-                }
-              });
-            }
-          });
-          if (skippedInstances === instances.length) {
-            args.response.error();
-          }
-        },
-        notification: {
-          poll: pollAsyncJobResult
-        }
-      };
-
-
-      if (args && args.listView) {
-        $.extend(action, {
-          isHeader: true,
-          isMultiSelectAction: true
-        });
-      }
-
-      return action;
-    };
-
-    var vmStopAction = function(args) {
-        var action = {
-            messages: {
-                confirm: function(args) {
-                    return 'message.action.stop.instance';
-                },
-                notification: function(args) {
-                    return 'label.action.stop.instance';
-                }
-            },
-            label: 'label.action.stop.instance',
-            compactLabel: 'label.stop',
-            addRow: 'false',
-            createForm: {
-                title: 'notification.stop.instance',
-                desc: 'message.action.stop.instance',
-                fields: {
-                    forced: {
-                        label: 'force.stop',
-                        isBoolean: true,
-                        isChecked: false
-                    }
-                }
-            },
-            action: function(args) {
-                var instances = args.context.instances;
-                var skippedInstances = 0;
-                $(instances).each(function(index, instance) {
-                    if (instance.state === 'Stopped' || instance.state === 'Stopping') {
-                        skippedInstances++;
-                    } else {
-                        var data = {
-                            id: instance.id,
-                            forced: (args.data.forced == "on")
-                        };
-                        $.ajax({
-                            url: createURL("stopVirtualMachine"),
-                            data: data,
-                            dataType: "json",
-                            success: function(json) {
-                                var jid = json.stopvirtualmachineresponse.jobid;
-                                args.response.success({
-                                    _custom: {
-                                        jobId: jid,
-                                        getUpdatedItem: function(json) {
-                                            return $.extend(json.queryasyncjobresultresponse.jobresult.virtualmachine, { hostid: null });
-                                        },
-                                        getActionFilter: function() {
-                                            return vmActionfilter;
-                                        }
-                                    }
-                                });
-                            },
-                            error: function(json) {
-                              args.response.error(parseXMLHttpResponse(json));
-                            }
-                        });
-                    }
-                });
-                if (skippedInstances === instances.length) {
-                    args.response.error();
-                }
-            },
-            notification: {
-                poll: pollAsyncJobResult
-            }
-        };
-
-
-        if (args && args.listView) {
-            $.extend(action, {
-                isHeader: true,
-                isMultiSelectAction: true
-            });
-        }
-
-        return action;
-    };
-
-    var vmDestroyAction = function(args) {
-        var action = {
-            messages: {
-                notification: function(args) {
-                    return 'label.action.destroy.instance';
-                }
-            },
-            label: 'label.action.destroy.instance',
-            compactLabel: 'label.destroy',
-            addRow: 'false',
-            createForm: {
-                title: 'label.action.destroy.instance',
-                desc: 'label.action.destroy.instance',
-                isWarning: true,
-                preFilter: function(args) {
-                    if (! g_allowUserExpungeRecoverVm) {
-                        args.$form.find('.form-item[rel=expunge]').hide();
-                    }
-                },
-                fields: {
-                    expunge: {
-                        label: 'label.expunge',
-                        isBoolean: true,
-                        isChecked: false
-                    },
-                    volumes: {
-                        label: 'label.delete.volumes',
-                        isBoolean: true,
-                        isChecked: true,
-                        isHidden: true,
-                    },
-                    volumeids: {
-                        label: 'label.delete.volumes',
-                        dependsOn: 'volumes',
-                        isBoolean: true,
-                        isHidden: false,
-                        emptyMessage: 'label.volume.empty',
-                        multiDataArray: true,
-                        multiData: function(args) {
-                            $.ajax({
-                                url: createURL("listVolumes&virtualMachineId=" + args.context.instances[0].id) + "&type=DATADISK",
-                                  dataType: "json",
-                                  async: true,
-                                  success: function(json) {
-                                    var volumes = json.listvolumesresponse.volume;
-                                    args.response.success({
-                                        descriptionField: 'name',
-                                        valueField: 'id',
-                                        data: volumes
-                                    });
-                                  }
-                            });
-                        }
-                    }
-                }
-            },
-            action: function(args) {
-                var instances = args.context.instances;
-                $(instances).map(function(index, instance) {
-                    var data = {
-                        id: instance.id
-                    };
-                    if (args.data.expunge == 'on') {
-                        $.extend(data, {
-                            expunge: true
-                        });
-                    }
-                    if (args.data.volumes == 'on') {
-
-                        var regex = RegExp('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
-
-                        var selectedVolumes = [];
-
-                        for (var key in args.data) {
-                            var matches = key.match(regex);
-
-                            if (matches != null) {
-                                selectedVolumes.push(key);
-                            }
-                        }
-
-                        $.extend(data, {
-                            volumeids: $(selectedVolumes).map(function(index, volume) {
-                                return volume;
-                            }).toArray().join(',')
-                        });
-                    }
-                    $.ajax({
-                        url: createURL('destroyVirtualMachine'),
-                        data: data,
-                        success: function(json) {
-                            var jid = json.destroyvirtualmachineresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        if ('virtualmachine' in json.queryasyncjobresultresponse.jobresult) //destroy without expunge
-                                            return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                        else //destroy with expunge
-                                            return { 'toRemove': true };
-                                    },
-                                    getActionFilter: function() {
-                                        return vmActionfilter;
-                                    }
-                                }
-                            });
-                        }
-                    });
-                });
-            },
-            notification: {
-                poll: pollAsyncJobResult
-            }
-        };
-
-        if (args && args.listView) {
-            $.extend(action, {
-                isHeader: true,
-                isMultiSelectAction: true
-            });
-        }
-
-        return action;
-    };
-
-    var vmSnapshotAction = function(args) {
-        var action = {
-            messages: {
-                notification: function(args) {
-                    return 'label.action.vmsnapshot.create';
-                }
-            },
-            label: 'label.action.vmsnapshot.create',
-            addRow: 'false',
-            createForm: {
-                title: 'label.action.vmsnapshot.create',
-                desc: 'message.action.vmsnapshot.create',
-                fields: {
-                    name: {
-                        label: 'label.name',
-                        docID: 'helpCreateInstanceSnapshotName',
-                        isInput: true
-                    },
-                    description: {
-                        label: 'label.description',
-                        docID: 'helpCreateInstanceSnapshotDescription',
-                        isTextarea: true
-                    },
-                    snapshotMemory: {
-                        label: 'label.vmsnapshot.memory',
-                        docID: 'helpCreateInstanceSnapshotMemory',
-                        isBoolean: true,
-                        isChecked: false,
-                        isHidden: function(args) {
-                            if (args.context.instances[0].vgpu != undefined) {
-                                return true;
-                            }
-                            return false;
-                        },
-                        isDisabled: function(args){
-                            if(args.context.instances[0].state == 'Stopped'){
-                                    return true;
-                            }
-                            return false;
-                        }
-                    },
-                    quiescevm: {
-                        label: 'label.quiesce.vm',
-                        isBoolean: true,
-                        isChecked: false,
-                        isHidden: function(args) {
-                            if (args.context.instances[0].hypervisor !== 'VMware') {
-                                return true;
-                            }
-
-                            args.form.fields.quiescevm.isChecked = true;
-
-                            return false;
-                        }
-                    }
-                }
-            },
-            action: function(args) {
-                var instances = args.context.instances;
-
-                $(instances).map(function(index, instance) {
-                    var array1 = [];
-                    array1.push("&snapshotmemory=" + (args.data.snapshotMemory == "on"));
-                    array1.push("&quiescevm=" + (args.data.quiescevm == "on"));
-                    cloudStack.addNameAndDescriptionToCommandUrlParameterArray(array1, args.data);
-                    $.ajax({
-                        url: createURL("createVMSnapshot&virtualmachineid=" + instance.id + array1.join("")),
-                        dataType: "json",
-                        async: true,
-                        success: function(json) {
-                            var jid = json.createvmsnapshotresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                    },
-                                    getActionFilter: function() {
-                                        return vmActionfilter;
-                                    }
-                                }
-                            });
-                        },
-                        error: function(json) {
-                            args.response.error(parseXMLHttpResponse(json));
-                        }
-                    });
-                });
-
-            },
-            notification: {
-                poll: pollAsyncJobResult
-            }
-        };
-
-        if (args && args.listView) {
-            $.extend(action, {
-                isHeader: true,
-                isMultiSelectAction: true
-            });
-        }
-
-        return action;
-    };
-
-    cloudStack.sections.instances = {
-        title: 'label.instances',
-        id: 'instances',
-        listView: {
-            multiSelect: true,
-            section: 'instances',
-            filters: {
-                all: {
-                    label: 'ui.listView.filters.all'
-                },
-                mine: {
-                    label: 'ui.listView.filters.mine'
-                },
-                running: {
-                    label: 'state.Running'
-                },
-                stopped: {
-                    label: 'state.Stopped'
-                },
-                destroyed: {
-                    preFilter: function(args) {
-                        if (isAdmin() || isDomainAdmin())
-                            return true;
-                        else
-                            return false;
-                    },
-                    label: 'state.Destroyed'
-                }
-            },
-            preFilter: function(args) {
-                var hiddenFields = [];
-                if (!isAdmin()) {
-                    hiddenFields.push('instancename');
-                    hiddenFields.push('account');
-                }
-                return hiddenFields;
-            },
-            fields: {
-                name: {
-                    label: 'label.name',
-                    truncate: true
-                },
-                instancename: {
-                    label: 'label.internal.name'
-                },
-                displayname: {
-                    label: 'label.display.name',
-                    truncate: true
-                },
-                ipaddress: {
-                    label: 'label.ip.address'
-                },
-                account: {
-                    label: 'label.account'
-                },
-                zonename: {
-                    label: 'label.zone.name'
-                },
-                state: {
-                    label: 'label.metrics.state',
-                    converter: function (str) {
-                        // For localization
-                        return str;
-                    },
-                    indicator: {
-                        'Running': 'on',
-                        'Stopped': 'off',
-                        'Error': 'off',
-                        'Destroyed': 'off',
-                        'Expunging': 'off',
-                        'Stopping': 'warning',
-                        'Shutdown': 'warning'
-                    }
-                }
-            },
-
-            advSearchFields: {
-                name: {
-                    label: 'label.name'
-                },
-                zoneid: {
-                    label: 'label.zone',
-                    select: function(args) {
-                        $.ajax({
-                            url: createURL('listZones'),
-                            data: {
-                                listAll: true
-                            },
-                            success: function(json) {
-                                var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                args.response.success({
-                                    data: $.map(zones, function(zone) {
-                                        return {
-                                            id: zone.id,
-                                            description: zone.name
-                                        };
-                                    })
-                                });
-                            }
-                        });
-                    }
-                },
-
-                domainid: {
-                    label: 'label.domain',
-                    select: function(args) {
-                        if (isAdmin() || isDomainAdmin()) {
-                            $.ajax({
-                                url: createURL('listDomains'),
-                                data: {
-                                    listAll: true,
-                                    details: 'min'
-                                },
-                                success: function(json) {
-                                    var array1 = [{
-                                        id: '',
-                                        description: ''
-                                    }];
-                                    var domains = json.listdomainsresponse.domain;
-                                    if (domains != null && domains.length > 0) {
-                                        for (var i = 0; i < domains.length; i++) {
-                                            array1.push({
-                                                id: domains[i].id,
-                                                description: domains[i].path
-                                            });
-                                        }
-                                    }
-                                    array1.sort(function(a, b) {
-                                        return a.description.localeCompare(b.description);
-                                    });
-                                    args.response.success({
-                                        data: array1
-                                    });
-                                }
-                            });
-                        } else {
-                            args.response.success({
-                                data: null
-                            });
-                        }
-                    },
-                    isHidden: function(args) {
-                        if (isAdmin() || isDomainAdmin())
-                            return false;
-                        else
-                            return true;
-                    }
-                },
-                account: {
-                    label: 'label.account',
-                    isHidden: function(args) {
-                        if (isAdmin() || isDomainAdmin())
-                            return false;
-                        else
-                            return true;
-                    }
-                },
-
-                tagKey: {
-                    label: 'label.tag.key'
-                },
-                tagValue: {
-                    label: 'label.tag.value'
-                }
-            },
-
-            // List view actions
-            actions: {
-                // Add instance wizard
-                add: {
-                    label: 'label.vm.add',
-
-                    action: {
-                        custom: cloudStack.uiCustom.instanceWizard(cloudStack.instanceWizard)
-                    },
-
-                    messages: {
-                        notification: function(args) {
-                            return 'label.vm.add';
-                        }
-                    },
-                    notification: {
-                        poll: pollAsyncJobResult
-                    }
-                },
-                destroy: vmDestroyAction({ listView: true }),
-                stop: vmStopAction({ listView: true }),
-                start: vmStartAction({ listView: true }),
-                snapshot: vmSnapshotAction({ listView: true }),
-                viewMetrics: {
-                    label: 'label.metrics',
-                    isHeader: true,
-                    addRow: false,
-                    action: {
-                        custom: cloudStack.uiCustom.metricsView({resource: 'vms'})
-                    },
-                    messages: {
-                        notification: function (args) {
-                            return 'label.metrics';
-                        }
-                    }
-                }
-            },
-
-            dataProvider: function(args) {
-                var data = {};
-                listViewDataProvider(args, data);
-
-                if (args.filterBy != null) { //filter dropdown
-                    if (args.filterBy.kind != null) {
-                        switch (args.filterBy.kind) {
-                            case "all":
-                                break;
-                            case "mine":
-                                if (!args.context.projects) {
-                                    $.extend(data, {
-                                        domainid: g_domainid,
-                                        account: g_account
-                                    });
-                                }
-                                break;
-                            case "running":
-                                $.extend(data, {
-                                    state: 'Running'
-                                });
-                                break;
-                            case "stopped":
-                                $.extend(data, {
-                                    state: 'Stopped'
-                                });
-                                break;
-                            case "destroyed":
-                                $.extend(data, {
-                                    state: 'Destroyed'
-                                });
-                                break;
-                        }
-                    }
-                }
-
-                if ("hosts" in args.context) {
-                    g_hostid = args.context.hosts[0].id;
-                    $.extend(data, {
-                        hostid: args.context.hosts[0].id
-                    });
-                } else {
-                    g_hostid = null;
-                }
-
-                if ("affinityGroups" in args.context) {
-                    $.extend(data, {
-                        affinitygroupid: args.context.affinityGroups[0].id
-                    });
-                }
-
-                if ("vpc" in args.context &&
-                    "networks" in args.context) {
-                    $.extend(data, {
-                        vpcid: args.context.vpc[0].id,
-                        networkid: args.context.networks[0].id
-                    });
-                }
-
-                if ("routers" in args.context) {
-                    if ("vpcid" in args.context.routers[0]) {
-                        $.extend(data, {
-                            vpcid: args.context.routers[0].vpcid
-                        });
-                    } else {
-                        if ("guestnetworkid" in args.context.routers[0]) {
-                            $.extend(data, {
-                                networkid: args.context.routers[0].guestnetworkid
-                            });
-                        }
-                    }
-                    if ("projectid" in args.context.routers[0]) {
-                        $.extend(data, {
-                            projectid: args.context.routers[0].projectid
-                        });
-                    }
-                }
-
-                if ("networks" in args.context) {
-                    $.extend(data, {
-                        networkid: args.context.networks[0].id
-                    });
-                }
-
-                if ("templates" in args.context) {
-                    $.extend(data, {
-                        templateid: args.context.templates[0].id
-                    });
-                }
-
-                if ("isos" in args.context) {
-                    $.extend(data, {
-                        isoid: args.context.isos[0].id
-                    });
-                }
-
-                if ("sshkeypairs" in args.context) {
-                    $.extend(data, {
-                        domainid: args.context.sshkeypairs[0].domainid,
-                        keypair: args.context.sshkeypairs[0].name
-                    });
-                    if (!cloudStack.context || !cloudStack.context.projects) {
-                        // In case we are in project mode sshkeypairs provides project account name which
-                        // should not be passed as part of API params. So only extend if NOT in project mode.
-                        $.extend(data, { account: args.context.sshkeypairs[0].account});
-                    }
-                }
-
-                $.ajax({
-                    url: createURL('listVirtualMachines'),
-                    data: data,
-                    success: function(json) {
-                        var items = json.listvirtualmachinesresponse.virtualmachine;
-                        if (items) {
-                            $.each(items, function(idx, vm) {
-                                if (! vm.ipaddress) {
-                                    vm['ipaddress'] = "N/A";
-                                }
-                                if (vm.nic && vm.nic.length > 0 && vm.nic[0].ipaddress) {
-                                    items[idx].ipaddress = vm.nic[0].ipaddress;
-                                }
-                            });
-                        }
-                        args.response.success({
-                            data: items
-                        });
-                    },
-                    error: function(XMLHttpResponse) {
-                        cloudStack.dialog.notice({
-                            message: parseXMLHttpResponse(XMLHttpResponse)
-                        });
-                        args.response.error();
-                     }
-                });
-            },
-
-            detailView: {
-                name: 'Instance details',
-                viewAll: [{
-                    path: 'storage.volumes',
-                    label: 'label.volumes'
-                }, {
-                    path: 'storage.vmsnapshots',
-                    label: 'label.snapshots'
-                }, {
-                    path: 'storage.backups',
-                    label: 'label.backup'
-                }, {
-                    path: 'affinityGroups',
-                    label: 'label.affinity.groups'
-                }, {
-                    path: '_zone.hosts',
-                    label: 'label.host',
-                    preFilter: function(args) {
-                        return isAdmin() && args.context.instances[0].hostid;
-                    },
-                    updateContext: function(args) {
-                        var instance = args.context.instances[0];
-                        var zone;
-
-                        $.ajax({
-                            url: createURL('listZones'),
-                            data: {
-                                id: instance.zoneid
-                            },
-                            async: false,
-                            success: function(json) {
-                                zone = json.listzonesresponse.zone[0]
-                            }
-                        });
-
-                        return {
-                            zones: [zone]
-                        };
-                    }
-                }],
-                tabFilter: function(args) {
-                    var hiddenTabs = [];
-
-                    var zoneObj;
-                    $.ajax({
-                        url: createURL("listZones&id=" + args.context.instances[0].zoneid),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            zoneObj = json.listzonesresponse.zone[0];
-                        }
-                    });
-
-                    var includingSecurityGroupService = false;
-                    if (zoneObj.networktype == "Basic") { //Basic zone
-                        $.ajax({
-                            url: createURL("listNetworks&id=" + args.context.instances[0].nic[0].networkid),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                var items = json.listnetworksresponse.network;
-                                if (items != null && items.length > 0) {
-                                    var networkObj = items[0]; //Basic zone has only one guest network (only one NIC)
-                                    var serviceObjArray = networkObj.service;
-                                    for (var k = 0; k < serviceObjArray.length; k++) {
-                                        if (serviceObjArray[k].name == "SecurityGroup") {
-                                            includingSecurityGroupService = true;
-                                            break;
-                                        }
-                                    }
-                                }
-                            }
-                        });
-                    } else if (zoneObj.networktype == "Advanced") { //Advanced zone
-                        if (zoneObj.securitygroupsenabled == true)
-                            includingSecurityGroupService = true;
-                        else
-                            includingSecurityGroupService = false;
-                    }
-
-                    if (includingSecurityGroupService == false) {
-                        hiddenTabs.push("securityGroups");
-                    }
-
-                    return hiddenTabs;
-                },
-                actions: {
-                    start: {
-                        label: 'label.action.start.instance',
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("startVirtualMachine&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.startvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.start.instance';
-                            },
-                            notification: function(args) {
-                                return 'label.action.start.instance';
-                            },
-                            complete: function(args) {
-                                if (args.password != null) {
-                                    return 'label.vm.password' + ' ' + args.password;
-                                }
-
-                                return false;
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    startByAdmin: {
-                        label: 'label.action.start.instance',
-                        createForm: {
-                            title: 'label.action.start.instance',
-                            desc: 'message.action.start.instance',
-                            fields: {
-                                podId: {
-                                  label: 'label.pod',
-                                  isHidden: function(args) {
-                                      return !isAdmin();
-                                  },
-                                  select: function(args) {
-                                    if (isAdmin()) {
-                                        $.ajax({
-                                            url: createURL("listPods&zoneid=" + args.context.instances[0].zoneid),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                if (json.listpodsresponse.pod != undefined) {
-                                                    podObjs = json.listpodsresponse.pod;
-                                                    var items = [{
-                                                        id: -1,
-                                                        description: 'Default'
-                                                    }];
-                                                    $(podObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                } else {
-                                                    cloudStack.dialog.notice({
-                                                        message: _l('No Pods are available')
-                                                    });
-                                                }
-                                            }
-                                        });
-                                    } else {
-                                        args.response.success({
-                                            data: null
-                                        });
-                                    }
-                                  }
-                                },
-                                clusterId: {
-                                  label: 'label.cluster',
-                                  dependsOn: 'podId',
-                                  select: function(args) {
-                                      if (isAdmin()) {
-                                          var urlString = "listClusters&zoneid=" + args.context.instances[0].zoneid;
-                                          if (args.podId != -1) {
-                                             urlString += '&podid=' + args.podId;
-                                          }
-                                          $.ajax({
-                                              url: createURL(urlString),
-                                              dataType: "json",
-                                              async: true,
-                                              success: function(json) {
-                                                  if (json.listclustersresponse.cluster != undefined) {
-                                                      clusterObjs = json.listclustersresponse.cluster;
-                                                      var items = [{
-                                                          id: -1,
-                                                          description: 'Default'
-                                                      }];
-                                                      $(clusterObjs).each(function() {
-                                                          items.push({
-                                                              id: this.id,
-                                                              description: this.name
-                                                          });
-                                                      });
-                                                      args.response.success({
-                                                          data: items
-                                                      });
-                                                  } else {
-                                                      cloudStack.dialog.notice({
-                                                          message: _l('No Clusters are avaialble')
-                                                      });
-                                                  }
-                                              }
-                                          });
-
-                                      } else {
-                                          args.response.success({
-                                              data: null
-                                          });
-                                      }
-                                  }
-                                },
-                                hostId: {
-                                  label: 'label.host',
-                                  dependsOn: 'clusterId',
-                                  select: function(args) {
-                                      var urlString = "listHosts&state=Up&type=Routing&zoneid=" + args.context.instances[0].zoneid;
-                                      if (args.clusterId != -1) {
-                                          urlString += "&clusterid=" + args.clusterId;
-                                      }
-                                      if (isAdmin()) {
-                                          $.ajax({
-                                              url: createURL(urlString),
-                                              dataType: "json",
-                                              async: true,
-                                              success: function(json) {
-                                                  if (json.listhostsresponse.host != undefined) {
-                                                      hostObjs = json.listhostsresponse.host;
-                                                      var items = [{
-                                                          id: -1,
-                                                          description: 'Default'
-                                                      }];
-                                                      $(hostObjs).each(function() {
-                                                          items.push({
-                                                              id: this.id,
-                                                              description: this.name
-                                                          });
-                                                      });
-                                                      args.response.success({
-                                                          data: items
-                                                      });
-                                                  } else {
-                                                      cloudStack.dialog.notice({
-                                                          message: _l('No Hosts are avaialble')
-                                                      });
-                                                  }
-                                              }
-                                          });
-                                      } else {
-                                          args.response.success({
-                                              data: null
-                                          });
-                                      }
-                                  }
-                                },
-                                bootintosetup: {
-                                    label: 'label.enter.hardware.setup',
-                                    isBoolean: true,
-                                    isHidden: function(args) {
-                                       if (args.context.instances[0].hypervisor !== 'VMware') {
-                                         return true;
-                                       }
-                                         return false;
-                                       }
-                                }
-
-                            }
-                        },
-                        action: function(args) {
-                            var data = {
-                                id: args.context.instances[0].id
-                            }
-                            if (args.$form.find('.form-item[rel=podId]').css("display") != "none" && args.data.podId != -1) {
-                                $.extend(data, {
-                                    podid: args.data.podId
-                                });
-                            }
-                            if (args.$form.find('.form-item[rel=clusterId]').css("display") != "none" && args.data.clusterId != -1) {
-                                $.extend(data, {
-                                    clusterid: args.data.clusterId
-                                });
-                            }
-                            if (args.$form.find('.form-item[rel=hostId]').css("display") != "none" && args.data.hostId != -1) {
-                                $.extend(data, {
-                                    hostid: args.data.hostId
-                                });
-                            }
-                            var bootintosetup = (args.data.bootintosetup == "on");
-                            if (bootintosetup) {
-                                $.extend(data, {
-                                    bootintosetup : bootintosetup
-                                });
-                            }
-                            $.ajax({
-                                url: createURL("startVirtualMachine"),
-                                data: data,
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.startvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.start.instance';
-                            },
-                            notification: function(args) {
-                                return 'label.action.start.instance';
-                            },
-                            complete: function(args) {
-                                if (args.password != null) {
-                                    return 'label.vm.password' + ' ' + args.password;
-                                }
-
-                                return false;
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    stop: vmStopAction(),
-                    restart: {
-                        label: 'label.action.reboot.instance',
-                        compactLabel: 'label.reboot',
-                        createForm: {
-                            title: 'label.action.reboot.instance',
-                            desc: 'message.action.reboot.instance',
-                            preFilter: function(args) {
-                                args.$form.find('.form-item[rel=bootintosetup]').find('input').attr('checked', 'checked'); //checked
-                                args.$form.find('.form-item[rel=bootintosetup]').css('display', 'inline-block'); //shown
-                            },
-                            fields: {
-                                bootintosetup: {
-                                    label: 'label.enter.hardware.setup',
-                                    isBoolean: true,
-                                    isHidden: function(args) {
-                                      if (args.context.instances[0].hypervisor !== 'VMware') {
-                                        return true;
-                                      }
-                                      return false;
-                                    }
-                                }
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("rebootVirtualMachine"),
-                                dataType: "json",
-                                data: {
-                                    id: args.context.instances[0].id,
-                                    bootintosetup: (args.data.bootintosetup == "on")
-                                },
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.rebootvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.reboot.instance';
-                            },
-                            notification: function(args) {
-                                return 'label.action.reboot.instance';
-                            },
-                            complete: function(args) {
-                                if (args.password != null && args.password.length > 0)
-                                    return _l('message.password.has.been.reset.to') + ' ' + args.password;
-                                else
-                                    return null;
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    snapshot: vmSnapshotAction(),
-                    storageSnapshot: {
-                      messages: {
-                        notification: function() {
-                          return 'label.action.take.snapshot';
-                        }
-                      },
-                      label: 'label.action.vmstoragesnapshot.create',
-                      createForm: {
-                        title: 'label.action.vmstoragesnapshot.create',
-                        desc: 'message.action.vmstoragesnapshot.create',
-                        fields: {
-                          volume: {
-                            label: 'label.volume',
-                            docID: 'helpCreateInstanceStorageSnapshotVolume',
-                            select: function(args) {
-                              var items = [];
-                              var data = {
-                                virtualMachineId: args.context.instances[0].id
-                              };
-
-                              $.ajax({
-                                url: createURL('listVolumes'),
-                                data: data,
-                                dataType: 'json',
-                                async: false,
-                                success: function(json) {
-                                  var volumes = json.listvolumesresponse.volume;
-                                  args.context['volumes'] = volumes;
-                                  $(volumes).each(function(index, volume) {
-                                    items.push({
-                                      id: volume.id,
-                                      description: volume.name
-                                    });
-                                  });
-
-                                  args.response.success({
-                                    data: items
-                                  });
-                                }
-                              });
-                            }
-                          },
-                          quiescevm: {
-                            label: 'label.quiesce.vm',
-                            isBoolean: true,
-                            dependsOn: 'volume',
-                            isHidden: function(args) {
-                              var selectedVolumeId = $('div[role=dialog] form .form-item[rel=volume] select').val();
-                              for (var i = 0; i < args.context.volumes.length; i++) {
-                                var volume = args.context.volumes[i];
-                                if (volume.id === selectedVolumeId) {
-                                  return volume.quiescevm !== true;
-                                }
-                              }
-                              return false;
-                            }
-                          },
-                          name: {
-                            label: 'label.name',
-                            docID: 'helpCreateInstanceStorageSnapshotName',
-                            isInput: true
-                          },
-                          asyncBackup: {
-                            label: 'label.async.backup',
-                            isBoolean: true
-                          }
-                        }
-                      },
-                      action: function(args) {
-                        var data = {
-                          volumeId: args.data.volume,
-                          quiescevm: args.data.quiescevm === 'on',
-                          asyncBackup:  args.data.asyncBackup === 'on'
-                        };
-                        if (args.data.name != null && args.data.name.length > 0) {
-                          $.extend(data, {
-                            name: args.data.name
-                          });
-                        }
-                        $.ajax({
-                          url: createURL('createSnapshot'),
-                          data: data,
-                          dataType: 'json',
-                          async: true,
-                          success: function(json) {
-                            var jid = json.createsnapshotresponse.jobid;
-                            args.response.success({
-                              _custom: {
-                                jobId: jid,
-                                onComplete: function(json) {
-                                  var volumeId = json.queryasyncjobresultresponse.jobresult.snapshot.volumeid;
-                                  var snapshotId = json.queryasyncjobresultresponse.jobresult.snapshot.id;
-                                  cloudStack.dialog.notice({
-                                    message: 'Created snapshot for volume ' + volumeId + ' with snapshot ID ' + snapshotId
-                                  });
-                                }
-                              }
-                            });
-                          }
-                        });
-                      },
-                      notification: {
-                        poll: pollAsyncJobResult
-                      }
-                    },
-
-                    createBackup: {
-                      messages: {
-                        confirm: function(args) {
-                            return 'label.create.backup';
-                        },
-                        notification: function() {
-                            return 'label.create.backup';
-                        }
-                      },
-                      label: 'label.create.backup',
-                      action: function(args) {
-                        var data = {
-                          virtualmachineid: args.context.instances[0].id
-                        };
-                        $.ajax({
-                          url: createURL('createBackup'),
-                          data: data,
-                          dataType: 'json',
-                          success: function(json) {
-                            var jid = json.createbackupresponse.jobid;
-                            args.response.success({
-                              _custom: {
-                                jobId: jid
-                              }
-                            });
-                          }
-                        });
-                      },
-                      notification: {
-                        poll: pollAsyncJobResult
-                      }
-                    },
-
-                    configureBackupSchedule: {
-                      label: 'Backup Schedule',
-                      action: {
-                          custom: cloudStack.uiCustom.backupSchedule({
-                              desc: 'Configure VM backup schedule',
-                              dataProvider: function(args) {
-                                  $.ajax({
-                                      url: createURL('listBackupSchedule'),
-                                      data: {
-                                          virtualmachineid: args.context.instances[0].id
-                                      },
-                                      async: true,
-                                      dataType: 'json',
-                                      success: function(data) {
-                                          var schedule = {}
-                                          if (data && data.listbackupscheduleresponse && data.listbackupscheduleresponse.backupschedule) {
-                                            schedule = data.listbackupscheduleresponse.backupschedule;
-                                            schedule.id = schedule.virtualmachineid;
-                                            if (schedule.intervaltype == 'HOURLY') {
-                                              schedule.type = 0;
-                                              schedule.time = schedule.schedule;
-                                            } else if (schedule.intervaltype == 'DAILY') {
-                                              schedule.type = 1;
-                                              schedule.time = schedule.schedule.split(':')[1] + ':' + schedule.schedule.split(':')[0];
-                                            } else if (schedule.intervaltype == 'WEEKLY') {
-                                              schedule.type = 2;
-                                              schedule.time = schedule.schedule.split(':')[1] + ':' + schedule.schedule.split(':')[0];
-                                              schedule['day-of-week'] = schedule.schedule.split(':')[2];
-                                            } else if (schedule.intervaltype == 'MONTHLY') {
-                                              schedule.type = 3;
-                                              schedule.time = schedule.schedule.split(':')[1] + ':' + schedule.schedule.split(':')[0];
-                                              schedule['day-of-month'] = schedule.schedule.split(':')[2];
-                                            }
-                                            schedule.time = '(' + schedule.intervaltype + ') ' + schedule.time
-                                          }
-                                          args.response.success({
-                                              data: [schedule]
-                                          });
-                                      },
-                                      error: function(data) {
-                                      }
-                                  });
-                              },
-                              actions: {
-                                  add: function(args) {
-                                      var snap = args.snapshot;
-
-                                      var data = {
-                                          virtualmachineid: args.context.instances[0].id,
-                                          intervaltype: snap['snapshot-type'],
-                                          timezone: snap.timezone
-                                      };
-
-                                      var convertTime = function(minute, hour, meridiem, extra) {
-                                          var convertedHour = meridiem == 'PM' ?
-                                              (hour != 12 ? parseInt(hour) + 12 : 12) : (hour != 12 ? hour : '00');
-                                          var time = minute + ':' + convertedHour;
-                                          if (extra) time += ':' + extra;
-
-                                          return time;
-                                      };
-
-                                      switch (snap['snapshot-type']) {
-                                          case 'hourly': // Hourly
-                                              $.extend(data, {
-                                                  schedule: snap.schedule
-                                              });
-                                              break;
-
-                                          case 'daily': // Daily
-                                              $.extend(data, {
-                                                  schedule: convertTime(
-                                                      snap['time-minute'],
-                                                      snap['time-hour'],
-                                                      snap['time-meridiem']
-                                                  )
-                                              });
-                                              break;
-
-                                          case 'weekly': // Weekly
-                                              $.extend(data, {
-                                                  schedule: convertTime(
-                                                      snap['time-minute'],
-                                                      snap['time-hour'],
-                                                      snap['time-meridiem'],
-                                                      snap['day-of-week']
-                                                  )
-                                              });
-                                              break;
-
-                                          case 'monthly': // Monthly
-                                              $.extend(data, {
-                                                  schedule: convertTime(
-                                                      snap['time-minute'],
-                                                      snap['time-hour'],
-                                                      snap['time-meridiem'],
-                                                      snap['day-of-month']
-                                                  )
-                                              });
-                                              break;
-                                      }
-
-                                      $.ajax({
-                                          url: createURL('createBackupSchedule'),
-                                          data: data,
-                                          dataType: 'json',
-                                          async: true,
-                                          success: function(data) {
-                                              var schedule = {}
-                                              if (data && data.createbackupscheduleresponse && data.createbackupscheduleresponse.backupschedule) {
-                                                schedule = data.createbackupscheduleresponse.backupschedule;
-                                                schedule.id = schedule.virtualmachineid;
-                                                if (schedule.intervaltype == 'HOURLY') {
-                                                  schedule.type = 0;
-                                                  schedule.time = schedule.schedule;
-                                                } else if (schedule.intervaltype == 'DAILY') {
-                                                  schedule.type = 1;
-                                                  schedule.time = schedule.schedule.split(':')[1] + ':' + schedule.schedule.split(':')[0];
-                                                } else if (schedule.intervaltype == 'WEEKLY') {
-                                                  schedule.type = 2;
-                                                  schedule.time = schedule.schedule.split(':')[1] + ':' + schedule.schedule.split(':')[0];
-                                                  schedule['day-of-week'] = schedule.schedule.split(':')[2];
-                                                } else if (schedule.intervaltype == 'MONTHLY') {
-                                                  schedule.type = 3;
-                                                  schedule.time = schedule.schedule.split(':')[1] + ':' + schedule.schedule.split(':')[0];
-                                                  schedule['day-of-month'] = schedule.schedule.split(':')[2];
-                                                }
-                                                schedule.time = schedule.time + ' (' + schedule.intervaltype + ')'
-                                              }
-                                              args.response.success({
-                                                  data: schedule
-                                              });
-                                          }
-                                      });
-                                  },
-                                  remove: function(args) {
-                                      console.log(args);
-                                      $.ajax({
-                                          url: createURL('deleteBackupSchedule'),
-                                          data: {
-                                              virtualmachineid: args.context.instances[0].id
-                                          },
-                                          dataType: 'json',
-                                          async: true,
-                                          success: function(data) {
-                                              args.response.success();
-                                          }
-                                      });
-                                  }
-                              },
-
-                              // Select data
-                              selects: {
-                                  schedule: function(args) {
-                                      var time = [];
-
-                                      for (var i = 1; i <= 59; i++) {
-                                          time.push({
-                                              id: i,
-                                              name: i
-                                          });
-                                      }
-
-                                      args.response.success({
-                                          data: time
-                                      });
-                                  },
-                                  timezone: function(args) {
-                                      args.response.success({
-                                          data: $.map(timezoneMap, function(value, key) {
-                                              return {
-                                                  id: key,
-                                                  name: value
-                                              };
-                                          })
-                                      });
-                                  },
-                                  'day-of-week': function(args) {
-                                      args.response.success({
-                                          data: [{
-                                              id: 1,
-                                              name: 'label.sunday'
-                                          }, {
-                                              id: 2,
-                                              name: 'label.monday'
-                                          }, {
-                                              id: 3,
-                                              name: 'label.tuesday'
-                                          }, {
-                                              id: 4,
-                                              name: 'label.wednesday'
-                                          }, {
-                                              id: 5,
-                                              name: 'label.thursday'
-                                          }, {
-                                              id: 6,
-                                              name: 'label.friday'
-                                          }, {
-                                              id: 7,
-                                              name: 'label.saturday'
-                                          }]
-                                      });
-                                  },
-
-                                  'day-of-month': function(args) {
-                                      var time = [];
-
-                                      for (var i = 1; i <= 28; i++) {
-                                          time.push({
-                                              id: i,
-                                              name: i
-                                          });
-                                      }
-
-                                      args.response.success({
-                                          data: time
-                                      });
-                                  },
-
-                                  'time-hour': function(args) {
-                                      var time = [];
-
-                                      for (var i = 1; i <= 12; i++) {
-                                          time.push({
-                                              id: i,
-                                              name: i
-                                          });
-                                      }
-
-                                      args.response.success({
-                                          data: time
-                                      });
-                                  },
-
-                                  'time-minute': function(args) {
-                                      var time = [];
-
-                                      for (var i = 0; i <= 59; i++) {
-                                          time.push({
-                                              id: i < 10 ? '0' + i : i,
-                                              name: i < 10 ? '0' + i : i
-                                          });
-                                      }
-
-                                      args.response.success({
-                                          data: time
-                                      });
-                                  },
-
-                                  'time-meridiem': function(args) {
-                                      args.response.success({
-                                          data: [{
-                                              id: 'AM',
-                                              name: 'AM'
-                                          }, {
-                                              id: 'PM',
-                                              name: 'PM'
-                                          }]
-                                      });
-                                  }
-                              }
-                          })
-                      },
-                      messages: {
-                          notification: function(args) {
-                              return 'Backup Schedule';
-                          }
-                      }
-                    },
-
-                    assignToBackupOffering: {
-                      messages: {
-                        confirm: function(args) {
-                            return 'label.backup.offering.assign';
-                        },
-                        notification: function() {
-                            return 'label.backup.offering.assign';
-                        }
-                      },
-                      label: 'label.backup.offering.assign',
-                      createForm: {
-                          title: 'label.backup.offering.assign',
-                          fields: {
-                              backupofferingid: {
-                                  label: 'label.backup.offering',
-                                  select: function(args) {
-                                      var data = {
-                                          zoneid: args.context.instances[0].zoneid
-                                      };
-                                      $.ajax({
-                                          url: createURL('listBackupOfferings'),
-                                          data: data,
-                                          async: false,
-                                          success: function(json) {
-                                              var offerings = json.listbackupofferingsresponse.backupoffering;
-                                              var items = [{
-                                                  id: -1,
-                                                  description: ''
-                                              }];
-                                              $(offerings).each(function() {
-                                                  items.push({
-                                                      id: this.id,
-                                                      description: this.name
-                                                  });
-                                              });
-                                              args.response.success({
-                                                  data: items
-                                              });
-                                          }
-                                      });
-                                  }
-                              }
-                          }
-                      },
-                      action: function(args) {
-                        var data = {
-                          virtualmachineid: args.context.instances[0].id,
-                          backupofferingid: args.data.backupofferingid
-                        };
-                        $.ajax({
-                          url: createURL('assignVirtualMachineToBackupOffering'),
-                          data: data,
-                          dataType: 'json',
-                          success: function(json) {
-                            var jid = json.assignvirtualmachinetobackupofferingresponse.jobid;
-                            args.response.success({
-                              _custom: {
-                                jobId: jid
-                              }
-                            });
-                          }
-                        });
-                      },
-                      notification: {
-                        poll: pollAsyncJobResult
-                      }
-                    },
-
-                    removeFromBackupOffering: {
-                      messages: {
-                        confirm: function(args) {
-                            return 'label.backup.offering.remove';
-                        },
-                        notification: function() {
-                            return 'label.backup.offering.remove';
-                        }
-                      },
-                      label: 'label.backup.offering.remove',
-                      createForm: {
-                          title: 'label.backup.offering.remove',
-                          fields: {
-                              forced: {
-                                  label: 'force.remove',
-                                  isBoolean: true,
-                                  isChecked: false
-                              }
-                          }
-                      },
-                      action: function(args) {
-                        var data = {
-                          virtualmachineid: args.context.instances[0].id,
-                          forced: args.data.forced === "on"
-                        };
-                        $.ajax({
-                          url: createURL('removeVirtualMachineFromBackupOffering'),
-                          data: data,
-                          dataType: 'json',
-                          success: function(json) {
-                            var jid = json.removevirtualmachinefrombackupofferingresponse.jobid;
-                            args.response.success({
-                              _custom: {
-                                jobId: jid
-                              }
-                            });
-                          }
-                        });
-                      },
-                      notification: {
-                        poll: pollAsyncJobResult
-                      }
-                    },
-
-                    destroy: vmDestroyAction(),
-                    expunge: {
-                        label: 'label.action.expunge.instance',
-                        compactLabel: 'label.expunge',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.expunge.instance';
-                            },
-                            isWarning: true,
-                            notification: function(args) {
-                                return 'label.action.expunge.instance';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("expungeVirtualMachine&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.expungevirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    recover: {
-                        label: 'label.recover.vm',
-                        compactLabel: 'label.recover.vm',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.recover.vm';
-                            },
-                            notification: function(args) {
-                                return 'label.recover.vm';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("recoverVirtualMachine&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var item = json.recovervirtualmachineresponse.virtualmachine;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: function(args) {
-                                args.complete({
-                                    data: {
-                                        state: 'Stopped'
-                                    }
-                                });
-                            }
-                        }
-                    },
-                    reinstall: {
-                        label: 'label.reinstall.vm',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.reinstall.vm';
-                            },
-                            isWarning: true,
-                            notification: function(args) {
-                                return 'label.reinstall.vm';
-                            },
-                            complete: function(args) {
-                                if (args.password != null && args.password.length > 0)
-                                    return _l('label.password.reset.confirm') + args.password;
-                                else
-                                    return null;
-                            }
-                        },
-                        createForm: {
-                            title: 'label.reinstall.vm',
-                            desc: 'message.reinstall.vm',
-                            isWarning: true,
-                            fields: {
-                                template: {
-                                    label: 'label.select.a.template',
-                                    select: function(args) {
-                                        var data = {
-                                            templatefilter: 'executable'
-                                        };
-                                        $.ajax({
-                                            url: createURL('listTemplates'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                var templates = json.listtemplatesresponse.template;
-                                                var items = [{
-                                                    id: -1,
-                                                    description: ''
-                                                }];
-                                                $(templates).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.name
-                                                    });
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        },
-
-                        action: function(args) {
-                            var dataObj = {
-                                virtualmachineid: args.context.instances[0].id
-                            };
-                            if (args.data.template != -1) {
-                                $.extend(dataObj, {
-                                    templateid: args.data.template
-                                });
-                            }
-
-                            $.ajax({
-                                url: createURL("restoreVirtualMachine"),
-                                data: dataObj,
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.restorevmresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-
-                        },
-
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-
-                    },
-
-                    changeAffinity: {
-                        label: 'label.change.affinity',
-
-                        action: {
-                            custom: cloudStack.uiCustom.affinity({
-                                tierSelect: function(args) {
-                                    if ('vpc' in args.context) { //from VPC section
-                                        args.$tierSelect.show(); //show tier dropdown
-
-                                        $.ajax({ //populate tier dropdown
-                                            url: createURL("listNetworks"),
-                                            async: false,
-                                            data: {
-                                                vpcid: args.context.vpc[0].id,
-                                                //listAll: true,  //do not pass listAll to listNetworks under VPC
-                                                domainid: args.context.vpc[0].domainid,
-                                                account: args.context.vpc[0].account,
-                                                supportedservices: 'StaticNat'
-                                            },
-                                            success: function(json) {
-                                                var networks = json.listnetworksresponse.network;
-                                                var items = [{
-                                                    id: -1,
-                                                    description: 'message.select.tier'
-                                                }];
-                                                $(networks).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.displaytext
-                                                    });
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    } else { //from Guest Network section
-                                        args.$tierSelect.hide();
-                                    }
-
-                                    args.$tierSelect.change(function() {
-                                        args.$tierSelect.closest('.list-view').listView('refresh');
-                                    });
-                                    args.$tierSelect.closest('.list-view').listView('refresh');
-                                },
-
-                                listView: {
-                                    listView: {
-                                        id: 'affinityGroups',
-                                        fields: {
-                                            name: {
-                                                label: 'label.name'
-                                            },
-                                            type: {
-                                                label: 'label.type'
-                                            }
-                                        },
-                                        dataProvider: function(args) {
-                                            var data = {
-                                                domainid: args.context.instances[0].domainid,
-                                                account: args.context.instances[0].account
-                                            };
-                                            $.ajax({
-                                                url: createURL('listAffinityGroups'),
-                                                data: data,
-                                                async: false, //make it sync to avoid dataProvider() being called twice which produces duplicate data
-                                                success: function(json) {
-                                                    var items = [];
-                                                    var allAffinityGroups = json.listaffinitygroupsresponse.affinitygroup;
-                                                    var previouslySelectedAffinityGroups = args.context.instances[0].affinitygroup;
-                                                    if (allAffinityGroups != null) {
-                                                        for (var i = 0; i < allAffinityGroups.length; i++) {
-                                                            var isPreviouslySelected = false;
-                                                            if (previouslySelectedAffinityGroups != null) {
-                                                                for (var k = 0; k < previouslySelectedAffinityGroups.length; k++) {
-                                                                    if (previouslySelectedAffinityGroups[k].id == allAffinityGroups[i].id) {
-                                                                        isPreviouslySelected = true;
-                                                                        break; //break for loop
-                                                                    }
-                                                                }
-                                                            }
-                                                            items.push($.extend(allAffinityGroups[i], {
-                                                                _isSelected: isPreviouslySelected
-                                                            }));
-                                                        }
-                                                    }
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var affinityGroupIdArray = [];
-                                    if (args.context.affinityGroups != null) {
-                                        for (var i = 0; i < args.context.affinityGroups.length; i++) {
-                                            if (args.context.affinityGroups[i]._isSelected == true) {
-                                                affinityGroupIdArray.push(args.context.affinityGroups[i].id);
-                                            }
-                                        }
-                                    }
-                                    var data = {
-                                        id: args.context.instances[0].id,
-                                        affinitygroupids: affinityGroupIdArray.join(",")
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateVMAffinityGroup'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.updatevirtualmachineresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return vmActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            })
-                        },
-                        messages: {
-                            notification: function(args) {
-                                return 'label.change.affinity';
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    edit: {
-                        label: 'label.edit',
-                        action: function(args) {
-                            var data = {
-                                id: args.context.instances[0].id,
-                                group: args.data.group,
-                                isdynamicallyscalable: (args.data.isdynamicallyscalable == "on"),
-                                ostypeid: args.data.guestosid
-                            };
-                            if (args.data.displayname != args.context.instances[0].displayname) {
-                                $.extend(data, {
-                                    displayName: args.data.displayname
-                                });
-                            }
-                            if (args.data.name != args.context.instances[0].name) {
-                                $.extend(data, {
-                                    name: args.data.name
-                                });
-                            }
-                            $.ajax({
-                                url: createURL('updateVirtualMachine'),
-                                data: data,
-                                success: function(json) {
-                                    var item = json.updatevirtualmachineresponse.virtualmachine;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                }
-                            });
-
-
-                            //***** addResourceDetail *****
-                            //XenServer only (starts here)
-                            if(args.$detailView.find('form').find('div .detail-group').find('.xenserverToolsVersion61plus').length > 0) {
-                                $.ajax({
-                                    url: createURL('addResourceDetail'),
-                                    data: {
-                                        resourceType: 'uservm',
-                                        resourceId: args.context.instances[0].id,
-                                        'details[0].key': 'hypervisortoolsversion',
-                                        'details[0].value': (args.data.xenserverToolsVersion61plus == "on") ? 'xenserver61' : 'xenserver56'
-                                    },
-                                    success: function(json) {
-                                         var jobId = json.addResourceDetailresponse.jobid;
-                                         var addResourceDetailIntervalID = setInterval(function() {
-                                             $.ajax({
-                                                 url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                 dataType: "json",
-                                                 success: function(json) {
-                                                     var result = json.queryasyncjobresultresponse;
-
-                                                     if (result.jobstatus == 0) {
-                                                         return; //Job has not completed
-                                                     } else {
-                                                         clearInterval(addResourceDetailIntervalID);
-
-                                                         if (result.jobstatus == 1) {
-                                                             //do nothing
-                                                         } else if (result.jobstatus == 2) {
-                                                             cloudStack.dialog.notice({
-                                                                 message: _s(result.jobresult.errortext)
-                                                             });
-                                                         }
-                                                     }
-                                                 },
-                                                 error: function(XMLHttpResponse) {
-                                                     cloudStack.dialog.notice({
-                                                         message: parseXMLHttpResponse(XMLHttpResponse)
-                                                     });
-                                                 }
-                                             });
-                                         }, g_queryAsyncJobResultInterval);
-                                    }
-                                });
-                            }
-                            //XenServer only (ends here)
-
-                        }
-                    },
-
-                    attachISO: {
-                        label: 'label.action.attach.iso',
-                        createForm: {
-                            title: 'label.action.attach.iso',
-                            fields: {
-                                iso: {
-                                    label: 'label.iso',
-                                    select: function(args) {
-                                        var items = [];
-                                        var map = {};
-                                        $.ajax({
-                                            url: createURL("listIsos"),
-                                            data: {
-                                                isofilter: 'featured',
-                                                isReady: true,
-                                                zoneid: args.context.instances[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function(json) {
-                                                var isos = json.listisosresponse.iso;
-                                                $(isos).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.displaytext
-                                                    });
-                                                    map[this.id] = 1;
-                                                });
-                                            }
-                                        });
-                                        $.ajax({
-                                            url: createURL("listIsos"),
-                                            data: {
-                                                isofilter: 'community',
-                                                isReady: true,
-                                                zoneid: args.context.instances[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function(json) {
-                                                var isos = json.listisosresponse.iso;
-                                                $(isos).each(function() {
-                                                    if (!(this.id in map)) {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.displaytext
-                                                        });
-                                                        map[this.id] = 1;
-                                                    }
-                                                });
-                                            }
-                                        });
-                                        $.ajax({
-                                            url: createURL("listIsos"),
-                                            data: {
-                                                isofilter: 'selfexecutable',
-                                                isReady: true,
-                                                zoneid: args.context.instances[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function(json) {
-                                                var isos = json.listisosresponse.iso;
-                                                $(isos).each(function() {
-                                                    if (!(this.id in map)) {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.displaytext
-                                                        });
-                                                        map[this.id] = 1;
-                                                    }
-                                                });
-                                            }
-                                        });
-
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    }
-                                }
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("attachIso&virtualmachineid=" + args.context.instances[0].id + "&id=" + args.data.iso),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.attachisoresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            notification: function(args) {
-                                return 'label.action.attach.iso';
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    detachISO: {
-                        label: 'label.action.detach.iso',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.detach.iso.confirm';
-                            },
-                            notification: function(args) {
-                                return 'label.action.detach.iso';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("detachIso&virtualmachineid=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.detachisoresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    resetPassword: {
-                        label: 'label.action.reset.password',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.instance.reset.password';
-                            },
-                            notification: function(args) {
-                                return _l('label.action.reset.password');
-                            },
-                            complete: function(args) {
-                                return _l('message.password.has.been.reset.to') + ' ' + args.password;
-                            }
-                        },
-
-                        preAction: function(args) {
-                            var jsonObj = args.context.instances[0];
-                            if (jsonObj.passwordenabled == false) {
-                                cloudStack.dialog.notice({
-                                    message: 'message.reset.password.warning.notPasswordEnabled'
-                                });
-                                return false;
-                            } else if (jsonObj.state != 'Stopped') {
-                                cloudStack.dialog.notice({
-                                    message: 'message.reset.password.warning.notStopped'
-                                });
-                                return false;
-                            }
-                            return true;
-                        },
-
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("resetPasswordForVirtualMachine&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.resetpasswordforvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    createTemplate: {
-                        label: 'label.create.template',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.create.template';
-                            },
-                            notification: function(args) {
-                                return 'label.create.template';
-                            }
-                        },
-                        createForm: {
-                            title: 'label.create.template',
-                            desc: 'label.create.template',
-                            preFilter: cloudStack.preFilter.createTemplate,
-                            fields: {
-                                name: {
-                                    label: 'label.name',
-                                    validation: {
-                                        required: true
-                                    }
-                                },
-                                displayText: {
-                                    label: 'label.description',
-                                    validation: {
-                                        required: true
-                                    }
-                                },
-                                osTypeId: {
-                                    label: 'label.os.type',
-                                    select: function(args) {
-                                        if (ostypeObjs == undefined) {
-                                            $.ajax({
-                                                url: createURL("listOsTypes"),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    ostypeObjs = json.listostypesresponse.ostype;
-                                                }
-                                            });
-                                        }
-                                        var items = [];
-                                        $(ostypeObjs).each(function() {
-                                            items.push({
-                                                id: this.id,
-                                                description: this.description
-                                            });
-                                        });
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    }
-                                },
-                                isPublic: {
-                                    label: 'label.public',
-                                    isBoolean: true
-                                },
-                                url: {
-                                    label: 'image.directory',
-                                    validation: {
-                                        required: true
-                                    }
-                                }
-                            }
-                        },
-                        action: function(args) {
-                            var data = {
-                                virtualmachineid: args.context.instances[0].id,
-                                name: args.data.name,
-                                displayText: args.data.displayText,
-                                osTypeId: args.data.osTypeId,
-                                isPublic: (args.data.isPublic == "on"),
-                                url: args.data.url
-                            };
-
-                            $.ajax({
-                                url: createURL('createTemplate'),
-                                data: data,
-                                success: function(json) {
-                                    var jid = json.createtemplateresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return {}; //no properties in this VM needs to be updated
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    migrate: {
-                        label: 'label.migrate.instance.to.host',
-                        compactLabel: 'label.migrate.to.host',
-                        messages: {
-                            notification: function(args) {
-                                return 'label.migrate.instance.to.host';
-                            }
-                        },
-                        action: {
-                            custom: cloudStack.uiCustom.migrate({
-                                listView: {
-                                    listView: {
-                                        id: 'availableHosts',
-                                        fields: {
-                                            availableHostName: {
-                                                label: 'label.name'
-                                            },
-                                            availableHostSuitability: {
-                                                 label: 'label.suitability',
-                                                 indicator: {
-                                                    'Suitable': 'suitable',
-                                                    'Suitable-Storage migration required': 'suitable suitable-storage-migration-required',
-                                                    'Not Suitable': 'notsuitable',
-                                                    'Not Suitable-Storage migration required': 'notsuitable notsuitable-storage-migration-required'
-                                                 }
-                                            },
-                                            cpuused: {
-                                                label: 'label.cpu.utilized'
-                                            },
-                                            memoryused: {
-                                                label: 'label.memory.used'
-                                            }
-                                        },
-                                        dataProvider: function(args) {
-                                             var data = {
-                                                page: args.page,
-                                                pagesize: pageSize
-                                            };
-                                            if (args.filterBy.search.value) {
-                                                data.keyword = args.filterBy.search.value;
-                                            }
-                                            $.ajax({
-                                                url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.instances[0].id),
-                                                data: data,
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    if (json.findhostsformigrationresponse.host != undefined) {
-                                                        vmMigrationHostObjs = json.findhostsformigrationresponse.host;
-                                                        var items = [];
-                                                        $(vmMigrationHostObjs).each(function() {
-                                                            var suitability = (this.suitableformigration ? "Suitable" : "Not Suitable");
-                                                            if (this.requiresStorageMotion == true) {
-                                                                suitability += ("-Storage migration required");
-                                                            }
-                                                            items.push({
-                                                                id: this.id,
-                                                                availableHostName: this.name,
-                                                                availableHostSuitability: suitability,
-                                                                requiresStorageMotion: this.requiresStorageMotion,
-                                                                cpuused: this.cpuused,
-                                                                memoryused: (parseFloat(this.memoryused)/(1024.0*1024.0*1024.0)).toFixed(2) + ' GB'
-                                                            });
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    } else {
-                                                        args.response.success({
-                                                            data: null
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var selectedHostObj;
-                                    if (args.context.selectedHost != null && args.context.selectedHost.length > 0) {
-                                        selectedHostObj = args.context.selectedHost[0];
-                                        if (selectedHostObj.requiresStorageMotion == true) {
-                                            $.ajax({
-                                                url: createURL("migrateVirtualMachineWithVolume&hostid=" + selectedHostObj.id + "&virtualmachineid=" + args.context.instances[0].id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var jid = json.migratevirtualmachinewithvolumeresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function(json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                                            },
-                                                            getActionFilter: function() {
-                                                                return vmActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        } else {
-                                            $.ajax({
-                                                url: createURL("migrateVirtualMachine&hostid=" + selectedHostObj.id + "&virtualmachineid=" + args.context.instances[0].id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var jid = json.migratevirtualmachineresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function(json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                                            },
-                                                            getActionFilter: function() {
-                                                                return vmActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                }
-                            })
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    migrateToAnotherStorage: {
-                        label: 'label.migrate.instance.to.ps',
-                        compactLabel: 'label.migrate.to.storage',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.migrate.instance.to.ps';
-                            },
-                            notification: function(args) {
-                                return 'label.migrate.instance.to.ps';
-                            }
-                        },
-                        createForm: {
-                            title: 'label.migrate.instance.to.ps',
-                            desc: '',
-                            fields: {
-                                storageId: {
-                                    label: 'label.primary.storage',
-                                    validation: {
-                                        required: true
-                                    },
-                                    select: function(args) {
-                                        $.ajax({
-                                            url: createURL("listStoragePools&zoneid=" + args.context.instances[0].zoneid),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var pools = json.liststoragepoolsresponse.storagepool;
-                                                var items = [];
-                                                $(pools).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.name
-                                                    });
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("migrateVirtualMachine&storageid=" + args.data.storageId + "&virtualmachineid=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.migratevirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    scaleUp: {
-                        label: 'label.change.service.offering',
-                        createForm: {
-                            title: 'label.change.service.offering',
-                            desc: function(args) {
-                                var description = '';
-                                var vmObj = args.jsonObj;
-                                if (vmObj.state == 'Running' && vmObj.hypervisor == 'VMware') {
-                                    description = 'message.read.admin.guide.scaling.up';
-                                }
-                                return description;
-                            },
-                            fields: {
-                                serviceofferingid: {
-                                    label: 'label.compute.offering',
-                                    select: function(args) {
-                                        var serviceofferingObjs;
-                                        $.ajax({
-                                            url: createURL("listServiceOfferings&VirtualMachineId=" + args.context.instances[0].id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                serviceofferingObjs = json.listserviceofferingsresponse.serviceoffering;
-                                                var items = [];
-                                                if (serviceofferingObjs != null) {
-                                                    for (var i = 0; i < serviceofferingObjs.length; i++) {
-                                                        items.push({
-                                                            id: serviceofferingObjs[i].id,
-                                                            description: serviceofferingObjs[i].name
-                                                        });
-                                                    }
-                                                }
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-
-                                        args.$select.change(function(){
-                                            var $form = $(this).closest('form');
-
-                                            var serviceofferingid = $(this).val();
-                                            if (serviceofferingid == null || serviceofferingid.length == 0)
-                                                return;
-
-                                            var items = [];
-                                            var selectedServiceofferingObj;
-                                            if (serviceofferingObjs != null) {
-                                                for (var i = 0; i < serviceofferingObjs.length; i++) {
-                                                    if (serviceofferingObjs[i].id == serviceofferingid) {
-                                                        selectedServiceofferingObj = serviceofferingObjs[i];
-                                                        break;
-                                                    }
-                                                }
-                                            }
-                                            if (selectedServiceofferingObj == undefined)
-                                                return;
-
-                                            if (selectedServiceofferingObj.iscustomized == true) {
-                                                if (selectedServiceofferingObj.cpuspeed) {
-                                                    $form.find('.form-item[rel=cpuSpeed]').hide();
-                                                } else {
-                                                    $form.find('.form-item[rel=cpuSpeed]').css('display', 'inline-block');
-                                                }
-                                                $form.find('.form-item[rel=cpuNumber]').css('display', 'inline-block');
-                                                $form.find('.form-item[rel=memory]').css('display', 'inline-block');
-                                            } else {
-                                                $form.find('.form-item[rel=cpuSpeed]').hide();
-                                                $form.find('.form-item[rel=cpuNumber]').hide();
-                                                $form.find('.form-item[rel=memory]').hide();
-                                            }
-                                        });
-                                    }
-                                },
-                                cpuSpeed: {
-                                    label: 'label.cpu.mhz',
-                                    validation: {
-                                        required: true,
-                                        number: true
-                                    },
-                                    isHidden: true
-                                },
-                                cpuNumber: {
-                                    label: 'label.num.cpu.cores',
-                                    validation: {
-                                        required: true,
-                                        number: true
-                                    },
-                                    isHidden: true
-                                },
-                                memory: {
-                                    label: 'label.memory.mb',
-                                    validation: {
-                                        required: true,
-                                        number: true
-                                    },
-                                    isHidden: true
-                                }
-                            }
-                        },
-
-                        action: function(args) {
-                            var data = {
-                                id: args.context.instances[0].id,
-                                serviceofferingid: args.data.serviceofferingid
-                            };
-
-                            if (args.$form.find('.form-item[rel=cpuSpeed]').is(':visible')) {
-                                $.extend(data, {
-                                    'details[0].cpuSpeed': args.data.cpuSpeed
-                                });
-                            }
-                            if (args.$form.find('.form-item[rel=cpuNumber]').is(':visible')) {
-                                $.extend(data, {
-                                    'details[0].cpuNumber': args.data.cpuNumber
-                                });
-                            }
-                            if (args.$form.find('.form-item[rel=memory]').is(':visible')) {
-                                $.extend(data, {
-                                    'details[0].memory': args.data.memory
-                                });
-                            }
-
-                            $.ajax({
-                                url: createURL('scaleVirtualMachine'),
-                                data: data,
-                                success: function(json) {
-                                    var jid = json.scalevirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-
-                                },
-                                error: function(json) {
-                                    args.response.error(parseXMLHttpResponse(json));
-                                }
-
-                            });
-                        },
-                        messages: {
-                            notification: function(args) {
-                                return 'label.change.service.offering';  //CLOUDSTACK-7744
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    resetSSHKeyForVirtualMachine: {
-                        label: 'label.reset.ssh.key.pair',
-                        createForm: {
-                            title: 'label.reset.ssh.key.pair.on.vm',
-                            desc: 'message.desc.reset.ssh.key.pair',
-                            fields: {
-                                sshkeypair: {
-                                    label: 'label.new.ssh.key.pair',
-                                    validation: {
-                                        required: true
-                                    },
-                                    select: function(args) {
-                                        var data = {
-                                            domainid: args.context.instances[0].domainid,
-                                            account: args.context.instances[0].account,
-                                            listAll: true
-                                        };
-
-                                        $.ajax({
-                                            url: createURL("listSSHKeyPairs"),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                var items = [];
-                                                var sshkeypairs = json.listsshkeypairsresponse.sshkeypair;
-                                                if (sshkeypairs == null) {
-                                                } else {
-                                                    for (var i = 0; i < sshkeypairs.length; i++) {
-                                                        var sshkeypair = sshkeypairs[i];
-                                                        if (sshkeypair.name != args.context.instances[0].keypair) {
-                                                            items.push({
-                                                                id: sshkeypair.name,
-                                                                description: sshkeypair.name
-                                                            });
-                                                        }
-                                                    }
-                                                }
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        },
-
-                        action: function(args) {
-                            var data = {
-                                domainid: args.context.instances[0].domainid,
-                                account: args.context.instances[0].account,
-                                id: args.context.instances[0].id,
-                                keypair: args.data.sshkeypair
-                            };
-
-                            $.ajax({
-                                url: createURL("resetSSHKeyForVirtualMachine"),
-                                data: data,
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.resetSSHKeyforvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return vmActionfilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            notification: function(args) {
-                                return _l('label.reset.ssh.key.pair.on.vm');
-                            },
-                            complete: function(args) {
-                                if (args.password != null) {
-                                    return _l('message.password.of.the.vm.has.been.reset.to') + ' ' + args.password;
-                                }
-
-                                return false;
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    assignVmToAnotherAccount: {
-                        label: 'label.assign.instance.another',
-                        createForm: {
-                            title: 'label.assign.instance.another',
-                            desc: 'message.assign.instance.another',
-                            preFilter: function(args) {
-                                var zone;
-                                $.ajax({
-                                    url: createURL('listZones'),
-                                    data: {
-                                        id: args.context.instances[0].zoneid
-                                    },
-                                    async: false,
-                                    success: function(json) {
-                                        zone = json.listzonesresponse.zone[0];
-                                    }
-                                });
-                                if (zone.securitygroupsenabled == true) {
-                                    args.$form.find('.form-item[rel=securitygroup]').css('display', 'inline-block');
-                                } else {
-                                    args.$form.find('.form-item[rel=securitygroup]').hide();
-                                }
-                            },
-                            fields: {
-                                accountType: {
-                                    label: 'Account Type',
-                                    select: function(args) {
-                                        var items = [];
-                                        items.push({id: 'account', description: 'Account'});
-                                        items.push({id: 'project', description: 'Project'});
-                                        args.response.success({data: items});
-
-                                        args.$select.change(function() {
-                                            var $form = $(this).closest('form');
-                                            var $account = $form.find('.form-item[rel=account]');
-                                            var $project = $form.find('.form-item[rel=project]');
-
-                                            var accountType = $(this).val();
-                                            if (accountType == 'account') { // Account
-                                                $account.css('display', 'inline-block');
-                                                $project.hide();
-                                            } else if (accountType == 'project') { // Project
-                                                $project.css('display', 'inline-block');
-                                                $account.hide();
-                                            }
-                                        });
-                                    }
-                                },
-                                domainid: {
-                                    label: 'label.domain',
-                                    validation: {
-                                        required: true
-                                    },
-                                    select: function(args) {
-                                        $.ajax({
-                                            url: createURL('listDomains'),
-                                            data: {
-                                                listAll: true,
-                                                details: 'min'
-                                            },
-                                            success: function(json) {
-                                                var array1 = [];
-                                                var domains = json.listdomainsresponse.domain;
-                                                if (domains != null && domains.length > 0) {
-                                                    for (var i = 0; i < domains.length; i++) {
-                                                        array1.push({
-                                                            id: domains[i].id,
-                                                            description: domains[i].path
-                                                        });
-                                                    }
-                                                }
-                                                            array1.sort(function(a, b) {
-                                                                return a.description.localeCompare(b.description);
-                                                            });
-                                                args.response.success({
-                                                    data: array1
-                                                });
-                                            }
-                                        });
-                                    }
-                                },
-                                account: {
-                                    label: 'label.account',
-                                    dependsOn: 'domainid',
-                                    validation: {
-                                        required: true
-                                    },
-                                    select: function(args) {
-                                        var dataObj = {
-                                            domainId: args.domainid,
-                                            state: 'Enabled',
-                                            listAll: true,
-                                        };
-                                        $.ajax({
-                                            url: createURL('listAccounts', {
-                                                details: 'min',
-                                                ignoreProject: true
-                                            }),
-                                            data: dataObj,
-                                            success: function(json) {
-                                                accountObjs = json.listaccountsresponse.account;
-                                                var items = [{
-                                                    id: null,
-                                                    description: ''
-                                                }];
-                                                $(accountObjs).each(function() {
-                                                    items.push({
-                                                        id: this.name,
-                                                        description: this.name
-                                                    });
-                                                })
-
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    },
-                                },
-                                project: {
-                                    label: 'label.project',
-                                    dependsOn: 'domainid',
-                                    validation: {
-                                        required: true
-                                    },
-                                    select: function(args) {
-                                        var dataObj = {
-                                            domainId: args.domainid,
-                                            state: 'Active',
-                                            details: 'min',
-                                            listAll: true,
-                                        };
-                                        $.ajax({
-                                            url: createURL('listProjects', {
-                                                ignoreProject: true
-                                            }),
-                                            data: dataObj,
-                                            success: function(json) {
-                                                projectObjs = json.listprojectsresponse.project;
-                                                var items = [{
-                                                    id: null,
-                                                    description: ''
-                                                }];
-                                                $(projectObjs).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.name
-                                                    });
-                                                })
-
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    },
-                                },
-                                network: {
-                                    label: 'label.network',
-                                    dependsOn: ['accountType', 'domainid', 'account', 'project'],
-                                    select: function(args) {
-                                        var dataObj = {
-                                            domainId: args.domainid,
-                                            listAll: true,
-                                            isrecursive: false
-                                        };
-                                        if (args.data.accountType == 'account' && args.data.account != null && args.data.account != '') {
-                                            $.extend(dataObj, {
-                                                account: args.data.account
-                                            });
-                                        } else if (args.data.accountType == 'project' && args.data.project != null && args.data.project != '') {
-                                            $.extend(dataObj, {
-                                                projectid: args.data.project
-                                            });
-                                        } else {
-                                            args.response.success({
-                                                data: null
-                                            });
-                                            return;
-                                        }
-                                        $.ajax({
-                                            url: createURL('listNetworks', {
-                                                ignoreProject: true
-                                            }),
-                                            data: dataObj,
-                                            success: function(json) {
-                                                var networkObjs = json.listnetworksresponse.network;
-                                                var items = [{
-                                                    id: null,
-                                                    description: ''
-                                                }];
-                                                $(networkObjs).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.name
-                                                    });
-                                                })
-
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    },
-                                },
-                                securitygroup: {
-                                    label: 'label.security.group',
-                                    dependsOn: ['accountType', 'domainid', 'account', 'project'],
-                                    select: function(args) {
-                                        var dataObj = {
-                                            domainId: args.domainid,
-                                            listAll: true,
-                                            isrecursive: false
-                                        };
-                                        if (args.data.accountType == 'account' && args.data.account != null && args.data.account != '') {
-                                            $.extend(dataObj, {
-                                                account: args.data.account
-                                            });
-                                        } else if (args.data.accountType == 'project' && args.data.project != null && args.data.project != '') {
-                                            $.extend(dataObj, {
-                                                projectid: args.data.project
-                                            });
-                                        } else {
-                                            args.response.success({
-                                                data: null
-                                            });
-                                            return;
-                                        }
-                                        $.ajax({
-                                            url: createURL('listSecurityGroups', {
-                                                ignoreProject: true
-                                            }),
-                                            data: dataObj,
-                                            success: function(json) {
-                                                var sgObjs = json.listsecuritygroupsresponse.securitygroup;
-                                                var items = [{
-                                                    id: null,
-                                                    description: ''
-                                                }];
-                                                $(sgObjs).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.name
-                                                    });
-                                                })
-
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    },
-                                },
-                            }
-                        },
-                        action: function(args) {
-                            var dataObj = {
-                                virtualmachineid: args.context.instances[0].id,
-                                domainid: args.data.domainid,
-                            };
-                            var ignoreProject = false;
-                            if (args.data.accountType == 'account') {
-                                ignoreProject = true;
-                                $.extend(dataObj, {
-                                    account: args.data.account
-                                });
-                            } else if (args.data.accountType == 'project') {
-                                $.extend(dataObj, {
-                                    projectid: args.data.project
-                                });
-                            }
-                            if (args.data.network != null && args.data.network != '') {
-                                $.extend(dataObj, {
-                                    networkIds: args.data.network
-                                });
-                            } 
-                            if (args.data.securitygroup != null && args.data.securitygroup != '') {
-                                $.extend(dataObj, {
-                                    securitygroupIds: args.data.securitygroup
-                                });
-                            }
-
-                            $.ajax({
-                                url: createURL('assignVirtualMachine', {
-                                    ignoreProject: ignoreProject
-                                }),
-                                data: dataObj,
-                                success: function(json) {
-                                    var item = json.assignvirtualmachineresponse.virtualmachine;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                },
-                                error: function(data) {
-                                    args.response.error(parseXMLHttpResponse(data));
-                                }
-                            });
-                        },
-                        messages: {
-                            notification: function(args) {
-                                return 'label.assign.instance.another';
-                            }
-                        },
-                        notification: {
-                            poll: function(args) {
-                                args.complete();
-                            }
-                        }
-                    },
-
-                    viewConsole: {
-                        label: 'label.view.console',
-                        action: {
-                            externalLink: {
-                                url: function(args) {
-                                    return clientConsoleUrl + '?cmd=access&vm=' + args.context.instances[0].id;
-                                },
-                                title: function(args) {
-                                    return args.context.instances[0].id.substr(0, 8); //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                },
-                                width: 820,
-                                height: 640
-                            }
-                        }
-                    }
-                },
-                tabs: {
-                    // Details tab
-                    details: {
-                        title: 'label.details',
-
-                        preFilter: function(args) {
-                            var hiddenFields;
-                            if (isAdmin()) {
-                                hiddenFields = [];
-                            } else {
-                                hiddenFields = ["hypervisor"];
-                            }
-
-                            if ('instances' in args.context && args.context.instances[0].hypervisor != 'XenServer') {
-                                  hiddenFields.push('xenserverToolsVersion61plus');
-                            }
-
-                            if ('instances' in args.context && args.context.instances[0].guestosid != undefined) {
-                                if (ostypeObjs == undefined) {
-                                    $.ajax({
-                                        url: createURL("listOsTypes"),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function(json) {
-                                            ostypeObjs = json.listostypesresponse.ostype;
-                                        }
-                                    });
-                                }
-                                if (ostypeObjs != undefined) {
-                                    var ostypeName;
-                                    for (var i = 0; i < ostypeObjs.length; i++) {
-                                        if (ostypeObjs[i].id == args.context.instances[0].guestosid) {
-                                            ostypeName = ostypeObjs[i].description;
-                                            break;
-                                        }
-                                    }
-                                    if (ostypeName == undefined || ostypeName.indexOf("Win") == -1) {
-                                        hiddenFields.push('xenserverToolsVersion61plus');
-                                    }
-                                }
-                            }
-
-                            if (!args.context.instances[0].publicip) {
-                                hiddenFields.push('publicip');
-                            }
-
-                            if (!isAdmin()) {
-                                hiddenFields.push('instancename');
-                            }
-
-                            return hiddenFields;
-                        },
-
-                        fields: [{
-                            displayname: {
-                                label: 'label.display.name',
-                                isEditable: true
-                            },
-                            name: {
-                                label: 'label.host.name'
-                            },
-                            state: {
-                                label: 'label.state',
-                                pollAgainIfValueIsIn: {
-                                    'Starting': 1,
-                                    'Stopping': 1
-                                },
-                                pollAgainFn: function(context) {
-                                    var toClearInterval = false;
-                                    $.ajax({
-                                        url: createURL("listVirtualMachines&id=" + context.instances[0].id),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function(json) {
-                                            var jsonObj = json.listvirtualmachinesresponse.virtualmachine[0];
-                                            if (jsonObj.state != context.instances[0].state) {
-                                                toClearInterval = true; //to clear interval
-                                            }
-                                        }
-                                    });
-                                    return toClearInterval;
-                                }
-                            },
-                            templatename: {
-                                label: 'label.template'
-                            },
-
-                            isdynamicallyscalable: {
-                                label: 'label.dynamically.scalable',
-                                isBoolean: true,
-                                isEditable: true,
-                                converter: cloudStack.converters.toBooleanText
-                            },
-
-                            guestosid: {
-                                label: 'label.os.type',
-                                isEditable: true,
-                                select: function(args) {
-                                    if (ostypeObjs == undefined) {
-                                        $.ajax({
-                                            url: createURL("listOsTypes"),
-                                            dataType: "json",
-                                            async: false,
-                                            success: function(json) {
-                                                ostypeObjs = json.listostypesresponse.ostype;
-                                            }
-                                        });
-                                    }
-                                    var items = [];
-                                    $(ostypeObjs).each(function() {
-                                        items.push({
-                                            id: this.id,
-                                            description: this.description
-                                        });
-                                    });
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            },
-
-                            hypervisor: {
-                                label: 'label.hypervisor'
-                            },
-
-                            xenserverToolsVersion61plus: {
-                                label: 'label.Xenserver.Tools.Version61plus',
-                                isBoolean: true,
-                                isEditable: true,
-                                converter: cloudStack.converters.toBooleanText
-                            },
-
-                            isoname: {
-                                label: 'label.attached.iso'
-                            },
-
-                            serviceofferingname: {
-                                label: 'label.compute.offering'
-                            },
-                            cpunumber: {
-                                label: 'label.num.cpu.cores'
-                            },
-                            cpuspeed: {
-                                label: 'label.cpu.mhz'
-                            },
-                            memory: {
-                                label: 'label.memory.mb'
-                            },
-                            vgpu: {
-                                label: 'label.vgpu'
-                            },
-                            haenable: {
-                                label: 'label.ha.enabled',
-                                converter: cloudStack.converters.toBooleanText
-                            },
-                            publicip: {
-                                label: 'label.public.ip'
-                            },
-
-                            group: {
-                                label: 'label.group',
-                                isEditable: true
-                            },
-                            zonename: {
-                                label: 'label.zone.name',
-                                isEditable: false
-                            },
-                            hostname: {
-                                label: 'label.host'
-                            },
-                            publicip: {
-                                label: 'label.public.ip'
-                            },
-                            keypair: {
-                                label: 'label.ssh.key.pair'
-                            },
-                            backupofferingname: {
-                                label: 'label.backup.offering'
-                            },
-                            domain: {
-                                label: 'label.domain'
-                            },
-                            account: {
-                                label: 'label.account'
-                            },
-                            created: {
-                                label: 'label.created',
-                                converter: cloudStack.converters.toLocalDate
-                            },
-                            name: {
-                                label: 'label.name',
-                                isEditable: true
-                            },
-                            id: {
-                                label: 'label.id'
-                            },
-                            boottype: {
-                                label: 'label.vm.boottype'
-                            },
-                            bootmode: {
-                                 label: 'label.vm.bootmode'
-                            }
-                        }],
-
-                        tags: cloudStack.api.tags({
-                            resourceType: 'UserVm',
-                            contextId: 'instances'
-                        }),
-
-                        dataProvider: function(args) {
-                            $.ajax({
-                                url: createURL("listVirtualMachines&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jsonObj;
-                                    if (json.listvirtualmachinesresponse.virtualmachine != null && json.listvirtualmachinesresponse.virtualmachine.length > 0)
-                                        jsonObj = json.listvirtualmachinesresponse.virtualmachine[0];
-                                    else if (isAdmin())
-                                        jsonObj = $.extend(args.context.instances[0], {
-                                            state: "Expunged"
-                                        }); //after root/domain admin expunge a VM, listVirtualMachines API will no longer returns this expunged VM to all users.
-                                    else
-                                        jsonObj = $.extend(args.context.instances[0], {
-                                            state: "Destroyed"
-                                        }); //after a regular user destroys a VM, listVirtualMachines API will no longer returns this destroyed VM to the regular user.
-
-                                    if ('details' in jsonObj && 'hypervisortoolsversion' in jsonObj.details) {
-                                        if (jsonObj.details.hypervisortoolsversion == 'xenserver61')
-                                            jsonObj.xenserverToolsVersion61plus = true;
-                                        else
-                                            jsonObj.xenserverToolsVersion61plus = false;
-                                    }
-
-                                    $(window).trigger('cloudStack.module.sharedFunctions.addExtraProperties', {
-                                        obj: jsonObj,
-                                        objType: "UserVM"
-                                    });
-
-                                    args.response.success({
-                                        actionFilter: vmActionfilter,
-                                        data: jsonObj
-                                    });
-                                }
-                            });
-                        }
-                    },
-
-                    /**
-                     * NICs tab
-                     */
-                    nics: {
-                        title: 'label.nics',
-                        multiple: true,
-                        actions: {
-                            add: {
-                                label: 'label.network.addVM',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.network.addVMNIC';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.network.addVM';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.network.addVM',
-                                    desc: 'message.network.addVM.desc',
-                                    fields: {
-                                        networkid: {
-                                            label: 'label.network',
-                                            select: function(args) {
-                                                var data1 = {
-                                                    zoneid: args.context.instances[0].zoneid
-                                                };
-                                                if (isAdmin()) {
-                                                    $.extend(data1, {
-                                                        listAll: true
-                                                    });
-                                                } else {
-                                                    $.extend(data1, {
-                                                        account: args.context.instances[0].account,
-                                                        domainid: args.context.instances[0].domainid
-                                                    });
-                                                }
-                                                $.ajax({
-                                                    url: createURL('listNetworks'),
-                                                    data: data1,
-                                                    success: function(json) {
-                                                        var networkObjs = json.listnetworksresponse.network;
-                                                        var nicObjs = args.context.instances[0].nic;
-                                                        var items = [];
-
-                                                        for (var i = 0; i < networkObjs.length; i++) {
-                                                            var networkObj = networkObjs[i];
-                                                            var isNetworkExists = false;
-
-                                                            for (var j = 0; j < nicObjs.length; j++) {
-                                                                if (nicObjs[j].networkid == networkObj.id) {
-                                                                    isNetworkExists = true;
-                                                                    break;
-                                                               }
-                                                            }
-
-                                                            if (!isNetworkExists) {
-                                                                items.push({
-                                                                    id: networkObj.id,
-                                                                    description: networkObj.name
-                                                                });
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        ipaddress: {
-                                            label: 'label.ip.address',
-                                            validation: {
-                                                required: false,
-                                                ipv4: true
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var dataObj = {
-                                        virtualmachineid: args.context.instances[0].id,
-                                        networkid: args.data.networkid,
-                                    };
-
-                                    if (args.data.ipaddress) {
-                                        dataObj.ipaddress = args.data.ipaddress;
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('addNicToVirtualMachine'),
-                                        data: dataObj,
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.addnictovirtualmachineresponse.jobid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            makeDefault: {
-                                label: 'label.set.default.NIC',
-                                messages: {
-                                    confirm: function() {
-                                        return 'message.set.default.NIC';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.set.default.NIC'
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('updateDefaultNicForVirtualMachine'),
-                                        data: {
-                                            virtualmachineid: args.context.instances[0].id,
-                                            nicid: args.context.nics[0].id
-                                        },
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.updatedefaultnicforvirtualmachineresponse.jobid
-                                                }
-                                            });
-                                            cloudStack.dialog.notice({
-                                                message: _l('message.set.default.NIC.manual')
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            updateIpaddr: {
-                                label: 'label.change.ipaddress',
-                                messages: {
-                                    confirm: function() {
-                                        return 'message.change.ipaddress';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.change.ipaddress';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.change.ipaddress',
-                                    desc: 'message.change.ipaddress',
-                                    preFilter: function(args) {
-                                        if (args.context.nics != null && args.context.nics[0].type == 'Isolated') {
-                                            args.$form.find('.form-item[rel=ipaddress1]').css('display', 'inline-block'); //shown text
-                                            args.$form.find('.form-item[rel=ipaddress2]').hide();
-                                        } else if (args.context.nics != null && args.context.nics[0].type == 'Shared') {
-                                            args.$form.find('.form-item[rel=ipaddress2]').css('display', 'inline-block'); //shown list
-                                            args.$form.find('.form-item[rel=ipaddress1]').hide();
-                                        }
-                                    },
-                                    fields: {
-                                        ipaddress1: {
-                                            label: 'label.ip.address'
-                                        },
-                                        ipaddress2: {
-                                            label: 'label.ip.address',
-                                            select: function(args) {
-                                                if (args.context.nics != null && args.context.nics[0].type == 'Shared') {
-                                                    $.ajax({
-                                                        url: createURL('listPublicIpAddresses'),
-                                                        data: {
-                                                            allocatedonly: false,
-                                                            networkid: args.context.nics[0].networkid,
-                                                            forvirtualnetwork: false
-                                                        },
-                                                        success: function(json) {
-                                                            var ips = json.listpublicipaddressesresponse.publicipaddress;
-                                                            var items = [{
-                                                                id: -1,
-                                                                description: ''
-                                                            }];
-                                                            $(ips).each(function() {
-                                                                if (this.state == "Free") {
-                                                                    items.push({
-                                                                        id: this.ipaddress,
-                                                                        description: this.ipaddress
-                                                                    });
-                                                                }
-                                                            });
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                } else {
-                                                    args.response.success({
-                                                        data: null
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var dataObj = {
-                                        nicId: args.context.nics[0].id
-                                    };
-
-                                    if (args.data.ipaddress1) {
-                                        dataObj.ipaddress = args.data.ipaddress1;
-                                    } else if (args.data.ipaddress2 != -1) {
-                                        dataObj.ipaddress = args.data.ipaddress2;
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('updateVmNicIp'),
-                                        data: dataObj,
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.updatevmnicipresponse.jobid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            // Remove NIC/Network from VM
-                            remove: {
-                                label: 'label.action.delete.nic',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.nic';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.nic';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('removeNicFromVirtualMachine'),
-                                        data: {
-                                            virtualmachineid: args.context.instances[0].id,
-                                            nicid: args.context.nics[0].id
-                                        },
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.removenicfromvirtualmachineresponse.jobid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                                    }
-                                                }
-                                            })
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        preFilter: function(args) {
-                            var hiddenFields;
-                            if (isAdmin()) {
-                                hiddenFields = [];
-                            } else {
-                                hiddenFields = ["broadcasturi", "isolationuri"];
-                            }
-
-                            return hiddenFields;
-                        },
-                        fields: [{
-                            id: {
-                                label: 'label.id'
-                            },
-                            name: {
-                                label: 'label.name',
-                                header: true
-                            },
-                            networkname: {
-                                label: 'label.network.name'
-                            },
-                            type: {
-                                label: 'label.type'
-                            },
-                            macaddress: {
-                              label: 'label.mac.address'
-                            },
-                            ipaddress: {
-                                label: 'label.ip.address'
-                            },
-                            secondaryips: {
-                                label: 'label.secondary.ips'
-                            },
-                            gateway: {
-                                label: 'label.gateway'
-                            },
-                            netmask: {
-                                label: 'label.netmask'
-                            },
-
-                            ip6address: {
-                                label: 'label.ipv6.address'
-                            },
-                            ip6gateway: {
-                                label: 'label.ipv6.gateway'
-                            },
-                            ip6cidr: {
-                                label: 'label.ipv6.CIDR'
-                            },
-                            broadcasturi : {
-                                label: 'label.broadcast.uri'
-                            },
-                            isolationuri : {
-                                label: 'label.isolation.uri'
-                            },
-                            isdefault: {
-                                label: 'label.is.default',
-                                converter: function(data) {
-                                    return data ? _l('label.yes') : _l('label.no');
-                                }
-                            }
-                        }],
-                        viewAll: {
-                            path: 'network.secondaryNicIps',
-                            attachTo: 'secondaryips',
-                            label: 'label.edit.secondary.ips',
-                            title: function(args) {
-                                var title = _l('label.menu.ipaddresses') + ' - ' + args.context.nics[0].name;
-
-                                return title;
-                            }
-                        },
-                        dataProvider: function(args) {
-                            $.ajax({
-                                url: createURL("listVirtualMachines&details=nics&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    // Handling the display of network name for a VM under the NICS tabs
-                                    args.response.success({
-                                        actionFilter: function(args) {
-                                            if (args.context.item.isdefault) {
-                                                return ['updateIpaddr'];
-                                            } else {
-                                                return ['remove', 'makeDefault', 'updateIpaddr'];
-                                            }
-                                        },
-                                        data: $.map(json.listvirtualmachinesresponse.virtualmachine[0].nic, function(nic, index) {
-                                            if (nic.secondaryip != null) {
-                                                var secondaryips = "";
-                                                for (var i = 0; i < nic.secondaryip.length; i++) {
-                                                    if (i == 0)
-                                                        secondaryips = nic.secondaryip[i].ipaddress;
-                                                    else
-                                                        secondaryips = secondaryips + " , " + nic.secondaryip[i].ipaddress;
-                                                }
-                                                $.extend(nic, {
-                                                    secondaryips: secondaryips
-                                                })
-                                            }
-
-                                            var name = 'NIC ' + (index + 1);
-                                            if (nic.isdefault) {
-                                                name += ' (' + _l('label.default') + ')';
-                                            }
-                                            return $.extend(nic, {
-                                                name: name
-                                            });
-                                        })
-                                    });
-                                }
-                            });
-                        }
-                    },
-
-                    /**
-                     * Security Groups tab
-                     */
-                    securityGroups: {
-                        title: 'label.menu.security.groups',
-                        multiple: true,
-                        fields: [{
-                            id: {
-                                label: 'label.id'
-                            },
-                            name: {
-                                label: 'label.name'
-                            },
-                            description: {
-                                label: 'label.description'
-                            }
-                        }],
-                        viewAll: {
-                            path: 'network.securityGroups',
-                            attachTo: 'id',
-                            label: 'label.security.groups',
-                            title: function(args) {
-                                var title = _l('label.security.groups');
-
-                                return title;
-                            }
-                        },
-                        dataProvider: function(args) {
-                            // args.response.success({data: args.context.instances[0].securitygroup});
-                            $.ajax({
-                                url: createURL("listVirtualMachines&details=secgrp&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    args.response.success({
-                                        data: json.listvirtualmachinesresponse.virtualmachine[0].securitygroup
-                                    });
-                                }
-
-                            });
-                        }
-                    },
-
-                    /**
-                     * Statistics tab
-                     */
-                    stats: {
-                        title: 'label.statistics',
-                        fields: {
-                            totalCPU: {
-                                label: 'label.total.cpu'
-                            },
-                            cpuused: {
-                                label: 'label.cpu.utilized'
-                            },
-                            memorykbs: {
-                                label: 'label.memory.used'
-                            },
-                            networkkbsread: {
-                                label: 'label.network.read'
-                            },
-                            networkkbswrite: {
-                                label: 'label.network.write'
-                            },
-                            diskkbsread: {
-                                label: 'label.disk.read.bytes'
-                            },
-                            diskkbswrite: {
-                                label: 'label.disk.write.bytes'
-                            },
-                            diskioread: {
-                                label: 'label.disk.read.io'
-                            },
-                            diskiowrite: {
-                                label: 'label.disk.write.io'
-                            }
-                        },
-                        dataProvider: function(args) {
-                            $.ajax({
-                                url: createURL("listVirtualMachines&details=stats&id=" + args.context.instances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jsonObj = json.listvirtualmachinesresponse.virtualmachine[0];
-                                    args.response.success({
-                                        data: {
-                                            totalCPU: jsonObj.cpunumber + " x " + cloudStack.converters.convertHz(jsonObj.cpuspeed),
-                                            cpuused: jsonObj.cpuused,
-                                            memorykbs: jsonObj.memorykbs + " of "+ cloudStack.converters.convertBytes(jsonObj.memory * 1024.0 * 1024.0),
-                                            networkkbsread: (jsonObj.networkkbsread == null) ? "N/A" : cloudStack.converters.convertBytes(jsonObj.networkkbsread * 1024),
-                                            networkkbswrite: (jsonObj.networkkbswrite == null) ? "N/A" : cloudStack.converters.convertBytes(jsonObj.networkkbswrite * 1024),
-                                            diskkbsread: (jsonObj.diskkbsread == null) ? "N/A" : ((jsonObj.hypervisor == "KVM") ? cloudStack.converters.convertBytes(jsonObj.diskkbsread * 1024) : ((jsonObj.hypervisor == "XenServer") ? cloudStack.converters.convertBytes(jsonObj.diskkbsread * 1024) + "/s" : "N/A")),
-                                            diskkbswrite: (jsonObj.diskkbswrite == null) ? "N/A" : ((jsonObj.hypervisor == "KVM") ? cloudStack.converters.convertBytes(jsonObj.diskkbswrite * 1024) : ((jsonObj.hypervisor == "XenServer") ? cloudStack.converters.convertBytes(jsonObj.diskkbswrite * 1024) + "/s" : "N/A")),
-                                            diskioread: (jsonObj.diskioread == null) ? "N/A" : ((jsonObj.hypervisor == "KVM") ? jsonObj.diskioread : "N/A"),
-                                            diskiowrite: (jsonObj.diskiowrite == null) ? "N/A" : ((jsonObj.hypervisor == "KVM") ? jsonObj.diskiowrite : "N/A")
-                                        }
-                                    });
-                                }
-                            });
-                        }
-                    },
-					
-					/**
-                     * Settings tab
-                     */
-					settings: {
-						title: 'label.settings',
-						custom: cloudStack.uiCustom.granularDetails({
-                        resourceType: 'UserVm',
-							dataProvider: function(args) {
-							    // no paging for listVirtualMachines details
-							    if (args.page > 1) {
-							        args.response.success({
-							            data: []
-							        });
-							        return;
-							    }
-								$.ajax({
-									url: createURL('listVirtualMachines&id=' + args.context.instances[0].id),
-									success: function(json) {
-                                        var virtualMachine = json.listvirtualmachinesresponse.virtualmachine[0];
-                                        args.response.success({
-                                            data: parseDetails(virtualMachine.details)
-                                        });
-
-                                        if (virtualMachine.state != 'Stopped') {
-                                            $('#details-tab-settings').append($('<div>').addClass('blocking-overlay'));
-                                            cloudStack.dialog.notice({
-                                                message: _l('message.action.settings.warning.vm.running')
-                                            });
-                                        } else {
-                                            if(virtualMachine && virtualMachine.readonlyuidetails && virtualMachine.readonlyuidetails.length > 0) {
-                                                var readOnlyUIDetails = []
-                                                $.each(virtualMachine.readonlyuidetails.split(","), function(){
-                                                    readOnlyUIDetails.push($.trim(this));
-                                                });
-                                                $('#details-tab-settings tr').each(function() {
-                                                    if($.inArray($.trim($(this).find('td:first').text()), readOnlyUIDetails) >= 0) {
-                                                        $(this).find('td:last div.action').each(function() {
-                                                            $(this).addClass("disabled")
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        };
-									},
-
-									error: function(json) {
-										args.response.error(parseXMLHttpResponse(json));
-									}
-								});
-
-							},
-							actions: {
-								edit: function(args) {
-									var data = {
-										name: args.data.jsonObj.name,
-										value: args.data.value
-									};
-									var virtualMachine;
-									$.ajax({
-										url: createURL('listVirtualMachines&id=' + args.context.instances[0].id),
-										async:false,
-										success: function(json) {
-											virtualMachine = json.listvirtualmachinesresponse.virtualmachine[0];
-										},
-
-										error: function(json) {
-											args.response.error(parseXMLHttpResponse(json));
-										}
-									});
-                                    if (virtualMachine && virtualMachine.state == "Stopped") {
-                                        // It could happen that a stale web page has been opened up when VM was stopped but
-                                        // vm was turned on through another route - UI or API. so we should check again.
-                                        var existingDetails = virtualMachine.details;
-                                        var readOnlyUIDetails = [];
-                                        if (virtualMachine.readonlyuidetails && virtualMachine.readonlyuidetails.length > 0) {
-                                            $.each(virtualMachine.readonlyuidetails.split(","), function(){
-                                                readOnlyUIDetails.push($.trim(this));
-                                            });
-                                        }
-                                        var newDetails = {};
-                                        for (d in existingDetails) {
-                                            if (d != data.name && $.inArray(d, readOnlyUIDetails) < 0) {
-                                                newDetails['details[0].' + d] = existingDetails[d];
-                                            }
-                                        }
-                                        newDetails['details[0].' + data.name] = data.value;
-                                        var postData = {'id' : args.context.instances[0].id};
-                                        $.extend(postData, newDetails);
-                                        $.ajax({
-                                            url: createURL('updateVirtualMachine'),
-                                            data: postData,
-                                            async:false,
-                                            success: function(json) {
-                                                var items = json.updatevirtualmachineresponse.virtualmachine.details;
-                                                args.response.success({
-                                                    data: parseDetails(items)
-                                                });
-                                            },
-                                            error: function(json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    } else {
-                                        $('#details-tab-settings').append($('<div>').addClass('blocking-overlay'));
-                                        cloudStack.dialog.notice({
-                                            message: _l('message.action.settings.warning.vm.started')
-                                        });
-                                    }
-                                },
-								remove: function(args) {
-									var virtualMachine;
-									$.ajax({
-										url: createURL('listVirtualMachines&id=' + args.context.instances[0].id),
-										async:false,
-										success: function(json) {
-											virtualMachine = json.listvirtualmachinesresponse.virtualmachine[0];
-										},
-
-										error: function(json) {
-											args.response.error(parseXMLHttpResponse(json));
-										}
-									});
-                                    if (virtualMachine && virtualMachine.state == "Stopped") {
-                                        // It could happen that a stale web page has been opened up when VM was stopped but
-                                        // vm was turned on through another route - UI or API. so we should check again.
-                                        var detailToDelete = args.data.jsonObj.name;
-                                        var existingDetails = virtualMachine.details;
-                                        var readOnlyUIDetails = [];
-                                        if (virtualMachine.readonlyuidetails && virtualMachine.readonlyuidetails.length > 0) {
-                                            $.each(virtualMachine.readonlyuidetails.split(","), function(){
-                                                readOnlyUIDetails.push($.trim(this));
-                                            });
-                                        }
-                                        var newDetails = {};
-                                        for (detail in existingDetails) {
-                                            if (detail != detailToDelete && $.inArray(detail, readOnlyUIDetails) < 0) {
-                                                newDetails['details[0].' + detail] = existingDetails[detail];
-                                            }
-                                        }
-
-                                        var postData = $.isEmptyObject(newDetails) ? {'cleanupdetails': true} : newDetails;
-                                        $.extend(postData, {'id' : args.context.instances[0].id});
-                                        $.ajax({
-                                            url: createURL('updateVirtualMachine'),
-                                            data: postData,
-                                            async:false,
-                                            success: function(json) {
-                                                var items = json.updatevirtualmachineresponse.virtualmachine.details;
-                                                args.response.success({
-                                                    data: parseDetails(items)
-                                                });
-                                            },
-                                            error: function(json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    } else {
-                                        $('#details-tab-settings').append($('<div>').addClass('blocking-overlay'));
-                                        cloudStack.dialog.notice({
-                                            message: _l('message.action.settings.warning.vm.started')
-                                        });
-                                    }
-								},
-								add: function(args) {
-									var name = args.data.name;
-									var value = args.data.value;
-									
-									var details;
-                                    var readOnlyUIDetails = [];
-									$.ajax({
-										url: createURL('listVirtualMachines&id=' + args.context.instances[0].id),
-										async:false,
-										success: function(json) {
-                                            var virtualMachine = json.listvirtualmachinesresponse.virtualmachine[0]
-										    if (virtualMachine) {
-                                                details = virtualMachine.details;
-                                                if (virtualMachine.readonlyuidetails && virtualMachine.readonlyuidetails.length > 0) {
-                                                    $.each(virtualMachine.readonlyuidetails.split(","), function(){
-                                                        readOnlyUIDetails.push($.trim(this));
-                                                    });
-                                                }
-                                            }
-										},
-
-										error: function(json) {
-											args.response.error(parseXMLHttpResponse(json));
-										}
-									});
-									
-									var detailsFormat = '';
-									for (key in details) {
-									    if ($.inArray(key, readOnlyUIDetails) < 0) {
-									        detailsFormat += "details[0]." + key + "=" + details[key] + "&";
-									    }
-									}
-									// Add new detail to the existing ones
-									detailsFormat += "details[0]." + name + "=" + value;
-									$.ajax({
-										url: createURL('updateVirtualMachine&id=' + args.context.instances[0].id + "&" + detailsFormat),
-										async: false,
-										success: function(json) {
-											var items = json.updatevirtualmachineresponse.virtualmachine.details;
-											args.response.success({
-												data: parseDetails(items)
-											});
-										},
-										error: function(json) {
-											args.response.error(parseXMLHttpResponse(json));
-										}
-									});
-								}
-							}
-						})
-					}
-                }
-            }
-        }
-    };
-	
-	var parseDetails = function(details) {
-		var listDetails = [];
-		for (detail in details){
-			var det = {};
-			det["name"] = detail;
-			det["value"] = details[detail];
-			listDetails.push(det);
-		}
-		return listDetails;
-	}
-
-    var vmActionfilter = cloudStack.actionFilter.vmActionFilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-
-        if (jsonObj.state == 'Destroyed') {
-            if (g_allowUserExpungeRecoverVm) {
-                allowedActions.push("recover");
-            }
-
-            if (g_allowUserExpungeRecoverVm) {
-                allowedActions.push("expunge");
-            }
-        } else if (jsonObj.state == 'Running') {
-            allowedActions.push("stop");
-            allowedActions.push("restart");
-
-            if (jsonObj.hypervisor != 'LXC') {
-                allowedActions.push("snapshot");
-                allowedActions.push("storageSnapshot");
-            }
-
-            allowedActions.push("destroy");
-            allowedActions.push("reinstall");
-
-            //when userVm is running, scaleUp is not supported for KVM, LXC
-            if (jsonObj.hypervisor != 'KVM' && jsonObj.hypervisor != 'LXC') {
-                allowedActions.push("scaleUp");
-            }
-
-            if (isAdmin())
-                allowedActions.push("migrate");
-
-            if (jsonObj.isoid == null)
-                allowedActions.push("attachISO");
-            else
-                allowedActions.push("detachISO");
-
-            allowedActions.push("resetPassword");
-
-            if (jsonObj.hypervisor == "BareMetal") {
-                allowedActions.push("createTemplate");
-            }
-
-            allowedActions.push("viewConsole");
-            allowedActions.push("resetSSHKeyForVirtualMachine");
-        } else if (jsonObj.state == 'Stopped') {
-            allowedActions.push("edit");
-            if (isAdmin())
-                allowedActions.push("startByAdmin");
-            else
-                allowedActions.push("start");
-            allowedActions.push("destroy");
-            allowedActions.push("reinstall");
-
-            if (jsonObj.hypervisor != 'KVM' && jsonObj.hypervisor != 'LXC') {
-                allowedActions.push("snapshot");
-                allowedActions.push("storageSnapshot");
-            }
-
-            allowedActions.push("scaleUp");  //when vm is stopped, scaleUp is supported for all hypervisors
-            allowedActions.push("changeAffinity");
-
-            if (isAdmin())
-                allowedActions.push("migrateToAnotherStorage");
-
-            if (jsonObj.isoid == null) {
-                allowedActions.push("attachISO");
-            } else {
-                allowedActions.push("detachISO");
-            }
-            allowedActions.push("resetPassword");
-            if (jsonObj.hypervisor == "BareMetal") {
-                allowedActions.push("createTemplate");
-            }
-
-            if (isAdmin() || isDomainAdmin()) {
-                allowedActions.push("assignVmToAnotherAccount");
-            }
-            allowedActions.push("resetSSHKeyForVirtualMachine");
-        } else if (jsonObj.state == 'Starting') {
-            //  allowedActions.push("stop");
-        } else if (jsonObj.state == 'Error') {
-            allowedActions.push("destroy");
-        } else if (jsonObj.state == 'Expunging') {
-            if (g_allowUserExpungeRecoverVm) {
-                allowedActions.push("expunge");
-            }
-        }
-        if (jsonObj.backupofferingid) {
-            allowedActions.push("createBackup");
-            allowedActions.push("configureBackupSchedule");
-            allowedActions.push("removeFromBackupOffering");
-        } else {
-            allowedActions.push("assignToBackupOffering");
-        }
-
-        if (jsonObj.state == 'Starting' || jsonObj.state == 'Stopping' || jsonObj.state == 'Migrating') {
-            allowedActions.push("viewConsole");
-        }
-
-        return allowedActions;
-    }
-
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/lbCertificatePolicy.js b/ui/legacy/scripts/lbCertificatePolicy.js
deleted file mode 100644
index c9af682..0000000
--- a/ui/legacy/scripts/lbCertificatePolicy.js
+++ /dev/null
@@ -1,194 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    cloudStack.lbCertificatePolicy = {
-        dialog: function(args) {
-            return function(args) {
-                var success = args.response.success;
-                var context = args.context;
-
-                var certid = {
-                    certificate: {
-                        label: 'label.certificate.name',
-                        select: function(args) {
-                            var data = {};
-                            var item = {};
-
-                            if (context != null) {
-                                if (context.networks != null) {
-                                    $.extend(data, {account: context.networks[0].account});
-                                    $.extend(data, {domain: context.networks[0].domain});
-                                }
-                            }
-
-                            $.extend(data, {
-                                details: 'min'
-                            });
-
-                            $.ajax({
-                                url: createURL('listAccounts'),
-                                async: false,
-                                data: data,
-                                success: function(json) {
-                                    var items = json.listaccountsresponse.account;
-                                    $.extend(item, {accountid: items[0].id});
-                                }
-                            });
-
-                            $.ajax({
-                                url: createURL('listSslCerts'),
-                                async: false,
-                                data: item,
-                                success: function(json) {
-                                    if(!json.listsslcertsresponse || !json.listsslcertsresponse.sslcert){
-                                        args.response.success({
-                                            data: {id: 'No certificates ID', 
-                                                    description: 'No certificates found'}
-                                        });
-                                        return;
-                                    }
-                                    var items = json.listsslcertsresponse.sslcert;
-                                    args.response.success({
-                                        data: $.map(items, function(item) {
-                                                return {
-                                                    id: item.id,
-                                                    description: item.id
-                                                };
-                                            })
-                                    });
-                                }
-                            });
-                        }
-                    }
-                };
-
-                var $item = args.$item;
-
-                cloudStack.dialog.createForm({
-                    form: {
-                        title: 'Configure Certificate',
-                        desc: 'Please complete the following fields',
-                        fields: certid
-                    },
-                    after: function(args) {
-                        // Remove fields not applicable to sticky method
-                        args.$form.find('.form-item:hidden').remove();
-
-                        var data = cloudStack.serializeForm(args.$form);
-
-                        /* $item indicates that this is an existing sticky rule;
-               re-create sticky rule with new parameters */
-                        if ($item) {
-                            var $loading = $('<div>').addClass('loading-overlay');
-
-                            $loading.prependTo($item);
-                            cloudStack.lbStickyPolicy.actions.recreate(
-                                $item.data('multi-custom-data').id,
-                                $item.data('multi-custom-data').lbRuleID,
-                                data,
-                                function() { // Complete
-                                    $(window).trigger('cloudStack.fullRefresh');
-                                },
-                                function(error) { // Error
-                                    $(window).trigger('cloudStack.fullRefresh');
-                                }
-                            );
-                        } else {
-                            success({
-                                data: data
-                            });
-                        }
-                    }
-                });
-            };
-        },
-
-        actions: {
-            add: function(lbRuleID, data, complete, error) {
-
-                $.ajax({
-                    url: createURL('assignCertToLoadBalancer'),
-                    data: {certid: data.certificate, lbruleid: lbRuleID},
-                    success: function(json) {
-                        cloudStack.ui.notifications.add({
-                                desc: 'Add new LB Certificate',
-                                section: 'Network',
-                                poll: pollAsyncJobResult,
-                                _custom: {
-                                    jobId: json.assigncerttoloadbalancerresponse.jobid
-                                }
-                            },
-                            complete, {},
-                            error, {}
-                        );
-                    },
-                    error: function(json) {
-                        complete();
-                        cloudStack.dialog.notice({
-                            message: parseXMLHttpResponse(json)
-                        });
-                    }
-                });
-            },
-            'delete': function(stickyRuleID, complete, error) {
-                $.ajax({
-                    url: createURL('deleteLBStickinessPolicy'),
-                    data: {
-                        id: stickyRuleID
-                    },
-                    success: function(json) {
-                        cloudStack.ui.notifications.add({
-                                desc: 'Remove previous LB sticky rule',
-                                section: 'Network',
-                                poll: pollAsyncJobResult,
-                                _custom: {
-                                    jobId: json.deleteLBstickinessrruleresponse.jobid
-                                }
-                            },
-                            complete, {},
-                            error, {}
-                        );
-                    },
-                    error: function(json) {
-                        complete();
-                        cloudStack.dialog.notice({
-                            message: parseXMLHttpResponse(json)
-                        });
-                    }
-                });
-            },
-            recreate: function(stickyRuleID, lbRuleID, data, complete, error) {
-                var addStickyPolicy = function() {
-                    cloudStack.lbStickyPolicy.actions.add(
-                        lbRuleID,
-                        data,
-                        complete,
-                        error
-                    );
-                };
-
-                // Delete existing rule
-                if (data.methodname !== 'None') {
-                    addStickyPolicy();
-                } else {
-                    cloudStack.lbStickyPolicy.actions['delete'](stickyRuleID, complete, error);
-                }
-            }
-        }
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/lbStickyPolicy.js b/ui/legacy/scripts/lbStickyPolicy.js
deleted file mode 100644
index 6d61976..0000000
--- a/ui/legacy/scripts/lbStickyPolicy.js
+++ /dev/null
@@ -1,319 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    cloudStack.lbStickyPolicy = {
-        dialog: function(args) {
-            return function(args) {
-                var success = args.response.success;
-                var context = args.context;
-
-                var network;
-                if ('vpc' in args.context) { //from VPC section
-                    var data = {
-                        listAll: true,
-                        supportedservices: 'Lb'
-                    };
-                    if (args.context.ipAddresses[0].associatednetworkid == null) {
-                        $.extend(data, {
-                            vpcid: args.context.vpc[0].id
-                        });
-                    } else {
-                        $.extend(data, {
-                            id: args.context.ipAddresses[0].associatednetworkid
-                        });
-                    }
-
-                    $.ajax({
-                        url: createURL("listNetworks"), //check whether the VPC has a network including Lb service
-                        data: data,
-                        async: false,
-                        success: function(json) {
-                            var items = json.listnetworksresponse.network;
-                            if (items != null && items.length > 0) {
-                                network = items[0];
-                            }
-                        }
-                    });
-                } else { //from Guest Network section
-                    network = args.context.networks[0];
-                }
-
-                var $item = args.$item;
-
-                var lbService = $.grep(network.service, function(service) {
-                    return service.name == 'Lb';
-                })[0];
-
-                var stickinessCapabilities = JSON.parse($.grep(
-                    lbService.capability,
-                    function(capability) {
-                        return capability.name == 'SupportedStickinessMethods';
-                    }
-                )[0].value);
-
-                var baseFields = {
-                    stickyName: {
-                        label: 'label.sticky.name',
-                        validation: {
-                            required: true
-                        }
-                    }
-                };
-
-                $.map(
-                    $.map(
-                        stickinessCapabilities,
-                        function(c) {
-                            return c.paramlist;
-                        }
-                    ),
-                    function(p) {
-                        baseFields[p.paramname] = {
-                            label: _l('label.sticky.' + p.paramname),
-                            isHidden: true,
-                            isBoolean: p.isflag,
-                            validation: {
-                                required: p.required
-                            }
-                        };
-                    }
-                );
-
-                var conditionalFields = {
-                    methodname: {
-                        label: 'label.stickiness.method',
-                        select: function(args) {
-                            var $select = args.$select;
-                            var $form = $select.closest('form');
-                            var stickyOptions = [];
-
-                            stickinessCapabilities.push({
-                                methodname: 'None',
-                                paramlist: []
-                            });
-                            $(stickinessCapabilities).each(function() {
-                                var stickyCapability = this;
-
-                                stickyOptions.push({
-                                    id: stickyCapability.methodname,
-                                    description: stickyCapability.methodname
-                                });
-                            });
-
-                            stickyOptions = stickyOptions.sort(function() {
-                                return this.id != 'None';
-                            });
-
-                            args.response.success({
-                                data: stickyOptions
-                            }, 500);
-
-                            $select.change(function() {
-                                var value = $select.val();
-                                var showFields = [];
-                                var targetMethod = $.grep(stickinessCapabilities, function(stickyCapability) {
-                                    return stickyCapability.methodname == value;
-                                })[0];
-                                var visibleParams = $.map(targetMethod.paramlist, function(param) {
-                                    return param.paramname;
-                                });
-
-                                $select.closest('.form-item').siblings('.form-item').each(function() {
-                                    var $field = $(this);
-                                    var id = $field.attr('rel');
-
-                                    if ($.inArray(id, visibleParams) > -1) {
-                                        $field.css('display', 'inline-block');
-                                        $field.attr('sticky-method', value);
-                                    } else {
-                                        $field.hide();
-                                        $field.attr('sticky-method', null);
-                                    }
-                                });
-
-                                // Name always is required
-                                if ($select.val() != 'None') {
-                                    $select.closest('.form-item').siblings('.form-item[rel=stickyName]')
-                                        .css('display', 'inline-block');
-                                }
-
-                                $select.closest(':ui-dialog').dialog('option', 'position', 'center');
-                            });
-                        }
-                    }
-                };
-
-                var fields = $.extend(conditionalFields, baseFields);
-
-                if (args.data) {
-                    var populatedFields = $.map(fields, function(field, id) {
-                        return id;
-                    });
-
-                    $(populatedFields).each(function() {
-                        var id = this;
-                        var field = fields[id];
-                        var dataItem = args.data[id];
-
-                        if (field.isBoolean) {
-                            field.isChecked = dataItem ? true : false;
-                        } else {
-                            field.defaultValue = dataItem;
-                        }
-                    });
-                }
-
-                cloudStack.dialog.createForm({
-                    form: {
-                        title: 'label.configure.sticky.policy',
-                        desc: 'label.please.complete.the.following.fields',
-                        fields: fields
-                    },
-                    after: function(args) {
-                        // Remove fields not applicable to sticky method
-                        args.$form.find('.form-item:hidden').remove();
-
-                        var data = cloudStack.serializeForm(args.$form);
-
-                        /* $item indicates that this is an existing sticky rule;
-               re-create sticky rule with new parameters */
-                        if ($item) {
-                            var $loading = $('<div>').addClass('loading-overlay');
-
-                            $loading.prependTo($item);
-                            cloudStack.lbStickyPolicy.actions.recreate(
-                                $item.data('multi-custom-data').id,
-                                $item.data('multi-custom-data').lbRuleID,
-                                data,
-                                function() { // Complete
-                                    $(window).trigger('cloudStack.fullRefresh');
-                                },
-                                function(error) { // Error
-                                    $(window).trigger('cloudStack.fullRefresh');
-                                }
-                            );
-                        } else {
-                            success({
-                                data: data
-                            });
-                        }
-                    }
-                });
-            };
-        },
-
-        actions: {
-            add: function(lbRuleID, data, complete, error) {
-                var stickyURLData = '';
-                var stickyParams = $.map(data, function(value, key) {
-                    return key;
-                });
-
-                var notParams = ['methodname', 'stickyName'];
-
-                var index = 0;
-                $(stickyParams).each(function() {
-                    var param = '&param[' + index + ']';
-                    var name = this.toString();
-                    var value = data[name];
-
-                    if (!value || $.inArray(name, notParams) > -1) return true;
-                    if (value == 'on') value = true;
-
-                    stickyURLData += param + '.name=' + name + param + '.value=' + value;
-
-                    index++;
-
-                    return true;
-                });
-
-                $.ajax({
-                    url: createURL('createLBStickinessPolicy' + stickyURLData),
-                    data: {
-                        lbruleid: lbRuleID,
-                        name: data.stickyName,
-                        methodname: data.methodname
-                    },
-                    success: function(json) {
-                        cloudStack.ui.notifications.add({
-                                desc: 'message.desc.add.new.lb.sticky.rule',
-                                section: 'Network',
-                                poll: pollAsyncJobResult,
-                                _custom: {
-                                    jobId: json.createLBStickinessPolicy.jobid
-                                }
-                            },
-                            complete, {},
-                            error, {}
-                        );
-                    },
-                    error: function(json) {
-                        complete();
-                        cloudStack.dialog.notice({
-                            message: parseXMLHttpResponse(json)
-                        });
-                    }
-                });
-            },
-            'delete': function(stickyRuleID, complete, error) {
-                $.ajax({
-                    url: createURL('deleteLBStickinessPolicy'),
-                    data: {
-                        id: stickyRuleID
-                    },
-                    success: function(json) {
-                        cloudStack.ui.notifications.add({
-                                desc: 'Remove previous LB sticky rule',
-                                section: 'Network',
-                                poll: pollAsyncJobResult,
-                                _custom: {
-                                    jobId: json.deleteLBstickinessrruleresponse.jobid
-                                }
-                            },
-                            complete, {},
-                            error, {}
-                        );
-                    },
-                    error: function(json) {
-                        complete();
-                        cloudStack.dialog.notice({
-                            message: parseXMLHttpResponse(json)
-                        });
-                    }
-                });
-            },
-            recreate: function(stickyRuleID, lbRuleID, data, complete, error) {
-                var addStickyPolicy = function() {
-                    cloudStack.lbStickyPolicy.actions.add(
-                        lbRuleID,
-                        data,
-                        complete,
-                        error
-                    );
-                };
-
-                // Delete existing rule
-                if (data.methodname !== 'None') {
-                    addStickyPolicy();
-                } else {
-                    cloudStack.lbStickyPolicy.actions['delete'](stickyRuleID, complete, error);
-                }
-            }
-        }
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/metrics.js b/ui/legacy/scripts/metrics.js
deleted file mode 100644
index 19419cb..0000000
--- a/ui/legacy/scripts/metrics.js
+++ /dev/null
@@ -1,764 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-    cloudStack.sections.metrics = {
-        title: 'label.metrics',
-        listView: {
-            id: 'metrics',
-            fields: {
-                name: {
-                    label: 'metrics'
-                }
-            }
-        }
-    };
-
-
-    // Zones Metrics
-    cloudStack.sections.metrics.zones = {
-        title: 'label.metrics',
-        listView: {
-            id: 'physicalResources',
-            fields: {
-                name: {
-                    label: 'label.metrics.name'
-                },
-                state: {
-                    label: 'label.metrics.state',
-                    converter: function (str) {
-                        // For localization
-                        return str;
-                    },
-                    indicator: {
-                        'Enabled': 'on',
-                        'Disabled': 'off'
-                    },
-                    compact: true
-                },
-                clusters : {
-                    label: 'label.metrics.clusters'
-                },
-                cpuused: {
-                    label: 'label.metrics.cpu.usage',
-                    collapsible: true,
-                    columns: {
-                        cpuused: {
-                            label: 'label.metrics.cpu.used.avg',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'cputhreshold',
-                                disable: 'cpudisablethreshold'
-                            }
-                        },
-                        cpumaxdeviation: {
-                            label: 'label.metrics.cpu.max.dev'
-                        }
-                    }
-                },
-                cpuallocated: {
-                    label: 'label.metrics.cpu.allocated',
-                    collapsible: true,
-                    columns: {
-                        cpuallocated: {
-                            label: 'label.metrics.allocated',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'cpuallocatedthreshold',
-                                disable: 'cpuallocateddisablethreshold'
-                            }
-                        },
-                        cputotal: {
-                            label: 'label.metrics.cpu.total'
-                        }
-                    }
-                },
-                memused: {
-                    label: 'label.metrics.memory.usage',
-                    collapsible: true,
-                    columns: {
-                        memoryused: {
-                            label: 'label.metrics.memory.used.avg',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'memorythreshold',
-                                disable: 'memorydisablethreshold'
-                            }
-                        },
-                        memorymaxdeviation: {
-                            label: 'label.metrics.memory.max.dev'
-                        }
-                    }
-                },
-                memallocated: {
-                    label: 'label.metrics.memory.allocated',
-                    collapsible: true,
-                    columns: {
-                        memoryallocated: {
-                            label: 'label.metrics.allocated',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'memoryallocatedthreshold',
-                                disable: 'memoryallocateddisablethreshold'
-                            }
-                        },
-                        memorytotal: {
-                            label: 'label.metrics.memory.total'
-                        }
-                    }
-                }
-            },
-            dataProvider: function(args) {
-                var data = {};
-                listViewDataProvider(args, data);
-                $.ajax({
-                    url: createURL('listZonesMetrics'),
-                    data: data,
-                    success: function(json) {
-                        args.response.success({
-                            data: json.listzonesmetricsresponse.zone
-                        });
-                    }
-                });
-            },
-            browseBy: {
-                filterBy: 'zoneid',
-                resource: 'clusters'
-            },
-            detailView: cloudStack.sections.system.physicalResourceSection.sections.physicalResources.listView.zones.detailView
-        }
-    };
-
-
-    // Clusters Metrics
-    cloudStack.sections.metrics.clusters = {
-        title: 'label.metrics',
-        listView: {
-            id: 'clusters',
-            fields: {
-                name: {
-                    label: 'label.metrics.name'
-                },
-                state: {
-                    label: 'label.metrics.state',
-                    converter: function (str) {
-                        // For localization
-                        return str;
-                    },
-                    indicator: {
-                        'Enabled': 'on',
-                        'Unmanaged': 'warning',
-                        'Disabled': 'off'
-                    },
-                    compact: true
-                },
-                hosts: {
-                    label: 'label.metrics.hosts'
-                },
-                cpuused: {
-                    label: 'label.metrics.cpu.usage',
-                    collapsible: true,
-                    columns: {
-                        cpuused: {
-                            label: 'label.metrics.cpu.used.avg',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'cputhreshold',
-                                disable: 'cpudisablethreshold'
-                            }
-                        },
-                        cpumaxdeviation: {
-                            label: 'label.metrics.cpu.max.dev'
-                        }
-                    }
-                },
-                cpuallocated: {
-                    label: 'label.metrics.cpu.allocated',
-                    collapsible: true,
-                    columns: {
-                        cpuallocated: {
-                            label: 'label.metrics.allocated',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'cpuallocatedthreshold',
-                                disable: 'cpuallocateddisablethreshold'
-                            }
-                        },
-                        cputotal: {
-                            label: 'label.metrics.cpu.total'
-                        }
-                    }
-                },
-                memused: {
-                    label: 'label.metrics.memory.usage',
-                    collapsible: true,
-                    columns: {
-                        memoryused: {
-                            label: 'label.metrics.memory.used.avg',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'memorythreshold',
-                                disable: 'memorydisablethreshold'
-                            }
-                        },
-                        memorymaxdeviation: {
-                            label: 'label.metrics.memory.max.dev'
-                        }
-                    }
-                },
-                memallocated: {
-                    label: 'label.metrics.memory.allocated',
-                    collapsible: true,
-                    columns: {
-                        memoryallocated: {
-                            label: 'label.metrics.allocated',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'memoryallocatedthreshold',
-                                disable: 'memoryallocateddisablethreshold'
-                            }
-                        },
-                        memorytotal: {
-                            label: 'label.metrics.memory.total'
-                        }
-                    }
-                }
-            },
-            dataProvider: function(args) {
-                var data = {};
-                listViewDataProvider(args, data);
-
-                if ("zones" in args.context && args.context.zones[0]) {
-                    data['zoneid'] = args.context.zones[0].id;
-                }
-
-                if ("pods" in args.context && args.context.pods[0]) {
-                    data['podid'] = args.context.pods[0].id;
-                }
-
-                if (args.context.metricsFilterData && args.context.metricsFilterData.key && args.context.metricsFilterData.value) {
-                    data[args.context.metricsFilterData.key] = args.context.metricsFilterData.value;
-                }
-
-                $.ajax({
-                    url: createURL('listClustersMetrics'),
-                    data: data,
-                    success: function(json) {
-                        args.response.success({
-                            data: json.listclustersmetricsresponse.cluster
-                        });
-                    }
-                });
-            },
-            browseBy: {
-                filterBy: 'clusterid',
-                resource: 'hosts'
-            },
-            detailView: cloudStack.sections.system.subsections.clusters.listView.detailView
-        }
-    };
-
-
-    // Hosts Metrics
-    cloudStack.sections.metrics.hosts = {
-        title: 'label.metrics',
-        listView: {
-            id: 'hosts',
-            fields: {
-                name: {
-                    label: 'label.metrics.name'
-                },
-                state: {
-                    label: 'label.metrics.state',
-                    converter: function (str) {
-                        // For localization
-                        return str;
-                    },
-                    indicator: {
-                        'Up': 'on',
-                        'Down': 'off',
-                        'Disconnected': 'off',
-                        'Removed': 'off',
-                        'Error': 'off',
-                        'Alert': 'warning'
-                    },
-                    compact: true
-                },
-                powerstate: {
-                    label: 'label.metrics.outofbandmanagementpowerstate',
-                    converter: function (str) {
-                        // For localization
-                        return str;
-                    },
-                    indicator: {
-                        'On': 'on',
-                        'Off': 'off',
-                        'Unknown': 'warning'
-                    },
-                    compact: true
-                },
-                instances: {
-                    label: 'label.instances'
-                },
-                cpuused: {
-                    label: 'label.metrics.cpu.usage',
-                    collapsible: true,
-                    columns: {
-                        cpunumber: {
-                            label: 'label.metrics.num.cpu.cores',
-                        },
-                        cputotalghz: {
-                            label: 'label.metrics.cpu.total'
-                        },
-                        cpuusedghz: {
-                            label: 'label.metrics.cpu.used.avg',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'cputhreshold',
-                                disable: 'cpudisablethreshold'
-                            }
-                        },
-                        cpuallocatedghz: {
-                            label: 'label.metrics.allocated',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'cpuallocatedthreshold',
-                                disable: 'cpuallocateddisablethreshold'
-                            }
-                        }
-                    }
-                },
-                memused: {
-                    label: 'label.metrics.memory.usage',
-                    collapsible: true,
-                    columns: {
-                        memorytotalgb: {
-                            label: 'label.metrics.memory.total'
-                        },
-                        memoryusedgb: {
-                            label: 'label.metrics.memory.used.avg',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'memorythreshold',
-                                disable: 'memorydisablethreshold'
-                            }
-                        },
-                        memoryallocatedgb: {
-                            label: 'label.metrics.allocated',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'memoryallocatedthreshold',
-                                disable: 'memoryallocateddisablethreshold'
-                            }
-                        }
-                    }
-                },
-                network: {
-                    label: 'label.metrics.network.usage',
-                    collapsible: true,
-                    columns: {
-                        networkread: {
-                            label: 'label.metrics.network.read'
-                        },
-                        networkwrite: {
-                            label: 'label.metrics.network.write'
-                        }
-                    }
-                }
-            },
-            dataProvider: function(args) {
-                var data = {};
-                data.type = 'routing';
-                listViewDataProvider(args, data);
-
-                if (!args.context.instances) {
-                    if ("zones" in args.context && args.context.zones[0]) {
-                        data['zoneid'] = args.context.zones[0].id;
-                    }
-
-                    if ("pods" in args.context && args.context.pods[0]) {
-                        data['podid'] = args.context.pods[0].id;
-                    }
-
-                    if ("clusters" in args.context && args.context.clusters[0]) {
-                        data['clusterid'] = args.context.clusters[0].id;
-                    }
-                } else {
-                    if (args.context.instances[0]) {
-                        data['id'] = args.context.instances[0].hostid;
-                    }
-                }
-
-                if (args.context.metricsFilterData && args.context.metricsFilterData.key && args.context.metricsFilterData.value) {
-                    data[args.context.metricsFilterData.key] = args.context.metricsFilterData.value;
-                }
-
-                $.ajax({
-                    url: createURL('listHostsMetrics'),
-                    data: data,
-                    success: function(json) {
-                        args.response.success({
-                            data: json.listhostsmetricsresponse.host
-                        });
-                    }
-                });
-            },
-            browseBy: {
-                filterBy: 'hostid',
-                resource: 'vms'
-            },
-            detailView: cloudStack.sections.system.subsections.hosts.listView.detailView
-        }
-    };
-
-
-    // VMs Metrics
-    cloudStack.sections.metrics.instances = {
-        title: 'label.metrics',
-        listView: {
-            id: 'instances',
-            fields: {
-                name: {
-                    label: 'label.metrics.name'
-                },
-                state: {
-                    label: 'label.metrics.state',
-                    converter: function (str) {
-                        // For localization
-                        return str;
-                    },
-                    indicator: {
-                        'Running': 'on',
-                        'Stopped': 'off',
-                        'Error': 'off',
-                        'Destroyed': 'off',
-                        'Expunging': 'off',
-                        'Stopping': 'warning',
-                        'Shutdown': 'warning'
-                    },
-                    compact: true
-                },
-                ipaddress: {
-                    label: 'label.ip.address'
-                },
-                zonename: {
-                    label: 'label.zone'
-                },
-                cpuused: {
-                    label: 'label.metrics.cpu.usage',
-                    collapsible: true,
-                    columns: {
-                        cpunumber: {
-                            label: 'label.metrics.num.cpu.cores',
-                        },
-                        cputotal: {
-                            label: 'label.metrics.cpu.total'
-                        },
-                        cpuused: {
-                            label: 'label.metrics.cpu.used.avg',
-                        }
-                    }
-                },
-                memused: {
-                    label: 'label.metrics.memory.usage',
-                    collapsible: true,
-                    columns: {
-                        memorytotal: {
-                            label: 'label.metrics.allocated'
-                        },
-                        memoryused: {
-                            label: 'label.metrics.memory.used.avg'
-                        }
-                    }
-                },
-                network: {
-                    label: 'label.metrics.network.usage',
-                    collapsible: true,
-                    columns: {
-                        networkread: {
-                            label: 'label.metrics.network.read'
-                        },
-                        networkwrite: {
-                            label: 'label.metrics.network.write'
-                        }
-                    }
-                },
-                disk: {
-                    label: 'label.metrics.disk.usage',
-                    collapsible: true,
-                    columns: {
-                        diskioread: {
-                            label: 'label.metrics.disk.read'
-                        },
-                        diskiowrite: {
-                            label: 'label.metrics.disk.write'
-                        },
-                        diskiopstotal: {
-                            label: 'label.metrics.disk.iops.total'
-                        }
-                    }
-                }
-            },
-            dataProvider: function(args) {
-                var data = {};
-                listViewDataProvider(args, data);
-
-                if ("hosts" in args.context && args.context.hosts[0]) {
-                    data['hostid'] = args.context.hosts[0].id;
-                }
-
-                if (args.context.metricsFilterData && args.context.metricsFilterData.key && args.context.metricsFilterData.value) {
-                    data[args.context.metricsFilterData.key] = args.context.metricsFilterData.value;
-                }
-
-                $.ajax({
-                    url: createURL('listVirtualMachinesMetrics'),
-                    data: data,
-                    success: function(json) {
-                        json.listvirtualmachinesmetricsresponse.virtualmachine.forEach(function(vm) {
-                            var memUsedPercent = (vm.memorykbs && vm.memoryintfreekbs) ? (Math.round((vm.memorykbs - vm.memoryintfreekbs) * 10000 / vm.memorykbs) / 100).toString() + "%" : "";
-                            $.extend(vm,{
-                                memoryused: memUsedPercent
-                            })
-                        });
-                        args.response.success({
-                            data: json.listvirtualmachinesmetricsresponse.virtualmachine
-                        });
-                    }
-                });
-            },
-            browseBy: {
-                filterBy: 'virtualmachineid',
-                resource: 'volumes'
-            },
-            detailView: cloudStack.sections.instances.listView.detailView
-        }
-    };
-
-
-    // Volumes Metrics
-    cloudStack.sections.metrics.volumes = {
-        title: 'label.metrics',
-        listView: {
-            preFilter: function(args) {
-                var hiddenFields = [];
-                if (!isAdmin()) {
-                    hiddenFields.push('physicalsize');
-                    hiddenFields.push('storage');
-                    hiddenFields.push('storagetype');
-                }
-                return hiddenFields;
-            },
-            id: 'volumes',
-            fields: {
-                name: {
-                    label: 'label.metrics.name'
-                },
-                state: {
-                    label: 'label.metrics.state',
-                    converter: function (str) {
-                        // For localization
-                        return str;
-                    },
-                    indicator: {
-                        'Allocated': 'on',
-                        'Ready': 'on',
-                        'Destroy': 'off',
-                        'Expunging': 'off',
-                        'Migrating': 'warning',
-                        'UploadOp': 'warning',
-                        'Snapshotting': 'warning',
-                    },
-                    compact: true
-                },
-                vmname: {
-                    label: 'label.metrics.vm.name'
-                },
-                sizegb: {
-                    label: 'label.metrics.disk.size'
-                },
-                physicalsize: {
-                    label: 'label.disk.physicalsize',
-                    converter: function(args) {
-                        if (args == null || args == 0)
-                            return "";
-                        else
-                            return cloudStack.converters.convertBytes(args);
-                    }
-                },
-                utilization: {
-                    label: 'label.disk.utilisation'
-                },
-                storagetype: {
-                    label: 'label.metrics.disk.storagetype'
-                },
-                storage: {
-                    label: 'label.metrics.storagepool'
-                },
-                disk: {
-                    label: 'label.metrics.disk.usage',
-                    collapsible: true,
-                    columns: {
-                        diskioread: {
-                            label: 'label.metrics.disk.read'
-                        },
-                        diskiowrite: {
-                            label: 'label.metrics.disk.write'
-                        },
-                        diskiopstotal: {
-                            label: 'label.metrics.disk.iops.total'
-                        }
-                    }
-                }
-            },
-            dataProvider: function(args) {
-                var data = {listAll: true};
-                listViewDataProvider(args, data);
-
-                if ("instances" in args.context && args.context.instances[0]) {
-                    data['virtualmachineid'] = args.context.instances[0].id;
-                }
-
-                if ("primarystorages" in args.context && args.context.primarystorages[0]) {
-                    data['storageid'] = args.context.primarystorages[0].id;
-                }
-
-                if (args.context.metricsFilterData && args.context.metricsFilterData.key && args.context.metricsFilterData.value) {
-                    data[args.context.metricsFilterData.key] = args.context.metricsFilterData.value;
-                }
-
-                $.ajax({
-                    url: createURL('listVolumesMetrics'),
-                    data: data,
-                    success: function(json) {
-                        args.response.success({
-                            data: json.listvolumesmetricsresponse.volume
-                        });
-                    }
-                });
-            },
-            detailView: cloudStack.sections.storage.sections.volumes.listView.detailView
-        }
-    };
-
-
-    // Storage Pool Metrics
-    cloudStack.sections.metrics.storagepool = {
-        title: 'label.metrics',
-        listView: {
-            id: 'primarystorages',
-            fields: {
-                name: {
-                    label: 'label.metrics.name'
-                },
-                property: {
-                    label: 'label.metrics.property',
-                    collapsible: true,
-                    columns: {
-                        state: {
-                            label: 'label.metrics.state',
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            indicator: {
-                                'Up': 'on',
-                                'Down': 'off',
-                                'Removed': 'off',
-                                'ErrorInMaintenance': 'off',
-                                'ErrorInPrepareForMaintenance': 'warning',
-                                'PrepareForMaintenance': 'warning',
-                                'CancelMaintenance': 'warning',
-                                'Maintenance': 'warning',
-                            },
-                            compact: true
-                        },
-                        scope: {
-                            label: 'label.metrics.scope'
-                        },
-                        type: {
-                            label: 'label.metrics.disk.storagetype'
-                        }
-                    }
-                },
-                disk: {
-                    label: 'label.metrics.disk',
-                    collapsible: true,
-                    columns: {
-                        disksizeusedgb: {
-                            label: 'label.metrics.disk.used',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'storageusagethreshold',
-                                disable: 'storageusagedisablethreshold'
-                            }
-                        },
-                        disksizetotalgb: {
-                            label: 'label.metrics.disk.total'
-                        },
-                        disksizeallocatedgb: {
-                            label: 'label.metrics.disk.allocated',
-                            thresholdcolor: true,
-                            thresholds: {
-                                notification: 'storageallocatedthreshold',
-                                disable: 'storageallocateddisablethreshold'
-                            }
-                        },
-                        disksizeunallocatedgb: {
-                            label: 'label.metrics.disk.unallocated'
-                        }
-                    }
-                }
-            },
-            dataProvider: function(args) {
-                var data = {};
-                listViewDataProvider(args, data);
-
-                if ("zones" in args.context && args.context.zones[0]) {
-                    data['zoneid'] = args.context.zones[0].id;
-                }
-
-                if ("pods" in args.context && args.context.pods[0]) {
-                    data['podid'] = args.context.pods[0].id;
-                }
-
-                if ("clusters" in args.context && args.context.clusters[0]) {
-                    data['clusterid'] = args.context.clusters[0].id;
-                }
-
-                if (args.context.metricsFilterData && args.context.metricsFilterData.key && args.context.metricsFilterData.value) {
-                    data[args.context.metricsFilterData.key] = args.context.metricsFilterData.value;
-                }
-
-                $.ajax({
-                    url: createURL('listStoragePoolsMetrics'),
-                    data: data,
-                    success: function(json) {
-                        args.response.success({
-                            data: json.liststoragepoolsmetricsresponse.storagepool
-                        });
-                    }
-                });
-            },
-            browseBy: {
-                filterBy: 'storageid',
-                resource: 'volumes'
-            },
-            detailView: cloudStack.sections.system.subsections['primary-storage'].listView.detailView
-        }
-    };
-
-})(cloudStack);
diff --git a/ui/legacy/scripts/network.js b/ui/legacy/scripts/network.js
deleted file mode 100644
index 47e9e3d..0000000
--- a/ui/legacy/scripts/network.js
+++ /dev/null
@@ -1,7124 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function(cloudStack, $) {
-    var ingressEgressDataMap = function(elem) {
-        var elemData = {
-            id: elem.ruleid,
-            protocol: elem.protocol,
-            startport: elem.startport,
-            endport: elem.endport,
-            cidr: elem.cidr ? elem.cidr : ''.concat(elem.account, ' - ', elem.securitygroupname),
-            tags: elem.tags
-        };
-
-        if (typeof elem.icmptype != 'undefined') {
-             var icmptype = elem.icmptype.toString()
-        }
-
-        if (typeof elem.icmpcode != 'undefined') {
-             var icmpcode = elem.icmpcode.toString()
-        }
-
-        if (elemData.startport == 0 && elemData.endport) {
-            elemData.startport = '0';
-        } else if (icmptype && icmpcode) {
-            elemData.startport = icmptype;
-            elemData.endport = icmpcode;
-        }
-
-        if (elemData.protocol != 'tcp' && elemData.protocol != 'udp' && elemData.protocol != 'icmp') {
-            elemData.startport = 'all';
-            elemData.endport = 'all';
-        }
-        return elemData;
-    };
-
-    //value of Primary IP in subselect dropdown is -1, for single VM selection (API parameter virtualmachineid + vmguestip), e.g. enableStaticNat API, createPortForwardingRule API.
-    var singleVmSecondaryIPSubselect = function(args) {
-        var instance = args.context.instances[0];
-        var network = args.context.networks[0];
-
-        if (args.context.ipAddresses[0].isportable) { //portable IP which has multiple NICs. Each NIC has a different network ID.
-            $.ajax({
-                url: createURL('listNics'),
-                data: {
-                    virtualmachineid: instance.id
-                },
-                success: function(json) {
-                    var nics = json.listnicsresponse.nic;
-                    var ipSelection = [];
-
-                    $(nics).map(function(index, nic) {
-                        var primaryIp = nic.ipaddress;
-                        var secondaryIps = nic.secondaryip ? nic.secondaryip : [];
-                        var prefix = '[NIC ' + (index + 1) + '] ';
-
-                        // Add primary IP as default
-                        ipSelection.push({
-                            id: nic.networkid + ',-1',
-                            description: prefix + primaryIp + ' (Primary)'
-                        });
-
-                        // Add secondary IPs
-                        $(secondaryIps).map(function(index, secondaryIp) {
-                            ipSelection.push({
-                                id: nic.networkid + ',' + secondaryIp.ipaddress,
-                                description: prefix + secondaryIp.ipaddress
-                            });
-                        });
-                    });
-
-                    args.response.success({
-                        data: ipSelection
-                    });
-                }
-            });
-
-        } else { //non-portable IP which has only one NIC
-            // Get NIC IPs
-            $.ajax({
-                url: createURL('listNics'),
-                data: {
-                    virtualmachineid: instance.id,
-                    networkid: (args.context.networkid != undefined) ? args.context.networkid : network.id
-                },
-                success: function(json) {
-                    var nic = json.listnicsresponse.nic[0];
-                    var primaryIp = nic.ipaddress;
-                    var secondaryIps = nic.secondaryip ? nic.secondaryip : [];
-                    var ipSelection = [];
-
-                    // Add primary IP as default
-                    ipSelection.push({
-                        id: primaryIp,
-                        description: primaryIp + ' (Primary)'
-                    });
-
-                    // Add secondary IPs
-                    $(secondaryIps).map(function(index, secondaryIp) {
-                        ipSelection.push({
-                            id: secondaryIp.ipaddress,
-                            description: secondaryIp.ipaddress
-                        });
-                    });
-
-                    args.response.success({
-                        data: ipSelection
-                    });
-                }
-            });
-        }
-    };
-
-    //value of Primary IP in subselect dropdown is itself (not -1), for multiple VM selection (API parameter vmidipmap), e.g. assignToLoadBalancerRule API.
-    var multipleVmSecondaryIPSubselect = function(args) {
-        var instance = args.context.instances[0];
-        var network = args.context.networks[0];
-
-        if (args.context.ipAddresses[0].isportable) { //portable IP which has multiple NICs. Each NIC has a different network ID.
-            $.ajax({
-                url: createURL('listNics'),
-                data: {
-                    virtualmachineid: instance.id
-                },
-                success: function(json) {
-                    var nics = json.listnicsresponse.nic;
-                    var ipSelection = [];
-
-                    //portable IP has multiple NICs. Each NIC has a different network ID.
-                    $(nics).map(function(index, nic) {
-                        var primaryIp = nic.ipaddress;
-                        var secondaryIps = nic.secondaryip ? nic.secondaryip : [];
-                        var prefix = '[NIC ' + (index + 1) + '] ';
-
-                        // Add primary IP as default
-                        ipSelection.push({
-                            id: nic.networkid + ',' + primaryIp,
-                            description: prefix + primaryIp + ' (Primary)'
-                        });
-
-                        // Add secondary IPs
-                        $(secondaryIps).map(function(index, secondaryIp) {
-                            ipSelection.push({
-                                id: nic.networkid + ',' + secondaryIp.ipaddress,
-                                description: prefix + secondaryIp.ipaddress
-                            });
-                        });
-                    });
-
-                    args.response.success({
-                        data: ipSelection
-                    });
-                }
-            });
-
-        } else { //non-portable IP which has only one NIC
-            // Get NIC IPs
-            $.ajax({
-                url: createURL('listNics'),
-                data: {
-                    virtualmachineid: instance.id,
-                    networkid: network.id
-                },
-                success: function(json) {
-                    var nic = json.listnicsresponse.nic[0];
-                    var primaryIp = nic.ipaddress;
-                    var secondaryIps = nic.secondaryip ? nic.secondaryip : [];
-                    var ipSelection = [];
-                    var existingIps = $(args.context.subItemData).map(
-                        function(index, item) { return item.itemIp; }
-                    );
-
-                    // Add primary IP as default
-                    if ($.inArray(primaryIp, existingIps) == -1) {
-                        ipSelection.push({
-                            id: primaryIp,
-                            description: primaryIp + ' (Primary)'
-                        });
-                    }
-
-                    // Add secondary IPs
-                    $(secondaryIps).map(function(index, secondaryIp) {
-                        if ($.inArray(secondaryIp.ipaddress, existingIps) == -1) {
-                            ipSelection.push({
-                                id: secondaryIp.ipaddress,
-                                description: secondaryIp.ipaddress
-                            });
-                        }
-                    });
-
-                    args.response.success({
-                        data: ipSelection
-                    });
-                }
-            });
-        }
-    };
-
-    var ipChangeNotice = function() {
-        cloudStack.dialog.confirm({
-            message: 'message.ip.address.changed',
-            action: function() {
-                $('#browser .container').cloudBrowser('selectPanel', {
-                    panel: $('#browser .panel:last').prev(),
-                    complete: function() {
-                        $(window).trigger('cloudStack.fullRefresh');
-                    }
-                });
-            }
-        });
-    };
-
-    var zoneObjs = [];
-
-    var actionFilters = {
-        ipAddress: function(args) {
-            var allowedActions = args.context.actions;
-            var disallowedActions = [];
-            var ipObj = args.context.item;
-            var status = ipObj.state;
-
-            //***** apply to both Isolated Guest Network IP, VPC IP (begin) *****
-            if (status == 'Destroyed' ||
-                status == 'Releasing' ||
-                status == 'Released' ||
-                status == 'Creating' ||
-                status == 'Allocating' ||
-                ipObj.account == 'system' ||
-                ipObj.issystem == true) {
-                return [];
-            }
-
-            if (ipObj.issourcenat) { //sourceNAT IP doesn't support staticNAT
-                disallowedActions.push('enableStaticNAT');
-                disallowedActions.push('disableStaticNAT');
-                disallowedActions.push('remove');
-            } else { //non-sourceNAT IP supports staticNAT
-                disallowedActions.push('enableVPN');
-                if (ipObj.isstaticnat) {
-                    disallowedActions.push('enableStaticNAT');
-                } else {
-                    disallowedActions.push('disableStaticNAT');
-                }
-            }
-            //***** apply to both Isolated Guest Network IP, VPC IP (end) *****
-
-
-            if (!('vpc' in args.context)) { //***** Guest Network section > Guest Network page > IP Address page *****
-                if (args.context.networks[0].networkofferingconservemode == false) {
-                    /*
-                     (1) If IP is SourceNat, no StaticNat/VPN/PortForwarding/LoadBalancer can be enabled/added.
-                     */
-                    if (ipObj.issourcenat == true) {
-                        disallowedActions.push('enableStaticNAT');
-                        disallowedActions.push('enableVPN');
-                    }
-
-                    /*
-                     (2) If IP is non-SourceNat, show StaticNat/VPN/PortForwarding/LoadBalancer at first.
-                     1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer.
-                     2. Once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer.
-                     3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer.
-                     4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding.
-                     */
-                    else { //ipObj.issourcenat == false
-                        if (ipObj.isstaticnat) { //1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer.
-                            disallowedActions.push('enableVPN');
-                        }
-                        if (ipObj.vpnenabled) { //2. Once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer.
-                            disallowedActions.push('enableStaticNAT');
-                        }
-
-                        //3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer.
-                        $.ajax({
-                            url: createURL('listPortForwardingRules'),
-                            data: {
-                                ipaddressid: ipObj.id,
-                                listAll: true
-                            },
-                            dataType: 'json',
-                            async: false,
-                            success: function(json) {
-                                var rules = json.listportforwardingrulesresponse.portforwardingrule;
-                                if (rules != null && rules.length > 0) {
-                                    disallowedActions.push('enableVPN');
-                                    disallowedActions.push('enableStaticNAT');
-                                }
-                            }
-                        });
-
-                        //4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding.
-                        $.ajax({
-                            url: createURL('listLoadBalancerRules'),
-                            data: {
-                                publicipid: ipObj.id,
-                                listAll: true
-                            },
-                            dataType: 'json',
-                            async: false,
-                            success: function(json) {
-                                var rules = json.listloadbalancerrulesresponse.loadbalancerrule;
-                                if (rules != null && rules.length > 0) {
-                                    disallowedActions.push('enableVPN');
-                                    disallowedActions.push('enableStaticNAT');
-                                }
-                            }
-                        });
-                    }
-                }
-
-                if (ipObj.networkOfferingHavingVpnService == true) {
-                    if (ipObj.vpnenabled) {
-                        disallowedActions.push('enableVPN');
-                    } else {
-                        disallowedActions.push('disableVPN');
-                    }
-                } else { //ipObj.networkOfferingHavingVpnService == false
-                    disallowedActions.push('disableVPN');
-                    disallowedActions.push('enableVPN');
-                }
-            } else { //***** VPC section > Configuration VPC > Router > Public IP Addresses *****
-                if (ipObj.issourcenat) { //VPC sourceNAT IP: supports VPN
-                    if (ipObj.vpnenabled) {
-                        disallowedActions.push('enableVPN');
-                    } else {
-                        disallowedActions.push('disableVPN');
-                    }
-                } else { //VPC non-sourceNAT IP: doesn't support VPN
-                    disallowedActions.push('enableVPN');
-                    disallowedActions.push('disableVPN');
-                }
-            }
-
-            allowedActions = $.grep(allowedActions, function(item) {
-                return $.inArray(item, disallowedActions) == -1;
-            });
-
-            return allowedActions;
-        },
-
-        securityGroups: function(args) {
-            var allowedActions = [];
-            var isSecurityGroupOwner = isAdmin() || isDomainAdmin() ||
-                args.context.item.account == args.context.users[0].account;
-
-            if (isSecurityGroupOwner &&
-                args.context.item.state != 'Destroyed' &&
-                args.context.item.name != 'default') {
-                allowedActions.push('remove');
-                allowedActions.push('edit');
-            }
-
-            return allowedActions;
-        }
-    };
-
-    var networkOfferingObjs = [];
-    var advZoneObjs;
-
-    cloudStack.sections.network = {
-        title: 'label.network',
-        id: 'network',
-        sectionSelect: {
-            preFilter: function(args) {
-                var sectionsToShow = ['networks'];
-                var securityGroupsEnabledFound = false; //Until we found a zone where securitygroupsenabled is true.
-
-                //This call to show VPC and VPN Customer Gateway sections, if zone is advanced.
-                $.ajax({
-                    url: createURL('listZones'),
-                    data: {
-                        networktype: 'Advanced'
-                    },
-                    async: false,
-                    success: function(json) {
-                        advZoneObjs = json.listzonesresponse ? json.listzonesresponse.zone : null;
-                        if (advZoneObjs != null && advZoneObjs.length > 0) {
-                            sectionsToShow.push('vpc');
-                            sectionsToShow.push('vpnCustomerGateway');
-
-                            //At the same time check if any advanced zone has securitygroupsenabled is true.
-                            //If so, show Security Group section.
-                            for (var i = 0; (i < advZoneObjs.length) && !securityGroupsEnabledFound; i++) {
-                                if (advZoneObjs[i].securitygroupsenabled) {
-                                    securityGroupsEnabledFound = true;
-                                    sectionsToShow.push('securityGroups');
-                                }
-                            }
-                        }
-                        //Ajax call to check if VPN is enabled.
-                        $.ajax({
-                            url: createURL('listRemoteAccessVpns'),
-                            data: {
-                                listAll: true
-                            },
-                            async: false,
-                            success: function(vpnResponse) {
-                                var isVPNEnabled = vpnResponse.listremoteaccessvpnsresponse.count;
-
-                                if (isVPNEnabled) {
-                                    sectionsToShow.push('vpnuser');
-                                }
-                            }
-                        });
-                    }
-                });
-
-                //If we didn't find any advanced zone whose securitygroupsenabled is true.
-                //Search in all Basic zones.
-                if (!securityGroupsEnabledFound) {
-                    $.ajax({
-                        url: createURL('listZones'),
-                        data: {
-                            networktype: 'Basic'
-                        },
-                        async: false,
-                        success: function(json) {
-                            var basicZoneObjs = json.listzonesresponse ? json.listzonesresponse.zone : null;
-                            if (basicZoneObjs != null && basicZoneObjs.length > 0) {
-                                sectionsToShow.push('securityGroups');
-                            }
-                        }
-                    });
-                }
-
-                return sectionsToShow;
-            },
-
-            label: 'label.select-view'
-        },
-        sections: {
-            networks: {
-                id: 'networks',
-                type: 'select',
-                title: 'label.guest.networks',
-                listView: {
-                    actions: {
-                        add: {
-                            label: 'label.add.isolated.network',
-
-                            preFilter: function(args) {
-                                if (advZoneObjs != null && advZoneObjs.length > 0) {
-                                    for (var i = 0; i < advZoneObjs.length; i++) {
-                                        if (advZoneObjs[i].securitygroupsenabled != true) { //'Add Isolated Guest Network with SourceNat' is only supported in Advanced SG-disabled zone
-                                            return true;
-                                        }
-                                    }
-                                    return false;
-                                } else {
-                                    return false;
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.isolated.guest.network.with.sourcenat',
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpGuestNetworkName'
-                                    },
-                                    displayText: {
-                                        label: 'label.display.text',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpGuestNetworkDisplayText'
-                                    },
-                                    zoneId: {
-                                        label: 'label.zone',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpGuestNetworkZone',
-
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                success: function(json) {
-                                                    var zones = $.grep(json.listzonesresponse.zone, function(zone) {
-                                                        return (zone.networktype == 'Advanced' && zone.securitygroupsenabled != true); //Isolated networks can only be created in Advanced SG-disabled zone (but not in Basic zone nor Advanced SG-enabled zone)
-                                                    });
-
-                                                    args.response.success({
-                                                        data: $.map(zones, function(zone) {
-                                                            return {
-                                                                id: zone.id,
-                                                                description: zone.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    domain: {
-                                        label: 'label.domain',
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin())
-                                                return false;
-                                            else
-                                                return true;
-                                        },
-                                        select: function(args) {
-                                            if (isAdmin() || isDomainAdmin()) {
-                                                $.ajax({
-                                                    url: createURL("listDomains&listAll=true"),
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        items.push({
-                                                            id: "",
-                                                            description: ""
-                                                        });
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        $(domainObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.path
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                                args.$select.change(function() {
-                                                    var $form = $(this).closest('form');
-                                                    if ($(this).val() == "") {
-                                                        $form.find('.form-item[rel=account]').hide();
-                                                    } else {
-                                                        $form.find('.form-item[rel=account]').css('display', 'inline-block');
-                                                    }
-                                                });
-                                            } else {
-                                                args.response.success({
-                                                    data: null
-                                                });
-                                            }
-                                        }
-                                    },
-                                    networkOfferingId: {
-                                        label: 'label.network.offering',
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: (isAdmin() || isDomainAdmin()) ? ['zoneId', 'domain'] : 'zoneId', // domain is visible only for admins
-                                        docID: 'helpGuestNetworkNetworkOffering',
-                                        select: function(args) {
-                                            var data = {
-                                                zoneid: args.zoneId,
-                                                guestiptype: 'Isolated',
-                                                supportedServices: 'SourceNat',
-                                                state: 'Enabled'
-                                            };
-
-                                            if ((isAdmin() || isDomainAdmin())) { // domain is visible only for admins
-                                                $.extend(data, {
-                                                    domainid: args.domain
-                                                });
-                                            }
-
-                                            if ('vpc' in args.context) { //from VPC section
-                                                $.extend(data, {
-                                                    forVpc: true
-                                                });
-                                            }
-                                            else { //from guest network section
-                                                var vpcs;
-                                                $.ajax({
-                                                    url: createURL('listVPCs'),
-                                                    data: {
-                                                        listAll: true
-                                                    },
-                                                    async: false,
-                                                    success: function(json) {
-                                                        vpcs = json.listvpcsresponse.vpc;
-                                                    }
-                                                });
-                                                if (vpcs == null || vpcs.length == 0) { //if there is no VPC in the system
-                                                    $.extend(data, {
-                                                        forVpc: false
-                                                    });
-                                                }
-                                            }
-
-                                            if(!isAdmin()) { //normal user is not aware of the VLANs in the system, so normal user is not allowed to create network with network offerings whose specifyvlan = true
-                                                $.extend(data, {
-                                                    specifyvlan: false
-                                                });
-                                            }
-
-                                            $.ajax({
-                                                url: createURL('listNetworkOfferings'),
-                                                data: data,
-                                                success: function(json) {
-                                                    networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                                                    args.$select.change(function() {
-                                                        var $vlan = args.$select.closest('form').find('[rel=vlan]');
-                                                        var networkOffering = $.grep(
-                                                            networkOfferingObjs, function(netoffer) {
-                                                                return netoffer.id == args.$select.val();
-                                                            }
-                                                        )[0];
-
-                                                        if (networkOffering.specifyvlan) {
-                                                            $vlan.css('display', 'inline-block');
-                                                        } else {
-                                                            $vlan.hide();
-                                                        }
-                                                    });
-
-                                                    args.response.success({
-                                                        data: $.map(networkOfferingObjs, function(zone) {
-                                                            return {
-                                                                id: zone.id,
-                                                                description: zone.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    vlan: {
-                                        label: 'label.vlan',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    vpcid: {
-                                        label: 'label.vpc',
-                                        dependsOn: 'networkOfferingId',
-                                        select: function(args) {
-                                            var networkOfferingObj;
-                                            var $form = args.$select.closest('form');
-                                            var data = {
-                                                listAll: true,
-                                                details: 'min'
-                                            };
-
-                                            if (args.context.vpc) {
-                                                data.id = args.context.vpc[0].id;
-                                            }
-
-                                            $(networkOfferingObjs).each(function(key, value) {
-                                                if (value.id == args.networkOfferingId) {
-                                                    networkOfferingObj = value;
-                                                    return false; //break each loop
-                                                }
-                                            });
-
-                                            if (networkOfferingObj.forvpc == true) {
-                                                args.$select.closest('.form-item').css('display', 'inline-block');
-                                                $.ajax({
-                                                    url: createURL('listVPCs'),
-                                                    data: data,
-                                                    success: function(json) {
-                                                        var items = json.listvpcsresponse.vpc;
-                                                        var data;
-                                                        if (items != null && items.length > 0) {
-                                                            data = $.map(items, function(item) {
-                                                                return {
-                                                                    id: item.id,
-                                                                    description: item.name
-                                                                }
-                                                            });
-                                                        }
-                                                        args.response.success({
-                                                            data: data
-                                                        });
-                                                    }
-                                                });
-                                                $form.find('.form-item[rel=networkDomain]').hide();
-                                            } else {
-                                                args.$select.closest('.form-item').hide();
-                                                $form.find('.form-item[rel=networkDomain]').show();
-                                                args.response.success({
-                                                    data: null
-                                                });
-                                            }
-                                        }
-                                    },
-                                    externalId: {
-                                        label: 'label.guest.externalId'
-                                    },
-                                    guestGateway: {
-                                        label: 'label.guest.gateway',
-                                        docID: 'helpGuestNetworkGateway'
-                                    },
-                                    guestNetmask: {
-                                        label: 'label.guest.netmask',
-                                        docID: 'helpGuestNetworkNetmask'
-                                    },
-                                    networkDomain: {
-                                        label: 'label.network.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin())
-                                                return false;
-                                            else
-                                                return true;
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var dataObj = {
-                                    zoneId: args.data.zoneId,
-                                    name: args.data.name,
-                                    displayText: args.data.displayText,
-                                    networkOfferingId: args.data.networkOfferingId
-                                };
-
-                                if (args.data.guestGateway != null && args.data.guestGateway.length > 0) {
-                                    $.extend(dataObj, {
-                                        gateway: args.data.guestGateway
-                                    });
-                                }
-                                if (args.data.guestNetmask != null && args.data.guestNetmask.length > 0) {
-                                    $.extend(dataObj, {
-                                        netmask: args.data.guestNetmask
-                                    });
-                                }
-                                if (args.data.externalId != null && args.data.externalId.length > 0) {
-                                    $.extend(dataObj, {
-                                        externalid: args.data.externalId
-                                    });
-                                }
-                                if (args.$form.find('.form-item[rel=vpcid]').css("display") != "none") {
-                                    $.extend(dataObj, {
-                                        vpcid: args.data.vpcid
-                                    });
-                                }
-
-                                if (args.$form.find('.form-item[rel=vlan]').css('display') != 'none') {
-                                    $.extend(dataObj, {
-                                        vlan: args.data.vlan
-                                    });
-                                }
-
-                                if (args.data.networkDomain != null && args.data.networkDomain.length > 0 && args.$form.find('.form-item[rel=vpcid]').css("display") == "none") {
-                                    $.extend(dataObj, {
-                                        networkDomain: args.data.networkDomain
-                                    });
-                                }
-
-                                if (args.data.domain != null && args.data.domain.length > 0) {
-                                    $.extend(dataObj, {
-                                        domainid: args.data.domain
-                                    });
-                                    if (args.data.account != null && args.data.account.length > 0) {
-                                        $.extend(dataObj, {
-                                            account: args.data.account
-                                        });
-                                    }
-                                }
-
-                                $.ajax({
-                                    url: createURL('createNetwork'),
-                                    data: dataObj,
-                                    success: function(json) {
-                                        args.response.success({
-                                            data: json.createnetworkresponse.network
-                                        });
-                                    },
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            },
-                            messages: {
-                                notification: function() {
-                                    return 'label.add.isolated.guest.network';
-                                }
-                            }
-                        },
-
-                        rootAdminAddGuestNetwork: $.extend({}, addGuestNetworkDialog.def, {
-                            isHeader: true
-                        }),
-
-                        AddL2Network: $.extend({}, addL2GuestNetwork.def, {
-                            isHeader: true
-                        })
-
-                    },
-                    id: 'networks',
-                    preFilter: function(args) {
-                        if (isAdmin() || isDomainAdmin()) {
-                            return []
-                        }
-                        return ['account']
-                    },
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        type: {
-                            label: 'label.type'
-                        },
-                        cidr: {
-                            label: 'label.cidr'
-                        },
-                        ip6cidr: {
-                            label: 'label.ipv6.CIDR'
-                        },
-                        account: {
-                            label: 'label.account'
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        state: {
-                            converter: function(str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.state',
-                            indicator: {
-                                'Allocated': 'on',
-                                'Released': 'off',
-                                'Destroy': 'off',
-                                'Shutdown': 'off',
-                                'Setup': 'on',
-                                'Implemented': 'on'
-                            }
-                        }
-                    },
-
-                    advSearchFields: {
-                        zoneid: {
-                            label: 'label.zone',
-                            select: function(args) {
-                                $.ajax({
-                                    url: createURL('listZones'),
-                                    data: {
-                                        listAll: true
-                                    },
-                                    success: function(json) {
-                                        var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                        args.response.success({
-                                            data: $.map(zones, function(zone) {
-                                                return {
-                                                    id: zone.id,
-                                                    description: zone.name
-                                                };
-                                            })
-                                        });
-                                    }
-                                });
-                            }
-                        },
-
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        account: {
-                            label: 'label.account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        if ("networkOfferings" in args.context) {
-                            $.extend(data, {
-                                networkofferingid: args.context.networkOfferings[0].id
-                            });
-                        }
-                        if ("routers" in args.context) {
-                            if ("vpcid" in args.context.routers[0]) {
-                                $.extend(data, {
-                                    vpcid: args.context.routers[0].vpcid
-                                });
-                            } else {
-                                if ("guestnetworkid" in args.context.routers[0]) {
-                                    $.extend(data, {
-                                        id: args.context.routers[0].guestnetworkid
-                                    });
-                                }
-                            }
-                            if ("projectid" in args.context.routers[0]) {
-                                $.extend(data, {
-                                    projectid: args.context.routers[0].projectid
-                                });
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL('listNetworks'),
-                            data: data,
-                            async: false,
-                            success: function(data) {
-                                args.response.success({
-                                    data: data.listnetworksresponse.network
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error(parseXMLHttpResponse(data));
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.guest.network.details',
-                        viewAll: [{
-                            path: 'network.ipAddresses',
-                            label: 'label.menu.ipaddresses',
-                            preFilter: function(args) {
-                                if (args.context.networks[0].state == 'Destroyed' ||
-                                    args.context.networks[0].type == 'L2')
-                                    return false;
-
-                                return true;
-                            }
-                        }, {
-                            label: 'label.instances',
-                            path: 'instances'
-                        }],
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.edit.network.details';
-                                    }
-                                },
-                                preFilter: function(args) {
-                                    if (args.context.networks[0].state == 'Destroyed')
-                                        return false;
-                                    return true;
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.networks[0].id,
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext
-                                    };
-
-                                    //args.data.networkdomain is null when networkdomain field is hidden
-                                    if (args.data.networkdomain != null && args.data.networkdomain.length > 0 && args.data.networkdomain != args.context.networks[0].networkdomain) {
-                                        $.extend(data, {
-                                            networkdomain: args.data.networkdomain
-                                        });
-                                    }
-
-                                    var oldcidr;
-                                    $.ajax({
-                                        url: createURL("listNetworks&id=" + args.context.networks[0].id + "&listAll=true"),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function(json) {
-                                            oldcidr = json.listnetworksresponse.network[0].cidr;
-
-                                        }
-                                    });
-
-
-                                    if (args.data.cidr != "" && args.data.cidr != oldcidr) {
-                                        $.extend(data, {
-                                            guestvmcidr: args.data.cidr
-                                        });
-                                    }
-
-                                    //args.data.networkofferingid is null when networkofferingid field is hidden
-                                    if (args.data.networkofferingid != null && args.data.networkofferingid != args.context.networks[0].networkofferingid) {
-                                        $.extend(data, {
-                                            networkofferingid: args.data.networkofferingid
-                                        });
-
-                                        if (args.context.networks[0].type == "Isolated") { //Isolated network
-                                            cloudStack.dialog.confirm({
-                                                message: 'message.confirm.current.guest.CIDR.unchanged',
-                                                action: function() { //"Yes" button is clicked
-                                                    getForcedInfoAndUpdateNetwork(data, args);
-                                                },
-                                                cancelAction: function() { //"Cancel" button is clicked
-                                                    $.extend(data, {
-                                                        changecidr: true
-                                                    });
-
-                                                    getForcedInfoAndUpdateNetwork(data, args);
-                                                }
-                                            });
-                                            return;
-                                        }
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('updateNetwork'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.updatenetworkresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        var item = json.queryasyncjobresultresponse.jobresult.network;
-                                                        return {
-                                                            data: item
-                                                        };
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            restart: {
-                                label: 'label.restart.network',
-                                preFilter: function(args) {
-                                    if (args.context.networks[0].state == 'Destroyed')
-                                        return false;
-                                    return true;
-                                },
-                                createForm: {
-                                    title: 'label.restart.network',
-                                    desc: 'message.restart.network',
-                                    preFilter: function(args) {
-                                        var zoneObj;
-                                        $.ajax({
-                                            url: createURL("listZones&id=" + args.context.networks[0].zoneid),
-                                            dataType: "json",
-                                            async: false,
-                                            success: function(json) {
-                                                zoneObj = json.listzonesresponse.zone[0];
-                                            }
-                                        });
-                                        args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 'checked'); //checked
-                                        args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block'); //shown
-                                        args.$form.find('.form-item[rel=makeredundant]').find('input').attr('checked', 'checked'); //checked
-                                        args.$form.find('.form-item[rel=makeredundant]').css('display', 'inline-block'); //shown
-
-                                        if (Boolean(args.context.networks[0].redundantrouter)) {
-                                            args.$form.find('.form-item[rel=makeredundant]').hide();
-                                        } else {
-                                            args.$form.find('.form-item[rel=makeredundant]').show();
-                                        }
-                                    },
-                                    fields: {
-                                        cleanup: {
-                                            label: 'label.clean.up',
-                                            isBoolean: true
-                                        },
-                                        makeredundant: {
-                                            label: 'label.make.redundant',
-                                            isBoolean: true
-                                        }
-                                    }
-                                },
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.restart.network';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("restartNetwork"),
-                                        data: {
-                                            id: args.context.networks[0].id,
-                                            cleanup: (args.data.cleanup == "on"),
-                                            makeredundant: (args.data.makeredundant == "on")
-                                        },
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.restartnetworkresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.network;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.network',
-                                preFilter: function(args) {
-                                    if (args.context.networks[0].state == 'Destroyed')
-                                        return false;
-                                    return true;
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.network';
-                                    },
-                                    isWarning: true,
-                                    notification: function(args) {
-                                        return 'label.action.delete.network';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetwork&id=" + args.context.networks[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.deletenetworkresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        tabFilter: function(args) {
-                            var networkHavingELB = false;
-                            var hasNetworkACL = false;
-                            var hasSRXFirewall = false;
-                            var isVPC = false;
-                            var isAdvancedSGZone = false;
-                            var hiddenTabs = [];
-                            var isSharedNetwork;
-
-                            var thisNetwork = args.context.networks[0];
-                            if (thisNetwork.vpcid != null) {
-                                isVPC = true;
-                            }
-                            if (thisNetwork.type == 'Shared') {
-                                isSharedNetwork = true;
-                            }
-
-                            $(thisNetwork.service).each(function() {
-                                var thisService = this;
-
-                                if (thisService.name == 'NetworkACL') {
-                                    hasNetworkACL = true;
-                                } else if (thisService.name == "Lb") {
-                                    $(thisService.capability).each(function() {
-                                        if (this.name == "ElasticLb" && this.value == "true") {
-                                            networkHavingELB = true;
-                                        }
-                                    });
-                                }
-
-                                if (thisService.name == 'Firewall') {
-                                    $(thisService.provider).each(function() {
-                                        if (this.name == 'JuniperSRX') {
-                                            hasSRXFirewall = true;
-
-                                            return false;
-                                        }
-
-                                        return true;
-                                    });
-                                }
-                            });
-
-                            // Get zone data
-                            $.ajax({
-                                url: createURL('listZones'),
-                                data: {
-                                    id: args.context.networks[0].zoneid
-                                },
-                                async: false,
-                                success: function(json) {
-                                    var zone = json.listzonesresponse.zone[0];
-
-                                    isAdvancedSGZone = zone.securitygroupsenabled;
-                                }
-                            });
-
-                            if (isVPC || isAdvancedSGZone || isSharedNetwork) {
-                                hiddenTabs.push('egressRules');
-                            }
-
-                            if (!isAdmin()) {
-                                hiddenTabs.push("virtualRouters");
-                            }
-
-                            return hiddenTabs;
-                        },
-
-                        isMaximized: true,
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                preFilter: function(args) {
-                                    var hiddenFields = [];
-                                    var zone;
-
-                                    $.ajax({
-                                        url: createURL('listZones'),
-                                        data: {
-                                            id: args.context.networks[0].zoneid
-                                        },
-                                        async: false,
-                                        success: function(json) {
-                                            zone = json.listzonesresponse.zone[0];
-                                        }
-                                    });
-
-                                    if (zone.networktype == "Basic") {
-                                        hiddenFields.push("account");
-                                        hiddenFields.push("gateway");
-                                        hiddenFields.push("vlan");
-                                        hiddenFields.push("cidr");
-                                        //hiddenFields.push("netmask");
-                                    }
-
-                                    if (args.context.networks[0].type == "Isolated") {
-                                        hiddenFields.push("networkofferingdisplaytext");
-                                        hiddenFields.push("networkdomaintext");
-                                        hiddenFields.push("gateway");
-                                        hiddenFields.push("networkofferingname");
-                                        //hiddenFields.push("netmask");
-                                    } else { //selectedGuestNetworkObj.type == "Shared"
-                                        hiddenFields.push("networkofferingid");
-                                        hiddenFields.push("networkdomain");
-                                    }
-
-                                    if (!isAdmin()) {
-                                        hiddenFields.push("vlan");
-                                    }
-
-                                    return hiddenFields;
-                                },
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true
-                                    },
-                                    type: {
-                                        label: 'label.type'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-
-                                    vpcid: {
-                                        label: 'label.vpc.id',
-                                        converter: function(args) {
-                                            if (args != null)
-                                                return args;
-                                            else
-                                                return _l('label.na');
-                                        }
-                                    },
-
-                                    ispersistent: {
-                                        label: 'label.persistent',
-                                        converter: cloudStack.converters.toBooleanText
-
-                                    },
-                                    restartrequired: {
-                                        label: 'label.restart.required',
-                                        converter: function(booleanValue) {
-                                            if (booleanValue == true)
-                                                return "Yes";
-                                            else if (booleanValue == false)
-                                                return "No";
-                                        }
-                                    },
-                                    vlan: {
-                                        label: 'label.vnet.id'
-                                    },
-
-                                    broadcasturi: {
-                                        label: 'label.broadcasturi'
-                                    },
-
-                                    networkofferingid: {
-                                        label: 'label.network.offering',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            if (args.context.networks[0].type == 'Shared') { //Shared network is not allowed to upgrade to a different network offering
-                                                args.response.success({
-                                                    data: []
-                                                });
-                                                return;
-                                            }
-
-                                            if (args.context.networks[0].state == 'Destroyed') {
-                                                args.response.success({
-                                                    data: []
-                                                });
-                                                return;
-                                            }
-
-                                            var items = [];
-                                            $.ajax({
-                                                url: createURL("listNetworkOfferings&networkid=" + args.context.networks[0].id),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                                                    $(networkOfferingObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.displaytext
-                                                        });
-                                                    });
-                                                }
-                                            });
-
-                                            //include currently selected network offeirng to dropdown
-                                            items.push({
-                                                id: args.context.networks[0].networkofferingid,
-                                                description: args.context.networks[0].networkofferingdisplaytext
-                                            });
-
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    gateway: {
-                                        label: 'label.gateway'
-                                    },
-
-                                    //netmask: { label: 'label.netmask' },
-                                    cidr: {
-                                        label: 'label.cidr',
-                                        isEditable: true
-                                    },
-
-                                    networkcidr: {
-                                        label: 'label.network.cidr'
-                                    },
-
-                                    ip6gateway: {
-                                        label: 'label.ipv6.gateway'
-                                    },
-
-                                    ip6cidr: {
-                                        label: 'label.ipv6.CIDR'
-                                    },
-
-
-                                    reservediprange: {
-                                        label: 'label.reserved.ip.range'
-                                    },
-
-                                    redundantrouter: {
-                                        label: 'label.redundant.router',
-                                        converter: function(booleanValue) {
-                                            if (booleanValue == true) {
-                                                return "Yes";
-                                            }
-                                            return "No";
-                                        }
-                                    },
-
-                                    networkdomaintext: {
-                                        label: 'label.network.domain.text'
-                                    },
-
-                                    networkdomain: {
-                                        label: 'label.network.domain',
-                                        isEditable: true
-                                    },
-
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'Network',
-                                    contextId: 'networks'
-                                }),
-
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listNetworks&id=" + args.context.networks[0].id + "&listAll=true"), //pass "&listAll=true" to "listNetworks&id=xxxxxxxx" for now before API gets fixed.
-                                        data: {
-                                            listAll: true
-                                        },
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jsonObj = json.listnetworksresponse.network[0];
-                                            addExtraPropertiesToGuestNetworkObject(jsonObj);
-
-                                            $(window).trigger('cloudStack.module.sharedFunctions.addExtraProperties', {
-                                                obj: jsonObj,
-                                                objType: "Network"
-                                            });
-
-                                            args.response.success({
-                                                actionFilter: cloudStack.actionFilter.guestNetwork,
-                                                data: jsonObj
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            egressRules: {
-                                title: 'label.egress.rules',
-                                custom: function(args) {
-                                    var context = args.context;
-                                    var isConfigRulesMsgShown = false;
-
-                                    return $('<div>').multiEdit({
-                                        context: context,
-                                        noSelect: true,
-                                        noHeaderActionsColumn: true,
-                                        fields: {
-                                            'cidrlist': {
-                                                edit: true,
-                                                label: 'label.cidr.list',
-                                                isOptional: true
-                                            },
-                                            'destcidrlist': {
-                                                 edit: true,
-                                                 label: 'label.cidr.destination.list',
-                                                 isOptional: true
-                                             },
-                                            'protocol': {
-                                                label: 'label.protocol',
-                                                select: function(args) {
-                                                    args.$select.change(function() {
-                                                        var $inputs = args.$form.find('th, td');
-                                                        var $icmpFields = $inputs.filter(function() {
-                                                            var name = $(this).attr('rel');
-
-                                                            return $.inArray(name, [
-                                                                'icmptype',
-                                                                'icmpcode'
-                                                            ]) > -1;
-                                                        });
-                                                        var $otherFields = $inputs.filter(function() {
-                                                            var name = $(this).attr('rel');
-
-                                                            return name != 'cidrlist' &&
-                                                                name != 'destcidrlist' &&
-                                                                name != 'icmptype' &&
-                                                                name != 'icmpcode' &&
-                                                                name != 'protocol' &&
-                                                                name != 'add-rule';
-                                                        });
-
-                                                        if ($(this).val() == 'icmp') {
-                                                            $icmpFields.show();
-                                                            $otherFields.hide();
-                                                        } else if ($(this).val() == 'all') {
-                                                            $icmpFields.hide();
-                                                            $otherFields.hide();
-                                                        } else {
-                                                            $icmpFields.hide();
-                                                            $otherFields.show();
-                                                        }
-                                                    });
-
-                                                    args.response.success({
-                                                        data: [{
-                                                            name: 'tcp',
-                                                            description: 'TCP'
-                                                        }, {
-                                                            name: 'udp',
-                                                            description: 'UDP'
-                                                        }, {
-                                                            name: 'icmp',
-                                                            description: 'ICMP'
-                                                        }, {
-                                                            name: 'all',
-                                                            description: 'All'
-                                                        }]
-                                                    });
-                                                }
-                                            },
-                                            'startport': {
-                                                edit: true,
-                                                label: 'label.start.port',
-                                                isOptional: true
-                                            },
-                                            'endport': {
-                                                edit: true,
-                                                label: 'label.end.port',
-                                                isOptional: true
-                                            },
-                                            'icmptype': {
-                                                edit: true,
-                                                label: 'ICMP.type',
-                                                isHidden: true,
-                                                isOptional: true
-                                            },
-                                            'icmpcode': {
-                                                edit: true,
-                                                label: 'ICMP.code',
-                                                isHidden: true,
-                                                isOptional: true
-                                            },
-                                            'add-rule': {
-                                                label: 'label.add',
-                                                addButton: true
-                                            }
-                                        },
-                                        add: {
-                                            label: 'label.add',
-                                            action: function(args) {
-                                                var data = {
-                                                    protocol: args.data.protocol,
-                                                    cidrlist: args.data.cidrlist,
-                                                    destcidrlist: args.data.destcidrlist,
-                                                    networkid: args.context.networks[0].id
-                                                };
-
-                                                if (args.data.icmptype && args.data.icmpcode) { // ICMP
-                                                    $.extend(data, {
-                                                        icmptype: args.data.icmptype,
-                                                        icmpcode: args.data.icmpcode
-                                                    });
-                                                } else { // TCP/UDP
-                                                    $.extend(data, {
-                                                        startport: args.data.startport,
-                                                        endport: args.data.endport
-                                                    });
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('createEgressFirewallRule'),
-                                                    data: data,
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var jobId = json.createegressfirewallruleresponse.jobid;
-
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobId
-                                                            },
-                                                            notification: {
-                                                                label: 'label.add.egress.rule',
-                                                                poll: pollAsyncJobResult
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function(json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.remove.rule',
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('deleteEgressFirewallRule'),
-                                                        data: {
-                                                            id: args.context.multiRule[0].id
-                                                        },
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(data) {
-                                                            var jobID = data.deleteegressfirewallruleresponse.jobid;
-
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jobID
-                                                                },
-                                                                notification: {
-                                                                    label: 'label.remove.egress.rule',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function(json) {
-                                                            args.response.error(parseXMLHttpResponse(json));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        ignoreEmptyFields: true,
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL('listEgressFirewallRules'),
-                                                data: {
-                                                    listAll: true,
-                                                    networkid: args.context.networks[0].id
-                                                },
-                                                dataType: 'json',
-                                                async: false,
-                                                success: function(json) {
-                                                    var response = json.listegressfirewallrulesresponse.firewallrule ?
-                                                        json.listegressfirewallrulesresponse.firewallrule : [];
-
-                                                    if (response.length > 0) {
-                                                        isConfigRulesMsgShown = true;
-                                                    }
-                                                    args.response.success({
-                                                        data: $.map(response, function(rule) {
-                                                            if (rule.protocol == 'all') {
-                                                                $.extend(rule, {
-                                                                    startport: 'All',
-                                                                    endport: 'All'
-                                                                });
-                                                            } else if (rule.protocol == 'tcp' || rule.protocol == 'udp') {
-                                                                if (!rule.startport) {
-                                                                    rule.startport = ' ';
-                                                                }
-
-                                                                if (!rule.endport) {
-                                                                    rule.endport = ' ';
-                                                                }
-                                                            }
-                                                            if(!rule.destcidrlist){
-                                                                rule.destcidrlist = ' ';
-                                                            }
-                                                            return rule;
-                                                        })
-                                                    });
-                                                }
-                                            });
-
-                                            if (!isConfigRulesMsgShown) {
-                                                isConfigRulesMsgShown = true;
-                                                $.ajax({
-                                                    url: createURL('listNetworkOfferings'),
-                                                    data: {
-                                                        id: args.context.networks[0].networkofferingid
-                                                    },
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var response = json.listnetworkofferingsresponse.networkoffering ?
-                                                            json.listnetworkofferingsresponse.networkoffering[0] : null;
-
-                                                        if (response != null) {
-                                                            if (response.egressdefaultpolicy == true) {
-                                                                cloudStack.dialog.notice({
-                                                                    message: _l('message.configure.firewall.rules.block.traffic')
-                                                                });
-                                                            } else {
-                                                                cloudStack.dialog.notice({
-                                                                    message: _l('message.configure.firewall.rules.allow.traffic')
-                                                                });
-                                                            }
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    });
-                                }
-                            },
-
-                            virtualRouters: {
-                                title: "label.virtual.appliances",
-                                listView: cloudStack.sections.system.subsections.virtualRouters.sections.routerNoGroup.listView
-                            }
-                        }
-                    }
-                }
-            },
-            secondaryNicIps: {
-                title: 'label.menu.ipaddresses',
-                listView: {
-                    id: 'secondaryNicIps',
-                    label: 'label.ips',
-                    fields: {
-                        virtualmachinedisplayname: {
-                            label: 'label.vm.name'
-                        },
-                        ipaddress: {
-                            label: 'label.ips',
-                            converter: function(text, item) {
-                                if (item.issourcenat) {
-                                    return text + ' [' + _l('label.source.nat') + ']';
-                                }
-
-                                return text;
-                            }
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.acquire.new.secondary.ip',
-                            addRow: 'true',
-                            createForm: {
-                                title: 'label.acquire.new.secondary.ip',
-                                desc: 'message.acquire.ip.nic',
-                                fields: {
-                                    ipaddress: {
-                                        label: 'label.ip.address',
-                                        validation: {
-                                            required: false,
-                                            ipv4AndIpv6AddressValidator: true
-                                        }
-                                    }
-                                }
-                            },
-                            messages: {
-                                notification: function(args) {
-                                    return _l('label.acquire.new.secondary.ip');
-                                }
-                            },
-                            action: function(args) {
-                                var dataObj = {
-                                    nicId: args.context.nics[0].id
-                                };
-
-                                if (args.data.ipaddress) {
-                                    dataObj.ipaddress = args.data.ipaddress;
-                                }
-
-                                $.ajax({
-                                    url: createURL('addIpToNic'),
-                                    data: dataObj,
-                                    success: function(json) {
-                                        args.response.success({
-                                            _custom: {
-                                                getUpdatedItem: function(data) {
-                                                    return $.extend(
-                                                        data.queryasyncjobresultresponse.jobresult.nicsecondaryip, {
-                                                            zoneid: args.context.instances[0].zoneid,
-                                                            virtualmachinedisplayname: args.context.instances[0].displayname ? args.context.instances[0].displayname : args.context.instances[0].name
-                                                        }
-                                                    );
-                                                },
-                                                jobId: json.addiptovmnicresponse.jobid
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-
-                        if (args.filterBy.search.value != null) {
-                            data.keyword = args.filterBy.search.value;
-                        }
-
-                        $.ajax({
-                            url: createURL('listNics'),
-                            data: {
-                                nicId: args.context.nics[0].id,
-                                virtualmachineid: args.context.instances[0].id,
-                                keyword: args.filterBy.search.value
-                            },
-                            success: function(json) {
-                                var ips = json.listnicsresponse.nic ? json.listnicsresponse.nic[0].secondaryip : [];
-
-                                args.response.success({
-                                    data: $(ips).map(function(index, ip) {
-                                        return $.extend(ip, {
-                                            zoneid: args.context.instances[0].zoneid,
-                                            virtualmachinedisplayname: args.context.instances[0].displayname ? args.context.instances[0].displayname : args.context.instances[0].name
-                                        });
-                                    })
-                                });
-                            }
-                        });
-                    },
-
-                    // Detail view
-                    detailView: {
-                        name: 'Secondary IP address detail',
-                        actions: {
-                            remove: {
-                                label: 'label.action.release.ip',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('removeIpFromNic'),
-                                        data: {
-                                            id: args.context.secondaryNicIps[0].id
-                                        },
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.removeipfromnicresponse.jobid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.release.ip';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.release.ip';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    ipaddress: {
-                                        label: 'label.ip'
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    virtualmachinedisplayname: {
-                                        label: 'label.vm.name'
-                                    },
-                                    zonename: {
-                                        label: 'label.zone.name'
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listNics'),
-                                        data: {
-                                            nicId: args.context.nics[0].id,
-                                            virtualmachineid: args.context.instances[0].id
-                                        },
-                                        success: function(json) {
-                                            var ips = json.listnicsresponse.nic[0].secondaryip
-
-                                            args.response.success({
-                                                data: $.grep($(ips).map(function(index, ip) {
-                                                    return $.extend(ip, {
-                                                        zonename: args.context.instances[0].zonename,
-                                                        virtualmachinedisplayname: args.context.instances[0].displayname
-                                                    });
-                                                }), function(ip) {
-                                                    return ip.ipaddress == args.context.secondaryNicIps[0].ipaddress;
-                                                })[0]
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            ipAddresses: {
-                type: 'select',
-                title: 'label.menu.ipaddresses',
-                listView: {
-                    id: 'ipAddresses',
-                    label: 'label.ips',
-                    preFilter: function(args) {
-                        if (isAdmin()) {
-                            return ['account']
-                        }
-                        return []
-                    },
-                    fields: {
-                        ipaddress: {
-                            label: 'label.ips',
-                            converter: function(text, item) {
-                                if (item.issourcenat) {
-                                    return text + ' [' + _l('label.source.nat') + ']';
-                                }
-
-                                return text;
-                            }
-                        },
-                        associatednetworkname: {
-                            label: 'label.network'
-                        },
-                        virtualmachinedisplayname: {
-                            label: 'label.vm.name'
-                        },
-                        account: {
-                            label: 'label.account'
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        state: {
-                            converter: function(str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.state',
-                            indicator: {
-                                'Allocated': 'on',
-                                'Released': 'off'
-                            }
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.acquire.new.ip',
-                            addRow: 'true',
-                            preFilter: function(args) {
-                                var zoneObj;
-                                var dataObj = {};
-
-                                if ('vpc' in args.context) { //from VPC section
-                                    $.extend(dataObj, {
-                                        id: args.context.vpc[0].zoneid
-                                    });
-                                } else if ('networks' in args.context) { //from Guest Network section
-                                    $.extend(dataObj, {
-                                        id: args.context.networks[0].zoneid
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('listZones'),
-                                    data: dataObj,
-                                    async: false,
-                                    success: function(json) {
-                                        zoneObj = json.listzonesresponse.zone[0];
-                                    }
-                                });
-
-                                if (zoneObj.networktype == 'Advanced' && zoneObj.securitygroupsenabled) {
-                                    return false;
-                                }
-
-                                if (zoneObj.networktype == 'Basic') {
-                                    var havingEIP = false,
-                                        havingELB = false;
-
-                                    var services = args.context.networks[0].service;
-                                    if(services != null) {
-                                        for(var i = 0; i < services.length; i++) {
-                                            var thisService = services[i];
-                                            var capabilities = thisService.capability;
-                                            if (thisService.name == "StaticNat") {
-                                                if(capabilities != null) {
-                                                    for(var k = 0; k < capabilities.length; k++) {
-                                                        if (capabilities[k].name == "ElasticIp" && capabilities[k].value == "true") {
-                                                            havingEIP = true;
-                                                            break;
-                                                        }
-                                                    }
-                                                }
-                                            } else if (thisService.name == "Lb") {
-                                                if(capabilities != null) {
-                                                    for(var k = 0; k < capabilities.length; k++) {
-                                                        if (capabilities[k].name == "ElasticLb" && capabilities[k].value == "true") {
-                                                            havingELB = true;
-                                                            break;
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-
-                                    if (havingEIP != true || havingELB != true) { //not EIP-ELB
-                                        return false; //acquire new IP is not allowed in non-EIP-ELB basic zone
-                                    }
-                                }
-
-                                //*** from Guest Network section ***
-                                if (!('vpc' in args.context)) {
-                                    if (args.context.networks[0].vpcid == null) { //Guest Network section > non-VPC network, show Acquire IP button
-                                        return true;
-                                    } else { //Guest Network section > VPC network, hide Acquire IP button
-                                        return false;
-                                    }
-                                }
-                                //*** from VPC section ***
-                                else { //'vpc' in args.context //args.context.networks[0] has only one property => name: 'Router'
-                                    return true; //VPC section, show Acquire IP button
-                                }
-                            },
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.acquire.new.ip';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.acquire.new.ip',
-                                desc: 'Please confirm that you want to acquire new IP',
-                                preFilter: function(args) {
-                                    $.ajax({
-                                        url: createURL('listRegions'),
-                                        success: function(json) {
-                                            var selectedRegionName = $(".region-switcher .title").text();
-                                            if ( selectedRegionName == undefined || selectedRegionName.length == 0) {
-                                                selectedRegionName = "Local";
-                                            }
-                                            var items = json.listregionsresponse.region;
-                                            if(items != null) {
-                                                for(var i = 0; i < items.length; i++) {
-                                                    if(items[i].name == selectedRegionName) {
-                                                        if(items[i].portableipserviceenabled == true) {
-                                                            args.$form.find('.form-item[rel=isportable]').css('display', 'inline-block');
-                                                        } else {
-                                                            args.$form.find('.form-item[rel=isportable]').hide();
-                                                        }
-                                                        break;
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    });
-                                },
-                                fields: {
-                                    isportable: {
-                                        label: 'label.cross.zones',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: "false",
-                                                description: _l('label.no')
-                                            });
-                                            items.push({
-                                                id: "true",
-                                                description: _l('label.yes')
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        },
-                                        isHidden: true
-                                    },
-                                    ipaddress: {
-                                        label: 'label.ip.address',
-                                        select: function(args) {
-                                            var data = {
-                                                forvirtualnetwork : true,
-                                                allocatedonly: false
-                                            };
-                                            if ('vpc' in args.context) { //from VPC section
-                                                $.extend(data, {
-                                                    zoneid: args.context.vpc[0].zoneid,
-                                                    domainid: args.context.vpc[0].domainid,
-                                                    account: args.context.vpc[0].account
-                                                });
-                                            } else if ('networks' in args.context) { //from Guest Network section
-                                                $.extend(data, {
-                                                    zoneid: args.context.networks[0].zoneid,
-                                                    domainid: args.context.networks[0].domainid,
-                                                    account: args.context.networks[0].account
-                                                });
-                                            }
-                                            $.ajax({
-                                                url: createURL('listPublicIpAddresses'),
-                                                data: data,
-                                                success: function(json) {
-                                                    var ips = json.listpublicipaddressesresponse.publicipaddress;
-                                                    var items = [];
-                                                    $(ips).each(function() {
-                                                        if (this.state == "Free") {
-                                                            items.push({
-                                                                id: this.ipaddress,
-                                                                description: this.ipaddress
-                                                            });
-                                                        }
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            })
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var dataObj = {};
-                                if (args.$form.find('.form-item[rel=isportable]').css("display") != "none") {
-                                    $.extend(dataObj, {
-                                        isportable: args.data.isportable
-                                    });
-                                }
-
-                                if ('vpc' in args.context) { //from VPC section
-                                    $.extend(dataObj, {
-                                        vpcid: args.context.vpc[0].id
-                                    });
-                                } else if ('networks' in args.context) { //from Guest Network section
-                                    $.extend(dataObj, {
-                                        networkid: args.context.networks[0].id
-                                    });
-
-                                    if (args.context.networks[0].type == "Shared" && !args.context.projects) {
-                                        $.extend(dataObj, {
-                                            domainid: g_domainid,
-                                            account: g_account
-                                        });
-                                    }
-                                }
-
-                                if (args.data.ipaddress != null && args.data.ipaddress.length > 0) {
-                                    $.extend(dataObj, {
-                                        ipaddress: args.data.ipaddress
-                                    });
-                                }
-                                $.ajax({
-                                    url: createURL('associateIpAddress'),
-                                    data: dataObj,
-                                    success: function(data) {
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: data.associateipaddressresponse.jobid,
-                                                getUpdatedItem: function(data) {
-                                                    var newIP = data.queryasyncjobresultresponse.jobresult.ipaddress;
-                                                    return $.extend(newIP, {
-                                                        state: 'Allocated'
-                                                    });
-                                                },
-                                                getActionFilter: function() {
-                                                    return actionFilters.ipAddress;
-                                                }
-                                            }
-                                        });
-                                    },
-
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var items = [];
-                        var data = {};
-                        listViewDataProvider(args, data);
-                        if (args.context.networks) {
-                            $.extend(data, {
-                                associatedNetworkId: args.context.networks[0].id
-                            });
-                        }
-                        if ("vpc" in args.context) {
-                            $.extend(data, {
-                                vpcid: args.context.vpc[0].id
-                            });
-                        }
-
-                        $.ajax({
-                            url: createURL('listPublicIpAddresses'),
-                            data: $.extend({}, data, {
-                                forvirtualnetwork: true //IPs are allocated on public network
-                            }),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                var ips = json.listpublicipaddressesresponse.publicipaddress;
-                                if(ips != null) {
-                                    for(var i = 0; i < ips.length; i++) {
-                                        getExtaPropertiesForIpObj(ips[i], args);
-                                        items.push(ips[i]);
-                                    }
-                                }
-                            }
-                        });
-
-                        if (g_supportELB == "guest") {
-                            $.ajax({
-                                url: createURL('listPublicIpAddresses'),
-                                data: $.extend({}, data, {
-                                    forvirtualnetwork: false, // ELB IPs are allocated on guest network
-                                    forloadbalancing: true
-                                }),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var ips = json.listpublicipaddressesresponse.publicipaddress;
-                                    if(ips != null) {
-                                        for(var i = 0; i < ips.length; i++) {
-                                            getExtaPropertiesForIpObj(ips[i], args);
-                                            items.push(ips[i]);
-                                        }
-                                    }
-                                }
-                            });
-                        }
-
-                        args.response.success({
-                            actionFilter: actionFilters.ipAddress,
-                            data: items
-                        });
-                    },
-
-                    // Detail view
-                    detailView: {
-                        name: 'IP address detail',
-                        tabFilter: function(args) {
-                            var item = args.context.ipAddresses[0];
-
-                            var disabledTabs = [];
-                            var ipAddress = args.context.ipAddresses[0];
-                            var disableVpn = false,
-                                disableIpRules = false;
-
-                            if (!ipAddress.vpnenabled) {
-                                disableVpn = true;
-                            }
-
-                            if (ipAddress.issystem == true) {
-                                disableVpn = true;
-
-                                if (ipAddress.isstaticnat == true || ipAddress.virtualmachineid != null) {
-                                    disableIpRules = true;
-                                }
-                            }
-
-                            if (ipAddress.vpcid != null && ipAddress.issourcenat) { //don't show Configuration(ipRules) tab on VPC sourceNAT IP
-                                disableIpRules = true;
-                            }
-
-                            if (('vpc' in args.context) == false && ipAddress.vpcid != null) { //from Guest Network section, don't show Configuration(ipRules) tab on VPC IP
-                                disableIpRules = true;
-                            }
-
-                            if (disableVpn)
-                                disabledTabs.push('vpn');
-                            if (disableIpRules)
-                                disabledTabs.push('ipRules');
-
-                            return disabledTabs;
-                        },
-                        actions: {
-                            enableVPN: {
-                                label: 'label.enable.vpn',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('createRemoteAccessVpn'),
-                                        data: {
-                                            publicipid: args.context.ipAddresses[0].id,
-                                            domainid: args.context.ipAddresses[0].domainid,
-                                            account: args.context.ipAddresses[0].account
-                                        },
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(data) {
-                                            args.response.success({
-                                                _custom: {
-                                                    getUpdatedItem: function(json) {
-                                                        var vpnenabledAndRunning = false;
-                                                        if (json.queryasyncjobresultresponse.jobresult.remoteaccessvpn.state == "Running") {
-                                                            vpnenabledAndRunning = true;
-                                                        }
-
-                                                        return {
-                                                            remoteaccessvpn: json.queryasyncjobresultresponse.jobresult.remoteaccessvpn,
-                                                            vpnenabled: vpnenabledAndRunning
-                                                        };
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return actionFilters.ipAddress;
-                                                    },
-                                                    jobId: data.createremoteaccessvpnresponse.jobid
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.enable.vpn';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.enable.vpn';
-                                    },
-                                    complete: function(args) {
-                                        var msg;
-                                        if (args.remoteaccessvpn.state == "Running") {
-                                            msg = _l('message.enabled.vpn') + ' ' + args.remoteaccessvpn.publicip + '.' + '<br/>' + _l('message.enabled.vpn.ip.sec') + '<br/>' + args.remoteaccessvpn.presharedkey;
-                                        } else {
-                                            msg = _l('message.network.remote.access.vpn.configuration');
-                                        }
-                                        return msg;
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disableVPN: {
-                                label: 'label.disable.vpn',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('deleteRemoteAccessVpn'),
-                                        data: {
-                                            publicipid: args.context.ipAddresses[0].id,
-                                            domainid: args.context.ipAddresses[0].domainid
-                                        },
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(data) {
-                                            args.response.success({
-                                                _custom: {
-                                                    getUpdatedItem: function(data) {
-                                                        return {
-                                                            vpnenabled: false
-                                                        };
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return actionFilters.ipAddress;
-                                                    },
-                                                    jobId: data.deleteremoteaccessvpnresponse.jobid
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.disable.vpn';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.disable.vpn';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enableStaticNAT: {
-                                label: 'label.action.enable.static.NAT',
-
-                                action: {
-                                    noAdd: true,
-                                    custom: cloudStack.uiCustom.enableStaticNAT({
-                                        tierSelect: function(args) {
-                                            if ('vpc' in args.context) { //from VPC section
-                                                args.$tierSelect.show(); //show tier dropdown
-
-                                                $.ajax({ //populate tier dropdown
-                                                    url: createURL("listNetworks"),
-                                                    async: false,
-                                                    data: {
-                                                        vpcid: args.context.vpc[0].id,
-                                                        //listAll: true,  //do not pass listAll to listNetworks under VPC
-                                                        domainid: args.context.vpc[0].domainid,
-                                                        account: args.context.vpc[0].account,
-                                                        supportedservices: 'StaticNat'
-                                                    },
-                                                    success: function(json) {
-                                                        var networks = json.listnetworksresponse.network;
-                                                        var items = [{
-                                                            id: -1,
-                                                            description: 'Please select a tier'
-                                                        }];
-                                                        $(networks).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.displaytext
-                                                            });
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            } else { //from Guest Network section
-                                                args.$tierSelect.hide();
-                                            }
-
-                                            args.$tierSelect.change(function() {
-                                                args.$tierSelect.closest('.list-view').listView('refresh');
-                                            });
-                                            args.$tierSelect.closest('.list-view').listView('refresh');
-                                        },
-
-                                        listView: $.extend(true, {}, cloudStack.sections.instances, {
-                                            listView: {
-                                                advSearchFields: null, // Not supported in dialogs right now due to display issues
-                                                filters: false,
-                                                subselect: {
-                                                    label: 'label.use.vm.ip',
-                                                    dataProvider: singleVmSecondaryIPSubselect
-                                                },
-                                                dataProvider: function(args) {
-                                                    var data = {
-                                                        page: args.page,
-                                                        pageSize: pageSize,
-                                                        listAll: true
-                                                    };
-
-                                                    if (args.filterBy.search.value) {
-                                                        data.keyword = args.filterBy.search.value;
-                                                    }
-
-                                                    var $tierSelect = $(".ui-dialog-content").find('.tier-select select');
-
-                                                    // if $tierSelect is not initialized, return; tierSelect() will refresh listView and come back here later
-                                                    if ($tierSelect.length == 0) {
-                                                        args.response.success({
-                                                            data: null
-                                                        });
-                                                        return;
-                                                    }
-
-                                                    // if no tier is selected
-                                                    if ($tierSelect.val() == '-1') {
-                                                        args.response.success({
-                                                            data: null
-                                                        });
-                                                        return;
-                                                    }
-
-                                                    if ('vpc' in args.context) {
-                                                        $.extend(data, {
-                                                            networkid: $tierSelect.val(),
-                                                            vpcid: args.context.vpc[0].id
-                                                        });
-                                                        $.extend(args.context, {
-                                                            networkid: $tierSelect.val(),
-                                                            vpcid: args.context.vpc[0].id
-                                                        });
-                                                    } else if ('networks' in args.context && !args.context.ipAddresses[0].isportable) {
-                                                        $.extend(data, {
-                                                            networkid: args.context.networks[0].id
-                                                        });
-                                                    }
-
-                                                    if (!args.context.projects) {
-                                                        $.extend(data, {
-                                                            account: args.context.ipAddresses[0].account,
-                                                            domainid: args.context.ipAddresses[0].domainid
-                                                        });
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL('listVirtualMachines'),
-                                                        data: data,
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(data) {
-                                                            args.response.success({
-                                                                data: $.grep(
-                                                                    data.listvirtualmachinesresponse.virtualmachine ?
-                                                                        data.listvirtualmachinesresponse.virtualmachine : [],
-                                                                    function(instance) {
-                                                                        return $.inArray(instance.state, [
-                                                                            'Destroyed', 'Expunging'
-                                                                        ]) == -1;
-                                                                    }
-                                                                )
-                                                            });
-                                                        },
-                                                        error: function(data) {
-                                                            args.response.error(parseXMLHttpResponse(data));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }),
-                                        action: function(args) {
-                                            var data = {
-                                                ipaddressid: args.context.ipAddresses[0].id,
-                                                virtualmachineid: args.context.instances[0].id
-                                            };
-
-                                            if (args.context.ipAddresses[0].isportable) {
-                                                var subselect = args._subselect.split(',');
-                                                var networkid = subselect[0];
-                                                var vmguestip = subselect[1];
-
-                                                data.networkid = subselect[0];
-
-                                                if (parseInt(vmguestip) !== -1) {
-                                                    data.vmguestip = vmguestip;
-                                                }
-                                            } else if (args._subselect && args._subselect != -1) {
-                                                data.vmguestip = args._subselect;
-                                            }
-
-                                            if ('vpc' in args.context) {
-                                                if (args.tierID == '-1') {
-                                                    args.response.error('Tier is required');
-                                                    return;
-                                                }
-                                                $.extend(data, {
-                                                    networkid: args.tierID
-                                                });
-                                            }
-
-                                            $.ajax({
-                                                url: createURL('enableStaticNat'),
-                                                data: data,
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    args.response.success({});
-                                                },
-                                                error: function(data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        }
-                                    })
-                                },
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.enable.static.NAT';
-                                    }
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                isstaticnat: true
-                                            }
-                                        });
-
-                                        if (args._custom.$detailView.is(':visible')) {
-                                            ipChangeNotice();
-                                        }
-                                    }
-                                }
-                            },
-                            disableStaticNAT: {
-                                label: 'label.action.disable.static.NAT',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('disableStaticNat'),
-                                        data: {
-                                            ipaddressid: args.context.ipAddresses[0].id
-                                        },
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(data) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: data.disablestaticnatresponse.jobid,
-                                                    getUpdatedItem: function() {
-                                                        return {
-                                                            isstaticnat: false,
-                                                            virtualmachinedisplayname: ""
-                                                        };
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return function(args) {
-                                                            return ['enableStaticNAT'];
-                                                        };
-                                                    },
-                                                    onComplete: function(args, _custom) {
-                                                        if (_custom.$detailView.is(':visible')) {
-                                                            ipChangeNotice();
-                                                        }
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.disable.static.NAT';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.disable.static.NAT';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            remove: {
-                                label: 'label.action.release.ip',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('disassociateIpAddress'),
-                                        data: {
-                                            id: args.context.ipAddresses[0].id
-                                        },
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(data) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: data.disassociateipaddressresponse.jobid,
-                                                    getActionFilter: function() {
-                                                        return function(args) {
-                                                            var allowedActions = ['enableStaticNAT'];
-
-                                                            return allowedActions;
-                                                        };
-                                                    },
-                                                    getUpdatedItem: function(args) {
-                                                        return {
-                                                            state: 'Released'
-                                                        };
-                                                    },
-                                                    onComplete: function() {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.release.ip';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.release.ip';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                preFilter: function(args) {
-                                    var hiddenFields = [];
-                                    var zoneObj;
-                                    $.ajax({
-                                        url: createURL("listZones&id=" + args.context.ipAddresses[0].zoneid),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function(json) {
-                                            zoneObj = json.listzonesresponse.zone[0];
-                                        }
-                                    });
-                                    if (zoneObj.networktype == "Advanced") {
-                                        hiddenFields.push("issystem");
-                                        hiddenFields.push("purpose");
-                                    }
-
-                                    if (!isAdmin()) {
-                                        hiddenFields.push("vlanname");
-                                    }
-                                    return hiddenFields;
-                                },
-                                fields: [{
-                                    ipaddress: {
-                                        label: 'label.ip'
-                                    }
-                                }, {
-                                    isportable: {
-                                        label: 'label.cross.zones',
-                                        converter: function(data) {
-                                            return data ? _l('label.yes') : _l('label.no');
-                                        }
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    associatednetworkid: {
-                                        label: 'label.associated.network.id'
-                                    },
-                                    associatednetworkname: {
-                                        label: 'label.network.name'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    networkid: {
-                                        label: 'label.network.id'
-                                    },
-                                    issourcenat: {
-                                        label: 'label.source.nat',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    isstaticnat: {
-                                        label: 'label.static.nat',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    vmipaddress: {
-                                        label: 'label.vm.ip'
-                                    },
-                                    issystem: {
-                                        label: 'label.is.system',
-                                        converter: cloudStack.converters.toBooleanText
-                                    }, //(basic zone only)
-                                    purpose: {
-                                        label: 'label.purpose'
-                                    }, //(basic zone only) When an IP is system-generated, the purpose it serves can be Lb or static nat.
-                                    virtualmachinedisplayname: {
-                                        label: 'label.vm.name'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    vlanname: {
-                                        label: 'label.vlan.only'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'PublicIpAddress',
-                                    contextId: 'ipAddresses'
-                                }),
-
-                                dataProvider: function(args) {
-                                    var items = args.context.ipAddresses;
-
-                                    $.ajax({
-                                        url: createURL('listPublicIpAddresses'),
-                                        data: {
-                                            id: args.context.ipAddresses[0].id
-                                        },
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var ipObj = json.listpublicipaddressesresponse.publicipaddress[0];
-                                            getExtaPropertiesForIpObj(ipObj, args);
-
-                                            var network = $.grep(
-                                                args.context.vpc ?
-                                                    args.context.vpc[0].network : args.context.networks,
-                                                function(network) {
-                                                    return network.id = ipObj.associatednetworkid;
-                                                })[0];
-
-                                            args.response.success({
-                                                actionFilter: actionFilters.ipAddress,
-                                                data: ipObj
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            },
-
-                            ipRules: { //Configuration tab
-                                title: 'label.configuration',
-                                custom: cloudStack.ipRules({
-                                    preFilter: function(args) {
-                                        var disallowedActions = [];
-                                        if (args.context.ipAddresses[0].isstaticnat)
-                                            disallowedActions.push("nonStaticNATChart"); //tell ipRules widget to show staticNAT chart instead of non-staticNAT chart.
-
-                                        var havingFirewallService = false;
-                                        var havingPortForwardingService = false;
-                                        var havingLbService = false;
-                                        var havingVpnService = false;
-
-                                        if (!('vpc' in args.context)) { //from Guest Network section
-                                            var services = args.context.networks[0].service;
-                                            if(services != null) {
-                                                for(var i = 0; i < services.length; i++) {
-                                                    var thisService = services[i];
-                                                    if (thisService.name == "Firewall")
-                                                        havingFirewallService = true;
-                                                    if (thisService.name == "PortForwarding")
-                                                        havingPortForwardingService = true;
-                                                    if (thisService.name == "Lb")
-                                                        havingLbService = true;
-                                                    if (thisService.name == "Vpn")
-                                                        havingVpnService = true;
-                                                }
-                                            }
-                                        } else { //from VPC section
-                                            //a VPC network from Guest Network section or from VPC section
-                                            // Firewall is not supported in IP from VPC section
-                                            // (because ACL has already supported in tier from VPC section)
-                                            havingFirewallService = false;
-                                            disallowedActions.push("firewall");
-
-                                            havingVpnService = false; //VPN is not supported in IP from VPC section
-
-                                            if (args.context.ipAddresses[0].associatednetworkid == null) { //IP is not associated with any tier yet
-                                                havingPortForwardingService = true;
-                                                havingLbService = true;
-                                            } else { //IP is associated with a tier
-                                                $.ajax({
-                                                    url: createURL('listNetworks'),
-                                                    data: {
-                                                        listAll: true,
-                                                        id: args.context.ipAddresses[0].associatednetworkid
-                                                    },
-                                                    async: false,
-                                                    success: function(json) {
-                                                        var networkObj = json.listnetworksresponse.network[0];
-                                                        var services = networkObj.service;
-                                                        if(services != null) {
-                                                            for(var i = 0; i < services.length; i++) {
-                                                                if (services[i].name == "PortForwarding")
-                                                                    havingPortForwardingService = true;
-                                                                if (services[i].name == "Lb")
-                                                                    havingLbService = true;
-                                                            }
-                                                        }
-
-                                                        if (networkObj.networkofferingconservemode == false) {
-                                                            /*
-                                                             (1) If IP is SourceNat, no StaticNat/VPN/PortForwarding/LoadBalancer can be enabled/added.
-                                                             */
-                                                            if (args.context.ipAddresses[0].issourcenat) {
-                                                                if (havingFirewallService == false) { //firewall is not supported in IP from VPC section (because ACL has already supported in tier from VPC section)
-                                                                    disallowedActions.push("firewall");
-                                                                }
-
-                                                                disallowedActions.push("portForwarding");
-                                                                disallowedActions.push("loadBalancing");
-                                                            }
-
-                                                            /*
-                                                             (2) If IP is non-SourceNat, show StaticNat/VPN/PortForwarding/LoadBalancer at first.
-                                                             1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer.
-                                                             2. If VPN service is supported (i.e. IP comes from Guest Network section, not from VPC section), once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer.
-                                                             3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer.
-                                                             4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding.
-                                                             */
-                                                            else { //args.context.ipAddresses[0].issourcenat == false
-                                                                if (havingFirewallService == false)
-                                                                    disallowedActions.push("firewall");
-                                                                if (havingPortForwardingService == false)
-                                                                    disallowedActions.push("portForwarding");
-                                                                if (havingLbService == false)
-                                                                    disallowedActions.push("loadBalancing");
-
-                                                                if (args.context.ipAddresses[0].isstaticnat) { //1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer.
-                                                                    disallowedActions.push("portForwarding");
-                                                                    disallowedActions.push("loadBalancing");
-                                                                }
-                                                                if (havingVpnService && args.context.ipAddresses[0].vpnenabled) { //2. If VPN service is supported (i.e. IP comes from Guest Network section, not from VPC section), once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer.
-                                                                    disallowedActions.push("portForwarding");
-                                                                    disallowedActions.push("loadBalancing");
-                                                                }
-
-                                                                //3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer.
-                                                                $.ajax({
-                                                                    url: createURL('listPortForwardingRules'),
-                                                                    data: {
-                                                                        ipaddressid: args.context.ipAddresses[0].id,
-                                                                        listAll: true
-                                                                    },
-                                                                    dataType: 'json',
-                                                                    async: false,
-                                                                    success: function(json) {
-                                                                        // Get instance
-                                                                        var rules = json.listportforwardingrulesresponse.portforwardingrule;
-                                                                        if (rules != null && rules.length > 0) {
-                                                                            disallowedActions.push("loadBalancing");
-                                                                        }
-                                                                    }
-                                                                });
-
-                                                                //4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding.
-                                                                $.ajax({
-                                                                    url: createURL('listLoadBalancerRules'),
-                                                                    data: {
-                                                                        publicipid: args.context.ipAddresses[0].id,
-                                                                        listAll: true
-                                                                    },
-                                                                    dataType: 'json',
-                                                                    async: false,
-                                                                    success: function(json) {
-                                                                        var rules = json.listloadbalancerrulesresponse.loadbalancerrule;
-                                                                        if (rules != null && rules.length > 0) {
-                                                                            disallowedActions.push("portForwarding");
-                                                                        }
-                                                                    }
-                                                                });
-                                                            }
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        }
-
-                                        return disallowedActions;
-                                    },
-
-                                    // Firewall rules
-                                    firewall: {
-                                        noSelect: true,
-                                        fields: {
-                                            'cidrlist': {
-                                                edit: true,
-                                                label: 'label.cidr.list'
-                                            },
-                                            'protocol': {
-                                                label: 'label.protocol',
-                                                select: function(args) {
-                                                    args.$select.change(function() {
-                                                        var $inputs = args.$form.find('input');
-                                                        var $icmpFields = $inputs.filter(function() {
-                                                            var name = $(this).attr('name');
-
-                                                            return $.inArray(name, [
-                                                                'icmptype',
-                                                                'icmpcode'
-                                                            ]) > -1;
-                                                        });
-                                                        var $otherFields = $inputs.filter(function() {
-                                                            var name = $(this).attr('name');
-
-                                                            return name != 'icmptype' && name != 'icmpcode' && name != 'cidrlist';
-                                                        });
-
-                                                        if ($(this).val() == 'icmp') {
-                                                            $icmpFields.show();
-                                                            $icmpFields.attr('disabled', false);
-                                                            $otherFields.attr('disabled', 'disabled');
-                                                            $otherFields.hide();
-                                                            $otherFields.parent().find('label.error').hide();
-                                                        } else {
-                                                            $otherFields.show();
-                                                            $otherFields.parent().find('label.error').hide();
-                                                            $otherFields.attr('disabled', false);
-                                                            $icmpFields.attr('disabled', 'disabled');
-                                                            $icmpFields.hide();
-                                                            $icmpFields.parent().find('label.error').hide();
-                                                        }
-                                                    });
-
-                                                    args.response.success({
-                                                        data: [{
-                                                            name: 'tcp',
-                                                            description: 'TCP'
-                                                        }, {
-                                                            name: 'udp',
-                                                            description: 'UDP'
-                                                        }, {
-                                                            name: 'icmp',
-                                                            description: 'ICMP'
-                                                        }]
-                                                    });
-                                                }
-                                            },
-                                            'startport': {
-                                                edit: true,
-                                                label: 'label.start.port',
-                                                isOptional: true
-                                            },
-                                            'endport': {
-                                                edit: true,
-                                                label: 'label.end.port',
-                                                isOptional: true
-                                            },
-                                            'icmptype': {
-                                                edit: true,
-                                                label: 'ICMP.type',
-                                                isDisabled: true
-                                            },
-                                            'icmpcode': {
-                                                edit: true,
-                                                label: 'ICMP.code',
-                                                isDisabled: true
-                                            },
-                                            'add-rule': {
-                                                label: 'label.add.rule',
-                                                addButton: true
-                                            },
-                                            'state' : {
-                                                edit: 'ignore',
-                                                label: 'label.state'
-                                            }
-                                        },
-
-                                        tags: cloudStack.api.tags({
-                                            resourceType: 'FirewallRule',
-                                            contextId: 'multiRule'
-                                        }),
-
-                                        add: {
-                                            label: 'label.add',
-                                            action: function(args) {
-                                                $.ajax({
-                                                    url: createURL('createFirewallRule'),
-                                                    data: $.extend(args.data, {
-                                                        ipaddressid: args.context.ipAddresses[0].id
-                                                    }),
-                                                    dataType: 'json',
-                                                    success: function(data) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: data.createfirewallruleresponse.jobid
-                                                            },
-                                                            notification: {
-                                                                label: 'label.add.firewall',
-                                                                poll: pollAsyncJobResult
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function(data) {
-                                                        args.response.error(parseXMLHttpResponse(data));
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.action.delete.firewall',
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('deleteFirewallRule'),
-                                                        data: {
-                                                            id: args.context.multiRule[0].id
-                                                        },
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(data) {
-                                                            var jobID = data.deletefirewallruleresponse.jobid;
-
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jobID
-                                                                },
-                                                                notification: {
-                                                                    label: 'label.action.delete.firewall',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-
-                                                        error: function(data) {
-                                                            args.response.error(parseXMLHttpResponse(data));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL('listFirewallRules'),
-                                                data: {
-                                                    listAll: true,
-                                                    ipaddressid: args.context.ipAddresses[0].id
-                                                },
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    args.response.success({
-                                                        data: data.listfirewallrulesresponse.firewallrule
-                                                    });
-                                                },
-                                                error: function(data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    staticNATDataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('listPublicIpAddresses'),
-                                            data: {
-                                                id: args.context.ipAddresses[0].id,
-                                                listAll: true
-                                            },
-                                            dataType: 'json',
-                                            async: true,
-                                            success: function(data) {
-                                                var ipObj = data.listpublicipaddressesresponse.publicipaddress[0];
-                                                getExtaPropertiesForIpObj(ipObj, args);
-
-                                                args.response.success({
-                                                    data: ipObj
-                                                });
-                                            },
-                                            error: function(data) {
-                                                args.response.error(parseXMLHttpResponse(data));
-                                            }
-                                        });
-                                    },
-
-                                    vmDataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('listVirtualMachines'),
-                                            data: {
-                                                id: args.context.ipAddresses[0].virtualmachineid,
-                                                listAll: true
-                                            },
-                                            dataType: 'json',
-                                            async: true,
-                                            success: function(data) {
-                                                args.response.success({
-                                                    data: data.listvirtualmachinesresponse.virtualmachine[0]
-                                                });
-                                            },
-                                            error: function(data) {
-                                                args.response.error(parseXMLHttpResponse(data));
-                                            }
-                                        });
-                                    },
-
-                                    vmDetails: cloudStack.sections.instances.listView.detailView,
-
-                                    // Load balancing rules
-                                    loadBalancing: {
-                                        listView: $.extend(true, {}, cloudStack.sections.instances, {
-                                            listView: {
-                                                fields: {
-                                                    name: {
-                                                        label: 'label.name'
-                                                    },
-                                                    displayname: {
-                                                        label: 'label.display.name'
-                                                    },
-                                                    zonename: {
-                                                        label: 'label.zone.name'
-                                                    },
-                                                    state: {
-                                                        label: 'label.state',
-                                                        indicator: {
-                                                            'Running': 'on',
-                                                            'Stopped': 'off',
-                                                            'Destroyed': 'off',
-                                                            'Error': 'off'
-                                                        }
-                                                    }
-                                                },
-                                                filters: false,
-
-                                                //when server-side change of adding new parameter "vmidipmap" to assignToLoadBalancerRule API is in, uncomment the following commented 4 lines.
-                                                subselect: {
-                                                    isMultiple: true,
-                                                    label: 'label.use.vm.ips',
-                                                    dataProvider: multipleVmSecondaryIPSubselect
-                                                },
-
-                                                dataProvider: function(args) {
-                                                    var itemData = $.isArray(args.context.multiRule) && args.context.subItemData ? args.context.subItemData : [];
-
-                                                    var data = {};
-                                                    listViewDataProvider(args, data);
-
-                                                    var networkid;
-                                                    if ('vpc' in args.context) {
-                                                        networkid = args.context.multiData.tier;
-                                                    } else {
-                                                        networkid = args.context.ipAddresses[0].associatednetworkid;
-                                                    }
-                                                    $.extend(data, {
-                                                        networkid: networkid
-                                                    });
-
-                                                    if (!args.context.projects) {
-                                                        $.extend(data, {
-                                                            account: args.context.ipAddresses[0].account,
-                                                            domainid: args.context.ipAddresses[0].domainid
-                                                        });
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL('listVirtualMachines'),
-                                                        data: data,
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(data) {
-                                                            var vmData = $.grep(
-                                                                data.listvirtualmachinesresponse.virtualmachine ?
-                                                                    data.listvirtualmachinesresponse.virtualmachine : [],
-                                                                function(instance) {
-                                                                    //Hiding the autoScale VMs
-                                                                    var nonAutoScale = 0;
-                                                                    if (instance.displayname == null)
-                                                                        nonAutoScale = 1
-                                                                    else {
-                                                                        if (instance.displayname.match(/AutoScale-LB-/) == null)
-                                                                            nonAutoScale = 1;
-                                                                        else {
-                                                                            if (instance.displayname.match(/AutoScale-LB-/).length)
-                                                                                nonAutoScale = 0;
-                                                                        }
-                                                                    }
-                                                                    var isActiveState = $.inArray(instance.state, ['Destroyed', 'Expunging']) == -1;
-                                                                    var notExisting = !$.grep(itemData, function(item) {
-                                                                        return item.id == instance.id;
-                                                                    }).length;
-
-                                                                    // Check if there are any remaining IPs
-                                                                    if (!notExisting) {
-                                                                        $.ajax({
-                                                                            url: createURL('listNics'),
-                                                                            async: false,
-                                                                            data: {
-                                                                                virtualmachineid: instance.id
-                                                                            },
-                                                                            success: function(json) {
-                                                                                var nics = json.listnicsresponse.nic;
-
-                                                                                $(nics).map(function (index, nic) {
-                                                                                    if (nic.secondaryip) {
-                                                                                        var targetIPs = $(nic.secondaryip).map(function (index, sip) {
-                                                                                            return sip.ipaddress;
-                                                                                        });
-
-                                                                                        var lbIPs = $(itemData).map(function(index, item) { return item.itemIp; });
-
-                                                                                        targetIPs.push(nic.ipaddress);
-
-                                                                                        var matchingIPs = $.grep(targetIPs, function(item) {
-                                                                                            return $.inArray(item, lbIPs) > -1;
-                                                                                        });
-
-                                                                                        if (targetIPs.length - matchingIPs.length) {
-                                                                                            notExisting = true;
-
-                                                                                            return false;
-                                                                                        }
-                                                                                    }
-                                                                                });
-                                                                            }
-                                                                        })
-                                                                    }
-
-                                                                    return nonAutoScale && isActiveState && notExisting;
-                                                                }
-                                                            );
-
-                                                            args.response.success({
-                                                                data: vmData
-                                                            });
-                                                        },
-                                                        error: function(data) {
-                                                            args.response.error(parseXMLHttpResponse(data));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }),
-                                        headerFields: {
-                                            tier: {
-                                                label: 'label.tier',
-                                                select: function(args) {
-                                                    if ('vpc' in args.context) {
-                                                        var data = {
-                                                            //listAll: true,  //do not pass listAll to listNetworks under VPC
-                                                            domainid: args.context.vpc[0].domainid,
-                                                            account: args.context.vpc[0].account,
-                                                            supportedservices: 'Lb'
-                                                        };
-                                                        if (args.context.ipAddresses[0].associatednetworkid == null) {
-                                                            $.extend(data, {
-                                                                vpcid: args.context.vpc[0].id,
-                                                                domainid: args.context.vpc[0].domainid,
-                                                                account: args.context.vpc[0].account
-                                                            });
-                                                        } else {
-                                                            $.extend(data, {
-                                                                id: args.context.ipAddresses[0].associatednetworkid
-                                                            });
-                                                        }
-
-                                                        $.ajax({
-                                                            url: createURL("listNetworks"),
-                                                            data: data,
-                                                            success: function(json) {
-                                                                var networks = json.listnetworksresponse.network;
-                                                                var items = [];
-                                                                $(networks).each(function() {
-                                                                    items.push({
-                                                                        id: this.id,
-                                                                        description: this.displaytext
-                                                                    });
-                                                                });
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        multipleAdd: true,
-
-                                        fields: {
-                                            'name': {
-                                                edit: true,
-                                                label: 'label.name',
-                                                isEditable: true
-                                            },
-                                            'publicport': {
-                                                edit: true,
-                                                label: 'label.public.port'
-                                            },
-                                            'privateport': {
-                                                edit: true,
-                                                label: 'label.private.port'
-                                            },
-                                            'algorithm': {
-                                                label: 'label.algorithm',
-                                                isEditable: true,
-                                                select: function(args) {
-                                                    var data = [{
-                                                        id: 'roundrobin',
-                                                        name: 'roundrobin',
-                                                        description: _l('label.lb.algorithm.roundrobin')
-                                                    }, {
-                                                        id: 'leastconn',
-                                                        name: 'leastconn',
-                                                        description: _l('label.lb.algorithm.leastconn')
-                                                    }, {
-                                                        id: 'source',
-                                                        name: 'source',
-                                                        description: _l('label.lb.algorithm.source')
-                                                    }];
-                                                    if (typeof args.context != 'undefined') {
-                                                        var lbAlgs = getLBAlgorithms(args.context.networks[0]);
-                                                        data = (lbAlgs.length == 0) ? data : lbAlgs;
-                                                    }
-                                                    args.response.success({
-                                                        data: data
-                                                    });
-                                                }
-                                            },
-
-                                            'sticky': {
-                                                label: 'label.stickiness',
-                                                custom: {
-                                                    buttonLabel: 'label.configure',
-                                                    action: cloudStack.lbStickyPolicy.dialog()
-                                                }
-                                            },
-
-                                            'protocol': {
-                                                label: 'label.protocol',
-                                                isEditable: true,
-                                                select: function(args) {
-                                                    var data = [{
-                                                            id: 'tcp',
-                                                            name: 'tcp',
-                                                            description: _l('label.lb.protocol.tcp')
-                                                        }, {
-                                                            id: 'udp',
-                                                            name: 'udp',
-                                                            description: _l('label.lb.protocol.udp')
-                                                        }, {
-                                                            id: 'tcp-proxy',
-                                                            name: 'tcp-proxy',
-                                                            description: _l('label.lb.protocol.tcp.proxy')
-                                                        }, {
-                                                            id: 'ssl',
-                                                            name: 'ssl',
-                                                            description: _l('label.lb.protocol.ssl')
-                                                        }];
-                                                    if (typeof args.context != 'undefined') {
-                                                        var lbProtocols = getLBProtocols(args.context.networks[0]);
-                                                        data = (lbProtocols.length == 0) ? data : lbProtocols;
-                                                    }
-                                                    args.response.success({
-                                                        data: data
-                                                    });
-                                                }
-                                            },
-
-                                            'sslcertificate': {
-                                                label: 'label.update.ssl',
-                                                custom: {
-                                                    buttonLabel: 'label.configure',
-                                                    action: cloudStack.lbCertificatePolicy.dialog()
-                                                }
-                                            },
-
-                                            'health-check': {
-                                                label: 'label.health.check',
-                                                custom: {
-                                                    requireValidation: true,
-                                                    buttonLabel: 'Configure',
-                                                    action: cloudStack.uiCustom.healthCheck()
-                                                },
-                                                isHidden: function(args) {
-                                                    if (!('vpc' in args.context)) {  //From Guest Network section
-                                                        var lbProviderIsNetscaler = false;
-                                                        $.ajax({
-                                                            url: createURL('listNetworkOfferings'),
-                                                            data: {
-                                                                id: args.context.networks[0].networkofferingid
-                                                            },
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var networkOffering = json.listnetworkofferingsresponse.networkoffering[0];
-                                                                var services = networkOffering.service;
-                                                                lbProviderIsNetscaler = checkIfNetScalerProviderIsEnabled(services);
-                                                            }
-                                                        });
-                                                        if (lbProviderIsNetscaler == true) { //Health-Check is only supported on Netscaler (but not on any other provider)
-                                                            return false; //Show Health-Check button
-                                                        } else {
-                                                            return 2; //Hide Health-Check button (Both Header and Form)
-                                                        }
-                                                    } else { //From VPC section
-                                                        var lbProviderIsNetscaler;
-                                                        var services = args.context.vpc[0].service;
-                                                        lbProviderIsNetscaler = checkIfNetScalerProviderIsEnabled(services);
-                                                        if (lbProviderIsNetscaler == true) { //Health-Check is only supported on Netscaler (but not on any other provider)
-                                                            return false; //Show Health-Check button
-                                                        } else {
-                                                            return 2; //Hide Health-Check button (both Header and Form)
-                                                        }
-                                                    }
-                                                }
-                                            },
-
-                                            'autoScale': {
-                                                label: 'label.autoscale',
-                                                custom: {
-                                                    requireValidation: true,
-                                                    buttonLabel: 'label.configure',
-                                                    action: cloudStack.uiCustom.autoscaler(cloudStack.autoscaler)
-                                                },
-                                                isHidden: function(args) {
-                                                    if (!('vpc' in args.context)) {  //from Guest Network section
-                                                        var lbProviderIsNetscaler = false;
-                                                        $.ajax({
-                                                            url: createURL('listNetworkOfferings'),
-                                                            data: {
-                                                                id: args.context.networks[0].networkofferingid
-                                                            },
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var networkOffering = json.listnetworkofferingsresponse.networkoffering[0];
-                                                                var services = networkOffering.service;
-                                                                lbProviderIsNetscaler = checkIfNetScalerProviderIsEnabled(services);
-                                                            }
-                                                        });
-                                                        if (lbProviderIsNetscaler == true) { //AutoScale is only supported on Netscaler (but not on any other provider like VirtualRouter)
-                                                            return false; //show AutoScale button
-                                                        } else {
-                                                            return 2; //hide Autoscale button (both header and form)
-                                                        }
-                                                    } else { //from VPC section
-                                                        var lbProviderIsNetscaler;
-                                                        var services = args.context.vpc[0].service;
-
-                                                        lbProviderIsNetscaler = checkIfNetScalerProviderIsEnabled(services);
-
-                                                        if (lbProviderIsNetscaler == true) { //AutoScale is only supported on Netscaler (but not on any other provider like VirtualRouter)
-                                                            return false; //show AutoScale button
-                                                        } else {
-                                                            return 2; //hide Autoscale button (both header and form)
-                                                        }
-                                                    }
-                                                }
-                                            },
-                                            'add-vm': {
-                                                label: 'label.add.vms',
-                                                addButton: true
-                                            },
-                                            'state' : {
-                                                edit: 'ignore',
-                                                label: 'label.state'
-                                            }
-                                        },
-
-                                        tags: cloudStack.api.tags({
-                                            resourceType: 'LoadBalancer',
-                                            contextId: 'multiRule'
-                                        }),
-
-                                        add: {
-                                            label: 'label.add.vms',
-                                            action: function(args) {
-                                                var networkid;
-                                                if ('vpc' in args.context) { //from VPC section
-                                                    if (args.data.tier == null) {
-                                                        args.response.error('Tier is required');
-                                                        return;
-                                                    }
-                                                    networkid = args.data.tier;
-                                                } else if ('networks' in args.context) { //from Guest Network section
-                                                    networkid = args.context.networks[0].id;
-                                                }
-                                                var data = {
-                                                    algorithm: args.data.algorithm,
-                                                    name: args.data.name,
-                                                    privateport: args.data.privateport,
-                                                    publicport: args.data.publicport,
-                                                    openfirewall: false,
-                                                    networkid: networkid,
-                                                    publicipid: args.context.ipAddresses[0].id,
-                                                    protocol: args.data.protocol
-                                                };
-
-                                                var stickyData = $.extend(true, {}, args.data.sticky);
-                                                var certificateData = $.extend(true, {}, args.data.sslcertificate);
-
-                                                //***** create new LB rule > Add VMs *****
-                                                $.ajax({
-                                                    url: createURL('createLoadBalancerRule'),
-                                                    data: data,
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(data) {
-                                                        var itemData = args.itemData;
-                                                        var jobID = data.createloadbalancerruleresponse.jobid;
-                                                        var lbID = data.createloadbalancerruleresponse.id;
-
-                                                        var inputData = {
-                                                        	id: data.createloadbalancerruleresponse.id
-                                                        };
-
-                                                        var selectedVMs = args.itemData;
-                                                        if (selectedVMs != null) {
-                                                        	var vmidipmapIndex = 0;
-                                                    		for (var vmIndex = 0; vmIndex < selectedVMs.length; vmIndex++) {
-                                                    			var selectedIPs = selectedVMs[vmIndex]._subselect;
-                                                    			for (var ipIndex = 0; ipIndex < selectedIPs.length; ipIndex++) {
-                                                    				inputData['vmidipmap[' + vmidipmapIndex + '].vmid'] = selectedVMs[vmIndex].id;
-
-                                                    				if (args.context.ipAddresses[0].isportable) {
-                                                        			    inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex].split(',')[1];
-                                                        			} else {
-                                                        				inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex];
-                                                        			}
-
-                                                    				vmidipmapIndex++;
-                                                    			}
-                                                    		}
-                                                    	}
-
-                                                        $.ajax({
-                                                            url: createURL('assignToLoadBalancerRule'),
-                                                            data: inputData,
-                                                            success: function(data) {
-                                                                var jobID = data.assigntoloadbalancerruleresponse.jobid;
-                                                                var lbStickyCreated = false;
-                                                                var lbCertificateCreated = false;
-
-                                                                args.response.success({
-                                                                    _custom: {
-                                                                        jobId: jobID
-                                                                    },
-                                                                    notification: {
-                                                                        label: 'label.add.load.balancer',
-                                                                        poll: function(args) {
-                                                                            var complete = args.complete;
-                                                                            var error = args.error;
-
-                                                                            pollAsyncJobResult({
-                                                                                _custom: {
-                                                                                    jobId: jobID
-                                                                                },
-                                                                                complete: function(args) {
-                                                                                    if (lbStickyCreated && lbCertificateCreated) {
-                                                                                            return;
-                                                                                    }
-
-                                                                                    if (!lbStickyCreated) {
-                                                                                        lbStickyCreated = true;
-
-                                                                                        if (stickyData && stickyData.methodname && stickyData.methodname != 'None') {
-                                                                                            cloudStack.lbStickyPolicy.actions.add(lbID, stickyData, complete, error);
-                                                                                        }
-                                                                                    }
-
-                                                                                    if (!lbCertificateCreated) {
-                                                                                        lbCertificateCreated = true;
-
-                                                                                        if (certificateData && certificateData.certificate && certificateData.certificate != 'None') {
-                                                                                            cloudStack.lbCertificatePolicy.actions.add(lbID, certificateData, complete, error);
-                                                                                        } else {
-                                                                                            complete();
-                                                                                        }
-                                                                                    } else {
-                                                                                        complete();
-                                                                                    }
-                                                                                },
-                                                                                error: error
-                                                                            });
-                                                                        }
-                                                                    }
-                                                                });
-                                                            },
-                                                            error: function(data) {
-                                                                args.response.error(parseXMLHttpResponse(data));
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function(data) {
-                                                        args.response.error(parseXMLHttpResponse(data));
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actions: {
-                                            edit: {
-                                                label: 'label.edit',
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('updateLoadBalancerRule'),
-                                                        data: $.extend(args.data, {
-                                                            id: args.context.multiRule[0].id
-                                                        }),
-                                                        success: function(json) {
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: json.updateloadbalancerruleresponse.jobid
-                                                                },
-                                                                notification: {
-                                                                    label: 'label.edit.lb.rule',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            destroy: {
-                                                label: 'label.action.delete.load.balancer',
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('deleteLoadBalancerRule'),
-                                                        data: {
-                                                            id: args.context.multiRule[0].id
-                                                        },
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(data) {
-                                                            var jobID = data.deleteloadbalancerruleresponse.jobid;
-
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jobID
-                                                                },
-                                                                notification: {
-                                                                    label: 'label.action.delete.load.balancer',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function(data) {
-                                                            args.response.error(parseXMLHttpResponse(data));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-
-                                        itemActions: {
-                                            //***** update existing LB rule > Add VMs *****
-                                            add: {
-                                                label: 'label.add.vms.to.lb',
-                                                action: function(args) {
-                                                    var inputData = {
-                                                        id: args.multiRule.id
-                                                    };
-
-                                                    /*
-                                                     * e.g. first VM(xxx) has two IPs(10.1.1.~), second VM(yyy) has three IPs(10.2.2.~):
-                                                     * vmidipmap[0].vmid=xxx  vmidipmap[0].vmip=10.1.1.11
-                                                     * vmidipmap[1].vmid=xxx  vmidipmap[1].vmip=10.1.1.12
-                                                     * vmidipmap[2].vmid=yyy  vmidipmap[2].vmip=10.2.2.77
-                                                     * vmidipmap[3].vmid=yyy  vmidipmap[3].vmip=10.2.2.78
-                                                     * vmidipmap[4].vmid=yyy  vmidipmap[4].vmip=10.2.2.79
-                                                     */
-                                                    var selectedVMs = args.data;
-                                                    if (selectedVMs != null) {
-                                                        var vmidipmapIndex = 0;
-                                                        for (var vmIndex = 0; vmIndex < selectedVMs.length; vmIndex++) {
-                                                            var selectedIPs = selectedVMs[vmIndex]._subselect;
-                                                            for (var ipIndex = 0; ipIndex < selectedIPs.length; ipIndex++) {
-                                                                inputData['vmidipmap[' + vmidipmapIndex + '].vmid'] = selectedVMs[vmIndex].id;
-
-                                                                if (args.context.ipAddresses[0].isportable) {
-                                                                    inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex].split(',')[1];
-                                                                } else {
-                                                                    inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex];
-                                                                }
-
-                                                                vmidipmapIndex++;
-                                                            }
-                                                        }
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL('assignToLoadBalancerRule'),
-                                                        data: inputData,
-                                                        success: function(json) {
-                                                            args.response.success({
-                                                                notification: {
-                                                                    _custom: {
-                                                                        jobId: json.assigntoloadbalancerruleresponse.jobid
-                                                                    },
-                                                                    desc: 'label.add.vms.to.lb',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function(json) {
-                                                            args.response.error();
-                                                            cloudStack.dialog.notice({
-                                                                message: parseXMLHttpResponse(json)
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            destroy: {
-                                                label: 'label.remove.vm.from.lb',
-                                                action: function(args) {
-                                                    var inputData;
-                                                    if (args.item.itemIp == undefined) {
-                                                        inputData = {
-                                                            id: args.multiRule.id,
-                                                            virtualmachineids: args.item.id
-                                                        };
-                                                    } else {
-                                                        inputData = {
-                                                            id: args.multiRule.id,
-                                                            "vmidipmap[0].vmid": args.item.id,
-                                                            "vmidipmap[0].vmip": args.item.itemIp
-                                                        };
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL('removeFromLoadBalancerRule'),
-                                                        data: inputData,
-                                                        success: function(json) {
-                                                            args.response.success({
-                                                                notification: {
-                                                                    _custom: {
-                                                                        jobId: json.removefromloadbalancerruleresponse.jobid
-                                                                    },
-                                                                    desc: 'label.remove.vm.from.lb',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function(json) {
-                                                            args.response.error();
-                                                            cloudStack.dialog.notice({
-                                                                message: parseXMLHttpResponse(json)
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function(args) {
-                                            var $multi = args.$multi;
-
-                                            $.ajax({
-                                                url: createURL('listLoadBalancerRules'),
-                                                data: {
-                                                    publicipid: args.context.ipAddresses[0].id,
-                                                    listAll: true
-                                                },
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    var loadbalancerrules = data.listloadbalancerrulesresponse.loadbalancerrule;
-
-                                                    $(loadbalancerrules).each(function() {
-                                                        var lbRule = this;
-                                                        var stickyData = {};
-                                                        var sslCertData = {};
-                                                        //var lbInstances = [];
-                                                        var itemData = [];
-
-                                                        // Passing _hideFields array will disable specified fields for this row
-                                                        //lbRule._hideFields = ['autoScale'];
-
-                                                        $.ajax({
-                                                            url: createURL('listAutoScaleVmGroups'),
-                                                            data: {
-                                                                listAll: true,
-                                                                lbruleid: lbRule.id
-                                                            },
-                                                            async: false,
-                                                            success: function(json) {
-                                                                if (json.listautoscalevmgroupsresponse.autoscalevmgroup != null && json.listautoscalevmgroupsresponse.autoscalevmgroup.length > 0) { //from 'autoScale' button
-                                                                    lbRule._hideFields = ['add-vm'];
-                                                                } else { //from 'add-vm' button
-                                                                    lbRule._hideFields = ['autoScale'];
-                                                                }
-                                                            }
-                                                        });
-
-                                                        // Get sticky data
-                                                        $.ajax({
-                                                            url: createURL('listLBStickinessPolicies'),
-                                                            async: false,
-                                                            data: {
-                                                                listAll: true,
-                                                                lbruleid: lbRule.id
-                                                            },
-                                                            success: function(json) {
-                                                                var stickyPolicy = json.listlbstickinesspoliciesresponse.stickinesspolicies ?
-                                                                    json.listlbstickinesspoliciesresponse.stickinesspolicies[0].stickinesspolicy : null;
-
-                                                                if (stickyPolicy && stickyPolicy.length) {
-                                                                    stickyPolicy = stickyPolicy[0];
-
-                                                                    if (!stickyPolicy.methodname) stickyPolicy.methodname = 'None';
-
-                                                                    stickyData = {
-                                                                        _buttonLabel: stickyPolicy.methodname,
-                                                                        methodname: stickyPolicy.methodname,
-                                                                        stickyName: stickyPolicy.name,
-                                                                        id: stickyPolicy.id,
-                                                                        lbRuleID: lbRule.id
-                                                                    };
-                                                                    $.extend(stickyData, stickyPolicy.params);
-                                                                } else {
-                                                                    stickyData = {
-                                                                        lbRuleID: lbRule.id
-                                                                    };
-                                                                }
-                                                            },
-                                                            error: function(json) {
-                                                                cloudStack.dialog.notice({
-                                                                    message: parseXMLHttpResponse(json)
-                                                                });
-                                                            }
-                                                        });
-
-                                                        // Get SSL Certificate data
-                                                        $.ajax({
-                                                            url: createURL('listSslCerts'),
-                                                            data: {
-                                                                listAll: true,
-                                                                lbruleid: lbRule.id
-                                                            },
-                                                            async: false,
-                                                            success: function(json) {
-                                                                if (json.listsslcertsresponse != null) {
-                                                                    lbRule._hideFields.push('sslcertificate');
-                                                                }
-                                                            }
-                                                        });
-
-                                                        // Get instances
-                                                        $.ajax({
-                                                            url: createURL('listLoadBalancerRuleInstances'),
-                                                            dataType: 'json',
-                                                            async: false,
-                                                            data: {
-                                                                listAll: true,
-                                                                lbvmips: true,
-                                                                id: lbRule.id
-                                                            },
-                                                            success: function(data) {
-                                                                //when "lbvmips: true" is not passed to API
-                                                                //lbVMs = data.listloadbalancerruleinstancesresponse.loadbalancerruleinstance;
-
-                                                                //when "lbvmips: true" is passed to API
-                                                                lbrulevmidips = data.listloadbalancerruleinstancesresponse.lbrulevmidip;
-
-                                                                if (lbrulevmidips != null) {
-                                                                    for (var k = 0; k < lbrulevmidips.length; k++) {
-                                                                        var lbrulevmidip = lbrulevmidips[k];
-                                                                        var lbVM = lbrulevmidip.loadbalancerruleinstance;
-                                                                        if (lbVM.displayname.indexOf('AutoScale-LB-') > -1) //autoscale VM is not allowed to be deleted manually. So, hide destroy button
-                                                                            lbVM._hideActions = ['destroy'];
-
-                                                                        if (lbVM.servicestate) {
-                                                                            lbVM._itemStateLabel = 'label.service.state';
-                                                                            lbVM._itemState = lbVM.servicestate;
-                                                                        }
-
-                                                                        if (lbrulevmidip.lbvmipaddresses != null) {
-                                                                            for (var m = 0 ; m < lbrulevmidip.lbvmipaddresses.length; m++) {
-                                                                                var ip = lbrulevmidip.lbvmipaddresses[m];
-                                                                                itemData.push($.extend({}, lbVM, {
-                                                                                    itemIp: ip
-                                                                                }));
-                                                                            }
-                                                                        } else {
-                                                                            itemData.push(lbVM);
-                                                                        }
-                                                                    }
-                                                                }
-                                                            },
-                                                            error: function(data) {
-                                                                args.response.error(parseXMLHttpResponse(data));
-                                                            }
-                                                        });
-
-                                                        $.extend(lbRule, {
-                                                            _itemName: 'name',
-                                                            _itemIp: 'itemIp',
-                                                            _itemData: itemData,
-                                                            _maxLength: {
-                                                                name: 7
-                                                            },
-                                                            sticky: stickyData,
-                                                            autoScale: {
-                                                                lbRuleID: lbRule.id
-                                                            }
-                                                        });
-                                                    });
-
-                                                    args.response.success({
-                                                        data: loadbalancerrules
-                                                    });
-                                                }
-                                            });
-
-                                            // Check if tiers are present; hide/show header drop-down (begin) ***
-                                            //dataProvider() is called when a LB rule is added in multiEdit. However, adding a LB rule might change parent object (IP Address object). So, we have to force to refresh args.context.ipAddresses[0] here
-                                            $.ajax({
-                                                url: createURL('listPublicIpAddresses'),
-                                                data: {
-                                                    id: args.context.ipAddresses[0].id,
-                                                    listAll: true
-                                                },
-                                                success: function(json) {
-                                                    var ipObj = json.listpublicipaddressesresponse.publicipaddress[0];
-                                                    getExtaPropertiesForIpObj(ipObj, args);
-
-                                                    args.context.ipAddresses.shift(); //remove the first element in args.context.ipAddresses
-                                                    args.context.ipAddresses.push(ipObj);
-
-                                                    var $headerFields = $multi.find('.header-fields');
-                                                    if ('vpc' in args.context) {
-                                                        if (args.context.ipAddresses[0].associatednetworkid == null) {
-                                                            $headerFields.show();
-                                                        } else {
-                                                            $headerFields.hide();
-                                                        }
-                                                    } else if ('networks' in args.context) {
-                                                        $headerFields.hide();
-                                                    }
-                                                }
-                                            });
-                                            // Check if tiers are present; hide/show header drop-down (end) ***
-                                        }
-                                    },
-
-                                    // Port forwarding rules
-                                    portForwarding: {
-                                        headerFields: {
-                                            tier: {
-                                                label: 'label.tier',
-                                                select: function(args) {
-                                                    if ('vpc' in args.context) {
-                                                        var data = {
-                                                            //listAll: true,  //do not pass listAll to listNetworks under VPC
-                                                            domainid: args.context.vpc[0].domainid,
-                                                            account: args.context.vpc[0].account,
-                                                            supportedservices: 'PortForwarding'
-                                                        };
-                                                        if (args.context.ipAddresses[0].associatednetworkid == null) {
-                                                            $.extend(data, {
-                                                                vpcid: args.context.vpc[0].id,
-                                                                domainid: args.context.vpc[0].domainid,
-                                                                account: args.context.vpc[0].account
-                                                            });
-                                                        } else {
-                                                            $.extend(data, {
-                                                                id: args.context.ipAddresses[0].associatednetworkid
-                                                            });
-                                                        }
-                                                        $.ajax({
-                                                            url: createURL("listNetworks"),
-                                                            data: data,
-                                                            success: function(json) {
-                                                                var networks = json.listnetworksresponse.network;
-                                                                var items = [];
-                                                                $(networks).each(function() {
-                                                                    items.push({
-                                                                        id: this.id,
-                                                                        description: this.displaytext
-                                                                    });
-                                                                });
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        listView: $.extend(true, {}, cloudStack.sections.instances, {
-                                            listView: {
-                                                filters: false,
-                                                subselect: {
-                                                    label: 'label.use.vm.ip',
-                                                    dataProvider: singleVmSecondaryIPSubselect
-                                                },
-                                                dataProvider: function(args) {
-                                                    var data = {};
-                                                    listViewDataProvider(args, data);
-
-                                                    var networkid;
-                                                    if ('vpc' in args.context) {
-                                                        networkid = args.context.multiData.tier;
-                                                    } else {
-                                                        networkid = args.context.ipAddresses[0].associatednetworkid;
-                                                    }
-                                                    $.extend(data, {
-                                                        networkid: networkid
-                                                    });
-
-                                                    if (!args.context.projects) {
-                                                        $.extend(data, {
-                                                            account: args.context.ipAddresses[0].account,
-                                                            domainid: args.context.ipAddresses[0].domainid
-                                                        });
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL('listVirtualMachines'),
-                                                        data: data,
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(data) {
-                                                            args.response.success({
-                                                                data: $.grep(
-                                                                    data.listvirtualmachinesresponse.virtualmachine ?
-                                                                        data.listvirtualmachinesresponse.virtualmachine : [],
-                                                                    function(instance) {
-                                                                        return $.inArray(instance.state, [
-                                                                            'Destroyed', 'Expunging'
-                                                                        ]) == -1;
-                                                                    }
-                                                                )
-                                                            });
-                                                        },
-                                                        error: function(data) {
-                                                            args.response.error(parseXMLHttpResponse(data));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }),
-                                        fields: {
-                                            //'private-ports': {
-                                            privateport: {
-                                                edit: true,
-                                                label: 'label.private.port',
-                                                //range: ['privateport', 'privateendport']  //Bug 13427 - Don't allow port forwarding ranges in the CreatePortForwardingRule API
-                                                range: ['privateport', 'privateendport'] //Bug 16344 (restore port range back) (http://bugs.cloudstack.org/browse/CS-16344)
-                                            },
-                                            //'public-ports': {
-                                            publicport: {
-                                                edit: true,
-                                                label: 'label.public.port',
-                                                //range: ['publicport', 'publicendport']  //Bug 13427 - Don't allow port forwarding ranges in the CreatePortForwardingRule API
-                                                range: ['publicport', 'publicendport'] //Bug 16344 (restore port range back) (http://bugs.cloudstack.org/browse/CS-16344)
-                                            },
-                                            'protocol': {
-                                                label: 'label.protocol',
-                                                select: function(args) {
-                                                    args.response.success({
-                                                        data: [{
-                                                            name: 'tcp',
-                                                            description: 'TCP'
-                                                        }, {
-                                                            name: 'udp',
-                                                            description: 'UDP'
-                                                        }]
-                                                    });
-                                                }
-                                            },
-                                            'state' : {
-                                                edit: 'ignore',
-                                                label: 'label.state'
-                                            },
-                                            'add-vm': {
-                                                label: 'label.add.vm',
-                                                addButton: true
-                                            }
-                                        },
-
-                                        tags: cloudStack.api.tags({
-                                            resourceType: 'PortForwardingRule',
-                                            contextId: 'multiRule'
-                                        }),
-
-                                        add: {
-                                            label: 'label.add.vm',
-
-                                            action: function(args) {
-                                                var data = {
-                                                    ipaddressid: args.context.ipAddresses[0].id,
-                                                    privateport: args.data.privateport,
-                                                    privateendport: args.data.privateendport,
-                                                    publicport: args.data.publicport,
-                                                    publicendport: args.data.publicendport,
-                                                    protocol: args.data.protocol,
-                                                    virtualmachineid: args.itemData[0].id,
-                                                    openfirewall: false
-                                                };
-
-                                                if (args.context.ipAddresses[0].isportable) {
-                                                    var subselect = args.itemData[0]._subselect.split(',');
-                                                    //var networkid = subselect[0];
-                                                    var vmguestip = subselect[1];
-
-                                                    //data.networkid = networkid;
-
-                                                    if (parseInt(vmguestip) !== -1) {
-                                                        data.vmguestip = vmguestip;
-                                                    }
-                                                } else if (args.itemData[0]._subselect && args.itemData[0]._subselect != -1) {
-                                                    data.vmguestip = args.itemData[0]._subselect;
-                                                }
-
-                                                if ('vpc' in args.context) { //from VPC section
-                                                    if (args.data.tier == null) {
-                                                        args.response.error('Tier is required');
-                                                        return;
-                                                    }
-                                                    $.extend(data, {
-                                                        networkid: args.data.tier
-                                                    });
-                                                } else { //from Guest Network section
-                                                    $.extend(data, {
-                                                        networkid: args.context.networks[0].id
-                                                    });
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('createPortForwardingRule'),
-                                                    data: data,
-                                                    success: function(data) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: data.createportforwardingruleresponse.jobid,
-                                                                getUpdatedItem: function(json) {
-                                                                    return json.queryasyncjobresultresponse.jobresult.portforwardingrule;
-                                                                }
-                                                            },
-                                                            notification: {
-                                                                label: 'label.add.port.forwarding.rule',
-                                                                poll: pollAsyncJobResult
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function(data) {
-                                                        args.response.error(parseXMLHttpResponse(data));
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.remove.pf',
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('deletePortForwardingRule'),
-                                                        data: {
-                                                            id: args.context.multiRule[0].id
-                                                        },
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(data) {
-                                                            var jobID = data.deleteportforwardingruleresponse.jobid;
-
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jobID
-                                                                },
-                                                                notification: {
-                                                                    label: 'label.remove.pf',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function(data) {
-                                                            args.response.error(parseXMLHttpResponse(data));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function(args) {
-                                            var $multi = args.$multi;
-
-                                            $.ajax({
-                                                url: createURL('listPortForwardingRules'),
-                                                data: {
-                                                    ipaddressid: args.context.ipAddresses[0].id,
-                                                    listAll: true
-                                                },
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    // Get instance
-                                                    var portForwardingData = data
-                                                        .listportforwardingrulesresponse.portforwardingrule;
-                                                    var loadTotal = portForwardingData ? portForwardingData.length : 0;
-                                                    var loadCurrent = 0;
-
-                                                    $(portForwardingData).each(function() {
-                                                        var item = this;
-
-                                                        item._itemName = '_displayName';
-
-                                                        $.ajax({
-                                                            url: createURL('listVirtualMachines'),
-                                                            dataType: 'json',
-                                                            async: true,
-                                                            data: {
-                                                                listAll: true,
-                                                                id: item.virtualmachineid
-                                                            },
-                                                            success: function(data) {
-                                                                loadCurrent++;
-                                                                var vms = data.listvirtualmachinesresponse.virtualmachine;
-
-                                                                //if this VM is destroyed, data.listvirtualmachinesresponse.virtualmachine will be undefined for regular-user (CLOUDSTACK-3195)
-                                                                if (vms == undefined) {
-                                                                    vms = [{
-                                                                        "id": item.virtualmachineid,
-                                                                        "name": item.virtualmachinename,
-                                                                        "displayname": item.virtualmachinedisplayname
-                                                                    }];
-                                                                }
-
-                                                                $.extend(item, {
-                                                                    _itemData: $.map(vms, function(vm) {
-                                                                        return $.extend(vm, {
-                                                                            _displayName: '<p>VM: ' + vm.name + '</p>' + '<p>IP: ' + item.vmguestip + '</p>' // Also display attached IP
-                                                                        });
-                                                                    }),
-                                                                    _context: {
-                                                                        instances: vms
-                                                                    }
-                                                                });
-
-                                                                if (loadCurrent == loadTotal) {
-                                                                    args.response.success({
-                                                                        data: portForwardingData
-                                                                    });
-                                                                }
-                                                            }
-                                                        });
-                                                    });
-
-                                                    // Check if tiers are present; hide/show header drop-down (begin) ***
-                                                    //dataProvider() is called when a PF rule is added in multiEdit. However, adding a LB rule might change parent object (IP Address object). So, we have to force to refresh args.context.ipAddresses[0] here
-                                                    $.ajax({
-                                                        url: createURL('listPublicIpAddresses'),
-                                                        data: {
-                                                            id: args.context.ipAddresses[0].id,
-                                                            listAll: true
-                                                        },
-                                                        success: function(json) {
-                                                            var ipObj = json.listpublicipaddressesresponse.publicipaddress[0];
-                                                            getExtaPropertiesForIpObj(ipObj, args);
-
-                                                            args.context.ipAddresses.shift(); //remove the first element in args.context.ipAddresses
-                                                            args.context.ipAddresses.push(ipObj);
-
-                                                            var $headerFields = $multi.find('.header-fields');
-                                                            if ('vpc' in args.context) {
-                                                                if (args.context.ipAddresses[0].associatednetworkid == null) {
-                                                                    $headerFields.show();
-                                                                } else {
-                                                                    $headerFields.hide();
-                                                                }
-                                                            } else if ('networks' in args.context) {
-                                                                $headerFields.hide();
-                                                            }
-                                                        }
-                                                    });
-                                                    // Check if tiers are present; hide/show header drop-down (end) ***
-                                                },
-                                                error: function(data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        }
-                                    }
-                                })
-                            },
-                            vpn: {
-                                title: 'label.vpn',
-                                custom: function(args) {
-                                    var ipAddress = args.context.ipAddresses[0].ipaddress;
-                                    var psk = "";
-                                    if (args.context.ipAddresses[0].remoteaccessvpn != null)
-                                        psk = args.context.ipAddresses[0].remoteaccessvpn.presharedkey;
-
-                                    return $('<div>')
-                                        .append(
-                                        $('<ul>').addClass('info')
-                                            .append(
-                                            // VPN IP
-                                            $('<li>').addClass('ip').html(_l('message.enabled.vpn') + ' ')
-                                                .append($('<strong>').html(ipAddress))
-                                        )
-                                            .append(
-                                            // PSK
-                                            $('<li>').addClass('psk').html(_l('message.enabled.vpn.ip.sec') + ' ')
-                                                .append($('<strong>').html(psk))
-                                        )
-                                            .append(
-                                                //Note
-                                                $('<li>').html(_l('message.enabled.vpn.note'))
-                                            )
-                                    )
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            securityGroups: {
-                type: 'select',
-                title: 'label.menu.security.groups',
-                id: 'securityGroups',
-                listView: {
-                    id: 'securityGroups',
-                    label: 'label.menu.security.groups',
-                    fields: {
-                        name: {
-                            label: 'label.name',
-                            editable: true
-                        },
-                        description: {
-                            label: 'label.description'
-                        },
-                        domain: {
-                            label: 'label.domain'
-                        },
-                        account: {
-                            label: 'label.account'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.security.group',
-
-                            action: function(args) {
-                                $.ajax({
-                                    url: createURL('createSecurityGroup'),
-                                    data: {
-                                        name: args.data.name,
-                                        description: args.data.description
-                                    },
-                                    success: function(data) {
-                                        args.response.success({
-                                            data: data.createsecuritygroupresponse.securitygroup
-                                        });
-                                    },
-
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete({
-                                        actionFilter: actionFilters.securityGroups
-                                    });
-                                }
-                            },
-
-                            messages: {
-                                confirm: function(args) {
-                                    return _l('message.question.are.you.sure.you.want.to.add') + ' ' + args.name + '?';
-                                },
-                                notification: function(args) {
-                                    return 'label.add.security.group';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.security.group',
-                                desc: 'label.add.security.group',
-                                fields: {
-                                    name: {
-                                        label: 'label.name'
-                                    },
-                                    description: {
-                                        label: 'label.description'
-                                    }
-                                }
-                            }
-                        }
-                    },
-
-                    advSearchFields: {
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        if (args.context != null) {
-                            if ("securityGroups" in args.context) {
-                                $.extend(data, {
-                                    id: args.context.securityGroups[0].id
-                                });
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL('listSecurityGroups'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listsecuritygroupsresponse.securitygroup;
-                                args.response.success({
-                                    actionFilter: actionFilters.securityGroups,
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'Security group details',
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    description: {
-                                        label: 'label.description'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'SecurityGroup',
-                                    contextId: 'securityGroups'
-                                }),
-
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listSecurityGroups&id=" + args.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var items = json.listsecuritygroupsresponse.securitygroup;
-                                            if (items != null && items.length > 0) {
-                                                args.response.success({
-                                                    actionFilter: actionFilters.securityGroups,
-                                                    data: items[0]
-                                                });
-                                            }
-                                        }
-                                    });
-                                }
-                            },
-                            ingressRules: {
-                                title: 'label.ingress.rule',
-                                custom: cloudStack.uiCustom.securityRules({
-                                    noSelect: true,
-                                    noHeaderActionsColumn: true,
-                                    fields: {
-                                        'protocol': {
-                                            label: 'label.protocol',
-                                            select: function(args) {
-                                                args.$select.change(function() {
-                                                    var $inputs = args.$form.find('th, td');
-                                                    var $icmpFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-
-                                                        return $.inArray(name, [
-                                                            'icmptype',
-                                                            'icmpcode'
-                                                        ]) > -1;
-                                                    });
-                                                    var $otherFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-
-                                                        return name != 'protocolnumber' &&
-                                                            name != 'icmptype' &&
-                                                            name != 'icmpcode' &&
-                                                            name != 'protocol' &&
-                                                            name != 'add-rule' &&
-                                                            name != 'cidr' &&
-                                                            name != 'accountname' &&
-                                                            name != 'securitygroup';
-                                                    });
-
-                                                    $portFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-                                                        return $.inArray(name, [
-                                                            'startport',
-                                                            'endport'
-                                                        ]) > -1;
-                                                    });
-                                                    $protocolFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-
-                                                        return $.inArray(name, ['protocolnumber']) > -1;
-                                                    });
-
-                                                    if ($(this).val() == 'protocolnumber') {
-                                                        $icmpFields.hide();
-                                                        $portFields.hide();
-                                                        $protocolFields.show();
-                                                    } else if ($(this).val() == 'icmp') {
-                                                        $icmpFields.show();
-                                                        $protocolFields.hide();
-                                                        $portFields.hide();
-                                                    } else if ($(this).val() == 'all') {
-                                                        $portFields.hide();
-                                                        $icmpFields.hide();
-                                                        $protocolFields.hide();
-                                                    } else {
-                                                        $otherFields.show();
-                                                        $icmpFields.hide();
-                                                        $protocolFields.hide();
-                                                    }
-                                                });
-
-                                                args.response.success({
-                                                    data: [{
-                                                        name: 'tcp',
-                                                        description: 'TCP'
-                                                    }, {
-                                                        name: 'udp',
-                                                        description: 'UDP'
-                                                    }, {
-                                                        name: 'icmp',
-                                                        description: 'ICMP'
-                                                    }, {
-                                                        name: 'all',
-                                                        description: 'ALL'
-                                                    }, {
-                                                        name: 'protocolnumber',
-                                                        description: 'Protocol Number'
-                                                    }]
-                                                });
-                                            }
-                                        },
-                                        'protocolnumber': {
-                                            label: 'label.protocol.number',
-                                            edit: true,
-                                            isHidden: true,
-                                            isEditable: true
-                                        },
-                                        'startport': {
-                                            edit: true,
-                                            label: 'label.start.port',
-                                            validation: {
-                                                number: true,
-                                                range: [0, 65535]
-                                            }
-                                        },
-                                        'endport': {
-                                            edit: true,
-                                            label: 'label.end.port',
-                                            validation: {
-                                                number: true,
-                                                range: [0, 65535]
-                                            }
-                                        },
-                                        'icmptype': {
-                                            edit: true,
-                                            label: 'ICMP.type',
-                                            isHidden: true
-                                        },
-                                        'icmpcode': {
-                                            edit: true,
-                                            label: 'ICMP.code',
-                                            isHidden: true
-                                        },
-                                        'cidr': {
-                                            edit: true,
-                                            label: 'label.cidr',
-                                            isHidden: true,
-                                            validation: {
-                                                ipv46cidrs: true
-                                            }
-                                        },
-                                        'accountname': {
-                                            edit: true,
-                                            label: 'label.account.and.security.group',
-                                            isHidden: true,
-                                            range: ['accountname', 'securitygroup']
-                                        },
-                                        'add-rule': {
-                                            label: 'label.add',
-                                            addButton: true
-                                        }
-                                    },
-                                    add: {
-                                        label: 'label.add',
-                                        action: function(args) {
-                                            var data = {
-                                                securitygroupid: args.context.securityGroups[0].id,
-                                                domainid: args.context.securityGroups[0].domainid,
-                                                account: args.context.securityGroups[0].account
-                                            };
-
-                                            if (args.data.protocol == 'protocolnumber') {
-                                                $.extend(data, {
-                                                    protocol: args.data.protocolnumber
-                                                });
-                                            } else {
-                                                $.extend(data, {
-                                                    protocol: args.data.protocol
-                                                });
-                                            }
-
-                                            if (args.data.icmptype && args.data.icmpcode) { // ICMP
-                                                $.extend(data, {
-                                                    icmptype: args.data.icmptype,
-                                                    icmpcode: args.data.icmpcode
-                                                });
-                                            } else { // TCP/UDP
-                                                $.extend(data, {
-                                                    startport: args.data.startport,
-                                                    endport: args.data.endport
-                                                });
-                                            }
-
-                                            // CIDR / account
-                                            if (args.data.cidr) {
-                                                data.cidrlist = args.data.cidr;
-                                            } else {
-                                                data['usersecuritygrouplist[0].account'] = args.data.accountname;
-                                                data['usersecuritygrouplist[0].group'] = args.data.securitygroup;
-                                            }
-
-                                            $.ajax({
-                                                url: createURL('authorizeSecurityGroupIngress'),
-                                                data: data,
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    var jobId = data.authorizesecuritygroupingressresponse.jobid;
-
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jobId
-                                                        },
-                                                        notification: {
-                                                            label: 'label.add.ingress.rule',
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    actions: {
-                                        destroy: {
-                                            label: 'label.remove.rule',
-                                            action: function(args) {
-                                                $.ajax({
-                                                    url: createURL('revokeSecurityGroupIngress'),
-                                                    data: {
-                                                        domainid: args.context.securityGroups[0].domainid,
-                                                        account: args.context.securityGroups[0].account,
-                                                        id: args.context.multiRule[0].id
-                                                    },
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(data) {
-                                                        var jobID = data.revokesecuritygroupingressresponse.jobid;
-
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobID
-                                                            },
-                                                            notification: {
-                                                                label: 'label.remove.ingress.rule',
-                                                                poll: pollAsyncJobResult
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function(json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    },
-                                    ignoreEmptyFields: true,
-                                    tags: cloudStack.api.tags({
-                                        resourceType: 'SecurityGroupRule',
-                                        contextId: 'multiRule'
-                                    }),
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('listSecurityGroups'),
-                                            data: {
-                                                id: args.context.securityGroups[0].id
-                                            },
-                                            dataType: 'json',
-                                            async: true,
-                                            success: function(data) {
-                                                args.response.success({
-                                                    data: $.map(
-                                                        data.listsecuritygroupsresponse.securitygroup[0].ingressrule ?
-                                                            data.listsecuritygroupsresponse.securitygroup[0].ingressrule : [],
-                                                        ingressEgressDataMap
-                                                    )
-                                                });
-                                            }
-                                        });
-                                    }
-                                })
-                            },
-
-                            egressRules: {
-                                title: 'label.egress.rule',
-                                custom: cloudStack.uiCustom.securityRules({
-                                    noSelect: true,
-                                    noHeaderActionsColumn: true,
-                                    fields: {
-                                        'protocol': {
-                                            label: 'label.protocol',
-                                            select: function(args) {
-                                                args.$select.change(function() {
-                                                    var $inputs = args.$form.find('th, td');
-                                                    var $icmpFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-
-                                                        return $.inArray(name, [
-                                                            'icmptype',
-                                                            'icmpcode'
-                                                        ]) > -1;
-                                                    });
-                                                    var $otherFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-
-                                                        return name != 'protocolnumber' &&
-                                                            name != 'icmptype' &&
-                                                            name != 'icmpcode' &&
-                                                            name != 'protocol' &&
-                                                            name != 'add-rule' &&
-                                                            name != 'cidr' &&
-                                                            name != 'accountname' &&
-                                                            name != 'securitygroup';
-                                                    });
-
-                                                    $portFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-                                                        return $.inArray(name, [
-                                                            'startport',
-                                                            'endport'
-                                                        ]) > -1;
-                                                    });
-                                                    $protocolFields = $inputs.filter(function() {
-                                                        var name = $(this).attr('rel');
-
-                                                        return $.inArray(name, ['protocolnumber']) > -1;
-                                                    });
-
-                                                    if ($(this).val() == 'protocolnumber') {
-                                                        $icmpFields.hide();
-                                                        $portFields.hide();
-                                                        $protocolFields.show();
-                                                    } else if ($(this).val() == 'icmp') {
-                                                        $icmpFields.show();
-                                                        $protocolFields.hide();
-                                                        $portFields.hide();
-                                                    } else if ($(this).val() == 'all') {
-                                                        $portFields.hide();
-                                                        $icmpFields.hide();
-                                                        $protocolFields.hide();
-                                                    } else {
-                                                        $otherFields.show();
-                                                        $icmpFields.hide();
-                                                        $protocolFields.hide();
-                                                    }
-                                                });
-
-                                                args.response.success({
-                                                    data: [{
-                                                        name: 'tcp',
-                                                        description: 'TCP'
-                                                    }, {
-                                                        name: 'udp',
-                                                        description: 'UDP'
-                                                    }, {
-                                                        name: 'icmp',
-                                                        description: 'ICMP'
-                                                    }, {
-                                                        name: 'all',
-                                                        description: 'ALL'
-                                                    }, {
-                                                        name: 'protocolnumber',
-                                                        description: 'Protocol Number'
-                                                    }]
-                                                });
-                                            }
-                                        },
-                                        'protocolnumber': {
-                                            label: 'label.protocol.number',
-                                            edit: true,
-                                            isHidden: true,
-                                            isEditable: true
-                                        },
-                                        'startport': {
-                                            edit: true,
-                                            label: 'label.start.port',
-                                            validation: {
-                                                number: true,
-                                                range: [0, 65535]
-                                            }
-                                        },
-                                        'endport': {
-                                            edit: true,
-                                            label: 'label.end.port',
-                                            validation: {
-                                                number: true,
-                                                range: [0, 65535]
-                                            }
-                                        },
-                                        'icmptype': {
-                                            edit: true,
-                                            label: 'ICMP.type',
-                                            isHidden: true
-                                        },
-                                        'icmpcode': {
-                                            edit: true,
-                                            label: 'ICMP.code',
-                                            isHidden: true
-                                        },
-                                        'cidr': {
-                                            edit: true,
-                                            label: 'label.cidr',
-                                            isHidden: true,
-                                            validation: {
-                                                ipv46cidrs: true
-                                            }
-                                        },
-                                        'accountname': {
-                                            edit: true,
-                                            label: 'label.account.and.security.group',
-                                            isHidden: true,
-                                            range: ['accountname', 'securitygroup']
-                                        },
-                                        'add-rule': {
-                                            label: 'label.add',
-                                            addButton: true
-                                        }
-                                    },
-                                    add: {
-                                        label: 'label.add',
-                                        action: function(args) {
-                                            var data = {
-                                                securitygroupid: args.context.securityGroups[0].id,
-                                                domainid: args.context.securityGroups[0].domainid,
-                                                account: args.context.securityGroups[0].account
-                                            };
-
-                                            if (args.data.protocol == 'protocolnumber') {
-                                                $.extend(data, {
-                                                    protocol: args.data.protocolnumber
-                                                });
-                                            } else {
-                                                $.extend(data, {
-                                                    protocol: args.data.protocol
-                                                });
-                                            }
-
-                                            if (args.data.icmptype && args.data.icmpcode) { // ICMP
-                                                $.extend(data, {
-                                                    icmptype: args.data.icmptype,
-                                                    icmpcode: args.data.icmpcode
-                                                });
-                                            } else { // TCP/UDP
-                                                $.extend(data, {
-                                                    startport: args.data.startport,
-                                                    endport: args.data.endport
-                                                });
-                                            }
-
-                                            // CIDR / account
-                                            if (args.data.cidr) {
-                                                data.cidrlist = args.data.cidr;
-                                            } else {
-                                                data['usersecuritygrouplist[0].account'] = args.data.accountname;
-                                                data['usersecuritygrouplist[0].group'] = args.data.securitygroup;
-                                            }
-
-                                            $.ajax({
-                                                url: createURL('authorizeSecurityGroupEgress'),
-                                                data: data,
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    var jobId = data.authorizesecuritygroupegressresponse.jobid;
-
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jobId
-                                                        },
-                                                        notification: {
-                                                            label: 'label.add.egress.rule',
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    actions: {
-                                        destroy: {
-                                            label: 'label.remove.rule',
-                                            action: function(args) {
-                                                $.ajax({
-                                                    url: createURL('revokeSecurityGroupEgress'),
-                                                    data: {
-                                                        domainid: args.context.securityGroups[0].domainid,
-                                                        account: args.context.securityGroups[0].account,
-                                                        id: args.context.multiRule[0].id
-                                                    },
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(data) {
-                                                        var jobID = data.revokesecuritygroupegressresponse.jobid;
-
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobID
-                                                            },
-                                                            notification: {
-                                                                label: 'label.remove.egress.rule',
-                                                                poll: pollAsyncJobResult
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function(json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    },
-                                    ignoreEmptyFields: true,
-                                    tags: cloudStack.api.tags({
-                                        resourceType: 'SecurityGroupRule',
-                                        contextId: 'multiRule'
-                                    }),
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('listSecurityGroups'),
-                                            data: {
-                                                id: args.context.securityGroups[0].id
-                                            },
-                                            dataType: 'json',
-                                            async: true,
-                                            success: function(data) {
-                                                args.response.success({
-                                                    data: $.map(
-                                                        data.listsecuritygroupsresponse.securitygroup[0].egressrule ?
-                                                            data.listsecuritygroupsresponse.securitygroup[0].egressrule : [],
-                                                        ingressEgressDataMap
-                                                    )
-                                                });
-                                            }
-                                        });
-                                    }
-                                })
-                            }
-                        },
-
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.securityGroups[0].id
-                                    };
-                                    if (args.data.name != args.context.securityGroups[0].name) {
-                                        $.extend(data, {
-                                            name: args.data.name
-                                        });
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateSecurityGroup'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.updatesecuritygroupresponse.securitygroup;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.security.group',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.security.group';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.security.group';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('deleteSecurityGroup'),
-                                        data: {
-                                            id: args.context.securityGroups[0].id
-                                        },
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(data) {
-                                            args.response.success();
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete({
-                                            data: {
-                                                state: 'Destroyed'
-                                            },
-                                            actionFilter: actionFilters.securityGroups
-                                        });
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            vpc: {
-                type: 'select',
-                title: 'label.vpc',
-                id: 'vpc',
-                listView: {
-                    id: 'vpc',
-                    label: 'label.vpc',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        displaytext: {
-                            label: 'label.description',
-                            truncate: true
-                        },
-                        zonename: {
-                            label: 'label.zone',
-                            truncate: true
-                        },
-                        cidr: {
-                            label: 'label.cidr'
-                        },
-                        state: {
-                            label: 'label.state',
-                            indicator: {
-                                'Enabled': 'on',
-                                'Disabled': 'off'
-                            }
-                        }
-                    },
-
-                    advSearchFields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        zoneid: {
-                            label: 'label.zone',
-                            select: function(args) {
-                                $.ajax({
-                                    url: createURL('listZones'),
-                                    data: {
-                                        listAll: true
-                                    },
-                                    success: function(json) {
-                                        var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                        args.response.success({
-                                            data: $.map(zones, function(zone) {
-                                                return {
-                                                    id: zone.id,
-                                                    description: zone.name
-                                                };
-                                            })
-                                        });
-                                    }
-                                });
-                            }
-                        },
-
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        account: {
-                            label: 'label.account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listVPCs'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listvpcsresponse.vpc ? json.listvpcsresponse.vpc : { };
-
-                                //If we are coming from Home > Regions, show only regional vpcs
-                                if (args.context.regions)
-                                    items = $.grep(
-                                        items,
-                                        function (vpc, i) {
-                                            return vpc.regionlevelvpc;
-                                        });
-
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                cloudStack.dialog.notice({
-                                    message: parseXMLHttpResponse(XMLHttpResponse)
-                                });
-                                args.response.error();
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.vpc',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.vpc';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.add.vpc',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.add.vpc';
-                                    }
-                                },
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpVPCName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        docID: 'helpVPCDescription',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    zoneid: {
-                                        label: 'label.zone',
-                                        docID: 'helpVPCZone',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            var data = {};
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                data: data,
-                                                success: function(json) {
-                                                    var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-                                                    var advZones = $.grep(zones, function(zone) {
-                                                        return zone.networktype == 'Advanced' && !zone.securitygroupsenabled;
-                                                    });
-
-                                                    args.response.success({
-                                                        data: $.map(advZones, function(zone) {
-                                                            return {
-                                                                id: zone.id,
-                                                                description: zone.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    cidr: {
-                                        label: 'label.super.cidr.for.guest.networks',
-                                        docID: 'helpVPCSuperCIDR',
-                                        validation: {
-                                            required: true,
-                                            ipv4cidr: true
-                                        }
-                                    },
-                                    networkdomain: {
-                                        docID: 'helpVPCDomain',
-                                        label: 'label.DNS.domain.for.guest.networks'
-                                        //format: FQDN
-                                    },
-                                    vpcoffering: {
-                                        label: 'label.vpc.offering',
-                                        dependsOn: 'zoneid',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            var data = {
-                                                zoneid: args.zoneid
-                                            };
-                                            $.ajax({
-                                                url: createURL('listVPCOfferings'),
-                                                data: data,
-                                                success: function(json) {
-                                                    var offerings  = json.listvpcofferingsresponse.vpcoffering ? json.listvpcofferingsresponse.vpcoffering : [];
-                                                    var filteredofferings = $.grep(offerings, function(offering) {
-                                                        return offering.state == 'Enabled';
-                                                    });
-                                                    args.response.success({
-                                                        data: $.map(filteredofferings, function(vpco) {
-                                                            return {
-                                                                id: vpco.id,
-                                                                description: vpco.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var vpcOfferingName = args.data.vpcoffering;
-                                var dataObj = {
-                                    name: args.data.name,
-                                    displaytext: args.data.displaytext,
-                                    zoneid: args.data.zoneid,
-                                    cidr: args.data.cidr,
-                                    vpcofferingid: args.data.vpcoffering
-                                };
-
-                                if (args.data.networkdomain != null && args.data.networkdomain.length > 0)
-                                    $.extend(dataObj, {
-                                        networkdomain: args.data.networkdomain
-                                    });
-
-                                $.ajax({
-                                    url: createURL("createVPC"),
-                                    dataType: "json",
-                                    data: dataObj,
-                                    async: true,
-                                    success: function(vpcjson) {
-                                        var jid = vpcjson.createvpcresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.vpc;
-                                                }
-                                            }
-                                        });
-                                    },
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-
-                        },
-                        configureVpc: {
-                            label: 'label.configure.vpc',
-                            textLabel: 'label.configure',
-                            action: {
-                                custom: cloudStack.uiCustom.vpc(cloudStack.vpc)
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.details',
-                        actions: {
-                            configureVpc: {
-                                label: 'label.configure',
-                                textLabel: 'label.configure',
-                                action: {
-                                    custom: cloudStack.uiCustom.vpc(cloudStack.vpc)
-                                },
-                                messages: {
-                                    notification: function() {
-                                        return '';
-                                    }
-                                }
-                            },
-
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('updateVPC'),
-                                        data: {
-                                            id: args.context.vpc[0].id,
-                                            name: args.data.name,
-                                            displaytext: args.data.displaytext
-                                        },
-                                        success: function(json) {
-                                            var jid = json.updatevpcresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.vpc;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            restart: {
-                                label: 'label.restart.vpc',
-                                createForm: {
-                                    title: 'label.restart.vpc',
-                                    desc: function(args) {
-                                        if (Boolean(args.context.vpc[0].redundantvpcrouter)) {
-                                            return 'message.restart.vpc';
-                                        } else {
-                                            return 'message.restart.vpc.remark';
-                                        }
-                                    },
-
-                                    preFilter: function(args) {
-                                        var zoneObj;
-                                        $.ajax({
-                                            url: createURL("listZones&id=" + args.context.vpc[0].zoneid),
-                                            dataType: "json",
-                                            async: false,
-                                            success: function(json) {
-                                                zoneObj = json.listzonesresponse.zone[0];
-                                            }
-                                        });
-
-
-                                        args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 'checked'); //checked
-                                        args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block'); //shown
-                                        args.$form.find('.form-item[rel=makeredundant]').find('input').attr('checked', 'checked'); //checked
-                                        args.$form.find('.form-item[rel=makeredundant]').css('display', 'inline-block'); //shown
-
-                                        if (Boolean(args.context.vpc[0].redundantvpcrouter)) {
-                                            args.$form.find('.form-item[rel=makeredundant]').hide();
-                                        } else {
-                                            args.$form.find('.form-item[rel=makeredundant]').show();
-                                        }
-                                    },
-                                    fields: {
-                                        cleanup: {
-                                            label: 'label.clean.up',
-                                            isBoolean: true
-                                        },
-                                        makeredundant: {
-                                            label: 'label.make.redundant',
-                                            isBoolean: true
-                                        }
-                                    }
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.restart.vpc';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.restart.vpc';
-                                    }
-                                },
-
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("restartVPC"),
-                                        data: {
-                                            id: args.context.vpc[0].id,
-                                            cleanup: (args.data.cleanup == "on"),
-                                            makeredundant: (args.data.makeredundant == "on")
-                                        },
-                                        success: function(json) {
-                                            var jid = json.restartvpcresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.vpc;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.remove.vpc',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.remove.vpc';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.remove.vpc';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteVPC"),
-                                        data: {
-                                            id: args.context.vpc[0].id
-                                        },
-                                        success: function(json) {
-                                            var jid = json.deletevpcresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        tabFilter: function(args) {
-                            var hiddenTabs = [];
-                            var isRouterOwner = isAdmin();
-                            if (!isRouterOwner) {
-                                hiddenTabs.push("router");
-                                hiddenTabs.push("virtualRouters");
-                            }
-                            return hiddenTabs;
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true
-                                    }
-                                }, {
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    cidr: {
-                                        label: 'label.cidr'
-                                    },
-                                    networkdomain: {
-                                        label: 'label.network.domain'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    ispersistent: {
-                                        label: 'label.persistent',
-                                        converter: function(booleanValue) {
-                                            if (booleanValue == true) {
-                                                return "Yes";
-                                            }
-
-                                            return "No";
-                                        }
-                                    },
-                                    redundantvpcrouter: {
-                                        label: 'label.redundant.vpc',
-                                        converter: function(booleanValue) {
-                                            if (booleanValue == true) {
-                                                return "Yes";
-                                            }
-
-                                            return "No";
-                                        }
-                                    },
-                                    restartrequired: {
-                                        label: 'label.restart.required',
-                                        converter: function(booleanValue) {
-                                            if (booleanValue == true) {
-                                                return "Yes";
-                                            }
-
-                                            return "No";
-                                        }
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'Vpc',
-                                    contextId: 'vpc'
-                                }),
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listVPCs"),
-                                        dataType: "json",
-                                        data: {
-                                            id: args.context.vpc[0].id
-                                        },
-                                        async: true,
-                                        success: function(json) {
-                                            var item = json.listvpcsresponse.vpc[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-                            router: {
-                                title: 'label.vpc.router.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    hostname: {
-                                        label: 'label.host'
-                                    },
-                                    linklocalip: {
-                                        label: 'label.linklocal.ip'
-                                    },
-                                    isredundantrouter: {
-                                        label: 'label.redundant.router',
-                                        converter: function(booleanValue) {
-                                            if (booleanValue == true) {
-                                                return "Yes";
-                                            }
-                                            return "No";
-                                        }
-                                    },
-                                    redundantstate: {
-                                        label: 'label.redundant.state'
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    serviceofferingname: {
-                                        label: 'label.service.offering'
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway'
-                                    },
-                                    publicip: {
-                                        label: 'label.public.ip'
-                                    },
-                                    guestipaddress: {
-                                        label: 'label.guest.ip'
-                                    },
-                                    dns1: {
-                                        label: 'label.dns'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listRouters&listAll=true&vpcid=" + args.context.vpc[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            for (var i = 0; i < json.listroutersresponse.router.length; i++) {
-                                                var item = json.listroutersresponse.router[i];
-
-                                                args.response.success({
-                                                    actionFilter: cloudStack.sections.system.routerActionFilter,
-                                                    data: item
-                                                });
-                                            }
-                                        }
-                                    });
-                                }
-                            },
-                            virtualRouters: {
-                                title: "label.virtual.routers",
-                                listView: cloudStack.sections.system.subsections.virtualRouters.sections.routerNoGroup.listView
-                            }
-                        }
-                    }
-                }
-            },
-
-            vpnCustomerGateway: {
-                type: 'select',
-                title: 'label.vpn.customer.gateway',
-                listView: {
-                    id: 'vpnCustomerGateway',
-                    label: 'label.vpn.customer.gateway',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        gateway: {
-                            label: 'label.gateway'
-                        },
-                        cidrlist: {
-                            label: 'label.CIDR.list'
-                        },
-                        ipsecpsk: {
-                            label: 'label.IPsec.preshared.key'
-                        }
-                    },
-
-                    advSearchFields: {
-                        keyword: {
-                            label: 'label.name'
-                        },
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-                        account: {
-                            label: 'Account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listVpnCustomerGateways'),
-                            data: data,
-                            async: true,
-                            success: function(json) {
-                                var items = json.listvpncustomergatewaysresponse.vpncustomergateway;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.vpn.customer.gateway',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.vpn.customer.gateway';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.add.vpn.customer.gateway',
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpVPNGatewayName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    cidrlist: {
-                                        label: 'label.CIDR.list',
-                                        desc: 'message.enter.seperated.list.multiple.cidrs',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway',
-                                        docID: 'helpVPNGatewayGateway',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    cidrlist: {
-                                        label: 'label.CIDR.list',
-                                        desc: 'message.enter.seperated.list.multiple.cidrs',
-                                        docID: 'helpVPNGatewayCIDRList',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    ipsecpsk: {
-                                        label: 'label.IPsec.preshared.key',
-                                        docID: 'helpVPNGatewayIPsecPresharedKey',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    //IKE Policy
-                                    ikeEncryption: {
-                                        label: 'label.IKE.encryption',
-                                        docID: 'helpVPNGatewayIKEEncryption',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'aes128',
-                                                description: 'aes128'
-                                            });
-                                            items.push({
-                                                id: 'aes192',
-                                                description: 'aes192'
-                                            });
-                                            items.push({
-                                                id: 'aes256',
-                                                description: 'aes256'
-                                            });
-                                            items.push({
-                                                id: '3des',
-                                                description: '3des'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    ikeHash: {
-                                        label: 'label.IKE.hash',
-                                        docID: 'helpVPNGatewayIKEHash',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'sha1',
-                                                description: 'sha1'
-                                            });
-                                            items.push({
-                                                id: 'sha256',
-                                                description: 'sha256'
-                                            });
-                                            items.push({
-                                                id: 'sha384',
-                                                description: 'sha384'
-                                            });
-                                            items.push({
-                                                id: 'sha512',
-                                                description: 'sha512'
-                                            });
-                                            items.push({
-                                                id: 'md5',
-                                                description: 'md5'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    ikeDh: {
-                                        label: 'label.IKE.DH',
-                                        docID: 'helpVPNGatewayIKEDH',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'modp1536',
-                                                description: 'Group 5(modp1536)'
-                                            });
-                                            items.push({
-                                                id: 'modp2048',
-                                                description: 'Group 14(modp2048)'
-                                            });
-                                            items.push({
-                                                id: 'modp3072',
-                                                description: 'Group 15(modp3072)'
-                                            });
-                                            items.push({
-                                                id: 'modp4096',
-                                                description: 'Group 16(modp4096)'
-                                            });
-                                            items.push({
-                                                id: 'modp6144',
-                                                description: 'Group 17(modp6144)'
-                                            });
-                                            items.push({
-                                                id: 'modp8192',
-                                                description: 'Group 18(modp8192)'
-                                            });
-                                            items.push({
-                                                id: 'modp1024',
-                                                description: 'Group 2(modp1024)'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    //ESP Policy
-                                    espEncryption: {
-                                        label: 'label.ESP.encryption',
-                                        docID: 'helpVPNGatewayESPLifetime',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'aes128',
-                                                description: 'aes128'
-                                            });
-                                            items.push({
-                                                id: 'aes192',
-                                                description: 'aes192'
-                                            });
-                                            items.push({
-                                                id: 'aes256',
-                                                description: 'aes256'
-                                            });
-                                            items.push({
-                                                id: '3des',
-                                                description: '3des'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    espHash: {
-                                        label: 'label.ESP.hash',
-                                        docID: 'helpVPNGatewayESPHash',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'sha1',
-                                                description: 'sha1'
-                                            });
-                                            items.push({
-                                                id: 'sha256',
-                                                description: 'sha256'
-                                            });
-                                            items.push({
-                                                id: 'sha384',
-                                                description: 'sha384'
-                                            });
-                                            items.push({
-                                                id: 'sha512',
-                                                description: 'sha512'
-                                            });
-                                            items.push({
-                                                id: 'md5',
-                                                description: 'md5'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    perfectForwardSecrecy: {
-                                        label: 'label.perfect.forward.secrecy',
-                                        docID: 'helpVPNGatewayPerfectForwardSecrecy',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: _l('label.none')
-                                            });
-                                            items.push({
-                                                id: 'modp1536',
-                                                description: 'Group 5(modp1536)'
-                                            });
-                                            items.push({
-                                                id: 'modp2048',
-                                                description: 'Group 14(modp2048)'
-                                            });
-                                            items.push({
-                                                id: 'modp3072',
-                                                description: 'Group 15(modp3072)'
-                                            });
-                                            items.push({
-                                                id: 'modp4096',
-                                                description: 'Group 16(modp4096)'
-                                            });
-                                            items.push({
-                                                id: 'modp6144',
-                                                description: 'Group 17(modp6144)'
-                                            });
-                                            items.push({
-                                                id: 'modp8192',
-                                                description: 'Group 18(modp8192)'
-                                            });
-                                            items.push({
-                                                id: 'modp1024',
-                                                description: 'Group 2(modp1024)'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    ikelifetime: {
-                                        label: 'label.IKE.lifetime',
-                                        docID: 'helpVPNGatewayIKELifetime',
-                                        defaultValue: '86400',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    esplifetime: {
-                                        label: 'label.ESP.lifetime',
-                                        docID: 'helpVPNGatewayESPLifetime',
-                                        defaultValue: '3600',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-
-                                    dpd: {
-                                        label: 'label.dead.peer.detection',
-                                        docID: 'helpVPNGatewayDeadPeerDetection',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    },
-
-                                    forceencap: {
-                                        label: 'label.vpn.force.encapsulation',
-                                        docID: 'helpVPNGatewayForceEncapsulation',
-                                        docID: 'helpVPNGatewayForceEncapsulation',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.name,
-                                    gateway: args.data.gateway,
-                                    cidrlist: args.data.cidrlist,
-                                    ipsecpsk: args.data.ipsecpsk,
-                                    ikelifetime: args.data.ikelifetime,
-                                    esplifetime: args.data.esplifetime,
-                                    dpd: (args.data.dpd == "on"),
-                                    forceencap: (args.data.forceencap == "on")
-                                };
-
-                                var ikepolicy = args.data.ikeEncryption + '-' + args.data.ikeHash;
-                                if (args.data.ikeDh != null && args.data.ikeDh.length > 0)
-                                    ikepolicy += ';' + args.data.ikeDh;
-
-                                $.extend(data, {
-                                    ikepolicy: ikepolicy
-                                });
-
-                                var esppolicy = args.data.espEncryption + '-' + args.data.espHash;
-                                if (args.data.perfectForwardSecrecy != null && args.data.perfectForwardSecrecy.length > 0)
-                                    esppolicy += ';' + args.data.perfectForwardSecrecy;
-
-                                $.extend(data, {
-                                    esppolicy: esppolicy
-                                });
-
-                                $.ajax({
-                                    url: createURL('createVpnCustomerGateway'),
-                                    data: data,
-                                    dataType: 'json',
-                                    success: function(json) {
-                                        var jid = json.createvpncustomergatewayresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.vpncustomergateway;
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.details',
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.vpnCustomerGateway[0].id,
-                                        name: args.data.name,
-                                        gateway: args.data.gateway,
-                                        cidrlist: args.data.cidrlist,
-                                        ipsecpsk: args.data.ipsecpsk,
-                                        ikelifetime: args.data.ikelifetime,
-                                        esplifetime: args.data.esplifetime,
-                                        dpd: (args.data.dpd == "on"),
-                                        forceencap: (args.data.forceencap == "on")
-                                    };
-
-                                    var ikepolicy = args.data.ikeEncryption + '-' + args.data.ikeHash;
-                                    if (args.data.ikeDh != null && args.data.ikeDh.length > 0)
-                                        ikepolicy += ';' + args.data.ikeDh;
-
-                                    $.extend(data, {
-                                        ikepolicy: ikepolicy
-                                    });
-
-                                    var esppolicy = args.data.espEncryption + '-' + args.data.espHash;
-                                    if (args.data.perfectForwardSecrecy != null && args.data.perfectForwardSecrecy.length > 0)
-                                        esppolicy += ';' + args.data.perfectForwardSecrecy;
-
-                                    $.extend(data, {
-                                        esppolicy: esppolicy
-                                    });
-
-                                    $.ajax({
-                                        url: createURL('updateVpnCustomerGateway'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jobId = json.updatevpncustomergatewayresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jobId,
-                                                    getUpdatedItem: function(json) {
-                                                        var item = json.queryasyncjobresultresponse.jobresult.vpncustomergateway;
-                                                        args.response.success({
-                                                            data: item
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.delete.VPN.customer.gateway',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.delete.VPN.customer.gateway';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.delete.VPN.customer.gateway';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteVpnCustomerGateway"),
-                                        data: {
-                                            id: args.context.vpnCustomerGateway[0].id
-                                        },
-                                        success: function(json) {
-                                            var jid = json.deletevpncustomergatewayresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    gateway: {
-                                        label: 'label.gateway',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    cidrlist: {
-                                        label: 'label.CIDR.list',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    ipsecpsk: {
-                                        label: 'label.IPsec.preshared.key',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    //IKE Policy
-                                    ikeEncryption: {
-                                        label: 'label.IKE.encryption',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '3des',
-                                                description: '3des'
-                                            });
-                                            items.push({
-                                                id: 'aes128',
-                                                description: 'aes128'
-                                            });
-                                            items.push({
-                                                id: 'aes192',
-                                                description: 'aes192'
-                                            });
-                                            items.push({
-                                                id: 'aes256',
-                                                description: 'aes256'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    ikeHash: {
-                                        label: 'label.IKE.hash',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'md5',
-                                                description: 'md5'
-                                            });
-                                            items.push({
-                                                id: 'sha1',
-                                                description: 'sha1'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    ikeDh: {
-                                        label: 'label.IKE.DH',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: _l('label.none')
-                                            });
-                                            items.push({
-                                                id: 'modp1024',
-                                                description: 'Group 2(modp1024)'
-                                            });
-                                            items.push({
-                                                id: 'modp1536',
-                                                description: 'Group 5(modp1536)'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    //ESP Policy
-                                    espEncryption: {
-                                        label: 'label.ESP.encryption',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '3des',
-                                                description: '3des'
-                                            });
-                                            items.push({
-                                                id: 'aes128',
-                                                description: 'aes128'
-                                            });
-                                            items.push({
-                                                id: 'aes192',
-                                                description: 'aes192'
-                                            });
-                                            items.push({
-                                                id: 'aes256',
-                                                description: 'aes256'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    espHash: {
-                                        label: 'label.ESP.hash',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'md5',
-                                                description: 'md5'
-                                            });
-                                            items.push({
-                                                id: 'sha1',
-                                                description: 'sha1'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    perfectForwardSecrecy: {
-                                        label: 'label.perfect.forward.secrecy',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: _l('label.none')
-                                            });
-                                            items.push({
-                                                id: 'modp1024',
-                                                description: 'Group 2(modp1024)'
-                                            });
-                                            items.push({
-                                                id: 'modp1536',
-                                                description: 'Group 5(modp1536)'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    ikelifetime: {
-                                        label: 'label.IKE.lifetime',
-                                        isEditable: true,
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    esplifetime: {
-                                        label: 'label.ESP.lifetime',
-                                        isEditable: true,
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-
-                                    dpd: {
-                                        label: 'label.dead.peer.detection',
-                                        isBoolean: true,
-                                        isEditable: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    forceencap: {
-                                        label: 'label.vpn.force.encapsulation',
-                                        isBoolean: true,
-                                        isEditable: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    }
-                                }],
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listVpnCustomerGateways"),
-                                        data: {
-                                            id: args.context.vpnCustomerGateway[0].id
-                                        },
-                                        success: function(json) {
-                                            var item = json.listvpncustomergatewaysresponse.vpncustomergateway[0];
-
-                                            //IKE Policy
-                                            var a1 = item.ikepolicy.split('-'); //e.g. item.ikepolicy == '3des-md5;modp1024'
-                                            item.ikeEncryption = a1[0];
-                                            if (a1[1].indexOf(';') == -1) {
-                                                item.ikeHash = a1[1];
-                                            } else {
-                                                var a2 = a1[1].split(';');
-                                                item.ikeHash = a2[0];
-                                                item.ikeDh = a2[1];
-                                            }
-
-                                            //ESP Policy
-                                            var a1 = item.esppolicy.split('-'); //e.g. item.esppolicy == '3des-md5' or '3des-md5;modp1024'
-                                            item.espEncryption = a1[0];
-                                            if (a1[1].indexOf(';') == -1) {
-                                                item.espHash = a1[1];
-                                            } else {
-                                                var a2 = a1[1].split(';');
-                                                item.espHash = a2[0];
-                                                item.perfectForwardSecrecy = a2[1];
-                                            }
-
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            vpnuser: {
-                type: 'select',
-                title: 'label.vpn.users',
-                listView: {
-                    id: 'vpnUsers',
-                    label: 'label.vpn.users',
-                    fields: {
-                        username: {
-                            label: 'label.name'
-                        },
-                        domain: {
-                            label: 'label.domain'
-                        },
-                        state: {
-                            label: 'label.state'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listVpnUsers'),
-                            data: data,
-                            dataType: 'json',
-                            success: function(json) {
-                                var items = json.listvpnusersresponse.vpnuser;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions:{
-                        destroy: {
-                            label: 'label.action.delete.user',
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.action.delete.vpn.user'
-                                },
-                                notification: function(args) {
-                                    return 'label.delete.vpn.user'
-                                }
-                            },
-                            action: function(args) {
-                                $.ajax({
-                                    url: createURL('removeVpnUser'),
-                                    data: {
-                                        domainid: args.context.vpnuser[0].domainid,
-                                        account: args.context.vpnuser[0].account,
-                                        username: args.context.vpnuser[0].username
-                                    },
-                                    dataType: 'json',
-                                    async: true,
-                                    success: function(json) {
-                                        var jobID = json.removevpnuserresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jobID
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        },
-                        add: {
-                            label: 'label.add.user',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.vpn.user';
-                                }
-                            },
-                            createForm:{
-                                title: 'label.add.vpn.user',
-                                fields: {
-                                    username: {
-                                        edit: true,
-                                        label: 'label.username',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    password: {
-                                        edit: true,
-                                        isPassword: true,
-                                        label: 'label.password',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    domain: {
-                                        label: 'label.domain',
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin())
-                                                return false;
-                                            else
-                                                return true;
-                                        },
-                                        select: function(args) {
-                                            if (isAdmin() || isDomainAdmin()) {
-                                                $.ajax({
-                                                    url: createURL("listDomains&listAll=true"),
-                                                    success: function(json) {
-                                                        var items = [];
-                                                        items.push({
-                                                            id: "",
-                                                            description: ""
-                                                        });
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        $(domainObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.path
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                                args.$select.change(function() {
-                                                    var $form = $(this).closest('form');
-                                                    if ($(this).val() == "") {
-                                                        $form.find('.form-item[rel=account]').hide();
-                                                    } else {
-                                                        $form.find('.form-item[rel=account]').css('display', 'inline-block');
-                                                    }
-                                                });
-                                            } else {
-                                                args.response.success({
-                                                    data: null
-                                                });
-                                            }
-                                        }
-                                    },
-                                    account: {
-                                        label: 'label.account',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin()) {
-                                                return false;
-                                            } else {
-                                                return true;
-                                            }
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    username: args.data.username,
-                                    password: args.data.password
-                                };
-
-                                if (args.data.domain != null && args.data.domain.length > 0) {
-                                    $.extend(data, {
-                                        domainid: args.data.domain
-                                    });
-                                    if (args.data.account != null && args.data.account.length > 0) {
-                                        $.extend(data, {
-                                            account: args.data.account
-                                        });
-                                    }
-                                }
-
-                                $.ajax({
-                                    url: createURL('addVpnUser'),
-                                    data: data,
-                                    dataType: 'json',
-                                    async: true,
-                                    success: function(json) {
-                                        var jid = json.addvpnuserresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.vpnuser;
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.details',
-                        actions: {
-                            destroy: {
-                                label: 'label.action.delete.user',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.vpn.user';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.delete.vpn.user';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("removeVpnUser"),
-                                        data: {
-                                            domainid: args.context.vpnuser[0].domainid,
-                                            account: args.context.vpnuser[0].account,
-                                            username: args.context.vpnuser[0].username
-                                        },
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.removevpnuserresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    username: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                }],
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listVpnUsers"),
-                                        data: {
-                                            id: args.context.vpnuser[0].id
-                                        },
-                                        success: function(json) {
-                                            var item = json.listvpnusersresponse.vpnuser[0];
-
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    function checkIfNetScalerProviderIsEnabled(services) {
-        if (services != null) {
-            for (var i = 0; i < services.length; i++) {
-                if (services[i].name == 'Lb') {
-                    var providers = services[i].provider;
-                    if (providers != null) {
-                        for (var k = 0; k < providers.length; k++) {
-                            if (providers[k].name == 'Netscaler') {
-                                return true;
-                            }
-                        }
-                    }
-                    return false;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    function getExtaPropertiesForIpObj(ipObj, args) {
-        if (!('vpc' in args.context)) { //***** Guest Network section > Guest Network page > IP Address page *****
-            var services = args.context.networks[0].service;
-            if(services != null) {
-                for(var i = 0; i < services.length; i++) {
-                    var thisService = services[i];
-                    if (thisService.name == "Vpn") {
-                        ipObj.networkOfferingHavingVpnService = true;
-                        break;
-                    }
-                }
-            }
-            if (ipObj.networkOfferingHavingVpnService == true) {
-                $.ajax({
-                    url: createURL('listRemoteAccessVpns'),
-                    data: {
-                        listAll: true,
-                        publicipid: ipObj.id
-                    },
-                    async: false,
-                    success: function(vpnResponse) {
-                        var isVPNEnabled = vpnResponse.listremoteaccessvpnsresponse.count;
-                        if (isVPNEnabled) {
-                            ipObj.vpnenabled = true;
-                            ipObj.remoteaccessvpn = vpnResponse.listremoteaccessvpnsresponse.remoteaccessvpn[0];
-                        } else {
-                            ipObj.vpnenabled = false;
-                        }
-                    }
-                });
-            }
-        } else { //***** VPC section > Configuration VPC > Router > Public IP Addresses *****
-            if (ipObj.issourcenat) { //VPC sourceNAT IP: supports VPN
-                $.ajax({
-                    url: createURL('listRemoteAccessVpns'),
-                    data: {
-                        listAll: true,
-                        publicipid: ipObj.id
-                    },
-                    async: false,
-                    success: function(vpnResponse) {
-                        var isVPNEnabled = vpnResponse.listremoteaccessvpnsresponse.count;
-                        if (isVPNEnabled) {
-                            ipObj.vpnenabled = true;
-                            ipObj.remoteaccessvpn = vpnResponse.listremoteaccessvpnsresponse.remoteaccessvpn[0];
-                        } else {
-                            ipObj.vpnenabled = false;
-                        }
-                    }
-                });
-            }
-        }
-    };
-
-    var getLBAlgorithms = function(networkObj) {
-        if (!networkObj || !networkObj.service) {
-            return [];
-        }
-
-        var lbService = $.grep(networkObj.service, function(service) {
-            return service.name == 'Lb';
-        })[0];
-
-        if (!lbService || !lbService.capability) {
-            return [];
-        }
-
-        var algorithmCapabilities = $.grep(
-            lbService.capability,
-            function(capability) {
-                return capability.name == 'SupportedLbAlgorithms';
-            }
-        )[0];
-
-        if (!algorithmCapabilities) {
-            return [];
-        }
-
-        var algorithms = algorithmCapabilities.value.split(',');
-
-        if (!algorithms) {
-            return [];
-        }
-
-        var data = [];
-        $(algorithms).each(function() {
-            data.push({id: this.valueOf(), name: this.valueOf(), description: _l('label.lb.algorithm.' + this.valueOf())});
-        });
-
-        return data;
-    }
-
-    function getForcedInfoAndUpdateNetwork(data, args) {
-        if (isAdmin()) {
-            cloudStack.dialog.confirm({
-                message: "message.confirm.force.update",
-                action: function() {
-                    $.extend(data, {
-                        forced: true
-                    });
-
-                    $.ajax({
-                        url: createURL('updateNetwork'),
-                        async: false,
-                        data: data,
-                        success: function(json) {
-                            var jid = json.updatenetworkresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        var item = json.queryasyncjobresultresponse.jobresult.network;
-                                        return {
-                                            data: item
-                                        };
-                                    }
-                                }
-                            });
-                        }
-                    });
-                },
-                cancelAction: function() {
-                    $.ajax({
-                        url: createURL('updateNetwork'),
-                        async: false,
-                        data: data,
-                        success: function(json) {
-                            var jid = json.updatenetworkresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        var item = json.queryasyncjobresultresponse.jobresult.network;
-                                        return {
-                                            data: item
-                                        };
-                                    }
-                                }
-                            });
-                        }
-                    });
-                }
-            });
-        }
-        else {
-            $.ajax({
-                url: createURL('updateNetwork'),
-                async: false,
-                data: data,
-                success: function(json) {
-                    var jid = json.updatenetworkresponse.jobid;
-                    args.response.success({
-                        _custom: {
-                            jobId: jid,
-                            getUpdatedItem: function(json) {
-                                var item = json.queryasyncjobresultresponse.jobresult.network;
-                                return {
-                                    data: item
-                                };
-                            }
-                        }
-                    });
-                }
-            });
-        }
-    }
-
-    var getLBProtocols = function(networkObj) {
-        if (!networkObj || !networkObj.service) {
-            return [];
-        }
-
-        var lbService = $.grep(networkObj.service, function(service) {
-            return service.name == 'Lb';
-        })[0];
-
-        if (!lbService || !lbService.capability) {
-            return [];
-        }
-
-        var protocolCapabilities = $.grep(
-            lbService.capability,
-            function(capability) {
-                return (capability.name == 'SupportedProtocols');
-            }
-        )[0];
-
-        if (!protocolCapabilities) {
-            return [];
-        }
-
-        // make sure protocols are found in a script compatible way: i.e. "tcp,udp,tcp.proxy" , no minus sign or spaces
-        var protocols = protocolCapabilities.value.replace(/\s/g,'').replace('-','.').split(',');
-
-        if (!protocols) {
-            return [];
-        }
-
-        var data = [];
-        $(protocols).each(function() {
-            data.push({id: this.valueOf(), name: this.valueOf(), description: _l('label.lb.protocol.' + this.valueOf())});
-        });
-
-        protocolCapabilities = $.grep(
-            lbService.capability,
-            function(capability) {
-                return (capability.name == 'SslTermination' && (capability.value == 'true' || capability.value == true));
-            }
-        )[0];
-
-        if (!protocolCapabilities) {
-            return data;
-        }
-
-        var protocols = protocolCapabilities.value.split(',');
-
-        if (!protocols) {
-            return data;
-        }
-
-        $(protocols).each(function() {
-                data.push({id: 'ssl', name: 'ssl', description: _l('label.lb.protocol.ssl')});
-        });
-
-        return data;
-    }
-
-})(cloudStack, jQuery);
diff --git a/ui/legacy/scripts/plugins.js b/ui/legacy/scripts/plugins.js
deleted file mode 100644
index e6a126e6..0000000
--- a/ui/legacy/scripts/plugins.js
+++ /dev/null
@@ -1,170 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack, require) {
-    if (!cloudStack.pluginAPI) {
-        cloudStack.pluginAPI = {};
-    }
-
-    var loadCSS = function(path) {
-        if (document.createStyleSheet) {
-            // IE-compatible CSS loading
-            document.createStyleSheet(path);
-        } else {
-            var $link = $('<link>');
-
-            $link.attr({
-                rel: 'stylesheet',
-                type: 'text/css',
-                href: path
-            });
-
-            $('html head > link:last').before($link);
-        }
-    };
-
-    $.extend(cloudStack.pluginAPI, {
-        ui: {
-            pollAsyncJob: pollAsyncJobResult,
-            apiCall: function(command, args) {
-                $.ajax({
-                    url: createURL(command),
-                    data: args.data,
-                    success: args.success,
-                    error: function(json) {
-                        args.error(parseXMLHttpResponse(json));
-                    }
-                });
-            },
-            addSection: function(section) {
-                cloudStack.sections[section.id] = $.extend(section, {
-                    customIcon: 'plugins/' + section.id + '/icon.png',
-                    isPlugin: true
-                });
-            },
-            extend: function(obj) {
-                $.extend(true, cloudStack, obj);
-            }
-        }
-    });
-
-    cloudStack.sections.plugins = {
-        title: 'label.plugins',
-        show: cloudStack.uiCustom.pluginListing
-    };
-
-    var loadedPlugins = 0;
-    var pluginTotal = cloudStack.plugins.length + cloudStack.modules.length;
-
-    // Load
-    $(['modules', 'plugins']).each(function() {
-        var type = this;
-        var paths = $(cloudStack[type]).map(function(index, id) {
-            return type + '/' + id + '/' + id;
-        }).toArray();
-
-        // Load modules
-        require(
-            paths,
-            function() {
-                $(cloudStack[type]).map(function(index, id) {
-                    var basePath = type + '/' + id + '/';
-                    var css = basePath + id + '.css';
-                    var configJS = type == 'plugins' ? basePath + 'config' : null;
-
-                    var pluginDictionary;
-                    var locale;
-                    if (type == 'plugins') {
-                        pluginDictionary = basePath + 'dictionary';
-                        locale = $.cookie('lang');
-                    }
-
-                    if (configJS) {
-                        // Load config metadata
-                        require([configJS]);
-                    }
-
-                    // Execute module
-                    var target = cloudStack[type][id];
-
-                    if ($.isArray(target)) { // Load additional JS includes
-                        pluginTotal += target[0].length;
-                        require(
-                            $(target[0]).map(function(index, val) {
-                                return basePath + val;
-                            }).toArray(),
-                            function() {
-                                loadedPlugins = loadedPlugins + target[0].length;
-                                target[1](
-                                    $.extend(true, {}, cloudStack.pluginAPI, {
-                                        pluginAPI: {
-                                            extend: function(api) {
-                                                cloudStack.pluginAPI[id] = api;
-                                            }
-                                        }
-                                    })
-                                );
-                            });
-                    } else {
-                        target(
-                            $.extend(true, {}, cloudStack.pluginAPI, {
-                                pluginAPI: {
-                                    extend: function(api) {
-                                        cloudStack.pluginAPI[id] = api;
-                                    }
-                                }
-                            })
-                        );
-                    }
-
-                    if (pluginDictionary) {
-                        // Callback for extending the dictionary with new entries
-                        var addToDictionary = function() {
-                            var additions = cloudStack[type][id].dictionary;
-                            $.extend(dictionary, additions);
-                        };
-
-                        // Only add a suffix if the locale is defined and not english/US
-                        var suffix = '';
-                        if (locale && (locale != '' && locale != 'en' & locale != 'en_US'))
-                            suffix = '_'+locale;
-
-                        // Attempt to load the locale's dictionary
-                        require([pluginDictionary+suffix], addToDictionary, function() {
-                            // If the load failed and there was no suffix, don't try again
-                            if (!suffix)
-                                return;
-
-                            // Otherwise try to load the default dictionary
-                            require([pluginDictionary], addToDictionary);
-                        });
-                    }
-
-                    loadedPlugins = loadedPlugins + 1;
-
-                    loadCSS(css);
-                });
-            }
-        );
-    });
-
-    var loadTimer = setInterval(function() {
-        if (loadedPlugins === pluginTotal) {
-            clearInterval(loadTimer);
-            $(window).trigger('cloudStack.pluginReady');
-        }
-    }, 100);
-}(jQuery, cloudStack, require));
diff --git a/ui/legacy/scripts/postLoad.js b/ui/legacy/scripts/postLoad.js
deleted file mode 100644
index 9734bcb..0000000
--- a/ui/legacy/scripts/postLoad.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-// Load this script after all scripts have executed to populate data
-(function(cloudStack) {
-
-    var loadListViewPreFilters = function(data, prefix) {
-        $.each(Object.keys(data), function(idx, key)  {
-            if (key == "listView") {
-                // Load config flags
-                if (cloudStackOptions.hiddenFields[prefix]) {
-                    var oldPreFilter = data.listView.preFilter;
-                    data.listView.preFilter = function() {
-                        // Hide config specified fields only for users.
-                        var hiddenFields = isUser() ? cloudStackOptions.hiddenFields[prefix] : [];
-                        if (oldPreFilter) {
-                            return hiddenFields.concat(oldPreFilter());
-                        }
-                        return hiddenFields;
-                    }
-                }
-            } else if (data[key] && $.type(data[key]) == "object") {
-                loadListViewPreFilters(data[key], (prefix != null && prefix.length > 0) ? prefix + "." + key : key);
-            }
-        });
-    }
-
-    loadListViewPreFilters(cloudStack.sections, "");
-
-})(cloudStack);
diff --git a/ui/legacy/scripts/projects.js b/ui/legacy/scripts/projects.js
deleted file mode 100644
index 0acc523..0000000
--- a/ui/legacy/scripts/projects.js
+++ /dev/null
@@ -1,1351 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-    var getProjectAdmin, selectedProjectObj;
-    cloudStack.projects = {
-        requireInvitation: function(args) {
-            return g_capabilities.projectinviterequired;
-        },
-
-        invitationCheck: function(args) {
-            $.ajax({
-                url: createURL('listProjectInvitations'),
-                data: {
-                    state: 'Pending'
-                },
-                success: function(json) {
-                    args.response.success({
-                        data: json.listprojectinvitationsresponse.projectinvitation ? json.listprojectinvitationsresponse.projectinvitation : []
-                    });
-                }
-            });
-        },
-
-        resourceManagement: {
-            update: function(args, projectID) {
-                var totalResources = 5;
-                var updatedResources = 0;
-
-                projectID = projectID ? projectID : cloudStack.context.projects[0].id;
-
-                $.each(args.data, function(key, value) {
-                    $.ajax({
-                        url: createURL('updateResourceLimit', {
-                            ignoreProject: true
-                        }),
-                        data: {
-                            projectid: projectID,
-                            resourcetype: key,
-                            max: args.data[key]
-                        },
-                        success: function(json) {
-                            updatedResources++;
-                            if (updatedResources == totalResources) {
-                                args.response.success();
-                            }
-                        }
-                    });
-                });
-            },
-
-            dataProvider: function(args, projectID) {
-                projectID = projectID ? projectID : cloudStack.context.projects[0].id;
-
-                $.ajax({
-                    url: createURL('listResourceLimits', {
-                        ignoreProject: true
-                    }),
-                    data: {
-                        projectid: projectID
-                    },
-                    success: function(json) {
-                        var resourceLimits = $.grep(
-                            json.listresourcelimitsresponse.resourcelimit,
-                            function(resourceLimit) {
-                                return resourceLimit.resourcetype != 5 && resourceLimit.resourcetype != 12;
-                            }
-                        );
-
-                        args.response.success({
-                            data: $.map(
-                                resourceLimits,
-                                function(resource) {
-                                    var resourceMap = {
-                                        0: {
-                                            id: 'user_vm',
-                                            label: 'label.max.vms'
-                                        },
-                                        1: {
-                                            id: 'public_ip',
-                                            label: 'label.max.public.ips'
-                                        },
-                                        2: {
-                                            id: 'volume',
-                                            label: 'label.max.volumes'
-                                        },
-                                        3: {
-                                            id: 'snapshot',
-                                            label: 'label.max.snapshots'
-                                        },
-                                        4: {
-                                            id: 'template',
-                                            label: 'label.max.templates'
-                                        },
-                                        5: {
-                                            id: 'project',
-                                            label: 'label.max.projects'
-                                        },
-                                        6: {
-                                            id: 'network',
-                                            label: 'label.max.networks'
-                                        },
-                                        7: {
-                                            id: 'vpc',
-                                            label: 'label.max.vpcs'
-                                        },
-                                        8: {
-                                            id: 'cpu',
-                                            label: 'label.max.cpus'
-                                        },
-                                        9: {
-                                            id: 'memory',
-                                            label: 'label.max.memory'
-                                        },
-                                        10: {
-                                            id: 'primary_storage',
-                                            label: 'label.max.primary.storage'
-                                        },
-                                        11: {
-                                            id: 'secondary_storage',
-                                            label: 'label.max.secondary.storage'
-                                        }
-                                    };
-
-                                    return {
-                                        id: resourceMap[resource.resourcetype].id,
-                                        label: _l(resourceMap[resource.resourcetype].label),
-                                        type: resource.resourcetype,
-                                        value: resource.max
-                                    };
-                                }
-                            )
-                        });
-                    }
-                });
-            }
-        },
-
-        dashboard: function(args) {
-            var dataFns = {
-                instances: function(data) {
-                    $.ajax({
-                        url: createURL('listVirtualMachines'),
-                        success: function(json) {
-                            var instances = json.listvirtualmachinesresponse.virtualmachine ?
-                                json.listvirtualmachinesresponse.virtualmachine : [];
-
-                            dataFns.storage($.extend(data, {
-                                runningInstances: $.grep(instances, function(instance) {
-                                    return instance.state == 'Running';
-                                }).length,
-                                stoppedInstances: $.grep(instances, function(instance) {
-                                    return instance.state != 'Running';
-                                }).length,
-                                totalInstances: instances.length
-                            }));
-                        }
-                    });
-                },
-
-                storage: function(data) {
-                    $.ajax({
-                        url: createURL('listVolumes'),
-                        success: function(json) {
-                            dataFns.bandwidth($.extend(data, {
-                                totalVolumes: json.listvolumesresponse.volume ? json.listvolumesresponse.count : 0
-                            }));
-                        }
-                    });
-                },
-
-                bandwidth: function(data) {
-                    var totalBandwidth = 0;
-                    $.ajax({
-                        url: createURL('listNetworks'),
-                        success: function(json) {
-                            var networks = json.listnetworksresponse.network ?
-                                json.listnetworksresponse.network : [];
-                            $(networks).each(function() {
-                                var network = this;
-                                $.ajax({
-                                    url: createURL('listNetworkOfferings'),
-                                    async: false,
-                                    data: {
-                                        id: network.networkofferingid
-                                    },
-                                    success: function(json) {
-                                        totalBandwidth +=
-                                            json.listnetworkofferingsresponse.networkoffering[0].networkrate;
-                                    }
-                                });
-                            });
-
-                            dataFns.ipAddresses($.extend(data, {
-                                totalBandwidth: totalBandwidth
-                            }));
-                        }
-                    });
-                },
-
-                ipAddresses: function(data) {
-                    $.ajax({
-                        url: createURL('listPublicIpAddresses'),
-                        success: function(json) {
-                            dataFns.loadBalancingRules($.extend(data, {
-                                totalIPAddresses: json.listpublicipaddressesresponse.count ? json.listpublicipaddressesresponse.count : 0
-                            }));
-                        }
-                    });
-                },
-
-                loadBalancingRules: function(data) {
-                    $.ajax({
-                        url: createURL('listLoadBalancerRules'),
-                        success: function(json) {
-                            dataFns.portForwardingRules($.extend(data, {
-                                totalLoadBalancers: json.listloadbalancerrulesresponse.count ? json.listloadbalancerrulesresponse.count : 0
-                            }));
-                        }
-                    });
-                },
-
-                portForwardingRules: function(data) {
-                    $.ajax({
-                        url: createURL('listPortForwardingRules'),
-                        success: function(json) {
-                            dataFns.users($.extend(data, {
-                                totalPortForwards: json.listportforwardingrulesresponse.count ? json.listportforwardingrulesresponse.count : 0
-                            }));
-                        }
-                    });
-                },
-
-                users: function(data) {
-                    $.ajax({
-                        url: createURL('listProjectAccounts'),
-                        success: function(json) {
-                            var users = json.listprojectaccountsresponse.projectaccount;
-
-                            dataFns.events($.extend(data, {
-                                users: $.map(users, function(user) {
-                                    return {
-                                        account: user.account
-                                    };
-                                })
-                            }));
-                        }
-                    });
-                },
-
-                events: function(data) {
-                    $.ajax({
-                        url: createURL('listEvents', {
-                            ignoreProject: true
-                        }),
-                        data: {
-                            page: 1,
-                            pageSize: 8
-                        },
-                        success: function(json) {
-                            var events = json.listeventsresponse.event;
-
-                            complete($.extend(data, {
-                                events: $.map(events, function(event) {
-                                    return {
-                                        date: event.created.substr(5, 2) + '/' + event.created.substr(8, 2) + '/' + event.created.substr(2, 2),
-                                        desc: event.description
-                                    };
-                                })
-                            }));
-                        }
-                    });
-                }
-            };
-
-            var complete = function(data) {
-                args.response.success({
-                    data: data
-                });
-            };
-
-            dataFns.instances();
-        },
-
-        add: function(args) {
-            setTimeout(function() {
-                $.ajax({
-                    url: createURL('createProject', {
-                        ignoreProject: true
-                    }),
-                    data: {
-                        account: args.context.users[0].account,
-                        domainId: args.context.users[0].domainid,
-                        name: args.data['project-name'],
-                        displayText: args.data['project-display-text']
-                    },
-                    dataType: 'json',
-                    async: true,
-                    success: function(data) {
-                        args.response.success({
-                            data: {
-                                id: data.createprojectresponse.id,
-                                name: args.data['project-name'],
-                                displayText: args.data['project-display-text'],
-                                users: []
-                            }
-                        });
-                    },
-                    error: function(json) {
-                        args.response.error(parseXMLHttpResponse(json));
-                    }
-                });
-            }, 100);
-        },
-        inviteForm: {
-            noSelect: true,
-            noHeaderActionsColumn: true,
-            ignoreEmptyFields: true,
-            fields: {
-                'email': {
-                    edit: true,
-                    label: 'label.email'
-                },
-                'account': {
-                    edit: true,
-                    label: 'label.account'
-                },
-                'state': {
-                    edit: 'ignore',
-                    label: 'label.status'
-                },
-                'add-user': {
-                    addButton: true,
-                    label: ''
-                }
-            },
-            add: {
-                label: 'label.invite',
-                action: function(args) {
-                    $.ajax({
-                        url: createURL('addAccountToProject', {
-                            ignoreProject: true
-                        }),
-                        data: {
-                            projectId: args.context.projects[0].id,
-                            account: args.data.account,
-                            email: args.data.email
-                        },
-                        dataType: 'json',
-                        async: true,
-                        success: function(data) {
-                            data: args.data,
-                            args.response.success({
-                                _custom: {
-                                    jobId: data.addaccounttoprojectresponse.jobid
-                                },
-                                notification: {
-                                    label: 'label.project.invite',
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        },
-                        error: function(json) {
-                            args.response.error(parseXMLHttpResponse(json));
-                        }
-                    });
-                }
-            },
-            actionPreFilter: function(args) {
-                if (args.context.projects &&
-                    args.context.projects[0] && !args.context.projects[0].isNew) {
-                    return args.context.actions;
-                }
-
-                return ['destroy'];
-            },
-
-            actions: {
-                destroy: {
-                    label: 'label.revoke.project.invite',
-                    action: function(args) {
-                        $.ajax({
-                            url: createURL('deleteProjectInvitation'),
-                            data: {
-                                id: args.context.multiRule[0].id
-                            },
-                            success: function(data) {
-                                args.response.success({
-                                    _custom: {
-                                        jobId: data.deleteprojectinvitationresponse.jobid
-                                    },
-                                    notification: {
-                                        label: 'label.revoke.project.invite',
-                                        poll: pollAsyncJobResult
-                                    }
-                                });
-                            }
-                        });
-                    }
-                }
-            },
-
-            // Project users data provider
-            dataProvider: function(args) {
-                $.ajax({
-                    url: createURL('listProjectInvitations', {
-                        ignoreProject: true
-                    }),
-                    data: {
-                        state: 'Pending',
-                        listAll: true,
-                        projectId: args.context.projects[0].id
-                    },
-                    dataType: 'json',
-                    async: true,
-                    success: function(data) {
-                        var invites = data.listprojectinvitationsresponse.projectinvitation ?
-                            data.listprojectinvitationsresponse.projectinvitation : [];
-                        args.response.success({
-                            data: $.map(invites, function(elem) {
-                                return {
-                                    id: elem.id,
-                                    account: elem.account,
-                                    email: elem.email,
-                                    state: elem.state
-                                };
-                            })
-                        });
-                    }
-                });
-            }
-        },
-        addUserForm: {
-            noSelect: true,
-            hideForm: function() {
-                return g_capabilities.projectinviterequired;
-            },
-            fields: {
-                'username': {
-                    edit: true,
-                    label: 'label.account'
-                },
-                'role': {
-                    edit: 'ignore',
-                    label: 'label.role'
-                },
-                'add-user': {
-                    addButton: true,
-                    label: ''
-                }
-            },
-            add: {
-                label: 'label.add.account',
-                action: function(args) {
-                    $.ajax({
-                        url: createURL('addAccountToProject', {
-                            ignoreProject: true
-                        }),
-                        data: {
-                            projectId: args.context.projects[0].id,
-                            account: args.data.username
-                        },
-                        dataType: 'json',
-                        async: true,
-                        success: function(data) {
-                            args.response.success({
-                                _custom: {
-                                    jobId: data.addaccounttoprojectresponse.jobid
-                                },
-                                notification: {
-                                    label: 'label.add.account.to.project',
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-
-                            if (g_capabilities.projectinviterequired) {
-                                cloudStack.dialog.notice({
-                                    message: 'message.project.invite.sent'
-                                });
-                            }
-                        }
-                    });
-                }
-            },
-            actionPreFilter: function(args) {
-                if (!args.context.projects &&
-                    args.context.multiRule[0].role != 'Admin') { // This is for the new project wizard
-                    return ['destroy'];
-                }
-
-                if (args.context.multiRule[0].role != 'Admin' &&
-                    (cloudStack.context.users[0].account == getProjectAdmin || isAdmin() || isDomainAdmin())) { // This is for the new project wizard: check if current logged in User is the Project Owner
-                    return args.context.actions;
-                }
-
-                return [];
-            },
-            readOnlyCheck: function(args) { // check if current logged in User is the Project Owner
-                if (isAdmin() || isDomainAdmin())
-                    return true;
-
-                var projectOwner, currentUser = cloudStack.context.users[0].account;
-                $(args.data).each(function() {
-                    var data = this;
-                    if (data.role == 'Admin')
-                        projectOwner = data.username;
-                });
-                if (projectOwner == currentUser)
-                    return true;
-
-                return false;
-            },
-            actions: {
-                destroy: {
-                    label: 'label.remove.project.account',
-                    action: function(args) {
-                        $.ajax({
-                            url: createURL('deleteAccountFromProject', {
-                                ignoreProject: true
-                            }),
-                            data: {
-                                projectId: args.context.projects[0].id,
-                                account: args.context.multiRule[0].username
-                            },
-                            dataType: 'json',
-                            async: true,
-                            success: function(data) {
-                                args.response.success({
-                                    _custom: {
-                                        jobId: data.deleteaccountfromprojectresponse.jobid
-                                    },
-                                    notification: {
-                                        label: 'label.remove.project.account',
-                                        poll: pollAsyncJobResult
-                                    }
-                                });
-                            },
-                            error: function(data) {
-                                args.response.error('Could not remove user');
-                            }
-                        });
-                    }
-                },
-
-                makeOwner: {
-                    label: 'label.make.project.owner',
-                    action: function(args) {
-                        $.ajax({
-                            url: createURL('updateProject', {
-                                ignoreProject: true
-                            }),
-                            data: {
-                                id: args.context.projects[0].id,
-                                account: args.context.multiRule[0].username
-                            },
-                            dataType: 'json',
-                            async: true,
-                            success: function(data) {
-                                args.response.success({
-                                    _custom: {
-                                        jobId: data.updateprojectresponse.jobid,
-                                        onComplete: function() {
-                                            setTimeout(function() {
-                                                $(window).trigger('cloudStack.fullRefresh');
-                                                if (isUser()) {
-                                                    $(window).trigger('cloudStack.detailsRefresh');
-                                                }
-                                            }, 500);
-                                        }
-                                    },
-                                    notification: {
-                                        label: 'label.make.project.owner',
-                                        poll: pollAsyncJobResult
-                                    }
-                                });
-                            }
-                        });
-                    }
-                }
-            },
-
-            // Project users data provider
-            dataProvider: function(args) {
-                $.ajax({
-                    url: createURL('listProjectAccounts', {
-                        ignoreProject: true
-                    }),
-                    data: {
-                        projectId: args.context.projects[0].id
-                    },
-                    dataType: 'json',
-                    async: true,
-                    success: function(data) {
-                        args.response.success({
-                            data: $.map(data.listprojectaccountsresponse.projectaccount, function(elem) {
-                                if (elem.role == 'Owner' || elem.role == 'Admin')
-                                    getProjectAdmin = elem.account;
-                                return {
-                                    id: elem.accountid,
-                                    role: elem.role,
-                                    username: elem.role == 'Owner' ? elem.account + ' (owner)' : elem.account
-                                };
-                            })
-                        });
-                    }
-                });
-            }
-        },
-
-        // Project listing data provider
-        dataProvider: function(args) {
-            var user = args.context.users[0];
-            var data1 = {
-                accountId: user.userid,
-                listAll: true
-            };
-            if (args.projectName) {
-                data1.keyword = args.projectName;
-            }
-
-            var array1 = [];
-            var page = 1;
-            var getNextPage = function() {
-                var data2 = $.extend({}, data1, {
-                    details: 'min',
-                    page: page,
-                    pageSize: 500
-                });
-
-                $.ajax({
-                    url: createURL('listProjects', {
-                        ignoreProject: true
-                    }),
-                    data: data2,
-                    async: false,
-                    success: function(json) {
-                        var projects = json.listprojectsresponse.project;
-                        if (projects != undefined) {
-                            for(var i = 0; i < projects.length; i++) {
-                                array1.push($.extend(projects[i], {
-                                    displayText: projects[i].displaytext
-                                }));
-                            }
-                        }
-                        if (array1.length < json.listprojectsresponse.count) {
-                            page++;
-                            getNextPage();
-                        }
-                    }
-                });
-            }
-            getNextPage();
-            args.response.success({ data: array1 });
-        }
-    };
-
-    cloudStack.sections.projects = {
-        title: 'label.projects',
-        id: 'projects',
-        sectionSelect: {
-            label: 'label.select-view'
-        },
-        sections: {
-            projects: {
-                type: 'select',
-                id: 'projects',
-                title: 'label.projects',
-                listView: {
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        displaytext: {
-                            label: 'label.display.name'
-                        },
-                        domain: {
-                            label: 'label.domain'
-                        },
-                        account: {
-                            label: 'label.owner.account'
-                        },
-                        state: {
-                            label: 'label.status',
-                            indicator: {
-                                'Active': 'on',
-                                'Destroyed': 'off',
-                                'Disabled': 'off',
-                                'Left Project': 'off'
-                            }
-                        }
-                    },
-
-                    advSearchFields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        displaytext: {
-                            label: 'label.display.text'
-                        },
-
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        account: {
-                            label: 'label.account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        if (isDomainAdmin()) {
-                            $.extend(data, {
-                                domainid: args.context.users[0].domainid
-                            });
-                        }
-
-                        $.extend(data, {
-                            details: 'min',
-                        });
-
-                        $.ajax({
-                            url: createURL('listProjects', {
-                                ignoreProject: true
-                            }),
-                            data: data,
-                            success: function(data) {
-                                args.response.success({
-                                    data: data.listprojectsresponse.project,
-                                    actionFilter: projectsActionFilter
-                                });
-                            },
-                    error: function(XMLHttpResponse) {
-                        cloudStack.dialog.notice({
-                            message: parseXMLHttpResponse(XMLHttpResponse)
-                        });
-                        args.response.error();
-                     }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.new.project',
-                            action: {
-                                custom: function(args) {
-                                    $(window).trigger('cloudStack.newProject');
-                                }
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        updateContext: function(args) {
-                            var project;
-                            var projectID = args.context.projects[0].id;
-                            var url = 'listProjects';
-                            if (isDomainAdmin()) {
-                                url += '&domainid=' + args.context.users[0].domainid;
-                            }
-                            $.ajax({
-                                url: createURL(url),
-                                data: {
-                                    listAll: true,
-                                    id: projectID
-                                },
-                                async: false,
-                                success: function(json) {
-                                    project = json.listprojectsresponse.project[0]; // override project after update owner
-                                }
-                            });
-                            selectedProjectObj = project;
-
-                            return {
-                                projects: [project]
-                            };
-                        },
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('updateProject'),
-                                        data: $.extend(true, {}, args.context.projects[0], args.data),
-                                        success: function(json) {
-                                            args.response.success();
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.edit.project.details';
-                                    }
-                                }
-                            },
-                            disable: {
-                                label: 'label.suspend.project',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('suspendProject'),
-                                        data: {
-                                            id: args.context.projects[0].id
-                                        },
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.suspendprojectresponse.jobid,
-                                                    getUpdatedItem: function() {
-                                                        return {
-                                                            state: 'Suspended'
-                                                        };
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function() {
-                                        return 'message.suspend.project';
-                                    },
-                                    notification: function() {
-                                        return 'label.suspend.project';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.activate.project',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('activateProject'),
-                                        data: {
-                                            id: args.context.projects[0].id
-                                        },
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.activaterojectresponse.jobid, // NOTE: typo
-                                                    getUpdatedItem: function() {
-                                                        return {
-                                                            state: 'Active'
-                                                        };
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function() {
-                                        return 'message.activate.project';
-                                    },
-                                    notification: function() {
-                                        return 'label.activate.project';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.delete.project',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('deleteProject', {
-                                            ignoreProject: true
-                                        }),
-                                        data: {
-                                            id: args.data.id
-                                        },
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(data) {
-                                            args.response.success({
-                                                _custom: {
-                                                    getUpdatedItem: function(data) {
-                                                        return $.extend(data, {
-                                                            state: 'Destroyed'
-                                                        });
-                                                    },
-                                                    onComplete: function(data) {
-                                                        $(window).trigger('cloudStack.deleteProject', args);
-                                                    },
-                                                    getActionFilter: function(args) {
-                                                        return function() {
-                                                            return [];
-                                                        };
-                                                    },
-                                                    jobId: data.deleteprojectresponse.jobid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.delete.project';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.delete.project';
-                                    }
-                                },
-
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        tabFilter: function(args) {
-                            var project = selectedProjectObj;
-                            var projectOwner = project.account;
-                            var currentAccount = args.context.users[0].account;
-                            var hiddenTabs = [];
-
-                            if (!isAdmin() && !isDomainAdmin()) {
-                                hiddenTabs.push('resources');
-
-                                if (currentAccount != projectOwner) {
-                                    hiddenTabs.push('accounts');
-                                    hiddenTabs.push('invitations');
-                                }
-                            }
-
-                            if (!cloudStack.projects.requireInvitation()) {
-                                hiddenTabs.push('invitations');
-                            }
-
-                            return hiddenTabs;
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    displaytext: {
-                                        label: 'label.display.name',
-                                        isEditable: true
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }, {
-                                    vmtotal: {
-                                        label: 'label.total.vms'
-                                    },
-                                    memorytotal: {
-                                        label: 'label.memory.total'
-                                    },
-                                    cputotal: {
-                                        label: 'label.total.cpu'
-                                    },
-                                    volumetotal: {
-                                        label: 'label.volume'
-                                    },
-                                    primarystoragetotal: {
-                                        label: 'label.primary.storage'
-                                    },
-                                    iptotal: {
-                                        label: 'label.total.of.ip'
-                                    },
-                                    templatetotal: {
-                                        label: 'label.template'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'Project',
-                                    contextId: 'projects'
-                                }),
-
-                                dataProvider: function(args) {
-                                    var projectID = args.context.projects[0].id;
-
-                                    var url = 'listProjects';
-
-                                    if (isDomainAdmin()) {
-                                        url += '&domainid=' + args.context.users[0].domainid;
-                                    }
-                                    $.ajax({
-                                        url: createURL(url),
-                                        data: {
-                                            listAll: true,
-                                            id: projectID
-                                        },
-                                        success: function(json) {
-                                            args.response.success({
-                                                data: json.listprojectsresponse.project ? json.listprojectsresponse.project[0] : {},
-                                                actionFilter: projectsActionFilter
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            accounts: {
-                                title: 'label.accounts',
-                                custom: function(args) {
-                                    var project = args.context.projects[0];
-                                    var multiEditArgs = $.extend(
-                                        true, {},
-                                        cloudStack.projects.addUserForm, {
-                                            context: {
-                                                projects: [project]
-                                            }
-                                        }
-                                    );
-                                    var $users = $('<div>').multiEdit(multiEditArgs);
-
-                                    return $users;
-                                }
-                            },
-
-                            invitations: {
-                                title: 'label.invitations',
-                                custom: function(args) {
-                                    var project = args.context.projects[0];
-                                    var $invites = cloudStack.uiCustom.projectsTabs.userManagement({
-                                        useInvites: true,
-                                        context: {
-                                            projects: [project]
-                                        }
-                                    });
-
-                                    return $invites;
-                                }
-                            },
-
-                            resources: {
-                                title: 'label.resources',
-                                custom: function(args) {
-                                    var $resources = cloudStack.uiCustom
-                                        .projectsTabs.dashboardTabs.resources({
-                                            projectID: args.context.projects[0].id
-                                        });
-
-                                    return $('<div>').addClass('project-dashboard').append($resources);
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            invitations: {
-                type: 'select',
-                id: 'invitations',
-                title: 'label.invitations',
-                listView: {
-                    fields: {
-                        project: {
-                            label: 'label.project'
-                        },
-                        domain: {
-                            label: 'label.domain'
-                        },
-                        state: {
-                            label: 'label.status',
-                            indicator: {
-                                'Accepted': 'on',
-                                'Completed': 'on',
-                                'Pending': 'off',
-                                'Declined': 'off'
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        $.ajax({
-                            url: createURL('listProjectInvitations'),
-                            data: {
-                                state: 'Pending'
-                            },
-                            success: function(data) {
-                                args.response.success({
-                                    actionFilter: projectInvitationActionFilter,
-                                    data: data.listprojectinvitationsresponse.projectinvitation ? data.listprojectinvitationsresponse.projectinvitation : []
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        enterToken: {
-                            label: 'label.enter.token',
-                            isHeader: true,
-                            addRow: false,
-                            preFilter: function(args) {
-                                var invitationsPresent = false;
-
-                                $.ajax({
-                                    url: createURL('listProjectInvitations'),
-                                    data: {
-                                        state: 'Pending'
-                                    },
-                                    async: false,
-                                    success: function(json) {
-                                        if (json.listprojectinvitationsresponse.count) {
-                                            invitationsPresent = true;
-                                        }
-                                    }
-                                });
-
-                                return !invitationsPresent;
-                            },
-                            createForm: {
-                                desc: 'message.enter.token',
-                                fields: {
-                                    projectid: {
-                                        label: 'label.project.id',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpEnterTokenProjectID'
-                                    },
-                                    token: {
-                                        label: 'label.token',
-                                        docID: 'helpEnterTokenToken',
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                $.ajax({
-                                    url: createURL('updateProjectInvitation'),
-                                    data: args.data,
-                                    success: function(json) {
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: json.updateprojectinvitationresponse.jobid
-                                            }
-                                        });
-                                    },
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            },
-                            messages: {
-                                notification: function() {
-                                    return 'label.accept.project.invitation';
-                                },
-                                complete: function() {
-                                    return 'message.join.project';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        },
-
-                        accept: {
-                            label: 'label.accept.project.invitation',
-                            action: function(args) {
-                                $.ajax({
-                                    url: createURL('updateProjectInvitation'),
-                                    data: {
-                                        projectid: args.context.invitations[0].projectid,
-                                        account: args.context.users[0].account,
-                                        domainid: args.context.users[0].domainid,
-                                        accept: true
-                                    },
-                                    success: function(data) {
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: data.updateprojectinvitationresponse.jobid,
-                                                getUpdatedItem: function() {
-                                                    return {
-                                                        state: 'Accepted'
-                                                    };
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            messages: {
-                                confirm: function() {
-                                    return 'message.confirm.join.project';
-                                },
-                                notification: function() {
-                                    return 'label.accept.project.invitation';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        },
-
-                        decline: {
-                            label: 'label.decline.invitation',
-                            action: function(args) {
-                                $.ajax({
-                                    url: createURL('updateProjectInvitation'),
-                                    data: {
-                                        projectid: args.context.invitations[0].projectid,
-                                        account: args.context.users[0].account,
-                                        accept: false
-                                    },
-
-                                    success: function(data) {
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: data.updateprojectinvitationresponse.jobid,
-                                                getUpdatedItem: function() {
-                                                    return {
-                                                        state: 'Declined'
-                                                    };
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            },
-                            messages: {
-                                confirm: function() {
-                                    return 'message.decline.invitation';
-                                },
-                                notification: function() {
-                                    return 'label.decline.invitation';
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    var projectsActionFilter = function(args) {
-        var allowedActions = ['remove', 'edit'];
-
-        if (args.context.item.account == cloudStack.context.users[0].account ||
-            isAdmin() || isDomainAdmin()) {
-            if (args.context.item.state == 'Suspended') {
-                allowedActions.push('enable');
-            } else if (args.context.item.state == 'Active') {
-                allowedActions.push('disable');
-            }
-
-            return allowedActions;
-        }
-
-        return [];
-    };
-
-    var projectInvitationActionFilter = function(args) {
-        var state = args.context.item.state;
-
-        if (state == 'Accepted' || state == 'Completed' || state == 'Declined') {
-            return [];
-        }
-
-        return ['accept', 'decline'];
-    };
-}(cloudStack));
diff --git a/ui/legacy/scripts/regions.js b/ui/legacy/scripts/regions.js
deleted file mode 100644
index ff50bff..0000000
--- a/ui/legacy/scripts/regions.js
+++ /dev/null
@@ -1,1259 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-    cloudStack.sections.regions = {
-        title: 'label.menu.regions',
-        id: 'regions',
-        sectionSelect: {
-            label: 'label.select-view',
-            preFilter: function() {
-                return ['regions'];
-            }
-        },
-        regionSelector: {
-            dataProvider: function(args) {
-                $.ajax({
-                    url: createURL('listRegions'),
-                    success: function(json) {
-                        var regions = json.listregionsresponse.region;
-
-                        args.response.success({
-                            data: regions ? regions : [{
-                                id: -1,
-                                name: _l('label.no.data')
-                            }]
-                        });
-                    }
-                });
-            }
-        },
-        sections: {
-            regions: {
-                id: 'regions',
-                type: 'select',
-                title: 'label.menu.regions',
-                listView: {
-                    section: 'regions',
-                    id: 'regions',
-                    label: 'label.menu.regions',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        id: {
-                            label: 'label.id'
-                        },
-                        endpoint: {
-                            label: 'label.endpoint'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.region',
-                            preFilter: function(args) {
-                                if (isAdmin())
-                                    return true;
-                                else
-                                    return false;
-                            },
-                            messages: {
-                                notification: function() {
-                                    return 'label.add.region';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.add.region',
-                                desc: 'message.add.region',
-                                fields: {
-                                    id: {
-                                        label: 'label.id',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    endpoint: {
-                                        label: 'label.endpoint',
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    id: args.data.id,
-                                    name: args.data.name,
-                                    endpoint: args.data.endpoint
-                                };
-
-                                $.ajax({
-                                    url: createURL('addRegion'),
-                                    data: data,
-                                    success: function(json) {
-                                        var item = json.addregionresponse.region;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                        $(window).trigger('cloudStack.refreshRegions');
-                                    },
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-                    dataProvider: function(args) {
-                        $.ajax({
-                            url: createURL('listRegions'),
-                            success: function(json) {
-                                var items = json.listregionsresponse.region;
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(json) {
-                                args.response.error(parseXMLHttpResponse(json));
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.region.details',
-                        viewAll: [{
-                            path: 'regions.GSLB',
-                            label: 'label.gslb'
-                        }, {
-                            path: 'network.vpc',
-                            label: 'label.regionlevelvpc'
-                        }, {
-                            path: 'regions.portableIpRanges',
-                            label: 'label.portable.ip',
-                            preFilter: function(args) {
-                                if (isAdmin())
-                                    return true;
-
-                                return false;
-                            }
-                        }, {
-                            path: 'regions.NCC',
-                            label: 'label.ncc'
-                        }],
-                        actions: {
-                            edit: {
-                                label: 'label.edit.region',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.regions[0].id,
-                                        name: args.data.name,
-                                        endpoint: args.data.endpoint
-                                    };
-
-                                    $.ajax({
-                                        url: createURL('updateRegion'),
-                                        data: data,
-                                        success: function(json) {
-                                            args.response.success();
-                                            $(window).trigger('cloudStack.refreshRegions');
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                }
-                            },
-                            remove: {
-                                label: 'label.remove.region',
-                                messages: {
-                                    notification: function() {
-                                        return 'label.remove.region';
-                                    },
-                                    confirm: function() {
-                                        return 'message.remove.region';
-                                    }
-                                },
-                                preAction: function(args) {
-                                    var region = args.context.regions[0];
-
-                                    return true;
-                                },
-                                action: function(args) {
-                                    var region = args.context.regions[0];
-
-                                    $.ajax({
-                                        url: createURL('removeRegion'),
-                                        data: {
-                                            id: region.id
-                                        },
-                                        success: function(json) {
-                                            args.response.success();
-                                            $(window).trigger('cloudStack.refreshRegions');
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    id: {
-                                        label: 'label.id'
-                                    }
-                                }, {
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true
-                                    },
-                                    endpoint: {
-                                        label: 'label.endpoint',
-                                        isEditable: true
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listRegions'),
-                                        data: {
-                                            id: args.context.regions[0].id
-                                        },
-                                        success: function(json) {
-                                            var region = json.listregionsresponse.region
-
-                                            args.response.success({
-                                                actionFilter: regionActionfilter,
-                                                data: region ? region[0] : {}
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            GSLB: {
-                id: 'GSLB',
-                type: 'select',
-                title: 'label.gslb',
-                listView: {
-                    id: 'GSLB',
-                    label: 'label.gslb',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        gslbdomainname: {
-                            label: 'label.gslb.domain.name'
-                        },
-                        gslblbmethod: {
-                            label: 'label.algorithm'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.gslb',
-
-                            messages: {
-                                confirm: function(args) {
-                                    return 'label.add.gslb';
-                                },
-                                notification: function(args) {
-                                    return 'label.add.gslb';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.gslb',
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description'
-                                    },
-                                    gslbdomainname: {
-                                        label: 'label.gslb.domain.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    gslblbmethod: {
-                                        label: 'label.algorithm',
-                                        select: function(args) {
-                                            var array1 = [{
-                                                id: 'roundrobin',
-                                                description: 'roundrobin'
-                                            }, {
-                                                id: 'leastconn',
-                                                description: 'leastconn'
-                                            }, {
-                                                id: 'proximity',
-                                                description: 'proximity'
-                                            }];
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    },
-                                    gslbservicetype: {
-                                        label: 'label.gslb.servicetype',
-                                        select: function(args) {
-                                            var array1 = [{
-                                                id: 'tcp',
-                                                description: 'tcp'
-                                            }, {
-                                                id: 'udp',
-                                                description: 'udp'
-                                            }, {
-                                                id: 'http',
-                                                description: 'http'
-                                            }];
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        },
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    domainid: {
-                                        label: 'label.domain',
-                                        select: function(args) {
-                                            if (isAdmin() || isDomainAdmin()) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    success: function(json) {
-                                                        var array1 = [{
-                                                            id: '',
-                                                            description: ''
-                                                        }];
-                                                        var domains = json.listdomainsresponse.domain;
-                                                        if (domains != null && domains.length > 0) {
-                                                            for (var i = 0; i < domains.length; i++) {
-                                                                array1.push({
-                                                                    id: domains[i].id,
-                                                                    description: domains[i].path
-                                                                });
-                                                            }
-                                                        }
-                                                        array1.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-                                                        args.response.success({
-                                                            data: array1
-                                                        });
-                                                    }
-                                                });
-                                            } else {
-                                                args.response.success({
-                                                    data: null
-                                                });
-                                            }
-                                        },
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin())
-                                                return false;
-                                            else
-                                                return true;
-                                        }
-                                    },
-                                    account: {
-                                        label: 'label.account',
-                                        isHidden: function(args) {
-                                            if (isAdmin() || isDomainAdmin())
-                                                return false;
-                                            else
-                                                return true;
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.name,
-                                    regionid: args.context.regions[0].id,
-                                    gslblbmethod: args.data.gslblbmethod,
-                                    gslbstickysessionmethodname: 'sourceip',
-                                    gslbdomainname: args.data.gslbdomainname,
-                                    gslbservicetype: args.data.gslbservicetype
-                                };
-                                if (args.data.description != null && args.data.description.length > 0)
-                                    $.extend(data, {
-                                        description: args.data.description
-                                    });
-                                if (args.data.domainid != null && args.data.domainid.length > 0)
-                                    $.extend(data, {
-                                        domainid: args.data.domainid
-                                    });
-                                if (args.data.account != null && args.data.account.length > 0)
-                                    $.extend(data, {
-                                        account: args.data.account
-                                    });
-
-                                $.ajax({
-                                    url: createURL('createGlobalLoadBalancerRule'),
-                                    data: data,
-                                    success: function(json) {
-                                        var jid = json.creategloballoadbalancerruleresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.globalloadbalancer;
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        if ('regions' in args.context) {
-                            var data = {
-                                regionid: args.context.regions[0].id
-                            };
-                            $.ajax({
-                                url: createURL('listGlobalLoadBalancerRules'),
-                                data: data,
-                                success: function(json) {
-                                    var items = json.listgloballoadbalancerrulesresponse.globalloadbalancerrule;
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            });
-                        } else {
-                            args.response.success({
-                                data: null
-                            });
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.gslb.details',
-                        viewAll: {
-                            path: 'regions.lbUnderGSLB',
-                            label: 'label.gslb.assigned.lb'
-                        },
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.GSLB[0].id,
-                                        description: args.data.description,
-                                        gslblbmethod: args.data.gslblbmethod
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateGlobalLoadBalancerRule'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.updategloballoadbalancerruleresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            remove: {
-                                label: 'label.gslb.delete',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.gslb.delete.confirm';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.gslb.delete';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.GSLB[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL("deleteGlobalLoadBalancerRule"),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.deletegloballoadbalancerruleresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    description: {
-                                        label: 'label.description',
-                                        isEditable: true
-                                    },
-                                    gslbdomainname: {
-                                        label: 'label.gslb.domain.name'
-                                    },
-                                    gslblbmethod: {
-                                        label: 'label.algorithm',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var array1 = [{
-                                                id: 'roundrobin',
-                                                description: 'roundrobin'
-                                            }, {
-                                                id: 'leastconn',
-                                                description: 'leastconn'
-                                            }, {
-                                                id: 'proximity',
-                                                description: 'proximity'
-                                            }];
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    },
-                                    gslbservicetype: {
-                                        label: 'label.gslb.servicetype'
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    var data = {
-                                        id: args.context.GSLB[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('listGlobalLoadBalancerRules'),
-                                        data: data,
-                                        success: function(json) {
-                                            var item = json.listgloballoadbalancerrulesresponse.globalloadbalancerrule[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            portableIpRanges: {
-                id: 'portableIpRanges',
-                type: 'select',
-                title: 'label.portable.ip.ranges',
-                listView: {
-                    id: 'portableIpRanges',
-                    label: 'label.portable.ip.ranges',
-                    fields: {
-                        startip: {
-                            label: 'label.start.IP'
-                        },
-                        endip: {
-                            label: 'label.end.IP'
-                        },
-                        gateway: {
-                            label: 'label.gateway'
-                        },
-                        netmask: {
-                            label: 'label.netmask'
-                        },
-                        vlan: {
-                            label: 'label.vlan'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        $.ajax({
-                            url: createURL('listPortableIpRanges'),
-                            data: {
-                                regionid: args.context.regions[0].id
-                            },
-                            success: function(json) {
-                                var items = json.listportableipresponse.portableiprange;
-                                args.response.success({
-                                    data: items
-                                });
-                            },
-                            error: function(json) {
-                                args.response.error(parseXMLHttpResponse(json));
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.portable.ip.range',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.portable.ip.range';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.add.portable.ip.range',
-                                fields: {
-                                    startip: {
-                                        label: 'label.start.IP',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    endip: {
-                                        label: 'label.end.IP',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    netmask: {
-                                        label: 'label.netmask',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    vlan: {
-                                        label: 'label.vlan',
-                                        validation: {
-                                            required: false
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    regionid: args.context.regions[0].id,
-                                    startip: args.data.startip,
-                                    endip: args.data.endip,
-                                    gateway: args.data.gateway,
-                                    netmask: args.data.netmask
-                                };
-                                if (args.data.vlan != null && args.data.vlan.length > 0) {
-                                    $.extend(data, {
-                                        vlan: args.data.vlan
-                                    })
-                                }
-                                $.ajax({
-                                    url: createURL('createPortableIpRange'),
-                                    data: data,
-                                    success: function(json) {
-                                        var jid = json.createportableiprangeresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.portableiprange;
-                                                }
-                                            }
-                                        });
-                                    },
-                                    error: function(data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.portable.ip.range.details',
-                        actions: {
-                            remove: {
-                                label: 'label.delete.portable.ip.range',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.portable.ip.delete.confirm';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.delete.portable.ip.range';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.portableIpRanges[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deletePortableIpRange'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.deleteportablepublicipresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    id: {
-                                        label: 'label.id'
-                                    }
-                                }, {
-                                    startip: {
-                                        label: 'label.start.IP'
-                                    },
-                                    endip: {
-                                        label: 'label.end.IP'
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway'
-                                    },
-                                    netmask: {
-                                        label: 'label.netmask'
-                                    },
-                                    vlan: {
-                                        label: 'label.vlan'
-                                    },
-                                    portableipaddress: {
-                                        label: 'label.portable.ips',
-                                        converter: function(args) {
-                                            var text1 = '';
-                                            if (args != null) {
-                                                for (var i = 0; i < args.length; i++) {
-                                                    if (i > 0) {
-                                                        text1 += ', ';
-                                                    }
-                                                    text1 += args[i].ipaddress;
-                                                }
-                                            }
-                                            return text1;
-                                        }
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listPortableIpRanges'),
-                                        data: {
-                                            id: args.context.portableIpRanges[0].id
-                                        },
-                                        success: function(json) {
-                                            var item = json.listportableipresponse.portableiprange[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            lbUnderGSLB: {
-                id: 'lbUnderGSLB',
-                type: 'select',
-                title: 'label.gslb.assigned.lb',
-                listView: {
-                    section: 'lbUnderGSLB',
-                    id: 'lbUnderGSLB',
-                    label: 'label.gslb.assigned.lb',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        publicport: {
-                            label: 'label.public.port'
-                        },
-                        privateport: {
-                            label: 'label.private.port'
-                        },
-                        algorithm: {
-                            label: 'label.algorithm'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {
-                            id: args.context.GSLB[0].id
-                        };
-                        $.ajax({
-                            url: createURL('listGlobalLoadBalancerRules'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listgloballoadbalancerrulesresponse.globalloadbalancerrule[0].loadbalancerrule;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.gslb.assigned.lb.more',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.gslb.assigned.lb.more';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.gslb.assigned.lb.more',
-                                fields: {
-                                    loadbalancerrule: {
-                                        label: 'label.gslb.lb.rule',
-                                        select: function(args) {
-                                            var data = {
-                                                globalloadbalancerruleid: args.context.GSLB[0].id,
-                                                listAll: true
-                                            };
-                                            $.ajax({
-                                                url: createURL('listLoadBalancerRules'),
-                                                data: data,
-                                                success: function(json) {
-                                                    var allLbRules = json.listloadbalancerrulesresponse.loadbalancerrule;
-                                                    var assignedLbRules = args.context.GSLB[0].loadbalancerrule;
-                                                    var items = [];
-                                                    if (allLbRules != null) {
-                                                        for (var i = 0; i < allLbRules.length; i++) {
-                                                            var isAssigned = false;
-                                                            if (assignedLbRules != null) {
-                                                                for (var k = 0; k < assignedLbRules.length; k++) {
-                                                                    if (allLbRules[i].id == assignedLbRules[k].id) {
-                                                                        isAssigned = true;
-                                                                        break;
-                                                                    }
-                                                                }
-                                                            }
-                                                            if (isAssigned == false) {
-                                                                items.push(allLbRules[i]);
-                                                            }
-                                                        }
-                                                    }
-                                                    args.response.success({
-                                                        data: items,
-                                                        descriptionField: 'name'
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    id: args.context.GSLB[0].id,
-                                    loadbalancerrulelist: args.data.loadbalancerrule
-                                };
-                                $.ajax({
-                                    url: createURL('assignToGlobalLoadBalancerRule'),
-                                    data: data,
-                                    success: function(json) {
-                                        var jid = json.assigntogloballoadbalancerruleresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.loadbalancerrule;
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: 'label.gslb.lb.details',
-                        actions: {
-                            remove: {
-                                label: 'label.gslb.lb.remove',
-                                messages: {
-                                    notification: function() {
-                                        return 'label.gslb.lb.remove';
-                                    },
-                                    confirm: function() {
-                                        return 'message.gslb.lb.remove.confirm';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('removeFromGlobalLoadBalancerRule'),
-                                        data: {
-                                            id: args.context.GSLB[0].id,
-                                            loadbalancerrulelist: args.context.lbUnderGSLB[0].id
-                                        },
-                                        success: function(json) {
-                                            var jid = json.removefromloadbalancerruleresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    publicport: {
-                                        label: 'label.public.port'
-                                    },
-                                    privateport: {
-                                        label: 'label.private.port'
-                                    },
-                                    algorithm: {
-                                        label: 'label.algorithm'
-                                    },
-                                    publicip: {
-                                        label: 'label.public.ip'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    cidrlist: {
-                                        label: 'label.cidr'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listLoadBalancerRules'),
-                                        data: {
-                                            id: args.context.lbUnderGSLB[0].id
-                                        },
-                                        success: function(json) {
-                                            var item = json.listloadbalancerrulesresponse.loadbalancerrule[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            NCC: {
-                id: 'NCC',
-                type: 'select',
-                title: 'NCC',
-                listView: {
-                    id: 'NCC',
-                    label: 'label.ncc',
-
-                    fields: {
-                        uuid: {
-                            label: 'label.id'
-                        },
-                        ipaddress: {
-                            label: 'label.ipaddress'
-                        },
-                        numretries: {
-                            label: 'label.numretries'
-                        }
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.action.register.ncc',
-
-                            preFilter: function(args) {
-                                var isRegisterButtonShown = false;
-
-                                $.ajax({
-                                    url: createURL('listNetscalerControlCenter'),
-                                    async: false,
-                                    success: function(json) {
-                                        isRegisterButtonShown = json.listNetscalerControlCenter.netscalercontrolcenter ? false : true;
-                                    }
-                                });
-
-                                return isRegisterButtonShown;
-                            },
-
-                            messages: {
-                                confirm: function(args) {
-                                    return 'label.action.register.ncc';
-                                },
-                                notification: function(args) {
-                                    return 'label.action.register.ncc';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.action.register.ncc',
-                                fields: {
-                                    ipaddress: {
-                                        label: 'label.ipaddress',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    username: {
-                                        label: 'label.username',
-                                        validation : {
-                                            required: true
-                                        }
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true,
-                                        validation : {
-                                            required: true,
-                                        }
-                                    },
-                                    numretries: {
-                                        label: 'label.numretries',
-                                        defaultValue: '2',
-                                        validation : {
-                                            required: true,
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var $loading = $('<div>').addClass('loading-overlay');
-                                $('.system-dashboard-view:visible').prepend($loading);
-
-                                var data = {
-                                    ipaddress: args.data.ipaddress,
-                                    username: args.data.username,
-                                    password: args.data.password,
-                                    numretries: args.data.numretries
-                                };
-
-                                $.ajax({
-                                    url: createURL('registerNetscalerControlCenter'),
-                                    data: data,
-                                    dataType: 'json',
-                                    type: "POST",
-                                    success: function(json) {
-                                        var jid = json.registernetscalercontrolcenterresponse.jobid;
-                                        var registerNetscalerControlCenterIntervalID = setInterval(function() {
-                                            $.ajax({
-                                                url: createURL("queryAsyncJobResult&jobId=" + jid),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var result = json.queryasyncjobresultresponse;
-                                                    if (result.jobstatus == 0) {
-                                                        return; //Job has not completed
-                                                    } else {
-                                                        clearInterval(registerNetscalerControlCenterIntervalID);
-                                                        if (result.jobstatus == 1) {
-                                                            cloudStack.dialog.notice({
-                                                                message: 'message.register.succeeded'
-                                                            });
-                                                            $loading.remove();
-                                                        } else if (result.jobstatus == 2) {
-                                                            cloudStack.dialog.notice({
-                                                                message: _l('message.register.failed') + ' ' + _s(result.jobresult.errortext)
-                                                            });
-                                                            $loading.remove();
-                                                        }
-                                                    }
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    cloudStack.dialog.notice({
-                                                        message: _l('message.register.failed') + ' ' + parseXMLHttpResponse(XMLHttpResponse)
-                                                    });
-                                                    $loading.remove();
-                                                }
-                                            });
-                                        }, g_queryAsyncJobResultInterval);
-                                    },
-                                    error: function(XMLHttpResponse) {
-                                        cloudStack.dialog.notice({
-                                            message: _l('message.register.failed') + ' ' + parseXMLHttpResponse(XMLHttpResponse)
-                                        });
-                                        $loading.remove();
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        $.ajax({
-                            url: createURL('listNetscalerControlCenter'),
-                            success: function(json) {
-                                var item = json.listNetscalerControlCenter.netscalercontrolcenter ? json.listNetscalerControlCenter.netscalercontrolcenter : null;
-                                args.response.success({
-                                    data: item
-                                });
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.ncc.details',
-                        actions: {
-                            remove: {
-                                label: 'label.ncc.delete',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.ncc.delete.confirm';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.ncc.delete';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.NCC[0].uuid
-                                    };
-                                    $.ajax({
-                                        url: createURL("deleteNetscalerControlCenter"),
-                                        data: data,
-                                        success: function(json) {
-                                            var status = json.deleteNetscalerControlCenter ? json.deleteNetscalerControlCenter.success : null;
-                                            args.response.success({
-                                                data: status
-                                            });
-                                        }
-                                    });
-                                },
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    uuid: {
-                                        label: 'label.id'
-                                    }
-                                }, {
-                                    ipaddress: {
-                                        label: 'label.ipaddress'
-                                    },
-                                    numretries: {
-                                        label: 'label.numretries',
-                                    },
-                                }],
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listNetscalerControlCenter'),
-                                        success: function(json) {
-                                            var item = json.listNetscalerControlCenter.netscalercontrolcenter ? json.listNetscalerControlCenter.netscalercontrolcenter[0] : null;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    var regionActionfilter = function(args) {
-        var allowedActions = [];
-        if (isAdmin()) {
-            allowedActions.push("edit");
-            allowedActions.push("remove");
-        }
-        return allowedActions;
-    }
-
-})(cloudStack);
diff --git a/ui/legacy/scripts/roles.js b/ui/legacy/scripts/roles.js
deleted file mode 100644
index ff89dc5..0000000
--- a/ui/legacy/scripts/roles.js
+++ /dev/null
@@ -1,407 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    var apiList = [];
-    var rolePermissions = [];
-    cloudStack.sections.roles = {
-        title: 'label.roles',
-        id: 'roles',
-        listView: {
-            id: 'roles',
-            fields: {
-                name: {
-                    label: 'label.name'
-                },
-                type: {
-                    label: 'label.type'
-                },
-                description: {
-                    label: 'label.description'
-                }
-            },
-            disableInfiniteScrolling: true,
-            dataProvider: function(args) {
-                var data = {};
-                if (args.filterBy.search && args.filterBy.search.value) {
-                    data['name'] = args.filterBy.search.value;
-                }
-                $.ajax({
-                    url: createURL("listRoles"),
-                    data: data,
-                    dataType: "json",
-                    async: true,
-                    success: function(json) {
-                        var jsonObj;
-                        jsonObj = json.listrolesresponse.role;
-                        args.response.success({
-                            data: jsonObj
-                        });
-                    }
-                });
-            },
-            actions: {
-                add: {
-                    label: 'label.add.role',
-                    preFilter: function(args) {
-                        if (isAdmin())
-                            return true;
-                    },
-                    messages: {
-                        notification: function() {
-                            return 'label.add.role';
-                        }
-                    },
-                    createForm: {
-                        title: 'label.add.role',
-                        fields: {
-                            name: {
-                                label: 'label.name',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            description: {
-                                label: 'label.description',
-                            },
-                            type: {
-                                label: 'label.type',
-                                validation: {
-                                    required: true
-                                },
-                                select: function(args) {
-                                    var items = [];
-                                    items.push({
-                                        id: "Admin",
-                                        description: "Admin"
-                                    });
-                                    items.push({
-                                        id: "DomainAdmin",
-                                        description: "Domain Admin"
-                                    });
-                                    items.push({
-                                        id: "User",
-                                        description: "User"
-                                    });
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            }
-                        }
-                    },
-                    action: function(args) {
-                        $.ajax({
-                            url: createURL('createRole'),
-                            data: args.data,
-                            success: function(json) {
-                                var item = json.createroleresponse.role;
-                                args.response.success({
-                                    data: item
-                                });
-                            },
-                            error: function(json) {
-                                args.response.error(parseXMLHttpResponse(json));
-                            }
-                        });
-                    },
-                    notification: {
-                        poll: function(args) {
-                            args.complete();
-                        }
-                    }
-                }
-            },
-            detailView: {
-                tabs: {
-                    details: {
-                        title: 'label.details',
-                        fields: {
-                            id: {
-                                label: 'label.id'
-                            },
-                            name: {
-                                label: 'label.name',
-                                isEditable: true,
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            type: {
-                                label: 'label.type'
-                            },
-                            description: {
-                                label: 'label.description',
-                                isEditable: true
-                            }
-                        },
-                        dataProvider: function(args) {
-                            $.ajax({
-                                url: createURL("listRoles&id=" + args.context.roles[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var response = json.listrolesresponse.role[0];
-                                    args.response.success({
-                                        data: response
-                                    });
-                                }
-                            });
-                        }
-                    },
-                    rules: {
-                        title: 'label.rules',
-                        custom: function(args) {
-                            var context = args.context;
-
-                            return $('<div>').multiEdit({
-                                context: context,
-                                noSelect: true,
-                                noHeaderActionsColumn: true,
-                                selectPermission: {
-                                    action: function(args){
-                                        $.ajax({
-                                            url: createURL("updateRolePermission"),
-                                            data: {
-                                                roleid: args.roleid,
-                                                ruleid: args.ruleid,
-                                                permission: args.permission
-                                            },
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                $(window).trigger('cloudStack.fullRefresh');
-                                            },
-                                            error: function(json) {
-                                                cloudStack.dialog.notice({
-                                                    message: 'message.role.update.fail'
-                                                });
-                                            }
-                                        });
-                                    }
-                                },
-                                reorder: {
-                                    moveDrag: {
-                                        action: function(args) {
-                                            var rule = args.context.multiRule[0];
-                                            var prevItemId = args.prevItem ? args.prevItem.id : 0;
-
-                                            var ruleOrder = [];
-                                            $.each(rolePermissions, function(idx, item) {
-                                                var itemId = item.id;
-                                                if (idx == 0 && prevItemId == 0) {
-                                                    ruleOrder.push(rule.id);
-                                                }
-                                                if (itemId == rule.id) {
-                                                    return true;
-                                                }
-                                                ruleOrder.push(item.id);
-                                                if (prevItemId == itemId) {
-                                                    ruleOrder.push(rule.id);
-                                                }
-                                            });
-
-                                            $.ajax({
-                                            	type: 'POST',
-                                                url: createURL('updateRolePermission'),
-                                                data: {
-                                                    roleid: rule.roleid,
-                                                    ruleorder: ruleOrder.join()
-                                                },
-                                                success: function(json) {
-                                                    args.response.success();
-                                                    $(window).trigger('cloudStack.fullRefresh');
-                                                },
-                                                error: function(json) {
-                                                    cloudStack.dialog.notice({
-                                                        message: 'message.role.ordering.fail'
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-                                },
-                                fields: {
-                                    'rule': {
-                                        edit: true,
-                                        label: 'label.rule',
-                                        isOptional: false
-                                    },
-                                    'permission': {
-                                        label: 'label.permission',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    name: 'allow',
-                                                    description: 'Allow'
-                                                }, {
-                                                    name: 'deny',
-                                                    description: 'Deny'
-                                                }]
-                                            });
-                                        }
-                                    },
-                                    'description': {
-                                        edit: true,
-                                        label: 'label.description',
-                                        isOptional: true
-                                    },
-                                    'always-hide': {
-                                        label: 'label.action',
-                                        addButton: true
-                                    }
-                                },
-                                add: {
-                                    label: 'label.add',
-                                    action: function(args) {
-                                        var data = {
-                                            rule: args.data.rule,
-                                            permission: args.data.permission,
-                                            description: args.data.description,
-                                            roleid: args.context.roles[0].id
-                                        };
-
-                                        $.ajax({
-                                            url: createURL('createRolePermission'),
-                                            data: data,
-                                            dataType: 'json',
-                                            success: function(json) {
-                                                var response = json.createrolepermissionresponse.rolepermission;
-                                                args.response.success({
-                                                    data: response
-                                                });
-                                            },
-                                            error: function(json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    }
-                                },
-                                actions: {
-                                    destroy: {
-                                        label: 'label.remove.rule',
-                                        action: function(args) {
-                                            $.ajax({
-                                                url: createURL('deleteRolePermission'),
-                                                data: {
-                                                    id: args.context.multiRule[0].id
-                                                },
-                                                dataType: 'json',
-                                                success: function(data) {
-                                                    args.response.success();
-                                                },
-                                                error: function(json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        }
-                                    }
-                                },
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listRolePermissions'),
-                                        data: {
-                                            roleid: args.context.roles[0].id
-                                        },
-                                        dataType: 'json',
-                                        success: function(json) {
-                                            var rules = json.listrolepermissionsresponse.rolepermission;
-                                            if (rules) {
-                                                rolePermissions = rules;
-                                            }
-                                            args.response.success({
-                                                data: rules
-                                            });
-                                        }
-                                    });
-                                    $.ajax({
-                                        url: createURL("listApis"),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var apis = [];
-                                            var response = json.listapisresponse.api;
-                                            $.each(response, function(idx, api) {
-                                                apis.push(api.name);
-                                            });
-                                            $($.find('input[name="rule"]')).autocomplete({
-                                                minLength: 0,
-                                                delay: 0,
-                                                source: apis.sort()
-                                            }).focus(function() {
-                                                $(this).data("uiAutocomplete").search($(this).val());
-                                            });
-                                        }
-                                    });
-                                }
-                            });
-                        }
-                    }
-                },
-                actions: {
-                    edit: {
-                        label: 'label.edit.role',
-                        action: function(args) {
-                            var data = {
-                                id: args.context.roles[0].id,
-                                name: args.data.name,
-                                description: args.data.description
-                            };
-
-                            $.ajax({
-                                url: createURL('updateRole'),
-                                data: data,
-                                success: function(json) {
-                                    args.response.success();
-                                },
-                                error: function(json) {
-                                    args.response.error(parseXMLHttpResponse(json));
-                                }
-                            });
-                        }
-                    },
-                    remove: {
-                        label: 'label.delete.role',
-                        messages: {
-                            confirm: function(args) {
-                                return 'label.delete.role';
-                            },
-                            notification: function(args) {
-                                return 'label.delete.role';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("deleteRole&id=" + args.context.roles[0].id),
-                                dataType: "json",
-                                success: function(json) {
-                                    var response = json.deleteroleresponse;
-                                    args.response.success({
-                                        data: response
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: function(args) {
-                                args.complete();
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/sharedFunctions.js b/ui/legacy/scripts/sharedFunctions.js
deleted file mode 100644
index 3ded990..0000000
--- a/ui/legacy/scripts/sharedFunctions.js
+++ /dev/null
@@ -1,3200 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-var g_sessionKey = null;
-var g_role = null; // roles - root, domain-admin, ro-admin, user
-var g_username = null;
-var g_userid = null;
-var g_account = null;
-var g_domainid = null;
-var g_hostid = null;
-var g_loginCmdText = null;
-var g_enableLogging = false;
-var g_timezoneoffset = null;
-var g_timezone = null;
-var g_supportELB = null;
-var g_kvmsnapshotenabled =  null;
-var g_regionsecondaryenabled = null;
-var g_userPublicTemplateEnabled = "true";
-var g_allowUserExpungeRecoverVm = "false";
-var g_allowUserExpungeRecoverVolume = "false";
-var g_cloudstackversion = null;
-var g_queryAsyncJobResultInterval = 3000;
-var g_idpList = null;
-var g_appendIdpDomain = false;
-var g_sortKeyIsAscending = false;
-var g_allowUserViewAllDomainAccounts = false;
-var g_routerHealthChecksEnabled = false;
-
-//keyboard keycode
-var keycode_Enter = 13;
-
-//XMLHttpResponse.status
-var ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED = 401;
-var ERROR_INTERNET_NAME_NOT_RESOLVED = 12007;
-var ERROR_INTERNET_CANNOT_CONNECT = 12029;
-var ERROR_VMOPS_ACCOUNT_ERROR = 531;
-
-//page size for API call (e.g."listXXXXXXX&pagesize=N" )
-var pageSize = 20;
-//var pageSize = 1; //for testing only
-
-function to_json_array(str) {
-    var simple_array = str.split(",");
-    var json_array = [];
-
-    $.each(simple_array, function(index, value) {
-        if ($.trim(value).length > 0) {
-            var obj = {
-                          id: value,
-                          name: value
-                      };
-
-            json_array.push(obj);
-        }
-    });
-
-    return json_array;
-}
-
-function _tag_equals(tag1, tag2) {
-    return (tag1.name == tag2.name) && (tag1.id == tag2.id);
-}
-
-function _tag_array_contains(tag, tags)
-{
-    for (var i = 0; i < tags.length; i++)
-    {
-        if (_tag_equals(tags[i], tag)) return true;
-    }
-
-    return false;
-}
-
-function unique_tags(tags)
-{
-    var unique = [];
-
-    if (tags != null)
-    {
-        for (var i = 0; i < tags.length; i++)
-        {
-            if (!_tag_array_contains(tags[i], unique))
-            {
-                unique.push(tags[i]);
-            }
-        }
-    }
-
-    return unique;
-}
-
-//async action
-var pollAsyncJobResult = function(args) {
-    $.ajax({
-        url: createURL("queryAsyncJobResult&jobId=" + args._custom.jobId),
-        dataType: "json",
-        async: false,
-        success: function(json) {
-            var result = json.queryasyncjobresultresponse;
-            if (result.jobstatus == 0) {
-                return; //Job has not completed
-            } else {
-                if (result.jobstatus == 1) { // Succeeded
-                    if (args._custom.getUpdatedItem != null && args._custom.getActionFilter != null) {
-                        args.complete({
-                            data: args._custom.getUpdatedItem(json),
-                            actionFilter: args._custom.getActionFilter()
-                        });
-                    } else if (args._custom.getUpdatedItem != null && args._custom.getActionFilter == null) {
-                        args.complete({
-                            data: args._custom.getUpdatedItem(json)
-                        });
-                    } else {
-                        args.complete({
-                            data: json.queryasyncjobresultresponse.jobresult
-                        });
-                    }
-
-                    if (args._custom.fullRefreshAfterComplete == true) {
-                        setTimeout(function() {
-                            $(window).trigger('cloudStack.fullRefresh');
-                        }, 500);
-                    }
-
-                    if (args._custom.onComplete) {
-                        args._custom.onComplete(json, args._custom);
-                    }
-                } else if (result.jobstatus == 2) { // Failed
-                    var msg = (result.jobresult.errortext == null) ? "" : result.jobresult.errortext;
-                    if (args._custom.getUpdatedItemWhenAsyncJobFails != null && args._custom.getActionFilter != null) {
-                        args.error({
-                            message: msg,
-                            updatedData: args._custom.getUpdatedItemWhenAsyncJobFails(),
-                            actionFilter: args._custom.getActionFilter()
-                        });
-                    } else if (args._custom.getUpdatedItemWhenAsyncJobFails != null && args._custom.getActionFilter == null) {
-                        args.error({
-                            message: msg,
-                            updatedData: args._custom.getUpdatedItemWhenAsyncJobFails()
-                        });
-                    } else {
-                        args.error({
-                            message: msg
-                        });
-                    }
-                }
-            }
-        },
-        error: function(XMLHttpResponse) {
-            args.error({
-                message: parseXMLHttpResponse(XMLHttpResponse)
-            });
-        }
-    });
-}
-
-//API calls
-
-    function createURL(apiName, options) {
-        if (!options) options = {};
-        var urlString = clientApiUrl + "?" + "command=" + apiName + "&response=json";
-        if (g_sessionKey) {
-            urlString += "&sessionkey=" + g_sessionKey;
-        }
-
-        if (cloudStack.context && cloudStack.context.projects && !options.ignoreProject) {
-            urlString = urlString + '&projectid=' + cloudStack.context.projects[0].id;
-        }
-
-        return urlString;
-    }
-
-
-//LB provider map
-var lbProviderMap = {
-    "publicLb": {
-        "non-vpc": ["VirtualRouter", "Netscaler", "F5"],
-        "vpc": ["VpcVirtualRouter", "Netscaler"]
-    },
-    "internalLb": {
-        "non-vpc": [],
-        "vpc": ["InternalLbVm"]
-    }
-};
-
-//Add Guest Network in Advanced zone (for root-admin only)
-var addGuestNetworkDialog = {
-    zoneObjs: [],
-    physicalNetworkObjs: [],
-    networkOfferingObjs: [],
-    def: {
-        label: 'label.add.guest.network',
-
-        messages: {
-            notification: function(args) {
-                return 'label.add.guest.network';
-            }
-        },
-
-        preFilter: function(args) {
-            if (isAdmin())
-                return true;
-            else
-                return false;
-        },
-
-        createForm: {
-            title: 'label.add.guest.network', //Add Shared Network in advanced zone
-
-            preFilter: function(args) {
-                if ('zones' in args.context) { //Infrastructure menu > zone detail > guest traffic type > network tab (only shown in advanced zone) > add guest network dialog
-                    args.$form.find('.form-item[rel=zoneId]').hide();
-                    args.$form.find('.form-item[rel=physicalNetworkId]').hide();
-                } else { //Network menu > guest network section > add guest network dialog
-                    args.$form.find('.form-item[rel=zoneId]').css('display', 'inline-block');
-                    args.$form.find('.form-item[rel=physicalNetworkId]').css('display', 'inline-block');
-                }
-            },
-
-            fields: {
-                name: {
-                    docID: 'helpGuestNetworkZoneName',
-                    label: 'label.name',
-                    validation: {
-                        required: true
-                    }
-                },
-                description: {
-                    label: 'label.description',
-                    docID: 'helpGuestNetworkZoneDescription',
-                    validation: {
-                        required: true
-                    }
-                },
-
-                zoneId: {
-                    label: 'label.zone',
-                    validation: {
-                        required: true
-                    },
-                    docID: 'helpGuestNetworkZone',
-                    select: function(args) {
-                        if ('zones' in args.context) { //Infrastructure menu > zone detail > guest traffic type > network tab (only shown in advanced zone) > add guest network dialog
-                            addGuestNetworkDialog.zoneObjs = args.context.zones; //i.e. only one zone entry
-                        } else { //Network menu > guest network section > add guest network dialog
-                            $.ajax({
-                                url: createURL('listZones'),
-                                async: false,
-                                success: function(json) {
-                                    addGuestNetworkDialog.zoneObjs = []; //reset
-                                    var items = json.listzonesresponse.zone;
-                                    if (items != null) {
-                                        for (var i = 0; i < items.length; i++) {
-                                            if (items[i].networktype == 'Advanced') {
-                                                addGuestNetworkDialog.zoneObjs.push(items[i]);
-                                            }
-                                        }
-                                    }
-                                }
-                            });
-                        }
-                        args.response.success({
-                            data: $.map(addGuestNetworkDialog.zoneObjs, function(zone) {
-                                return {
-                                    id: zone.id,
-                                    description: zone.name
-                                };
-                            })
-                        });
-                    },
-                    isHidden: true
-                },
-
-                physicalNetworkId: {
-                    label: 'label.physical.network',
-                    dependsOn: 'zoneId',
-                    select: function(args) {
-                        if ('physicalNetworks' in args.context) { //Infrastructure menu > zone detail > guest traffic type > network tab (only shown in advanced zone) > add guest network dialog
-                            addGuestNetworkDialog.physicalNetworkObjs = args.context.physicalNetworks;
-                        } else { //Network menu > guest network section > add guest network dialog
-                            var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
-                            if (selectedZoneId != undefined && selectedZoneId.length > 0) {
-                                $.ajax({
-                                    url: createURL('listPhysicalNetworks'),
-                                    data: {
-                                        zoneid: selectedZoneId
-                                    },
-                                    async: false,
-                                    success: function(json) {
-                                        var items = [];
-                                        var physicalnetworks = json.listphysicalnetworksresponse.physicalnetwork;
-                                        if (physicalnetworks != null) {
-                                            for (var i = 0; i < physicalnetworks.length; i++) {
-                                                $.ajax({
-                                                    url: createURL('listTrafficTypes'),
-                                                    data: {
-                                                        physicalnetworkid: physicalnetworks[i].id
-                                                    },
-                                                    async: false,
-                                                    success: function(json) {
-                                                        var traffictypes = json.listtraffictypesresponse.traffictype;
-                                                        if (traffictypes != null) {
-                                                            for (var k = 0; k < traffictypes.length; k++) {
-                                                                if (traffictypes[k].traffictype == 'Guest') {
-                                                                    items.push(physicalnetworks[i]);
-                                                                    break;
-                                                                }
-                                                            }
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        }
-
-                                        addGuestNetworkDialog.physicalNetworkObjs = items;
-                                    }
-                                });
-                            }
-                        }
-                        var items = [];
-                        if (addGuestNetworkDialog.physicalNetworkObjs != null) {
-                            for (var i = 0; i < addGuestNetworkDialog.physicalNetworkObjs.length; i++) {
-                                items.push({
-                                    id: addGuestNetworkDialog.physicalNetworkObjs[i].id,
-                                    description: addGuestNetworkDialog.physicalNetworkObjs[i].name
-                                });
-                            }
-                        }
-                        args.response.success({
-                            data: items
-                        });
-                    },
-                    isHidden: true
-                },
-
-                vlanId: {
-                    label: 'label.vlan.id',
-                    docID: 'helpGuestNetworkZoneVLANID'
-                },
-                bypassVlanOverlapCheck: {
-                    label: 'label.bypass.vlan.overlap.check',
-                    isBoolean: true
-                },
-                isolatedpvlanId: {
-                    label: 'label.secondary.isolated.vlan.id'
-                },
-                pvlanType: {
-                    label: 'label.secondary.isolated.vlan.type',
-                    isHidden: true,
-                    select: function (args) {
-                        var type = [{
-                            id: 'none',
-                            description: _l('label.secondary.isolated.vlan.type.none')
-                        }, {
-                            id: 'community',
-                            description: _l('label.secondary.isolated.vlan.type.community')
-                        }, {
-                            id: 'isolated',
-                            description: _l('label.secondary.isolated.vlan.type.isolated')
-                        }, {
-                            id: 'promiscuous',
-                            description: _l('label.secondary.isolated.vlan.type.promiscuous')
-                        }
-                        ];
-
-                        args.response.success({
-                            data: type
-                        });
-
-                        args.$select.change(function () {
-                            var $form = $(this).closest('form');
-                            var pvlanType = $(this).val();
-
-                            if (pvlanType === 'none' || pvlanType === 'promiscuous') {
-                                $form.find('.form-item[rel=isolatedpvlanId]').hide();
-                            } else if (pvlanType === 'isolated' || pvlanType === 'community') {
-                                $form.find('.form-item[rel=isolatedpvlanId]').css('display', 'inline-block');
-                            }
-                        })
-                    }
-                },
-
-                scope: {
-                    label: 'label.scope',
-                    docID: 'helpGuestNetworkZoneScope',
-                    select: function(args) {
-                        var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
-                        var selectedZoneObj = {};
-                        if (addGuestNetworkDialog.zoneObjs != null && selectedZoneId != "") {
-                            for (var i = 0; i < addGuestNetworkDialog.zoneObjs.length; i++) {
-                                if (addGuestNetworkDialog.zoneObjs[i].id == selectedZoneId) {
-                                    selectedZoneObj = addGuestNetworkDialog.zoneObjs[i];
-                                    break;
-                                }
-                            }
-                        }
-
-                        var array1 = [];
-                        if (selectedZoneObj.networktype == "Advanced" && selectedZoneObj.securitygroupsenabled == true) {
-                            array1.push({
-                                id: 'zone-wide',
-                                description: 'ui.listView.filters.all'
-                            });
-                        } else {
-                            array1.push({
-                                id: 'zone-wide',
-                                description: 'ui.listView.filters.all'
-                            });
-                            array1.push({
-                                id: 'domain-specific',
-                                description: 'label.domain'
-                            });
-                            array1.push({
-                                id: 'account-specific',
-                                description: 'label.account'
-                            });
-                            array1.push({
-                                id: 'project-specific',
-                                description: 'label.project'
-                            });
-                        }
-                        args.response.success({
-                            data: array1
-                        });
-
-                        args.$select.change(function() {
-                            var $form = $(this).closest('form');
-                            if ($(this).val() == "zone-wide") {
-                                $form.find('.form-item[rel=domainId]').hide();
-                                $form.find('.form-item[rel=subdomainaccess]').hide();
-                                $form.find('.form-item[rel=account]').hide();
-                                $form.find('.form-item[rel=projectId]').hide();
-                            } else if ($(this).val() == "domain-specific") {
-                                $form.find('.form-item[rel=domainId]').css('display', 'inline-block');
-                                $form.find('.form-item[rel=subdomainaccess]').css('display', 'inline-block');
-                                $form.find('.form-item[rel=account]').hide();
-                                $form.find('.form-item[rel=projectId]').hide();
-                            } else if ($(this).val() == "account-specific") {
-                                $form.find('.form-item[rel=domainId]').css('display', 'inline-block');
-                                $form.find('.form-item[rel=subdomainaccess]').hide();
-                                $form.find('.form-item[rel=account]').css('display', 'inline-block');
-                                $form.find('.form-item[rel=projectId]').hide();
-                            } else if ($(this).val() == "project-specific") {
-                                $form.find('.form-item[rel=domainId]').css('display', 'inline-block');
-                                $form.find('.form-item[rel=subdomainaccess]').hide();
-                                $form.find('.form-item[rel=account]').hide();
-                                $form.find('.form-item[rel=projectId]').css('display', 'inline-block');
-                            }
-                        });
-                    }
-                },
-                domainId: {
-                    label: 'label.domain',
-                    validation: {
-                        required: true
-                    },
-                    select: function(args) {
-                        var items = [];
-                        var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
-                        var selectedZoneObj = {};
-                        if (addGuestNetworkDialog.zoneObjs != null && selectedZoneId != "") {
-                            for (var i = 0; i < addGuestNetworkDialog.zoneObjs.length; i++) {
-                                if (addGuestNetworkDialog.zoneObjs[i].id == selectedZoneId) {
-                                    selectedZoneObj = addGuestNetworkDialog.zoneObjs[i];
-                                    break;
-                                }
-                            }
-                        }
-                        if (selectedZoneObj.domainid != null) { //list only domains under selectedZoneObj.domainid
-                            $.ajax({
-                                url: createURL("listDomainChildren&id=" + selectedZoneObj.domainid + "&isrecursive=true"),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var domainObjs = json.listdomainchildrenresponse.domain;
-                                    $(domainObjs).each(function() {
-                                        items.push({
-                                            id: this.id,
-                                            description: this.path
-                                        });
-                                    });
-                                }
-                            });
-                            $.ajax({
-                                url: createURL("listDomains&id=" + selectedZoneObj.domainid),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var domainObjs = json.listdomainsresponse.domain;
-                                    $(domainObjs).each(function() {
-                                        items.push({
-                                            id: this.id,
-                                            description: this.path
-                                        });
-                                    });
-                                }
-                            });
-                        } else { //list all domains
-                            $.ajax({
-                                url: createURL("listDomains&listAll=true"),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var domainObjs = json.listdomainsresponse.domain;
-                                    $(domainObjs).each(function() {
-                                        items.push({
-                                            id: this.id,
-                                            description: this.path
-                                        });
-                                    });
-                                }
-                            });
-                        }
-                        items.sort(function(a, b) {
-                            return a.description.localeCompare(b.description);
-                        });
-                        args.response.success({
-                            data: items
-                        });
-                    }
-                },
-                subdomainaccess: {
-                    label: 'label.subdomain.access',
-                    isBoolean: true,
-                    isHidden: true
-                },
-                account: {
-                    label: 'label.account'
-                },
-
-                projectId: {
-                    label: 'label.project',
-                    validation: {
-                        required: true
-                    },
-                    select: function(args) {
-                        var items = [];
-                        $.ajax({
-                            url: createURL("listProjects&listAll=true&details=min"),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                projectObjs = json.listprojectsresponse.project;
-                                $(projectObjs).each(function() {
-                                    items.push({
-                                        id: this.id,
-                                        description: this.name
-                                    });
-                                });
-                            }
-                        });
-                        args.response.success({
-                            data: items
-                        });
-                    }
-                },
-
-                networkOfferingId: {
-                    label: 'label.network.offering',
-                    docID: 'helpGuestNetworkZoneNetworkOffering',
-                    dependsOn: ['zoneId', 'physicalNetworkId', 'scope', 'domainId'],
-                    select: function(args) {
-                        if(args.$form.find('.form-item[rel=zoneId]').find('select').val() == null || args.$form.find('.form-item[rel=zoneId]').find('select').val().length == 0) {
-                            args.response.success({
-                                data: null
-                            });
-                            return;
-                        }
-
-                        var data = {
-                            state: 'Enabled',
-                            zoneid: args.$form.find('.form-item[rel=zoneId]').find('select').val()
-                        };
-
-                        var selectedPhysicalNetworkObj = [];
-                        var selectedPhysicalNetworkId = args.$form.find('.form-item[rel=physicalNetworkId]').find('select').val();
-                        if (addGuestNetworkDialog.physicalNetworkObjs != null) {
-                            for (var i = 0; i < addGuestNetworkDialog.physicalNetworkObjs.length; i++) {
-                                if (addGuestNetworkDialog.physicalNetworkObjs[i].id == selectedPhysicalNetworkId) {
-                                    selectedPhysicalNetworkObj = addGuestNetworkDialog.physicalNetworkObjs[i];
-                                    break;
-                                }
-                            }
-                        }
-                        if (selectedPhysicalNetworkObj.tags != null && selectedPhysicalNetworkObj.tags.length > 0) {
-                            $.extend(data, {
-                                tags: selectedPhysicalNetworkObj.tags
-                            });
-                        }
-
-                        //Network tab in Guest Traffic Type in Infrastructure menu is only available when it's under Advanced zone.
-                        //zone dropdown in add guest network dialog includes only Advanced zones.
-                        if (args.scope == "zone-wide" || args.scope == "domain-specific") {
-                            $.extend(data, {
-                                guestiptype: 'Shared'
-                            });
-                            if (args.scope == "domain-specific") {
-                                $.extend(data, {
-                                    domainid: args.domainId
-                                });
-                            }
-                        }
-
-                        var items = [];
-                        $.ajax({
-                            url: createURL('listNetworkOfferings'),
-                            data: data,
-                            async: false,
-                            success: function(json) {
-                                addGuestNetworkDialog.networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                                if (addGuestNetworkDialog.networkOfferingObjs != null && addGuestNetworkDialog.networkOfferingObjs.length > 0) {
-                                    var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
-                                    var selectedZoneObj = {};
-                                    if (addGuestNetworkDialog.zoneObjs != null && selectedZoneId != "") {
-                                        for (var i = 0; i < addGuestNetworkDialog.zoneObjs.length; i++) {
-                                            if (addGuestNetworkDialog.zoneObjs[i].id == selectedZoneId) {
-                                                selectedZoneObj = addGuestNetworkDialog.zoneObjs[i];
-                                                break;
-                                            }
-                                        }
-                                    }
-                                    for (var i = 0; i < addGuestNetworkDialog.networkOfferingObjs.length; i++) {
-                                        //for zone-wide network in Advanced SG-enabled zone, list only SG network offerings
-                                        if (selectedZoneObj.networktype == 'Advanced' && selectedZoneObj.securitygroupsenabled == true) {
-                                            if (args.scope == "zone-wide") {
-                                                var includingSecurityGroup = false;
-                                                var serviceObjArray = addGuestNetworkDialog.networkOfferingObjs[i].service;
-                                                for (var k = 0; k < serviceObjArray.length; k++) {
-                                                    if (serviceObjArray[k].name == "SecurityGroup") {
-                                                        includingSecurityGroup = true;
-                                                        break;
-                                                    }
-                                                }
-                                                if (includingSecurityGroup == false)
-                                                    continue; //skip to next network offering
-                                            }
-                                        }
-                                        items.push({
-                                            id: addGuestNetworkDialog.networkOfferingObjs[i].id,
-                                            description: addGuestNetworkDialog.networkOfferingObjs[i].displaytext
-                                        });
-                                    }
-                                }
-                            }
-                        });
-                        args.response.success({
-                            data: items
-                        });
-
-                        args.$select.change(function() {
-                            var $form = $(this).closest("form");
-                            var selectedNetworkOfferingId = $(this).val();
-                            $(addGuestNetworkDialog.networkOfferingObjs).each(function() {
-                                if (this.id == selectedNetworkOfferingId) {
-                                    if (this.specifyvlan == false) {
-                                        $form.find('.form-item[rel=vlanId]').hide();
-                                        cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=vlanId]')); //make vlanId optional
-
-                                        $form.find('.form-item[rel=pvlanType]').hide();
-                                    } else {
-                                        $form.find('.form-item[rel=vlanId]').css('display', 'inline-block');
-                                        cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=vlanId]')); //make vlanId required
-
-                                        $form.find('.form-item[rel=pvlanType]').css('display', 'inline-block');
-                                    }
-                                    return false; //break each loop
-                                }
-                            });
-                        });
-                    }
-                },
-
-                //IPv4 (begin)
-                ip4gateway: {
-                    label: 'label.ipv4.gateway',
-                    docID: 'helpGuestNetworkZoneGateway',
-                    validation: {
-                        ipv4: true
-                    }
-                },
-                ip4Netmask: {
-                    label: 'label.ipv4.netmask',
-                    docID: 'helpGuestNetworkZoneNetmask',
-                    validation: {
-                        netmask: true
-                    }
-                },
-                startipv4: {
-                    label: 'label.ipv4.start.ip',
-                    docID: 'helpGuestNetworkZoneStartIP',
-                    validation: {
-                        ipv4: true
-                    }
-                },
-                endipv4: {
-                    label: 'label.ipv4.end.ip',
-                    docID: 'helpGuestNetworkZoneEndIP',
-                    validation: {
-                        ipv4: true
-                    }
-                },
-                //IPv4 (end)
-
-                //IPv6 (begin)
-                ip6gateway: {
-                    label: 'label.ipv6.gateway',
-                    docID: 'helpGuestNetworkZoneGateway',
-                    validation: {
-                    	ipv6CustomJqueryValidator: true
-                    }
-                },
-                ip6cidr: {
-                    label: 'label.ipv6.CIDR',
-                    validation: {
-                        ipv6cidr: true
-                    }
-                },
-                startipv6: {
-                    label: 'label.ipv6.start.ip',
-                    docID: 'helpGuestNetworkZoneStartIP',
-                    validation: {
-                    	ipv6CustomJqueryValidator: true
-                    }
-                },
-                endipv6: {
-                    label: 'label.ipv6.end.ip',
-                    docID: 'helpGuestNetworkZoneEndIP',
-                    validation: {
-                    	ipv6CustomJqueryValidator: true
-                    }
-               },
-                //IPv6 (end)
-
-                networkdomain: {
-                    label: 'label.network.domain',
-                    docID: 'helpGuestNetworkZoneNetworkDomain'
-                },
-
-                hideipaddressusage: {
-                    label: 'label.network.hideipaddressusage',
-                    dependsOn: ['zoneId', 'physicalNetworkId', 'scope'],
-                    isBoolean: true,
-                    isChecked: false,
-                    docID: 'helpGuestNetworkHideIpAddressUsage'
-                }
-
-            }
-        },
-
-        action: function(args) { //Add guest network in advanced zone
-            if (
-                ((args.data.ip4gateway.length == 0) && (args.data.ip4Netmask.length == 0) && (args.data.startipv4.length == 0) && (args.data.endipv4.length == 0)) &&
-                ((args.data.ip6gateway.length == 0) && (args.data.ip6cidr.length == 0) && (args.data.startipv6.length == 0) && (args.data.endipv6.length == 0))
-            ) {
-                args.response.error("Either IPv4 fields or IPv6 fields need to be filled when adding a guest network");
-                return;
-            }
-
-            var $form = args.$form;
-
-            var array1 = [];
-            array1.push("&zoneId=" + args.data.zoneId);
-            array1.push("&networkOfferingId=" + args.data.networkOfferingId);
-
-            //Pass physical network ID to createNetwork API only when network offering's guestiptype is Shared.
-            var selectedNetworkOfferingObj;
-            if (addGuestNetworkDialog.networkOfferingObjs != null) {
-                for (var i = 0; i < addGuestNetworkDialog.networkOfferingObjs.length; i++) {
-                    if (addGuestNetworkDialog.networkOfferingObjs[i].id == args.data.networkOfferingId) {
-                        selectedNetworkOfferingObj = addGuestNetworkDialog.networkOfferingObjs[i]
-                        break;
-                    }
-                }
-            }
-
-            if (selectedNetworkOfferingObj.guestiptype == "Shared")
-                array1.push("&physicalnetworkid=" + args.data.physicalNetworkId);
-            
-            cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array1, "name", args.data.name);
-            cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array1, "displayText", args.data.description);
-
-            if ($form.find('.form-item[rel=vlanId]').css("display") != "none"){
-                cloudStack.addVlanToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.vlanId)
-            }
-            if ($form.find('.form-item[rel=bypassVlanOverlapCheck]').css("display") != "none"){
-                array1.push("&bypassVlanOverlapCheck=" + encodeURIComponent((args.data.bypassVlanOverlapCheck == "on")));
-            }
-            if (($form.find('.form-item[rel=isolatedpvlanId]').css("display") != "none") && (args.data.isolatedpvlanId != null && args.data.isolatedpvlanId.length > 0)){
-                array1.push("&isolatedpvlan=" + encodeURIComponent(args.data.isolatedpvlanId));
-            }
-            if ($form.find('.form-item[rel=domainId]').css("display") != "none") {
-                array1.push("&domainId=" + args.data.domainId);
-
-                if ($form.find('.form-item[rel=account]').css("display") != "none") { //account-specific
-                    array1.push("&account=" + args.data.account);
-                    array1.push("&acltype=account");
-                } else if ($form.find('.form-item[rel=projectId]').css("display") != "none") { //project-specific
-                    array1.push("&projectid=" + args.data.projectId);
-                    array1.push("&acltype=account");
-                } else { //domain-specific
-                    array1.push("&acltype=domain");
-
-                    if ($form.find('.form-item[rel=subdomainaccess]:visible input:checked').length)
-                        array1.push("&subdomainaccess=true");
-                    else
-                        array1.push("&subdomainaccess=false");
-                }
-            } else { //zone-wide
-                array1.push("&acltype=domain"); //server-side will make it Root domain (i.e. domainid=1)
-            }
-
-            //IPv4 (begin)
-            if (args.data.ip4gateway != null && args.data.ip4gateway.length > 0)
-                array1.push("&gateway=" + args.data.ip4gateway);
-            if (args.data.ip4Netmask != null && args.data.ip4Netmask.length > 0)
-                array1.push("&netmask=" + args.data.ip4Netmask);
-            if (($form.find('.form-item[rel=startipv4]').css("display") != "none") && (args.data.startipv4 != null && args.data.startipv4.length > 0))
-                array1.push("&startip=" + args.data.startipv4);
-            if (($form.find('.form-item[rel=endipv4]').css("display") != "none") && (args.data.endipv4 != null && args.data.endipv4.length > 0))
-                array1.push("&endip=" + args.data.endipv4);
-            //IPv4 (end)
-
-            //IPv6 (begin)
-            if (args.data.ip6gateway != null && args.data.ip6gateway.length > 0)
-                array1.push("&ip6gateway=" + args.data.ip6gateway);
-            if (args.data.ip6cidr != null && args.data.ip6cidr.length > 0)
-                array1.push("&ip6cidr=" + args.data.ip6cidr);
-            if (($form.find('.form-item[rel=startipv6]').css("display") != "none") && (args.data.startipv6 != null && args.data.startipv6.length > 0))
-                array1.push("&startipv6=" + args.data.startipv6);
-            if (($form.find('.form-item[rel=endipv6]').css("display") != "none") && (args.data.endipv6 != null && args.data.endipv6.length > 0))
-                array1.push("&endipv6=" + args.data.endipv6);
-            //IPv6 (end)
-
-            if (args.data.networkdomain != null && args.data.networkdomain.length > 0){
-                array1.push("&networkdomain=" + encodeURIComponent(args.data.networkdomain));
-            }
-            if (args.data.hideipaddressusage != null && args.data.hideipaddressusage) {
-                array1.push("&hideipaddressusage=true")
-            }
-            if (args.$form.find('.form-item[rel=pvlanType]').css('display') != 'none' && args.data.pvlanType != 'none') {
-                array1.push("&isolatedpvlantype=" + args.data.pvlanType);
-            }
-
-            $.ajax({
-                url: createURL("createNetwork" + array1.join("")),
-                dataType: "json",
-                success: function(json) {
-                    var item = json.createnetworkresponse.network;
-                    args.response.success({
-                        data: item
-                    });
-                },
-                error: function(XMLHttpResponse) {
-                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                    args.response.error(errorMsg);
-                }
-            });
-        },
-        notification: {
-            poll: function(args) {
-                args.complete();
-            }
-        }
-    }
-}
-
-var addL2GuestNetwork = {
-    zoneObjs: [],
-    physicalNetworkObjs: [],
-    networkOfferingObjs: [],
-    def: {
-        label: 'label.add.l2.guest.network',
-
-        messages: {
-            notification: function(args) {
-                return 'label.add.l2.guest.network';
-            }
-        },
-
-        createForm: {
-            title: 'label.add.l2.guest.network',
-            fields: {
-                name: {
-                    label: 'label.name',
-                    validation: {
-                        required: true
-                    },
-                    docID: 'helpGuestNetworkName'
-                },
-                displayText: {
-                    label: 'label.display.text',
-                    validation: {
-                        required: true
-                    },
-                    docID: 'helpGuestNetworkDisplayText'
-                },
-                zoneId: {
-                    label: 'label.zone',
-                    validation: {
-                        required: true
-                    },
-                    docID: 'helpGuestNetworkZone',
-
-                    select: function(args) {
-                        $.ajax({
-                            url: createURL('listZones'),
-                            success: function(json) {
-                                var zones = $.grep(json.listzonesresponse.zone, function(zone) {
-                                    return (zone.networktype == 'Advanced'); //Isolated networks can only be created in Advanced SG-disabled zone (but not in Basic zone nor Advanced SG-enabled zone)
-                                });
-
-                                args.response.success({
-                                    data: $.map(zones, function(zone) {
-                                        return {
-                                            id: zone.id,
-                                            description: zone.name
-                                        };
-                                    })
-                                });
-                            }
-                        });
-                    }
-                },
-                domain: {
-                    label: 'label.domain',
-                    isHidden: function(args) {
-                        if (isAdmin() || isDomainAdmin())
-                            return false;
-                        else
-                            return true;
-                    },
-                    select: function(args) {
-                        if (isAdmin() || isDomainAdmin()) {
-                            $.ajax({
-                                url: createURL("listDomains&listAll=true"),
-                                success: function(json) {
-                                    var items = [];
-                                    items.push({
-                                        id: "",
-                                        description: ""
-                                    });
-                                    var domainObjs = json.listdomainsresponse.domain;
-                                    $(domainObjs).each(function() {
-                                        items.push({
-                                            id: this.id,
-                                            description: this.path
-                                        });
-                                    });
-                                    items.sort(function(a, b) {
-                                        return a.description.localeCompare(b.description);
-                                    });
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            });
-                            args.$select.change(function() {
-                                var $form = $(this).closest('form');
-                                if ($(this).val() == "") {
-                                    $form.find('.form-item[rel=account]').hide();
-                                } else {
-                                    $form.find('.form-item[rel=account]').css('display', 'inline-block');
-                                }
-                            });
-                        } else {
-                            args.response.success({
-                                data: null
-                            });
-                        }
-                    }
-                },
-                networkOfferingId: {
-                    label: 'label.network.offering',
-                    validation: {
-                        required: true
-                    },
-                    dependsOn: (isAdmin() || isDomainAdmin()) ? ['zoneId', 'domain'] : 'zoneId', // domain is visible only for admins
-                    docID: 'helpGuestNetworkNetworkOffering',
-                    select: function(args) {
-                        var data = {
-                            zoneid: args.zoneId,
-                            guestiptype: 'L2',
-                            state: 'Enabled'
-                        };
-
-                        if ((isAdmin() || isDomainAdmin())) { // domain is visible only for admins
-                            $.extend(data, {
-                                domainid: args.domain
-                            });
-                        }
-
-                        if ('vpc' in args.context) { //from VPC section
-                            $.extend(data, {
-                                forVpc: true
-                            });
-                        }
-                        else { //from guest network section
-                            var vpcs;
-                            $.ajax({
-                                url: createURL('listVPCs'),
-                                data: {
-                                    listAll: true
-                                },
-                                async: false,
-                                success: function(json) {
-                                    vpcs = json.listvpcsresponse.vpc;
-                                }
-                            });
-                            if (vpcs == null || vpcs.length == 0) { //if there is no VPC in the system
-                                $.extend(data, {
-                                    forVpc: false
-                                });
-                            }
-                        }
-
-                        if(!isAdmin()) { //normal user is not aware of the VLANs in the system, so normal user is not allowed to create network with network offerings whose specifyvlan = true
-                            $.extend(data, {
-                                specifyvlan: false
-                            });
-                        }
-
-                        $.ajax({
-                            url: createURL('listNetworkOfferings'),
-                            data: data,
-                            success: function(json) {
-                                if(!json.listnetworkofferingsresponse || !json.listnetworkofferingsresponse.networkoffering){
-                                    return;
-                                }
-                                var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                                args.$select.change(function() {
-                                    var $vlan = args.$select.closest('form').find('[rel=vlan]');
-                                    var $bypassVlanOverlapCheck = args.$select.closest('form').find('[rel=bypassVlanOverlapCheck]');
-                                    var $pvlanType = args.$select.closest('form').find('[rel=pvlanType]');
-                                    var networkOffering = $.grep(
-                                        networkOfferingObjs, function(netoffer) {
-                                            return netoffer.id == args.$select.val();
-                                        }
-                                    )[0];
-
-                                    if (networkOffering.specifyvlan) {
-                                        $vlan.css('display', 'inline-block');
-                                        $bypassVlanOverlapCheck.css('display', 'inline-block');
-                                        $pvlanType.css('display', 'inline-block');
-                                    } else {
-                                        $vlan.hide();
-                                        $bypassVlanOverlapCheck.hide();
-                                        $pvlanType.hide();
-                                    }
-                                });
-
-                                args.response.success({
-                                    data: $.map(networkOfferingObjs, function(zone) {
-                                        return {
-                                            id: zone.id,
-                                            description: zone.name
-                                        };
-                                    })
-                                });
-                            }
-                        });
-                    }
-                },
-
-                vlan: {
-                    label: 'label.vlan',
-                    validation: {
-                        required: true
-                    },
-                    isHidden: true
-                },
-                bypassVlanOverlapCheck: {
-                    label: 'label.bypass.vlan.overlap.check',
-                    isBoolean: true,
-                    isHidden: true
-                },
-                pvlanId: {
-                    label: 'label.secondary.isolated.vlan.id',
-                    isHidden: true
-                },
-                pvlanType: {
-                    label: 'label.secondary.isolated.vlan.type',
-                    isHidden: true,
-                    select: function (args) {
-                        var type = [{
-                                id: 'none',
-                                description: _l('label.secondary.isolated.vlan.type.none')
-                            }, {
-                                id: 'community',
-                                description: _l('label.secondary.isolated.vlan.type.community')
-                            }, {
-                                id: 'isolated',
-                                description: _l('label.secondary.isolated.vlan.type.isolated')
-                            }, {
-                                id: 'promiscuous',
-                                description: _l('label.secondary.isolated.vlan.type.promiscuous')
-                            }
-                        ];
-
-                        args.response.success({
-                            data: type
-                        });
-
-                        args.$select.change(function () {
-                            var $form = $(this).closest('form');
-                            var pvlanType = $(this).val();
-
-                            if (pvlanType === 'none' || pvlanType === 'promiscuous') {
-                                $form.find('.form-item[rel=pvlanId]').hide();
-                            } else if (pvlanType === 'isolated' || pvlanType === 'community') {
-                                $form.find('.form-item[rel=pvlanId]').css('display', 'inline-block');
-                            }
-                        })
-                    }
-                },
-                account: {
-                    label: 'label.account',
-                    validation: {
-                        required: true
-                    },
-                    isHidden: function(args) {
-                        if (isAdmin() || isDomainAdmin())
-                            return false;
-                        else
-                            return true;
-                    }
-                }
-            }
-        },
-
-        action: function(args) {
-            var dataObj = {
-                zoneId: args.data.zoneId,
-                name: args.data.name,
-                displayText: args.data.displayText,
-                networkOfferingId: args.data.networkOfferingId
-            };
-
-            if (args.$form.find('.form-item[rel=vlan]').css('display') != 'none') {
-                $.extend(dataObj, {
-                    vlan: args.data.vlan,
-                    bypassVlanOverlapCheck: (args.data.bypassVlanOverlapCheck == "on")
-                });
-            }
-
-            if (args.$form.find('.form-item[rel=pvlanId]').css('display') != 'none') {
-                $.extend(dataObj, {
-                    isolatedpvlan: args.data.pvlanId
-                });
-            }
-
-            if (args.$form.find('.form-item[rel=pvlanType]').css('display') != 'none' && args.data.pvlanType != 'none') {
-                $.extend(dataObj, {
-                    isolatedpvlantype: args.data.pvlanType
-                });
-            }
-
-            if (args.data.domain != null && args.data.domain.length > 0) {
-                $.extend(dataObj, {
-                    domainid: args.data.domain
-                });
-                if (args.data.account != null && args.data.account.length > 0) {
-                    $.extend(dataObj, {
-                        account: args.data.account
-                    });
-                }
-            }
-
-            $.ajax({
-                url: createURL('createNetwork'),
-                data: dataObj,
-                success: function(json) {
-                    args.response.success({
-                        data: json.createnetworkresponse.network
-                    });
-                },
-                error: function(json) {
-                    args.response.error(parseXMLHttpResponse(json));
-                }
-            });
-        },
-        notification: {
-            poll: function(args) {
-                args.complete();
-            }
-        }
-    }
-}
-
-    function isLdapEnabled() {
-        var result;
-        $.ajax({
-            url: createURL("listLdapConfigurations"),
-            dataType: "json",
-            async: false,
-            success: function(json) {
-                result = (json.ldapconfigurationresponse.count > 0);
-            },
-            error: function(json) {
-                result = false;
-            }
-        });
-        return result;
-    }
-
-    // Role Functions
-
-    function isAdmin() {
-        return (g_role == 1);
-    }
-
-    function isDomainAdmin() {
-        return (g_role == 2);
-    }
-
-    function isUser() {
-        return (g_role == 0);
-    }
-
-    // FUNCTION: Handles AJAX error callbacks.  You can pass in an optional function to
-    // handle errors that are not already handled by this method.
-
-    function handleError(XMLHttpResponse, handleErrorCallback) {
-        // User Not authenticated
-        if (XMLHttpResponse.status == ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED) {
-            $("#dialog_session_expired").dialog("open");
-        } else if (XMLHttpResponse.status == ERROR_INTERNET_NAME_NOT_RESOLVED) {
-            $("#dialog_error_internet_not_resolved").dialog("open");
-        } else if (XMLHttpResponse.status == ERROR_INTERNET_CANNOT_CONNECT) {
-            $("#dialog_error_management_server_not_accessible").dialog("open");
-        } else if (XMLHttpResponse.status == ERROR_VMOPS_ACCOUNT_ERROR && handleErrorCallback != undefined) {
-            handleErrorCallback();
-        } else if (handleErrorCallback != undefined) {
-            handleErrorCallback();
-        } else {
-            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-            $("#dialog_error").text(_s(errorMsg)).dialog("open");
-        }
-    }
-
-    function parseXMLHttpResponse(XMLHttpResponse) {
-        if (isValidJsonString(XMLHttpResponse.responseText) == false) {
-            return "";
-        }
-
-        //var json = jQuery.parseJSON(XMLHttpResponse.responseText);
-        var json = JSON.parse(XMLHttpResponse.responseText);
-        if (json != null) {
-            var property;
-            for (property in json) {
-                var errorObj = json[property];
-                if (errorObj.errorcode == 401 && errorObj.errortext == "unable to verify user credentials and/or request signature") {
-                    $('#container').hide();
-
-                    return _l('label.session.expired');
-                } else {
-                    return _s(errorObj.errortext);
-                }
-            }
-        } else {
-            return "";
-        }
-    }
-
-    function isValidJsonString(str) {
-        try {
-            JSON.parse(str);
-        } catch (e) {
-            return false;
-        }
-        return true;
-    }
-
-cloudStack.validate = {
-    vmHostName: function(args) {
-        // 1 ~ 63 characters long
-        // ASCII letters 'a' through 'z', 'A' through 'Z', digits '0' through '9', hyphen ('-')
-        // must start with a letter
-        // must end with a letter or a digit (must not end with a hyphen)
-        var regexp = /^[a-zA-Z]{1}[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]{0,1}$/;
-        var b = regexp.test(args); //true or false
-        if (b == false)
-            cloudStack.dialog.notice({
-                message: 'message.validate.instance.name'
-            });
-        return b;
-    }
-}
-
-cloudStack.preFilter = {
-    createTemplate: function(args) {
-        if (isAdmin()) {
-            args.$form.find('.form-item[rel=isPublic]').css('display', 'inline-block');
-            args.$form.find('.form-item[rel=isFeatured]').css('display', 'inline-block');
-            args.$form.find('.form-item[rel=isrouting]').css('display', 'inline-block');
-        } else {
-            if (g_userPublicTemplateEnabled == "true") {
-                args.$form.find('.form-item[rel=isPublic]').css('display', 'inline-block');
-            } else {
-                args.$form.find('.form-item[rel=isPublic]').hide();
-            }
-            args.$form.find('.form-item[rel=isFeatured]').hide();
-        }
-    },
-    addLoadBalancerDevice: function(args) { //add netscaler device OR add F5 device
-        args.$form.find('.form-item[rel=dedicated]').bind('change', function() {
-            var $dedicated = args.$form.find('.form-item[rel=dedicated]');
-            var $capacity = args.$form.find('.form-item[rel=capacity]');
-            if ($dedicated.find('input[type=checkbox]:checked').length > 0) {
-                $capacity.hide();
-                $capacity.find('input[type=text]').val('1');
-            } else if ($dedicated.find('input[type=checkbox]:unchecked').length > 0) {
-                $capacity.css('display', 'inline-block');
-                $capacity.find('input[type=text]').val('');
-            }
-        });
-        args.$form.change();
-    }
-}
-
-cloudStack.actionFilter = {
-    guestNetwork: function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        allowedActions.push('replaceacllist');
-        if (jsonObj.type == 'Isolated') {
-            allowedActions.push('edit'); //only Isolated network is allowed to upgrade to a different network offering (Shared network is not allowed to)
-            allowedActions.push('restart');
-            allowedActions.push('remove');
-        } else if (jsonObj.type == 'Shared') {
-            if (isAdmin()) {
-                allowedActions.push('restart');
-                allowedActions.push('remove');
-            }
-        }
-        return allowedActions;
-    }
-}
-
-var roleTypeUser = "0";
-var roleTypeAdmin = "1";
-var roleTypeDomainAdmin = "2";
-
-cloudStack.converters = {
-    convertBytes: function(bytes) {
-        if (bytes == undefined)
-            return '';
-
-        if (bytes < 1024 * 1024) {
-            return (bytes / 1024).toFixed(2) + " KB";
-        } else if (bytes < 1024 * 1024 * 1024) {
-            return (bytes / 1024 / 1024).toFixed(2) + " MB";
-        } else if (bytes < 1024 * 1024 * 1024 * 1024) {
-            return (bytes / 1024 / 1024 / 1024).toFixed(2) + " GB";
-        } else {
-            return (bytes / 1024 / 1024 / 1024 / 1024).toFixed(2) + " TB";
-        }
-    },
-    toBytes: function(str) {
-        if (str === undefined) {
-            return "0";
-        }
-
-        var res = str.split(" ");
-
-        if (res.length === 1) {
-            // assume a number in GB
-
-            return parseInt(str, 10) * 1024 * 1024 * 1024;
-        }
-
-        // assume first string is a number and second string is a unit of size
-
-        if (res[1] === "KB") {
-            return parseInt(res[0], 10) * 1024;
-        }
-
-        if (res[1] === "MB") {
-            return parseInt(res[0], 10) * 1024 * 1024;
-        }
-
-        if (res[1] === "GB") {
-            return parseInt(res[0], 10) * 1024 * 1024 * 1024;
-        }
-
-        if (res[1] === "TB") {
-            return parseInt(res[0], 10) * 1024 * 1024 * 1024 * 1024;
-        }
-
-        // assume GB
-        return parseInt(res[0], 10) * 1024 * 1024 * 1024;
-    },
-    toLocalDate: function(UtcDate) {
-        var localDate = "";
-        if (UtcDate != null && UtcDate.length > 0) {
-            var disconnected = new Date();
-            disconnected.setISO8601(UtcDate);
-
-            if (g_timezoneoffset != null && g_timezoneoffset != "null") {
-                localDate = disconnected.getTimePlusTimezoneOffset(g_timezoneoffset);
-            } else {
-                var browserDate = new Date();
-                var browserTimezoneoffset = browserDate.getTimezoneOffset();
-                if (browserTimezoneoffset == undefined || isNaN(browserTimezoneoffset) ) {
-                    localDate = disconnected.toUTCString();
-                } else {
-                    g_timezoneoffset = (browserTimezoneoffset/60) * (-1);
-                    localDate = disconnected.getTimePlusTimezoneOffset(g_timezoneoffset);
-                }
-            }
-        }
-        return localDate;
-    },
-    toBooleanText: function(booleanValue) {
-        var text1;
-        if (booleanValue == true) {
-            text1 = "Yes";
-        } else if (booleanValue == false) {
-            text1 = "No";
-        } else { //booleanValue == undefined
-            text1 = "";
-        }
-        return text1;
-    },
-    convertHz: function(hz) {
-        if (hz == null)
-            return "";
-
-        if (hz < 1000) {
-            return hz + " MHz";
-        } else {
-            return (hz / 1000).toFixed(2) + " GHz";
-        }
-    },
-    toDayOfWeekDesp: function(dayOfWeek) {
-        if (dayOfWeek == "1")
-            return "Sunday";
-        else if (dayOfWeek == "2")
-            return "Monday";
-        else if (dayOfWeek == "3")
-            return "Tuesday";
-        else if (dayOfWeek == "4")
-            return "Wednesday";
-        else if (dayOfWeek == "5")
-            return "Thursday"
-        else if (dayOfWeek == "6")
-            return "Friday";
-        else if (dayOfWeek == "7")
-            return "Saturday";
-    },
-    toDayOfWeekDesp: function(dayOfWeek) {
-        if (dayOfWeek == "1")
-            return "Sunday";
-        else if (dayOfWeek == "2")
-            return "Monday";
-        else if (dayOfWeek == "3")
-            return "Tuesday";
-        else if (dayOfWeek == "4")
-            return "Wednesday";
-        else if (dayOfWeek == "5")
-            return "Thursday"
-        else if (dayOfWeek == "6")
-            return "Friday";
-        else if (dayOfWeek == "7")
-            return "Saturday";
-    },
-    toNetworkType: function(usevirtualnetwork) {
-        if (usevirtualnetwork == true || usevirtualnetwork == "true")
-            return "Public";
-        else
-            return "Direct";
-    },
-    toRole: function(type) {
-        if (type == roleTypeUser) {
-            return "User";
-        } else if (type == roleTypeAdmin) {
-            return "Admin";
-        } else if (type == roleTypeDomainAdmin) {
-            return "Domain-Admin";
-        }
-    },
-    toAccountType: function(roleType) {
-        if (roleType == 'User') {
-            return 0;
-        } else if (roleType == 'Admin') {
-            return 1;
-        } else if (roleType == 'DomainAdmin') {
-            return 2;
-        } else if (roleType == 'ResourceAdmin') {
-            return 3;
-        }
-    },
-    toAlertType: function(alertCode) {
-        switch (alertCode) {
-            case 0:
-                return _l('label.memory');
-            case 1:
-                return _l('label.cpu');
-            case 2:
-                return _l('label.storage');
-            case 3:
-                return _l('label.primary.storage');
-            case 4:
-                return _l('label.public.ips');
-            case 5:
-                return _l('label.management.ips');
-            case 6:
-                return _l('label.secondary.storage');
-            case 7:
-                return _l('label.host');
-            case 9:
-                return _l('label.domain.router');
-            case 10:
-                return _l('label.console.proxy');
-
-                // These are old values -- can be removed in the future
-            case 8:
-                return _l('label.user.vm');
-            case 11:
-                return _l('label.routing.host');
-            case 12:
-                return _l('label.menu.storage');
-            case 13:
-                return _l('label.usage.server');
-            case 14:
-                return _l('label.management.server');
-            case 15:
-                return _l('label.domain.router');
-            case 16:
-                return _l('label.console.proxy');
-            case 17:
-                return _l('label.user.vm');
-            case 18:
-                return _l('label.vlan');
-            case 19:
-                return _l('label.secondary.storage.vm');
-            case 20:
-                return _l('label.usage.server');
-            case 21:
-                return _l('label.menu.storage');
-            case 22:
-                return _l('label.action.update.resource.count');
-            case 23:
-                return _l('label.usage.sanity.result');
-            case 24:
-                return _l('label.direct.attached.public.ip');
-            case 25:
-                return _l('label.local.storage');
-            case 26:
-                return _l('label.resource.limit.exceeded');
-        }
-    },
-
-    toCapacityCountType: function(capacityCode) {
-        switch (capacityCode) {
-            case 0:
-                return _l('label.memory');
-            case 1:
-                return _l('label.cpu');
-            case 2:
-                return _l('label.storage');
-            case 3:
-                return _l('label.primary.storage');
-            case 4:
-                return _l('label.public.ips');
-            case 5:
-                return _l('label.management.ips');
-            case 6:
-                return _l('label.secondary.storage');
-            case 7:
-                return _l('label.vlan');
-            case 8:
-                return _l('label.direct.ips');
-            case 9:
-                return _l('label.local.storage');
-            case 10:
-                return _l('label.routing.host');
-            case 11:
-                return _l('label.menu.storage');
-            case 12:
-                return _l('label.usage.server');
-            case 13:
-                return _l('label.management.server');
-            case 14:
-                return _l('label.domain.router');
-            case 15:
-                return _l('label.console.proxy');
-            case 16:
-                return _l('label.user.vm');
-            case 17:
-                return _l('label.vlan');
-            case 18:
-                return _l('label.secondary.storage.vm');
-            case 19:
-                return _l('label.gpu');
-            case 90:
-                return _l('label.num.cpu.cores');
-        }
-    },
-
-    convertByType: function(alertCode, value) {
-        switch (alertCode) {
-            case 0:
-                return cloudStack.converters.convertBytes(value);
-            case 1:
-                return cloudStack.converters.convertHz(value);
-            case 2:
-                return cloudStack.converters.convertBytes(value);
-            case 3:
-                return cloudStack.converters.convertBytes(value);
-            case 6:
-                return cloudStack.converters.convertBytes(value);
-            case 9:
-                return cloudStack.converters.convertBytes(value);
-            case 11:
-                return cloudStack.converters.convertBytes(value);
-        }
-
-        return value;
-    }
-}
-
-function isModuleIncluded(moduleName) {
-    for(var moduleIndex = 0; moduleIndex < cloudStack.modules.length; moduleIndex++) {
-        if (cloudStack.modules[moduleIndex] == moduleName) {
-            return true;
-            break;
-        }
-    }
-    return false;
-}
-
-//data parameter passed to API call in listView
-
-function listViewDataProvider(args, data, options) {
-    //search
-    if (args.filterBy != null) {
-        if (args.filterBy.advSearch != null && typeof(args.filterBy.advSearch) == "object") { //advanced search
-            for (var key in args.filterBy.advSearch) {
-                if (key == 'tagKey' && args.filterBy.advSearch[key].length > 0) {
-                    $.extend(data, {
-                        'tags[0].key': args.filterBy.advSearch[key]
-                    });
-                } else if (key == 'tagValue' && args.filterBy.advSearch[key].length > 0) {
-                    $.extend(data, {
-                        'tags[0].value': args.filterBy.advSearch[key]
-                    });
-                } else if (args.filterBy.advSearch[key] != null && args.filterBy.advSearch[key].length > 0) {
-                    data[key] = args.filterBy.advSearch[key]; //do NOT use  $.extend(data, { key: args.filterBy.advSearch[key] }); which will treat key variable as "key" string
-                }
-            }
-        } else if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) { //basic search
-            switch (args.filterBy.search.by) {
-                case "name":
-                    if (args.filterBy.search.value.length > 0) {
-                        if (options && options.searchBy) {
-                            data[options.searchBy] = args.filterBy.search.value;
-                        } else {
-                            $.extend(data, {
-                                keyword: args.filterBy.search.value
-                            });
-                        }
-                    }
-                    break;
-            }
-        }
-    }
-
-    //pagination
-    $.extend(data, {
-        listAll: true,
-        page: args.page,
-        pagesize: pageSize
-    });
-
-    return data;
-}
-
-//used by infrastructure page and network page
-var addExtraPropertiesToGuestNetworkObject = function(jsonObj) {
-    jsonObj.networkdomaintext = jsonObj.networkdomain;
-    jsonObj.networkofferingidText = jsonObj.networkofferingid;
-
-    if (jsonObj.acltype == "Domain") {
-        jsonObj.scope = "Domain (" + jsonObj.domain + ")";
-    } else if (jsonObj.acltype == "Account") {
-        if (jsonObj.project != null)
-            jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.project + ")";
-        else
-            jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.account + ")";
-    }
-
-    if (jsonObj.vlan == null && jsonObj.broadcasturi != null && jsonObj.broadcasturi.substring(0,7) == "vlan://") {
-        jsonObj.vlan = jsonObj.broadcasturi.replace("vlan://", "");
-    }
-    if(jsonObj.vxlan == null && jsonObj.broadcasturi != null && jsonObj.broadcasturi.substring(0,8) == "vxlan://") {
-        jsonObj.vxlan = jsonObj.broadcasturi.replace("vxlan://", "");
-    }
-}
-
-//used by infrastructure page
-var addExtraPropertiesToUcsBladeObject = function(jsonObj) {
-    var array1 = jsonObj.bladedn.split('/');
-    jsonObj.chassis = array1[1];
-    jsonObj.bladeid = array1[2];
-}
-
-var processPropertiesInImagestoreObject = function(jsonObj) {
-    if (jsonObj.url != undefined) {
-        var url = jsonObj.url; //e.g. 'cifs://10.1.1.1/aaa/aaa2/aaa3?user=bbb&password=ccc&domain=ddd'
-        var passwordIndex = url.indexOf('&password='); //38
-        var domainIndex = url.indexOf('&domain=');    //51
-        if (passwordIndex >= 0) {
-            jsonObj.url = url.substring(0, passwordIndex) + url.substring(domainIndex); //remove '&password=ccc' from jsonObj.url
-        }
-    }
-}
-
-//find service object in network object
-
-    function ipFindNetworkServiceByName(pName, networkObj) {
-        if (networkObj == null)
-            return null;
-        if (networkObj.service != null) {
-            for (var i = 0; i < networkObj.service.length; i++) {
-                var networkServiceObj = networkObj.service[i];
-                if (networkServiceObj.name == pName)
-                    return networkServiceObj;
-            }
-        }
-        return null;
-    }
-    //find capability object in service object in network object
-
-    function ipFindCapabilityByName(pName, networkServiceObj) {
-        if (networkServiceObj == null)
-            return null;
-        if (networkServiceObj.capability != null) {
-            for (var i = 0; i < networkServiceObj.capability.length; i++) {
-                var capabilityObj = networkServiceObj.capability[i];
-                if (capabilityObj.name == pName)
-                    return capabilityObj;
-            }
-        }
-        return null;
-    }
-
-    //compose URL for adding primary storage
-
-    function nfsURL(server, path) {
-        var url;
-
-        if (path.substring(0, 1) != "/") {
-            path = "/" + path;
-        }
-
-        if (server.indexOf("://") == -1)
-            url = "nfs://" + server + path;
-        else
-            url = server + path;
-        return url;
-    }
-
-    function smbURL(server, path, smbUsername, smbPassword, smbDomain) {
-        var url = '';
-
-        if (path.substring(0, 1) != "/") {
-            path = "/" + path;
-        }
-
-        if (server.indexOf('://') == -1) {
-            url += 'cifs://';
-        }
-
-        url += (server + path);
-
-        return url;
-    }
-
-    function presetupURL(server, path) {
-        var url;
-        if (server.indexOf("://") == -1)
-            url = "presetup://" + server + path;
-        else
-            url = server + path;
-        return url;
-    }
-
-    function ocfs2URL(server, path) {
-        var url;
-        if (server.indexOf("://") == -1)
-            url = "ocfs2://" + server + path;
-        else
-            url = server + path;
-        return url;
-    }
-
-    function SharedMountPointURL(server, path) {
-        var url;
-        if (server.indexOf("://") == -1)
-            url = "SharedMountPoint://" + server + path;
-        else
-            url = server + path;
-        return url;
-    }
-
-    function rbdURL(monitor, pool, id, secret) {
-        var url;
-
-        /*
-    Replace the + and / symbols by - and _ to have URL-safe base64 going to the API
-    It's hacky, but otherwise we'll confuse java.net.URI which splits the incoming URI
-    */
-        secret = secret.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');
-
-        if (id != null && secret != null) {
-            monitor = id + ":" + secret + "@" + monitor;
-        }
-
-        if (pool.substring(0, 1) != "/")
-            pool = "/" + pool;
-
-        if (monitor.indexOf("://") == -1)
-            url = "rbd://" + monitor + pool;
-        else
-            url = monitor + pool;
-
-        return url;
-    }
-
-    function clvmURL(vgname) {
-        var url;
-        if (vgname.indexOf("://") == -1)
-            url = "clvm://localhost/" + vgname;
-        else
-            url = vgname;
-        return url;
-    }
-
-    function vmfsURL(server, path) {
-        var url;
-        if (server.indexOf("://") == -1)
-            url = "vmfs://" + server + path;
-        else
-            url = server + path;
-        return url;
-    }
-
-    function iscsiURL(server, iqn, lun) {
-        var url;
-        if (server.indexOf("://") == -1)
-            url = "iscsi://" + server + iqn + "/" + lun;
-        else
-            url = server + iqn + "/" + lun;
-        return url;
-    }
-
-    function glusterURL(server, path) {
-        var url;
-        if (server.indexOf("://") == -1)
-            url = "gluster://" + server + path;
-        else
-            url = server + path;
-        return url;
-    }
-
-
-    //VM Instance
-
-    function getVmName(p_vmName, p_vmDisplayname) {
-        if (p_vmDisplayname == null)
-            return _s(p_vmName);
-
-        var vmName = null;
-        if (p_vmDisplayname != p_vmName) {
-            vmName = _s(p_vmName) + " (" + _s(p_vmDisplayname) + ")";
-        } else {
-            vmName = _s(p_vmName);
-        }
-        return vmName;
-    }
-
-var timezoneMap = new Object();
-timezoneMap["Etc/GMT+12"] = "Etc/GMT+12 [GMT-12:00]";
-timezoneMap["Etc/GMT+11"] = "Etc/GMT+11 [GMT-11:00]";
-timezoneMap["Pacific/Midway"] = "Pacific/Midway [Samoa Standard Time]";
-timezoneMap["Pacific/Niue"] = "Pacific/Niue [Niue Time]";
-timezoneMap["Pacific/Pago_Pago"] = "Pacific/Pago_Pago [Samoa Standard Time]";
-timezoneMap["Pacific/Samoa"] = "Pacific/Samoa [Samoa Standard Time]";
-timezoneMap["US/Samoa"] = "US/Samoa [Samoa Standard Time]";
-timezoneMap["America/Adak"] = "America/Adak [Hawaii-Aleutian Standard Time]";
-timezoneMap["America/Atka"] = "America/Atka [Hawaii-Aleutian Standard Time]";
-timezoneMap["Etc/GMT+10"] = "Etc/GMT+10 [GMT-10:00]";
-timezoneMap["HST"] = "HST [Hawaii Standard Time]";
-timezoneMap["Pacific/Honolulu"] = "Pacific/Honolulu [Hawaii Standard Time]";
-timezoneMap["Pacific/Johnston"] = "Pacific/Johnston [Hawaii Standard Time]";
-timezoneMap["Pacific/Rarotonga"] = "Pacific/Rarotonga [Cook Is. Time]";
-timezoneMap["Pacific/Tahiti"] = "Pacific/Tahiti [Tahiti Time]";
-timezoneMap["SystemV/HST10"] = "SystemV/HST10 [Hawaii Standard Time]";
-timezoneMap["US/Aleutian"] = "US/Aleutian [Hawaii-Aleutian Standard Time]";
-timezoneMap["US/Hawaii"] = "US/Hawaii [Hawaii Standard Time]";
-timezoneMap["Pacific/Marquesas"] = "Pacific/Marquesas [Marquesas Time]";
-timezoneMap["AST"] = "AST [Alaska Standard Time]";
-timezoneMap["America/Anchorage"] = "America/Anchorage [Alaska Standard Time]";
-timezoneMap["America/Juneau"] = "America/Juneau [Alaska Standard Time]";
-timezoneMap["America/Nome"] = "America/Nome [Alaska Standard Time]";
-timezoneMap["America/Sitka"] = "America/Sitka [GMT-09:00]";
-timezoneMap["America/Yakutat"] = "America/Yakutat [Alaska Standard Time]";
-timezoneMap["Etc/GMT+9"] = "Etc/GMT+9 [GMT-09:00]";
-timezoneMap["Pacific/Gambier"] = "Pacific/Gambier [Gambier Time]";
-timezoneMap["SystemV/YST9"] = "SystemV/YST9 [Alaska Standard Time]";
-timezoneMap["SystemV/YST9YDT"] = "SystemV/YST9YDT [Alaska Standard Time]";
-timezoneMap["US/Alaska"] = "US/Alaska [Alaska Standard Time]";
-timezoneMap["America/Dawson"] = "America/Dawson [Pacific Standard Time]";
-timezoneMap["America/Ensenada"] = "America/Ensenada [Pacific Standard Time]";
-timezoneMap["America/Los_Angeles"] = "America/Los_Angeles [Pacific Standard Time]";
-timezoneMap["America/Metlakatla"] = "America/Metlakatla [GMT-08:00]";
-timezoneMap["America/Santa_Isabel"] = "America/Santa_Isabel [Pacific Standard Time]";
-timezoneMap["America/Tijuana"] = "America/Tijuana [Pacific Standard Time]";
-timezoneMap["America/Vancouver"] = "America/Vancouver [Pacific Standard Time]";
-timezoneMap["America/Whitehorse"] = "America/Whitehorse [Pacific Standard Time]";
-timezoneMap["Canada/Pacific"] = "Canada/Pacific [Pacific Standard Time]";
-timezoneMap["Canada/Yukon"] = "Canada/Yukon [Pacific Standard Time]";
-timezoneMap["Etc/GMT+8"] = "Etc/GMT+8 [GMT-08:00]";
-timezoneMap["Mexico/BajaNorte"] = "Mexico/BajaNorte [Pacific Standard Time]";
-timezoneMap["PST"] = "PST [Pacific Standard Time]";
-timezoneMap["PST8PDT"] = "PST8PDT [Pacific Standard Time]";
-timezoneMap["Pacific/Pitcairn"] = "Pacific/Pitcairn [Pitcairn Standard Time]";
-timezoneMap["SystemV/PST8"] = "SystemV/PST8 [Pacific Standard Time]";
-timezoneMap["SystemV/PST8PDT"] = "SystemV/PST8PDT [Pacific Standard Time]";
-timezoneMap["US/Pacific"] = "US/Pacific [Pacific Standard Time]";
-timezoneMap["US/Pacific-New"] = "US/Pacific-New [Pacific Standard Time]";
-timezoneMap["America/Boise"] = "America/Boise [Mountain Standard Time]";
-timezoneMap["America/Cambridge_Bay"] = "America/Cambridge_Bay [Mountain Standard Time]";
-timezoneMap["America/Chihuahua"] = "America/Chihuahua [Mountain Standard Time]";
-timezoneMap["America/Creston"] = "America/Creston [GMT-07:00]";
-timezoneMap["America/Dawson_Creek"] = "America/Dawson_Creek [Mountain Standard Time]";
-timezoneMap["America/Denver"] = "America/Denver [Mountain Standard Time]";
-timezoneMap["America/Edmonton"] = "America/Edmonton [Mountain Standard Time]";
-timezoneMap["America/Hermosillo"] = "America/Hermosillo [Mountain Standard Time]";
-timezoneMap["America/Inuvik"] = "America/Inuvik [Mountain Standard Time]";
-timezoneMap["America/Mazatlan"] = "America/Mazatlan [Mountain Standard Time]";
-timezoneMap["America/Ojinaga"] = "America/Ojinaga [Mountain Standard Time]";
-timezoneMap["America/Phoenix"] = "America/Phoenix [Mountain Standard Time]";
-timezoneMap["America/Shiprock"] = "America/Shiprock [Mountain Standard Time]";
-timezoneMap["America/Yellowknife"] = "America/Yellowknife [Mountain Standard Time]";
-timezoneMap["Canada/Mountain"] = "Canada/Mountain [Mountain Standard Time]";
-timezoneMap["Etc/GMT+7"] = "Etc/GMT+7 [GMT-07:00]";
-timezoneMap["MST"] = "MST [Mountain Standard Time]";
-timezoneMap["MST7MDT"] = "MST7MDT [Mountain Standard Time]";
-timezoneMap["Mexico/BajaSur"] = "Mexico/BajaSur [Mountain Standard Time]";
-timezoneMap["Navajo"] = "Navajo [Mountain Standard Time]";
-timezoneMap["PNT"] = "PNT [Mountain Standard Time]";
-timezoneMap["SystemV/MST7"] = "SystemV/MST7 [Mountain Standard Time]";
-timezoneMap["SystemV/MST7MDT"] = "SystemV/MST7MDT [Mountain Standard Time]";
-timezoneMap["US/Arizona"] = "US/Arizona [Mountain Standard Time]";
-timezoneMap["US/Mountain"] = "US/Mountain [Mountain Standard Time]";
-timezoneMap["America/Bahia_Banderas"] = "America/Bahia_Banderas [GMT-06:00]";
-timezoneMap["America/Belize"] = "America/Belize [Central Standard Time]";
-timezoneMap["America/Cancun"] = "America/Cancun [Central Standard Time]";
-timezoneMap["America/Chicago"] = "America/Chicago [Central Standard Time]";
-timezoneMap["America/Costa_Rica"] = "America/Costa_Rica [Central Standard Time]";
-timezoneMap["America/El_Salvador"] = "America/El_Salvador [Central Standard Time]";
-timezoneMap["America/Guatemala"] = "America/Guatemala [Central Standard Time]";
-timezoneMap["America/Indiana/Knox"] = "America/Indiana/Knox [Central Standard Time]";
-timezoneMap["America/Indiana/Tell_City"] = "America/Indiana/Tell_City [Central Standard Time]";
-timezoneMap["America/Knox_IN"] = "America/Knox_IN [Central Standard Time]";
-timezoneMap["America/Managua"] = "America/Managua [Central Standard Time]";
-timezoneMap["America/Matamoros"] = "America/Matamoros [Central Standard Time]";
-timezoneMap["America/Menominee"] = "America/Menominee [Central Standard Time]";
-timezoneMap["America/Merida"] = "America/Merida [Central Standard Time]";
-timezoneMap["America/Mexico_City"] = "America/Mexico_City [Central Standard Time]";
-timezoneMap["America/Monterrey"] = "America/Monterrey [Central Standard Time]";
-timezoneMap["America/North_Dakota/Beulah"] = "America/North_Dakota/Beulah [GMT-06:00]";
-timezoneMap["America/North_Dakota/Center"] = "America/North_Dakota/Center [Central Standard Time]";
-timezoneMap["America/North_Dakota/New_Salem"] = "America/North_Dakota/New_Salem [Central Standard Time]";
-timezoneMap["America/Rainy_River"] = "America/Rainy_River [Central Standard Time]";
-timezoneMap["America/Rankin_Inlet"] = "America/Rankin_Inlet [Central Standard Time]";
-timezoneMap["America/Regina"] = "America/Regina [Central Standard Time]";
-timezoneMap["America/Resolute"] = "America/Resolute [Eastern Standard Time]";
-timezoneMap["America/Swift_Current"] = "America/Swift_Current [Central Standard Time]";
-timezoneMap["America/Tegucigalpa"] = "America/Tegucigalpa [Central Standard Time]";
-timezoneMap["America/Winnipeg"] = "America/Winnipeg [Central Standard Time]";
-timezoneMap["CST"] = "CST [Central Standard Time]";
-timezoneMap["CST6CDT"] = "CST6CDT [Central Standard Time]";
-timezoneMap["Canada/Central"] = "Canada/Central [Central Standard Time]";
-timezoneMap["Canada/East-Saskatchewan"] = "Canada/East-Saskatchewan [Central Standard Time]";
-timezoneMap["Canada/Saskatchewan"] = "Canada/Saskatchewan [Central Standard Time]";
-timezoneMap["Chile/EasterIsland"] = "Chile/EasterIsland [Easter Is. Time]";
-timezoneMap["Etc/GMT+6"] = "Etc/GMT+6 [GMT-06:00]";
-timezoneMap["Mexico/General"] = "Mexico/General [Central Standard Time]";
-timezoneMap["Pacific/Easter"] = "Pacific/Easter [Easter Is. Time]";
-timezoneMap["Pacific/Galapagos"] = "Pacific/Galapagos [Galapagos Time]";
-timezoneMap["SystemV/CST6"] = "SystemV/CST6 [Central Standard Time]";
-timezoneMap["SystemV/CST6CDT"] = "SystemV/CST6CDT [Central Standard Time]";
-timezoneMap["US/Central"] = "US/Central [Central Standard Time]";
-timezoneMap["US/Indiana-Starke"] = "US/Indiana-Starke [Central Standard Time]";
-timezoneMap["America/Atikokan"] = "America/Atikokan [Eastern Standard Time]";
-timezoneMap["America/Bogota"] = "America/Bogota [Colombia Time]";
-timezoneMap["America/Cayman"] = "America/Cayman [Eastern Standard Time]";
-timezoneMap["America/Coral_Harbour"] = "America/Coral_Harbour [Eastern Standard Time]";
-timezoneMap["America/Detroit"] = "America/Detroit [Eastern Standard Time]";
-timezoneMap["America/Fort_Wayne"] = "America/Fort_Wayne [Eastern Standard Time]";
-timezoneMap["America/Grand_Turk"] = "America/Grand_Turk [Eastern Standard Time]";
-timezoneMap["America/Guayaquil"] = "America/Guayaquil [Ecuador Time]";
-timezoneMap["America/Havana"] = "America/Havana [Cuba Standard Time]";
-timezoneMap["America/Indiana/Indianapolis"] = "America/Indiana/Indianapolis [Eastern Standard Time]";
-timezoneMap["America/Indiana/Marengo"] = "America/Indiana/Marengo [Eastern Standard Time]";
-timezoneMap["America/Indiana/Petersburg"] = "America/Indiana/Petersburg [Eastern Standard Time]";
-timezoneMap["America/Indiana/Vevay"] = "America/Indiana/Vevay [Eastern Standard Time]";
-timezoneMap["America/Indiana/Vincennes"] = "America/Indiana/Vincennes [Eastern Standard Time]";
-timezoneMap["America/Indiana/Winamac"] = "America/Indiana/Winamac [Eastern Standard Time]";
-timezoneMap["America/Indianapolis"] = "America/Indianapolis [Eastern Standard Time]";
-timezoneMap["America/Iqaluit"] = "America/Iqaluit [Eastern Standard Time]";
-timezoneMap["America/Jamaica"] = "America/Jamaica [Eastern Standard Time]";
-timezoneMap["America/Kentucky/Louisville"] = "America/Kentucky/Louisville [Eastern Standard Time]";
-timezoneMap["America/Kentucky/Monticello"] = "America/Kentucky/Monticello [Eastern Standard Time]";
-timezoneMap["America/Lima"] = "America/Lima [Peru Time]";
-timezoneMap["America/Louisville"] = "America/Louisville [Eastern Standard Time]";
-timezoneMap["America/Montreal"] = "America/Montreal [Eastern Standard Time]";
-timezoneMap["America/Nassau"] = "America/Nassau [Eastern Standard Time]";
-timezoneMap["America/New_York"] = "America/New_York [Eastern Standard Time]";
-timezoneMap["America/Nipigon"] = "America/Nipigon [Eastern Standard Time]";
-timezoneMap["America/Panama"] = "America/Panama [Eastern Standard Time]";
-timezoneMap["America/Pangnirtung"] = "America/Pangnirtung [Eastern Standard Time]";
-timezoneMap["America/Port-au-Prince"] = "America/Port-au-Prince [Eastern Standard Time]";
-timezoneMap["America/Thunder_Bay"] = "America/Thunder_Bay [Eastern Standard Time]";
-timezoneMap["America/Toronto"] = "America/Toronto [Eastern Standard Time]";
-timezoneMap["Canada/Eastern"] = "Canada/Eastern [Eastern Standard Time]";
-timezoneMap["Cuba"] = "Cuba [Cuba Standard Time]";
-timezoneMap["EST"] = "EST [Eastern Standard Time]";
-timezoneMap["EST5EDT"] = "EST5EDT [Eastern Standard Time]";
-timezoneMap["Etc/GMT+5"] = "Etc/GMT+5 [GMT-05:00]";
-timezoneMap["IET"] = "IET [Eastern Standard Time]";
-timezoneMap["Jamaica"] = "Jamaica [Eastern Standard Time]";
-timezoneMap["SystemV/EST5"] = "SystemV/EST5 [Eastern Standard Time]";
-timezoneMap["SystemV/EST5EDT"] = "SystemV/EST5EDT [Eastern Standard Time]";
-timezoneMap["US/East-Indiana"] = "US/East-Indiana [Eastern Standard Time]";
-timezoneMap["US/Eastern"] = "US/Eastern [Eastern Standard Time]";
-timezoneMap["US/Michigan"] = "US/Michigan [Eastern Standard Time]";
-timezoneMap["America/Caracas"] = "America/Caracas [Venezuela Time]";
-timezoneMap["America/Anguilla"] = "America/Anguilla [Atlantic Standard Time]";
-timezoneMap["America/Antigua"] = "America/Antigua [Atlantic Standard Time]";
-timezoneMap["America/Argentina/San_Luis"] = "America/Argentina/San_Luis [Western Argentine Time]";
-timezoneMap["America/Aruba"] = "America/Aruba [Atlantic Standard Time]";
-timezoneMap["America/Asuncion"] = "America/Asuncion [Paraguay Time]";
-timezoneMap["America/Barbados"] = "America/Barbados [Atlantic Standard Time]";
-timezoneMap["America/Blanc-Sablon"] = "America/Blanc-Sablon [Atlantic Standard Time]";
-timezoneMap["America/Boa_Vista"] = "America/Boa_Vista [Amazon Time]";
-timezoneMap["America/Campo_Grande"] = "America/Campo_Grande [Amazon Time]";
-timezoneMap["America/Cuiaba"] = "America/Cuiaba [Amazon Time]";
-timezoneMap["America/Curacao"] = "America/Curacao [Atlantic Standard Time]";
-timezoneMap["America/Dominica"] = "America/Dominica [Atlantic Standard Time]";
-timezoneMap["America/Eirunepe"] = "America/Eirunepe [Amazon Time]";
-timezoneMap["America/Glace_Bay"] = "America/Glace_Bay [Atlantic Standard Time]";
-timezoneMap["America/Goose_Bay"] = "America/Goose_Bay [Atlantic Standard Time]";
-timezoneMap["America/Grenada"] = "America/Grenada [Atlantic Standard Time]";
-timezoneMap["America/Guadeloupe"] = "America/Guadeloupe [Atlantic Standard Time]";
-timezoneMap["America/Guyana"] = "America/Guyana [Guyana Time]";
-timezoneMap["America/Halifax"] = "America/Halifax [Atlantic Standard Time]";
-timezoneMap["America/Kralendijk"] = "America/Kralendijk [GMT-04:00]";
-timezoneMap["America/La_Paz"] = "America/La_Paz [Bolivia Time]";
-timezoneMap["America/Lower_Princes"] = "America/Lower_Princes [GMT-04:00]";
-timezoneMap["America/Manaus"] = "America/Manaus [Amazon Time]";
-timezoneMap["America/Marigot"] = "America/Marigot [Atlantic Standard Time]";
-timezoneMap["America/Martinique"] = "America/Martinique [Atlantic Standard Time]";
-timezoneMap["America/Moncton"] = "America/Moncton [Atlantic Standard Time]";
-timezoneMap["America/Montserrat"] = "America/Montserrat [Atlantic Standard Time]";
-timezoneMap["America/Port_of_Spain"] = "America/Port_of_Spain [Atlantic Standard Time]";
-timezoneMap["America/Porto_Acre"] = "America/Porto_Acre [Amazon Time]";
-timezoneMap["America/Porto_Velho"] = "America/Porto_Velho [Amazon Time]";
-timezoneMap["America/Puerto_Rico"] = "America/Puerto_Rico [Atlantic Standard Time]";
-timezoneMap["America/Rio_Branco"] = "America/Rio_Branco [Amazon Time]";
-timezoneMap["America/Santiago"] = "America/Santiago [Chile Time]";
-timezoneMap["America/Santo_Domingo"] = "America/Santo_Domingo [Atlantic Standard Time]";
-timezoneMap["America/St_Barthelemy"] = "America/St_Barthelemy [Atlantic Standard Time]";
-timezoneMap["America/St_Kitts"] = "America/St_Kitts [Atlantic Standard Time]";
-timezoneMap["America/St_Lucia"] = "America/St_Lucia [Atlantic Standard Time]";
-timezoneMap["America/St_Thomas"] = "America/St_Thomas [Atlantic Standard Time]";
-timezoneMap["America/St_Vincent"] = "America/St_Vincent [Atlantic Standard Time]";
-timezoneMap["America/Thule"] = "America/Thule [Atlantic Standard Time]";
-timezoneMap["America/Tortola"] = "America/Tortola [Atlantic Standard Time]";
-timezoneMap["America/Virgin"] = "America/Virgin [Atlantic Standard Time]";
-timezoneMap["Antarctica/Palmer"] = "Antarctica/Palmer [Chile Time]";
-timezoneMap["Atlantic/Bermuda"] = "Atlantic/Bermuda [Atlantic Standard Time]";
-timezoneMap["Brazil/Acre"] = "Brazil/Acre [Amazon Time]";
-timezoneMap["Brazil/West"] = "Brazil/West [Amazon Time]";
-timezoneMap["Canada/Atlantic"] = "Canada/Atlantic [Atlantic Standard Time]";
-timezoneMap["Chile/Continental"] = "Chile/Continental [Chile Time]";
-timezoneMap["Etc/GMT+4"] = "Etc/GMT+4 [GMT-04:00]";
-timezoneMap["PRT"] = "PRT [Atlantic Standard Time]";
-timezoneMap["SystemV/AST4"] = "SystemV/AST4 [Atlantic Standard Time]";
-timezoneMap["SystemV/AST4ADT"] = "SystemV/AST4ADT [Atlantic Standard Time]";
-timezoneMap["America/St_Johns"] = "America/St_Johns [Newfoundland Standard Time]";
-timezoneMap["CNT"] = "CNT [Newfoundland Standard Time]";
-timezoneMap["Canada/Newfoundland"] = "Canada/Newfoundland [Newfoundland Standard Time]";
-timezoneMap["AGT"] = "AGT [Argentine Time]";
-timezoneMap["America/Araguaina"] = "America/Araguaina [Brasilia Time]";
-timezoneMap["America/Argentina/Buenos_Aires"] = "America/Argentina/Buenos_Aires [Argentine Time]";
-timezoneMap["America/Argentina/Catamarca"] = "America/Argentina/Catamarca [Argentine Time]";
-timezoneMap["America/Argentina/ComodRivadavia"] = "America/Argentina/ComodRivadavia [Argentine Time]";
-timezoneMap["America/Argentina/Cordoba"] = "America/Argentina/Cordoba [Argentine Time]";
-timezoneMap["America/Argentina/Jujuy"] = "America/Argentina/Jujuy [Argentine Time]";
-timezoneMap["America/Argentina/La_Rioja"] = "America/Argentina/La_Rioja [Argentine Time]";
-timezoneMap["America/Argentina/Mendoza"] = "America/Argentina/Mendoza [Argentine Time]";
-timezoneMap["America/Argentina/Rio_Gallegos"] = "America/Argentina/Rio_Gallegos [Argentine Time]";
-timezoneMap["America/Argentina/Salta"] = "America/Argentina/Salta [Argentine Time]";
-timezoneMap["America/Argentina/San_Juan"] = "America/Argentina/San_Juan [Argentine Time]";
-timezoneMap["America/Argentina/Tucuman"] = "America/Argentina/Tucuman [Argentine Time]";
-timezoneMap["America/Argentina/Ushuaia"] = "America/Argentina/Ushuaia [Argentine Time]";
-timezoneMap["America/Bahia"] = "America/Bahia [Brasilia Time]";
-timezoneMap["America/Belem"] = "America/Belem [Brasilia Time]";
-timezoneMap["America/Buenos_Aires"] = "America/Buenos_Aires [Argentine Time]";
-timezoneMap["America/Catamarca"] = "America/Catamarca [Argentine Time]";
-timezoneMap["America/Cayenne"] = "America/Cayenne [French Guiana Time]";
-timezoneMap["America/Cordoba"] = "America/Cordoba [Argentine Time]";
-timezoneMap["America/Fortaleza"] = "America/Fortaleza [Brasilia Time]";
-timezoneMap["America/Godthab"] = "America/Godthab [Western Greenland Time]";
-timezoneMap["America/Jujuy"] = "America/Jujuy [Argentine Time]";
-timezoneMap["America/Maceio"] = "America/Maceio [Brasilia Time]";
-timezoneMap["America/Mendoza"] = "America/Mendoza [Argentine Time]";
-timezoneMap["America/Miquelon"] = "America/Miquelon [Pierre & Miquelon Standard Time]";
-timezoneMap["America/Montevideo"] = "America/Montevideo [Uruguay Time]";
-timezoneMap["America/Paramaribo"] = "America/Paramaribo [Suriname Time]";
-timezoneMap["America/Recife"] = "America/Recife [Brasilia Time]";
-timezoneMap["America/Rosario"] = "America/Rosario [Argentine Time]";
-timezoneMap["America/Santarem"] = "America/Santarem [Brasilia Time]";
-timezoneMap["America/Sao_Paulo"] = "America/Sao_Paulo [Brasilia Time]";
-timezoneMap["Antarctica/Rothera"] = "Antarctica/Rothera [Rothera Time]";
-timezoneMap["Atlantic/Stanley"] = "Atlantic/Stanley [Falkland Is. Time]";
-timezoneMap["BET"] = "BET [Brasilia Time]";
-timezoneMap["Brazil/East"] = "Brazil/East [Brasilia Time]";
-timezoneMap["Etc/GMT+3"] = "Etc/GMT+3 [GMT-03:00]";
-timezoneMap["America/Noronha"] = "America/Noronha [Fernando de Noronha Time]";
-timezoneMap["Atlantic/South_Georgia"] = "Atlantic/South_Georgia [South Georgia Standard Time]";
-timezoneMap["Brazil/DeNoronha"] = "Brazil/DeNoronha [Fernando de Noronha Time]";
-timezoneMap["Etc/GMT+2"] = "Etc/GMT+2 [GMT-02:00]";
-timezoneMap["America/Scoresbysund"] = "America/Scoresbysund [Eastern Greenland Time]";
-timezoneMap["Atlantic/Azores"] = "Atlantic/Azores [Azores Time]";
-timezoneMap["Atlantic/Cape_Verde"] = "Atlantic/Cape_Verde [Cape Verde Time]";
-timezoneMap["Etc/GMT+1"] = "Etc/GMT+1 [GMT-01:00]";
-timezoneMap["Africa/Abidjan"] = "Africa/Abidjan [Greenwich Mean Time]";
-timezoneMap["Africa/Accra"] = "Africa/Accra [Ghana Mean Time]";
-timezoneMap["Africa/Bamako"] = "Africa/Bamako [Greenwich Mean Time]";
-timezoneMap["Africa/Banjul"] = "Africa/Banjul [Greenwich Mean Time]";
-timezoneMap["Africa/Bissau"] = "Africa/Bissau [Greenwich Mean Time]";
-timezoneMap["Africa/Casablanca"] = "Africa/Casablanca [Western European Time]";
-timezoneMap["Africa/Conakry"] = "Africa/Conakry [Greenwich Mean Time]";
-timezoneMap["Africa/Dakar"] = "Africa/Dakar [Greenwich Mean Time]";
-timezoneMap["Africa/El_Aaiun"] = "Africa/El_Aaiun [Western European Time]";
-timezoneMap["Africa/Freetown"] = "Africa/Freetown [Greenwich Mean Time]";
-timezoneMap["Africa/Lome"] = "Africa/Lome [Greenwich Mean Time]";
-timezoneMap["Africa/Monrovia"] = "Africa/Monrovia [Greenwich Mean Time]";
-timezoneMap["Africa/Nouakchott"] = "Africa/Nouakchott [Greenwich Mean Time]";
-timezoneMap["Africa/Ouagadougou"] = "Africa/Ouagadougou [Greenwich Mean Time]";
-timezoneMap["Africa/Sao_Tome"] = "Africa/Sao_Tome [Greenwich Mean Time]";
-timezoneMap["Africa/Timbuktu"] = "Africa/Timbuktu [Greenwich Mean Time]";
-timezoneMap["America/Danmarkshavn"] = "America/Danmarkshavn [Greenwich Mean Time]";
-timezoneMap["Atlantic/Canary"] = "Atlantic/Canary [Western European Time]";
-timezoneMap["Atlantic/Faeroe"] = "Atlantic/Faeroe [Western European Time]";
-timezoneMap["Atlantic/Faroe"] = "Atlantic/Faroe [Western European Time]";
-timezoneMap["Atlantic/Madeira"] = "Atlantic/Madeira [Western European Time]";
-timezoneMap["Atlantic/Reykjavik"] = "Atlantic/Reykjavik [Greenwich Mean Time]";
-timezoneMap["Atlantic/St_Helena"] = "Atlantic/St_Helena [Greenwich Mean Time]";
-timezoneMap["Eire"] = "Eire [Greenwich Mean Time]";
-timezoneMap["Etc/GMT"] = "Etc/GMT [GMT+00:00]";
-timezoneMap["Etc/GMT+0"] = "Etc/GMT+0 [GMT+00:00]";
-timezoneMap["Etc/GMT-0"] = "Etc/GMT-0 [GMT+00:00]";
-timezoneMap["Etc/GMT0"] = "Etc/GMT0 [GMT+00:00]";
-timezoneMap["Etc/Greenwich"] = "Etc/Greenwich [Greenwich Mean Time]";
-timezoneMap["Etc/UCT"] = "Etc/UCT [Coordinated Universal Time]";
-timezoneMap["Etc/UTC"] = "Etc/UTC [Coordinated Universal Time]";
-timezoneMap["Etc/Universal"] = "Etc/Universal [Coordinated Universal Time]";
-timezoneMap["Etc/Zulu"] = "Etc/Zulu [Coordinated Universal Time]";
-timezoneMap["Europe/Belfast"] = "Europe/Belfast [Greenwich Mean Time]";
-timezoneMap["Europe/Dublin"] = "Europe/Dublin [Greenwich Mean Time]";
-timezoneMap["Europe/Guernsey"] = "Europe/Guernsey [Greenwich Mean Time]";
-timezoneMap["Europe/Isle_of_Man"] = "Europe/Isle_of_Man [Greenwich Mean Time]";
-timezoneMap["Europe/Jersey"] = "Europe/Jersey [Greenwich Mean Time]";
-timezoneMap["Europe/Lisbon"] = "Europe/Lisbon [Western European Time]";
-timezoneMap["Europe/London"] = "Europe/London [Greenwich Mean Time]";
-timezoneMap["GB"] = "GB [Greenwich Mean Time]";
-timezoneMap["GB-Eire"] = "GB-Eire [Greenwich Mean Time]";
-timezoneMap["GMT"] = "GMT [Greenwich Mean Time]";
-timezoneMap["GMT0"] = "GMT0 [GMT+00:00]";
-timezoneMap["Greenwich"] = "Greenwich [Greenwich Mean Time]";
-timezoneMap["Iceland"] = "Iceland [Greenwich Mean Time]";
-timezoneMap["Portugal"] = "Portugal [Western European Time]";
-timezoneMap["UCT"] = "UCT [Coordinated Universal Time]";
-timezoneMap["UTC"] = "UTC [Coordinated Universal Time]";
-timezoneMap["Universal"] = "Universal [Coordinated Universal Time]";
-timezoneMap["WET"] = "WET [Western European Time]";
-timezoneMap["Zulu"] = "Zulu [Coordinated Universal Time]";
-timezoneMap["Africa/Algiers"] = "Africa/Algiers [Central European Time]";
-timezoneMap["Africa/Bangui"] = "Africa/Bangui [Western African Time]";
-timezoneMap["Africa/Brazzaville"] = "Africa/Brazzaville [Western African Time]";
-timezoneMap["Africa/Ceuta"] = "Africa/Ceuta [Central European Time]";
-timezoneMap["Africa/Douala"] = "Africa/Douala [Western African Time]";
-timezoneMap["Africa/Kinshasa"] = "Africa/Kinshasa [Western African Time]";
-timezoneMap["Africa/Lagos"] = "Africa/Lagos [Western African Time]";
-timezoneMap["Africa/Libreville"] = "Africa/Libreville [Western African Time]";
-timezoneMap["Africa/Luanda"] = "Africa/Luanda [Western African Time]";
-timezoneMap["Africa/Malabo"] = "Africa/Malabo [Western African Time]";
-timezoneMap["Africa/Ndjamena"] = "Africa/Ndjamena [Western African Time]";
-timezoneMap["Africa/Niamey"] = "Africa/Niamey [Western African Time]";
-timezoneMap["Africa/Porto-Novo"] = "Africa/Porto-Novo [Western African Time]";
-timezoneMap["Africa/Tripoli"] = "Africa/Tripoli [Eastern European Time]";
-timezoneMap["Africa/Tunis"] = "Africa/Tunis [Central European Time]";
-timezoneMap["Africa/Windhoek"] = "Africa/Windhoek [Western African Time]";
-timezoneMap["Arctic/Longyearbyen"] = "Arctic/Longyearbyen [Central European Time]";
-timezoneMap["Atlantic/Jan_Mayen"] = "Atlantic/Jan_Mayen [Central European Time]";
-timezoneMap["CET"] = "CET [Central European Time]";
-timezoneMap["ECT"] = "ECT [Central European Time]";
-timezoneMap["Etc/GMT-1"] = "Etc/GMT-1 [GMT+01:00]";
-timezoneMap["Europe/Amsterdam"] = "Europe/Amsterdam [Central European Time]";
-timezoneMap["Europe/Andorra"] = "Europe/Andorra [Central European Time]";
-timezoneMap["Europe/Belgrade"] = "Europe/Belgrade [Central European Time]";
-timezoneMap["Europe/Berlin"] = "Europe/Berlin [Central European Time]";
-timezoneMap["Europe/Bratislava"] = "Europe/Bratislava [Central European Time]";
-timezoneMap["Europe/Brussels"] = "Europe/Brussels [Central European Time]";
-timezoneMap["Europe/Budapest"] = "Europe/Budapest [Central European Time]";
-timezoneMap["Europe/Busingen"] = "Europe/Busingen [GMT+01:00]";
-timezoneMap["Europe/Copenhagen"] = "Europe/Copenhagen [Central European Time]";
-timezoneMap["Europe/Gibraltar"] = "Europe/Gibraltar [Central European Time]";
-timezoneMap["Europe/Ljubljana"] = "Europe/Ljubljana [Central European Time]";
-timezoneMap["Europe/Luxembourg"] = "Europe/Luxembourg [Central European Time]";
-timezoneMap["Europe/Madrid"] = "Europe/Madrid [Central European Time]";
-timezoneMap["Europe/Malta"] = "Europe/Malta [Central European Time]";
-timezoneMap["Europe/Monaco"] = "Europe/Monaco [Central European Time]";
-timezoneMap["Europe/Oslo"] = "Europe/Oslo [Central European Time]";
-timezoneMap["Europe/Paris"] = "Europe/Paris [Central European Time]";
-timezoneMap["Europe/Podgorica"] = "Europe/Podgorica [Central European Time]";
-timezoneMap["Europe/Prague"] = "Europe/Prague [Central European Time]";
-timezoneMap["Europe/Rome"] = "Europe/Rome [Central European Time]";
-timezoneMap["Europe/San_Marino"] = "Europe/San_Marino [Central European Time]";
-timezoneMap["Europe/Sarajevo"] = "Europe/Sarajevo [Central European Time]";
-timezoneMap["Europe/Skopje"] = "Europe/Skopje [Central European Time]";
-timezoneMap["Europe/Stockholm"] = "Europe/Stockholm [Central European Time]";
-timezoneMap["Europe/Tirane"] = "Europe/Tirane [Central European Time]";
-timezoneMap["Europe/Vaduz"] = "Europe/Vaduz [Central European Time]";
-timezoneMap["Europe/Vatican"] = "Europe/Vatican [Central European Time]";
-timezoneMap["Europe/Vienna"] = "Europe/Vienna [Central European Time]";
-timezoneMap["Europe/Warsaw"] = "Europe/Warsaw [Central European Time]";
-timezoneMap["Europe/Zagreb"] = "Europe/Zagreb [Central European Time]";
-timezoneMap["Europe/Zurich"] = "Europe/Zurich [Central European Time]";
-timezoneMap["Libya"] = "Libya [Eastern European Time]";
-timezoneMap["MET"] = "MET [Middle Europe Time]";
-timezoneMap["ART"] = "ART [Eastern European Time]";
-timezoneMap["Africa/Blantyre"] = "Africa/Blantyre [Central African Time]";
-timezoneMap["Africa/Bujumbura"] = "Africa/Bujumbura [Central African Time]";
-timezoneMap["Africa/Cairo"] = "Africa/Cairo [Eastern European Time]";
-timezoneMap["Africa/Gaborone"] = "Africa/Gaborone [Central African Time]";
-timezoneMap["Africa/Harare"] = "Africa/Harare [Central African Time]";
-timezoneMap["Africa/Johannesburg"] = "Africa/Johannesburg [South Africa Standard Time]";
-timezoneMap["Africa/Kigali"] = "Africa/Kigali [Central African Time]";
-timezoneMap["Africa/Lubumbashi"] = "Africa/Lubumbashi [Central African Time]";
-timezoneMap["Africa/Lusaka"] = "Africa/Lusaka [Central African Time]";
-timezoneMap["Africa/Maputo"] = "Africa/Maputo [Central African Time]";
-timezoneMap["Africa/Maseru"] = "Africa/Maseru [South Africa Standard Time]";
-timezoneMap["Africa/Mbabane"] = "Africa/Mbabane [South Africa Standard Time]";
-timezoneMap["Asia/Amman"] = "Asia/Amman [Eastern European Time]";
-timezoneMap["Asia/Beirut"] = "Asia/Beirut [Eastern European Time]";
-timezoneMap["Asia/Damascus"] = "Asia/Damascus [Eastern European Time]";
-timezoneMap["Asia/Gaza"] = "Asia/Gaza [Eastern European Time]";
-timezoneMap["Asia/Hebron"] = "Asia/Hebron [GMT+02:00]";
-timezoneMap["Asia/Istanbul"] = "Asia/Istanbul [Eastern European Time]";
-timezoneMap["Asia/Jerusalem"] = "Asia/Jerusalem [Israel Standard Time]";
-timezoneMap["Asia/Nicosia"] = "Asia/Nicosia [Eastern European Time]";
-timezoneMap["Asia/Tel_Aviv"] = "Asia/Tel_Aviv [Israel Standard Time]";
-timezoneMap["CAT"] = "CAT [Central African Time]";
-timezoneMap["EET"] = "EET [Eastern European Time]";
-timezoneMap["Egypt"] = "Egypt [Eastern European Time]";
-timezoneMap["Etc/GMT-2"] = "Etc/GMT-2 [GMT+02:00]";
-timezoneMap["Europe/Athens"] = "Europe/Athens [Eastern European Time]";
-timezoneMap["Europe/Bucharest"] = "Europe/Bucharest [Eastern European Time]";
-timezoneMap["Europe/Chisinau"] = "Europe/Chisinau [Eastern European Time]";
-timezoneMap["Europe/Helsinki"] = "Europe/Helsinki [Eastern European Time]";
-timezoneMap["Europe/Istanbul"] = "Europe/Istanbul [Eastern European Time]";
-timezoneMap["Europe/Kiev"] = "Europe/Kiev [Eastern European Time]";
-timezoneMap["Europe/Mariehamn"] = "Europe/Mariehamn [Eastern European Time]";
-timezoneMap["Europe/Nicosia"] = "Europe/Nicosia [Eastern European Time]";
-timezoneMap["Europe/Riga"] = "Europe/Riga [Eastern European Time]";
-timezoneMap["Europe/Simferopol"] = "Europe/Simferopol [Eastern European Time]";
-timezoneMap["Europe/Sofia"] = "Europe/Sofia [Eastern European Time]";
-timezoneMap["Europe/Tallinn"] = "Europe/Tallinn [Eastern European Time]";
-timezoneMap["Europe/Tiraspol"] = "Europe/Tiraspol [Eastern European Time]";
-timezoneMap["Europe/Uzhgorod"] = "Europe/Uzhgorod [Eastern European Time]";
-timezoneMap["Europe/Vilnius"] = "Europe/Vilnius [Eastern European Time]";
-timezoneMap["Europe/Zaporozhye"] = "Europe/Zaporozhye [Eastern European Time]";
-timezoneMap["Israel"] = "Israel [Israel Standard Time]";
-timezoneMap["Turkey"] = "Turkey [Eastern European Time]";
-timezoneMap["Africa/Addis_Ababa"] = "Africa/Addis_Ababa [Eastern African Time]";
-timezoneMap["Africa/Asmara"] = "Africa/Asmara [Eastern African Time]";
-timezoneMap["Africa/Asmera"] = "Africa/Asmera [Eastern African Time]";
-timezoneMap["Africa/Dar_es_Salaam"] = "Africa/Dar_es_Salaam [Eastern African Time]";
-timezoneMap["Africa/Djibouti"] = "Africa/Djibouti [Eastern African Time]";
-timezoneMap["Africa/Juba"] = "Africa/Juba [GMT+03:00]";
-timezoneMap["Africa/Kampala"] = "Africa/Kampala [Eastern African Time]";
-timezoneMap["Africa/Khartoum"] = "Africa/Khartoum [Eastern African Time]";
-timezoneMap["Africa/Mogadishu"] = "Africa/Mogadishu [Eastern African Time]";
-timezoneMap["Africa/Nairobi"] = "Africa/Nairobi [Eastern African Time]";
-timezoneMap["Antarctica/Syowa"] = "Antarctica/Syowa [Syowa Time]";
-timezoneMap["Asia/Aden"] = "Asia/Aden [Arabia Standard Time]";
-timezoneMap["Asia/Baghdad"] = "Asia/Baghdad [Arabia Standard Time]";
-timezoneMap["Asia/Bahrain"] = "Asia/Bahrain [Arabia Standard Time]";
-timezoneMap["Asia/Kuwait"] = "Asia/Kuwait [Arabia Standard Time]";
-timezoneMap["Asia/Qatar"] = "Asia/Qatar [Arabia Standard Time]";
-timezoneMap["Asia/Riyadh"] = "Asia/Riyadh [Arabia Standard Time]";
-timezoneMap["EAT"] = "EAT [Eastern African Time]";
-timezoneMap["Etc/GMT-3"] = "Etc/GMT-3 [GMT+03:00]";
-timezoneMap["Europe/Kaliningrad"] = "Europe/Kaliningrad [Eastern European Time]";
-timezoneMap["Europe/Minsk"] = "Europe/Minsk [Eastern European Time]";
-timezoneMap["Indian/Antananarivo"] = "Indian/Antananarivo [Eastern African Time]";
-timezoneMap["Indian/Comoro"] = "Indian/Comoro [Eastern African Time]";
-timezoneMap["Indian/Mayotte"] = "Indian/Mayotte [Eastern African Time]";
-timezoneMap["Asia/Riyadh87"] = "Asia/Riyadh87 [GMT+03:07]";
-timezoneMap["Asia/Riyadh88"] = "Asia/Riyadh88 [GMT+03:07]";
-timezoneMap["Asia/Riyadh89"] = "Asia/Riyadh89 [GMT+03:07]";
-timezoneMap["Mideast/Riyadh87"] = "Mideast/Riyadh87 [GMT+03:07]";
-timezoneMap["Mideast/Riyadh88"] = "Mideast/Riyadh88 [GMT+03:07]";
-timezoneMap["Mideast/Riyadh89"] = "Mideast/Riyadh89 [GMT+03:07]";
-timezoneMap["Asia/Tehran"] = "Asia/Tehran [Iran Standard Time]";
-timezoneMap["Iran"] = "Iran [Iran Standard Time]";
-timezoneMap["Asia/Baku"] = "Asia/Baku [Azerbaijan Time]";
-timezoneMap["Asia/Dubai"] = "Asia/Dubai [Gulf Standard Time]";
-timezoneMap["Asia/Muscat"] = "Asia/Muscat [Gulf Standard Time]";
-timezoneMap["Asia/Tbilisi"] = "Asia/Tbilisi [Georgia Time]";
-timezoneMap["Asia/Yerevan"] = "Asia/Yerevan [Armenia Time]";
-timezoneMap["Etc/GMT-4"] = "Etc/GMT-4 [GMT+04:00]";
-timezoneMap["Europe/Moscow"] = "Europe/Moscow [Moscow Standard Time]";
-timezoneMap["Europe/Samara"] = "Europe/Samara [Samara Time]";
-timezoneMap["Europe/Volgograd"] = "Europe/Volgograd [Volgograd Time]";
-timezoneMap["Indian/Mahe"] = "Indian/Mahe [Seychelles Time]";
-timezoneMap["Indian/Mauritius"] = "Indian/Mauritius [Mauritius Time]";
-timezoneMap["Indian/Reunion"] = "Indian/Reunion [Reunion Time]";
-timezoneMap["NET"] = "NET [Armenia Time]";
-timezoneMap["W-SU"] = "W-SU [Moscow Standard Time]";
-timezoneMap["Asia/Kabul"] = "Asia/Kabul [Afghanistan Time]";
-timezoneMap["Antarctica/Mawson"] = "Antarctica/Mawson [Mawson Time]";
-timezoneMap["Asia/Aqtau"] = "Asia/Aqtau [Aqtau Time]";
-timezoneMap["Asia/Aqtobe"] = "Asia/Aqtobe [Aqtobe Time]";
-timezoneMap["Asia/Ashgabat"] = "Asia/Ashgabat [Turkmenistan Time]";
-timezoneMap["Asia/Ashkhabad"] = "Asia/Ashkhabad [Turkmenistan Time]";
-timezoneMap["Asia/Dushanbe"] = "Asia/Dushanbe [Tajikistan Time]";
-timezoneMap["Asia/Karachi"] = "Asia/Karachi [Pakistan Time]";
-timezoneMap["Asia/Oral"] = "Asia/Oral [Oral Time]";
-timezoneMap["Asia/Samarkand"] = "Asia/Samarkand [Uzbekistan Time]";
-timezoneMap["Asia/Tashkent"] = "Asia/Tashkent [Uzbekistan Time]";
-timezoneMap["Etc/GMT-5"] = "Etc/GMT-5 [GMT+05:00]";
-timezoneMap["Indian/Kerguelen"] = "Indian/Kerguelen [French Southern & Antarctic Lands Time]";
-timezoneMap["Indian/Maldives"] = "Indian/Maldives [Maldives Time]";
-timezoneMap["PLT"] = "PLT [Pakistan Time]";
-timezoneMap["Asia/Calcutta"] = "Asia/Calcutta [India Standard Time]";
-timezoneMap["Asia/Colombo"] = "Asia/Colombo [India Standard Time]";
-timezoneMap["Asia/Kolkata"] = "Asia/Kolkata [India Standard Time]";
-timezoneMap["IST"] = "IST [India Standard Time]";
-timezoneMap["Asia/Kathmandu"] = "Asia/Kathmandu [Nepal Time]";
-timezoneMap["Asia/Katmandu"] = "Asia/Katmandu [Nepal Time]";
-timezoneMap["Antarctica/Vostok"] = "Antarctica/Vostok [Vostok Time]";
-timezoneMap["Asia/Almaty"] = "Asia/Almaty [Alma-Ata Time]";
-timezoneMap["Asia/Bishkek"] = "Asia/Bishkek [Kirgizstan Time]";
-timezoneMap["Asia/Dacca"] = "Asia/Dacca [Bangladesh Time]";
-timezoneMap["Asia/Dhaka"] = "Asia/Dhaka [Bangladesh Time]";
-timezoneMap["Asia/Qyzylorda"] = "Asia/Qyzylorda [Qyzylorda Time]";
-timezoneMap["Asia/Thimbu"] = "Asia/Thimbu [Bhutan Time]";
-timezoneMap["Asia/Thimphu"] = "Asia/Thimphu [Bhutan Time]";
-timezoneMap["Asia/Yekaterinburg"] = "Asia/Yekaterinburg [Yekaterinburg Time]";
-timezoneMap["BST"] = "BST [Bangladesh Time]";
-timezoneMap["Etc/GMT-6"] = "Etc/GMT-6 [GMT+06:00]";
-timezoneMap["Indian/Chagos"] = "Indian/Chagos [Indian Ocean Territory Time]";
-timezoneMap["Asia/Rangoon"] = "Asia/Rangoon [Myanmar Time]";
-timezoneMap["Indian/Cocos"] = "Indian/Cocos [Cocos Islands Time]";
-timezoneMap["Antarctica/Davis"] = "Antarctica/Davis [Davis Time]";
-timezoneMap["Asia/Bangkok"] = "Asia/Bangkok [Indochina Time]";
-timezoneMap["Asia/Ho_Chi_Minh"] = "Asia/Ho_Chi_Minh [Indochina Time]";
-timezoneMap["Asia/Hovd"] = "Asia/Hovd [Hovd Time]";
-timezoneMap["Asia/Jakarta"] = "Asia/Jakarta [West Indonesia Time]";
-timezoneMap["Asia/Novokuznetsk"] = "Asia/Novokuznetsk [Novosibirsk Time]";
-timezoneMap["Asia/Novosibirsk"] = "Asia/Novosibirsk [Novosibirsk Time]";
-timezoneMap["Asia/Omsk"] = "Asia/Omsk [Omsk Time]";
-timezoneMap["Asia/Phnom_Penh"] = "Asia/Phnom_Penh [Indochina Time]";
-timezoneMap["Asia/Pontianak"] = "Asia/Pontianak [West Indonesia Time]";
-timezoneMap["Asia/Saigon"] = "Asia/Saigon [Indochina Time]";
-timezoneMap["Asia/Vientiane"] = "Asia/Vientiane [Indochina Time]";
-timezoneMap["Etc/GMT-7"] = "Etc/GMT-7 [GMT+07:00]";
-timezoneMap["Indian/Christmas"] = "Indian/Christmas [Christmas Island Time]";
-timezoneMap["VST"] = "VST [Indochina Time]";
-timezoneMap["Antarctica/Casey"] = "Antarctica/Casey [Western Standard Time (Australia)]";
-timezoneMap["Asia/Brunei"] = "Asia/Brunei [Brunei Time]";
-timezoneMap["Asia/Choibalsan"] = "Asia/Choibalsan [Choibalsan Time]";
-timezoneMap["Asia/Chongqing"] = "Asia/Chongqing [China Standard Time]";
-timezoneMap["Asia/Chungking"] = "Asia/Chungking [China Standard Time]";
-timezoneMap["Asia/Harbin"] = "Asia/Harbin [China Standard Time]";
-timezoneMap["Asia/Hong_Kong"] = "Asia/Hong_Kong [Hong Kong Time]";
-timezoneMap["Asia/Kashgar"] = "Asia/Kashgar [China Standard Time]";
-timezoneMap["Asia/Krasnoyarsk"] = "Asia/Krasnoyarsk [Krasnoyarsk Time]";
-timezoneMap["Asia/Kuala_Lumpur"] = "Asia/Kuala_Lumpur [Malaysia Time]";
-timezoneMap["Asia/Kuching"] = "Asia/Kuching [Malaysia Time]";
-timezoneMap["Asia/Macao"] = "Asia/Macao [China Standard Time]";
-timezoneMap["Asia/Macau"] = "Asia/Macau [China Standard Time]";
-timezoneMap["Asia/Makassar"] = "Asia/Makassar [Central Indonesia Time]";
-timezoneMap["Asia/Manila"] = "Asia/Manila [Philippines Time]";
-timezoneMap["Asia/Shanghai"] = "Asia/Shanghai [China Standard Time]";
-timezoneMap["Asia/Singapore"] = "Asia/Singapore [Singapore Time]";
-timezoneMap["Asia/Taipei"] = "Asia/Taipei [China Standard Time]";
-timezoneMap["Asia/Ujung_Pandang"] = "Asia/Ujung_Pandang [Central Indonesia Time]";
-timezoneMap["Asia/Ulaanbaatar"] = "Asia/Ulaanbaatar [Ulaanbaatar Time]";
-timezoneMap["Asia/Ulan_Bator"] = "Asia/Ulan_Bator [Ulaanbaatar Time]";
-timezoneMap["Asia/Urumqi"] = "Asia/Urumqi [China Standard Time]";
-timezoneMap["Australia/Perth"] = "Australia/Perth [Western Standard Time (Australia)]";
-timezoneMap["Australia/West"] = "Australia/West [Western Standard Time (Australia)]";
-timezoneMap["CTT"] = "CTT [China Standard Time]";
-timezoneMap["Etc/GMT-8"] = "Etc/GMT-8 [GMT+08:00]";
-timezoneMap["Hongkong"] = "Hongkong [Hong Kong Time]";
-timezoneMap["PRC"] = "PRC [China Standard Time]";
-timezoneMap["Singapore"] = "Singapore [Singapore Time]";
-timezoneMap["Australia/Eucla"] = "Australia/Eucla [Central Western Standard Time (Australia)]";
-timezoneMap["Asia/Dili"] = "Asia/Dili [Timor-Leste Time]";
-timezoneMap["Asia/Irkutsk"] = "Asia/Irkutsk [Irkutsk Time]";
-timezoneMap["Asia/Jayapura"] = "Asia/Jayapura [East Indonesia Time]";
-timezoneMap["Asia/Pyongyang"] = "Asia/Pyongyang [Korea Standard Time]";
-timezoneMap["Asia/Seoul"] = "Asia/Seoul [Korea Standard Time]";
-timezoneMap["Asia/Tokyo"] = "Asia/Tokyo [Japan Standard Time]";
-timezoneMap["Etc/GMT-9"] = "Etc/GMT-9 [GMT+09:00]";
-timezoneMap["JST"] = "JST [Japan Standard Time]";
-timezoneMap["Japan"] = "Japan [Japan Standard Time]";
-timezoneMap["Pacific/Palau"] = "Pacific/Palau [Palau Time]";
-timezoneMap["ROK"] = "ROK [Korea Standard Time]";
-timezoneMap["ACT"] = "ACT [Central Standard Time (Northern Territory)]";
-timezoneMap["Australia/Adelaide"] = "Australia/Adelaide [Central Standard Time (South Australia)]";
-timezoneMap["Australia/Broken_Hill"] = "Australia/Broken_Hill [Central Standard Time (South Australia/New South Wales)]";
-timezoneMap["Australia/Darwin"] = "Australia/Darwin [Central Standard Time (Northern Territory)]";
-timezoneMap["Australia/North"] = "Australia/North [Central Standard Time (Northern Territory)]";
-timezoneMap["Australia/South"] = "Australia/South [Central Standard Time (South Australia)]";
-timezoneMap["Australia/Yancowinna"] = "Australia/Yancowinna [Central Standard Time (South Australia/New South Wales)]";
-timezoneMap["AET"] = "AET [Eastern Standard Time (New South Wales)]";
-timezoneMap["Antarctica/DumontDUrville"] = "Antarctica/DumontDUrville [Dumont-d'Urville Time]";
-timezoneMap["Asia/Khandyga"] = "Asia/Khandyga [GMT+10:00]";
-timezoneMap["Asia/Yakutsk"] = "Asia/Yakutsk [Yakutsk Time]";
-timezoneMap["Australia/ACT"] = "Australia/ACT [Eastern Standard Time (New South Wales)]";
-timezoneMap["Australia/Brisbane"] = "Australia/Brisbane [Eastern Standard Time (Queensland)]";
-timezoneMap["Australia/Canberra"] = "Australia/Canberra [Eastern Standard Time (New South Wales)]";
-timezoneMap["Australia/Currie"] = "Australia/Currie [Eastern Standard Time (New South Wales)]";
-timezoneMap["Australia/Hobart"] = "Australia/Hobart [Eastern Standard Time (Tasmania)]";
-timezoneMap["Australia/Lindeman"] = "Australia/Lindeman [Eastern Standard Time (Queensland)]";
-timezoneMap["Australia/Melbourne"] = "Australia/Melbourne [Eastern Standard Time (Victoria)]";
-timezoneMap["Australia/NSW"] = "Australia/NSW [Eastern Standard Time (New South Wales)]";
-timezoneMap["Australia/Queensland"] = "Australia/Queensland [Eastern Standard Time (Queensland)]";
-timezoneMap["Australia/Sydney"] = "Australia/Sydney [Eastern Standard Time (New South Wales)]";
-timezoneMap["Australia/Tasmania"] = "Australia/Tasmania [Eastern Standard Time (Tasmania)]";
-timezoneMap["Australia/Victoria"] = "Australia/Victoria [Eastern Standard Time (Victoria)]";
-timezoneMap["Etc/GMT-10"] = "Etc/GMT-10 [GMT+10:00]";
-timezoneMap["Pacific/Chuuk"] = "Pacific/Chuuk [GMT+10:00]";
-timezoneMap["Pacific/Guam"] = "Pacific/Guam [Chamorro Standard Time]";
-timezoneMap["Pacific/Port_Moresby"] = "Pacific/Port_Moresby [Papua New Guinea Time]";
-timezoneMap["Pacific/Saipan"] = "Pacific/Saipan [Chamorro Standard Time]";
-timezoneMap["Pacific/Truk"] = "Pacific/Truk [Truk Time]";
-timezoneMap["Pacific/Yap"] = "Pacific/Yap [Truk Time]";
-timezoneMap["Australia/LHI"] = "Australia/LHI [Lord Howe Standard Time]";
-timezoneMap["Australia/Lord_Howe"] = "Australia/Lord_Howe [Lord Howe Standard Time]";
-timezoneMap["Antarctica/Macquarie"] = "Antarctica/Macquarie [Macquarie Island Time]";
-timezoneMap["Asia/Sakhalin"] = "Asia/Sakhalin [Sakhalin Time]";
-timezoneMap["Asia/Ust-Nera"] = "Asia/Ust-Nera [GMT+11:00]";
-timezoneMap["Asia/Vladivostok"] = "Asia/Vladivostok [Vladivostok Time]";
-timezoneMap["Etc/GMT-11"] = "Etc/GMT-11 [GMT+11:00]";
-timezoneMap["Pacific/Efate"] = "Pacific/Efate [Vanuatu Time]";
-timezoneMap["Pacific/Guadalcanal"] = "Pacific/Guadalcanal [Solomon Is. Time]";
-timezoneMap["Pacific/Kosrae"] = "Pacific/Kosrae [Kosrae Time]";
-timezoneMap["Pacific/Noumea"] = "Pacific/Noumea [New Caledonia Time]";
-timezoneMap["Pacific/Pohnpei"] = "Pacific/Pohnpei [GMT+11:00]";
-timezoneMap["Pacific/Ponape"] = "Pacific/Ponape [Ponape Time]";
-timezoneMap["SST"] = "SST [Solomon Is. Time]";
-timezoneMap["Pacific/Norfolk"] = "Pacific/Norfolk [Norfolk Time]";
-timezoneMap["Antarctica/McMurdo"] = "Antarctica/McMurdo [New Zealand Standard Time]";
-timezoneMap["Antarctica/South_Pole"] = "Antarctica/South_Pole [New Zealand Standard Time]";
-timezoneMap["Asia/Anadyr"] = "Asia/Anadyr [Anadyr Time]";
-timezoneMap["Asia/Kamchatka"] = "Asia/Kamchatka [Petropavlovsk-Kamchatski Time]";
-timezoneMap["Asia/Magadan"] = "Asia/Magadan [Magadan Time]";
-timezoneMap["Etc/GMT-12"] = "Etc/GMT-12 [GMT+12:00]";
-timezoneMap["Kwajalein"] = "Kwajalein [Marshall Islands Time]";
-timezoneMap["NST"] = "NST [New Zealand Standard Time]";
-timezoneMap["NZ"] = "NZ [New Zealand Standard Time]";
-timezoneMap["Pacific/Auckland"] = "Pacific/Auckland [New Zealand Standard Time]";
-timezoneMap["Pacific/Fiji"] = "Pacific/Fiji [Fiji Time]";
-timezoneMap["Pacific/Funafuti"] = "Pacific/Funafuti [Tuvalu Time]";
-timezoneMap["Pacific/Kwajalein"] = "Pacific/Kwajalein [Marshall Islands Time]";
-timezoneMap["Pacific/Majuro"] = "Pacific/Majuro [Marshall Islands Time]";
-timezoneMap["Pacific/Nauru"] = "Pacific/Nauru [Nauru Time]";
-timezoneMap["Pacific/Tarawa"] = "Pacific/Tarawa [Gilbert Is. Time]";
-timezoneMap["Pacific/Wake"] = "Pacific/Wake [Wake Time]";
-timezoneMap["Pacific/Wallis"] = "Pacific/Wallis [Wallis & Futuna Time]";
-timezoneMap["NZ-CHAT"] = "NZ-CHAT [Chatham Standard Time]";
-timezoneMap["Pacific/Chatham"] = "Pacific/Chatham [Chatham Standard Time]";
-timezoneMap["Etc/GMT-13"] = "Etc/GMT-13 [GMT+13:00]";
-timezoneMap["MIT"] = "MIT [West Samoa Time]";
-timezoneMap["Pacific/Apia"] = "Pacific/Apia [West Samoa Time]";
-timezoneMap["Pacific/Enderbury"] = "Pacific/Enderbury [Phoenix Is. Time]";
-timezoneMap["Pacific/Fakaofo"] = "Pacific/Fakaofo [Tokelau Time]";
-timezoneMap["Pacific/Tongatapu"] = "Pacific/Tongatapu [Tonga Time]";
-timezoneMap["Etc/GMT-14"] = "Etc/GMT-14 [GMT+14:00]";
-timezoneMap["Pacific/Kiritimati"] = "Pacific/Kiritimati [Line Is. Time]";
-
-
-// CloudStack common API helpers
-cloudStack.api = {
-    actions: {
-        sort: function(updateCommand, objType) {
-            var action = function(args) {
-                $.ajax({
-                    url: createURL(updateCommand),
-                    data: {
-                        id: args.context[objType].id,
-                        sortKey: args.sortKey
-                    },
-                    success: function(json) {
-                        args.response.success();
-                    },
-                    error: function(json) {
-                        args.response.error(parseXMLHttpResponse(json));
-                    }
-                });
-
-            };
-
-            return {
-                moveTop: {
-                    action: action
-                },
-                moveBottom: {
-                    action: action
-                },
-                moveUp: {
-                    action: action
-                },
-                moveDown: {
-                    action: action
-                },
-                moveDrag: {
-                    action: action
-                }
-            }
-        }
-    },
-
-    tags: function(args) {
-        var resourceType = args.resourceType;
-        var contextId = args.contextId;
-
-        return {
-            actions: {
-                add: function(args) {
-                    var data = args.data;
-                    var resourceId = args.context[contextId][0].id;
-
-                    $.ajax({
-                        url: createURL('createTags'),
-                        data: {
-                            'tags[0].key': data.key,
-                            'tags[0].value': data.value,
-                            resourceIds: resourceId,
-                            resourceType: resourceType
-                        },
-                        success: function(json) {
-                            args.response.success({
-                                _custom: {
-                                    jobId: json.createtagsresponse.jobid
-                                },
-                                notification: {
-                                    desc: 'Add tag for ' + resourceType,
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        }
-                    });
-                },
-
-                remove: function(args) {
-                    var data = args.context.tagItems[0];
-                    var resourceId = args.context[contextId][0].id;
-
-                    $.ajax({
-                        url: createURL('deleteTags'),
-                        data: {
-                            'tags[0].key': data.key,
-                            'tags[0].value': data.value,
-                            resourceIds: resourceId,
-                            resourceType: resourceType
-                        },
-                        success: function(json) {
-                            args.response.success({
-                                _custom: {
-                                    jobId: json.deletetagsresponse.jobid
-                                },
-                                notification: {
-                                    desc: 'Remove tag for ' + resourceType,
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        }
-                    });
-                }
-            },
-            dataProvider: function(args) {
-                if (args.jsonObj != undefined) {
-                    args.response.success({
-                        data: args.jsonObj.tags
-                    });
-                } else {
-                    var resourceId = args.context[contextId][0].id;
-                    var data = {
-                        resourceId: resourceId,
-                        resourceType: resourceType
-                    };
-
-                    if (isAdmin() || isDomainAdmin()) {
-                        data.listAll = true;
-                    }
-
-                    if (args.context.projects) {
-                        data.projectid = args.context.projects[0].id;
-                    }
-
-                    if (args.jsonObj != null && args.jsonObj.projectid != null && data.projectid == null) {
-                        data.projectid = args.jsonObj.projectid;
-                    }
-
-                    $.ajax({
-                        url: createURL('listTags'),
-                        data: data,
-                        success: function(json) {
-                            args.response.success({
-                                data: json.listtagsresponse ? json.listtagsresponse.tag : []
-                            });
-                        },
-                        error: function(json) {
-                            args.response.error(parseXMLHttpResponse(json));
-                        }
-                    });
-                }
-            }
-        };
-    }
-};
-
-function strOrFunc(arg, args) {
-    if (typeof arg === 'function')
-        return arg(args);
-    return arg;
-}
-
-function sortArrayByKey(arrayToSort, sortKey, reverse) {
-
-    if(!arrayToSort){
-        return;
-    }
-    // Move smaller items towards the front
-    // or back of the array depending on if
-    // we want to sort the array in reverse
-    // order or not.
-    var moveSmaller = reverse ? 1 : -1;
-
-    // Move larger items towards the front
-    // or back of the array depending on if
-    // we want to sort the array in reverse
-    // order or not.
-    var moveLarger = reverse ? -1 : 1;
-
-    /**
-     * @param  {*} a
-     * @param  {*} b
-     * @return {Number}
-     */
-    arrayToSort.sort(function(a, b) {
-        if (a[sortKey] < b[sortKey]) {
-            return moveSmaller;
-        }
-        if (a[sortKey] > b[sortKey]) {
-            return moveLarger;
-        }
-        return 0;
-    });
-}
-
-$.validator.addMethod("netmask", function(value, element) {
-    if (this.optional(element) && value.length == 0)
-        return true;
-
-    var valid = [ 255, 254, 252, 248, 240, 224, 192, 128, 0 ];
-    var octets = value.split('.');
-    if (typeof octets == 'undefined' || octets.length != 4) {
-        return false;
-    }
-    var wasAll255 = true;
-    for (index = 0; index < octets.length; index++) {
-        if (octets[index] != Number(octets[index]).toString()) //making sure that "", " ", "00", "0 ","255  ", etc. will not pass
-            return false;
-        wasAll255 = wasAll255 && octets[index] == 255;
-        if ($.inArray(Number(octets[index]), valid) < 0)
-            return false;
-        if (!wasAll255 && index > 0 && Number(octets[index]) != 0 && Number(octets[index - 1]) != 255)
-            return false;
-    }
-
-    return true;
-}, "The specified netmask is invalid.");
-
-$.validator.addMethod("ipv6cidr", function(value, element) {
-    if (this.optional(element) && value.length == 0)
-        return true;
-
-    var parts = value.split('/');
-    if (typeof parts == 'undefined' || parts.length != 2) {
-        return false;
-    }
-
-    if (!$.validator.methods.ipv6CustomJqueryValidator.call(this, parts[0], element))
-        return false;
-
-    if (parts[1] != Number(parts[1]).toString()) //making sure that "", " ", "00", "0 ","2  ", etc. will not pass
-        return false;
-
-    if (Number(parts[1]) < 0 || Number(parts[1] > 128))
-        return false;
-
-    return true;
-}, "The specified IPv6 CIDR is invalid.");
-
-$.validator.addMethod("ipv4cidr", function(value, element) {
-    if (this.optional(element) && value.length == 0)
-        return true;
-
-    var parts = value.split('/');
-    if (typeof parts == 'undefined' || parts.length != 2) {
-        return false;
-    }
-
-    if (!$.validator.methods.ipv4.call(this, parts[0], element))
-        return false;
-
-    if (parts[1] != Number(parts[1]).toString()) //making sure that "", " ", "00", "0 ","2  ", etc. will not pass
-        return false;
-
-    if (Number(parts[1]) < 0 || Number(parts[1] > 32))
-        return false;
-
-    return true;
-}, "The specified IPv4 CIDR is invalid.");
-
-$.validator.addMethod("ipv46cidrs", function(value, element) {
-    var result = true;
-    if (value) {
-        var validatorThis = this;
-        value.split(',').forEach(function(item){
-            if (result && !$.validator.methods.ipv46cidr.call(validatorThis, item.trim(), element)) {
-                result = false;
-            }
-        })
-    }
-    return result;
-}, "The specified IPv4/IPv6 CIDR input is invalid.");
-
-$.validator.addMethod("ipv46cidr", function(value, element) {
-    if (this.optional(element) && value.length == 0)
-        return true;
-
-    if ($.validator.methods.ipv4cidr.call(this, value, element) || $.validator.methods.ipv6cidr.call(this, value, element))
-        return true;
-
-    return false;
-}, "The specified IPv4/IPv6 CIDR is invalid.");
-
-jQuery.validator.addMethod("ipv4AndIpv6AddressValidator", function(value, element) {
-    if (this.optional(element) && value.length == 0) {
-        return true;
-	}
-    if (jQuery.validator.methods.ipv4.call(this, value, element) || jQuery.validator.methods.ipv6CustomJqueryValidator.call(this, value, element)) {
-        return true;
-    }
-    return false;
-}, "The specified IPv4/IPv6 address is invalid.");
-
-jQuery.validator.addMethod("ipv6CustomJqueryValidator", function(value, element) {
-    if (value == '::'){
-    	return true;
-    }
-    return jQuery.validator.methods.ipv6.call(this, value, element);
-}, "The specified IPv6 address is invalid.");
-
-$.validator.addMethod("allzonesonly", function(value, element){
-
-    if ((value.indexOf("-1") != -1) && (value.length > 1))
-        return false;
-    return true;
-
-},
-"All Zones cannot be combined with any other zone");
-
-$.validator.addMethod("naturalnumber", function(value, element){
-    if (this.optional(element) && value.length == 0)
-        return true;
-    if (isNaN(value))
-        return false;
-    value = parseInt(value);
-    return (typeof value === 'number') && (value > 0) && (Math.floor(value) === value) && value !== Infinity;
-
-},
-"Please enter a valid number, 1 or greater");
-
-$.validator.addMethod("multiplecountnumber", function(value, element){
-    if (this.optional(element) && value.length == 0)
-        return true;
-    if (isNaN(value))
-        return false;
-    value = parseInt(value);
-    return (typeof value === 'number') && (value > 1) && (Math.floor(value) === value) && value !== Infinity;
-
-},
-"Please enter a valid number, 2 or greater");
-
-cloudStack.createTemplateMethod = function (isSnapshot){
-	return {
-        label: 'label.create.template',
-        messages: {
-            confirm: function(args) {
-                return 'message.create.template';
-            },
-            notification: function(args) {
-                return 'label.create.template';
-            }
-        },
-        createForm: {
-            title: 'label.create.template',
-            preFilter: cloudStack.preFilter.createTemplate,
-            desc: '',
-            preFilter: function(args) {
-                if (args.context.volumes[0].hypervisor == "XenServer") {
-                    if (isAdmin()) {
-                        args.$form.find('.form-item[rel=xenserverToolsVersion61plus]').css('display', 'inline-block');
-                    }
-                }
-            },
-            fields: {
-                name: {
-                    label: 'label.name',
-                    validation: {
-                        required: true
-                    }
-                },
-                displayText: {
-                    label: 'label.description',
-                    validation: {
-                        required: true
-                    }
-                },
-                xenserverToolsVersion61plus: {
-                    label: 'label.xenserver.tools.version.61.plus',
-                    isBoolean: true,
-                    isChecked: function (args) {
-                        var b = false;
-                        var vmObj;
-                        $.ajax({
-                            url: createURL("listVirtualMachines"),
-                            data: {
-                                id: args.context.volumes[0].virtualmachineid
-                            },
-                            async: false,
-                            success: function(json) {
-                                vmObj = json.listvirtualmachinesresponse.virtualmachine[0];
-                            }
-                        });
-                        if (vmObj == undefined) { //e.g. VM has failed over
-                            if (isAdmin()) {
-                                $.ajax({
-                                    url: createURL('listConfigurations'),
-                                    data: {
-                                        name: 'xenserver.pvdriver.version'
-                                    },
-                                    async: false,
-                                    success: function (json) {
-                                        if (json.listconfigurationsresponse.configuration != null && json.listconfigurationsresponse.configuration[0].value == 'xenserver61') {
-                                            b = true;
-                                        }
-                                    }
-                                });
-                            }
-                        } else {
-                             if ('details' in vmObj && 'hypervisortoolsversion' in vmObj.details) {
-                                 if (vmObj.details.hypervisortoolsversion == 'xenserver61')
-                                     b = true;
-                                 else
-                                     b = false;
-                             }
-                        }
-                        return b;
-                    },
-                    isHidden: true
-                },
-                osTypeId: {
-                    label: 'label.os.type',
-                    select: function(args) {
-                        $.ajax({
-                            url: createURL("listOsTypes"),
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var ostypes = json.listostypesresponse.ostype;
-                                var items = [];
-                                $(ostypes).each(function() {
-                                    items.push({
-                                        id: this.id,
-                                        description: this.description
-                                    });
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    }
-                },
-                isPublic: {
-                    label: 'label.public',
-                    isBoolean: true
-                },
-                isPasswordEnabled: {
-                    label: 'label.password.enabled',
-                    isBoolean: true
-                },
-                isFeatured: {
-                    label: 'label.featured',
-                    isBoolean: true
-                },
-                isdynamicallyscalable: {
-                    label: 'label.dynamically.scalable',
-                    isBoolean: true
-                },
-                requireshvm: {
-                    label: 'label.hvm',
-                    docID: 'helpRegisterTemplateHvm',
-                    isBoolean: true,
-                    isHidden: false,
-                    isChecked: false
-                }
-            }
-
-        },
-        action: function(args) {
-            var data = {
-                name: args.data.name,
-                displayText: args.data.displayText,
-                osTypeId: args.data.osTypeId,
-                isPublic: (args.data.isPublic == "on"),
-                passwordEnabled: (args.data.isPasswordEnabled == "on"),
-                isdynamicallyscalable: (args.data.isdynamicallyscalable == "on"),
-                requireshvm: (args.data.requireshvm == "on")
-            };
-            
-            if(isSnapshot){
-            	data.snapshotid = args.context.snapshots[0].id;
-            } else{
-            	data.volumeId = args.context.volumes[0].id;
-            }
-            if (args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") {
-                $.extend(data, {
-                    isfeatured: (args.data.isFeatured == "on")
-                });
-            }
-
-            //XenServer only (starts here)
-            if (args.$form.find('.form-item[rel=xenserverToolsVersion61plus]').length > 0) {
-                if (args.$form.find('.form-item[rel=xenserverToolsVersion61plus]').css("display") != "none") {
-                    $.extend(data, {
-                        'details[0].hypervisortoolsversion': (args.data.xenserverToolsVersion61plus == "on") ? "xenserver61" : "xenserver56"
-                    });
-                }
-            }
-            //XenServer only (ends here)
-
-            $.ajax({
-                url: createURL('createTemplate'),
-                data: data,
-                success: function(json) {
-                    var jid = json.createtemplateresponse.jobid;
-                    args.response.success({
-                        _custom: {
-                            jobId: jid,
-                            getUpdatedItem: function(json) {
-                                return {}; //no properties in this volume needs to be updated
-                            },
-                            getActionFilter: function() {
-                                return volumeActionfilter;
-                            }
-                        }
-                    });
-                }
-            });
-        },
-        notification: {
-            poll: pollAsyncJobResult
-        }
-    };
-};
-cloudStack.createTemplateFromSnapshotMethod = function (){
-    return {
-        label: 'label.create.template',
-        messages: {
-            confirm: function(args) {
-                return 'message.create.template';
-            },
-            notification: function(args) {
-                return 'label.create.template';
-            }
-        },
-        createForm: {
-            title: 'label.create.template',
-            desc: '',
-
-
-            fields: {
-                name: {
-                    label: 'label.name',
-                    validation: {
-                        required: true
-                    }
-                },
-                displayText: {
-                    label: 'label.description',
-                    validation: {
-                        required: true
-                    }
-                },
-                osTypeId: {
-                    label: 'label.os.type',
-                    select: function(args) {
-                        $.ajax({
-                            url: createURL("listOsTypes"),
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var ostypes = json.listostypesresponse.ostype;
-                                var items = [];
-                                $(ostypes).each(function() {
-                                    items.push({
-                                        id: this.id,
-                                        description: this.description
-                                    });
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    }
-                },
-                isPublic: {
-                    label: 'label.public',
-                    isBoolean: true
-                },
-                isPasswordEnabled: {
-                    label: 'label.password.enabled',
-                    isBoolean: true
-                },
-                isdynamicallyscalable: {
-                    label: 'label.dynamically.scalable',
-                    isBoolean: true
-                }
-            }
-        },
-        action: function(args) {
-            var data = {
-                snapshotid: args.context.snapshots[0].id,
-                name: args.data.name,
-                displayText: args.data.displayText,
-                osTypeId: args.data.osTypeId,
-                isPublic: (args.data.isPublic == "on"),
-                passwordEnabled: (args.data.isPasswordEnabled == "on"),
-                isdynamicallyscalable: (args.data.isdynamicallyscalable == "on")
-            };
-
-            $.ajax({
-                url: createURL('createTemplate'),
-                data: data,
-                success: function(json) {
-                    var jid = json.createtemplateresponse.jobid;
-                    args.response.success({
-                        _custom: {
-                            jobId: jid,
-                            getUpdatedItem: function(json) {
-                                return {}; //nothing in this snapshot needs to be updated
-                            },
-                            getActionFilter: function() {
-                                return cloudStack.actionFilter.snapshotActionfilter;
-                            }
-                        }
-                    });
-                }
-            });
-        },
-        notification: {
-            poll: pollAsyncJobResult
-        }
-    };
-};
-
-cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty = function(array, parameterName, value){
-    if (value != null && value.length > 0) {
-        array.push("&" + parameterName + "=" + encodeURIComponent(value));
-    }
-}
-
-cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty = function(array, username, password){
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "username", username);
-    cloudStack.addPasswordToCommandUrlParameterArray(array, password);
-};
-
-cloudStack.addPasswordToCommandUrlParameterArray = function(array, password){
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "password", password);
-};
-
-/**
- * We will only add the name and description data to the array of parameters if they are not null.
- * Moreover, we expect the name parameter to be a property ('name') of data object. 
- * The description must be a property called 'description' in the data object.   
- */
-cloudStack.addNameAndDescriptionToCommandUrlParameterArray = function (array, data){
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "name", data.name);
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "description", data.description);
-};
-
-cloudStack.addNewSizeToCommandUrlParameterArrayIfItIsNotNullAndHigherThanZero = function(array, newSize){
-    if(newSize == undefined || newSize == null){
-        return;
-    }
-    var newSizeAsNumber = new Number(newSize);
-    if(isNaN(newSizeAsNumber)){
-        return;
-    }
-    if (newSizeAsNumber > 0) {
-        array.push("&size=" + encodeURIComponent(newSize));
-    }
-};
-
-cloudStack.addVlanToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty = function(array, vlan){
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "vlan", vlan);
-};
-
-cloudStack.createArrayOfParametersForCreatePodCommand = function (zoneId, data){
-    var array =[];
-    array.push("&zoneId=" + zoneId);
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "name", data.podName);
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "gateway", data.podGateway);
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "netmask", data.podNetmask);
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "startIp", data.podStartIp);
-    cloudStack.addParameterToCommandUrlParameterArrayIfValueIsNotEmpty(array, "endIp", data.podEndIp);
-    return array;
-}
-
-cloudStack.listDiskOfferings = function(options){
-    var defaultOptions = {
-            listAll: false,
-            isRecursive: false,
-            error: function(data) {
-                args.response.error(data);
-            }
-    };
-    var mergedOptions = $.extend({}, defaultOptions, options);
-    
-    var listDiskOfferingsUrl = "listDiskOfferings";
-    if(mergedOptions.listAll){
-        listDiskOfferingsUrl = listDiskOfferingsUrl + "&listall=true";
-    }
-    if(mergedOptions.isRecursive){
-        listDiskOfferingsUrl = listDiskOfferingsUrl + "&isrecursive=true";
-    }
-    var diskOfferings = undefined;
-    $.ajax({
-        url: createURL(listDiskOfferingsUrl),
-        data: mergedOptions.data,
-        dataType: "json",
-        async: false,
-        success: function(json) {
-            diskOfferings = json.listdiskofferingsresponse.diskoffering;
-        },
-        error: mergedOptions.error
-    });
-    return diskOfferings;
-};
diff --git a/ui/legacy/scripts/storage.js b/ui/legacy/scripts/storage.js
deleted file mode 100644
index 65ae293..0000000
--- a/ui/legacy/scripts/storage.js
+++ /dev/null
@@ -1,3246 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack) {
-    var migrateVolumeCreateFormAction = {
-            title: 'label.migrate.volume',
-            fields: {
-                storagePool: {
-                    label: 'label.storage.pool',
-                    validation: {
-                        required: true
-                    },
-                    select: function(args) {
-                        var mapStoragePoolsByUuid = new Map();
-                        var volumeId = args.context.volumes[0].id;
-                        var volumeBeingMigrated = undefined;
-                        $.ajax({
-                            url: createURL("listVolumes&id=" + volumeId),
-                            dataType: "json",
-                            async: false,
-                            success: function(json){
-                                volumeBeingMigrated = json.listvolumesresponse.volume[0]; 
-                            }
-                        });
-                        var currentStoragePool = undefined;
-                        $.ajax({
-                            url: createURL("listStoragePools&id=" + volumeBeingMigrated.storageid),
-                            dataType: "json",
-                            async: false,
-                            success: function(json){
-                                currentStoragePool = json.liststoragepoolsresponse.storagepool[0]; 
-                            }
-                        });
-                        var isVolumeNotAttachedToVm = volumeBeingMigrated.virtualmachineid == undefined;
-                        var urlToRetrieveStoragePools = "findStoragePoolsForMigration&id=" + args.context.volumes[0].id;
-                        if(isVolumeNotAttachedToVm){
-                            urlToRetrieveStoragePools = "listStoragePools&zoneid=" + args.context.volumes[0].zoneid;
-                        }
-                        $.ajax({
-                            url: createURL(urlToRetrieveStoragePools),
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var pools = undefined;
-                                if(isVolumeNotAttachedToVm){
-                                    pools = json.liststoragepoolsresponse.storagepool;
-                                }else{
-                                    pools = json.findstoragepoolsformigrationresponse.storagepool;
-                                }
-                                var items = [];
-                                $(pools).each(function() {
-                                    mapStoragePoolsByUuid.set(this.id, this);
-                                    var description = this.name;
-                                    if(!isVolumeNotAttachedToVm){
-                                        description = description + " (" + (this.suitableformigration ? "Suitable" : "Not Suitable") + ")";
-                                    }
-                                    items.push({
-                                        id: this.id,
-                                        description: description
-                                    });
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                                var diskOfferings = cloudStack.listDiskOfferings({listAll: true});
-                                $('select[name=storagePool]').change(function(){
-                                    var uuidOfStoragePoolSelected = $(this).val();
-                                    var storagePoolSelected = mapStoragePoolsByUuid.get(uuidOfStoragePoolSelected);
-                                    if(currentStoragePool.scope === storagePoolSelected.scope){
-                                        $('div[rel=newDiskOffering],div[rel=useNewDiskOffering]').hide();
-                                    }else{
-                                        $('div[rel=newDiskOffering],div[rel=useNewDiskOffering]').show();
-                                    }
-                                    var storageType = 'shared';
-                                    if(storagePoolSelected.scope == 'HOST'){
-                                        storageType = 'local';
-                                    }
-                                    $(diskOfferings).each(function(){
-                                        var diskOfferingOption = $('option[value=' + this.id + ']');
-                                        if(this.storagetype == storageType){
-                                            diskOfferingOption.show();
-                                        }else{
-                                            diskOfferingOption.hide();
-                                        }
-                                    });
-                                    var firstAvailableDiskOfferingForStorageType = $('select#label_disk_newOffering').children('option:visible').first().attr('value');
-                                    $('select#label_disk_newOffering').attr('value', firstAvailableDiskOfferingForStorageType);
-                                });
-                                var functionHideShowNewDiskOfferint = function(){
-                                    if($('div[rel=useNewDiskOffering] input[type=checkbox]').is(':checked')){
-                                        $('div[rel=newDiskOffering]').show();
-                                    }else{
-                                        $('div[rel=newDiskOffering]').hide();
-                                    }  
-                                };
-                                $('div[rel=useNewDiskOffering] input[type=checkbox]').click(functionHideShowNewDiskOfferint);
-                                $('select[name=storagePool]').change();
-                                functionHideShowNewDiskOfferint();
-                            }
-                        });
-                    }
-                },
-            useNewDiskOffering:{
-                label: 'label.migrate.volume.newDiskOffering',
-                desc: 'label.migrate.volume.newDiskOffering.desc',
-                validation: {
-                    required: false
-                   },
-                isEditable: true, 
-                isBoolean: true,
-                defaultValue: 'Yes'
-            },
-            newDiskOffering: {
-                label: 'label.disk.newOffering',
-                desc: 'label.disk.newOffering.description',
-                validation: {
-                    required: false
-                   },
-                select: function(args){
-                    var diskOfferings = cloudStack.listDiskOfferings({listAll: true});
-                    var items = [];
-                    $(diskOfferings).each(function() {
-                        items.push({
-                            id: this.id,
-                            description: this.name
-                        });
-                    });
-                    args.response.success({
-                        data: items
-                    });
-                   }
-               }
-           }
-        };
-    var functionMigrateVolume = function(args) {
-        var volumeBeingMigrated = args.context.volumes[0];
-        var isLiveMigrate = volumeBeingMigrated.vmstate == 'Running';
-        var migrateVolumeUrl = "migrateVolume&livemigrate="+ isLiveMigrate +"&storageid=" + args.data.storagePool + "&volumeid=" + volumeBeingMigrated.id;
-        if($('div[rel=useNewDiskOffering] input[name=useNewDiskOffering]:checkbox').is(':checked')){
-            migrateVolumeUrl = migrateVolumeUrl + '&newdiskofferingid=' + $('div[rel=newDiskOffering] select').val();
-        }
-        $.ajax({
-            url: createURL(migrateVolumeUrl),
-            dataType: "json",
-            async: true,
-            success: function(json) {
-                $(window).trigger('cloudStack.fullRefresh');
-                var jid = json.migratevolumeresponse.jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid
-                    }
-                });
-            }
-        });
-    }
-
-    var diskOfferingsObjList, selectedDiskOfferingObj = null;
-
-    cloudStack.sections.storage = {
-        title: 'label.storage',
-        id: 'storage',
-        sectionSelect: {
-            label: 'label.select-view'
-        },
-        sections: {
-            /**
-             * Volumes
-             */
-            volumes: {
-                type: 'select',
-                title: 'label.volumes',
-                listView: {
-                    id: 'volumes',
-                    label: 'label.volumes',
-                    preFilter: function(args) {
-                        var hiddenFields = [];
-                        if (isAdmin() != true) {
-                            hiddenFields.push('hypervisor');
-                            hiddenFields.push('account');
-                        }
-                        return hiddenFields;
-                    },
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        type: {
-                            label: 'label.type'
-                        },
-                        vmdisplayname: {
-                            label: 'label.vm.display.name'
-                        },
-                        hypervisor: {
-                            label: 'label.hypervisor'
-                        },
-                        account: {
-                            label: 'label.account'
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        vmdisplayname: {
-                            label: 'label.vm.display.name'
-                        },
-                        state: {
-                            label: 'label.metrics.state',
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            indicator: {
-                                'Allocated': 'on',
-                                'Ready': 'on',
-                                'Destroy': 'off',
-                                'Expunging': 'off',
-                                'Expunged': 'off',
-                                'Migrating': 'warning',
-                                'UploadOp': 'warning',
-                                'Snapshotting': 'warning',
-                            }
-                        }
-                    },
-
-                    // List view actions
-                    actions: {
-                        // Add volume
-                        add: {
-                            label: 'label.add',
-
-                            preFilter: function(args) {
-                                return !args.context.instances;
-                            },
-
-                            messages: {
-                                confirm: function(args) {
-                                    return 'message.add.volume';
-                                },
-                                notification: function(args) {
-                                    return 'label.add.volume';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.volume',
-                                desc: 'message.add.volume',
-                                fields: {
-                                    name: {
-                                        docID: 'helpVolumeName',
-                                        label: 'label.name'
-                                    },
-                                    availabilityZone: {
-                                        label: 'label.availability.zone',
-                                        docID: 'helpVolumeAvailabilityZone',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones&available=true"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    args.response.success({
-                                                        descriptionField: 'name',
-                                                        data: zoneObjs
-                                                    });
-                                                }
-                                            });
-                                            args.$select.change(function() {
-                                                var diskOfferingSelect = $(this).closest('form').find('select[name=diskOffering]');
-                                                if(diskOfferingSelect) {
-                                                    $(diskOfferingSelect).find('option').remove().end();
-                                                    var data = {
-                                                        zoneid: $(this).val(),
-                                                    };
-                                                    console.log(data);
-                                                    var diskOfferings = cloudStack.listDiskOfferings({ data: data });
-                                                    diskOfferingsObjList = diskOfferings;
-                                                    $(diskOfferings).each(function() {
-                                                        $(diskOfferingSelect).append(new Option(this.displaytext, this.id));
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    diskOffering: {
-                                        label: 'label.disk.offering',
-                                        docID: 'helpVolumeDiskOffering',
-                                        select: function(args) {
-                                            var diskOfferings = cloudStack.listDiskOfferings({});
-                                            diskOfferingsObjList = diskOfferings;
-                                            var items = [];
-                                            $(diskOfferings).each(function() {
-                                                items.push({
-                                                    id: this.id,
-                                                    description: this.displaytext
-                                                });
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                            args.$select.change(function() {
-                                                var diskOfferingId = $(this).val();
-                                                $(diskOfferingsObjList).each(function() {
-                                                    if (this.id == diskOfferingId) {
-                                                        selectedDiskOfferingObj = this;
-                                                        return false; //break the $.each() loop
-                                                    }
-                                                });
-                                                if (selectedDiskOfferingObj == null){
-                                                    return;
-                                                }
-                                                var $form = $(this).closest('form');
-                                                var $diskSize = $form.find('.form-item[rel=diskSize]');
-                                                if (selectedDiskOfferingObj.iscustomized == true) {
-                                                    $diskSize.css('display', 'inline-block');
-                                                } else {
-                                                    $diskSize.hide();
-                                                }
-                                                var $minIops = $form.find('.form-item[rel=minIops]');
-                                                var $maxIops = $form.find('.form-item[rel=maxIops]');
-                                                if (selectedDiskOfferingObj.iscustomizediops == true) {
-                                                    $minIops.css('display', 'inline-block');
-                                                    $maxIops.css('display', 'inline-block');
-                                                } else {
-                                                    $minIops.hide();
-                                                    $maxIops.hide();
-                                                }
-                                            });
-                                        }
-                                    }
-
-                                    ,
-                                    diskSize: {
-                                        label: 'label.disk.size.gb',
-                                        docID: 'helpVolumeSizeGb',
-                                        validation: {
-                                            required: true,
-                                            number: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    minIops: {
-                                        label: 'label.disk.iops.min',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    maxIops: {
-                                        label: 'label.disk.iops.max',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        },
-                                        isHidden: true
-                                    }
-
-                                }
-                            },
-
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.name,
-                                    zoneId: args.data.availabilityZone,
-                                    diskOfferingId: args.data.diskOffering
-                                };
-
-                                // if(thisDialog.find("#size_container").css("display") != "none") { //wait for Brian to include $form in args
-                                if (selectedDiskOfferingObj.iscustomized == true) {
-                                    $.extend(data, {
-                                        size: args.data.diskSize
-                                    });
-                                }
-
-                                if (selectedDiskOfferingObj.iscustomizediops == true) {
-                                    if (args.data.minIops != "" && args.data.minIops > 0) {
-                                        $.extend(data, {
-                                            miniops: args.data.minIops
-                                        });
-                                    }
-
-                                    if (args.data.maxIops != "" && args.data.maxIops > 0) {
-                                        $.extend(data, {
-                                            maxiops: args.data.maxIops
-                                        });
-                                    }
-                                }
-
-                                $.ajax({
-                                    url: createURL('createVolume'),
-                                    data: data,
-                                    success: function(json) {
-                                        var jid = json.createvolumeresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.volume;
-                                                },
-                                                getActionFilter: function() {
-                                                    return volumeActionfilter;
-                                                }
-                                            }
-                                        });
-                                    },
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        },
-
-                        viewMetrics: {
-                            label: 'label.metrics',
-                            isHeader: true,
-                            addRow: false,
-                            action: {
-                                custom: cloudStack.uiCustom.metricsView({resource: 'volumes'})
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.metrics';
-                                }
-                            }
-                        },
-
-                        uploadVolume: {
-                            isHeader: true,
-                            label: 'label.upload',
-                            preFilter: function(args) {
-                                return !args.context.instances;
-                            },
-                            messages: {
-                                notification: function() {
-                                    return 'label.upload.volume.from.url';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.upload.volume.from.url',
-                                fields: {
-                                    url: {
-                                        label: 'label.url',
-                                        docID: 'helpUploadVolumeURL',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpUploadVolumeName'
-                                    },
-                                    availabilityZone: {
-                                        label: 'label.availability.zone',
-                                        docID: 'helpUploadVolumeZone',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones&available=true"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    args.response.success({
-                                                        descriptionField: 'name',
-                                                        data: zoneObjs
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    format: {
-                                        label: 'label.format',
-                                        docID: 'helpUploadVolumeFormat',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'RAW',
-                                                description: 'RAW'
-                                            });
-                                            items.push({
-                                                id: 'VHD',
-                                                description: 'VHD'
-                                            });
-                                            items.push({
-                                                id: 'VHDX',
-                                                description: 'VHDX'
-                                            });
-                                            items.push({
-                                                id: 'OVA',
-                                                description: 'OVA'
-                                            });
-                                            items.push({
-                                                id: 'QCOW2',
-                                                description: 'QCOW2'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-
-                                    },
-                                    diskOffering: {
-                                        label: 'label.custom.disk.offering',
-                                        docID: 'helpVolumeDiskOffering',
-                                        select: function(args) {
-                                            var diskOfferings = cloudStack.listDiskOfferings({});
-                                            var items = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            $(diskOfferings).each(function() {
-                                                if (this.iscustomized == true) {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.name
-                                                    });
-                                                }
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    checksum: {
-                                        docID: 'helpUploadVolumeChecksum',
-                                        label: 'label.md5.checksum'
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.name,
-                                    zoneId: args.data.availabilityZone,
-                                    format: args.data.format,
-                                    url: args.data.url
-                                };
-
-                                if (args.data.diskOffering != '' && args.data.diskOffering.length > 0) {
-                                    $.extend(data, {
-                                        diskofferingid: args.data.diskOffering
-                                    });
-                                }
-
-                                if (args.data.checksum != null && args.data.checksum.length > 0) {
-                                    $.extend(data, {
-                                        checksum: args.data.checksum
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('uploadVolume'),
-                                    data: data,
-                                    success: function(json) {
-                                        var jid = json.uploadvolumeresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.volume;
-                                                },
-                                                getActionFilter: function() {
-                                                    return volumeActionfilter;
-                                                }
-                                            }
-                                        });
-                                    },
-                                    error: function(json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        },
-
-                        uploadVolumefromLocal: {
-                            isHeader: true,
-                            label: 'label.upload.from.local',
-                            preFilter: function(args) {
-                                return !args.context.instances;
-                            },
-                            messages: {
-                                notification: function() {
-                                    return 'label.upload.volume.from.local';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.upload.volume.from.local',
-                                fileUpload: {
-                                    getURL: function(args) {
-                                        args.data = args.formData;
-
-                                        var data = {
-                                            name: args.data.name,
-                                            zoneId: args.data.availabilityZone,
-                                            format: args.data.format,
-                                            url: args.data.url
-                                        };
-
-                                        if (args.data.checksum != null && args.data.checksum.length > 0) {
-                                            $.extend(data, {
-                                                checksum: args.data.checksum
-                                            });
-                                        }
-
-                                        $.ajax({
-                                            url: createURL('getUploadParamsForVolume'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                var uploadparams = json.postuploadvolumeresponse.getuploadparams; //son.postuploadvolumeresponse.getuploadparams is an object, not an array of object.
-                                                var volumeId = uploadparams.id;
-
-                                                args.response.success({
-                                                    url: uploadparams.postURL,
-                                                    ajaxPost: true,
-                                                    data: {
-                                                        'X-signature': uploadparams.signature,
-                                                        'X-expires': uploadparams.expires,
-                                                        'X-metadata': uploadparams.metadata
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    postUpload: function(args) {
-                                        if(args.error) {
-                                            args.response.error(args.errorMsg);
-                                        } else {
-                                            cloudStack.dialog.notice({
-                                                message: "This volume file has been uploaded. Please check its status at Stroage menu > Volumes > " + args.data.name + " > Status field."
-                                            });
-                                            args.response.success();
-                                        }
-                                    }
-                                },
-                                fields: {
-                                    volumeFileUpload: {
-                                        label: 'label.local.file',
-                                        isFileUpload: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        },
-                                        docID: 'helpUploadVolumeName'
-                                    },
-                                    availabilityZone: {
-                                        label: 'label.availability.zone',
-                                        docID: 'helpUploadVolumeZone',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones&available=true"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    args.response.success({
-                                                        descriptionField: 'name',
-                                                        data: zoneObjs
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    format: {
-                                        label: 'label.format',
-                                        docID: 'helpUploadVolumeFormat',
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'RAW',
-                                                description: 'RAW'
-                                            });
-                                            items.push({
-                                                id: 'VHD',
-                                                description: 'VHD'
-                                            });
-                                            items.push({
-                                                id: 'VHDX',
-                                                description: 'VHDX'
-                                            });
-                                            items.push({
-                                                id: 'OVA',
-                                                description: 'OVA'
-                                            });
-                                            items.push({
-                                                id: 'QCOW2',
-                                                description: 'QCOW2'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    checksum: {
-                                        docID: 'helpUploadVolumeChecksum',
-                                        label: 'label.md5.checksum'
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                return; //createForm.fileUpload.getURL() has executed the whole action. Therefore, nothing needs to be done here.
-                            },
-
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    advSearchFields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        zoneid: {
-                            label: 'label.zone',
-                            select: function(args) {
-                                $.ajax({
-                                    url: createURL('listZones'),
-                                    data: {},
-                                    success: function(json) {
-                                        var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                        args.response.success({
-                                            data: $.map(zones, function(zone) {
-                                                return {
-                                                    id: zone.id,
-                                                    description: zone.name
-                                                };
-                                            })
-                                        });
-                                    }
-                                });
-                            }
-                        },
-
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        account: {
-                            label: 'label.account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        state: {
-                            label: 'label.state',
-                            select: function(args) {
-                                args.response.success({
-                                    data: [{
-                                        name: '',
-                                        description: ''
-                                    }, {
-                                        name: 'Allocated',
-                                        description: 'state.Allocated'
-                                    }, {
-                                        name: 'Ready',
-                                        description: 'state.Ready'
-                                    }, {
-                                        name: 'Destroy',
-                                        description: 'state.Destroy'
-                                    }, {
-                                        name: 'Expunging',
-                                        description: 'state.Expunging'
-                                    }, {
-                                        name: 'Expunged',
-                                        description: 'state.Expunged'
-                                    }]
-                                });
-                            }
-                        },
-
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-
-                        if (args.context != null) {
-                            if ("instances" in args.context) {
-                                $.extend(data, {
-                                    virtualMachineId: args.context.instances[0].id
-                                });
-                            }
-                            if ("primarystorages" in args.context) {
-                                $.extend(data, {
-                                    storageid: args.context.primarystorages[0].id
-                                });
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL('listVolumes'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listvolumesresponse.volume;
-                                args.response.success({
-                                    actionFilter: volumeActionfilter,
-                                    data: items
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                cloudStack.dialog.notice({
-                                    message: parseXMLHttpResponse(XMLHttpResponse)
-                                });
-                                args.response.error();
-                             }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.volume.details',
-                        viewAll: {
-                            path: 'storage.snapshots',
-                            label: 'label.snapshots'
-                        },
-                        actions: {
-                            migrateVolume: {
-                                label: 'label.migrate.volume',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.migrate.volume';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.volume.migrated';
-                                    }
-                                },
-
-                                createForm: migrateVolumeCreateFormAction,
-
-                                action: functionMigrateVolume,
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-
-                            },
-
-                            takeSnapshot: {
-                                label: 'label.action.take.snapshot',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.take.snapshot';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.take.snapshot',
-                                    desc: 'message.action.take.snapshot',
-                                    fields: {
-                                        quiescevm: {
-                                            label: 'label.quiesce.vm',
-                                            isBoolean: true,
-                                            isHidden: function(args) {
-                                                if (args.context.volumes[0].quiescevm == true)
-                                                    return false;
-                                                        else
-                                                    return true;
-                                            }
-                                        },
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        asyncBackup: {
-                                            label: 'label.async.backup',
-                                            isBoolean: true
-                                        },
-                                        tags: {
-                                            label: 'label.tags',
-                                            tagger: true
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        volumeId: args.context.volumes[0].id,
-                                        quiescevm: (args.data.quiescevm == 'on' ? true: false),
-                                        asyncBackup: (args.data.asyncBackup == 'on' ? true: false)
-                                    };
-                                    if (args.data.name != null && args.data.name.length > 0) {
-                                        $.extend(data, {
-                                            name: args.data.name
-                                        });
-                                    }
-                                    if (!$.isEmptyObject(args.data.tags)) {
-                                        $(args.data.tags).each(function(idx, tagData) {
-                                            var formattedTagData = {};
-                                            formattedTagData["tags[" + _s(idx) + "].key"] = _s(tagData.key);
-                                            formattedTagData["tags[" + _s(idx) + "].value"] = _s(tagData.value);
-                                            $.extend(data, formattedTagData);
-                                        });
-                                    }
-
-                                    $.ajax({
-                                        url: createURL("createSnapshot"),
-                                        data: data,
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.createsnapshotresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid, //take snapshot from a volume doesn't change any property in this volume. So, don't need to specify getUpdatedItem() to return updated volume. Besides, createSnapshot API doesn't return updated volume.
-                                                    onComplete: function(json, customData) {
-                                                        var volumeId = json.queryasyncjobresultresponse.jobresult.snapshot.volumeid;
-                                                        var snapshotId = json.queryasyncjobresultresponse.jobresult.snapshot.id;
-                                                        cloudStack.dialog.notice({
-                                                            message: "Created snapshot for volume " + volumeId + " with snapshot ID " + snapshotId
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            recurringSnapshot: {
-                                label: 'label.snapshot.schedule',
-                                action: {
-                                    custom: cloudStack.uiCustom.recurringSnapshots({
-                                        desc: 'message.snapshot.schedule',
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL('listSnapshotPolicies'),
-                                                data: {
-                                                    volumeid: args.context.volumes[0].id
-                                                },
-                                                async: true,
-                                                dataType: 'json',
-                                                success: function(data) {
-                                                    args.response.success({
-                                                        data: $.map(
-                                                            data.listsnapshotpoliciesresponse.snapshotpolicy ? data.listsnapshotpoliciesresponse.snapshotpolicy : [],
-                                                            function(snapshot, index) {
-                                                                return {
-                                                                    id: snapshot.id,
-                                                                    type: snapshot.intervaltype,
-                                                                    time: snapshot.intervaltype > 0 ? snapshot.schedule.split(':')[1] + ':' + snapshot.schedule.split(':')[0] : snapshot.schedule,
-                                                                    timezone: snapshot.timezone,
-                                                                    keep: snapshot.maxsnaps,
-                                                                    'day-of-week': snapshot.intervaltype == 2 ? snapshot.schedule.split(':')[2] : null,
-                                                                    'day-of-month': snapshot.intervaltype == 3 ? snapshot.schedule.split(':')[2] : null
-                                                                };
-                                                            }
-                                                        )
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        actions: {
-                                            add: function(args) {
-                                                var snap = args.snapshot;
-
-                                                var data = {
-                                                    volumeid: args.context.volumes[0].id,
-                                                    intervaltype: snap['snapshot-type'],
-                                                    maxsnaps: snap.maxsnaps,
-                                                    timezone: snap.timezone
-                                                };
-
-                                                var convertTime = function(minute, hour, meridiem, extra) {
-                                                    var convertedHour = meridiem == 'PM' ?
-                                                        (hour != 12 ? parseInt(hour) + 12 : 12) : (hour != 12 ? hour : '00');
-                                                    var time = minute + ':' + convertedHour;
-                                                    if (extra) time += ':' + extra;
-
-                                                    return time;
-                                                };
-
-                                                switch (snap['snapshot-type']) {
-                                                    case 'hourly': // Hourly
-                                                        $.extend(data, {
-                                                            schedule: snap.schedule
-                                                        });
-                                                        break;
-
-                                                    case 'daily': // Daily
-                                                        $.extend(data, {
-                                                            schedule: convertTime(
-                                                                snap['time-minute'],
-                                                                snap['time-hour'],
-                                                                snap['time-meridiem']
-                                                            )
-                                                        });
-                                                        break;
-
-                                                    case 'weekly': // Weekly
-                                                        $.extend(data, {
-                                                            schedule: convertTime(
-                                                                snap['time-minute'],
-                                                                snap['time-hour'],
-                                                                snap['time-meridiem'],
-                                                                snap['day-of-week']
-                                                            )
-                                                        });
-                                                        break;
-
-                                                    case 'monthly': // Monthly
-                                                        $.extend(data, {
-                                                            schedule: convertTime(
-                                                                snap['time-minute'],
-                                                                snap['time-hour'],
-                                                                snap['time-meridiem'],
-                                                                snap['day-of-month']
-                                                            )
-                                                        });
-                                                        break;
-                                                }
-
-                                                if (!$.isEmptyObject(snap.tags)) {
-                                                    $(snap.tags).each(function(idx, tagData) {
-                                                        var formattedTagData = {};
-                                                        formattedTagData["tags[" + _s(idx) + "].key"] = _s(tagData.key);
-                                                        formattedTagData["tags[" + _s(idx) + "].value"] = _s(tagData.value);
-                                                        $.extend(data, formattedTagData);
-                                                    });
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('createSnapshotPolicy'),
-                                                    data: data,
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(successData) {
-                                                        var snapshot = successData.createsnapshotpolicyresponse.snapshotpolicy;
-
-                                                        args.response.success({
-                                                            data: {
-                                                                id: snapshot.id,
-                                                                type: snapshot.intervaltype,
-                                                                time: snapshot.intervaltype > 0 ? snapshot.schedule.split(':')[1] + ':' + snapshot.schedule.split(':')[0] : snapshot.schedule,
-                                                                timezone: snapshot.timezone,
-                                                                keep: snapshot.maxsnaps,
-                                                                'day-of-week': snapshot.intervaltype == 2 ? snapshot.schedule.split(':')[2] : null,
-                                                                'day-of-month': snapshot.intervaltype == 3 ? snapshot.schedule.split(':')[2] : null
-                                                            }
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            remove: function(args) {
-                                                $.ajax({
-                                                    url: createURL('deleteSnapshotPolicies'),
-                                                    data: {
-                                                        id: args.snapshot.id
-                                                    },
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(data) {
-                                                        args.response.success();
-                                                    }
-                                                });
-                                            }
-                                        },
-
-                                        // Select data
-                                        selects: {
-                                            schedule: function(args) {
-                                                var time = [];
-
-                                                for (var i = 1; i <= 59; i++) {
-                                                    time.push({
-                                                        id: i,
-                                                        name: i
-                                                    });
-                                                }
-
-                                                args.response.success({
-                                                    data: time
-                                                });
-                                            },
-                                            timezone: function(args) {
-                                                args.response.success({
-                                                    data: $.map(timezoneMap, function(value, key) {
-                                                        return {
-                                                            id: key,
-                                                            name: value
-                                                        };
-                                                    })
-                                                });
-                                            },
-                                            'day-of-week': function(args) {
-                                                args.response.success({
-                                                    data: [{
-                                                        id: 1,
-                                                        name: 'label.sunday'
-                                                    }, {
-                                                        id: 2,
-                                                        name: 'label.monday'
-                                                    }, {
-                                                        id: 3,
-                                                        name: 'label.tuesday'
-                                                    }, {
-                                                        id: 4,
-                                                        name: 'label.wednesday'
-                                                    }, {
-                                                        id: 5,
-                                                        name: 'label.thursday'
-                                                    }, {
-                                                        id: 6,
-                                                        name: 'label.friday'
-                                                    }, {
-                                                        id: 7,
-                                                        name: 'label.saturday'
-                                                    }]
-                                                });
-                                            },
-
-                                            'day-of-month': function(args) {
-                                                var time = [];
-
-                                                for (var i = 1; i <= 28; i++) {
-                                                    time.push({
-                                                        id: i,
-                                                        name: i
-                                                    });
-                                                }
-
-                                                args.response.success({
-                                                    data: time
-                                                });
-                                            },
-
-                                            'time-hour': function(args) {
-                                                var time = [];
-
-                                                for (var i = 1; i <= 12; i++) {
-                                                    time.push({
-                                                        id: i,
-                                                        name: i
-                                                    });
-                                                }
-
-                                                args.response.success({
-                                                    data: time
-                                                });
-                                            },
-
-                                            'time-minute': function(args) {
-                                                var time = [];
-
-                                                for (var i = 0; i <= 59; i++) {
-                                                    time.push({
-                                                        id: i < 10 ? '0' + i : i,
-                                                        name: i < 10 ? '0' + i : i
-                                                    });
-                                                }
-
-                                                args.response.success({
-                                                    data: time
-                                                });
-                                            },
-
-                                            'time-meridiem': function(args) {
-                                                args.response.success({
-                                                    data: [{
-                                                        id: 'AM',
-                                                        name: 'AM'
-                                                    }, {
-                                                        id: 'PM',
-                                                        name: 'PM'
-                                                    }]
-                                                });
-                                            }
-                                        }
-                                    })
-                                },
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.snapshot.schedule';
-                                    }
-                                }
-                            },
-
-                            attachDisk: {
-                                addRow: 'false',
-                                label: 'label.action.attach.disk',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.attach.disk';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.attach.disk';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.attach.disk',
-                                    desc: 'label.action.attach.disk',
-                                    fields: {
-                                        virtualMachineId: {
-                                            label: 'label.instance',
-                                            select: function(args) {
-                                                var zoneid = args.context.volumes[0].zoneid;
-                                                var items = [];
-                                                var data;
-
-                                                if (!args.context.projects) {
-                                                    data = {
-                                                        zoneid: zoneid,
-                                                        domainid: args.context.volumes[0].domainid,
-                                                        account: args.context.volumes[0].account
-                                                    };
-                                                } else {
-                                                    data = {
-                                                        zoneid: zoneid,
-                                                        projectid: args.context.projects[0].id
-                                                    };
-                                                }
-
-                                                if (args.context.volumes[0].hypervisor != null && args.context.volumes[0].hypervisor.length > 0 && args.context.volumes[0].hypervisor != 'None') {
-                                                    data = $.extend(data, {
-                                                        hypervisor: args.context.volumes[0].hypervisor
-                                                    });
-                                                }
-
-                                                $(['Running', 'Stopped']).each(function() {
-                                                    $.ajax({
-                                                        url: createURL('listVirtualMachines'),
-                                                        data: $.extend(data, {
-                                                            state: this.toString()
-                                                        }),
-                                                        async: false,
-                                                        success: function(json) {
-                                                            var instanceObjs = json.listvirtualmachinesresponse.virtualmachine;
-                                                            $(instanceObjs).each(function() {
-                                                                items.push({
-                                                                    id: this.id,
-                                                                    description: this.displayname ? this.displayname : this.name
-                                                                });
-                                                            });
-                                                        }
-                                                    });
-                                                });
-
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("attachVolume&id=" + args.context.volumes[0].id + '&virtualMachineId=' + args.data.virtualMachineId),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.attachvolumeresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.volume;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return volumeActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            detachDisk: {
-                                label: 'label.action.detach.disk',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.detach.disk';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.detach.disk';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("detachVolume&id=" + args.context.volumes[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.detachvolumeresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return {
-                                                            virtualmachineid: null,
-                                                            vmdisplayname: null
-                                                        };
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return volumeActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            downloadVolume: {
-                                label: 'label.action.download.volume',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.download.volume.confirm';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.download.volume';
-                                    },
-                                    complete: function(args) {
-                                        var url = args.url;
-                                        var htmlMsg = _l('message.download.volume');
-                                        var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
-                                        //$infoContainer.find("#info").html(htmlMsg2);
-                                        return htmlMsg2;
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("extractVolume&id=" + args.context.volumes[0].id + "&zoneid=" + args.context.volumes[0].zoneid + "&mode=HTTP_DOWNLOAD"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.extractvolumeresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.volume;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return volumeActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            createTemplate: cloudStack.createTemplateMethod(false),
-                            migrateToAnotherStorage: {
-                                label: 'label.migrate.volume.to.primary.storage',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.migrate.volume';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.migrate.volume.to.primary.storage';
-                                    }
-                                },
-                                createForm: $.extend({}, migrateVolumeCreateFormAction, {title: 'label.migrate.volume.to.primary.storage'}),
-                                action: functionMigrateVolume,
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.volume',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.volume';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.volume';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteVolume&id=" + args.context.volumes[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            args.response.success();
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            destroy: {
-                                label: 'label.action.destroy.volume',
-                                createForm: {
-                                    title: 'label.action.destroy.volume',
-                                    desc: 'message.action.destroy.volume',
-                                    isWarning: true,
-                                    preFilter: function(args) {
-                                        if (!isAdmin() && ! g_allowUserExpungeRecoverVolume) {
-                                            args.$form.find('.form-item[rel=expunge]').hide();
-                                        }
-                                    },
-                                    fields: {
-                                        expunge: {
-                                            label: 'label.expunge',
-                                            isBoolean: true,
-                                            isChecked: false
-                                        }
-                                    }
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.destroy.volume';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.destroy.volume';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.volumes[0].id
-                                    };
-                                    if (args.data.expunge == 'on') {
-                                        $.extend(data, {
-                                            expunge: true
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL("destroyVolume"),
-                                        data: data,
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.destroyvolumeresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        if ('volume' in json.queryasyncjobresultresponse.jobresult) { //destroy without expunge
-                                                            var volume = json.queryasyncjobresultresponse.jobresult.volume;
-                                                            if (volume.state == 'Expunged') {
-                                                                return { 'toRemove': true };
-                                                            } else {
-                                                                return volume;
-                                                            }
-                                                        } else //destroy with expunge
-                                                            return { 'toRemove': true };
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return volumeActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            recover: {
-                                label: 'label.action.recover.volume',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.recover.volume';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.recover.volume';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("recoverVolume&id=" + args.context.volumes[0].id),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            args.response.success();
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function(args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            resize: {
-                                label: 'label.action.resize.volume',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.action.resize.volume';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.resize.volume',
-                                    preFilter: function(args) {
-                                        var vol;
-                                        if (args.context.volumes != null) vol = args.context.volumes[0];
-                                        if (vol.type == "ROOT" && (vol.hypervisor == "XenServer" || vol.hypervisor == "KVM" || vol.hypervisor == "VMware")) {
-                                            args.$form.find('.form-item[rel=newdiskoffering]').hide();
-                                            args.$form.find('.form-item[rel=newsize]').css('display', 'inline-block');
-                                        } else {
-                                            args.$form.find('.form-item[rel=newdiskoffering]').css('display', 'inline-block');
-                                            args.$form.find('.form-item[rel=newsize]').hide();
-                                        }
-                                    },
-                                    fields: {
-                                        newdiskoffering: {
-                                            label: 'label.resize.new.offering.id',
-                                            isHidden: true,
-                                            select: function(args) {
-                                                if (args.context.volumes != null && args.context.volumes[0].type == 'ROOT') {
-                                                    args.response.success({
-                                                        data: []
-                                                    });
-                                                    return;
-                                                }
-                                                var diskOfferings = cloudStack.listDiskOfferings({});
-                                                var items = [];
-                                                $(diskOfferings).each(function() {
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.displaytext
-                                                    });
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                                args.$select.change(function() {
-                                                    if(args.context.volumes[0].type == "ROOT") {
-                                                        selectedDiskOfferingObj = null;
-                                                        return;
-                                                    }
-
-                                                    var diskOfferingId = $(this).val();
-                                                    $(diskOfferings).each(function() {
-                                                        if (this.id == diskOfferingId) {
-                                                            selectedDiskOfferingObj = this;
-                                                            return false; //break the $.each() loop
-                                                        }
-                                                    });
-                                                    if (selectedDiskOfferingObj == null){
-                                                        return;
-                                                    }
-                                                    var $form = $(this).closest('form');
-
-                                                    var $shrinkok = $form.find('.form-item[rel=shrinkok]');
-                                                    //unit of args.context.volumes[0].size is "byte"
-                                                    //unit of selectedDiskOfferingObj.disksize is "gigabyte" ("GB"), so transfer it into "byte" by multiply (1024 * 1024 * 1024)
-                                                    if (args.context.volumes[0].size > selectedDiskOfferingObj.disksize * (1024 * 1024 * 1024)) { //if original disk size  > new disk size
-                                                        $shrinkok.css('display', 'inline-block');
-                                                    } else {
-                                                        $shrinkok.hide();
-                                                    }
-
-                                                    var $newsize = $form.find('.form-item[rel=newsize]');
-                                                    if (selectedDiskOfferingObj.iscustomized == true) {
-                                                        $newsize.css('display', 'inline-block');
-                                                    } else {
-                                                        $newsize.hide();
-                                                    }
-
-                                                    var $minIops = $form.find('.form-item[rel=minIops]');
-                                                    var $maxIops = $form.find('.form-item[rel=maxIops]');
-                                                    if (selectedDiskOfferingObj.iscustomizediops == true) {
-                                                        $minIops.css('display', 'inline-block');
-                                                        $maxIops.css('display', 'inline-block');
-                                                    } else {
-                                                        $minIops.hide();
-                                                        $maxIops.hide();
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        newsize: {
-                                            label: 'label.resize.new.size',
-                                            validation: {
-                                                required: true,
-                                                number: true
-                                            }
-                                        },
-                                        shrinkok: {
-                                            label: 'label.resize.shrink.ok',
-                                            isBoolean: true,
-                                            isChecked: false,
-                                            isHidden: true
-                                        },
-                                        minIops: {
-                                            label: 'label.disk.iops.min',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            },
-                                            isHidden: true
-                                        },
-                                        maxIops: {
-                                            label: 'label.disk.iops.max',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            },
-                                            isHidden: true
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var array1 = [];
-                                    if(args.$form.find('.form-item[rel=shrinkok]').css("display") != "none") {
-                                        array1.push("&shrinkok=" + (args.data.shrinkok == "on"));
-                                    }
-
-                                    var newDiskOffering = args.data.newdiskoffering;
-                                    if (newDiskOffering != null && newDiskOffering.length > 0) {
-                                        array1.push("&diskofferingid=" + encodeURIComponent(newDiskOffering));
-                                    }
-                                    if (args.context.volumes[0].type == "ROOT" || selectedDiskOfferingObj.iscustomized == true) {
-                                        cloudStack.addNewSizeToCommandUrlParameterArrayIfItIsNotNullAndHigherThanZero(array1, args.data.newsize);
-                                    }
-
-                                    var minIops;
-                                    var maxIops
-                                    if (selectedDiskOfferingObj != null && selectedDiskOfferingObj.iscustomizediops == true) {
-                                        minIops = args.data.minIops;
-                                        maxIops = args.data.maxIops;
-                                    }
-
-                                    if (minIops != null && minIops.length > 0) {
-                                        array1.push("&miniops=" + encodeURIComponent(minIops));
-                                    }
-
-                                    if (maxIops != null && maxIops.length > 0) {
-                                        array1.push("&maxiops=" + encodeURIComponent(maxIops));
-                                    }
-                                    //if original disk size > new disk size
-                                    if (args.context.volumes[0].type == "ROOT" &&
-                                        args.context.volumes[0].size > (args.data.newsize * (1024 * 1024 * 1024))) {
-                                        return args.response.error('message.volume.root.shrink.disk.size');
-                                    }
-
-                                    $.ajax({
-                                        url: createURL("resizeVolume&id=" + args.context.volumes[0].id + array1.join("")),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.resizevolumeresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.volume;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return volumeActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                preFilter: function(args) {
-                                    var hiddenFields;
-                                    if (isAdmin()) {
-                                        hiddenFields = [];
-                                    } else {
-                                        hiddenFields = ['storage', 'hypervisor', 'virtualsize', 'physicalsize', 'utilization', 'clusterid', 'clustername'];
-                                    }
-                                    return hiddenFields;
-                                },
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    state: {
-                                        label: 'label.state',
-                                        pollAgainIfValueIsIn: {
-                                            'UploadNotStarted': 1
-                                        },
-                                        pollAgainFn: function(context) {
-                                            var toClearInterval = false;
-                                            $.ajax({
-                                                url: createURL("listVolumes&id=" + context.volumes[0].id),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var jsonObj = json.listvolumesresponse.volume[0];
-                                                    if (jsonObj.state != context.volumes[0].state) {
-                                                        toClearInterval = true; //to clear interval
-                                                    }
-                                                }
-                                            });
-                                            return toClearInterval;
-                                        }
-                                    },
-                                    status: {
-                                        label: 'label.status'
-                                    },
-                                    diskofferingdisplaytext: {
-                                        label: 'label.disk.offering'
-                                    },
-                                    type: {
-                                        label: 'label.type'
-                                    },
-                                    storagetype: {
-                                        label: 'label.storage.type'
-                                    },
-                                    provisioningtype: {
-                                        label: 'label.disk.provisioningtype'
-                                    },
-                                    hypervisor: {
-                                        label: 'label.hypervisor'
-                                    },
-                                    size: {
-                                        label: 'label.size',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    clusterid: {
-                                        label: 'label.cluster'
-                                    },
-                                    clustername: {
-                                        label: 'label.cluster.name'
-                                    },
-                                    physicalsize: {
-                                        label: 'label.disk.physicalsize',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    utilization: {
-                                        label: 'label.disk.utilisation'
-                                    },
-                                    virtualsize: {
-                                        label: 'label.disk.virtualsize',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    miniops: {
-                                        label: 'label.disk.iops.min',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return args;
-                                        }
-                                    },
-                                    maxiops: {
-                                        label: 'label.disk.iops.max',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return args;
-                                        }
-                                    },
-                                    virtualmachineid: {
-                                        label: 'label.vm.id',
-                                        converter: function(args) {
-                                            if (args == null)
-                                                return _l('state.detached');
-                                            else
-                                                return args;
-                                        }
-                                    },
-                                    //vmname: { label: 'label.vm.name' },
-                                    vmdisplayname: {
-                                        label: 'label.vm.display.name'
-                                    },
-                                    vmstate: {
-                                        label: 'label.vm.state'
-                                    },
-                                    deviceid: {
-                                        label: 'label.device.id'
-                                    },
-                                    storage: {
-                                        label: 'label.storage'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'Volume',
-                                    contextId: 'volumes'
-                                }),
-
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listVolumes&id=" + args.context.volumes[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jsonObj = json.listvolumesresponse.volume[0];
-
-                                            $(window).trigger('cloudStack.module.sharedFunctions.addExtraProperties', {
-                                                obj: jsonObj,
-                                                objType: "Volume"
-                                            });
-
-                                            args.response.success({
-                                                actionFilter: volumeActionfilter,
-                                                data: jsonObj
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            /**
-             * Snapshots
-             */
-            snapshots: {
-                type: 'select',
-                title: 'label.snapshots',
-                listView: {
-                    id: 'snapshots',
-                    label: 'label.snapshots',
-                    fields: {
-                        volumename: {
-                            label: 'label.volume'
-                        },
-                        name: {
-                            label: 'label.name'
-                        },
-                        intervaltype: {
-                            label: 'label.interval.type'
-                        },
-                        created: {
-                            label: 'label.created',
-                            converter: cloudStack.converters.toLocalDate
-                        },
-                        state: {
-                            label: 'label.state',
-                            indicator: {
-                                'BackedUp': 'on',
-                                'Destroyed': 'off'
-                            }
-                        }
-                    },
-
-                    advSearchFields: {
-                        name: {
-                            label: 'label.name'
-                        },
-
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        account: {
-                            label: 'label.account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        var instanceVolumeIds = [];
-                        listViewDataProvider(args, data);
-
-                        if (args.context != null) {
-                            if ("volumes" in args.context) {
-                                $.extend(data, {
-                                    volumeid: args.context.volumes[0].id
-                                });
-                            } else if (args.context.instances) {
-                                $.ajax({
-                                    url: createURL('listVolumes'),
-                                    data: {
-                                        virtualmachineid: args.context.instances[0].id,
-                                        listAll: true
-                                    },
-                                    async: false,
-                                    success: function(json) {
-                                        instanceVolumeIds = $.map(json.listvolumesresponse.volume, function(volume) {
-                                            return volume.id;
-                                        })
-                                    }
-                                });
-                                data.volumeid = instanceVolumeIds.join(',');
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL('listSnapshots'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listsnapshotsresponse.snapshot;
-                                args.response.success({
-                                    actionFilter: snapshotActionfilter,
-                                    data: items
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                cloudStack.dialog.notice({
-                                    message: parseXMLHttpResponse(XMLHttpResponse)
-                                });
-                                args.response.error();
-                             }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'Snapshot detail',
-                        actions: {
-                            createTemplate: cloudStack.createTemplateFromSnapshotMethod(),
-
-                            createVolume: {
-                                label: 'label.action.create.volume',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.create.volume';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.create.volume';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.create.volume',
-                                    desc: '',
-                                    preFilter: function(args) {
-                                        if (g_regionsecondaryenabled == true) {
-                                            args.$form.find('.form-item[rel=zoneid]').css('display', 'inline-block');
-                                        } else {
-                                            args.$form.find('.form-item[rel=zoneid]').hide();
-                                        }
-                                        if(args.context.snapshots[0].volumetype!='ROOT') {
-                                            args.$form.find('.form-item[rel=diskOffering]').hide();
-                                        }
-                                    },
-                                    fields: {
-                                        name: {
-                                            label: 'label.name',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        zoneid: {
-                                            label: 'label.availability.zone',
-                                            isHidden: true,
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listZones&available=true"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var zoneObjs = json.listzonesresponse.zone;
-                                                        var items = [{
-                                                            id: '',
-                                                            description: ''
-                                                        }];
-                                                        if (zoneObjs != null) {
-                                                            for (i = 0; i < zoneObjs.length; i++) {
-                                                                items.push({
-                                                                    id: zoneObjs[i].id,
-                                                                    description: zoneObjs[i].name
-                                                                });
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        diskOffering: {
-                                            label: 'label.disk.offering',
-                                            docID: 'helpVolumeDiskOffering',
-                                            select: function(args) {
-                                                var snapshotSizeInGB = Math.floor(args.context.snapshots[0].virtualsize/(1024 * 1024 * 1024))
-                                                $.ajax({
-                                                    url: createURL("listDiskOfferings"),
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function(json) {
-                                                        diskofferingObjs = json.listdiskofferingsresponse.diskoffering;
-                                                        var items = [];
-                                                        // Sort offerings list with size and keep custom offerings at end
-                                                        for(var i=0;i<diskofferingObjs.length;i++) {
-                                                            for(var j=i+1;j<diskofferingObjs.length;j++) {
-                                                                if((diskofferingObjs[i].disksize>diskofferingObjs[j].disksize &&
-                                                                    diskofferingObjs[j].disksize!=0) ||
-                                                                    (diskofferingObjs[i].disksize==0 &&
-                                                                        diskofferingObjs[j].disksize!=0)) {
-                                                                    var temp = diskofferingObjs[i];
-                                                                    diskofferingObjs[i] = diskofferingObjs[j];
-                                                                    diskofferingObjs[j] = temp;
-                                                                }
-                                                            }
-                                                        }
-                                                        $(diskofferingObjs).each(function() {
-                                                            if(this.disksize==0 || this.disksize>=snapshotSizeInGB) {
-                                                                items.push({
-                                                                    id: this.id,
-                                                                    description: this.displaytext
-                                                                });
-                                                            }
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-
-                                                args.$select.change(function() {
-                                                    var diskOfferingId = $(this).val();
-                                                    selectedDiskOfferingObj = null;
-                                                    $(diskofferingObjs).each(function() {
-                                                        if (this.id == diskOfferingId) {
-                                                            selectedDiskOfferingObj = this;
-                                                            return false;
-                                                        }
-                                                    });
-
-                                                    if (selectedDiskOfferingObj == null) return;
-
-                                                    var $form = $(this).closest('form');
-                                                    var $diskSize = $form.find('.form-item[rel=diskSize]');
-                                                    if (selectedDiskOfferingObj.iscustomized == true) {
-                                                        $diskSize.css('display', 'inline-block');
-                                                        $form.find('input[name=diskSize]').val(''+snapshotSizeInGB);
-                                                    } else {
-                                                        $diskSize.hide();
-                                                    }
-
-                                                    var $minIops = $form.find('.form-item[rel=minIops]');
-                                                    var $maxIops = $form.find('.form-item[rel=maxIops]');
-                                                    if (selectedDiskOfferingObj.iscustomizediops == true) {
-                                                        $minIops.css('display', 'inline-block');
-                                                        $maxIops.css('display', 'inline-block');
-                                                    } else {
-                                                        $minIops.hide();
-                                                        $maxIops.hide();
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        diskSize: {
-                                            label: 'label.disk.size.gb',
-                                            docID: 'helpVolumeSizeGb',
-                                            validation: {
-                                                required: true,
-                                                number: true
-                                            },
-                                            isHidden: true
-                                        },
-                                        minIops: {
-                                            label: 'label.disk.iops.min',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            },
-                                            isHidden: true
-                                        },
-                                        maxIops: {
-                                            label: 'label.disk.iops.max',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            },
-                                            isHidden: true
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        name: args.data.name,
-                                        snapshotid: args.context.snapshots[0].id
-                                    };
-
-                                    if (args.$form.find('.form-item[rel=zoneid]').css("display") != "none" && args.data.zoneid != '') {
-                                        $.extend(data, {
-                                            zoneId: args.data.zoneid
-                                        });
-                                    }
-
-                                    if (args.$form.find('.form-item[rel=diskOffering]').css("display") != "none") {
-                                        if (args.data.diskOffering) {
-                                            $.extend(data, {
-                                                diskofferingid: args.data.diskOffering
-                                            });
-                                        }
-                                        if (selectedDiskOfferingObj) {
-                                            if(selectedDiskOfferingObj.iscustomized == true) {
-                                                $.extend(data, {
-                                                    size: args.data.diskSize
-                                                });
-                                            }
-
-                                            if (selectedDiskOfferingObj.iscustomizediops == true) {
-                                                if (args.data.minIops != "" && args.data.minIops > 0) {
-                                                    $.extend(data, {
-                                                        miniops: args.data.minIops
-                                                    });
-                                                }
-
-                                                if (args.data.maxIops != "" && args.data.maxIops > 0) {
-                                                    $.extend(data, {
-                                                        maxiops: args.data.maxIops
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('createVolume'),
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.createvolumeresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return {}; //nothing in this snapshot needs to be updated
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return snapshotActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            revertSnapshot: {
-                                label: 'label.action.revert.snapshot',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.revert.snapshot';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.revert.snapshot';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("revertSnapshot&id="+args.context.snapshots[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.revertsnapshotresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.delete.snapshot',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.delete.snapshot';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.delete.snapshot';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteSnapshot&id=" + args.context.snapshots[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.deletesnapshotresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    volumename: {
-                                        label: 'label.volume.name'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    intervaltype: {
-                                        label: 'label.interval.type'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'Snapshot',
-                                    contextId: 'snapshots'
-                                }),
-
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listSnapshots&id=" + args.context.snapshots[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jsonObj = json.listsnapshotsresponse.snapshot[0];
-                                            args.response.success({
-                                                actionFilter: snapshotActionfilter,
-                                                data: jsonObj
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                },
-            },
-
-            /**
-             * VM Snapshots
-             */
-            vmsnapshots: {
-                type: 'select',
-                title: 'label.vmsnapshot',
-                listView: {
-                    id: 'vmsnapshots',
-                    isMaximized: true,
-                    fields: {
-                        displayname: {
-                            label: 'label.name'
-                        },
-                        state: {
-                            label: 'label.state',
-                            indicator: {
-                                'Ready': 'on',
-                                'Error': 'off'
-                            }
-                        },
-                        type: {
-                            label: 'label.vmsnapshot.type'
-                        },
-                        current: {
-                            label: 'label.vmsnapshot.current',
-                            converter: cloudStack.converters.toBooleanText
-                        },
-                        parentName: {
-                            label: 'label.vmsnapshot.parentname'
-                        },
-                        created: {
-                            label: 'label.date',
-                            converter: cloudStack.converters.toLocalDate
-                        }
-                    },
-
-                    advSearchFields: {
-                        name: {
-                            label: 'label.name'
-                        },
-
-                        domainid: {
-                            label: 'label.domain',
-                            select: function(args) {
-                                if (isAdmin() || isDomainAdmin()) {
-                                    $.ajax({
-                                        url: createURL('listDomains'),
-                                        data: {
-                                            listAll: true,
-                                            details: 'min'
-                                        },
-                                        success: function(json) {
-                                            var array1 = [{
-                                                id: '',
-                                                description: ''
-                                            }];
-                                            var domains = json.listdomainsresponse.domain;
-                                            if (domains != null && domains.length > 0) {
-                                                for (var i = 0; i < domains.length; i++) {
-                                                    array1.push({
-                                                        id: domains[i].id,
-                                                        description: domains[i].path
-                                                    });
-                                                }
-                                            }
-                                            array1.sort(function(a, b) {
-                                                return a.description.localeCompare(b.description);
-                                            });
-                                            args.response.success({
-                                                data: array1
-                                            });
-                                        }
-                                    });
-                                } else {
-                                    args.response.success({
-                                        data: null
-                                    });
-                                }
-                            },
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-
-                        account: {
-                            label: 'label.account',
-                            isHidden: function(args) {
-                                if (isAdmin() || isDomainAdmin())
-                                    return false;
-                                else
-                                    return true;
-                            }
-                        },
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {
-                            listAll: true
-                        };
-                                listViewDataProvider(args, data);
-
-                        if (args.context != null) {
-                            if ("instances" in args.context) {
-                                        $.extend(data, {
-                                            virtualMachineId: args.context.instances[0].id
-                                        });
-                            }
-                        }
-                        $.ajax({
-                            url: createURL('listVMSnapshot'),
-                                    data: data,
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var jsonObj;
-                                jsonObj = json.listvmsnapshotresponse.vmSnapshot;
-                                args.response.success({
-                                            actionFilter: vmSnapshotActionfilter,
-                                    data: jsonObj
-                                });
-                            }
-                        });
-                    },
-                    //dataProvider end
-                    detailView: {
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    name: {
-                                        label: 'label.name'
-                                    },
-                                    displayname: {
-                                        label: 'label.display.name'
-                                    },
-                                    type: {
-                                        label: 'label.vmsnapshot.type'
-                                    },
-                                    description: {
-                                        label: 'label.description'
-                                    },
-                                    state: {
-                                        label: 'label.state',
-                                        indicator: {
-                                            'Ready': 'on',
-                                            'Error': 'off'
-                                        }
-                                    },
-                                    current: {
-                                        label: 'label.vmsnapshot.current',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    parentName: {
-                                        label: 'label.vmsnapshot.parentname'
-                                    },
-                                            domain: {
-                                                label: 'label.domain'
-                                            },
-                                            account: {
-                                                label: 'label.account'
-                                            },
-                                            virtualmachineid: {
-                                                label: 'label.vm.id'
-                                            },
-                                    created: {
-                                        label: 'label.date',
-                                        converter: cloudStack.converters.toLocalDate
-                                    }
-                                },
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listVMSnapshot&listAll=true&vmsnapshotid=" + args.context.vmsnapshots[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jsonObj;
-                                            jsonObj = json.listvmsnapshotresponse.vmSnapshot[0];
-                                            args.response.success({
-                                                        actionFilter: vmSnapshotActionfilter,
-                                                data: jsonObj
-                                            });
-                                        }
-                                    });
-                                },
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'VMSnapshot',
-                                    contextId: 'vmsnapshots'
-                                })
-                            }
-                        },
-                        actions: {
-                            //delete a snapshot
-                            remove: {
-                                label: 'label.action.vmsnapshot.delete',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.vmsnapshot.delete';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.vmsnapshot.delete';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteVMSnapshot&vmsnapshotid=" + args.context.vmsnapshots[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.deletevmsnapshotresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            revertToVMSnapshot: {
-                                label: 'label.action.vmsnapshot.revert',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'label.action.vmsnapshot.revert';
-                                    },
-                                    notification: function(args) {
-                                        return 'message.action.vmsnapshot.revert';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("revertToVMSnapshot&vmsnapshotid=" + args.context.vmsnapshots[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.reverttovmsnapshotresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            takeSnapshot: {
-                                label: 'Create Snapshot From VM Snapshot',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'Please confirm that you want to create a volume snapshot from the vm snapshot.';
-                                    },
-                                    notification: function(args) {
-                                        return 'Volume snapshot is created from vm snapshot';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.take.snapshot',
-                                    desc: 'message.action.snapshot.fromsnapshot',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name',
-                                        },
-                                                volume: {
-                                                    label: 'label.volume',
-                                                    validation: {
-                                                        required: true
-                                                    },
-                                                    select: function(args) {
-                                                        $.ajax({
-                                                            url: createURL("listVolumes&virtualMachineId=" + args.context.vmsnapshots[0].virtualmachineid),
-                                                            dataType: "json",
-                                                            async: true,
-                                                            success: function(json) {
-                                                                var volumes = json.listvolumesresponse.volume;
-                                                                var items = [];
-                                                                $(volumes).each(function() {
-                                                                    items.push({
-                                                                        id: this.id,
-                                                                        description: this.name
-                                                                    });
-                                                                });
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                                volumeid: args.data.volume,
-                                        vmsnapshotid: args.context.vmsnapshots[0].id
-                                    };
-                                    if (args.data.name != null && args.data.name.length > 0) {
-                                        $.extend(data, {
-                                            name: args.data.name
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL("createSnapshotFromVMSnapshot"),
-                                        data: data,
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.createsnapshotfromvmsnapshotresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    }
-                    //detailview end
-                }
-            },
-
-            /**
-             * Backups
-             */
-            backups: {
-                type: 'select',
-                title: 'label.backup',
-                listView: {
-                    id: 'backups',
-                    isMaximized: true,
-                    fields: {
-                        virtualmachinename: {
-                            label: 'label.vm.name'
-                        },
-                        status: {
-                            label: 'label.state',
-                            indicator: {
-                                'BackedUp': 'on',
-                                'Failed': 'off',
-                                'Error': 'off'
-                            }
-                        },
-                        type: {
-                            label: 'label.type'
-                        },
-                        created: {
-                            label: 'label.date'
-                        },
-                        account: {
-                            label: 'label.account'
-                        },
-                        zone: {
-                            label: 'label.zone'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {
-                            listAll: true
-                        };
-                        listViewDataProvider(args, data);
-
-                        if (args.context != null) {
-                            if ("instances" in args.context) {
-                                $.extend(data, {
-                                    virtualmachineid: args.context.instances[0].id
-                                });
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL('listBackups'),
-                            data: data,
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                                var jsonObj;
-                                jsonObj = json.listbackupsresponse.backup;
-                                args.response.success({
-                                    actionFilter: backupActionfilter,
-                                    data: jsonObj
-                                });
-                            }
-                        });
-                    },
-                    //dataProvider end
-                    detailView: {
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    virtualmachinename: {
-                                        label: 'label.vm.name'
-                                    },
-                                    virtualmachineid: {
-                                        label: 'label.vm.id'
-                                    },
-                                    status: {
-                                        label: 'label.state'
-                                    },
-                                    externalid: {
-                                        label: 'label.external.id'
-                                    },
-                                    type: {
-                                        label: 'label.type'
-                                    },
-                                    size: {
-                                        label: 'label.size'
-                                    },
-                                    virtualsize: {
-                                        label: 'label.virtual.size'
-                                    },
-                                    volumes: {
-                                        label: 'label.volumes'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    zone: {
-                                        label: 'label.zone'
-                                    },
-                                    created: {
-                                        label: 'label.date'
-                                    }
-                                },
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL("listBackups&id=" + args.context.backups[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jsonObj;
-                                            jsonObj = json.listbackupsresponse.backup[0];
-                                            args.response.success({
-                                                actionFilter: backupActionfilter,
-                                                data: jsonObj
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            remove: {
-                                label: 'Delete Backup',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'Are you sure you want to delete the backup?';
-                                    },
-                                    notification: function(args) {
-                                        return 'Delete Backup';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteBackup&id=" + args.context.backups[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.deletebackupresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            restoreBackup: {
-                                label: 'label.backup.restore',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'Please confirm that you want to restore the vm backup?';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.backup.restore';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.backups[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL("restoreBackup"),
-                                        data: data,
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.restorebackupresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            restoreBackupVolume: {
-                                label: 'Restore and Attach Backup Volume',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'Please confirm that you want to restore and attach the volume from the backup?';
-                                    },
-                                    notification: function(args) {
-                                        return 'Restore and Attach Backup Volume';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'Restore and Attach Backup Volume',
-                                    desc: 'Please select the volume you want to restore and attach to the VM.',
-                                    fields: {
-                                        volume: {
-                                            label: 'label.volume',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                var volumes = JSON.parse(args.context.backups[0].volumes);
-                                                var items = [];
-                                                $(volumes).each(function() {
-                                                    items.push({
-                                                        id: this.uuid,
-                                                        description: '(' + this.type + ') ' + this.uuid
-                                                    });
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        },
-                                        virtualmachine: {
-                                            label: 'label.virtual.machine',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listVirtualMachines"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var vms = json.listvirtualmachinesresponse.virtualmachine;
-                                                        var items = [];
-                                                        $(vms).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    console.log(args);
-                                    var data = {
-                                        backupid: args.context.backups[0].id,
-                                        volumeid: args.data.volume,
-                                        virtualmachineid: args.data.virtualmachine
-                                    };
-                                    $.ajax({
-                                        url: createURL("restoreVolumeFromBackupAndAttachToVM"),
-                                        data: data,
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.restorevolumefrombackupandattachtovmresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            removeBackupChain: {
-                                label: 'Delete Backup Chain',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'Are you sure you want to remove VM from backup offering and delete the backup chain?';
-                                    },
-                                    notification: function(args) {
-                                        return 'Delete Backup Chain';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("removeVirtualMachineFromBackupOffering"),
-                                        data: {
-                                          virtualmachineid: args.context.backups[0].virtualmachineid,
-                                          forced: true
-                                        },
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.removevirtualmachinefrombackupofferingresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    }
-                    //detailview end
-                }
-            }
-        }
-    };
-
-
-    var volumeActionfilter = cloudStack.actionFilter.volumeActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-
-        if ((isAdmin() || g_allowUserExpungeRecoverVolume) && jsonObj.state == 'Destroy') {
-            return ["recover", "remove"];
-        } else if (jsonObj.state == 'Destroy') {
-            return [];
-        }
-
-        if (jsonObj.state == 'Expunging' || jsonObj.state == 'Expunged') {
-            return ["remove"];
-        }
-
-        if (jsonObj.state == 'Destroyed' || jsonObj.state == 'Migrating' || jsonObj.state == 'Uploading') {
-            return [];
-        }
-        if (jsonObj.state == 'UploadError') {
-            return ["remove"];
-        }
-
-        if (jsonObj.hypervisor != "Ovm" && jsonObj.state == "Ready") {
-            if (jsonObj.hypervisor == 'KVM') {
-                if (jsonObj.vmstate == 'Running') {
-                    if (g_kvmsnapshotenabled == true) { //"kvm.snapshot.enabled" flag should be taken to account only when snapshot is being created for Running vm (CLOUDSTACK-4428)
-                        allowedActions.push("takeSnapshot");
-                        allowedActions.push("recurringSnapshot");
-                    }
-                } else {
-                    allowedActions.push("takeSnapshot");
-                    allowedActions.push("recurringSnapshot");
-                }
-            } else {
-                allowedActions.push("takeSnapshot");
-                allowedActions.push("recurringSnapshot");
-            }
-        }
-
-        if ((jsonObj.type == "DATADISK"  || jsonObj.type == "ROOT") && (jsonObj.state == "Ready" || jsonObj.state == "Allocated")) {
-            allowedActions.push("resize");
-        }
-
-        if (jsonObj.state != "Allocated") {
-            if ((jsonObj.vmstate == "Stopped" || jsonObj.virtualmachineid == null) && jsonObj.state == "Ready") {
-                allowedActions.push("downloadVolume");
-            }
-        }
-
-
-
-        if (jsonObj.type == "ROOT" || jsonObj.type == "DATADISK") {
-            if (jsonObj.state == "Ready" && isAdmin() && jsonObj.virtualmachineid != null) {
-                allowedActions.push("migrateVolume");
-            }
-        }
-
-        if (jsonObj.state != "Creating") {
-            if (jsonObj.type == "ROOT") {
-                if (jsonObj.vmstate == "Stopped") {
-                    allowedActions.push("createTemplate");
-                }
-            } else { //jsonObj.type == "DATADISK"
-                if (jsonObj.virtualmachineid != null) {
-                    if (jsonObj.vmstate == "Running" || jsonObj.vmstate == "Stopped" || jsonObj.vmstate == "Destroyed") {
-                        allowedActions.push("detachDisk");
-                    }
-                } else { // Disk not attached
-                    if (jsonObj.state == "Allocated" || jsonObj.state == "Uploaded") {
-                        allowedActions.push("remove");
-                    } else {
-                        allowedActions.push("createTemplate");
-                        allowedActions.push("destroy");
-                    }
-                    if (jsonObj.state == "Ready" && isAdmin()) {
-                        allowedActions.push("migrateToAnotherStorage");
-                    }
-                    allowedActions.push("attachDisk");
-                }
-            }
-        }
-
-        return allowedActions;
-    };
-
-    var snapshotActionfilter = cloudStack.actionFilter.snapshotActionfilter = function(args) {
-        var jsonObj = args.context.item;
-
-        if (jsonObj.state == 'Destroyed') {
-            return [];
-        }
-
-        var allowedActions = [];
-        if (jsonObj.state == "BackedUp") {
-            allowedActions.push("createTemplate");
-            allowedActions.push("createVolume");
-
-            if (jsonObj.revertable) {
-                allowedActions.push("revertSnapshot");
-            }
-        }
-        allowedActions.push("remove");
-
-        return allowedActions;
-    };
-
-    var vmSnapshotActionfilter = cloudStack.actionFilter.vmSnapshotActionfilter = function(args) {
-        var jsonObj = args.context.item;
-
-        if (jsonObj.state == 'Error') {
-            return ["remove"];
-        }
-
-        var allowedActions = [];
-        if (jsonObj.state == "Ready") {
-            allowedActions.push("remove");
-            allowedActions.push("revertToVMSnapshot");
-
-            if (args && args.context && args.context.instances && args.context.instances[0].hypervisor && args.context.instances[0].hypervisor === "KVM") {
-                allowedActions.push("takeSnapshot");
-            }
-        }
-
-        return allowedActions;
-    }
-
-    var backupActionfilter = cloudStack.actionFilter.backupActionfilter = function(args) {
-        var jsonObj = args.context.item;
-
-        if (jsonObj.state == 'Destroyed') {
-            return [];
-        }
-
-        var allowedActions = [];
-        allowedActions.push("remove");
-        allowedActions.push("restoreBackup");
-        allowedActions.push("restoreBackupVolume");
-        allowedActions.push("removeBackupChain");
-
-        return allowedActions;
-    };
-
-
-
-})(cloudStack);
diff --git a/ui/legacy/scripts/system.js b/ui/legacy/scripts/system.js
deleted file mode 100755
index ca0eb7e..0000000
--- a/ui/legacy/scripts/system.js
+++ /dev/null
@@ -1,23224 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function ($, cloudStack) {
-
-    var zoneObjs, podObjs, clusterObjs, domainObjs, networkOfferingObjs, physicalNetworkObjs;
-    var selectedClusterObj, selectedZoneObj, selectedPublicNetworkObj, selectedManagementNetworkObj, selectedPhysicalNetworkObj, selectedGuestNetworkObj;
-    var nspMap = {
-    };
-    //from listNetworkServiceProviders API
-    var nspHardcodingArray =[]; //for service providers listView (hardcoding, not from listNetworkServiceProviders API)
-
-    // Add router type to virtual router
-    // -- can be either Project, VPC, or System (standard)
-    var mapRouterType = function (index, router) {
-        var routerType = _l('label.menu.system');
-
-        if (router.projectid) {
-            routerType = _l('label.project');
-            router.account = router.project;
-        }
-
-        if (router.vpcid) {
-            routerType = _l('label.vpc');
-            router.guestnetworkname = router.vpcname;
-        }
-
-        if (router.isredundantrouter) {
-            router.guestnetworkname = router.guestnetworkname + " (" + router.redundantstate + ")";
-        }
-
-        return $.extend(router, {
-            routerType: routerType
-        });
-    };
-
-    cloudStack.publicIpRangeAccount = {
-        dialog: function (args) {
-            return function (args) {
-                var data = args.data ? args.data: {
-                };
-                var fields = {
-                    systemvms: {
-                        label: 'label.system.vms',
-                        isBoolean: true,
-                        docID: 'helpSetReservationSystemVms',
-                        defaultValue: data.systemvms
-                    },
-                    account: {
-                        label: 'label.account',
-                        defaultValue: data.account
-                    },
-                    domainid: {
-                        label: 'label.domain',
-                        defaultValue: data.domainid,
-                        select: function (args) {
-                            $.ajax({
-                                url: createURL('listDomains'),
-                                data: {
-                                    details: 'min',
-                                    listAll: true
-                                },
-                                success: function (json) {
-                                    args.response.success({
-                                        data: $.map(json.listdomainsresponse.domain, function (domain) {
-                                            return {
-                                                id: domain.id,
-                                                description: domain.path
-                                            };
-                                        })
-                                    });
-                                }
-                            });
-                        }
-                    }
-                };
-                var success = args.response.success;
-
-                if (args.$item) {
-                    // Account data is read-only after creation
-                    $.ajax({
-                        url: createURL('listDomains'),
-                        data: {
-                            id: data.domainid,
-                            details: 'min',
-                            listAll: true
-                        },
-                        success: function (json) {
-                            var domain = json.listdomainsresponse.domain[0];
-
-                            if (data.forSystemVms != null) {
-                                systemvms = '<li>' + _l('label.system.vms') + ': ' + data.forSystemVms + '</li>'
-                            }
-                            if (data.account != null)
-                                cloudStack.dialog.notice({
-                                    message: '<ul><li>' + _l('label.account') + ': ' + data.account + '</li>' + '<li>' + _l('label.domain') + ': ' + domain.path + '</li>' + systemvms + '</ul>'
-                                });
-                            else
-                                cloudStack.dialog.notice({
-                                    message: '<ul><li>' + _l('label.domain') + ': ' + domain.path + '</li>' + systemvms + '</ul>'
-                                });
-                        }
-                    });
-                } else {
-                    cloudStack.dialog.createForm({
-                        form: {
-                            title: 'label.set.reservation',
-                            desc: 'label.set.reservation.desc',
-                            fields: fields,
-                            preFilter: function(args) {
-                                var $systemvms = args.$form.find('.form-item[rel=systemvms]');
-                                var $systemvmsCb = $systemvms.find('input[type=checkbox]');
-                                var $account = args.$form.find('.form-item[rel=account]');
-                                var $accountTxt = args.$form.find('input[name=account]');
-                                var $domainid = args.$form.find('select[name=domainid]');
-                                $systemvmsCb.change(function() {
-                                    if ($systemvmsCb.is(':checked')) {
-                                        $accountTxt.val('');
-                                        $accountTxt.attr('disabled', true);
-                                        $domainid.attr('disabled', true);
-                                    }
-                                    else {
-                                        $accountTxt.attr('disabled', false);
-                                        $domainid.attr('disabled', false);
-                                    }
-                                });
-                            }
-                        },
-                        after: function (args) {
-                            var data = cloudStack.serializeForm(args.$form);
-
-                            success({
-                                data: data
-                            });
-                        }
-                    });
-                }
-            };
-        }
-    };
-
-    var getTrafficType = function (physicalNetwork, typeID) {
-        var trafficType = {
-        };
-
-        $.ajax({
-            url: createURL('listTrafficTypes'),
-            data: {
-                physicalnetworkid: physicalNetwork.id
-            },
-            async: false,
-            success: function (json) {
-                trafficType = $.grep(
-                json.listtraffictypesresponse.traffictype,
-                function (trafficType) {
-                    return trafficType.traffictype == typeID;
-                })[0];
-            }
-        });
-
-        if (trafficType.xennetworklabel == null || trafficType.xennetworklabel == 0)
-        trafficType.xennetworklabel = _l( 'label.network.label.display.for.blank.value');
-        if (trafficType.kvmnetworklabel == null || trafficType.kvmnetworklabel == 0)
-        trafficType.kvmnetworklabel = _l( 'label.network.label.display.for.blank.value');
-        if (trafficType.vmwarenetworklabel == null || trafficType.vmwarenetworklabel == 0)
-        trafficType.vmwarenetworklabel = _l( 'label.network.label.display.for.blank.value');
-        if (trafficType.ovmnetworklabel == null || trafficType.ovmnetworklabel == 0)
-        trafficType.ovmnetworklabel = _l( 'label.network.label.display.for.blank.value');
-        if (trafficType.lxcnetworklabel == null || trafficType.lxcnetworklabel == 0)
-        trafficType.lxcnetworklabel = _l( 'label.network.label.display.for.blank.value');
-        if (trafficType.hypervnetworklabel == null || trafficType.hypervnetworklabel == 0)
-        trafficType.hypervnetworklabel = _l( 'label.network.label.display.for.blank.value');
-        if (trafficType.ovm3networklabel == null || trafficType.ovm3networklabel == 0)
-        trafficType.ovm3networklabel = _l( 'label.network.label.display.for.blank.value');
-
-        return trafficType;
-    };
-
-    var updateTrafficLabels = function (trafficType, labels, complete) {
-        var array1 =[];
-        if (labels.xennetworklabel != _l( 'label.network.label.display.for.blank.value'))
-        array1.push("&xennetworklabel=" + labels.xennetworklabel);
-        if (labels.kvmnetworklabel != _l( 'label.network.label.display.for.blank.value'))
-        array1.push("&kvmnetworklabel=" + labels.kvmnetworklabel);
-        if (labels.vmwarenetworklabel != _l( 'label.network.label.display.for.blank.value'))
-        array1.push("&vmwarenetworklabel=" + labels.vmwarenetworklabel);
-        if (labels.ovmnetworklabel != _l( 'label.network.label.display.for.blank.value'))
-        array1.push("&ovmnetworklabel=" + labels.ovmnetworklabel);
-        if (labels.lxcnetworklabel != _l( 'label.network.label.display.for.blank.value'))
-        array1.push("&lxcnetworklabel=" + labels.lxcnetworklabel);
-        if (labels.hypervnetworklabel != _l( 'label.network.label.display.for.blank.value'))
-        array1.push("&hypervnetworklabel=" + labels.hypervnetworklabel);
-        if (labels.ovm3networklabel != _l( 'label.network.label.display.for.blank.value'))
-        array1.push("&ovm3networklabel=" + labels.ovm3networklabel);
-
-        $.ajax({
-            url: createURL('updateTrafficType' + array1.join("")),
-            data: {
-                id: trafficType.id
-            },
-            success: function (json) {
-                var jobID = json.updatetraffictyperesponse.jobid;
-
-                cloudStack.ui.notifications.add({
-                    desc: 'Update traffic labels',
-                    poll: pollAsyncJobResult,
-                    section: 'System',
-                    _custom: {
-                        jobId: jobID
-                    }
-                },
-                complete ? complete: function () {
-                },
-                {
-                },
-                function (data) {
-                    // Error
-                    cloudStack.dialog.notice({
-                        message: parseXMLHttpResponse(data)
-                    });
-                },
-                {
-                });
-            }
-        })
-    };
-
-    function virtualRouterProviderActionFilter(args) {
-        var allowedActions =[];
-        var jsonObj = args.context.item; //args.context.item == nspMap["virtualRouter"]
-        if (jsonObj.state == "Enabled")
-        allowedActions.push("disable"); else if (jsonObj.state == "Disabled")
-        allowedActions.push("enable");
-        return allowedActions;
-    };
-
-    function ovsProviderActionFilter(args) {
-        var allowedActions = [];
-        var jsonObj = args.context.item; //args.context.item == nspMap["virtualRouter"]
-        if (jsonObj.state == "Enabled")
-            allowedActions.push("disable");
-        else if (jsonObj.state == "Disabled")
-            allowedActions.push("enable");
-        return allowedActions;
-    };
-
-    var rollingMaintenanceAction = function(args) {
-        var isCluster = args.entity === 'clusters';
-        var isZone = args.entity === 'zones';
-        var isPod = args.entity === 'pods';
-        var isHost = args.entity === 'hosts';
-        var action = {
-            messages: {
-                notification: function(args) {
-                    return 'label.start.rolling.maintenance';
-                }
-            },
-            label: 'label.start.rolling.maintenance',
-            addRow: 'false',
-            createForm: {
-                title: 'label.start.rolling.maintenance',
-                fields: {
-                    timeout: {
-                        label: 'label.timeout',
-                    },
-                    force: {
-                        isBoolean: true,
-                        label: 'label.start.rolling.maintenance.force'
-                    },
-                    payload: {
-                        label: 'label.start.rolling.maintenance.payload'
-                    }
-                }
-            },
-            action: function(args) {
-                var selectedIds;
-                if (isCluster) {
-                    selectedIds = args.context.clusters.map(x => x.id);
-                } else if (isZone) {
-                    selectedIds = args.context.physicalResources.map(x => x.id);
-                } else if (isPod) {
-                    selectedIds = args.context.pods.map(x => x.id);
-                } else if (isHost) {
-                    selectedIds = args.context.hosts.map(x => x.id);
-                }
-                var ids = selectedIds.join(',');
-                var data = {
-                    force: args.data.force,
-                    timeout: args.data.timeout,
-                    payload: args.data.payload
-                };
-                if (isCluster) {
-                    $.extend(data, {
-                        clusterids : ids
-                    });
-                } else if (isZone) {
-                    $.extend(data, {
-                        zoneids : ids
-                    });
-                } else if (isPod) {
-                    $.extend(data, {
-                        podids : ids
-                    });
-                } else if (isHost) {
-                    $.extend(data, {
-                        hostids : ids
-                    });
-                }
-
-                $.ajax({
-                    url: createURL("startRollingMaintenance"),
-                    dataType: "json",
-                    data: data,
-                    async: true,
-                    success: function (json) {
-                        var item = json.startrollingmaintenanceresponse;
-                        var jid = item.jobid;
-                        args.response.success({
-                            _custom: {
-                                jobId: jid
-                            }
-                        });
-                    }
-                });
-            },
-            notification: {
-                poll: pollAsyncJobResult
-            }
-        };
-
-        if (args && args.listView) {
-            $.extend(action, {
-                isHeader: true,
-                isMultiSelectAction: true
-            });
-        }
-
-        return action;
-    };
-
-    cloudStack.sections.system = {
-        title: 'label.menu.infrastructure',
-        id: 'system',
-
-        // System dashboard
-        dashboard: {
-            dataProvider: function (args) {
-                $.ajax({
-                    url: createURL('listInfrastructure'),
-                    success: function (json) {
-                        var response = json.listinfrastructureresponse.infrastructure;
-                        var data = {};
-                        data.zoneCount = response.zones;
-                        data.podCount = response.pods;
-                        data.clusterCount = response.clusters;
-                        data.hostCount = response.hosts;
-                        data.primaryStorageCount = response.storagepools;
-                        data.secondaryStorageCount = response.imagestores;
-                        data.systemVmCount = response.systemvms;
-                        data.virtualRouterCount = response.routers;
-                        data.socketCount = response.cpusockets;
-                        data.managementServerCount = response.managementservers;
-                        args.response.success({
-                            data: data
-                        });
-                    }
-                });
-            }
-        },
-
-        zoneDashboard: function (args) {
-            $.ajax({
-                url: createURL('listCapacity'),
-                data: {
-                    zoneid: args.context.zones[0].id
-                },
-                success: function (json) {
-                    var capacities = json.listcapacityresponse.capacity;
-                    var data = {
-                    };
-
-                    $(capacities).each(function () {
-                        var capacity = this;
-
-                        data[capacity.type] = {
-                            used: cloudStack.converters.convertByType(capacity.type, capacity.capacityused),
-                            total: cloudStack.converters.convertByType(capacity.type, capacity.capacitytotal),
-                            percent: parseInt(capacity.percentused)
-                        };
-                    });
-
-                    args.response.success({
-                        data: data
-                    });
-                }
-            });
-        },
-
-        // Network-as-a-service configuration
-        naas: {
-            providerListView: {
-                id: 'networkProviders',
-                fields: {
-                    name: {
-                        label: 'label.name'
-                    },
-                    state: {
-                        label: 'label.state',
-                        converter: function (str) {
-                            // For localization
-                            return str;
-                        },
-                        indicator: {
-                            'Enabled': 'on',
-                            'Disabled': 'off'
-                        }
-                    }
-                },
-                disableInfiniteScrolling: true,
-                dataProvider: function (args) {
-                    refreshNspData();
-                    args.response.success({
-                        data: nspHardcodingArray
-                    })
-                },
-
-                detailView: function (args) {
-                    return cloudStack.sections.system.naas.networkProviders.types[
-                    args.context.networkProviders[0].id];
-                }
-            },
-            mainNetworks: {
-                'public': {
-                    detailView: {
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Public');
-
-                                    updateTrafficLabels(trafficType, args.data, function () {
-                                        args.response.success();
-                                    });
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    traffictype: {
-                                        label: 'label.traffic.type'
-                                    },
-                                    broadcastdomaintype: {
-                                        label: 'label.broadcast.domain.type'
-                                    }
-                                },
-                                {
-                                    xennetworklabel: {
-                                        label: 'label.xenserver.traffic.label',
-                                        isEditable: true
-                                    },
-                                    kvmnetworklabel: {
-                                        label: 'label.kvm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    vmwarenetworklabel: {
-                                        label: 'label.vmware.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovmnetworklabel: {
-                                        label: 'label.ovm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    lxcnetworklabel: {
-                                        label: 'label.lxc.traffic.label',
-                                        isEditable: true
-                                    },
-                                    hypervnetworklabel: {
-                                        label: 'label.hyperv.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovm3networklabel: {
-                                        label: 'label.ovm3.traffic.label',
-                                        isEditable: true
-                                    }
-                                }],
-
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listNetworks&listAll=true&trafficType=Public&isSystem=true&zoneId=" + selectedZoneObj.id, {
-                                            ignoreProject: true
-                                        }),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Public');
-                                            var items = json.listnetworksresponse.network;
-
-                                            selectedPublicNetworkObj = items[0];
-
-                                            // Include traffic labels
-                                            selectedPublicNetworkObj.xennetworklabel = trafficType.xennetworklabel;
-                                            selectedPublicNetworkObj.kvmnetworklabel = trafficType.kvmnetworklabel;
-                                            selectedPublicNetworkObj.vmwarenetworklabel = trafficType.vmwarenetworklabel;
-                                            selectedPublicNetworkObj.ovmnetworklabel = trafficType.ovmnetworklabel;
-                                            selectedPublicNetworkObj.lxcnetworklabel = trafficType.lxcnetworklabel;
-                                            selectedPublicNetworkObj.hypervnetworklabel = trafficType.hypervnetworklabel;
-                                            selectedPublicNetworkObj.ovm3networklabel = trafficType.ovm3networklabel;
-                                            args.response.success({
-                                                data: selectedPublicNetworkObj
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            ipAddresses: {
-                                title: 'label.ip.ranges',
-                                custom: function (args) {
-                                    return $('<div></div>').multiEdit({
-                                        context: args.context,
-                                        noSelect: true,
-                                        fields: {
-                                            'gateway': {
-                                                edit: true,
-                                                label: 'label.gateway'
-                                            },
-                                            'netmask': {
-                                                edit: true,
-                                                label: 'label.netmask'
-                                            },
-                                            'vlan': {
-                                                edit: true,
-                                                label: 'label.vlan',
-                                                isOptional: true
-                                            },
-                                            'startip': {
-                                                edit: true,
-                                                label: 'label.start.IP'
-                                            },
-                                            'endip': {
-                                                edit: true,
-                                                label: 'label.end.IP'
-                                            },
-                                            'account': {
-                                                label: 'label.account',
-                                                custom: {
-                                                    buttonLabel: 'label.set.reservation',
-                                                    action: cloudStack.publicIpRangeAccount.dialog()
-                                                }
-                                            },
-                                            'add-rule': {
-                                                label: 'label.add',
-                                                addButton: true
-                                            }
-                                        },
-                                        add: {
-                                            label: 'label.add',
-                                            action: function (args) {
-                                                var array1 =[];
-                                                array1.push("&zoneId=" + args.context.zones[0].id);
-
-                                                var vlan = "untagged";
-                                                if (args.data.vlan != null && args.data.vlan.length > 0){
-                                                    vlan = args.data.vlan;
-                                                }
-                                                cloudStack.addVlanToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, vlan);
-
-                                                array1.push("&gateway=" + args.data.gateway);
-                                                array1.push("&netmask=" + args.data.netmask);
-                                                array1.push("&startip=" + args.data.startip);
-                                                if (args.data.endip != null && args.data.endip.length > 0)
-                                                array1.push("&endip=" + args.data.endip);
-
-                                                if (args.data.account) {
-                                                    if (args.data.account.account)
-                                                        array1.push("&account=" + args.data.account.account);
-                                                        if (args.data.account.domainid) {
-                                                            array1.push("&domainid=" + args.data.account.domainid);
-                                                        }
-                                                    if (args.data.account.systemvms) {
-                                                        systvmsval = args.data.account.systemvms == "on" ? "true" : "false"
-                                                        array1.push("&forsystemvms=" + systvmsval);
-                                                    }
-                                                }
-
-                                                array1.push("&forVirtualNetwork=true");
-                                                //indicates this new IP range is for public network, not guest network
-
-                                                $.ajax({
-                                                    url: createURL("createVlanIpRange" + array1.join("")),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var item = json.createvlaniprangeresponse.vlan;
-                                                        args.response.success({
-                                                            data: item,
-                                                            notification: {
-                                                                label: 'label.add.ip.range',
-                                                                poll: function (args) {
-                                                                    args.complete();
-                                                                }
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        args.response.error(errorMsg);
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actionPreFilter: function (args) {
-                                            var actionsToShow =[ 'destroy'];
-                                            if (args.context.multiRule[0].domain == 'ROOT' && args.context.multiRule[0].account != null &&
-                                                args.context.multiRule[0].account.account == 'system' && !args.context.multiRule[0].forsystemvms)
-                                            actionsToShow.push('addAccount'); else
-                                            actionsToShow.push('releaseFromAccount');
-                                            return actionsToShow;
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.remove.ip.range',
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('deleteVlanIpRange&id=' + args.context.multiRule[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            args.response.success({
-                                                                notification: {
-                                                                    label: 'label.remove.ip.range',
-                                                                    poll: function (args) {
-                                                                        args.complete();
-                                                                    }
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function (json) {
-                                                            args.response.error(parseXMLHttpResponse(json));
-                                                        }
-                                                    });
-                                                }
-                                            },
-
-                                            releaseFromAccount: {
-                                                label: 'label.release.account',
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('releasePublicIpRange'),
-                                                        data: {
-                                                            id: args.context.multiRule[0].id
-                                                        },
-                                                        success: function (json) {
-                                                            args.response.success({
-                                                                notification: {
-                                                                    label: 'label.release.account.lowercase',
-                                                                    poll: function (args) {
-                                                                        args.complete();
-                                                                    }
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function (json) {
-                                                            args.response.error(parseXMLHttpResponse(json));
-                                                        }
-                                                    });
-                                                }
-                                            },
-
-                                            addAccount: {
-                                                label: 'label.add.account',
-                                                createForm: {
-                                                    title: 'label.add.account',
-                                                    fields: {
-                                                        account: {
-                                                            label: 'label.account'
-                                                        },
-                                                        domainid: {
-                                                            label: 'label.domain',
-                                                            select: function (args) {
-                                                                $.ajax({
-                                                                    url: createURL('listDomains'),
-                                                                    data: {
-                                                                        details: 'min',
-                                                                        listAll: true
-                                                                    },
-                                                                    success: function (json) {
-                                                                        args.response.success({
-                                                                            data: $.map(json.listdomainsresponse.domain, function (domain) {
-                                                                                return {
-                                                                                    id: domain.id,
-                                                                                    description: domain.path
-                                                                                };
-                                                                            })
-                                                                        });
-                                                                    }
-                                                                });
-                                                            }
-                                                        }
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    var data = {
-                                                        id: args.context.multiRule[0].id,
-                                                        zoneid: args.context.multiRule[0].zoneid,
-                                                        domainid: args.data.domainid
-                                                    };
-                                                    if (args.data.account) {
-                                                        $.extend(data, {
-                                                            account: args.data.account
-                                                        });
-                                                    }
-                                                    $.ajax({
-                                                        url: createURL('dedicatePublicIpRange'),
-                                                        data: data,
-                                                        success: function (json) {
-                                                            args.response.success({
-                                                                notification: {
-                                                                    label: 'label.add.account',
-                                                                    poll: function (args) {
-                                                                        args.complete();
-                                                                    }
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function (json) {
-                                                            args.response.error(parseXMLHttpResponse(json));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL("listVlanIpRanges&zoneid=" + args.context.zones[0].id + "&networkId=" + selectedPublicNetworkObj.id),
-                                                dataType: "json",
-                                                success: function (json) {
-                                                    var items = json.listvlaniprangesresponse.vlaniprange;
-
-                                                    args.response.success({
-                                                        data: $.map(items, function (item) {
-                                                            return $.extend(item, {
-                                                                account: {
-                                                                    _buttonLabel: item.account ? '[' + item.domain + '] ' + item.account: item.domain,
-                                                                    account: item.account,
-                                                                    domainid: item.domainid,
-                                                                    forSystemVms: item.forsystemvms
-                                                                }
-                                                            });
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                },
-
-                'storage': {
-                    detailView: {
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Storage');
-
-                                    updateTrafficLabels(trafficType, args.data, function () {
-                                        args.response.success();
-                                    });
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    traffictype: {
-                                        label: 'label.traffic.type'
-                                    },
-                                    broadcastdomaintype: {
-                                        label: 'label.broadcast.domain.type'
-                                    }
-                                },
-                                {
-                                    xennetworklabel: {
-                                        label: 'label.xenserver.traffic.label',
-                                        isEditable: true
-                                    },
-                                    kvmnetworklabel: {
-                                        label: 'label.kvm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    vmwarenetworklabel: {
-                                        label: 'label.vmware.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovmnetworklabel: {
-                                        label: 'label.ovm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    lxcnetworklabel: {
-                                        label: 'label.lxc.traffic.label',
-                                        isEditable: true
-                                    },
-                                    hypervnetworklabel: {
-                                        label: 'label.hyperv.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovm3networklabel: {
-                                        label: 'label.ovm3.traffic.label',
-                                        isEditable: true
-                                    }
-                                }],
-
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listNetworks&listAll=true&trafficType=Storage&isSystem=true&zoneId=" + selectedZoneObj.id),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var items = json.listnetworksresponse.network;
-                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Storage');
-                                            selectedPublicNetworkObj = items[0];
-
-                                            selectedPublicNetworkObj.xennetworklabel = trafficType.xennetworklabel;
-                                            selectedPublicNetworkObj.kvmnetworklabel = trafficType.kvmnetworklabel;
-                                            selectedPublicNetworkObj.vmwarenetworklabel = trafficType.vmwarenetworklabel;
-                                            selectedPublicNetworkObj.ovmnetworklabel = trafficType.ovmnetworklabel;
-                                            selectedPublicNetworkObj.lxcnetworklabel = trafficType.lxcnetworklabel;
-                                            selectedPublicNetworkObj.hypervnetworklabel = trafficType.hypervnetworklabel;
-                                            selectedPublicNetworkObj.ovm3networklabel = trafficType.ovm3networklabel;
-                                            args.response.success({
-                                                data: selectedPublicNetworkObj
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            ipAddresses: {
-                                title: 'label.ip.ranges',
-                                custom: function (args) {
-                                    return $('<div></div>').multiEdit({
-                                        context: args.context,
-                                        noSelect: true,
-                                        fields: {
-                                            'podid': {
-                                                label: 'label.pod',
-                                                select: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listPods&zoneid=" + selectedZoneObj.id),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var items =[];
-                                                            var pods = json.listpodsresponse.pod;
-                                                            $(pods).each(function () {
-                                                                items.push({
-                                                                    name: this.id,
-                                                                    description: this.name
-                                                                });
-                                                                //should be "{id: this.id, description: this.name}" (to be consistent with dropdown in createFrom and edit mode) (Brian will fix widget later)
-                                                            });
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            'gateway': {
-                                                edit: true,
-                                                label: 'label.gateway'
-                                            },
-                                            'netmask': {
-                                                edit: true,
-                                                label: 'label.netmask'
-                                            },
-                                            'vlan': {
-                                                edit: true,
-                                                label: 'label.vlan',
-                                                isOptional: true
-                                            },
-                                            'startip': {
-                                                edit: true,
-                                                label: 'label.start.IP'
-                                            },
-                                            'endip': {
-                                                edit: true,
-                                                label: 'label.end.IP'
-                                            },
-                                            'add-rule': {
-                                                label: 'label.add',
-                                                addButton: true
-                                            }
-                                        },
-                                        add: {
-                                            label: 'label.add',
-                                            action: function (args) {
-                                                var array1 =[];
-                                                array1.push("&zoneId=" + args.context.zones[0].id);
-                                                array1.push("&podid=" + args.data.podid);
-                                                array1.push("&gateway=" + args.data.gateway);
-
-                                                cloudStack.addVlanToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.vlan);
-
-                                                array1.push("&netmask=" + args.data.netmask);
-                                                array1.push("&startip=" + args.data.startip);
-                                                if (args.data.endip != null && args.data.endip.length > 0)
-                                                array1.push("&endip=" + args.data.endip);
-
-                                                $.ajax({
-                                                    url: createURL("createStorageNetworkIpRange" + array1.join("")),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: json.createstoragenetworkiprangeresponse.jobid
-                                                            },
-                                                            notification: {
-                                                                label: 'label.add.ip.range',
-                                                                poll: pollAsyncJobResult
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        args.response.error(errorMsg);
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.delete',
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('deleteStorageNetworkIpRange&id=' + args.context.multiRule[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            args.response.success({
-                                                                notification: {
-                                                                    label: 'label.remove.ip.range',
-                                                                    poll: function (args) {
-                                                                        args.complete();
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL("listStorageNetworkIpRange&zoneid=" + args.context.zones[0].id),
-                                                dataType: "json",
-                                                success: function (json) {
-                                                    var items = json.liststoragenetworkiprangeresponse.storagenetworkiprange;
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                },
-
-                'management': {
-                    detailView: {
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Management');
-
-                                    updateTrafficLabels(trafficType, args.data, function () {
-                                        args.response.success();
-                                    });
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    traffictype: {
-                                        label: 'label.traffic.type'
-                                    },
-                                    broadcastdomaintype: {
-                                        label: 'label.broadcast.domain.type'
-                                    }
-                                },
-                                {
-                                    xennetworklabel: {
-                                        label: 'label.xenserver.traffic.label',
-                                        isEditable: true
-                                    },
-                                    kvmnetworklabel: {
-                                        label: 'label.kvm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    vmwarenetworklabel: {
-                                        label: 'label.vmware.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovmnetworklabel: {
-                                        label: 'label.ovm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    lxcnetworklabel: {
-                                        label: 'label.lxc.traffic.label',
-                                        isEditable: true
-                                    },
-                                    hypervnetworklabel: {
-                                        label: 'label.hyperv.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovm3networklabel: {
-                                        label: 'label.ovm3.traffic.label',
-                                        isEditable: true
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listNetworks&listAll=true&issystem=true&trafficType=Management&zoneId=" + selectedZoneObj.id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            selectedManagementNetworkObj = json.listnetworksresponse.network[0];
-
-                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Management');
-
-                                            selectedManagementNetworkObj.xennetworklabel = trafficType.xennetworklabel;
-                                            selectedManagementNetworkObj.kvmnetworklabel = trafficType.kvmnetworklabel;
-                                            selectedManagementNetworkObj.vmwarenetworklabel = trafficType.vmwarenetworklabel;
-                                            selectedManagementNetworkObj.ovmnetworklabel = trafficType.ovmnetworklabel;
-                                            selectedManagementNetworkObj.lxcnetworklabel = trafficType.lxcnetworklabel;
-                                            selectedManagementNetworkObj.hypervnetworklabel = trafficType.hypervnetworklabel;
-                                            selectedManagementNetworkObj.ovm3networklabel = trafficType.ovm3networklabel;
-                                            args.response.success({
-                                                data: selectedManagementNetworkObj
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            ipAddresses: {
-                                title: 'label.ip.ranges',
-                                custom: function (args) {
-                                    return $('<div></div>').multiEdit({
-                                        context: args.context,
-                                        noSelect: true,
-                                        fields: {
-                                            'podid': {
-                                                label: 'label.pod',
-                                                select: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listPods&zoneid=" + selectedZoneObj.id),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var items =[];
-                                                            var pods = json.listpodsresponse.pod;
-                                                            $(pods).each(function () {
-                                                                items.push({
-                                                                    name: this.id,
-                                                                    description: this.name
-                                                                });
-                                                            });
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            'gateway': {
-                                                edit: true,
-                                                label: 'label.gateway'
-                                            },
-                                            'netmask': {
-                                                edit: true,
-                                                label: 'label.netmask'
-                                            },
-                                            'vlan': {
-                                                edit: true,
-                                                label: 'label.vlan',
-                                                validation: {
-                                                    required: false
-                                                }
-                                            },
-                                            'startip': {
-                                                edit: true,
-                                                label: 'label.start.IP'
-                                            },
-                                            'endip': {
-                                                edit: true,
-                                                label: 'label.end.IP',
-                                                validation: {
-                                                    required: false
-                                                }
-                                            },
-                                            'systemvms' : {
-                                                isBoolean: true,
-                                                label: 'label.system.vms'
-                                            },
-                                            'add-rule': {
-                                                label: 'label.add',
-                                                addButton: true
-                                            }
-                                        },
-                                        add: {
-                                            label: 'label.add',
-                                            action: function (args) {
-                                                var array1 =[];
-
-                                                array1.push("&podid=" + args.data.podid);
-                                                array1.push("&gateway=" + args.data.gateway);
-                                                array1.push("&netmask=" + args.data.netmask);
-                                                array1.push("&startip=" + args.data.startip);
-
-                                                if (args.data.endip != null && args.data.endip.length > 0)
-                                                    array1.push("&endip=" + args.data.endip);
-
-                                                if (args.data.systemvms) {
-                                                    array1.push("&forsystemvms=" + (args.data.systemvms == "on" ? "true" : "false"));
-                                                }
-                                                cloudStack.addVlanToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.vlan);
-
-                                                $.ajax({
-                                                    url: createURL("createManagementNetworkIpRange" + array1.join("")),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: json.createmanagementnetworkiprangeresponse.jobid
-                                                            },
-                                                            notification: {
-                                                                label: 'label.add.management.ip.range',
-                                                                poll: pollAsyncJobResult
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        args.response.error(errorMsg);
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.delete',
-                                                action: function (args) {
-                                                    var array1 =[];
-                                                    array1.push("&podid=" + args.context.multiRule[0].podid);
-                                                    array1.push("&startip=" + args.context.multiRule[0].startip);
-                                                    array1.push("&endip=" + args.context.multiRule[0].endip);
-                                                    array1.push("&vlan=" + args.context.multiRule[0].vlan);
-
-                                                    $.ajax({
-                                                        url: createURL('deleteManagementNetworkIpRange' + array1.join("")),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: json.deletemanagementnetworkiprangeresponse.jobid
-                                                                },
-                                                                notification: {
-                                                                    label: 'label.remove.management.ip.range',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            args.response.error(errorMsg);
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL("listPods&zoneid=" + selectedZoneObj.id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var items =[];
-
-                                                    var pods = json.listpodsresponse.pod;
-                                                    $(pods).each(function () {
-                                                        for (var i = 0; i < this.startip.length; i++) {
-                                                            var systemvmsValue = this.forsystemvms[i] == "1" ? true : false;
-                                                            items.push({
-                                                                podid: this.id,
-                                                                gateway: this.gateway,
-                                                                netmask: this.netmask,
-                                                                startip: this.startip[i],
-                                                                endip: this.endip[i],
-                                                                systemvms: systemvmsValue,
-                                                                vlan: this.vlanid[i]
-                                                            });
-                                                        }
-                                                    });
-
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                },
-
-                'guest': {
-                    //physical network + Guest traffic type
-                    detailView: {
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var data = {
-                                        id: selectedPhysicalNetworkObj.id
-                                    };
-
-                                    $.extend(data, {
-                                        vlan: args.data.vlan
-                                    });
-
-                                    $.extend(data, {
-                                        tags: args.data.tags
-                                    });
-
-                                    $.ajax({
-                                        url: createURL('updatePhysicalNetwork'),
-                                        data: data,
-                                        success: function (json) {
-                                            var jobId = json.updatephysicalnetworkresponse.jobid;
-
-                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
-
-                                            updateTrafficLabels(trafficType, args.data, function () {
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jobId
-                                                    }
-                                                });
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        tabFilter: function (args) {
-                            var hiddenTabs =[];
-                            if (selectedZoneObj.networktype == 'Basic') {
-                                hiddenTabs.push("network");
-                                hiddenTabs.push("dedicatedGuestVlanRanges");
-                            } else {
-                                //selectedZoneObj.networktype == 'Advanced'
-                                hiddenTabs.push("ipAddresses");
-                            }
-                            return hiddenTabs;
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                preFilter: function (args) {
-                                    var hiddenFields =[];
-                                    if (selectedZoneObj.networktype == "Basic") {
-                                        hiddenFields.push("vlan");
-                                        // hiddenFields.push("endVlan");
-                                    }
-                                    return hiddenFields;
-                                },
-                                fields:[ {
-                                    //updatePhysicalNetwork API
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    vlan: {
-                                        label: 'label.vlan.vni.ranges',
-                                        isEditable: true
-                                    },
-                                    tags: {
-                                        label: 'label.tags',
-                                        isEditable: true
-                                    },
-                                    broadcastdomainrange: {
-                                        label: 'label.broadcast.domain.range'
-                                    }
-                                },
-                                {
-                                    //updateTrafficType API
-                                    xennetworklabel: {
-                                        label: 'label.xenserver.traffic.label',
-                                        isEditable: true
-                                    },
-                                    kvmnetworklabel: {
-                                        label: 'label.kvm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    vmwarenetworklabel: {
-                                        label: 'label.vmware.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovmnetworklabel: {
-                                        label: 'label.ovm.traffic.label',
-                                        isEditable: true
-                                    },
-                                    lxcnetworklabel: {
-                                        label: 'label.lxc.traffic.label',
-                                        isEditable: true
-                                    },
-                                    hypervnetworklabel: {
-                                        label: 'label.hyperv.traffic.label',
-                                        isEditable: true
-                                    },
-                                    ovm3networklabel: {
-                                        label: 'label.ovm3.traffic.label',
-                                        isEditable: true
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    //physical network + Guest traffic type
-                                    //refresh physical network
-                                    $.ajax({
-                                        url: createURL('listPhysicalNetworks'),
-                                        data: {
-                                            id: args.context.physicalNetworks[0].id
-                                        },
-                                        async: true,
-                                        success: function (json) {
-                                            selectedPhysicalNetworkObj = json.listphysicalnetworksresponse.physicalnetwork[0];
-
-                                            //    var startVlan, endVlan;
-                                            var vlan = selectedPhysicalNetworkObj.vlan;
-                                            /*    if(vlan != null && vlan.length > 0) {
-                                            if(vlan.indexOf("-") != -1) {
-                                            var vlanArray = vlan.split("-");
-                                            startVlan = vlanArray[0];
-                                            endVlan = vlanArray[1];
-                                            }
-                                            else {
-                                            startVlan = vlan;
-                                            }
-                                            selectedPhysicalNetworkObj["startVlan"] = startVlan;
-                                            selectedPhysicalNetworkObj["endVlan"] = endVlan;
-                                            }*/
-
-                                            //traffic type
-                                            var xenservertrafficlabel, kvmtrafficlabel, vmwaretrafficlabel;
-                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
-                                            //refresh Guest traffic type
-                                            selectedPhysicalNetworkObj[ "xennetworklabel"] = trafficType.xennetworklabel;
-                                            selectedPhysicalNetworkObj[ "kvmnetworklabel"] = trafficType.kvmnetworklabel;
-                                            selectedPhysicalNetworkObj[ "vmwarenetworklabel"] = trafficType.vmwarenetworklabel;
-                                            selectedPhysicalNetworkObj[ "ovmnetworklabel"] = trafficType.ovmnetworklabel;
-                                            selectedPhysicalNetworkObj[ "lxcnetworklabel"] = trafficType.lxcnetworklabel;
-                                            selectedPhysicalNetworkObj[ "hypervnetworklabel"] = trafficType.hypervnetworklabel;
-                                            selectedPhysicalNetworkObj[ "ovm3networklabel"] = trafficType.ovm3networklabel;
-                                            args.response.success({
-                                                actionFilter: function () {
-                                                    var allowedActions =[ 'edit', 'addVlanRange', 'removeVlanRange'];
-                                                    return allowedActions;
-                                                },
-                                                data: selectedPhysicalNetworkObj
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            ipAddresses: {
-                                title: 'label.ip.ranges',
-                                custom: function (args) {
-                                    return $('<div></div>').multiEdit({
-                                        context: args.context,
-                                        noSelect: true,
-                                        fields: {
-                                            'podid': {
-                                                label: 'label.pod',
-                                                select: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listPods&zoneid=" + selectedZoneObj.id),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var items =[];
-                                                            var pods = json.listpodsresponse.pod;
-                                                            $(pods).each(function () {
-                                                                items.push({
-                                                                    name: this.id,
-                                                                    description: this.name
-                                                                });
-                                                                //should be "{id: this.id, description: this.name}" (to be consistent with dropdown in createFrom and edit mode) (Brian will fix widget later)
-                                                            });
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            'gateway': {
-                                                edit: true,
-                                                label: 'label.gateway'
-                                            },
-                                            'netmask': {
-                                                edit: true,
-                                                label: 'label.netmask'
-                                            },
-                                            'startip': {
-                                                edit: true,
-                                                label: 'label.start.IP'
-                                            },
-                                            'endip': {
-                                                edit: true,
-                                                label: 'label.end.IP'
-                                            },
-                                            'add-rule': {
-                                                label: 'label.add',
-                                                addButton: true
-                                            }
-                                        },
-                                        add: {
-                                            label: 'label.add',
-                                            action: function (args) {
-                                                var array1 =[];
-                                                array1.push("&podid=" + args.data.podid);
-                                                array1.push("&networkid=" + selectedGuestNetworkObj.id);
-                                                array1.push("&gateway=" + args.data.gateway);
-                                                array1.push("&netmask=" + args.data.netmask);
-                                                array1.push("&startip=" + args.data.startip);
-                                                if (args.data.endip != null && args.data.endip.length > 0)
-                                                array1.push("&endip=" + args.data.endip);
-                                                array1.push("&forVirtualNetwork=false");
-                                                //indicates this new IP range is for guest network, not public network
-
-                                                $.ajax({
-                                                    url: createURL("createVlanIpRange" + array1.join("")),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var item = json.createvlaniprangeresponse.vlan;
-                                                        args.response.success({
-                                                            data: item,
-                                                            notification: {
-                                                                label: 'label.add.ip.range',
-                                                                poll: function (args) {
-                                                                    args.complete();
-                                                                }
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        args.response.error(errorMsg);
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.remove.ip.range',
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('deleteVlanIpRange&id=' + args.context.multiRule[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            args.response.success({
-                                                                notification: {
-                                                                    label: 'label.remove.ip.range',
-                                                                    poll: function (args) {
-                                                                        args.complete();
-                                                                    }
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function (json) {
-                                                            args.response.error(parseXMLHttpResponse(json));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        dataProvider: function (args) {
-                                            //only basic zone has IP Range tab
-                                            selectedGuestNetworkObj = null;
-                                            $.ajax({
-                                                url: createURL("listNetworks&listAll=true&trafficType=Guest&zoneid=" + selectedZoneObj.id),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    var items = json.listnetworksresponse.network;
-                                                    if (items != null && items.length > 0)
-                                                    selectedGuestNetworkObj = json.listnetworksresponse.network[0];
-                                                }
-                                            });
-                                            if (selectedGuestNetworkObj == null)
-                                            return;
-
-                                            $.ajax({
-                                                url: createURL("listVlanIpRanges&zoneid=" + selectedZoneObj.id + "&networkId=" + selectedGuestNetworkObj.id),
-                                                dataType: "json",
-                                                success: function (json) {
-                                                    var items = json.listvlaniprangesresponse.vlaniprange;
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            network: {
-                                title: 'label.network',
-                                listView: {
-                                    section: 'networks',
-                                    id: 'networks',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        type: {
-                                            label: 'label.type'
-                                        },
-                                        vlan: {
-                                            label: 'label.vnet.id'
-                                        },
-                                        broadcasturi: {
-                                            label: 'label.broadcat.uri'
-                                        },
-                                        cidr: {
-                                            label: 'label.ipv4.cidr'
-                                        },
-                                        ip6cidr: {
-                                            label: 'label.ipv6.CIDR'
-                                        }
-                                        //scope: { label: 'label.scope' }
-                                    },
-                                    actions: {
-                                        add: addGuestNetworkDialog.def
-                                    },
-
-                                    dataProvider: function (args) {
-                                        var array1 =[];
-                                        if (args.filterBy != null) {
-                                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                                switch (args.filterBy.search.by) {
-                                                    case "name":
-                                                    if (args.filterBy.search.value.length > 0)
-                                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                                    break;
-                                                }
-                                            }
-                                        }
-
-                                        //need to make 2 listNetworks API call to get all guest networks from one physical network in Advanced zone
-                                        var items =[];
-                                        //"listNetworks&projectid=-1": list guest networks under all projects (no matter who the owner is)
-                                        $.ajax({
-                                            url: createURL("listNetworks&projectid=-1&trafficType=Guest&zoneId=" + selectedZoneObj.id + "&physicalnetworkid=" + selectedPhysicalNetworkObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                            dataType: "json",
-                                            async: false,
-                                            success: function (json) {
-                                                if (json.listnetworksresponse.network != null && json.listnetworksresponse.network.length > 0)
-                                                items = json.listnetworksresponse.network;
-                                            }
-                                        });
-
-                                        var networkCollectionMap = {
-                                        };
-                                        $(items).each(function () {
-                                            networkCollectionMap[ this.id] = this.name;
-                                        });
-
-                                        //"listNetworks&listAll=true: list guest networks that are not under any project (no matter who the owner is)
-                                        $.ajax({
-                                            url: createURL("listNetworks&listAll=true&trafficType=Guest&zoneId=" + selectedZoneObj.id + "&physicalnetworkid=" + selectedPhysicalNetworkObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                            dataType: "json",
-                                            async: false,
-                                            success: function (json) {
-                                                $(json.listnetworksresponse.network).each(function () {
-                                                    if ((this.id in networkCollectionMap) == false)
-                                                    items.push(this);
-                                                });
-                                            }
-                                        });
-
-                                        $(items).each(function () {
-                                            addExtraPropertiesToGuestNetworkObject(this);
-                                        });
-
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    },
-
-                                    detailView: {
-                                        name: 'label.guest.network.details',
-                                        noCompact: true,
-                                        viewAll: {
-                                            path: '_zone.guestIpRanges',
-                                            label: 'label.ip.ranges',
-                                            preFilter: function (args) {
-                                                if (selectedGuestNetworkObj.type == "Isolated") {
-                                                    var services = selectedGuestNetworkObj.service;
-                                                    if (services != null) {
-                                                        for (var i = 0; i < services.length; i++) {
-                                                            var service = services[i];
-                                                            if (service.name == "SourceNat")
-                                                            return false;
-                                                        }
-                                                    }
-                                                }
-                                                return true;
-                                            }
-                                        },
-                                        actions: {
-                                            edit: {
-                                                label: 'label.edit',
-                                                action: function (args) {
-                                                    var array1 =[];
-                                                    array1.push("&name=" + encodeURIComponent(args.data.name));
-                                                    array1.push("&displaytext=" + encodeURIComponent(args.data.displaytext));
-
-                                                    //args.data.networkdomain is null when networkdomain field is hidden
-                                                    if (args.data.networkdomain != null && args.data.networkdomain != selectedGuestNetworkObj.networkdomain)
-                                                    array1.push("&networkdomain=" + encodeURIComponent(args.data.networkdomain));
-
-                                                    //args.data.networkofferingid is null when networkofferingid field is hidden
-                                                    if (args.data.networkofferingid != null && args.data.networkofferingid != args.context.networks[0].networkofferingid) {
-                                                        array1.push("&networkofferingid=" + encodeURIComponent(args.data.networkofferingid));
-
-                                                        if (args.context.networks[0].type == "Isolated") {
-                                                            //Isolated network
-                                                            cloudStack.dialog.confirm({
-                                                                message: 'message.confirm.current.guest.CIDR.unchanged',
-                                                                action: function () {
-                                                                    //"Yes"    button is clicked
-                                                                    array1.push("&changecidr=false");
-                                                                    $.ajax({
-                                                                        url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
-                                                                        dataType: "json",
-                                                                        success: function (json) {
-                                                                            var jid = json.updatenetworkresponse.jobid;
-                                                                            args.response.success({
-                                                                                _custom: {
-                                                                                    jobId: jid,
-                                                                                    getUpdatedItem: function (json) {
-                                                                                        var item = json.queryasyncjobresultresponse.jobresult.network;
-                                                                                        return {
-                                                                                            data: item
-                                                                                        };
-                                                                                    }
-                                                                                }
-                                                                            });
-                                                                        }
-                                                                    });
-                                                                },
-                                                                cancelAction: function () {
-                                                                    //"Cancel" button is clicked
-                                                                    array1.push("&changecidr=true");
-                                                                    $.ajax({
-                                                                        url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
-                                                                        dataType: "json",
-                                                                        success: function (json) {
-                                                                            var jid = json.updatenetworkresponse.jobid;
-                                                                            args.response.success({
-                                                                                _custom: {
-                                                                                    jobId: jid,
-                                                                                    getUpdatedItem: function (json) {
-                                                                                        var item = json.queryasyncjobresultresponse.jobresult.network;
-                                                                                        return {
-                                                                                            data: item
-                                                                                        };
-                                                                                    }
-                                                                                }
-                                                                            });
-                                                                        }
-                                                                    });
-                                                                }
-                                                            });
-                                                            return;
-                                                        }
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var jid = json.updatenetworkresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        var item = json.queryasyncjobresultresponse.jobresult.network;
-                                                                        return {
-                                                                            data: item
-                                                                        };
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            'restart': {
-                                                label: 'label.restart.network',
-                                                createForm: {
-                                                    title: 'label.restart.network',
-                                                    desc: 'message.restart.network',
-                                                    preFilter: function (args) {
-                                                        if (selectedZoneObj.networktype == "Basic") {
-                                                            args.$form.find('.form-item[rel=cleanup]').find('input').prop('checked', false);
-                                                            //unchecked
-                                                            args.$form.find('.form-item[rel=cleanup]').hide();
-                                                            //hidden
-                                                        } else {
-                                                            args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 'checked');
-                                                            //checked
-                                                            args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block');
-                                                            //shown
-                                                        }
-                                                    },
-                                                    fields: {
-                                                        cleanup: {
-                                                            label: 'label.clean.up',
-                                                            isBoolean: true
-                                                        }
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    var array1 =[];
-                                                    array1.push("&cleanup=" + (args.data.cleanup == "on"));
-                                                    $.ajax({
-                                                        url: createURL("restartNetwork&cleanup=true&id=" + args.context.networks[0].id + array1.join("")),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.restartnetworkresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.network;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.restart.network';
-                                                    }
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            'remove': {
-                                                label: 'label.action.delete.network',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.action.delete.network';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.action.delete.network';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("deleteNetwork&id=" + args.context.networks[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.deletenetworkresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return {
-                                                                        };
-                                                                        //nothing in this network needs to be updated, in fact, this whole template has being deleted
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            }
-                                        },
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                preFilter: function (args) {
-                                                    var hiddenFields =[];
-                                                    if (selectedZoneObj.networktype == "Basic") {
-                                                        hiddenFields.push("account");
-                                                        hiddenFields.push("gateway");
-                                                        //hiddenFields.push("netmask");
-                                                    }
-
-                                                    if (selectedGuestNetworkObj.type == "Isolated") {
-                                                        hiddenFields.push("networkofferingdisplaytext");
-                                                        hiddenFields.push("networkdomaintext");
-                                                        hiddenFields.push("gateway");
-                                                        //hiddenFields.push("netmask");
-                                                    } else {
-                                                        //selectedGuestNetworkObj.type == "Shared"
-                                                        hiddenFields.push("networkofferingid");
-                                                        hiddenFields.push("networkdomain");
-                                                    }
-                                                    return hiddenFields;
-                                                },
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name',
-                                                        isEditable: true
-                                                    }
-                                                },
-                                                {
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    displaytext: {
-                                                        label: 'label.description',
-                                                        isEditable: true
-                                                    },
-                                                    type: {
-                                                        label: 'label.type'
-                                                    },
-                                                    state: {
-                                                        label: 'label.state'
-                                                    },
-                                                    restartrequired: {
-                                                        label: 'label.restart.required',
-                                                        converter: function (booleanValue) {
-                                                            if (booleanValue == true)
-                                                            return "<font color='red'>Yes</font>"; else if (booleanValue == false)
-                                                            return "No";
-                                                        }
-                                                    },
-                                                    vlan: {
-                                                        label: 'label.vlan.id'
-                                                    },
-                                                    broadcasturi: {
-                                                        label: 'label.broadcat.uri'
-                                                    },
-                                                    scope: {
-                                                        label: 'label.scope'
-                                                    },
-                                                    networkofferingdisplaytext: {
-                                                        label: 'label.network.offering'
-                                                    },
-                                                    networkofferingid: {
-                                                        label: 'label.network.offering',
-                                                        isEditable: true,
-                                                        select: function (args) {
-                                                            var items =[];
-                                                            $.ajax({
-                                                                url: createURL("listNetworkOfferings&state=Enabled&networkid=" + selectedGuestNetworkObj.id + "&zoneid=" + selectedGuestNetworkObj.zoneid),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                                                                    $(networkOfferingObjs).each(function () {
-                                                                        items.push({
-                                                                            id: this.id,
-                                                                            description: this.displaytext
-                                                                        });
-                                                                    });
-                                                                }
-                                                            });
-
-                                                            //include currently selected network offeirng to dropdown
-                                                            items.push({
-                                                                id: selectedGuestNetworkObj.networkofferingid,
-                                                                description: selectedGuestNetworkObj.networkofferingdisplaytext
-                                                            });
-
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    },
-
-                                                    networkofferingidText: {
-                                                        label: 'label.network.offering.id'
-                                                    },
-
-                                                    gateway: {
-                                                        label: 'label.ipv4.gateway'
-                                                    },
-                                                    //netmask: { label: 'label.netmask' },
-                                                    cidr: {
-                                                        label: 'label.ipv4.cidr'
-                                                    },
-
-                                                    ip6gateway: {
-                                                        label: 'label.ipv6.gateway'
-                                                    },
-                                                    ip6cidr: {
-                                                        label: 'label.ipv6.CIDR'
-                                                    },
-
-                                                    networkdomaintext: {
-                                                        label: 'label.network.domain'
-                                                    },
-                                                    networkdomain: {
-                                                        label: 'label.network.domain',
-                                                        isEditable: true
-                                                    },
-
-                                                    domain: {
-                                                        label: 'label.domain'
-                                                    },
-                                                    subdomainaccess: {
-                                                        label: 'label.subdomain.access',
-                                                        converter: function (data) {
-                                                            return data ? 'Yes': 'No';
-                                                        }
-                                                    },
-                                                    account: {
-                                                        label: 'label.account'
-                                                    },
-                                                    project: {
-                                                        label: 'label.project'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    var data = {
-                                                        id: args.context.networks[0].id
-                                                    };
-                                                    if (args.context.networks[0].projectid != null) {
-                                                        $.extend(data, {
-                                                            projectid: -1
-                                                        });
-                                                    } else {
-                                                        $.extend(data, {
-                                                            listAll: true //pass "&listAll=true" to "listNetworks&id=xxxxxxxx" for now before API gets fixed.
-                                                        });
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL("listNetworks"),
-                                                        data: data,
-                                                        async: false,
-                                                        success: function (json) {
-                                                            selectedGuestNetworkObj = json.listnetworksresponse.network[0];
-                                                            addExtraPropertiesToGuestNetworkObject(selectedGuestNetworkObj);
-
-                                                            $(window).trigger('cloudStack.module.sharedFunctions.addExtraProperties', {
-                                                                obj: selectedGuestNetworkObj,
-                                                                objType: "Network"
-                                                            });
-
-                                                            args.response.success({
-                                                                actionFilter: cloudStack.actionFilter.guestNetwork,
-                                                                data: selectedGuestNetworkObj
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            },
-
-                            dedicatedGuestVlanRanges: {
-                                title: 'label.dedicated.vlan.vni.ranges',
-                                listView: {
-                                    section: 'dedicatedGuestVlanRanges',
-                                    id: 'dedicatedGuestVlanRanges',
-                                    fields: {
-                                        guestvlanrange: {
-                                            label: 'label.vlan.vni.ranges'
-                                        },
-                                        domain: {
-                                            label: 'label.domain'
-                                        },
-                                        account: {
-                                            label: 'label.account'
-                                        }
-                                    },
-                                    dataProvider: function (args) {
-                                        $.ajax({
-                                            url: createURL('listDedicatedGuestVlanRanges'),
-                                            data: {
-                                                physicalnetworkid: args.context.physicalNetworks[0].id
-                                            },
-                                            success: function (json) {
-                                                var items = json.listdedicatedguestvlanrangesresponse.dedicatedguestvlanrange;
-                                                args.response.success({
-                                                    data: items
-                                                })
-                                            }
-                                        });
-                                    },
-                                    actions: {
-                                        add: {
-                                            label: 'label.dedicate.vlan.vni.range',
-                                            messages: {
-                                                notification: function (args) {
-                                                    return 'label.dedicate.vlan.vni.range';
-                                                }
-                                            },
-                                            createForm: {
-                                                title: 'label.dedicate.vlan.vni.range',
-                                                fields: {
-                                                    vlanrange: {
-                                                        label: 'label.vlan.vni.range',
-                                                        validation: {
-                                                            required: true
-                                                        }
-                                                    },
-                                                    scope: {
-                                                        label: 'label.scope',
-                                                        docID: 'helpGuestNetworkZoneScope',
-                                                        select: function(args) {
-                                                            var array1 = [];
-
-                                                            array1.push({
-                                                                id: 'account-specific',
-                                                                description: 'label.account'
-                                                            });
-                                                            array1.push({
-                                                                id: 'project-specific',
-                                                                description: 'label.project'
-                                                            });
-
-                                                            args.response.success({
-                                                                data: array1
-                                                            });
-
-                                                            args.$select.change(function() {
-                                                                var $form = $(this).closest('form');
-
-                                                                if ($(this).val() == "account-specific") {
-                                                                    $form.find('.form-item[rel=domainId]').css('display', 'inline-block');
-                                                                    $form.find('.form-item[rel=account]').css('display', 'inline-block');
-                                                                    $form.find('.form-item[rel=projectId]').hide();
-                                                                } else if ($(this).val() == "project-specific") {
-                                                                    $form.find('.form-item[rel=domainId]').css('display', 'inline-block');
-                                                                    $form.find('.form-item[rel=account]').hide();
-                                                                    $form.find('.form-item[rel=projectId]').css('display', 'inline-block');
-                                                                }
-
-                                                                if (args.context.projects != null && args.context.projects.length > 0) {
-                                                                    $form.find('.form-item[rel=domainId]').hide();
-                                                                    $form.find('.form-item[rel=account]').hide();
-                                                                    $form.find('.form-item[rel=projectId]').hide();
-                                                                }
-                                                            });
-                                                        },
-                                                        isHidden: function(args) {
-                                                            if(args.context.projects != null && args.context.projects.length > 0)
-                                                                return true;
-                                                            else
-                                                                return false;
-                                                        }
-                                                    },
-                                                    domainId: {
-                                                        label: 'label.domain',
-                                                        validation: {
-                                                            required: true
-                                                        },
-                                                        select: function (args) {
-                                                            $.ajax({
-                                                                url: createURL('listDomains'),
-                                                                data: {
-                                                                    details: 'min',
-                                                                    listAll: true
-                                                                },
-                                                                success: function (json) {
-                                                                    args.response.success({
-                                                                        data: $.map(json.listdomainsresponse.domain, function (domain) {
-                                                                            return {
-                                                                                id: domain.id,
-                                                                                description: domain.path
-                                                                            };
-                                                                        })
-                                                                    });
-                                                                }
-                                                            });
-                                                        }
-                                                    },
-                                                    account: {
-                                                        label: 'label.account',
-                                                        validation: {
-                                                            required: true
-                                                        },
-                                                        dependsOn: 'domainId',
-                                                        select: function (args) {
-                                                            $.ajax({
-                                                                url: createURL('listAccounts&domainid=' + args.domainId),
-                                                                data: {
-                                                                    details: 'min',
-                                                                    listAll: true
-                                                                },
-                                                                success: function (json) {
-                                                                    args.response.success({
-                                                                        data: $.map(json.listaccountsresponse.account, function (account) {
-                                                                            return {
-                                                                                id: account.name,
-                                                                                description: account.name
-                                                                            };
-                                                                        })
-                                                                    });
-                                                                }
-                                                            });
-                                                        }
-                                                    },
-                                                    projectId: {
-                                                        label: 'label.project',
-                                                        validation: {
-                                                            required: true
-                                                        },
-                                                        dependsOn: 'domainId',
-                                                        select: function(args) {
-                                                            var items = [];
-                                                            $.ajax({
-                                                                url: createURL("listProjects&details=min&domainid=" + args.domainId),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function(json) {
-                                                                    projectObjs = json.listprojectsresponse.project;
-                                                                    $(projectObjs).each(function() {
-                                                                        items.push({
-                                                                            id: this.id,
-                                                                            description: this.name
-                                                                        });
-                                                                    });
-                                                                }
-                                                            });
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    }
-                                                }
-                                            },
-                                            action: function (args) {
-                                                var data = {
-                                                    physicalnetworkid: args.context.physicalNetworks[0].id,
-                                                    vlanrange: args.data.vlanrange
-                                                };
-
-                                                var $form = args.$form;
-
-                                                if (($form.find('.form-item[rel=domainId]').css("display") != "none") && (args.data.domainId != null && args.data.domainId.length > 0)) {
-                                                    $.extend(data, {
-                                                        domainid: args.data.domainId
-                                                    })
-                                                }
-
-                                                if (($form.find('.form-item[rel=account]').css("display") != "none") && (args.data.account != null && args.data.account.length > 0)) {
-                                                    $.extend(data, {
-                                                        account: args.data.account
-                                                    })
-                                                }
-
-                                                if (($form.find('.form-item[rel=projectId]').css("display") != "none") && (args.data.projectId != null && args.data.projectId.length > 0)) {
-                                                    $.extend(data, {
-                                                        projectid: args.data.projectId
-                                                    })
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('dedicateGuestVlanRange'),
-                                                    data: data,
-                                                    success: function (json) {
-                                                        var item = json.dedicateguestvlanrangeresponse.dedicatedguestvlanrange;
-                                                        args.response.success({
-                                                            data: item
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            notification: {
-                                                poll: function (args) {
-                                                    args.complete();
-                                                }
-                                            }
-                                        }
-                                    },
-
-                                    detailView: {
-                                        name: 'label.vlan.range.details',
-                                        actions: {
-                                            remove: {
-                                                label: 'label.release.dedicated.vlan.range',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.confirm.release.dedicate.vlan.range';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.release.dedicated.vlan.range';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    var data = {
-                                                        id: args.context.dedicatedGuestVlanRanges[0].id
-                                                    };
-                                                    $.ajax({
-                                                        url: createURL('releaseDedicatedGuestVlanRange'),
-                                                        data: data,
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.releasededicatedguestvlanrangeresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            }
-                                        },
-
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                fields:[ {
-                                                    guestvlanrange: {
-                                                        label: 'label.vlan.ranges'
-                                                    }
-                                                },
-                                                {
-                                                    domain: {
-                                                        label: 'label.domain'
-                                                    },
-                                                    account: {
-                                                        label: 'label.account'
-                                                    },
-                                                    id: {
-                                                        label: 'label.id'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('listDedicatedGuestVlanRanges'),
-                                                        data: {
-                                                            id: args.context.dedicatedGuestVlanRanges[0].id
-                                                        },
-                                                        success: function (json) {
-                                                            var item = json.listdedicatedguestvlanrangesresponse.dedicatedguestvlanrange[0];
-                                                            args.response.success({
-                                                                data: item
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            networks: {
-                listView: {
-                    id: 'physicalNetworks',
-                    hideToolbar: true,
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        state: {
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.state',
-                            indicator: {
-                                'Enabled': 'on',
-                                'Disabled': 'off'
-                            }
-                        },
-                        isolationmethods: {
-                            label: 'label.isolation.method'
-                        },
-                        vlan: {
-                            label: 'label.vlan'
-                        },
-                        broadcastdomainrange: {
-                            label: 'label.broadcast.domain.range'
-                        }
-                    },
-
-                    actions: {
-                        remove: {
-                            label: 'label.action.delete.physical.network',
-                            messages: {
-                                confirm: function (args) {
-                                    return 'message.action.delete.physical.network';
-                                },
-                                notification: function (args) {
-                                    return 'label.action.delete.physical.network';
-                                }
-                            },
-                            action: function (args) {
-                                $.ajax({
-                                    url: createURL("deletePhysicalNetwork&id=" + args.context.physicalNetworks[0].id),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function (json) {
-                                        var jid = json.deletephysicalnetworkresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    }
-                },
-                dataProvider: function (args) {
-                    $.ajax({
-                        url: createURL('listPhysicalNetworks'),
-                        data: {
-                            zoneid: args.context.zones[0].id
-                        },
-                        success: function (json) {
-                            physicalNetworkObjs = json.listphysicalnetworksresponse.physicalnetwork;
-                            args.response.success({
-                                actionFilter: cloudStack.actionFilter.physicalNetwork,
-                                data: json.listphysicalnetworksresponse.physicalnetwork
-                            });
-                        }
-                    });
-                }
-            },
-
-            trafficTypes: {
-                dataProvider: function (args) {
-                    selectedPhysicalNetworkObj = args.context.physicalNetworks[0];
-
-                    $.ajax({
-                        url: createURL('listTrafficTypes'),
-                        data: {
-                            physicalnetworkid: selectedPhysicalNetworkObj.id
-                        },
-                        success: function (json) {
-                            args.response.success({
-                                data: $.map(json.listtraffictypesresponse.traffictype, function (trafficType) {
-                                    return {
-                                        id: trafficType.id,
-                                        name: trafficType.traffictype
-                                    };
-                                })
-                            });
-                        }
-                    });
-                }
-            },
-
-            networkProviders: {
-                statusLabels: {
-                    enabled: 'Enabled', //having device, network service provider is enabled
-                    'not-configured': 'Not setup', //no device
-                    disabled: 'Disabled' //having device, network service provider is disabled
-                },
-
-                // Actions performed on entire net. provider type
-                actions: {
-                    enable: function (args) {
-                        args.response.success();
-                    },
-
-                    disable: function (args) {
-                        args.response.success();
-                    }
-                },
-
-                types: {
-                    virtualRouter: {
-                        id: 'virtualRouterProviders',
-                        label: 'label.virtual.router',
-                        isMaximized: true,
-                        type: 'detailView',
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            ipaddress: {
-                                label: 'label.ip.address'
-                            },
-                            state: {
-                                label: 'label.status',
-                                indicator: {
-                                    'Enabled': 'on'
-                                }
-                            }
-                        },
-                        tabs: {
-                            network: {
-                                title: 'label.network',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    physicalnetworkid: {
-                                        label: 'label.physical.network.ID'
-                                    },
-                                    destinationphysicalnetworkid: {
-                                        label: 'label.destination.physical.network.id'
-                                    },
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("VirtualRouter");
-                                    args.response.success({
-                                        actionFilter: virtualRouterProviderActionFilter,
-                                        data: $.extend(nspMap[ "virtualRouter"], {
-                                            supportedServices: nspMap[ "virtualRouter"].servicelist.join(', ')
-                                        })
-                                    });
-                                }
-                            },
-
-                            instances: {
-                                title: 'label.instances',
-                                listView: {
-                                    label: 'label.virtual.appliances',
-                                    id: 'routers',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        zonename: {
-                                            label: 'label.zone'
-                                        },
-                                        routerType: {
-                                            label: 'label.type'
-                                        },
-                                        state: {
-                                            converter: function (str) {
-                                                // For localization
-                                                return str;
-                                            },
-                                            label: 'label.status',
-                                            indicator: {
-                                                'Running': 'on',
-                                                'Stopped': 'off',
-                                                'Error': 'off'
-                                            }
-                                        }
-                                    },
-                                    dataProvider: function (args) {
-                                        var array1 =[];
-                                        if (args.filterBy != null) {
-                                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                                switch (args.filterBy.search.by) {
-                                                    case "name":
-                                                    if (args.filterBy.search.value.length > 0)
-                                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                                    break;
-                                                }
-                                            }
-                                        }
-
-                                        var data2 = {
-                                            forvpc: false
-                                        };
-                                        var routers =[];
-                                        $.ajax({
-                                            url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                            data: data2,
-                                            success: function (json) {
-                                                var items = json.listroutersresponse.router ?
-                                                json.listroutersresponse.router:[];
-
-                                                $(items).map(function (index, item) {
-                                                    routers.push(item);
-                                                });
-
-                                                /*
-                                                 * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
-                                                 * because in project view, all API calls are appended with projectid=[projectID].
-                                                 * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
-                                                 */
-                                                if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
-                                                $.ajax({
-                                                    url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
-                                                    data: data2,
-                                                        async: false,
-                                                    success: function (json) {
-                                                        var items = json.listroutersresponse.router ?
-                                                        json.listroutersresponse.router:[];
-
-                                                        $(items).map(function (index, item) {
-                                                            routers.push(item);
-                                                        });
-                                                        }
-                                                    });
-                                                }
-
-                                                        args.response.success({
-                                                            actionFilter: routerActionfilter,
-                                                            data: $(routers).map(mapRouterType)
-                                                        });
-                                                    }
-                                                });
-                                    },
-                                    detailView: {
-                                        name: 'label.virtual.appliance.details',
-                                        actions: {
-                                            start: {
-                                                label: 'label.action.start.router',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.action.start.router';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.action.start.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('startRouter&id=' + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.startrouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.router;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            stop: {
-                                                label: 'label.action.stop.router',
-                                                createForm: {
-                                                    title: 'label.action.stop.router',
-                                                    desc: 'message.action.stop.router',
-                                                    fields: {
-                                                        forced: {
-                                                            label: 'force.stop',
-                                                            isBoolean: true,
-                                                            isChecked: false
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.stop.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    var array1 =[];
-                                                    array1.push("&forced=" + (args.data.forced == "on"));
-                                                    $.ajax({
-                                                        url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.stoprouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.router;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            'remove': {
-                                                label: 'label.destroy.router',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        if (args && args.context && args.context.routers[0]) {
-                                                            if (args.context.routers[0].state == 'Running') {
-                                                                return dictionary['message.action.stop.router'] + ' ' + dictionary['message.confirm.destroy.router'];
-                                                            }
-                                                        }
-                                                        return 'message.confirm.destroy.router';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.destroy.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("destroyRouter&id=" + args.context.routers[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.destroyrouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            migrate: {
-                                                label: 'label.action.migrate.router',
-                                                createForm: {
-                                                    title: 'label.action.migrate.router',
-                                                    desc: '',
-                                                    fields: {
-                                                        hostId: {
-                                                            label: 'label.host',
-                                                            validation: {
-                                                                required: true
-                                                            },
-                                                            select: function (args) {
-                                                                $.ajax({
-                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
-                                                                    dataType: "json",
-                                                                    async: true,
-                                                                    success: function (json) {
-                                                                        var hostObjs = json.findhostsformigrationresponse.host;
-                                                                        var items =[];
-                                                                        $(hostObjs).each(function () {
-                                                                            items.push({
-                                                                                id: this.id,
-                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
-                                                                            });
-                                                                        });
-                                                                        args.response.success({
-                                                                            data: items
-                                                                        });
-                                                                    }
-                                                                });
-                                                            },
-                                                            error: function (XMLHttpResponse) {
-                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                args.response.error(errorMsg);
-                                                            }
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.migrate.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.migratesystemvmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
-                                                                        $.ajax({
-                                                                            url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
-                                                                            dataType: "json",
-                                                                            async: false,
-                                                                            success: function (json) {
-                                                                                var items = json.listroutersresponse.router;
-                                                                                if (items != null && items.length > 0) {
-                                                                                    return items[0];
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            viewConsole: {
-                                                label: 'label.view.console',
-                                                action: {
-                                                    externalLink: {
-                                                        url: function (args) {
-                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
-                                                        },
-                                                        title: function (args) {
-                                                            return args.context.routers[0].id.substr(0, 8);
-                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                                        },
-                                                        width: 820,
-                                                        height: 640
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                preFilter: function (args) {
-                                                    var hiddenFields =[];
-                                                    if (! args.context.routers[0].project) {
-                                                        hiddenFields.push('project');
-                                                        hiddenFields.push('projectid');
-                                                    }
-                                                    if (selectedZoneObj.networktype == 'Basic') {
-                                                        hiddenFields.push('publicip');
-                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
-                                                    }
-
-                                                    if ('routers' in args.context && args.context.routers[0].vpcid != undefined) {
-                                                        hiddenFields.push('guestnetworkid');
-                                                        hiddenFields.push('guestnetworkname');
-                                                    } else if ('routers' in args.context && args.context.routers[0].guestnetworkid != undefined) {
-                                                        hiddenFields.push('vpcid');
-                                                        hiddenFields.push('vpcname');
-                                                    }
-
-                                                    return hiddenFields;
-                                                },
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name'
-                                                    },
-                                                    project: {
-                                                        label: 'label.project'
-                                                    }
-                                                },
-                                                {
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    projectid: {
-                                                        label: 'label.project.id'
-                                                    },
-                                                    state: {
-                                                        label: 'label.state'
-                                                    },
-                                                    guestnetworkid: {
-                                                        label: 'label.network.id'
-                                                    },
-                                                    guestnetworkname: {
-                                                        label: 'label.network.name'
-                                                    },
-                                                    vpcid: {
-                                                        label: 'label.vpc.id'
-                                                    },
-                                                    vpcname: {
-                                                        label: 'label.vpc'
-                                                    },
-                                                    publicip: {
-                                                        label: 'label.public.ip'
-                                                    },
-                                                    guestipaddress: {
-                                                        label: 'label.guest.ip'
-                                                    },
-                                                    linklocalip: {
-                                                        label: 'label.linklocal.ip'
-                                                    },
-                                                    hostname: {
-                                                        label: 'label.host'
-                                                    },
-                                                    serviceofferingname: {
-                                                        label: 'label.compute.offering'
-                                                    },
-                                                    networkdomain: {
-                                                        label: 'label.network.domain'
-                                                    },
-                                                    domain: {
-                                                        label: 'label.domain'
-                                                    },
-                                                    account: {
-                                                        label: 'label.account'
-                                                    },
-                                                    created: {
-                                                        label: 'label.created',
-                                                        converter: cloudStack.converters.toLocalDate
-                                                    },
-                                                    isredundantrouter: {
-                                                        label: 'label.redundant.router',
-                                                        converter: cloudStack.converters.toBooleanText
-                                                    },
-                                                    redundantRouterState: {
-                                                        label: 'label.redundant.state'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jsonObj = json.listroutersresponse.router[0];
-                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
-                                                            args.response.success({
-                                                                actionFilter: routerActionfilter,
-                                                                data: jsonObj
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            nics: {
-                                                title: 'label.nics',
-                                                multiple: true,
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name',
-                                                        header: true
-                                                    },
-                                                    type: {
-                                                        label: 'label.type'
-                                                    },
-                                                    traffictype: {
-                                                        label: 'label.traffic.type'
-                                                    },
-                                                    networkname: {
-                                                        label: 'label.network.name'
-                                                    },
-                                                    netmask: {
-                                                        label: 'label.netmask'
-                                                    },
-                                                    ipaddress: {
-                                                        label: 'label.ip.address'
-                                                    },
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    networkid: {
-                                                        label: 'label.network.id'
-                                                    },
-                                                    isolationuri: {
-                                                        label: 'label.isolation.uri'
-                                                    },
-                                                    broadcasturi: {
-                                                        label: 'label.broadcast.uri'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jsonObj = json.listroutersresponse.router[0].nic;
-
-                                                            args.response.success({
-                                                                actionFilter: routerActionfilter,
-                                                                data: $.map(jsonObj, function (nic, index) {
-                                                                    var name = 'NIC ' + (index + 1);
-                                                                    if (nic.isdefault) {
-                                                                        name += ' (' + _l('label.default') + ')';
-                                                                    }
-                                                                    return $.extend(nic, {
-                                                                        name: name
-                                                                    });
-                                                                })
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        },
-                        actions: {
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "virtualRouter"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "virtualRouter"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    InternalLbVm: {
-                        id: 'InternalLbVm',
-                        label: 'label.internallbvm',
-                        isMaximized: true,
-                        type: 'detailView',
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            ipaddress: {
-                                label: 'label.ip.address'
-                            },
-                            state: {
-                                label: 'label.status',
-                                indicator: {
-                                    'Enabled': 'on'
-                                }
-                            }
-                        },
-                        tabs: {
-                            network: {
-                                title: 'label.network',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    physicalnetworkid: {
-                                        label: 'label.physical.network.ID'
-                                    },
-                                    destinationphysicalnetworkid: {
-                                        label: 'label.destination.physical.network.id'
-                                    },
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("InternalLbVm");
-                                    args.response.success({
-                                        actionFilter: virtualRouterProviderActionFilter,
-                                        data: $.extend(nspMap[ "InternalLbVm"], {
-                                            supportedServices: nspMap[ "InternalLbVm"].servicelist.join(', ')
-                                        })
-                                    });
-                                }
-                            },
-
-                            instances: {
-                                title: 'label.instances',
-                                listView: {
-                                    label: 'label.virtual.appliances',
-                                    id: 'internallbinstances',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        zonename: {
-                                            label: 'label.zone'
-                                        },
-                                        routerType: {
-                                            label: 'label.type'
-                                        },
-                                        state: {
-                                            converter: function (str) {
-                                                // For localization
-                                                return str;
-                                            },
-                                            label: 'label.status',
-                                            indicator: {
-                                                'Running': 'on',
-                                                'Stopped': 'off',
-                                                'Error': 'off'
-                                            }
-                                        }
-                                    },
-                                    dataProvider: function (args) {
-                                        var array1 =[];
-                                        if (args.filterBy != null) {
-                                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                                switch (args.filterBy.search.by) {
-                                                    case "name":
-                                                    if (args.filterBy.search.value.length > 0)
-                                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                                    break;
-                                                }
-                                            }
-                                        }
-
-                                        var routers =[];
-                                        $.ajax({
-                                            url: createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                            success: function (json) {
-                                                var items = json.listinternallbvmsresponse.internalloadbalancervm ?
-                                                json.listinternallbvmsresponse.internalloadbalancervm:[];
-
-                                                $(items).map(function (index, item) {
-                                                    routers.push(item);
-                                                });
-
-                                                // Get project routers
-                                                $.ajax({
-                                                    url: createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
-                                                    success: function (json) {
-                                                        var items = json.listinternallbvmsresponse.internalloadbalancervm ?
-                                                        json.listinternallbvmsresponse.internalloadbalancervm:[];
-
-                                                        $(items).map(function (index, item) {
-                                                            routers.push(item);
-                                                        });
-                                                        args.response.success({
-                                                            actionFilter: internallbinstanceActionfilter,
-                                                            data: $(routers).map(mapRouterType)
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    detailView: {
-                                        name: 'label.virtual.appliance.details',
-                                        actions: {
-                                            start: {
-                                                label: 'label.start.lb.vm',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.confirm.start.lb.vm';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.start.lb.vm';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('startInternalLoadBalancerVM&id=' + args.context.internallbinstances[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.startinternallbvmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.internalloadbalancervm;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return internallbinstanceActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            stop: {
-                                                label: 'label.stop.lb.vm',
-                                                createForm: {
-                                                    title: 'message.confirm.stop.lb.vm',
-                                                    desc: 'label.stop.lb.vm',
-                                                    fields: {
-                                                        forced: {
-                                                            label: 'force.stop',
-                                                            isBoolean: true,
-                                                            isChecked: false
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.stop.lb.vm';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    var array1 =[];
-                                                    array1.push("&forced=" + (args.data.forced == "on"));
-                                                    $.ajax({
-                                                        url: createURL('stopInternalLoadBalancerVM&id=' + args.context.internallbinstances[0].id + array1.join("")),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.stopinternallbvmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.internalloadbalancervm;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return internallbinstanceActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            migrate: {
-                                                label: 'label.migrate.lb.vm',
-                                                createForm: {
-                                                    title: 'label.migrate.lb.vm',
-                                                    fields: {
-                                                        hostId: {
-                                                            label: 'label.host',
-                                                            validation: {
-                                                                required: true
-                                                            },
-                                                            select: function (args) {
-                                                                $.ajax({
-                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.internallbinstances[0].id),
-                                                                    dataType: "json",
-                                                                    async: true,
-                                                                    success: function (json) {
-                                                                        var hostObjs = json.findhostsformigrationresponse.host;
-                                                                        var items =[];
-                                                                        $(hostObjs).each(function () {
-                                                                            items.push({
-                                                                                id: this.id,
-                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
-                                                                            });
-                                                                        });
-                                                                        args.response.success({
-                                                                            data: items
-                                                                        });
-                                                                    }
-                                                                });
-                                                            },
-                                                            error: function (XMLHttpResponse) {
-                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                args.response.error(errorMsg);
-                                                            }
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.migrate.lb.vm';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.internallbinstances[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.migratesystemvmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
-                                                                        $.ajax({
-                                                                            url: createURL("listInternalLoadBalancerVMs&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
-                                                                            dataType: "json",
-                                                                            async: false,
-                                                                            success: function (json) {
-                                                                                var items = json.listinternallbvmsresponse.internalloadbalancervm;
-                                                                                if (items != null && items.length > 0) {
-                                                                                    return items[0];
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return internallbinstanceActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            viewConsole: {
-                                                label: 'label.view.console',
-                                                action: {
-                                                    externalLink: {
-                                                        url: function (args) {
-                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.internallbinstances[0].id;
-                                                        },
-                                                        title: function (args) {
-                                                            return args.context.internallbinstances[0].id.substr(0, 8);
-                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                                        },
-                                                        width: 820,
-                                                        height: 640
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                preFilter: function (args) {
-                                                    var hiddenFields =[];
-                                                    if (! args.context.internallbinstances[0].project) {
-                                                        hiddenFields.push('project');
-                                                        hiddenFields.push('projectid');
-                                                    }
-                                                    if (selectedZoneObj.networktype == 'Basic') {
-                                                        hiddenFields.push('publicip');
-                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
-                                                    }
-
-                                                    if ('routers' in args.context && args.context.routers[0].vpcid != undefined) {
-                                                        hiddenFields.push('guestnetworkid');
-                                                        hiddenFields.push('guestnetworkname');
-                                                    } else if ('routers' in args.context && args.context.routers[0].guestnetworkid != undefined) {
-                                                        hiddenFields.push('vpcid');
-                                                        hiddenFields.push('vpcname');
-                                                    }
-
-                                                    return hiddenFields;
-                                                },
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name'
-                                                    },
-                                                    project: {
-                                                        label: 'label.project'
-                                                    }
-                                                },
-                                                {
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    projectid: {
-                                                        label: 'label.project.id'
-                                                    },
-                                                    state: {
-                                                        label: 'label.state'
-                                                    },
-                                                    guestnetworkid: {
-                                                        label: 'label.network.id'
-                                                    },
-                                                    guestnetworkname: {
-                                                        label: 'label.network.name'
-                                                    },
-                                                    vpcid: {
-                                                        label: 'label.vpc.id'
-                                                    },
-                                                    vpcname: {
-                                                        label: 'label.vpc'
-                                                    },
-                                                    publicip: {
-                                                        label: 'label.public.ip'
-                                                    },
-                                                    guestipaddress: {
-                                                        label: 'label.guest.ip'
-                                                    },
-                                                    linklocalip: {
-                                                        label: 'label.linklocal.ip'
-                                                    },
-                                                    hostname: {
-                                                        label: 'label.host'
-                                                    },
-                                                    serviceofferingname: {
-                                                        label: 'label.compute.offering'
-                                                    },
-                                                    networkdomain: {
-                                                        label: 'label.network.domain'
-                                                    },
-                                                    domain: {
-                                                        label: 'label.domain'
-                                                    },
-                                                    account: {
-                                                        label: 'label.account'
-                                                    },
-                                                    created: {
-                                                        label: 'label.created',
-                                                        converter: cloudStack.converters.toLocalDate
-                                                    },
-                                                    isredundantrouter: {
-                                                        label: 'label.redundant.router',
-                                                        converter: cloudStack.converters.toBooleanText
-                                                    },
-                                                    redundantRouterState: {
-                                                        label: 'label.redundant.state'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listInternalLoadBalancerVMs&id=" + args.context.internallbinstances[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jsonObj = json.listinternallbvmsresponse.internalloadbalancervm[0];
-                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
-                                                            args.response.success({
-                                                                actionFilter: internallbinstanceActionfilter,
-                                                                data: jsonObj
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            nics: {
-                                                title: 'label.nics',
-                                                multiple: true,
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name',
-                                                        header: true
-                                                    },
-                                                    type: {
-                                                        label: 'label.type'
-                                                    },
-                                                    traffictype: {
-                                                        label: 'label.traffic.type'
-                                                    },
-                                                    networkname: {
-                                                        label: 'label.network.name'
-                                                    },
-                                                    netmask: {
-                                                        label: 'label.netmask'
-                                                    },
-                                                    ipaddress: {
-                                                        label: 'label.ip.address'
-                                                    },
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    networkid: {
-                                                        label: 'label.network.id'
-                                                    },
-                                                    isolationuri: {
-                                                        label: 'label.isolation.uri'
-                                                    },
-                                                    broadcasturi: {
-                                                        label: 'label.broadcast.uri'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listInternalLoadBalancerVMs&id=" + args.context.internallbinstances[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jsonObj = json.listinternallbvmsresponse.internalloadbalancervm[0].nic;
-
-                                                            args.response.success({
-                                                                actionFilter: internallbinstanceActionfilter,
-                                                                data: $.map(jsonObj, function (nic, index) {
-                                                                    var name = 'NIC ' + (index + 1);
-                                                                    if (nic.isdefault) {
-                                                                        name += ' (' + _l('label.default') + ')';
-                                                                    }
-                                                                    return $.extend(nic, {
-                                                                        name: name
-                                                                    });
-                                                                })
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        },
-                        actions: {
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "InternalLbVm"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "InternalLbVm"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    vpcVirtualRouter: {
-                        id: 'vpcVirtualRouterProviders',
-                        label: 'label.vpc.virtual.router',
-                        isMaximized: true,
-                        type: 'detailView',
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            ipaddress: {
-                                label: 'label.ip.address'
-                            },
-                            state: {
-                                label: 'label.status',
-                                indicator: {
-                                    'Enabled': 'on'
-                                }
-                            }
-                        },
-                        tabs: {
-                            network: {
-                                title: 'label.network',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    physicalnetworkid: {
-                                        label: 'label.physical.network.ID'
-                                    },
-                                    destinationphysicalnetworkid: {
-                                        label: 'label.destination.physical.network.id'
-                                    },
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("VpcVirtualRouter");
-                                    args.response.success({
-                                        actionFilter: virtualRouterProviderActionFilter,
-                                        data: $.extend(nspMap[ "vpcVirtualRouter"], {
-                                            supportedServices: nspMap[ "vpcVirtualRouter"].servicelist.join(', ')
-                                        })
-                                    });
-                                }
-                            },
-
-                            instances: {
-                                title: 'label.instances',
-                                listView: {
-                                    label: 'label.virtual.appliances',
-                                    id: 'routers',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        zonename: {
-                                            label: 'label.zone'
-                                        },
-                                        routerType: {
-                                            label: 'label.type'
-                                        },
-                                        state: {
-                                            converter: function (str) {
-                                                // For localization
-                                                return str;
-                                            },
-                                            label: 'label.status',
-                                            indicator: {
-                                                'Running': 'on',
-                                                'Stopped': 'off',
-                                                'Error': 'off'
-                                            }
-                                        }
-                                    },
-                                    dataProvider: function (args) {
-                                        var array1 =[];
-                                        if (args.filterBy != null) {
-                                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                                switch (args.filterBy.search.by) {
-                                                    case "name":
-                                                    if (args.filterBy.search.value.length > 0)
-                                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                                    break;
-                                                }
-                                            }
-                                        }
-
-                                        var data2 = {
-                                            forvpc: true
-                                        };
-                                        var routers =[];
-                                        $.ajax({
-                                            url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                            dataType: 'json',
-                                            data: data2,
-                                            async: true,
-                                            success: function (json) {
-                                                var items = json.listroutersresponse.router;
-                                                $(items).map(function (index, item) {
-                                                    routers.push(item);
-                                                });
-
-                                                /*
-                                                 * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
-                                                 * because in project view, all API calls are appended with projectid=[projectID].
-                                                 * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
-                                                 */
-                                                if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
-                                                $.ajax({
-                                                    url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
-                                                    dataType: 'json',
-                                                    data: data2,
-                                                        async: false,
-                                                    success: function (json) {
-                                                        var items = json.listroutersresponse.router;
-                                                        $(items).map(function (index, item) {
-                                                            routers.push(item);
-                                                        });
-                                                        }
-                                                    });
-                                                }
-
-                                                        args.response.success({
-                                                            actionFilter: routerActionfilter,
-                                                            data: $(routers).map(mapRouterType)
-                                                        });
-                                                    }
-                                                });
-                                    },
-                                    detailView: {
-                                        name: 'label.virtual.appliance.details',
-                                        actions: {
-                                            start: {
-                                                label: 'label.action.start.router',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.action.start.router';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.action.start.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('startRouter&id=' + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.startrouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.router;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            stop: {
-                                                label: 'label.action.stop.router',
-                                                createForm: {
-                                                    title: 'label.action.stop.router',
-                                                    desc: 'message.action.stop.router',
-                                                    fields: {
-                                                        forced: {
-                                                            label: 'force.stop',
-                                                            isBoolean: true,
-                                                            isChecked: false
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.stop.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    var array1 =[];
-                                                    array1.push("&forced=" + (args.data.forced == "on"));
-                                                    $.ajax({
-                                                        url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.stoprouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.router;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            restart: {
-                                                label: 'label.action.reboot.router',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.action.reboot.router';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.action.reboot.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('rebootRouter&id=' + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.rebootrouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.router;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            'remove': {
-                                                label: 'label.destroy.router',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        if (args && args.context && args.context.routers[0]) {
-                                                            if (args.context.routers[0].state == 'Running') {
-                                                                return dictionary['message.action.stop.router'] + ' ' + dictionary['message.confirm.destroy.router'];
-                                                            }
-                                                        }
-                                                        return 'message.confirm.destroy.router';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.destroy.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("destroyRouter&id=" + args.context.routers[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.destroyrouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            migrate: {
-                                                label: 'label.action.migrate.router',
-                                                createForm: {
-                                                    title: 'label.action.migrate.router',
-                                                    desc: '',
-                                                    fields: {
-                                                        hostId: {
-                                                            label: 'label.host',
-                                                            validation: {
-                                                                required: true
-                                                            },
-                                                            select: function (args) {
-                                                                $.ajax({
-                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
-                                                                    dataType: "json",
-                                                                    async: true,
-                                                                    success: function (json) {
-                                                                        var hostObjs = json.findhostsformigrationresponse.host;
-                                                                        var items =[];
-                                                                        $(hostObjs).each(function () {
-                                                                            items.push({
-                                                                                id: this.id,
-                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
-                                                                            });
-                                                                        });
-                                                                        args.response.success({
-                                                                            data: items
-                                                                        });
-                                                                    }
-                                                                });
-                                                            },
-                                                            error: function (XMLHttpResponse) {
-                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                args.response.error(errorMsg);
-                                                            }
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.migrate.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.migratesystemvmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
-                                                                        $.ajax({
-                                                                            url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
-                                                                            dataType: "json",
-                                                                            async: false,
-                                                                            success: function (json) {
-                                                                                var items = json.listroutersresponse.router;
-                                                                                if (items != null && items.length > 0) {
-                                                                                    return items[0];
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            diagnostics: {
-                                                label: 'label.action.run.diagnostics',
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.run.diagnostics';
-                                                    },
-                                                    complete: function(args) {
-                                                        var exitcode = _l('message.diagnostics.exitcode');
-                                                        exitcode = exitcode.replace('var', args.exitcode);
-                                                        var stderr = _l('message.diagnostics.stderr');
-                                                        stderr = stderr.replace('var', args.stderr);
-                                                        var stdout = _l('message.diagnostics.stdout');
-                                                        stdout = stdout.replace('var', args.stdout);
-                                                        var msg = "<div style='text-align: left; overflow-y: auto'>" + exitcode + "<br><br>" + stderr + "<br><br>" + stdout + "</div>";
-                                                        return msg;
-                                                    }
-                                                },
-                                                createForm: {
-                                                    title: 'label.action.run.diagnostics',
-                                                    desc: '',
-                                                    fields: {
-                                                        type: {
-                                                            label: 'label.run.diagnostics.type',
-                                                            validation: {
-                                                                required: true
-                                                            },
-                                                            select: function (args) {
-                                                                var items = [];
-                                                                items.push({
-                                                                    id: "ping",
-                                                                    description: "Ping"
-                                                                });
-                                                                items.push({
-                                                                    id: "traceroute",
-                                                                    description: "Traceroute"
-                                                                });
-                                                                items.push({
-                                                                    id: "arping",
-                                                                    description: "Arping"
-                                                                });
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-                                                            }
-                                                        },
-                                                        destination: {
-                                                            label: 'label.run.diagnostics.destination',
-                                                            validation: {
-                                                                required: true
-                                                            }
-                                                        },
-                                                        extra: {
-                                                            label: 'label.run.diagnostics.extra'
-                                                        }
-
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("runDiagnostics&targetid=" + args.context.systemVMs[0].id + "&ipaddress=" + args.data.destination + "&type=" + args.data.type + "&params=" + args.data.extra),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function(json) {
-                                                            var jid = json.rundiagnosticsresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId : jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                                    },
-                                                                    getActionFilter: function(){
-                                                                        return systemvmActionfilter;
-                                                                   }
-                                                                }
-
-                                                            });
-                                                        }
-                                                    }); //end ajax
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            retrieveDiagnostics: {
-                                                label: 'label.action.get.diagnostics',
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.get.diagnostics';
-                                                    },
-                                                    complete: function(args) {
-                                                        var url = args.url;
-                                                        var htmlMsg = _l('message.download.diagnostics');
-                                                        var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
-                                                        return htmlMsg2;
-                                                    }
-                                                },
-                                                createForm: {
-                                                    title: 'label.action.get.diagnostics',
-                                                    desc: 'label.get.diagnostics.desc',
-                                                    fields: {
-                                                        files: {
-                                                            label: 'label.get.diagnostics.files'
-                                                        }
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("getDiagnosticsData&targetid=" + args.context.routers[0].id + "&files=" + args.data.files),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function(json) {
-                                                            var jid = json.getdiagnosticsdataresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId : jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                                    },
-                                                                    getActionFilter: function(){
-                                                                        return systemvmActionfilter;
-                                                                   }
-                                                                }
-
-                                                            });
-                                                        }
-                                                    }); //end ajax
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            viewConsole: {
-                                                label: 'label.view.console',
-                                                action: {
-                                                    externalLink: {
-                                                        url: function (args) {
-                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
-                                                        },
-                                                        title: function (args) {
-                                                            return args.context.routers[0].id.substr(0, 8);
-                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                                        },
-                                                        width: 820,
-                                                        height: 640
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                preFilter: function (args) {
-                                                    var hiddenFields =[];
-                                                    if (! args.context.routers[0].project) {
-                                                        hiddenFields.push('project');
-                                                        hiddenFields.push('projectid');
-                                                    }
-                                                    if (selectedZoneObj.networktype == 'Basic') {
-                                                        hiddenFields.push('publicip');
-                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
-                                                    }
-                                                    return hiddenFields;
-                                                },
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name'
-                                                    },
-                                                    project: {
-                                                        label: 'label.project'
-                                                    }
-                                                },
-                                                {
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    projectid: {
-                                                        label: 'label.project.id'
-                                                    },
-                                                    state: {
-                                                        label: 'label.state'
-                                                    },
-                                                    publicip: {
-                                                        label: 'label.public.ip'
-                                                    },
-                                                    guestipaddress: {
-                                                        label: 'label.guest.ip'
-                                                    },
-                                                    linklocalip: {
-                                                        label: 'label.linklocal.ip'
-                                                    },
-                                                    hostname: {
-                                                        label: 'label.host'
-                                                    },
-                                                    serviceofferingname: {
-                                                        label: 'label.compute.offering'
-                                                    },
-                                                    networkdomain: {
-                                                        label: 'label.network.domain'
-                                                    },
-                                                    domain: {
-                                                        label: 'label.domain'
-                                                    },
-                                                    account: {
-                                                        label: 'label.account'
-                                                    },
-                                                    created: {
-                                                        label: 'label.created',
-                                                        converter: cloudStack.converters.toLocalDate
-                                                    },
-                                                    isredundantrouter: {
-                                                        label: 'label.redundant.router',
-                                                        converter: cloudStack.converters.toBooleanText
-                                                    },
-                                                    redundantRouterState: {
-                                                        label: 'label.redundant.state'
-                                                    },
-                                                    vpcid: {
-                                                        label: 'label.vpc.id'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jsonObj = json.listroutersresponse.router[0];
-                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
-                                                            args.response.success({
-                                                                actionFilter: routerActionfilter,
-                                                                data: jsonObj
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        },
-                        actions: {
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "vpcVirtualRouter"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "vpcVirtualRouter"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    Ovs: {
-                        id: "Ovs",
-                        label: "label.ovs",
-                        isMaximized: true,
-                        type: 'detailView',
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            state: {
-                                label: 'label.status',
-                                indicator: {
-                                    'Enabled': 'on'
-                                }
-                            }
-                        },
-                        tabs: {
-                            network: {
-                                title: 'label.network',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    physicalnetworkid: {
-                                        label: 'label.physical.network.ID'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    refreshNspData("Ovs");
-                                    args.response.success({
-                                        actionFilter: ovsProviderActionFilter,
-                                        data: $.extend(nspMap["Ovs"], {
-                                            supportedServices: nspMap["Ovs"] == undefined? "": nspMap["Ovs"].servicelist.join(', ')
-                                        })
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["Ovs"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function() {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["Ovs"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function() {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    // NetScaler provider detail view
-                    netscaler: {
-                        type: 'detailView',
-                        id: 'netscalerProvider',
-                        label: 'label.netScaler',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.netscalerDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("Netscaler");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "netscaler") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('netscaler')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.netScaler.device',
-                                createForm: {
-                                    title: 'label.add.netScaler.device',
-                                    preFilter: cloudStack.preFilter.addLoadBalancerDevice,
-                                    fields: {
-                                        ip: {
-                                            label: 'label.ip.address',
-                                            docID: 'helpNetScalerIPAddress'
-                                        },
-                                        username: {
-                                            label: 'label.username',
-                                            docID: 'helpNetScalerUsername'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true,
-                                            docID: 'helpNetScalerPassword'
-                                        },
-                                        networkdevicetype: {
-                                            label: 'label.type',
-                                            docID: 'helpNetScalerType',
-                                            select: function (args) {
-                                                var items =[];
-                                                items.push({
-                                                    id: "NetscalerMPXLoadBalancer",
-                                                    description: "NetScaler MPX LoadBalancer"
-                                                });
-                                                items.push({
-                                                    id: "NetscalerVPXLoadBalancer",
-                                                    description: "NetScaler VPX LoadBalancer"
-                                                });
-                                                items.push({
-                                                    id: "NetscalerSDXLoadBalancer",
-                                                    description: "NetScaler SDX LoadBalancer"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        },
-                                        publicinterface: {
-                                            label: 'label.public.interface',
-                                            docID: 'helpNetScalerPublicInterface'
-                                        },
-                                        privateinterface: {
-                                            label: 'label.private.interface',
-                                            docID: 'helpNetScalerPrivateInterface'
-                                        },
-
-                                        gslbprovider: {
-                                            label: 'label.gslb.service',
-                                            isBoolean: true,
-                                            isChecked: false
-                                        },
-                                        gslbproviderpublicip: {
-                                            label: 'label.gslb.service.public.ip'
-                                        },
-                                        gslbproviderprivateip: {
-                                            label: 'label.gslb.service.private.ip'
-                                        },
-
-                                        numretries: {
-                                            label: 'label.numretries',
-                                            defaultValue: '2',
-                                            docID: 'helpNetScalerRetries'
-                                        },
-                                        // inline: {
-                                        //   label: 'Mode',
-                                        //   select: function(args) {
-                                        //     var items = [];
-                                        //     items.push({id: "false", description: "side by side"});
-                                        //     items.push({id: "true", description: "inline"});
-                                        //     args.response.success({data: items});
-                                        //   }
-                                        // },
-                                        dedicated: {
-                                            label: 'label.dedicated',
-                                            isBoolean: true,
-                                            isChecked: false,
-                                            docID: 'helpNetScalerDedicated'
-                                        },
-                                        capacity: {
-                                            label: 'label.capacity',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            },
-                                            docID: 'helpNetScalerCapacity'
-                                        }
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.netScaler.device';
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "netscaler"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addNetscalerProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addNetscalerProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "netscaler"] = result.jobresult.networkserviceprovider;
-                                                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                g_queryAsyncJobResultInterval);
-                                            }
-                                        });
-                                    } else {
-                                        addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "netscaler"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "netscaler"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "netscaler"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    //Baremetal DHCP provider detail view
-                    BaremetalDhcpProvider: {
-                        type: 'detailView',
-                        id: 'BaremetalDhcpProvider',
-                        label: 'label.baremetal.dhcp.provider',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.BaremetalDhcpDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("BaremetalDhcpProvider");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "BaremetalDhcpProvider") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('BaremetalDhcpProvider')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.baremetal.dhcp.device',
-                                createForm: {
-                                    title: 'label.add.baremetal.dhcp.device',
-                                    fields: {
-                                        url: {
-                                            label: 'label.url',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        username: {
-                                            label: 'label.username',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true,
-                                            validation: {
-                                                required: true
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    addBaremetalDhcpDeviceFn(args);
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.baremetal.dhcp.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalDhcpProvider"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalDhcpProvider"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "BaremetalDhcpProvider"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    //Baremetal PXE provider detail view
-                    BaremetalPxeProvider: {
-                        type: 'detailView',
-                        id: 'BaremetalPxeProvider',
-                        label: 'label.baremetal.pxe.provider',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.BaremetalPxeDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("BaremetalPxeProvider");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "BaremetalPxeProvider") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('BaremetalPxeProvider')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.baremetal.pxe.device',
-                                createForm: {
-                                    title: 'label.baremetal.pxe.device',
-                                    fields: {
-                                        url: {
-                                            label: 'label.url',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        username: {
-                                            label: 'label.username',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true,
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        tftpdir: {
-                                            label: 'label.tftp.root.directory',
-                                            validation: {
-                                                required: true
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    addBaremetalPxeDeviceFn(args);
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.baremetal.pxe.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalPxeProvider"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalPxeProvider"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "BaremetalPxeProvider"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    //f5 provider detail view
-                    f5: {
-                        type: 'detailView',
-                        id: 'f5Provider',
-                        label: 'label.f5',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.f5Devices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("F5BigIp");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "f5") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('f5')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.F5.device',
-                                createForm: {
-                                    title: 'label.add.F5.device',
-                                    preFilter: cloudStack.preFilter.addLoadBalancerDevice,
-                                    fields: {
-                                        ip: {
-                                            label: 'label.ip.address',
-                                            docID: 'helpF5IPAddress'
-                                        },
-                                        username: {
-                                            label: 'label.username',
-                                            docID: 'helpF5Username'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            docID: 'helpF5Password',
-                                            isPassword: true
-                                        },
-                                        networkdevicetype: {
-                                            label: 'label.type',
-                                            docID: 'helpF5Type',
-                                            select: function (args) {
-                                                var items =[];
-                                                items.push({
-                                                    id: "F5BigIpLoadBalancer",
-                                                    description: "F5 Big Ip Load Balancer"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        },
-                                        publicinterface: {
-                                            label: 'label.public.interface',
-                                            docID: 'helpF5PublicInterface'
-                                        },
-                                        privateinterface: {
-                                            label: 'label.private.interface',
-                                            docID: 'helpF5PrivateInterface'
-                                        },
-                                        numretries: {
-                                            label: 'label.numretries',
-                                            docID: 'helpF5Retries',
-                                            defaultValue: '2'
-                                        },
-                                        //Inline Mode has been moved from Add F5 Device to Create Network Offering (both backend and UI)
-                                        /*
-                                        inline: {
-                                        label: 'Mode',
-                                        docID: 'helpF5Mode',
-                                        select: function(args) {
-                                        var items = [];
-                                        items.push({id: "false", description: "side by side"});
-                                        items.push({id: "true", description: "inline"});
-                                        args.response.success({data: items});
-                                        }
-                                        },
-                                         */
-                                        dedicated: {
-                                            label: 'label.dedicated',
-                                            docID: 'helpF5Dedicated',
-                                            isBoolean: true,
-                                            isChecked: false
-                                        },
-                                        capacity: {
-                                            label: 'label.capacity',
-                                            docID: 'helpF5Capacity',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "f5"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=F5BigIp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addF5ProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addF5ProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "f5"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse");
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=F5BigIp failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=F5BigIpfailed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                g_queryAsyncJobResultInterval);
-                                            }
-                                        });
-                                    } else {
-                                        addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse");
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.F5.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "f5"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "f5"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "f5"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    // SRX provider detailView
-                    srx: {
-                        type: 'detailView',
-                        id: 'srxProvider',
-                        label: 'label.srx',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.srxDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("JuniperSRX");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "srx") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('srx')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.SRX.device',
-                                createForm: {
-                                    title: 'label.add.SRX.device',
-                                    fields: {
-                                        ip: {
-                                            label: 'label.ip.address',
-                                            docID: 'helpSRXIPAddress'
-                                        },
-                                        username: {
-                                            label: 'label.username',
-                                            docID: 'helpSRXUsername'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true,
-                                            docID: 'helpSRXPassword'
-                                        },
-                                        networkdevicetype: {
-                                            label: 'label.type',
-                                            docID: 'helpSRXType',
-                                            select: function (args) {
-                                                var items =[];
-                                                items.push({
-                                                    id: "JuniperSRXFirewall",
-                                                    description: "Juniper SRX Firewall"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        },
-                                        publicinterface: {
-                                            label: 'label.public.interface',
-                                            docID: 'helpSRXPublicInterface'
-                                        },
-                                        privateinterface: {
-                                            label: 'label.private.interface',
-                                            docID: 'helpSRXPrivateInterface'
-                                        },
-                                        usageinterface: {
-                                            label: 'label.usage.interface',
-                                            docID: 'helpSRXUsageInterface'
-                                        },
-                                        numretries: {
-                                            label: 'label.numretries',
-                                            defaultValue: '2',
-                                            docID: 'helpSRXRetries'
-                                        },
-                                        timeout: {
-                                            label: 'label.timeout',
-                                            defaultValue: '300',
-                                            docID: 'helpSRXTimeout'
-                                        },
-                                        // inline: {
-                                        //   label: 'Mode',
-                                        //   docID: 'helpSRXMode',
-                                        //   select: function(args) {
-                                        //     var items = [];
-                                        //     items.push({id: "false", description: "side by side"});
-                                        //     items.push({id: "true", description: "inline"});
-                                        //     args.response.success({data: items});
-                                        //   }
-                                        // },
-                                        publicnetwork: {
-                                            label: 'label.public.network',
-                                            defaultValue: 'untrusted',
-                                            docID: 'helpSRXPublicNetwork',
-                                            isDisabled: true
-                                        },
-                                        privatenetwork: {
-                                            label: 'label.private.network',
-                                            defaultValue: 'trusted',
-                                            docID: 'helpSRXPrivateNetwork',
-                                            isDisabled: true
-                                        },
-                                        capacity: {
-                                            label: 'label.capacity',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            },
-                                            docID: 'helpSRXCapacity'
-                                        },
-                                        dedicated: {
-                                            label: 'label.dedicated',
-                                            isBoolean: true,
-                                            isChecked: false,
-                                            docID: 'helpSRXDedicated'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "srx"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=JuniperSRX&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addJuniperSRXProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addJuniperSRXProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "srx"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                g_queryAsyncJobResultInterval);
-                                            }
-                                        });
-                                    } else {
-                                        addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.SRX.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "srx"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "srx"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "srx"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    // Palo Alto provider detailView
-                    pa: {
-                        type: 'detailView',
-                        id: 'paProvider',
-                        label: 'label.PA',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.paDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("PaloAlto");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "pa") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('pa')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.PA.device',
-                                createForm: {
-                                    title: 'label.add.PA.device',
-                                    fields: {
-                                        ip: {
-                                            label: 'label.ip.address',
-                                            docID: 'helpPaloAltoIPAddress'
-                                        },
-                                        username: {
-                                            label: 'label.username',
-                                            docID: 'helpPaloAltoUsername'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true,
-                                            docID: 'helpPaloAltoPassword'
-                                        },
-                                        networkdevicetype: {
-                                            label: 'label.type',
-                                            docID: 'helpPaloAltoType',
-                                            select: function (args) {
-                                                var items =[];
-                                                items.push({
-                                                    id: "PaloAltoFirewall",
-                                                    description: "Palo Alto Firewall"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        },
-                                        publicinterface: {
-                                            label: 'label.public.interface',
-                                            docID: 'helpPaloAltoPublicInterface'
-                                        },
-                                        privateinterface: {
-                                            label: 'label.private.interface',
-                                            docID: 'helpPaloAltoPrivateInterface'
-                                        },
-                                        //usageinterface: {
-                                        //  label: 'Usage interface',
-                                        //  docID: 'helpPaloAltoUsageInterface'
-                                        //},
-                                        numretries: {
-                                            label: 'label.numretries',
-                                            defaultValue: '2',
-                                            docID: 'helpPaloAltoRetries'
-                                        },
-                                        timeout: {
-                                            label: 'label.timeout',
-                                            defaultValue: '300',
-                                            docID: 'helpPaloAltoTimeout'
-                                        },
-                                        // inline: {
-                                        //   label: 'Mode',
-                                        //   docID: 'helpPaloAltoMode',
-                                        //   select: function(args) {
-                                        //     var items = [];
-                                        //     items.push({id: "false", description: "side by side"});
-                                        //     items.push({id: "true", description: "inline"});
-                                        //     args.response.success({data: items});
-                                        //   }
-                                        // },
-                                        publicnetwork: {
-                                            label: 'label.public.network',
-                                            defaultValue: 'untrust',
-                                            docID: 'helpPaloAltoPublicNetwork'
-                                        },
-                                        privatenetwork: {
-                                            label: 'label.private.network',
-                                            defaultValue: 'trust',
-                                            docID: 'helpPaloAltoPrivateNetwork'
-                                        },
-                                        pavr: {
-                                            label: 'label.virtual.router',
-                                            docID: 'helpPaloAltoVirtualRouter'
-                                        },
-                                        patp: {
-                                            label: 'label.PA.threat.profile',
-                                            docID: 'helpPaloAltoThreatProfile'
-                                        },
-                                        palp: {
-                                            label: 'label.PA.log.profile',
-                                            docID: 'helpPaloAltoLogProfile'
-                                        },
-                                        capacity: {
-                                            label: 'label.capacity',
-                                            validation: {
-                                                required: false,
-                                                number: true
-                                            },
-                                            docID: 'helpPaloAltoCapacity'
-                                        },
-                                        dedicated: {
-                                            label: 'label.dedicated',
-                                            isBoolean: true,
-                                            isChecked: false,
-                                            docID: 'helpPaloAltoDedicated'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "pa"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=PaloAlto&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addPaloAltoProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addPaloAltoProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "pa"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                3000);
-                                            }
-                                        });
-                                    } else {
-                                        addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.PA.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "pa"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "pa"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "pa"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    // Security groups detail view
-                    securityGroups: {
-                        id: 'securityGroup-providers',
-                        label: 'label.menu.security.groups',
-                        type: 'detailView',
-                        viewAll: {
-                            label: 'label.rules',
-                            path: 'network.securityGroups'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("SecurityGroupProvider");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "securityGroups") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        actionFilter: function (args) {
-                                            var allowedActions =[];
-                                            var jsonObj = providerObj;
-                                            if (jsonObj.state == "Enabled")
-                                            allowedActions.push("disable"); else if (jsonObj.state == "Disabled")
-                                            allowedActions.push("enable");
-                                            return allowedActions;
-                                        },
-                                        data: providerObj
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "securityGroups"].id + "&state=Enabled"),
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "securityGroups"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        fields: {
-                            id: {
-                                label: 'label.id'
-                            },
-                            name: {
-                                label: 'label.name'
-                            }
-                            //,
-                            //state: { label: 'label.status' } //comment it for now, since dataProvider below doesn't get called by widget code after action is done
-                        }
-                    },
-                    // Nicira Nvp provider detail view
-                    niciraNvp: {
-                        type: 'detailView',
-                        id: 'niciraNvpProvider',
-                        label: 'label.niciraNvp',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.niciraNvpDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("NiciraNvp");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "niciraNvp") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('niciraNvp')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.NiciraNvp.device',
-                                createForm: {
-                                    title: 'label.add.NiciraNvp.device',
-                                    preFilter: function (args) {
-                                    },
-                                    // TODO What is this?
-                                    fields: {
-                                        host: {
-                                            label: 'label.ip.address'
-                                        },
-                                        username: {
-                                            label: 'label.username'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true
-                                        },
-                                        numretries: {
-                                            label: 'label.numretries',
-                                            defaultValue: '2'
-                                        },
-                                        transportzoneuuid: {
-                                            label: 'label.nicira.transportzoneuuid'
-                                        },
-                                        l3gatewayserviceuuid: {
-                                            label: 'label.nicira.l3gatewayserviceuuid'
-                                        },
-										l2gatewayserviceuuid: {
-                                            label: 'label.nicira.l2gatewayserviceuuid'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "niciraNvp"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=NiciraNvp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addNiciraNvpProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addNiciraNvpProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "niciraNvp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                g_queryAsyncJobResultInterval);
-                                            }
-                                        });
-                                    } else {
-                                        addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.NiciraNvp.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "niciraNvp"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "niciraNvp"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "niciraNvp"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-                    // Brocade Vcs provider detail view
-                    brocadeVcs: {
-                        type: 'detailView',
-                        id: 'brocadeVcsProvider',
-                        label: 'label.brocadeVcs',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.brocadeVcsDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("BrocadeVcs");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "brocadeVcs") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('brocadeVcs')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.BrocadeVcs.device',
-                                createForm: {
-                                    title: 'label.add.BrocadeVcs.device',
-                                    preFilter: function (args) {
-                                    },
-                                    // TODO What is this?
-                                    fields: {
-                                        host: {
-                                            label: 'label.ip.address'
-                                        },
-                                        username: {
-                                            label: 'label.username'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "brocadeVcs"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=BrocadeVcs&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addBrocadeVcsProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addBrocadeVcsProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "brocadeVcs"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                g_queryAsyncJobResultInterval);
-                                            }
-                                        });
-                                    } else {
-                                        addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.BrocadeVcs.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "brocadeVcs"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "brocadeVcs"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "brocadeVcs"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-                    // BigSwitch BCF provider detail view
-                    bigswitchBcf: {
-                        type: 'detailView',
-                        id: 'bigswitchBcfProvider',
-                        label: 'label.bigswitchBcf',
-                        viewAll: {
-                            label: 'label.devices',
-                            path: '_zone.bigswitchBcfDevices'
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("BigSwitchBcf");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "bigswitchBcf") {
-                                            providerObj = this;
-                                            return false;
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('bigswitchBcf')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.BigSwitchBcf.device',
-                                createForm: {
-                                    title: 'label.add.BigSwitchBcf.device',
-                                    preFilter: function (args) {
-                                    },
-                                    fields: {
-                                        host: {
-                                            label: 'label.host.name'
-                                        },
-                                        username: {
-                                            label: 'label.username'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true
-                                        },
-                                        nat: {
-                                                label: 'label.bigswitch.bcf.nat',
-                                                isBoolean: true,
-                                                isChecked: false
-                                        },
-                                        numretries: {
-                                            label: 'label.numretries',
-                                            defaultValue: '2'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "bigswitchBcf"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=BigSwitchBcf&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addBigSwitchBcfProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addBigSwitchBcfProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "bigswitchBcf"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addBigSwitchBcfDevice(args, selectedPhysicalNetworkObj, "addBigSwitchBcfDevice", "addbigswitchbcfdeviceresponse", "bigswitchbcfdevice")
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=BigSwitchBcf failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=BigSwitchBcf failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                3000);
-                                            }
-                                        });
-                                    } else {
-                                        addBigSwitchBcfDevice(args, selectedPhysicalNetworkObj, "addBigSwitchBcfDevice", "addbigswitchbcfdeviceresponse", "bigswitchbcfdevice")
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.BigSwitchBcf.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "bigswitchBcf"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "bigswitchBcf"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "bigswitchBcf"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    //ovs
-                    Ovs: {
-                        id: 'ovsProviders',
-                        label: 'label.ovs',
-                        isMaximized: true,
-                        type: 'detailView',
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            ipaddress: {
-                                label: 'label.ip.address'
-                            },
-                            state: {
-                                label: 'label.status',
-                                indicator: {
-                                    'Enabled': 'on'
-                                }
-                            }
-                        },
-                        tabs: {
-                            network: {
-                                title: 'label.network',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    physicalnetworkid: {
-                                        label: 'label.physical.network.ID'
-                                    },
-                                    destinationphysicalnetworkid: {
-                                        label: 'label.destination.physical.network.id'
-                                    },
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("Ovs");
-                                    args.response.success({
-                                        actionFilter: virtualRouterProviderActionFilter,
-                                        data: $.extend(nspMap[ "Ovs"], {
-                                            supportedServices: nspMap["Ovs"] == undefined? "": nspMap["Ovs"].servicelist.join(', ')
-                                        })
-                                    });
-                                }
-                            },
-
-                            instances: {
-                                title: 'label.instances',
-                                listView: {
-                                    label: 'label.virtual.appliances',
-                                    id: 'routers',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        zonename: {
-                                            label: 'label.zone'
-                                        },
-                                        routerType: {
-                                            label: 'label.type'
-                                        },
-                                        state: {
-                                            converter: function (str) {
-                                                // For localization
-                                                return str;
-                                            },
-                                            label: 'label.status',
-                                            indicator: {
-                                                'Running': 'on',
-                                                'Stopped': 'off',
-                                                'Error': 'off'
-                                            }
-                                        }
-                                    },
-                                    dataProvider: function (args) {
-                                        var array1 =[];
-                                        if (args.filterBy != null) {
-                                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                                switch (args.filterBy.search.by) {
-                                                    case "name":
-                                                    if (args.filterBy.search.value.length > 0)
-                                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                                    break;
-                                                }
-                                            }
-                                        }
-
-                                        var data2 = {
-                                            forvpc: false
-                                        };
-                                        var routers =[];
-                                        $.ajax({
-                                            url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                            data: data2,
-                                            success: function (json) {
-                                                var items = json.listroutersresponse.router ?
-                                                json.listroutersresponse.router:[];
-
-                                                $(items).map(function (index, item) {
-                                                    routers.push(item);
-                                                });
-
-                                                // Get project routers
-                                                $.ajax({
-                                                    url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
-                                                    data: data2,
-                                                    success: function (json) {
-                                                        var items = json.listroutersresponse.router ?
-                                                        json.listroutersresponse.router:[];
-
-                                                        $(items).map(function (index, item) {
-                                                            routers.push(item);
-                                                        });
-                                                        args.response.success({
-                                                            actionFilter: routerActionfilter,
-                                                            data: $(routers).map(mapRouterType)
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    detailView: {
-                                        name: 'label.virtual.appliance.details',
-                                        actions: {
-                                            start: {
-                                                label: 'label.action.start.router',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.action.start.router';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.action.start.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('startRouter&id=' + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.startrouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.domainrouter;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            stop: {
-                                                label: 'label.action.stop.router',
-                                                createForm: {
-                                                    title: 'label.action.stop.router',
-                                                    desc: 'message.action.stop.router',
-                                                    fields: {
-                                                        forced: {
-                                                            label: 'force.stop',
-                                                            isBoolean: true,
-                                                            isChecked: false
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.stop.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    var array1 =[];
-                                                    array1.push("&forced=" + (args.data.forced == "on"));
-                                                    $.ajax({
-                                                        url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.stoprouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        return json.queryasyncjobresultresponse.jobresult.domainrouter;
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            'remove': {
-                                                label: 'label.destroy.router',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        if (args && args.context && args.context.routers[0]) {
-                                                            if (args.context.routers[0].state == 'Running') {
-                                                                return dictionary['message.action.stop.router'] + ' ' + dictionary['message.confirm.destroy.router'];
-                                                            }
-                                                        }
-                                                        return 'message.confirm.destroy.router';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.destroy.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("destroyRouter&id=" + args.context.routers[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.destroyrouterresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            migrate: {
-                                                label: 'label.action.migrate.router',
-                                                createForm: {
-                                                    title: 'label.action.migrate.router',
-                                                    desc: '',
-                                                    fields: {
-                                                        hostId: {
-                                                            label: 'label.host',
-                                                            validation: {
-                                                                required: true
-                                                            },
-                                                            select: function (args) {
-                                                                $.ajax({
-                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
-                                                                    dataType: "json",
-                                                                    async: true,
-                                                                    success: function (json) {
-                                                                        var hostObjs = json.findhostsformigrationresponse.host;
-                                                                        var items =[];
-                                                                        $(hostObjs).each(function () {
-                                                                            items.push({
-                                                                                id: this.id,
-                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
-                                                                            });
-                                                                        });
-                                                                        args.response.success({
-                                                                            data: items
-                                                                        });
-                                                                    }
-                                                                });
-                                                            },
-                                                            error: function (XMLHttpResponse) {
-                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                args.response.error(errorMsg);
-                                                            }
-                                                        }
-                                                    }
-                                                },
-                                                messages: {
-                                                    notification: function (args) {
-                                                        return 'label.action.migrate.router';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.migratesystemvmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
-                                                                        $.ajax({
-                                                                            url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
-                                                                            dataType: "json",
-                                                                            async: false,
-                                                                            success: function (json) {
-                                                                                var items = json.listroutersresponse.router;
-                                                                                if (items != null && items.length > 0) {
-                                                                                    return items[0];
-                                                                                }
-                                                                            }
-                                                                        });
-                                                                    },
-                                                                    getActionFilter: function () {
-                                                                        return routerActionfilter;
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            },
-
-                                            viewConsole: {
-                                                label: 'label.view.console',
-                                                action: {
-                                                    externalLink: {
-                                                        url: function (args) {
-                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
-                                                        },
-                                                        title: function (args) {
-                                                            return args.context.routers[0].id.substr(0, 8);
-                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                                        },
-                                                        width: 820,
-                                                        height: 640
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                preFilter: function (args) {
-                                                    var hiddenFields =[];
-                                                    if (! args.context.routers[0].project) {
-                                                        hiddenFields.push('project');
-                                                        hiddenFields.push('projectid');
-                                                    }
-                                                    if (selectedZoneObj.networktype == 'Basic') {
-                                                        hiddenFields.push('publicip');
-                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
-                                                    }
-
-                                                    if ('routers' in args.context && args.context.routers[0].vpcid != undefined) {
-                                                        hiddenFields.push('guestnetworkid');
-                                                        hiddenFields.push('guestnetworkname');
-                                                    } else if ('routers' in args.context && args.context.routers[0].guestnetworkid != undefined) {
-                                                        hiddenFields.push('vpcid');
-                                                        hiddenFields.push('vpcname');
-                                                    }
-
-                                                    return hiddenFields;
-                                                },
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name'
-                                                    },
-                                                    project: {
-                                                        label: 'label.project'
-                                                    }
-                                                },
-                                                {
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    projectid: {
-                                                        label: 'label.project.id'
-                                                    },
-                                                    state: {
-                                                        label: 'label.state'
-                                                    },
-                                                    guestnetworkid: {
-                                                        label: 'label.network.id'
-                                                    },
-                                                    guestnetworkname: {
-                                                        label: 'label.network.name'
-                                                    },
-                                                    vpcid: {
-                                                        label: 'label.vpc.id'
-                                                    },
-                                                    vpcname: {
-                                                        label: 'label.vpc'
-                                                    },
-                                                    publicip: {
-                                                        label: 'label.public.ip'
-                                                    },
-                                                    guestipaddress: {
-                                                        label: 'label.guest.ip'
-                                                    },
-                                                    linklocalip: {
-                                                        label: 'label.linklocal.ip'
-                                                    },
-                                                    hostname: {
-                                                        label: 'label.host'
-                                                    },
-                                                    serviceofferingname: {
-                                                        label: 'label.compute.offering'
-                                                    },
-                                                    networkdomain: {
-                                                        label: 'label.network.domain'
-                                                    },
-                                                    domain: {
-                                                        label: 'label.domain'
-                                                    },
-                                                    account: {
-                                                        label: 'label.account'
-                                                    },
-                                                    created: {
-                                                        label: 'label.created',
-                                                        converter: cloudStack.converters.toLocalDate
-                                                    },
-                                                    isredundantrouter: {
-                                                        label: 'label.redundant.router',
-                                                        converter: cloudStack.converters.toBooleanText
-                                                    },
-                                                    redundantRouterState: {
-                                                        label: 'label.redundant.state'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jsonObj = json.listroutersresponse.router[0];
-                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
-                                                            args.response.success({
-                                                                actionFilter: routerActionfilter,
-                                                                data: jsonObj
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            nics: {
-                                                title: 'label.nics',
-                                                multiple: true,
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name',
-                                                        header: true
-                                                    },
-                                                    type: {
-                                                        label: 'label.type'
-                                                    },
-                                                    traffictype: {
-                                                        label: 'label.traffic.type'
-                                                    },
-                                                    networkname: {
-                                                        label: 'label.network.name'
-                                                    },
-                                                    netmask: {
-                                                        label: 'label.netmask'
-                                                    },
-                                                    ipaddress: {
-                                                        label: 'label.ip.address'
-                                                    },
-                                                    id: {
-                                                        label: 'label.id'
-                                                    },
-                                                    networkid: {
-                                                        label: 'label.network.id'
-                                                    },
-                                                    isolationuri: {
-                                                        label: 'label.isolation.uri'
-                                                    },
-                                                    broadcasturi: {
-                                                        label: 'label.broadcast.uri'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jsonObj = json.listroutersresponse.router[0].nic;
-
-                                                            args.response.success({
-                                                                actionFilter: routerActionfilter,
-                                                                data: $.map(jsonObj, function (nic, index) {
-                                                                    var name = 'NIC ' + (index + 1);
-                                                                    if (nic.isdefault) {
-                                                                        name += ' (' + _l('label.default') + ')';
-                                                                    }
-                                                                    return $.extend(nic, {
-                                                                        name: name
-                                                                    });
-                                                                })
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        },
-                        actions: {
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Ovs"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Ovs"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    Opendaylight: {
-                        type: 'detailView',
-                        id: 'openDaylightProvider',
-                        label: 'label.openDaylight',
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    refreshNspData("Opendaylight");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function () {
-                                        if (this.id == "Opendaylight") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('Opendaylight')
-                                    });
-                                }
-                            },
-                            controllers: {
-                                title: 'label.opendaylight.controllers',
-                                listView: {
-                                    id: 'openDaylightControllerList',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        url: {
-                                            label: 'label.url'
-                                        },
-                                        username: {
-                                            label: 'label.username'
-                                        }
-                                    },
-                                    dataProvider: function (args) {
-                                        var providerObj
-                                        $.ajax({
-                                            url: createURL("listOpenDaylightControllers"),
-                                            async: false,
-                                            success: function (json) {
-                                                providerObj = json.listOpenDaylightControllers.opendaylightcontroller
-                                            }
-                                        });
-                                        args.response.success({
-                                            data: providerObj
-                                        });
-                                    },
-                                    detailView: {
-                                        name: "OpenDaylight Controller",
-                                        tabs: {
-                                            details: {
-                                                title: 'label.opendaylight.controllerdetail',
-                                                fields:[ {
-                                                    name: {
-                                                        label: 'label.name'
-                                                    },
-                                                    url: {
-                                                        label: 'label.url', header: true
-                                                    },
-                                                    username: {
-                                                        label: 'label.username'
-                                                    }
-                                                }],
-                                                dataProvider: function (args) {
-                                                    var providerObj
-                                                    $.ajax({
-                                                        url: createURL("listOpenDaylightControllers&id=" + args.id),
-                                                        async: false,
-                                                        success: function (json) {
-                                                            providerObj = json.listOpenDaylightControllers.opendaylightcontroller
-                                                        }
-                                                    });
-                                                    args.response.success({
-                                                        data: providerObj[0],
-                                                        actionFilter: function(args) { return [ 'destroy' ] }
-                                                    });
-                                                }
-                                            }
-                                        },
-                                        actions: {
-                                            destroy: {
-                                                label: 'label.delete.OpenDaylight.device',
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("deleteOpenDaylightController&id=" + args.data.id),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var jid = json.deleteOpenDaylightController.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid,
-                                                                    getUpdatedItem: function (json) {
-                                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                messages: {
-                                                    notification: function(args) {
-                                                        return 'label.openaylight.destroycontroller'
-                                                    }
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.add.OpenDaylight.device',
-                                createForm: {
-                                    title: 'label.add.OpenDaylight.device',
-                                    preFilter: function (args) {
-                                    },
-                                    // TODO What is this?
-                                    fields: {
-                                        url: {
-                                            label: 'label.url'
-                                        },
-                                        username: {
-                                            label: 'label.username'
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true
-                                        },
-                                        numretries: {
-                                            label: 'label.numretries',
-                                            defaultValue: '2'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    if (nspMap[ "Opendaylight"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=Opendaylight&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function (json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addOpenDaylightProviderIntervalID = setInterval(function () {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addOpenDaylightProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap[ "Opendaylight"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addOpenDaylightController(args, selectedPhysicalNetworkObj, "addOpenDaylightController", "addopendaylightcontrollerresponse", "opendaylightcontroller")
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=OpenDaylight failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=OpenDaylight failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                },
-                                                g_queryAsyncJobResultInterval);
-                                            }
-                                        });
-                                    } else {
-                                        addOpenDaylightController(args, selectedPhysicalNetworkObj, "addOpenDaylightController", "addOpenDaylightController", "opendaylightcontroller")
-                                    }
-                                },
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.add.OpenDaylight.device';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Opendaylight"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Opendaylight"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function () {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "Opendaylight"].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    // GloboDns provider detail view
-                    GloboDns: {
-                        isMaximized: true,
-                        type: 'detailView',
-                        id: 'globoDnsProvider',
-                        label: 'label.globo.dns',
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    refreshNspData("GloboDns");
-                                    var providerObj;
-                                    $(nspHardcodingArray).each(function() {
-                                        if (this.id == "GloboDns") {
-                                            providerObj = this;
-                                            return false; //break each loop
-                                        }
-                                    });
-                                    args.response.success({
-                                        data: providerObj,
-                                        actionFilter: networkProviderActionFilter('GloboDns')
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            add: {
-                                label: 'label.globo.dns.configuration',
-                                createForm: {
-                                    title: 'label.globo.dns.configuration',
-                                    preFilter: function(args) {},
-                                    fields: {
-                                        username: {
-                                            label: 'label.username',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        password: {
-                                            label: 'label.password',
-                                            isPassword: true,
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        url: {
-                                            label: 'label.url',
-                                            validation: {
-                                                required: true
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    if (nspMap["GloboDns"] == null) {
-                                        $.ajax({
-                                            url: createURL("addNetworkServiceProvider&name=GloboDns&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                                var addGloboDnsProviderIntervalID = setInterval(function() {
-                                                    $.ajax({
-                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                        dataType: "json",
-                                                        success: function(json) {
-                                                            var result = json.queryasyncjobresultresponse;
-                                                            if (result.jobstatus == 0) {
-                                                                return; //Job has not completed
-                                                            } else {
-                                                                clearInterval(addGloboDnsProviderIntervalID);
-                                                                if (result.jobstatus == 1) {
-                                                                    nspMap["GloboDns"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                    addGloboDnsHost(args, selectedPhysicalNetworkObj, "addGloboDnsHost", "addglobodnshostresponse");
-                                                                } else if (result.jobstatus == 2) {
-                                                                    alert("addNetworkServiceProvider&name=GloboDns failed. Error: " + _s(result.jobresult.errortext));
-                                                                }
-                                                            }
-                                                        },
-                                                        error: function(XMLHttpResponse) {
-                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                            alert("addNetworkServiceProvider&name=GloboDns failed. Error: " + errorMsg);
-                                                        }
-                                                    });
-                                                }, g_queryAsyncJobResultInterval);
-                                            }
-                                        });
-                                    } else {
-                                        addGloboDnsHost(args, selectedPhysicalNetworkObj, "addGloboDnsHost", "addglobodnshostresponse");
-                                    }
-                                },
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.add.globo.dns';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["GloboDns"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function() {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["GloboDns"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function() {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            destroy: {
-                                label: 'label.shutdown.provider',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap["GloboDns"].id),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-
-                                            $(window).trigger('cloudStack.fullRefresh');
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.shutdown.provider';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.shutdown.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    },
-
-                    ConfigDrive: {
-                        id: "ConfigDrive",
-                        label: "ConfigDrive",
-                        isMaximized: true,
-                        type: 'detailView',
-                        fields: {
-                            name: {
-                                label: 'label.name'
-                            },
-                            state: {
-                                label: 'label.status',
-                                indicator: {
-                                    'Enabled': 'on'
-                                }
-                            }
-                        },
-                        tabs: {
-                            network: {
-                                title: 'label.network',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    supportedServices: {
-                                        label: 'label.supported.services'
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    physicalnetworkid: {
-                                        label: 'label.physical.network.ID'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    refreshNspData("ConfigDrive");
-                                    args.response.success({
-                                        actionFilter: ovsProviderActionFilter,
-                                        data: $.extend(nspMap["ConfigDrive"], {
-                                            supportedServices: nspMap["ConfigDrive"] == undefined? "": nspMap["ConfigDrive"].servicelist.join(', ')
-                                        })
-                                    });
-                                }
-                            }
-                        },
-                        actions: {
-                            enable: {
-                                label: 'label.enable.provider',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["ConfigDrive"].id + "&state=Enabled"),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.enable.provider';
-                                    },
-                                    notification: function() {
-                                        return 'label.enable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disable: {
-                                label: 'label.disable.provider',
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["ConfigDrive"].id + "&state=Disabled"),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.disable.provider';
-                                    },
-                                    notification: function() {
-                                        return 'label.disable.provider';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        },
-        physicalResourceSection: {
-            sections: {
-                physicalResources: {
-                    type: 'select',
-                    title: 'label.menu.physical.resources',
-                    listView: {
-                        zones: {
-                            id: 'physicalResources',
-                            label: 'label.menu.physical.resources',
-                            multiSelect: true,
-                            fields: {
-                                name: {
-                                    label: 'label.zone'
-                                },
-                                networktype: {
-                                    label: 'label.network.type'
-                                },
-                                domainid: {
-                                    label: 'label.public',
-                                    converter: function (args) {
-                                        if (args == null)
-                                        return "Yes"; else
-                                        return "No";
-                                    }
-                                },
-                                allocationstate: {
-                                    label: 'label.allocation.state',
-                                    converter: function (str) {
-                                        // For localization
-                                        return str;
-                                    },
-                                    indicator: {
-                                        'Enabled': 'on',
-                                        'Disabled': 'off'
-                                    }
-                                }
-                            },
-
-                            reorder: cloudStack.api.actions.sort('updateZone', 'physicalResources'),
-
-                            dataProvider: function (args) {
-                                var array1 =[];
-                                if (args.filterBy != null) {
-                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                        switch (args.filterBy.search.by) {
-                                            case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                        }
-                                    }
-                                }
-                                $.ajax({
-                                    url: createURL("listZones&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function (json) {
-                                        zoneObjs = json.listzonesresponse.zone;
-                                        args.response.success({
-                                            actionFilter: zoneActionfilter,
-                                            data: zoneObjs
-                                        });
-                                    }
-                                });
-                            },
-
-                            actions: {
-                                add: {
-                                    label: 'label.add.zone',
-                                    action: {
-                                        custom: cloudStack.uiCustom.zoneWizard(
-                                        cloudStack.zoneWizard)
-                                    },
-                                    messages: {
-                                        notification: function (args) {
-                                            return 'label.add.zone';
-                                        }
-                                    },
-                                    notification: {
-                                        poll: function (args) {
-                                            args.complete({
-                                                actionFilter: zoneActionfilter,
-                                                data: args._custom.zone
-                                            });
-                                        }
-                                    }
-                                },
-                                viewMetrics: {
-                                    label: 'label.metrics',
-                                    isHeader: true,
-                                    addRow: false,
-                                    action: {
-                                        custom: cloudStack.uiCustom.metricsView({resource: 'zones'})
-                                    },
-                                    messages: {
-                                        notification: function (args) {
-                                            return 'label.metrics';
-                                        }
-                                    }
-                                },
-                                startRollingMaintenance: rollingMaintenanceAction({ listView: true, entity: 'zones' })
-                            },
-
-                            detailView: {
-                                isMaximized: true,
-                                actions: {
-
-                                    startRollingMaintenance: {
-                                        label: 'label.start.rolling.maintenance',
-                                        textLabel: 'label.start.rolling.maintenance',
-                                        messages: {
-                                            notification: function (args) {
-                                                return 'label.start.rolling.maintenance';
-                                            }
-                                        },
-                                        createForm: {
-                                            title: 'label.start.rolling.maintenance',
-                                            fields: {
-                                                timeout: {
-                                                    label: 'label.timeout',
-                                                },
-                                                force: {
-                                                    isBoolean: true,
-                                                    label: 'label.start.rolling.maintenance.force'
-                                                },
-                                                payload: {
-                                                    label: 'label.start.rolling.maintenance.payload'
-                                                }
-                                            }
-                                        },
-                                        action: function (args) {
-                                            var data = {
-                                                zoneids: args.context.physicalResources[0].id,
-                                                force: args.data.force,
-                                                timeout: args.data.timeout,
-                                                payload: args.data.payload
-                                            };
-                                            $.ajax({
-                                                url: createURL("startRollingMaintenance"),
-                                                dataType: "json",
-                                                data: data,
-                                                async: true,
-                                                success: function (json) {
-                                                    var item = json.rollingmaintenance;
-                                                    args.response.success({
-                                                        actionFilter: zoneActionfilter,
-                                                        data: item
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    },
-
-                                    addVmwareDc: {
-                                        label: 'label.add.vmware.datacenter',
-                                        textLabel: 'label.add.vmware.datacenter',
-                                        messages: {
-                                            notification: function (args) {
-                                                return 'label.add.vmware.datacenter';
-                                            }
-                                        },
-                                        createForm: {
-                                            title: 'label.add.vmware.datacenter',
-                                            fields: {
-                                                name: {
-                                                    label: 'label.dc.name',
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                },
-                                                vcenter: {
-                                                    label: 'label.vcenter',
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                },
-                                                username: {
-                                                    label: 'label.username',
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                },
-                                                password: {
-                                                    label: 'label.password',
-                                                    isPassword: true,
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        action: function (args) {
-                                            var data = {
-                                                zoneid: args.context.physicalResources[0].id,
-                                                name: args.data.name,
-                                                vcenter: args.data.vcenter
-                                            };
-
-                                            if (args.data.username != null && args.data.username.length > 0) {
-                                                $.extend(data, {
-                                                    username: args.data.username
-                                                })
-                                            }
-                                            if (args.data.password != null && args.data.password.length > 0) {
-                                                $.extend(data, {
-                                                    password: args.data.password
-                                                })
-                                            }
-
-                                            $.ajax({
-                                                url: createURL('addVmwareDc'),
-                                                data: data,
-                                                type: "POST",
-                                                success: function (json) {
-                                                    //var item = json.addvmwaredcresponse.vmwaredc;
-                                                    args.response.success();
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    },
-
-                                    updateVmwareDc: {
-                                        label: 'label.update.vmware.datacenter',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'label.update.vmware.datacenter';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.update.vmware.datacenter';
-                                            }
-                                        },
-                                        createForm: {
-                                            title: 'label.update.vmware.datacenter',
-                                            fields: {
-                                                name: {
-                                                    label: 'label.vmware.datacenter.name'
-                                                },
-                                                vcenter: {
-                                                    label: 'label.vmware.datacenter.vcenter'
-                                                },
-                                                username: {
-                                                    label: 'label.username'
-                                                },
-                                                password: {
-                                                    label: 'label.password',
-                                                    isPassword: true
-                                                }
-                                            }
-                                        },
-                                        action: function (args) {
-                                            var data = args.data;
-                                            data.zoneid = args.context.physicalResources[0].id;
-                                            $.ajax({
-                                                url: createURL('updateVmwareDc'),
-                                                data: data,
-                                                success: function (json) {
-                                                    args.response.success({
-                                                        data: args.context.physicalResources[0]
-                                                    });
-                                                },
-                                                error: function (XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    },
-
-                                    removeVmwareDc: {
-                                        label: 'label.remove.vmware.datacenter',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.remove.vmware.datacenter';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.remove.vmware.datacenter';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            var data = {
-                                                zoneid: args.context.physicalResources[0].id
-                                            };
-                                            $.ajax({
-                                                url: createURL('removeVmwareDc'),
-                                                data: data,
-                                                success: function (json) {
-                                                    delete args.context.physicalResources[0].vmwaredcName;
-                                                    delete args.context.physicalResources[0].vmwaredcVcenter;
-                                                    delete args.context.physicalResources[0].vmwaredcId;
-
-                                                    selectedZoneObj = args.context.physicalResources[0];
-
-                                                    args.response.success({
-                                                        data: args.context.physicalResources[0]
-                                                    });
-                                                },
-                                                error: function (XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    },
-
-                                    enable: {
-                                        label: 'label.action.enable.zone',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.action.enable.zone';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.action.enable.zone';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("updateZone&id=" + args.context.physicalResources[0].id + "&allocationstate=Enabled"), //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var item = json.updatezoneresponse.zone;
-                                                    args.response.success({
-                                                        actionFilter: zoneActionfilter,
-                                                        data: item
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    },
-
-                                    disable: {
-                                        label: 'label.action.disable.zone',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.action.disable.zone';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.action.disable.zone';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("updateZone&id=" + args.context.physicalResources[0].id + "&allocationstate=Disabled"), //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var item = json.updatezoneresponse.zone;
-                                                    args.response.success({
-                                                        actionFilter: zoneActionfilter,
-                                                        data: item
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    },
-
-                                    dedicateZone: {
-                                        label: 'label.dedicate.zone',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.dedicate.zone';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.zone.dedicated';
-                                            }
-                                        },
-                                        createForm: {
-                                            title: 'label.dedicate.zone',
-                                            fields: {
-                                                domainId: {
-                                                    label: 'label.domain',
-                                                    validation: {
-                                                        required: true
-                                                    },
-                                                    select: function (args) {
-                                                        $.ajax({
-                                                            url: createURL('listDomains'),
-                                                            data: {
-                                                                listAll: true,
-                                                                details: 'min'
-                                                            },
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function (json) {
-                                                                var domainObjs = json.listdomainsresponse.domain;
-                                                                var items =[];
-
-                                                                $(domainObjs).each(function () {
-                                                                    items.push({
-                                                                        id: this.id,
-                                                                        description: this.name
-                                                                    });
-                                                                });
-                                                                items.sort(function(a, b) {
-                                                                    return a.description.localeCompare(b.description);
-                                                                });
-
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-                                                            }
-                                                        });
-                                                    }
-                                                },
-                                                accountId: {
-                                                    label: 'label.account',
-                                                    docID: 'helpAccountForDedication',
-                                                    validation: {
-                                                        required: false
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        action: function (args) {
-                                            //EXPLICIT DEDICATION
-                                            var array2 =[];
-                                            if (args.data.accountId != "")
-                                            array2.push("&account=" + encodeURIComponent(args.data.accountId));
-
-                                            $.ajax({
-                                                url: createURL("dedicateZone&zoneId=" +
-                                                args.context.physicalResources[0].id +
-                                                "&domainId=" + args.data.domainId + array2.join("")),
-                                                dataType: "json",
-                                                success: function (json) {
-                                                    var jid = json.dedicatezoneresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getActionFilter: function () {
-                                                                return zoneActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-                                    releaseDedicatedZone: {
-                                        label: 'label.release.dedicated.zone',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.release.dedicated.zone';
-                                            },
-                                            notification: function (args) {
-                                                return 'message.dedicated.zone.released';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("releaseDedicatedZone&zoneid=" +
-                                                args.context.physicalResources[0].id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var jid = json.releasededicatedzoneresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getActionFilter: function () {
-                                                                return zoneActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    'remove': {
-                                        label: 'label.action.delete.zone',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.action.delete.zone';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.action.delete.zone';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("deleteZone&id=" + args.context.physicalResources[0].id), //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    args.response.success({
-                                                        data: {
-                                                        }
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    },
-                                    edit: {
-                                        label: 'label.edit',
-                                        action: function (args) {
-                                            var array1 =[];
-                                            array1.push("&name=" + encodeURIComponent(args.data.name));
-                                            array1.push("&dns1=" + encodeURIComponent(args.data.dns1));
-                                            array1.push("&dns2=" + encodeURIComponent(args.data.dns2));
-                                            //dns2 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
-                                            array1.push("&ip6dns1=" + encodeURIComponent(args.data.ip6dns1));
-                                            //p6dns1 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
-                                            array1.push("&ip6dns2=" + encodeURIComponent(args.data.ip6dns2));
-                                            //ip6dns2 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
-
-                                            if (selectedZoneObj.networktype == "Advanced" && args.data.guestcidraddress) {
-                                                array1.push("&guestcidraddress=" + encodeURIComponent(args.data.guestcidraddress));
-                                            }
-
-                                            array1.push("&internaldns1=" + encodeURIComponent(args.data.internaldns1));
-                                            array1.push("&internaldns2=" + encodeURIComponent(args.data.internaldns2));
-                                            //internaldns2 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
-                                            array1.push("&domain=" + encodeURIComponent(args.data.domain));
-                                            array1.push("&localstorageenabled=" + (args.data.localstorageenabled == 'on'));
-                                            $.ajax({
-                                                url: createURL("updateZone&id=" + args.context.physicalResources[0].id + array1.join("")),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    selectedZoneObj = json.updatezoneresponse.zone; //override selectedZoneObj after update zone
-                                                    args.response.success({
-                                                        data: selectedZoneObj
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error('Could not edit zone information; please ensure all fields are valid.');
-                                                }
-                                            });
-                                        }
-                                    },
-                                    enableOutOfBandManagement: {
-                                        label: 'label.outofbandmanagement.enable',
-                                        action: function (args) {
-                                            var data = {
-                                                zoneid: args.context.physicalResources[0].id
-                                            };
-                                            $.ajax({
-                                                url: createURL("enableOutOfBandManagementForZone"),
-                                                data: data,
-                                                success: function (json) {
-                                                    var jid = json.enableoutofbandmanagementforzoneresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getActionFilter: function () {
-                                                                return zoneActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-
-                                            });
-                                        },
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.outofbandmanagement.enable';
-                                            },
-                                            notification: function (args) {
-                                                return 'message.outofbandmanagement.enable';
-                                            }
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-                                    disableOutOfBandManagement: {
-                                        label: 'label.outofbandmanagement.disable',
-                                        action: function (args) {
-                                            var data = {
-                                                zoneid: args.context.physicalResources[0].id
-                                            };
-                                            $.ajax({
-                                                url: createURL("disableOutOfBandManagementForZone"),
-                                                data: data,
-                                                success: function (json) {
-                                                    var jid = json.disableoutofbandmanagementforzoneresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getActionFilter: function () {
-                                                                return zoneActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-
-                                            });
-                                        },
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.outofbandmanagement.disable';
-                                            },
-                                            notification: function (args) {
-                                                return 'message.outofbandmanagement.disable';
-                                            }
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-                                    enableHA: {
-                                        label: 'label.ha.enable',
-                                        action: function (args) {
-                                            var data = {
-                                                zoneid: args.context.physicalResources[0].id
-                                            };
-                                            $.ajax({
-                                                url: createURL("enableHAForZone"),
-                                                data: data,
-                                                success: function (json) {
-                                                    var jid = json.enablehaforzoneresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getActionFilter: function () {
-                                                                return zoneActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        },
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'label.ha.enable';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.ha.enable';
-                                            }
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-                                    disableHA: {
-                                        label: 'label.ha.disable',
-                                        action: function (args) {
-                                            var data = {
-                                                zoneid: args.context.physicalResources[0].id
-                                            };
-                                            $.ajax({
-                                                url: createURL("disableHAForZone"),
-                                                data: data,
-                                                success: function (json) {
-                                                    var jid = json.disablehaforzoneresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getActionFilter: function () {
-                                                                return zoneActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        },
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'label.ha.disable';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.ha.disable';
-                                            }
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.details',
-
-                                        preFilter: function (args) {
-                                            var hiddenFields =[];
-                                            if (selectedZoneObj.networktype == "Basic")
-                                            hiddenFields.push("guestcidraddress");
-                                            return hiddenFields;
-                                        },
-
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.zone',
-                                                isEditable: true,
-                                                validation: {
-                                                    required: true
-                                                }
-                                            }
-                                        },
-                                        {
-                                            id: {
-                                                label: 'label.id'
-                                            },
-                                            allocationstate: {
-                                                label: 'label.allocation.state'
-                                            },
-                                            dns1: {
-                                                label: 'label.dns.1',
-                                                isEditable: true,
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            dns2: {
-                                                label: 'label.dns.2',
-                                                isEditable: true
-                                            },
-                                            ip6dns1: {
-                                                label: 'label.ipv6.dns1',
-                                                isEditable: true
-                                            },
-                                            ip6dns2: {
-                                                label: 'label.ipv6.dns2',
-                                                isEditable: true
-                                            },
-                                            internaldns1: {
-                                                label: 'label.internal.dns.1',
-                                                isEditable: true,
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            internaldns2: {
-                                                label: 'label.internal.dns.2',
-                                                isEditable: true
-                                            },
-                                            domainname: {
-                                                label: 'label.domain'
-                                            },
-                                            networktype: {
-                                                label: 'label.network.type'
-                                            },
-                                            guestcidraddress: {
-                                                label: 'label.guest.cidr',
-                                                isEditable: true
-                                            },
-                                            domain: {
-                                                label: 'label.network.domain',
-                                                isEditable: true
-                                            },
-                                            localstorageenabled: {
-                                                label: 'label.local.storage.enabled',
-                                                isBoolean: true,
-                                                isEditable: true,
-                                                converter: cloudStack.converters.toBooleanText
-                                            }
-                                        },
-                                        {
-                                            isdedicated: {
-                                                label: 'label.dedicated'
-                                            },
-                                            domainid: {
-                                                label: 'label.domain.id'
-                                            }
-                                        },
-                                        {
-                                            vmwaredcName: {
-                                                label: 'label.vmware.datacenter.name'
-                                            },
-                                            vmwaredcVcenter: {
-                                                label: 'label.vmware.datacenter.vcenter'
-                                            },
-                                            vmwaredcId: {
-                                                label: 'label.vmware.datacenter.id'
-                                            }
-                                        }],
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                data: {
-                                                    id: args.context.physicalResources[0].id
-                                                },
-                                                success: function (json) {
-                                                    selectedZoneObj = json.listzonesresponse.zone[0];
-
-                                                    $(window).trigger('cloudStack.module.sharedFunctions.addExtraProperties', {
-                                                        obj: selectedZoneObj,
-                                                        objType: "Zone"
-                                                    });
-
-                                                    $.ajax({
-                                                        url: createURL('listDedicatedZones'),
-                                                        data: {
-                                                            zoneid: args.context.physicalResources[0].id
-                                                        },
-                                                        async: false,
-                                                        success: function (json) {
-                                                            if (json.listdedicatedzonesresponse.dedicatedzone != undefined) {
-                                                                var dedicatedzoneObj = json.listdedicatedzonesresponse.dedicatedzone[0];
-                                                                if (dedicatedzoneObj.domainid != null) {
-                                                                    $.extend(selectedZoneObj, {
-                                                                        isdedicated: 'Yes',
-                                                                        domainid: dedicatedzoneObj.domainid,
-                                                                        accountid: dedicatedzoneObj.accountid
-                                                                    });
-                                                                }
-                                                            } else {
-                                                                $.extend(selectedZoneObj, {
-                                                                    isdedicated: 'No',
-                                                                    domainid: null,
-                                                                    accountid: null
-                                                                })
-                                                            }
-                                                        }
-                                                    });
-
-                                                    $.ajax({
-                                                        url: createURL('listApis'), //listVmwareDcs API only exists in non-oss bild, so have to check whether it exists before calling it.
-                                                        data: {
-                                                            name: 'listVmwareDcs'
-                                                        },
-                                                        async: false,
-                                                        success: function (json) {
-                                                            $.ajax({
-                                                                url: createURL('listVmwareDcs'),
-                                                                data: {
-                                                                    zoneid: args.context.physicalResources[0].id
-                                                                },
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    //e.g. json == { "listvmwaredcsresponse" { "count":1 ,"VMwareDC" [ {"id":"c3c2562d-65e9-4fc7-92e2-773c2efe8f37","zoneid":1,"name":"datacenter","vcenter":"10.10.20.20"} ] } }
-                                                                    var vmwaredcs = json.listvmwaredcsresponse.VMwareDC;
-                                                                    if (vmwaredcs != null) {
-                                                                        selectedZoneObj.vmwaredcName = vmwaredcs[0].name;
-                                                                        selectedZoneObj.vmwaredcVcenter = vmwaredcs[0].vcenter;
-                                                                        selectedZoneObj.vmwaredcId = vmwaredcs[0].id;
-                                                                    }
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function (XMLHttpResponse) {
-                                                        }
-                                                        //override default error handling: cloudStack.dialog.notice({ message: parseXMLHttpResponse(XMLHttpResponse)});
-                                                    });
-
-                                                    args.response.success({
-                                                        actionFilter: zoneActionfilter,
-                                                        data: selectedZoneObj
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    compute: {
-                                        title: 'label.compute.and.storage',
-                                        custom: cloudStack.uiCustom.systemChart('compute')
-                                    },
-                                    network: {
-                                        title: 'label.physical.network',
-                                        custom: cloudStack.uiCustom.systemChart('network')
-                                    },
-                                    resources: {
-                                        title: 'label.resources',
-                                        custom: cloudStack.uiCustom.systemChart('resources')
-                                    },
-
-                                    systemVMs: {
-                                        title: 'label.system.vms',
-                                        listView: {
-                                            label: 'label.system.vms',
-                                            id: 'systemVMs',
-                                            fields: {
-                                                name: {
-                                                    label: 'label.name'
-                                                },
-                                                systemvmtype: {
-                                                    label: 'label.type',
-                                                    converter: function (args) {
-                                                        if (args == "consoleproxy")
-                                                        return "Console Proxy VM"; else if (args == "secondarystoragevm")
-                                                        return "Secondary Storage VM"; else
-                                                        return args;
-                                                    }
-                                                },
-                                                zonename: {
-                                                    label: 'label.zone'
-                                                },
-                                                state: {
-                                                    label: 'label.status',
-                                                    converter: function (str) {
-                                                        // For localization
-                                                        return str;
-                                                    },
-                                                    indicator: {
-                                                        'Running': 'on',
-                                                        'Stopped': 'off',
-                                                        'Error': 'off',
-                                                        'Destroyed': 'off'
-                                                    }
-                                                }
-                                            },
-                                            dataProvider: function (args) {
-                                                var array1 =[];
-                                                if (args.filterBy != null) {
-                                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                                        switch (args.filterBy.search.by) {
-                                                            case "name":
-                                                            if (args.filterBy.search.value.length > 0)
-                                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                                            break;
-                                                        }
-                                                    }
-                                                }
-
-                                                var selectedZoneObj = args.context.physicalResources[0];
-                                                $.ajax({
-                                                    url: createURL("listSystemVms&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function (json) {
-                                                        var items = json.listsystemvmsresponse.systemvm;
-                                                        args.response.success({
-                                                            actionFilter: systemvmActionfilter,
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            },
-
-                                            detailView: {
-                                                noCompact: true,
-                                                name: 'label.system.vm.details',
-                                                actions: {
-                                                    start: {
-                                                        label: 'label.action.start.systemvm',
-                                                        messages: {
-                                                            confirm: function (args) {
-                                                                return 'message.action.start.systemvm';
-                                                            },
-                                                            notification: function (args) {
-                                                                return 'label.action.start.systemvm';
-                                                            }
-                                                        },
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL('startSystemVm&id=' + args.context.systemVMs[0].id),
-                                                                dataType: 'json',
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    var jid = json.startsystemvmresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            jobId: jid,
-                                                                            getUpdatedItem: function (json) {
-                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                                            },
-                                                                            getActionFilter: function () {
-                                                                                return systemvmActionfilter;
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                }
-                                                            });
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-                                                    stop: {
-                                                        label: 'label.action.stop.systemvm',
-                                                        messages: {
-                                                            confirm: function (args) {
-                                                                return 'message.action.stop.systemvm';
-                                                            },
-                                                            notification: function (args) {
-                                                                return 'label.action.stop.systemvm';
-                                                            }
-                                                        },
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL('stopSystemVm&id=' + args.context.systemVMs[0].id),
-                                                                dataType: 'json',
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    var jid = json.stopsystemvmresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            jobId: jid,
-                                                                            getUpdatedItem: function (json) {
-                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                                            },
-                                                                            getActionFilter: function () {
-                                                                                return systemvmActionfilter;
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                }
-                                                            });
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-                                                    restart: {
-                                                        label: 'label.action.reboot.systemvm',
-                                                        messages: {
-                                                            confirm: function (args) {
-                                                                return 'message.action.reboot.systemvm';
-                                                            },
-                                                            notification: function (args) {
-                                                                return 'label.action.reboot.systemvm';
-                                                            }
-                                                        },
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL('rebootSystemVm&id=' + args.context.systemVMs[0].id),
-                                                                dataType: 'json',
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    var jid = json.rebootsystemvmresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            jobId: jid,
-                                                                            getUpdatedItem: function (json) {
-                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                                            },
-                                                                            getActionFilter: function () {
-                                                                                return systemvmActionfilter;
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                }
-                                                            });
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-                                                    remove: {
-                                                        label: 'label.action.destroy.systemvm',
-                                                        messages: {
-                                                            confirm: function (args) {
-                                                                return 'message.action.destroy.systemvm';
-                                                            },
-                                                            notification: function (args) {
-                                                                return 'label.action.destroy.systemvm';
-                                                            }
-                                                        },
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL('destroySystemVm&id=' + args.context.systemVMs[0].id),
-                                                                dataType: 'json',
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    var jid = json.destroysystemvmresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            getUpdatedItem: function () {
-                                                                                return {
-                                                                                    state: 'Destroyed'
-                                                                                };
-                                                                            },
-                                                                            jobId: jid
-                                                                        }
-                                                                    });
-                                                                }
-                                                            });
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-                                                    migrate: {
-                                                        label: 'label.action.migrate.systemvm',
-                                                        messages: {
-                                                            notification: function (args) {
-                                                                return 'label.action.migrate.systemvm';
-                                                            }
-                                                        },
-                                                        createForm: {
-                                                            title: 'label.action.migrate.systemvm',
-                                                            desc: '',
-                                                            fields: {
-                                                                hostId: {
-                                                                    label: 'label.host',
-                                                                    validation: {
-                                                                        required: true
-                                                                    },
-                                                                    select: function (args) {
-                                                                        $.ajax({
-                                                                            url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.systemVMs[0].id),
-                                                                            dataType: "json",
-                                                                            async: true,
-                                                                            success: function (json) {
-                                                                                var hostObjs = json.findhostsformigrationresponse.host;
-                                                                                var items =[];
-                                                                                $(hostObjs).each(function () {
-                                                                                    if (this.requiresStorageMotion == false) {
-                                                                                        items.push({
-                                                                                            id: this.id,
-                                                                                            description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
-                                                                                        });
-                                                                                    }
-                                                                                });
-                                                                                args.response.success({
-                                                                                    data: items
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    },
-                                                                    error: function (XMLHttpResponse) {
-                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                        args.response.error(errorMsg);
-                                                                    }
-                                                                }
-                                                            }
-                                                        },
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.systemVMs[0].id),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    var jid = json.migratesystemvmresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            jobId: jid,
-                                                                            getUpdatedItem: function (json) {
-                                                                                //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
-                                                                                $.ajax({
-                                                                                    url: createURL("listSystemVms&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
-                                                                                    dataType: "json",
-                                                                                    async: false,
-                                                                                    success: function (json) {
-                                                                                        var items = json.listsystemvmsresponse.systemvm;
-                                                                                        if (items != null && items.length > 0) {
-                                                                                            return items[0];
-                                                                                        }
-                                                                                    }
-                                                                                });
-                                                                            },
-                                                                            getActionFilter: function () {
-                                                                                return systemvmActionfilter;
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                }
-                                                            });
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-                                                    diagnostics: {
-                                                        label: 'label.action.run.diagnostics',
-                                                        messages: {
-                                                            notification: function (args) {
-                                                                return 'label.action.run.diagnostics';
-                                                            },
-                                                            complete: function(args) {
-                                                                var exitcode = _l('message.diagnostics.exitcode');
-                                                                exitcode = exitcode.replace('var', args.exitcode);
-                                                                var stderr = _l('message.diagnostics.stderr');
-                                                                stderr = stderr.replace('var', args.stderr);
-                                                                var stdout = _l('message.diagnostics.stdout');
-                                                                stdout = stdout.replace('var', args.stdout);
-                                                                var msg = "<div style='text-align: left; overflow-y: auto'>" + exitcode + "<br><br>" + stderr + "<br><br>" + stdout + "</div>";
-                                                                return msg;
-                                                            }
-                                                        },
-                                                        createForm: {
-                                                            title: 'label.action.run.diagnostics',
-                                                            desc: '',
-                                                            fields: {
-                                                                type: {
-                                                                    label: 'label.run.diagnostics.type',
-                                                                    validation: {
-                                                                        required: true
-                                                                    },
-                                                                    select: function (args) {
-                                                                        var items = [];
-                                                                        items.push({
-                                                                            id: "ping",
-                                                                            description: "Ping"
-                                                                        });
-                                                                        items.push({
-                                                                            id: "traceroute",
-                                                                            description: "Traceroute"
-                                                                        });
-                                                                        items.push({
-                                                                            id: "arping",
-                                                                            description: "Arping"
-                                                                        });
-                                                                        args.response.success({
-                                                                            data: items
-                                                                        });
-                                                                    }
-                                                                },
-                                                                destination: {
-                                                                    label: 'label.run.diagnostics.destination',
-                                                                    validation: {
-                                                                        required: true
-                                                                    }
-                                                                },
-                                                                extra: {
-                                                                    label: 'label.run.diagnostics.extra'
-                                                                }
-
-                                                            }
-                                                        },
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL("runDiagnostics&targetid=" + args.context.systemVMs[0].id + "&ipaddress=" + args.data.destination + "&type=" + args.data.type + "&params=" + args.data.extra),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function(json) {
-                                                                    var jid = json.rundiagnosticsresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            jobId : jid,
-                                                                            getUpdatedItem: function (json) {
-                                                                                return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                                            },
-                                                                            getActionFilter: function(){
-                                                                                return systemvmActionfilter;
-                                                                           }
-                                                                        }
-
-                                                                    });
-                                                                }
-                                                            }); //end ajax
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-                                                    retrieveDiagnostics: {
-                                                        label: 'label.action.get.diagnostics',
-                                                        messages: {
-                                                            notification: function (args) {
-                                                                return 'label.action.get.diagnostics';
-                                                            },
-                                                            complete: function(args) {
-                                                                var url = args.url;
-                                                                var htmlMsg = _l('message.download.diagnostics');
-                                                                var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
-                                                                return htmlMsg2;
-                                                            }
-                                                        },
-                                                        createForm: {
-                                                            title: 'label.action.get.diagnostics',
-                                                            desc: '',
-                                                            fields: {
-                                                                files: {
-                                                                    label: 'label.get.diagnostics.files'
-                                                                }
-                                                            }
-                                                        },
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL("getDiagnosticsData&targetid=" + args.context.systemVMs[0].id + "&files=" + args.data.files),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function(json) {
-                                                                    var jid = json.getdiagnosticsdataresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            jobId : jid,
-                                                                            getUpdatedItem: function (json) {
-                                                                                return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                                            },
-                                                                            getActionFilter: function(){
-                                                                                return systemvmActionfilter;
-                                                                           }
-                                                                        }
-
-                                                                    });
-                                                                }
-                                                            }); //end ajax
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-                                                    scaleUp: {
-                                                        label: 'label.change.service.offering',
-                                                        createForm: {
-                                                            title: 'label.change.service.offering',
-                                                            desc: function (args) {
-                                                                var description = '';
-                                                                var vmObj = args.jsonObj;
-                                                                //if (vmObj.state == 'Running' && vmObj.hypervisor == 'VMware') { //needs to wait for API fix that will return hypervisor property
-                                                                if (vmObj.state == 'Running') {
-                                                                    description = 'message.read.admin.guide.scaling.up';
-                                                                }
-                                                                return description;
-                                                            },
-                                                            fields: {
-                                                                serviceOfferingId: {
-                                                                    label: 'label.compute.offering',
-                                                                    select: function (args) {
-                                                                        var apiCmd = "listServiceOfferings&issystem=true";
-                                                                        if (args.context.systemVMs[0].systemvmtype == "secondarystoragevm")
-                                                                        apiCmd += "&systemvmtype=secondarystoragevm"; else if (args.context.systemVMs[0].systemvmtype == "consoleproxy")
-                                                                        apiCmd += "&systemvmtype=consoleproxy";
-                                                                        $.ajax({
-                                                                            url: createURL(apiCmd),
-                                                                            dataType: "json",
-                                                                            async: true,
-                                                                            success: function (json) {
-                                                                                var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
-                                                                                var items =[];
-                                                                                $(serviceofferings).each(function () {
-                                                                                    if (this.id != args.context.systemVMs[0].serviceofferingid) {
-                                                                                        items.push({
-                                                                                            id: this.id,
-                                                                                            description: this.name
-                                                                                        });
-                                                                                    }
-                                                                                });
-                                                                                args.response.success({
-                                                                                    data: items
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    }
-                                                                }
-                                                            }
-                                                        },
-
-                                                        action: function (args) {
-                                                            $.ajax({
-                                                                url: createURL("scaleSystemVm&id=" + args.context.systemVMs[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    var jid = json.changeserviceforsystemvmresponse.jobid;
-                                                                    args.response.success({
-                                                                        _custom: {
-                                                                            jobId: jid,
-                                                                            getUpdatedItem: function (json) {
-                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                                            },
-                                                                            getActionFilter: function () {
-                                                                                return systemvmActionfilter;
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                },
-                                                                error: function (json) {
-                                                                    args.response.error(parseXMLHttpResponse(json));
-                                                                }
-                                                            });
-                                                        },
-                                                        messages: {
-                                                            confirm: function (args) {
-                                                                return 'message.confirm.scale.up.system.vm';
-                                                            },
-                                                            notification: function (args) {
-
-                                                                return 'label.system.vm.scaled.up';
-                                                            }
-                                                        },
-                                                        notification: {
-                                                            poll: pollAsyncJobResult
-                                                        }
-                                                    },
-
-
-                                                    viewConsole: {
-                                                        label: 'label.view.console',
-                                                        action: {
-                                                            externalLink: {
-                                                                url: function (args) {
-                                                                    return clientConsoleUrl + '?cmd=access&vm=' + args.context.systemVMs[0].id;
-                                                                },
-                                                                title: function (args) {
-                                                                    return args.context.systemVMs[0].id.substr(0, 8);
-                                                                    //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                                                },
-                                                                width: 820,
-                                                                height: 640
-                                                            }
-                                                        }
-                                                    }
-                                                },
-                                                tabs: {
-                                                    details: {
-                                                        title: 'label.details',
-                                                        fields:[ {
-                                                            name: {
-                                                                label: 'label.name'
-                                                            }
-                                                        },
-                                                        {
-                                                            id: {
-                                                                label: 'label.id'
-                                                            },
-                                                            state: {
-                                                                label: 'label.state'
-                                                            },
-                                                            systemvmtype: {
-                                                                label: 'label.type',
-                                                                converter: function (args) {
-                                                                    if (args == "consoleproxy")
-                                                                    return 'label.console.proxy.vm'; else if (args == "secondarystoragevm")
-                                                                    return 'label.secondary.storage.vm'; else
-                                                                    return args;
-                                                                }
-                                                            },
-                                                            zonename: {
-                                                                label: 'label.zone'
-                                                            },
-                                                            publicip: {
-                                                                label: 'label.public.ip'
-                                                            },
-                                                            privateip: {
-                                                                label: 'label.private.ip'
-                                                            },
-                                                            linklocalip: {
-                                                                label: 'label.linklocal.ip'
-                                                            },
-                                                            hostname: {
-                                                                label: 'label.host'
-                                                            },
-                                                            gateway: {
-                                                                label: 'label.gateway'
-                                                            },
-                                                            created: {
-                                                                label: 'label.created',
-                                                                converter: cloudStack.converters.toLocalDate
-                                                            },
-                                                            activeviewersessions: {
-                                                                label: 'label.active.sessions'
-                                                            }
-                                                        }],
-                                                        dataProvider: function (args) {
-                                                            $.ajax({
-                                                                url: createURL("listSystemVms&id=" + args.context.systemVMs[0].id),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    args.response.success({
-                                                                        actionFilter: systemvmActionfilter,
-                                                                        data: json.listsystemvmsresponse.systemvm[0]
-                                                                    });
-                                                                }
-                                                            });
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    },
-
-                                    // Granular settings for zone
-                                    settings: {
-                                        title: 'label.settings',
-                                        custom: cloudStack.uiCustom.granularSettings({
-                                            dataProvider: function (args) {
-                                                $.ajax({
-                                                    url: createURL('listConfigurations&zoneid=' + args.context.physicalResources[0].id),
-                                                    data: listViewDataProvider(args, {
-                                                    },
-                                                    {
-                                                        searchBy: 'name'
-                                                    }),
-                                                    success: function (json) {
-                                                        args.response.success({
-                                                            data: json.listconfigurationsresponse.configuration
-                                                        });
-                                                    },
-
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            },
-                                            actions: {
-                                                edit: function (args) {
-                                                    // call updateZoneLevelParamter
-                                                    var data = {
-                                                        name: args.data.jsonObj.name,
-                                                        value: args.data.value
-                                                    };
-
-                                                    $.ajax({
-                                                        url: createURL('updateConfiguration&zoneid=' + args.context.physicalResources[0].id),
-                                                        data: data,
-                                                        success: function (json) {
-                                                            var item = json.updateconfigurationresponse.configuration;
-                                                            args.response.success({
-                                                                data: item
-                                                            });
-                                                        },
-
-                                                        error: function (json) {
-                                                            args.response.error(parseXMLHttpResponse(json));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        })
-                                    }
-                                }
-                            }
-                        },
-                        pods: function () {
-                            var listView = $.extend(true, {
-                            },
-                            cloudStack.sections.system.subsections.pods.listView, {
-                                dataProvider: function (args) {
-                                    var data = {
-                                    };
-                                    listViewDataProvider(args, data);
-
-                                    $.ajax({
-                                        url: createURL('listPods'),
-                                        data: data,
-                                        success: function (json) {
-                                            args.response.success({
-                                                data: json.listpodsresponse.pod
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-
-                                detailView: {
-                                    updateContext: function (args) {
-                                        var zone;
-
-                                        $.ajax({
-                                            url: createURL('listZones'),
-                                            data: {
-                                                id: args.context.pods[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function (json) {
-                                                zone = json.listzonesresponse.zone[0];
-                                            }
-                                        });
-
-                                        selectedZoneObj = zone;
-
-                                        return {
-                                            zones:[zone]
-                                        };
-                                    }
-                                }
-                            });
-
-                            return listView;
-                        },
-                        clusters: function () {
-                            var listView = $.extend(true, {
-                            },
-                            cloudStack.sections.system.subsections.clusters.listView, {
-                                dataProvider: function (args) {
-                                    var data = {
-                                    };
-                                    listViewDataProvider(args, data);
-
-                                    $.ajax({
-                                        url: createURL('listClusters'),
-                                        data: data,
-                                        success: function (json) {
-                                            args.response.success({
-                                                data: json.listclustersresponse.cluster
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-
-                                detailView: {
-                                    updateContext: function (args) {
-                                        var zone;
-
-                                        $.ajax({
-                                            url: createURL('listZones'),
-                                            data: {
-                                                id: args.context.clusters[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function (json) {
-                                                zone = json.listzonesresponse.zone[0];
-                                            }
-                                        });
-
-                                        selectedZoneObj = zone;
-
-                                        return {
-                                            zones:[zone]
-                                        };
-                                    }
-                                }
-                            });
-
-                            return listView;
-                        },
-                        hosts: function () {
-                            var listView = $.extend(true, {
-                            },
-                            cloudStack.sections.system.subsections.hosts.listView, {
-                                dataProvider: function (args) {
-                                    var data = {
-                                        type: 'routing'
-                                    };
-                                    listViewDataProvider(args, data);
-
-                                    $.ajax({
-                                        url: createURL('listHosts'),
-                                        data: data,
-                                        success: function (json) {
-                                            var items = json.listhostsresponse.host;
-                                            if (items) {
-                                                $.each(items, function(idx, host) {
-                                                    if (host && host.outofbandmanagement) {
-                                                        items[idx].powerstate = host.outofbandmanagement.powerstate;
-                                                    }
-
-                                                    if (host && host.hypervisor == "KVM" && host.state == 'Up' && host.details && host.details["secured"] != 'true') {
-                                                        items[idx].state = 'Unsecure';
-                                                    }
-
-                                                });
-                                            }
-
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-
-                                detailView: {
-                                    updateContext: function (args) {
-                                        var zone;
-
-                                        $.ajax({
-                                            url: createURL('listZones'),
-                                            data: {
-                                                id: args.context.hosts[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function (json) {
-                                                zone = json.listzonesresponse.zone[0];
-                                            }
-                                        });
-
-                                        selectedZoneObj = zone;
-
-                                        return {
-                                            zones:[zone]
-                                        };
-                                    }
-                                }
-                            });
-
-                            return listView;
-                        },
-                        primaryStorage: function () {
-                            var listView = $.extend(true, {
-                            },
-                            cloudStack.sections.system.subsections[ 'primary-storage'].listView, {
-                                dataProvider: function (args) {
-                                    var data = {
-                                    };
-                                    listViewDataProvider(args, data);
-
-                                    $.ajax({
-                                        url: createURL('listStoragePools'),
-                                        data: data,
-                                        success: function (json) {
-                                            args.response.success({
-                                                data: json.liststoragepoolsresponse.storagepool
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-
-                                detailView: {
-                                    updateContext: function (args) {
-                                        var zone;
-
-                                        $.ajax({
-                                            url: createURL('listZones'),
-                                            data: {
-                                                id: args.context.primarystorages[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function (json) {
-                                                zone = json.listzonesresponse.zone[0];
-                                            }
-                                        });
-
-                                        selectedZoneObj = zone;
-
-                                        return {
-                                            zones:[zone]
-                                        };
-                                    }
-                                }
-                            });
-
-                            return listView;
-                        },
-
-                        secondaryStorage: function () {
-                            var listView = $.extend(
-                            true, {
-                            },
-                            cloudStack.sections.system.subsections[ 'secondary-storage'], {
-                                sections: {
-                                    secondaryStorage: {
-                                        listView: {
-                                            dataProvider: function (args) {
-                                                var data = {
-                                                    type: 'SecondaryStorage'
-                                                };
-                                                listViewDataProvider(args, data);
-
-                                                $.ajax({
-                                                    url: createURL('listImageStores'),
-                                                    data: data,
-                                                    success: function (json) {
-                                                        var items = json.listimagestoresresponse.imagestore;
-                                                        if (items != undefined) {
-                                                            for (var i = 0; i < items.length; i++) {
-                                                                processPropertiesInImagestoreObject(items[i]);
-                                                            }
-                                                        }
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    },
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    },
-                                    cacheStorage: {
-                                        listView: {
-                                            dataProvider: function (args) {
-                                                var data = {
-                                                };
-                                                listViewDataProvider(args, data);
-
-                                                $.ajax({
-                                                    url: createURL('listSecondaryStagingStores'),
-                                                    data: data,
-                                                    success: function (json) {
-                                                        args.response.success({
-                                                            data: json.listsecondarystagingstoreresponse.imagestore
-                                                        });
-                                                    },
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-
-                                            /*
-                                            ,
-                                            detailView: {
-                                            updateContext: function (args) {
-                                            return {
-                                            zones: [{}]
-                                            };
-                                            }
-                                            }
-                                             */
-                                        }
-                                    }
-                                }
-                            });
-
-                            return listView;
-                        },
-                        systemVms: function () {
-                            var listView = $.extend(true, {
-                            },
-                            cloudStack.sections.system.subsections.systemVms.listView, {
-                                dataProvider: function (args) {
-                                    var data = {
-                                    };
-                                    listViewDataProvider(args, data);
-
-                                    $.ajax({
-                                        url: createURL('listSystemVms'),
-                                        data: data,
-                                        success: function (json) {
-                                            var systemvmObjs = json.listsystemvmsresponse.systemvm || [];
-                                            $(systemvmObjs).each(function(idx, item) {
-                                                var controlIp = item.linklocalip;
-                                                if (item.hypervisor == "VMware") {
-                                                    var controlIp = item.privateip;
-                                                }
-                                                item.controlip = controlIp;
-                                            });
-
-                                            args.response.success({
-                                                data: systemvmObjs
-                                            });
-                                        }
-                                    });
-                                },
-
-                                detailView: {
-                                    updateContext: function (args) {
-                                        var zone;
-
-                                        $.ajax({
-                                            url: createURL('listZones'),
-                                            data: {
-                                                id: args.context.systemVMs[0].zoneid
-                                            },
-                                            async: false,
-                                            success: function (json) {
-                                                zone = json.listzonesresponse.zone[0];
-                                            }
-                                        });
-
-                                        selectedZoneObj = zone;
-
-                                        return {
-                                            zones:[zone]
-                                        };
-                                    }
-                                }
-                            });
-
-                            return listView;
-                        },
-                        virtualRouters: function () {
-                            var listView = $.extend(true, {
-                            },
-                            cloudStack.sections.system.subsections.virtualRouters, {
-                                sections: {
-                                    virtualRouterNoGrouping: {
-                                        listView: {
-                                            dataProvider: function (args) {
-                                                var data = {
-                                                };
-                                                listViewDataProvider(args, data);
-
-                                                var routers =[];
-
-                                                //get account-owned routers
-                                                $.ajax({
-                                                    url: createURL('listRouters'),
-                                                    data: $.extend(data, {
-                                                        listAll: true
-                                                    }),
-                                                    async: false,
-                                                    success: function (json) {
-                                                        var items = json.listroutersresponse.router ? json.listroutersresponse.router:[];
-                                                        $(items).map(function (index, item) {
-                                                            routers.push(item);
-                                                        });
-
-                                                        //if account is specified in advanced search, don't search project-owned routers
-                                                        var accountIsNotSpecifiedInAdvSearch = true;
-                                                        if (args.filterBy != null) {
-                                                            if (args.filterBy.advSearch != null && typeof(args.filterBy.advSearch) == "object") { //advanced search
-                                                                if ('account' in args.filterBy.advSearch  && args.filterBy.advSearch.account.length > 0) {
-                                                                    accountIsNotSpecifiedInAdvSearch = false;  //since account and projectid can't be specified together
-                                                                }
-                                                            }
-                                                        }
-                                                        if (accountIsNotSpecifiedInAdvSearch) {
-                                                            /*
-                                                             * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
-                                                             * because in project view, all API calls are appended with projectid=[projectID].
-                                                             * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
-                                                             */
-                                                            if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
-                                                            $.ajax({
-                                                                    url: createURL("listRouters&page=" + args.page + "&pagesize=" + pageSize + "&projectid=-1"),
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var items = json.listroutersresponse.router ? json.listroutersresponse.router:[];
-                                                                    $(items).map(function (index, item) {
-                                                                        routers.push(item);
-                                                                    });
-                                                                }
-                                                            });
-
-                                                        }
-                                                    }
-
-                                                        args.response.success({
-                                                            actionFilter: routerActionfilter,
-                                                            data: $(routers).map(mapRouterType)
-                                                        });
-                                                    }
-                                                });
-
-                                                args.response.success({
-                                                    actionFilter: routerActionfilter,
-                                                    data: $(routers).map(mapRouterType)
-                                                });
-                                            },
-
-                                            detailView: {
-                                                updateContext: function (args) {
-                                                    var zone;
-
-                                                    $.ajax({
-                                                        url: createURL('listZones'),
-                                                        data: {
-                                                            id: args.context.routers[0].zoneid
-                                                        },
-                                                        async: false,
-                                                        success: function (json) {
-                                                            zone = json.listzonesresponse.zone[0];
-                                                        }
-                                                    });
-
-                                                    selectedZoneObj = zone;
-
-                                                    return {
-                                                        zones:[zone]
-                                                    };
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            });
-
-                            return listView;
-                        },
-
-                        sockets: function () {
-                            var listView = {
-                                id: 'sockets',
-                                fields: {
-                                    hypervisor: {
-                                        label: 'label.hypervisor'
-                                    },
-                                    hosts: {
-                                        label: 'label.hosts'
-                                    },
-                                    sockets: {
-                                        label: 'label.sockets'
-                                    }
-                                },
-                                dataProvider: function (args) {
-                                    var array1 = [];
-
-                                    // ***** non XenServer (begin) *****
-                    var hypervisors = ["Hyperv", "KVM", "VMware", "BareMetal", "LXC", "Ovm3"];
-
-                                            var supportSocketHypervisors = {
-                                                "Hyperv": 1,
-                                                "KVM": 1,
-                                                "VMware": 1,
-                                                "Ovm3": 1
-                                            };
-
-                                    for (var h = 0; h < hypervisors.length; h++) {
-                                                    var totalHostCount = 0;
-                                                    var currentPage = 1;
-                                                    var returnedHostCount = 0;
-                                                    var returnedHostCpusocketsSum = 0;
-
-                                        var callListHostsWithPage = function() {
-                                                        $.ajax({
-                                                            url: createURL('listHosts'),
-                                                            async: false,
-                                                            data: {
-                                                                type: 'routing',
-                                                    hypervisor: hypervisors[h],
-                                                                page: currentPage,
-                                                                pagesize: pageSize //global variable
-                                                            },
-                                                            success: function (json) {
-                                                                if (json.listhostsresponse.count == undefined) {
-                                                                    return;
-                                                                }
-
-                                                                    totalHostCount = json.listhostsresponse.count;
-                                                                returnedHostCount += json.listhostsresponse.host.length;
-
-                                                                var items = json.listhostsresponse.host;
-                                                                for (var i = 0; i < items.length; i++) {
-                                                                    if (items[i].cpusockets != undefined && isNaN(items[i].cpusockets) == false) {
-                                                                        returnedHostCpusocketsSum += items[i].cpusockets;
-                                                                    }
-                                                                }
-
-                                                                if (returnedHostCount < totalHostCount) {
-                                                                    currentPage++;
-                                                        callListHostsWithPage();
-                                                                }
-                                                            }
-                                                        });
-                                                    }
-
-                                        callListHostsWithPage();
-
-                                        if ((hypervisors[h] in supportSocketHypervisors) == false) {
-                                                        returnedHostCpusocketsSum = 'N/A';
-                                                    }
-
-                                        var hypervisorName = hypervisors[h];
-                                        if (hypervisorName == "Hyperv") {
-                                            hypervisorName = "Hyper-V";
-                                        }
-
-                                        array1.push({
-                                            hypervisor: hypervisorName,
-                                                        hosts: totalHostCount,
-                                                        sockets: returnedHostCpusocketsSum
-                                            });
-                                        }
-                                    // ***** non XenServer (end) *****
-
-
-                                    // ***** XenServer (begin) *****
-                                    var totalHostCount = 0;
-                                    var currentPage = 1;
-                                    var returnedHostCount = 0;
-
-                                    var returnedHostCountForXenServer700 = 0;  //'XenServer 7.0.0'
-                                    var returnedHostCpusocketsSumForXenServer700 = 0;
-
-                                    var returnedHostCountForXenServer650 = 0;  //'XenServer 6.5.0'
-                                    var returnedHostCpusocketsSumForXenServer650 = 0;
-
-                                    var returnedHostCountForXenServer620 = 0;  //'XenServer 6.2.0'
-                                    var returnedHostCpusocketsSumForXenServer620 = 0;
-
-                                    var returnedHostCountForXenServer61x = 0;  //'XenServer 6.1.x and before'
-
-                                    var callListHostsWithPage = function() {
-                                        $.ajax({
-                                            url: createURL('listHosts'),
-                                            async: false,
-                                            data: {
-                                                type: 'routing',
-                                                hypervisor: 'XenServer',
-                                                page: currentPage,
-                                                pagesize: pageSize //global variable
-                                            },
-                                            success: function(json) {
-                                                if (json.listhostsresponse.count == undefined) {
-                                                    return;
-                                                }
-
-                                                totalHostCount = json.listhostsresponse.count;
-                                                returnedHostCount += json.listhostsresponse.host.length;
-
-                                                var items = json.listhostsresponse.host;
-                                                for (var i = 0; i < items.length; i++) {
-                                                    if (items[i].hypervisorversion == "7.0.0") {
-                                                        returnedHostCountForXenServer700 ++;
-                                                        if (items[i].cpusockets != undefined && isNaN(items[i].cpusockets) == false) {
-                                                            returnedHostCpusocketsSumForXenServer700 += items[i].cpusockets;
-                                                        }
-													} else if (items[i].hypervisorversion == "6.5.0") {
-                                                        returnedHostCountForXenServer650 ++;
-                                                        if (items[i].cpusockets != undefined && isNaN(items[i].cpusockets) == false) {
-                                                            returnedHostCpusocketsSumForXenServer650 += items[i].cpusockets;
-                                                        }
-                                                    } else if (items[i].hypervisorversion == "6.2.0") {
-                                                        returnedHostCountForXenServer620 ++;
-                                                        if (items[i].cpusockets != undefined && isNaN(items[i].cpusockets) == false) {
-                                                            returnedHostCpusocketsSumForXenServer620 += items[i].cpusockets;
-                                                        }
-                                                    } else {
-                                                        returnedHostCountForXenServer61x++;
-                                                    }
-                                                }
-
-                                                if (returnedHostCount < totalHostCount) {
-                                                    currentPage++;
-                                                    callListHostsWithPage();
-                                                }
-                                            }
-                                        });
-                                    }
-
-                                    callListHostsWithPage();
-
-                                    array1.push({
-                                        hypervisor: 'XenServer 7.0.0',
-                                        hosts: returnedHostCountForXenServer700,
-                                        sockets: returnedHostCpusocketsSumForXenServer700
-                                    });
-
-                                    array1.push({
-                                        hypervisor: 'XenServer 6.5.0',
-                                        hosts: returnedHostCountForXenServer650,
-                                        sockets: returnedHostCpusocketsSumForXenServer650
-                                    });
-
-                                    array1.push({
-                                        hypervisor: 'XenServer 6.2.0',
-                                        hosts: returnedHostCountForXenServer620,
-                                        sockets: returnedHostCpusocketsSumForXenServer620
-                                    });
-
-                                    array1.push({
-                                        hypervisor: 'XenServer 6.1.x and before',
-                                        hosts: returnedHostCountForXenServer61x,
-                                        sockets: 'N/A'
-                                    });
-
-                                    // ***** XenServer (end) *****
-
-
-                                    args.response.success({
-                                        data: array1
-                                    });
-
-                                }
-                            };
-
-                            return listView;
-                        },
-
-                        managementServers: function () {
-                            var listView = {
-                                id: 'managementservers',
-                                fields: {
-                                    name: {
-                                        label: 'label.name'
-                                    },
-                                    id: {
-                                        label: 'label.uuid'
-                                    },
-                                    state: {
-                                        label: 'label.state',
-                                        indicator: {
-                                            'Up': 'on',
-                                            'Down': 'off'
-                                        }
-                                    },
-                                    version: {
-                                        label: 'label.version'
-                                    }
-                                },
-                                dataProvider: function (args) {
-                                        $.ajax({
-                                            url: createURL('listManagementServers'),
-                                            async: false,
-                                            success: function (json) {
-                                                args.response.success({ data: json.listmanagementserversresponse.managementserver });
-                                            }
-                                        });
-                                    }
-                                };
-                            return listView;
-                        }
-                    }
-                }
-            }
-        },
-        subsections: {
-            virtualRouters: {
-                sectionSelect: {
-                    label: 'label.select-view',
-                    preFilter: function(args) {
-                        //Only clicking ViewAll Link("view all Virtual Routers") in "Virtual Routers group by XXXXXXX" detailView will have "routerGroupByXXXXXXX" included in args.context
-                        if ("routerGroupByZone" in args.context) {
-                            return ["routerGroupByZone"]; // read-only (i.e. text "group by Zone")
-                        } else if ( "routerGroupByPod" in args.context) {
-                            return ["routerGroupByPod"]; // read-only (i.e. text "group by Pod")
-                        } else if ("routerGroupByCluster" in args.context) {
-                            return ["routerGroupByCluster"]; // read-only (i.e. text "group by Cluster")
-                        } else if ("routerGroupByAccount" in args.context) {
-                            return ["routerGroupByAccount"]; // read-only (i.e. text "group by Account")
-                        } else {
-                            return ["routerNoGroup", "routerGroupByZone", "routerGroupByPod", "routerGroupByCluster", "routerGroupByAccount"]; //editable dropdown
-                        }
-                    }
-                },
-                sections: {
-                    routerNoGroup: {
-                        id: 'routers',
-                        type: 'select',
-                        title: 'label.no.grouping',
-                        listView: {
-                            id: 'routers',
-                            label: 'label.virtual.appliances',
-                            horizontalOverflow: true,
-                            fields: {
-                                name: {
-                                    label: 'label.name'
-                                },
-                                publicip: {
-                                    label: 'label.ip'
-                                },
-                                routerType: {
-                                    label: 'label.type'
-                                },
-                                guestnetworkname: {
-                                    label: 'label.network'
-                                },
-                                account: {
-                                    label: 'label.account'
-                                },
-                                hostname: {
-                                    label: 'label.host'
-                                },
-                                state: {
-                                    converter: function (str) {
-                                        // For localization
-                                        return str;
-                                    },
-                                    label: 'label.status',
-                                    indicator: {
-                                        'Running': 'on',
-                                        'Stopped': 'off',
-                                        'Error': 'off',
-                                        'Alert': 'warning'
-                                    }
-                                },
-                                healthchecksfailed: {
-                                    converter: function (str) {
-                                        if (str) return 'Failed'
-                                        return 'Passed';
-                                    },
-                                    label: 'label.health.check',
-                                    indicator: {
-                                        false: 'on',
-                                        true: 'warning'
-                                    }
-                                },
-                                requiresupgrade: {
-                                    label: 'label.requires.upgrade',
-                                    converter: cloudStack.converters.toBooleanText
-                                }
-                            },
-                            preFilter: function () {
-                                if (!g_routerHealthChecksEnabled) {
-                                    return ['healthchecksfailed']
-                                }
-                                return []
-                            },
-                            dataProvider: function (args) {
-                                var array1 =[];
-                                if (args.filterBy != null) {
-                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                        switch (args.filterBy.search.by) {
-                                            case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                        }
-                                    }
-                                }
-
-                                var data2 = {
-                                    // forvpc: false
-                                };
-
-                                if (args.context != undefined) {
-                                    if ("routerGroupByZone" in args.context) {
-                                        $.extend(data2, {
-                                            zoneid: args.context.routerGroupByZone[0].id
-                                        })
-                                    } else if ("routerGroupByPod" in args.context) {
-                                        $.extend(data2, {
-                                            podid: args.context.routerGroupByPod[0].id
-                                        })
-                                    } else if ("routerGroupByCluster" in args.context) {
-                                        $.extend(data2, {
-                                            clusterid: args.context.routerGroupByCluster[0].id
-                                        })
-                                    } else if ("routerGroupByAccount" in args.context) {
-                                        $.extend(data2, {
-                                             account: args.context.routerGroupByAccount[0].name,
-                                             domainid: args.context.routerGroupByAccount[0].domainid
-                                        })
-                                    }
-                                    if ("networks" in args.context) {
-                                       $.extend(data2, {
-                                             networkid: args.context.networks[0].id
-                                       })
-                                    }
-                                    if ("vpc" in args.context) {
-                                       $.extend(data2, {
-                                             vpcid: args.context.vpc[0].id
-                                       })
-                                    }
-                                }
-
-                                var routers =[];
-                                $.ajax({
-                                    url: createURL("listRouters&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                    data: data2,
-                                    success: function (json) {
-                                        var items = json.listroutersresponse.router ?
-                                        json.listroutersresponse.router:[];
-
-                                        $(items).map(function (index, item) {
-                                            routers.push(item);
-                                        });
-
-                                        /*
-                                         * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
-                                         * because in project view, all API calls are appended with projectid=[projectID].
-                                         * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
-                                         */
-                                        if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
-                                            /*
-                                             * account parameter(account+domainid) and project parameter(projectid) are not allowed to be passed together to listXXXXXXX API.
-                                             * So, remove account parameter(account+domainid) from data2
-                                             */
-                                            if ("account" in data2) {
-                                                delete data2.account;
-                                            }
-                                            if ("domainid" in data2) {
-                                                delete data2.domainid;
-                                            }
-
-                                            $.ajax({
-                                                url: createURL("listRouters&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
-                                                data: data2,
-                                                async: false,
-                                                success: function (json) {
-                                                    var items = json.listroutersresponse.router ?
-                                                    json.listroutersresponse.router:[];
-
-                                                    var items = json.listroutersresponse.router ?
-                                                    json.listroutersresponse.router:[];
-
-                                                    $(items).map(function (index, item) {
-                                                        routers.push(item);
-                                                    });
-                                                }
-                                            });
-                                        }
-
-                                        args.response.success({
-                                            actionFilter: routerActionfilter,
-                                            data: $(routers).map(mapRouterType)
-                                        });
-                                    }
-                                });
-                            },
-                            detailView: {
-                                name: 'label.virtual.appliance.details',
-                                viewAll: [{
-                                    label: 'label.account',
-                                    path: 'accounts',
-                                    preFilter: function(args) {
-                                        if (args.context.routers[0].projectid)
-                                            return false;
-                                        if (args.context.routers[0].account == 'system')
-                                            return false;
-                                        return true;
-                                    }
-                                }, {
-                                    label: 'label.networks',
-                                    path: 'network',
-                                }, {
-                                    label: 'label.instances',
-                                    path: 'instances'
-                                }],
-                                actions: {
-                                    start: {
-                                        label: 'label.action.start.router',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.action.start.router';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.action.start.router';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL('startRouter&id=' + args.context.routers[0].id),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function (json) {
-                                                    var jid = json.startrouterresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function (json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.router;
-                                                            },
-                                                            getActionFilter: function () {
-                                                                return routerActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    stop: {
-                                        label: 'label.action.stop.router',
-                                        createForm: {
-                                            title: 'label.action.stop.router',
-                                            desc: 'message.action.stop.router',
-                                            fields: {
-                                                forced: {
-                                                    label: 'force.stop',
-                                                    isBoolean: true,
-                                                    isChecked: false
-                                                }
-                                            }
-                                        },
-                                        messages: {
-                                            notification: function (args) {
-                                                return 'label.action.stop.router';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            var array1 =[];
-                                            array1.push("&forced=" + (args.data.forced == "on"));
-                                            $.ajax({
-                                                url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function (json) {
-                                                    var jid = json.stoprouterresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function (json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.router;
-                                                            },
-                                                            getActionFilter: function () {
-                                                                return routerActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    upgradeRouterToUseNewerTemplate: {
-                                        label: 'label.upgrade.router.newer.template',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.upgrade.router.newer.template';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.upgrade.router.newer.template';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL('upgradeRouterTemplate'),
-                                                data: {
-                                                    id: args.context.routers[0].id
-                                                },
-                                                success: function (json) {
-                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
-                                                    if (jobs != undefined) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobs[0].jobid
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    'remove': {
-                                        label: 'label.destroy.router',
-                                        messages: {
-                                            confirm: function (args) {
-                                                if (args && args.context && args.context.routers[0]) {
-                                                    if (args.context.routers[0].state == 'Running') {
-                                                        return dictionary['message.action.stop.router'] + ' ' + dictionary['message.confirm.destroy.router'];
-                                                    }
-                                                }
-                                                return 'message.confirm.destroy.router';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.destroy.router';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("destroyRouter&id=" + args.context.routers[0].id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var jid = json.destroyrouterresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    restart: {
-                                        label: 'label.action.reboot.router',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.action.reboot.router';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.action.reboot.router';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL('rebootRouter&id=' + args.context.routers[0].id),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function (json) {
-                                                    var jid = json.rebootrouterresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function (json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.router;
-                                                            },
-                                                            getActionFilter: function () {
-                                                                return routerActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    migrate: {
-                                        label: 'label.action.migrate.router',
-                                        createForm: {
-                                            title: 'label.action.migrate.router',
-                                            desc: '',
-                                            fields: {
-                                                hostId: {
-                                                    label: 'label.host',
-                                                    validation: {
-                                                        required: true
-                                                    },
-                                                    select: function (args) {
-                                                        $.ajax({
-                                                            url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
-                                                            dataType: "json",
-                                                            async: true,
-                                                            success: function (json) {
-                                                                var hostObjs = json.findhostsformigrationresponse.host;
-                                                                var items =[];
-                                                                $(hostObjs).each(function () {
-                                                                    items.push({
-                                                                        id: this.id,
-                                                                        description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
-                                                                    });
-                                                                });
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        args.response.error(errorMsg);
-                                                    }
-                                                }
-                                            }
-                                        },
-                                        messages: {
-                                            notification: function (args) {
-                                                return 'label.action.migrate.router';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var jid = json.migratesystemvmresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function (json) {
-                                                                //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
-                                                                $.ajax({
-                                                                    url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
-                                                                    dataType: "json",
-                                                                    async: false,
-                                                                    success: function (json) {
-                                                                        var items = json.listroutersresponse.router;
-                                                                        if (items != null && items.length > 0) {
-                                                                            return items[0];
-                                                                        }
-                                                                    }
-                                                                });
-                                                            },
-                                                            getActionFilter: function () {
-                                                                return routerActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    // VR Diagnostics
-                                    diagnostics: {
-                                        label: 'label.action.run.diagnostics',
-                                        messages: {
-                                            notification: function (args) {
-                                                return 'label.action.run.diagnostics';
-                                            },
-                                            complete: function(args) {
-                                                var exitcode = _l('message.diagnostics.exitcode');
-                                                exitcode = exitcode.replace('var', args.exitcode);
-                                                var stderr = _l('message.diagnostics.stderr');
-                                                stderr = stderr.replace('var', args.stderr);
-                                                var stdout = _l('message.diagnostics.stdout');
-                                                stdout = stdout.replace('var', args.stdout);
-                                                var msg = "<div style='text-align: left; overflow-y: auto'>" + exitcode + "<br><br>" + stderr + "<br><br>" + stdout + "</div>";
-                                                return msg;
-                                            }
-                                        },
-                                        createForm: {
-                                            title: 'label.action.run.diagnostics',
-                                            desc: '',
-                                            fields: {
-                                                type: {
-                                                    label: 'label.run.diagnostics.type',
-                                                    validation: {
-                                                        required: true
-                                                    },
-                                                    select: function (args) {
-                                                        var items = [];
-                                                        items.push({
-                                                            id: "ping",
-                                                            description: "Ping"
-                                                        });
-                                                        items.push({
-                                                            id: "traceroute",
-                                                            description: "Traceroute"
-                                                        });
-                                                        items.push({
-                                                            id: "arping",
-                                                            description: "Arping"
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                },
-                                                destination: {
-                                                    label: 'label.run.diagnostics.destination',
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                },
-                                                extra: {
-                                                    label: 'label.run.diagnostics.extra'
-                                                }
-
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("runDiagnostics&targetid=" + args.context.routers[0].id + "&ipaddress=" + args.data.destination + "&type=" + args.data.type + "&params=" + args.data.extra),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var jid = json.rundiagnosticsresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId : jid,
-                                                            getUpdatedItem: function (json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                            },
-                                                            getActionFilter: function(){
-                                                                return routerActionfilter;
-                                                           }
-                                                        }
-
-                                                    });
-                                                }
-                                            }); //end ajax
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    retrieveDiagnostics: {
-                                        label: 'label.action.get.diagnostics',
-                                        messages: {
-                                            notification: function (args) {
-                                                return 'label.action.get.diagnostics';
-                                            },
-                                            complete: function(args) {
-                                                var url = args.url;
-                                                var htmlMsg = _l('message.download.diagnostics');
-                                                var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
-                                                return htmlMsg2;
-                                            }
-                                        },
-                                        createForm: {
-                                            title: 'label.action.get.diagnostics',
-                                            desc: 'label.get.diagnostics.desc',
-                                            fields: {
-                                                files: {
-                                                    label: 'label.get.diagnostics.files'
-                                                }
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("getDiagnosticsData&targetid=" + args.context.routers[0].id + "&files=" + args.data.files),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var jid = json.getdiagnosticsdataresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId : jid,
-                                                            getUpdatedItem: function (json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                            },
-                                                            getActionFilter: function(){
-                                                                return systemvmActionfilter;
-                                                           }
-                                                        }
-
-                                                    });
-                                                }
-                                            }); //end ajax
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-                                    scaleUp: { //*** Infrastructure > Virtual Routers > change service offering ***
-                                        label: 'label.change.service.offering',
-                                        createForm: {
-                                            title: 'label.change.service.offering',
-                                            desc: function (args) {
-                                                var description = '';
-                                                var vmObj = args.jsonObj;
-                                                //if (vmObj.state == 'Running' && vmObj.hypervisor == 'VMware') { //needs to wait for API fix that will return hypervisor property
-                                                if (vmObj.state == 'Running') {
-                                                    description = 'message.read.admin.guide.scaling.up';
-                                                }
-                                                return description;
-                                            },
-                                            fields: {
-                                                serviceOfferingId: {
-                                                    label: 'label.compute.offering',
-                                                    select: function (args) {
-                                                        $.ajax({
-                                                            url: createURL('listServiceOfferings'),
-                                                            data: {
-                                                                issystem: true,
-                                                                systemvmtype: 'domainrouter',
-                                                                virtualmachineid: args.context.routers[0].id
-                                                            },
-                                                            success: function (json) {
-                                                                var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
-                                                                var items =[];
-                                                                $(serviceofferings).each(function () {
-                                                                    // if(this.id != args.context.routers[0].serviceofferingid) {
-                                                                    items.push({
-                                                                        id: this.id,
-                                                                        description: this.name
-                                                                    });
-                                                                    //default one (i.e. "System Offering For Software Router") doesn't have displaytext property. So, got to use name property instead.
-                                                                });
-                                                                args.response.success({
-                                                                    data: items
-                                                                });
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            }
-                                        },
-
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("scaleSystemVm&id=" + args.context.routers[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var jid = json.changeserviceforsystemvmresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function (json) {
-                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                            },
-                                                            getActionFilter: function () {
-                                                                return routerActionfilter;
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        },
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.scale.up.router.vm';
-                                            },
-                                            notification: function (args) {
-
-                                                return 'label.router.vm.scaled.up';
-                                            }
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    },
-
-
-                                    viewConsole: {
-                                        label: 'label.view.console',
-                                        action: {
-                                            externalLink: {
-                                                url: function (args) {
-                                                    return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
-                                                },
-                                                title: function (args) {
-                                                    return args.context.routers[0].id.substr(0, 8);
-                                                    //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                                },
-                                                width: 820,
-                                                height: 640
-                                            }
-                                        }
-                                    },
-
-                                    healthChecks: {
-                                        label: 'label.action.router.health.checks',
-                                        createForm: {
-                                            title: 'label.action.router.health.checks',
-                                            desc: 'message.action.router.health.checks',
-                                            fields: {
-                                                performfreshchecks: {
-                                                    label: 'label.perform.fresh.checks',
-                                                    isBoolean: true
-                                                }
-                                            }
-                                        },
-                                        action: function (args) {
-                                            if (!g_routerHealthChecksEnabled) {
-                                                cloudStack.dialog.notice({
-                                                    message: 'Router health checks are disabled. Please enable router.health.checks.enabled to execute this action'
-                                                })
-                                                args.response.success()
-                                                return
-                                            }
-                                            var data = {
-                                                'routerid': args.context.routers[0].id,
-                                                'performfreshchecks': (args.data.performfreshchecks === 'on')
-                                            };
-                                            $.ajax({
-                                                url: createURL('getRouterHealthCheckResults'),
-                                                dataType: 'json',
-                                                data: data,
-                                                async: true,
-                                                success: function (json) {
-                                                    var healthChecks = json.getrouterhealthcheckresultsresponse.routerhealthchecks.healthchecks
-                                                    var numChecks = healthChecks.length
-                                                    var failedChecks = 0
-                                                    $.each(healthChecks, function(idx, check) {
-                                                        if (!check.success) failedChecks = failedChecks + 1
-                                                    })
-                                                    cloudStack.dialog.notice({
-                                                        message: 'Found ' + numChecks + ' checks for router, with ' + failedChecks + ' failing checks. Please visit router > Health Checks tab to see details'
-                                                    })
-                                                    args.response.success();
-                                                }
-                                            });
-                                        },
-                                        messages: {
-                                            notification: function(args) {
-                                                return 'label.action.router.health.checks'
-                                            }
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.details',
-                                        preFilter: function (args) {
-                                            var hiddenFields =[];
-                                            if (! args.context.routers[0].project) {
-                                                hiddenFields.push('project');
-                                                hiddenFields.push('projectid');
-                                            }
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                data: {
-                                                    id: args.context.routers[0].zoneid
-                                                },
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listzonesresponse.zone != undefined) {
-                                                        var zoneObj = json.listzonesresponse.zone[0];
-                                                        if (zoneObj.networktype == 'Basic') {
-                                                            hiddenFields.push('publicip');
-                                                            //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
-                                                        }
-                                                    }
-                                                }
-                                            });
-
-                                            if ('routers' in args.context && args.context.routers[0].vpcid != undefined) {
-                                                hiddenFields.push('guestnetworkid');
-                                                hiddenFields.push('guestnetworkname');
-                                            } else if ('routers' in args.context && args.context.routers[0].guestnetworkid != undefined) {
-                                                hiddenFields.push('vpcid');
-                                                hiddenFields.push('vpcname');
-                                            }
-
-                                            return hiddenFields;
-                                        },
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.name'
-                                            },
-                                            project: {
-                                                label: 'label.project'
-                                            }
-                                        },
-                                        {
-                                            id: {
-                                                label: 'label.id'
-                                            },
-                                            projectid: {
-                                                label: 'label.project.id'
-                                            },
-                                            state: {
-                                                label: 'label.state'
-                                            },
-                                            version: {
-                                                label: 'label.version'
-                                            },
-                                            requiresupgrade: {
-                                                label: 'label.requires.upgrade',
-                                                converter: cloudStack.converters.toBooleanText
-                                            },
-                                            guestnetworkid: {
-                                                label: 'label.network.id'
-                                            },
-                                            guestnetworkname: {
-                                                label: 'label.network.name'
-                                            },
-                                            vpcid: {
-                                                label: 'label.vpc.id'
-                                            },
-                                            vpcname: {
-                                                label: 'label.vpc'
-                                            },
-                                            publicip: {
-                                                label: 'label.public.ip'
-                                            },
-                                            guestipaddress: {
-                                                label: 'label.guest.ip'
-                                            },
-                                            linklocalip: {
-                                                label: 'label.linklocal.ip'
-                                            },
-                                            hostname: {
-                                                label: 'label.host'
-                                            },
-                                            serviceofferingname: {
-                                                label: 'label.compute.offering'
-                                            },
-                                            networkdomain: {
-                                                label: 'label.network.domain'
-                                            },
-                                            domain: {
-                                                label: 'label.domain'
-                                            },
-                                            account: {
-                                                label: 'label.account'
-                                            },
-                                            created: {
-                                                label: 'label.created',
-                                                converter: cloudStack.converters.toLocalDate
-                                            },
-                                            isredundantrouter: {
-                                                label: 'label.redundant.router',
-                                                converter: cloudStack.converters.toBooleanText
-                                            },
-                                            redundantRouterState: {
-                                                label: 'label.redundant.state'
-                                            },
-                                            vpcid: {
-                                                label: 'label.vpc.id'
-                                            }
-                                        }],
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL("listRouters&id=" + args.context.routers[0].id),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function (json) {
-                                                    var jsonObj = json.listroutersresponse.router[0];
-                                                    addExtraPropertiesToRouterInstanceObject(jsonObj);
-                                                    args.response.success({
-                                                        actionFilter: routerActionfilter,
-                                                        data: jsonObj
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    nics: {
-                                        title: 'label.nics',
-                                        multiple: true,
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.name',
-                                                header: true
-                                            },
-                                            type: {
-                                                label: 'label.type'
-                                            },
-                                            traffictype: {
-                                                label: 'label.traffic.type'
-                                            },
-                                            networkname: {
-                                                label: 'label.network.name'
-                                            },
-                                            netmask: {
-                                                label: 'label.netmask'
-                                            },
-                                            ipaddress: {
-                                                label: 'label.ip.address'
-                                            },
-                                            id: {
-                                                label: 'label.id'
-                                            },
-                                            networkid: {
-                                                label: 'label.network.id'
-                                            },
-                                            isolationuri: {
-                                                label: 'label.isolation.uri'
-                                            },
-                                            broadcasturi: {
-                                                label: 'label.broadcast.uri'
-                                            }
-                                        }],
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL("listRouters&id=" + args.context.routers[0].id),
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function (json) {
-                                                    var jsonObj = json.listroutersresponse.router[0].nic;
-
-                                                    args.response.success({
-                                                        actionFilter: routerActionfilter,
-                                                        data: $.map(jsonObj, function (nic, index) {
-                                                            var name = 'NIC ' + (index + 1);
-                                                            if (nic.isdefault) {
-                                                                name += ' (' + _l('label.default') + ')';
-                                                            }
-                                                            return $.extend(nic, {
-                                                                name: name
-                                                            });
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    healthCheckResults: {
-                                        title: 'label.router.health.checks',
-                                        listView: {
-                                            id: 'routerHealthCheckResults',
-                                            label: 'label.router.health.checks',
-                                            hideToolbar: true,
-                                            fields: {
-                                                checkname: {
-                                                    label: 'label.router.health.check.name'
-                                                },
-                                                checktype: {
-                                                    label: 'label.router.health.check.type'
-                                                },
-                                                success: {
-                                                    label: 'label.router.health.check.success',
-                                                    converter: function (args) {
-                                                        if (args) {
-                                                            return _l('True');
-                                                        } else {
-                                                            return _l('False');
-                                                        }
-                                                    },
-                                                    indicator: {
-                                                        true: 'on',
-                                                        false: 'off'
-                                                    }
-                                                },
-                                                lastupdated: {
-                                                    label: 'label.router.health.check.last.updated'
-                                                }
-                                            },
-                                            actions: {
-                                                details: {
-                                                    label: 'label.router.health.check.details',
-                                                    action: {
-                                                        custom: function (args) {
-                                                            cloudStack.dialog.notice({
-                                                                message: args.context.routerHealthCheckResults[0].details
-                                                            })
-                                                        }
-                                                    }
-                                                }
-                                            },
-                                            dataProvider: function(args) {
-                                                if (!g_routerHealthChecksEnabled) {
-                                                    cloudStack.dialog.notice({
-                                                        message: 'Router health checks are disabled. Please enable router.health.checks.enabled to get data'
-                                                    })
-                                                    args.response.success({})
-                                                    return
-                                                }
-                                                if (args.page > 1) {
-                                                    // Only one page is supported as it's not list command.
-                                                    args.response.success({});
-                                                    return
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('getRouterHealthCheckResults'),
-                                                    data: {
-                                                        'routerid': args.context.routers[0].id
-                                                    },
-                                                    success: function (json) {
-                                                        var hcData = json.getrouterhealthcheckresultsresponse.routerhealthchecks.healthchecks
-                                                        args.response.success({
-                                                            data: hcData
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    },
-                    routerGroupByZone: {
-                        id: 'routerGroupByZone',
-                        type: 'select',
-                        title: 'label.group.by.zone',
-                        listView: {
-                            id: 'routerGroupByZone',
-                            label: 'label.virtual.appliances',
-                            fields: {
-                                name: {
-                                    label: 'label.zone'
-                                },
-                                routerCount: {
-                                    label: 'label.total.virtual.routers'
-                                },
-                                routerRequiresUpgrade: {
-                                    label: 'label.upgrade.required',
-                                    converter: function (args) {
-                                        if (args > 0) {
-                                            return _l('label.yes');
-                                        } else {
-                                            return _l('label.no');
-                                        }
-                                    }
-                                }
-                            },
-
-                            dataProvider: function (args) {
-                                var array1 =[];
-                                if (args.filterBy != null) {
-                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                        switch (args.filterBy.search.by) {
-                                            case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                        }
-                                    }
-                                }
-                                $.ajax({
-                                    url: createURL("listZones&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function (json) {
-                                        var groupbyObjs = json.listzonesresponse.zone;
-                                        if (groupbyObjs != null) {
-                                            addExtraPropertiesToGroupbyObjects(groupbyObjs, 'zoneid');
-                                        }
-                                        args.response.success({
-                                            data: groupbyObjs
-                                        });
-                                    }
-                                });
-                            },
-                            detailView: {
-                                name: 'label.virtual.routers.group.zone',
-                                viewAll: {
-                                    path: '_zone.virtualRouters',
-                                    label: 'label.virtual.appliances'
-                                },
-                                actions: {
-                                    upgradeRouterToUseNewerTemplate: {
-                                        label: 'label.upgrade.router.newer.template',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.upgrade.routers.newtemplate';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.upgrade.router.newer.template';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL('upgradeRouterTemplate'),
-                                                data: {
-                                                    zoneid: args.context.routerGroupByZone[0].id
-                                                },
-                                                success: function (json) {
-                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
-                                                    if (jobs != undefined) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobs[0].jobid
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.virtual.routers.group.zone',
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.zone'
-                                            }
-                                        },
-                                        {
-                                            routerCount: {
-                                                label: 'label.total.virtual.routers'
-                                            },
-                                            routerRequiresUpgrade: {
-                                                label: 'label.upgrade.required',
-                                                converter: function (args) {
-                                                    if (args > 0) {
-                                                        return _l('label.yes');
-                                                    } else {
-                                                        return _l('label.no');
-                                                    }
-                                                }
-                                            },
-                                            numberOfRouterRequiresUpgrade: {
-                                                label: 'label.total.virtual.routers.upgrade'
-                                            }
-                                        }],
-                                        dataProvider: function (args) {
-                                            addExtraPropertiesToGroupbyObject(args.context.routerGroupByZone[0], 'zoneid');
-                                            args.response.success({
-                                                data: args.context.routerGroupByZone[0],
-                                                actionFilter: routerGroupActionfilter
-                                            });
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    },
-                    routerGroupByPod: {
-                        id: 'routerGroupByPod',
-                        type: 'select',
-                        title: 'label.group.by.pod',
-                        listView: {
-                            id: 'routerGroupByPod',
-                            label: 'label.virtual.appliances',
-                            fields: {
-                                name: {
-                                    label: 'label.pod'
-                                },
-                                routerCount: {
-                                    label: 'label.total.virtual.routers'
-                                },
-                                routerRequiresUpgrade: {
-                                    label: 'label.upgrade.required',
-                                    converter: function (args) {
-                                        if (args > 0) {
-                                            return _l('label.yes');
-                                        } else {
-                                            return _l('label.no');
-                                        }
-                                    }
-                                }
-                            },
-
-                            dataProvider: function (args) {
-                                var array1 =[];
-                                if (args.filterBy != null) {
-                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                        switch (args.filterBy.search.by) {
-                                            case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                        }
-                                    }
-                                }
-                                $.ajax({
-                                    url: createURL("listPods&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function (json) {
-                                        var groupbyObjs = json.listpodsresponse.pod;
-                                        if (groupbyObjs != null) {
-                                            addExtraPropertiesToGroupbyObjects(groupbyObjs, 'podid');
-                                        }
-                                        args.response.success({
-                                            data: groupbyObjs
-                                        });
-                                    }
-                                });
-                            },
-                            detailView: {
-                                name: 'label.virtual.routers.group.pod',
-                                viewAll: {
-                                    path: '_zone.virtualRouters',
-                                    label: 'label.virtual.appliances'
-                                },
-                                actions: {
-                                    upgradeRouterToUseNewerTemplate: {
-                                        label: 'label.upgrade.router.newer.template',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.upgrade.routers.pod.newtemplate';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.upgrade.router.newer.template';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL('upgradeRouterTemplate'),
-                                                data: {
-                                                    podid: args.context.routerGroupByPod[0].id
-                                                },
-                                                success: function (json) {
-                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
-                                                    if (jobs != undefined) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobs[0].jobid
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.virtual.routers.group.pod',
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.pod'
-                                            }
-                                        },
-                                        {
-                                            routerCount: {
-                                                label: 'label.total.virtual.routers'
-                                            },
-                                            routerRequiresUpgrade: {
-                                                label: 'label.upgrade.required',
-                                                converter: function (args) {
-                                                    if (args > 0) {
-                                                        return _l('label.yes');
-                                                    } else {
-                                                        return _l('label.no');
-                                                    }
-                                                }
-                                            },
-                                            numberOfRouterRequiresUpgrade: {
-                                                label: 'label.total.virtual.routers.upgrade'
-                                            },
-                                            zonename: {
-                                                label: 'label.zone'
-                                            }
-                                        }],
-                                        dataProvider: function (args) {
-                                            addExtraPropertiesToGroupbyObject(args.context.routerGroupByPod[0], 'podid');
-                                            args.response.success({
-                                                data: args.context.routerGroupByPod[0],
-                                                actionFilter: routerGroupActionfilter
-                                            });
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    },
-                    routerGroupByCluster: {
-                        id: 'routerGroupByCluster',
-                        type: 'select',
-                        title: 'label.group.by.cluster',
-                        listView: {
-                            id: 'routerGroupByCluster',
-                            label: 'label.virtual.appliances',
-                            fields: {
-                                name: {
-                                    label: 'label.cluster'
-                                },
-                                routerCount: {
-                                    label: 'label.total.virtual.routers'
-                                },
-                                routerRequiresUpgrade: {
-                                    label: 'label.upgrade.required',
-                                    converter: function (args) {
-                                        if (args > 0) {
-                                            return _l('label.yes');
-                                        } else {
-                                            return _l('label.no');
-                                        }
-                                    }
-                                }
-                            },
-
-                            dataProvider: function (args) {
-                                var array1 =[];
-                                if (args.filterBy != null) {
-                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                        switch (args.filterBy.search.by) {
-                                            case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                        }
-                                    }
-                                }
-                                $.ajax({
-                                    url: createURL("listClusters&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function (json) {
-                                        var groupbyObjs = json.listclustersresponse.cluster;
-                                        if (groupbyObjs != null) {
-                                            addExtraPropertiesToGroupbyObjects(groupbyObjs, 'clusterid');
-                                        }
-                                        args.response.success({
-                                            data: groupbyObjs
-                                        });
-                                    }
-                                });
-                            },
-                            detailView: {
-                                name: 'label.virtual.routers.group.cluster',
-                                viewAll: {
-                                    path: '_zone.virtualRouters',
-                                    label: 'label.virtual.appliances'
-                                },
-                                actions: {
-                                    upgradeRouterToUseNewerTemplate: {
-                                        label: 'label.upgrade.router.newer.template',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.upgrade.routers.cluster.newtemplate';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.upgrade.router.newer.template';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL('upgradeRouterTemplate'),
-                                                data: {
-                                                    clusterid: args.context.routerGroupByCluster[0].id
-                                                },
-                                                success: function (json) {
-                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
-                                                    if (jobs != undefined) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobs[0].jobid
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.virtual.routers.group.cluster',
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.cluster'
-                                            }
-                                        },
-                                        {
-                                            routerCount: {
-                                                label: 'label.total.virtual.routers'
-                                            },
-                                            routerRequiresUpgrade: {
-                                                label: 'label.upgrade.required',
-                                                converter: function (args) {
-                                                    if (args > 0) {
-                                                        return _l('label.yes');
-                                                    } else {
-                                                        return _l('label.no');
-                                                    }
-                                                }
-                                            },
-                                            numberOfRouterRequiresUpgrade: {
-                                                label: 'label.total.virtual.routers.upgrade'
-                                            },
-                                            podname: {
-                                                label: 'label.pod'
-                                            },
-                                            zonename: {
-                                                label: 'label.zone.lower'
-                                            }
-                                        }],
-                                        dataProvider: function (args) {
-                                            addExtraPropertiesToGroupbyObject(args.context.routerGroupByCluster[0], 'clusterid');
-                                            args.response.success({
-                                                data: args.context.routerGroupByCluster[0],
-                                                actionFilter: routerGroupActionfilter
-                                            });
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    },
-                    routerGroupByAccount: {
-                        id: 'routerGroupByAccount',
-                        type: 'select',
-                        title: 'label.group.by.account',
-                        listView: {
-                            id: 'routerGroupByAccount',
-                            label: 'label.virtual.appliances',
-                            fields: {
-                                name: {
-                                    label: 'label.account'
-                                },
-                                domain: {
-                                    label: 'label.domain'
-                                },
-                                routerCount: {
-                                    label: 'label.total.virtual.routers'
-                                },
-                                routerRequiresUpgrade: {
-                                    label: 'label.upgrade.required',
-                                    converter: function (args) {
-                                        if (args > 0) {
-                                            return _l('label.yes');
-                                        } else {
-                                            return _l('label.no');
-                                        }
-                                    }
-                                }
-                            },
-
-                            dataProvider: function (args) {
-                                var array1 =[];
-                                if (args.filterBy != null) {
-                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                        switch (args.filterBy.search.by) {
-                                            case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                        }
-                                    }
-                                }
-                                $.ajax({
-                                    url: createURL("listAccounts&listAll=true&details=min&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                    success: function (json) {
-                                        var accountObjs = json.listaccountsresponse.account;
-                                        if (accountObjs != null) {
-                                            for (var i = 0; i < accountObjs.length; i++) {
-                                                var currentPage = 1;
-                                                $.ajax({
-                                                    url: createURL('listRouters'),
-                                                    data: {
-                                                        account: accountObjs[i].name,
-                                                        domainid: accountObjs[i].domainid,
-                                                        listAll: true,
-                                                        page: currentPage,
-                                                        pagesize: pageSize //global variable
-                                                    },
-                                                    async: false,
-                                                    success: function (json) {
-                                                        if (json.listroutersresponse.count != undefined) {
-                                                            accountObjs[i].routerCount = json.listroutersresponse.count;
-                                                            var routerCountFromAllPages = json.listroutersresponse.count;
-                                                            var routerCountFromFirstPageToCurrentPage = json.listroutersresponse.router.length;
-                                                            var routerRequiresUpgrade = 0;
-
-                                                            var items = json.listroutersresponse.router;
-                                                            for (var k = 0; k < items.length; k++) {
-                                                                if (items[k].requiresupgrade) {
-                                                                    routerRequiresUpgrade++;
-                                                                }
-                                                            }
-
-                                                            var callListApiWithPage = function () {
-                                                                $.ajax({
-                                                                    url: createURL('listRouters'),
-                                                                    async: false,
-                                                                    data: {
-                                                                        account: accountObjs[i].name,
-                                                                        domainid: accountObjs[i].domainid,
-                                                                        listAll: true,
-                                                                        page: currentPage,
-                                                                        pagesize: pageSize //global variable
-                                                                    },
-                                                                    success: function (json) {
-                                                                        routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
-                                                                        var items = json.listroutersresponse.router;
-                                                                        for (var k = 0; k < items.length; k++) {
-                                                                            if (items[k].requiresupgrade) {
-                                                                                routerRequiresUpgrade++;
-                                                                            }
-                                                                        }
-                                                                        if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
-                                                                            currentPage++;
-                                                                            callListApiWithPage();
-                                                                        }
-                                                                    }
-                                                                });
-                                                            }
-                                                            if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
-                                                                currentPage++;
-                                                                callListApiWithPage();
-                                                            }
-                                                            accountObjs[i].routerRequiresUpgrade = routerRequiresUpgrade;
-                                                        } else {
-                                                            accountObjs[i].routerCount = 0;
-                                                            accountObjs[i].routerRequiresUpgrade = 0;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        }
-                                        args.response.success({
-                                            data: accountObjs
-                                        });
-                                    }
-                                });
-                            },
-                            detailView: {
-                                name: 'label.virtual.routers.group.account',
-                                viewAll: {
-                                    path: '_zone.virtualRouters',
-                                    label: 'label.virtual.appliances'
-                                },
-                                actions: {
-                                    upgradeRouterToUseNewerTemplate: {
-                                        label: 'label.upgrade.router.newer.template',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.upgrade.routers.account.newtemplate';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.upgrade.router.newer.template';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL('upgradeRouterTemplate'),
-                                                data: {
-                                                    account: args.context.routerGroupByAccount[0].name,
-                                                    domainid: args.context.routerGroupByAccount[0].domainid
-                                                },
-                                                success: function (json) {
-                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
-                                                    if (jobs != undefined) {
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobs[0].jobid
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: pollAsyncJobResult
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.virtual.routers.group.account',
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.account'
-                                            },
-                                            domain: {
-                                                label: 'label.domain'
-                                            }
-                                        },
-                                        {
-                                            routerCount: {
-                                                label: 'label.total.virtual.routers'
-                                            },
-                                            routerRequiresUpgrade: {
-                                                label: 'label.upgrade.required',
-                                                converter: function (args) {
-                                                    if (args > 0) {
-                                                        return _l('label.yes');
-                                                    } else {
-                                                        return _l('label.no');
-                                                    }
-                                                }
-                                            },
-                                            numberOfRouterRequiresUpgrade: {
-                                                label: 'label.total.virtual.routers.upgrade'
-                                            }
-                                        }],
-                                        dataProvider: function (args) {
-                                            var currentPage = 1;
-                                            $.ajax({
-                                                url: createURL('listRouters'),
-                                                data: {
-                                                    account: args.context.routerGroupByAccount[0].name,
-                                                    domainid: args.context.routerGroupByAccount[0].domainid,
-                                                    listAll: true,
-                                                    page: currentPage,
-                                                    pagesize: pageSize //global variable
-                                                },
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listroutersresponse.count != undefined) {
-                                                        args.context.routerGroupByAccount[0].routerCount = json.listroutersresponse.count;
-                                                        var routerCountFromAllPages = json.listroutersresponse.count;
-                                                        var routerCountFromFirstPageToCurrentPage = json.listroutersresponse.router.length;
-                                                        var routerRequiresUpgrade = 0;
-
-                                                        var items = json.listroutersresponse.router;
-                                                        for (var k = 0; k < items.length; k++) {
-                                                            if (items[k].requiresupgrade) {
-                                                                routerRequiresUpgrade++;
-                                                            }
-                                                        }
-
-                                                        var callListApiWithPage = function () {
-                                                            $.ajax({
-                                                                url: createURL('listRouters'),
-                                                                async: false,
-                                                                data: {
-                                                                    account: args.context.routerGroupByAccount[0].name,
-                                                                    domainid: args.context.routerGroupByAccount[0].domainid,
-                                                                    listAll: true,
-                                                                    page: currentPage,
-                                                                    pagesize: pageSize //global variable
-                                                                },
-                                                                success: function (json) {
-                                                                    routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
-                                                                    var items = json.listroutersresponse.router;
-                                                                    for (var k = 0; k < items.length; k++) {
-                                                                        if (items[k].requiresupgrade) {
-                                                                            routerRequiresUpgrade++;
-                                                                        }
-                                                                    }
-                                                                    if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
-                                                                        currentPage++;
-                                                                        callListApiWithPage();
-                                                                    }
-                                                                }
-                                                            });
-                                                        }
-                                                        if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
-                                                            currentPage++;
-                                                            callListApiWithPage();
-                                                        }
-                                                        args.context.routerGroupByAccount[0].routerRequiresUpgrade = routerRequiresUpgrade;
-                                                        args.context.routerGroupByAccount[0].numberOfRouterRequiresUpgrade = routerRequiresUpgrade;
-                                                    } else {
-                                                        args.context.routerGroupByAccount[0].routerCount = 0;
-                                                        args.context.routerGroupByAccount[0].routerRequiresUpgrade = 0;
-                                                        args.context.routerGroupByAccount[0].numberOfRouterRequiresUpgrade = 0;
-                                                    }
-                                                }
-                                            });
-                                            setTimeout(function () {
-                                                args.response.success({
-                                                    data: args.context.routerGroupByAccount[0],
-                                                    actionFilter: routerGroupActionfilter
-                                                });
-                                            });
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            systemVms: {
-                listView: {
-                    label: 'label.system.vms',
-                    id: 'systemVMs',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        systemvmtype: {
-                            label: 'label.type',
-                            converter: function (args) {
-                                if (args == "consoleproxy")
-                                return "Console Proxy VM"; else if (args == "secondarystoragevm")
-                                return "Secondary Storage VM"; else
-                                return args;
-                            }
-                        },
-                        publicip: {
-                            label: 'label.public.ip'
-                        },
-                        hostname: {
-                            label: 'label.host'
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        state: {
-                            label: 'label.vm.state',
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            indicator: {
-                                'Running': 'on',
-                                'Stopped': 'off',
-                                'Error': 'off',
-                                'Destroyed': 'off'
-                            }
-                        },
-
-                        agentstate: {
-                            label: 'label.agent.state',
-                            indicator: {
-                                'Up': 'on',
-                                'Down': 'off'
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        var array1 =[];
-                        if (args.filterBy != null) {
-                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                switch (args.filterBy.search.by) {
-                                    case "name":
-                                    if (args.filterBy.search.value.length > 0)
-                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                    break;
-                                }
-                            }
-                        }
-
-                        var selectedZoneObj = args.context.physicalResources[0];
-                        $.ajax({
-                            url: createURL("listSystemVms&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                            dataType: "json",
-                            async: true,
-                            success: function (json) {
-                                var items = json.listsystemvmsresponse.systemvm;
-                                args.response.success({
-                                    actionFilter: systemvmActionfilter,
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.system.vm.details',
-                        actions: {
-                            start: {
-                                label: 'label.action.start.systemvm',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.start.systemvm';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.start.systemvm';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL('startSystemVm&id=' + args.context.systemVMs[0].id),
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.startsystemvmresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return systemvmActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            stop: {
-                                label: 'label.action.stop.systemvm',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.stop.systemvm';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.stop.systemvm';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL('stopSystemVm&id=' + args.context.systemVMs[0].id),
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.stopsystemvmresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return systemvmActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            restart: {
-                                label: 'label.action.reboot.systemvm',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.reboot.systemvm';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.reboot.systemvm';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL('rebootSystemVm&id=' + args.context.systemVMs[0].id),
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.rebootsystemvmresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return systemvmActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            remove: {
-                                label: 'label.action.destroy.systemvm',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.destroy.systemvm';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.destroy.systemvm';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL('destroySystemVm&id=' + args.context.systemVMs[0].id),
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.destroysystemvmresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    getUpdatedItem: function () {
-                                                        return {
-                                                            state: 'Destroyed'
-                                                        };
-                                                    },
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            migrate: {
-                                label: 'label.action.migrate.systemvm',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.action.migrate.systemvm';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.migrate.systemvm',
-                                    desc: '',
-                                    fields: {
-                                        hostId: {
-                                            label: 'label.host',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                $.ajax({
-                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.systemVMs[0].id),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function (json) {
-                                                        var hostObjs = json.findhostsformigrationresponse.host;
-                                                        var items =[];
-                                                        $(hostObjs).each(function () {
-                                                            if (this.requiresStorageMotion == false) {
-                                                                items.push({
-                                                                    id: this.id,
-                                                                    description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
-                                                                });
-                                                            }
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            error: function (XMLHttpResponse) {
-                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                args.response.error(errorMsg);
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.systemVMs[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.migratesystemvmresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
-                                                        $.ajax({
-                                                            url: createURL("listSystemVms&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function (json) {
-                                                                var items = json.listsystemvmsresponse.systemvm;
-                                                                if (items != null && items.length > 0) {
-                                                                    return items[0];
-                                                                }
-                                                            }
-                                                        });
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return systemvmActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            diagnostics: {
-                                label: 'label.action.run.diagnostics',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.action.run.diagnostics';
-                                    },
-                                    complete: function(args) {
-                                        var exitcode = _l('message.diagnostics.exitcode');
-                                        exitcode = exitcode.replace('var', args.exitcode);
-                                        var stderr = _l('message.diagnostics.stderr');
-                                        stderr = stderr.replace('var', args.stderr);
-                                        var stdout = _l('message.diagnostics.stdout');
-                                        stdout = stdout.replace('var', args.stdout);
-                                        var msg = "<div style='text-align: left; overflow-y: auto'>" + exitcode + "<br><br>" + stderr + "<br><br>" + stdout + "</div>";
-                                        return msg;
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.run.diagnostics',
-                                    desc: '',
-                                    fields: {
-                                        type: {
-                                            label: 'label.run.diagnostics.type',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                var items = [];
-                                                items.push({
-                                                    id: "ping",
-                                                    description: "Ping"
-                                                });
-                                                items.push({
-                                                    id: "traceroute",
-                                                    description: "Traceroute"
-                                                });
-                                                items.push({
-                                                    id: "arping",
-                                                    description: "Arping"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        },
-                                        destination: {
-                                            label: 'label.run.diagnostics.destination',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        extra: {
-                                            label: 'label.run.diagnostics.extra'
-                                        }
-
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("runDiagnostics&targetid=" + args.context.systemVMs[0].id + "&ipaddress=" + args.data.destination + "&type=" + args.data.type + "&params=" + args.data.extra),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.rundiagnosticsresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId : jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                    },
-                                                    getActionFilter: function(){
-                                                        return systemvmActionfilter;
-                                                   }
-                                                }
-
-                                            });
-                                        }
-                                    }); //end ajax
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            retrieveDiagnostics: {
-                                label: 'label.action.get.diagnostics',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.action.get.diagnostics';
-                                    },
-                                    complete: function(args) {
-                                        var url = args.url;
-                                        var htmlMsg = _l('message.download.diagnostics');
-                                        var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
-                                        return htmlMsg2;
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.get.diagnostics',
-                                    desc: 'label.get.diagnostics.desc',
-                                    fields: {
-                                        files: {
-                                            label: 'label.get.diagnostics.files'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("getDiagnosticsData&targetid=" + args.context.systemVMs[0].id + "&files=" + args.data.files),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.getdiagnosticsdataresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId : jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.diagnostics;
-
-                                                    },
-                                                    getActionFilter: function(){
-                                                        return systemvmActionfilter;
-                                                   }
-                                                }
-
-                                            });
-                                        }
-                                    }); //end ajax
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            scaleUp: { //*** Infrastructure > System VMs (consoleProxy or SSVM) > change service offering ***
-                                label: 'label.change.service.offering',
-                                createForm: {
-                                    title: 'label.change.service.offering',
-                                    desc: function (args) {
-                                        var description = '';
-                                        var vmObj = args.jsonObj;
-                                        //if (vmObj.state == 'Running' && vmObj.hypervisor == 'VMware') { //needs to wait for API fix that will return hypervisor property
-                                        if (vmObj.state == 'Running') {
-                                            description = 'message.read.admin.guide.scaling.up';
-                                        }
-                                        return description;
-                                    },
-                                    fields: {
-                                        serviceOfferingId: {
-                                            label: 'label.compute.offering',
-                                            select: function (args) {
-                                                var data1 = {
-                                                    issystem: 'true',
-                                                    virtualmachineid: args.context.systemVMs[0].id
-                                                };
-                                                if (args.context.systemVMs[0].systemvmtype == "secondarystoragevm") {
-                                                    $.extend(data1, {
-                                                        systemvmtype: 'secondarystoragevm'
-                                                    });
-                                                }
-                                                else if (args.context.systemVMs[0].systemvmtype == "consoleproxy") {
-                                                    $.extend(data1, {
-                                                        systemvmtype: 'consoleproxy'
-                                                    });
-                                                }
-                                                $.ajax({
-                                                    url: createURL('listServiceOfferings'),
-                                                    data: data1,
-                                                    success: function (json) {
-                                                        var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
-                                                        var items =[];
-                                                        $(serviceofferings).each(function () {
-                                                            if (this.id != args.context.systemVMs[0].serviceofferingid) {
-                                                                items.push({
-                                                                    id: this.id,
-                                                                    description: this.name
-                                                                });
-                                                            }
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("scaleSystemVm&id=" + args.context.systemVMs[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.changeserviceforsystemvmresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return vmActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.scale.up.system.vm';
-                                    },
-                                    notification: function (args) {
-
-                                        return 'label.system.vm.scaled.up';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            viewConsole: {
-                                label: 'label.view.console',
-                                action: {
-                                    externalLink: {
-                                        url: function (args) {
-                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.systemVMs[0].id;
-                                        },
-                                        title: function (args) {
-                                            return args.context.systemVMs[0].id.substr(0, 8);
-                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                        },
-                                        width: 820,
-                                        height: 640
-                                    }
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    systemvmtype: {
-                                        label: 'label.type',
-                                        converter: function (args) {
-                                            if (args == "consoleproxy")
-                                            return "Console Proxy VM"; else if (args == "secondarystoragevm")
-                                            return "Secondary Storage VM"; else
-                                            return args;
-                                        }
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    publicip: {
-                                        label: 'label.public.ip'
-                                    },
-                                    privateip: {
-                                        label: 'label.private.ip'
-                                    },
-                                    linklocalip: {
-                                        label: 'label.linklocal.ip'
-                                    },
-                                    hostname: {
-                                        label: 'label.host'
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    },
-                                    activeviewersessions: {
-                                        label: 'label.active.sessions'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listSystemVms&id=" + args.context.systemVMs[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            args.response.success({
-                                                actionFilter: systemvmActionfilter,
-                                                data: json.listsystemvmsresponse.systemvm[0]
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            // netscaler devices listView
-            netscalerDevices: {
-                id: 'netscalerDevices',
-                title: 'label.devices',
-                listView: {
-                    id: 'netscalerDevices',
-                    fields: {
-                        ipaddress: {
-                            label: 'label.ip.address'
-                        },
-                        lbdevicestate: {
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.status'
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listNetscalerLoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            data: {
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listnetscalerloadbalancerresponse.netscalerloadbalancer;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.netScaler.device',
-                            createForm: {
-                                title: 'label.add.netScaler.device',
-                                preFilter: cloudStack.preFilter.addLoadBalancerDevice,
-                                fields: {
-                                    ip: {
-                                        label: 'label.ip.address'
-                                    },
-                                    username: {
-                                        label: 'label.username'
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true
-                                    },
-                                    networkdevicetype: {
-                                        label: 'label.type',
-                                        select: function (args) {
-                                            var items =[];
-                                            items.push({
-                                                id: "NetscalerMPXLoadBalancer",
-                                                description: "NetScaler MPX LoadBalancer"
-                                            });
-                                            items.push({
-                                                id: "NetscalerVPXLoadBalancer",
-                                                description: "NetScaler VPX LoadBalancer"
-                                            });
-                                            items.push({
-                                                id: "NetscalerSDXLoadBalancer",
-                                                description: "NetScaler SDX LoadBalancer"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    publicinterface: {
-                                        label: 'label.public.interface'
-                                    },
-                                    privateinterface: {
-                                        label: 'label.private.interface'
-                                    },
-
-                                    gslbprovider: {
-                                        label: 'label.gslb.service',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    },
-                                    gslbproviderpublicip: {
-                                        label: 'label.gslb.service.public.ip'
-                                    },
-                                    gslbproviderprivateip: {
-                                        label: 'label.gslb.service.private.ip'
-                                    },
-
-                                    numretries: {
-                                        label: 'label.numretries',
-                                        defaultValue: '2'
-                                    },
-                                    /* inline: {
-                                    label: 'Mode',
-                                    select: function(args) {
-                                    var items = [];
-                                    items.push({id: "false", description: "side by side"});
-                                    items.push({id: "true", description: "inline"});
-                                    args.response.success({data: items});
-                                    }
-                                    },*/
-                                    dedicated: {
-                                        label: 'label.dedicated',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    },
-                                    capacity: {
-                                        label: 'label.capacity',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                if (nspMap[ "netscaler"] == null) {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addNetscalerProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; //Job has not completed
-                                                        } else {
-                                                            clearInterval(addNetscalerProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                nspMap[ "netscaler"] = result.jobresult.networkserviceprovider;
-                                                                addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            g_queryAsyncJobResultInterval);
-                                        }
-                                    });
-                                } else {
-                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
-                                }
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.netScaler.device';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    detailView: {
-                        name: 'label.netscaler.details',
-                        actions: {
-                            'remove': {
-                                label: 'label.delete.NetScaler',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.NetScaler';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.NetScaler';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNetscalerLoadBalancer&lbdeviceid=" + args.context.netscalerDevices[0].lbdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.deletenetscalerloadbalancerresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        },
-
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    lbdeviceid: {
-                                        label: 'label.id'
-                                    },
-                                    ipaddress: {
-                                        label: 'label.ip.address'
-                                    },
-                                    lbdevicestate: {
-                                        label: 'label.status'
-                                    },
-                                    lbdevicename: {
-                                        label: 'label.type'
-                                    },
-                                    lbdevicecapacity: {
-                                        label: 'label.capacity'
-                                    },
-                                    lbdevicededicated: {
-                                        label: 'label.dedicated',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    gslbprovider: {
-                                        label: 'label.gslb.service',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    gslbproviderpublicip: {
-                                        label: 'label.gslb.service.public.ip'
-                                    },
-                                    gslbproviderprivateip: {
-                                        label: 'label.gslb.service.private.ip'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listNetscalerLoadBalancers&lbdeviceid=" + args.context.netscalerDevices[0].lbdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listnetscalerloadbalancerresponse.netscalerloadbalancer[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            // Baremetal DHCP devices listView
-            BaremetalDhcpDevices: {
-                id: 'BaremetalDhcpDevices',
-                title: 'label.baremetal.dhcp.devices',
-                listView: {
-                    id: 'BaremetalDhcpDevices',
-                    fields: {
-                        url: {
-                            label: 'label.url'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.baremetal.dhcp.device',
-                            createForm: {
-                                title: 'label.add.baremetal.dhcp.device',
-                                fields: {
-                                    url: {
-                                        label: 'label.url',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    username: {
-                                        label: 'label.username',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                addBaremetalDhcpDeviceFn(args);
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.baremetal.dhcp.device';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL('listBaremetalDhcp'),
-                            data: {
-                                physicalnetworkid: selectedPhysicalNetworkObj.id,
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listbaremetaldhcpresponse.baremetaldhcp;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    }
-                }
-            },
-
-            // Baremetal PXE devices listView
-            BaremetalPxeDevices: {
-                id: 'BaremetalPxeDevices',
-                title: 'label.baremetal.pxe.devices',
-                listView: {
-                    id: 'BaremetalPxeDevices',
-                    fields: {
-                        url: {
-                            label: 'label.url'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.baremetal.pxe.device',
-                            createForm: {
-                                title: 'label.baremetal.pxe.device',
-                                fields: {
-                                    url: {
-                                        label: 'label.url',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    username: {
-                                        label: 'label.username',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    tftpdir: {
-                                        label: 'label.tftp.root.directory',
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                addBaremetalPxeDeviceFn(args);
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.baremetal.pxe.device';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL('listBaremetalPxeServers'),
-                            data: {
-                                physicalnetworkid: selectedPhysicalNetworkObj.id,
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listbaremetalpxeserversresponse.baremetalpxeserver;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    }
-                }
-            },
-
-            // F5 devices listView
-            f5Devices: {
-                id: 'f5Devices',
-                title: 'label.devices',
-                listView: {
-                    id: 'f5Devices',
-                    fields: {
-                        ipaddress: {
-                            label: 'label.ip.address'
-                        },
-                        lbdevicestate: {
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.status'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.F5.device',
-                            createForm: {
-                                title: 'label.add.F5.device',
-                                preFilter: cloudStack.preFilter.addLoadBalancerDevice,
-                                fields: {
-                                    ip: {
-                                        label: 'label.ip.address'
-                                    },
-                                    username: {
-                                        label: 'label.username'
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true
-                                    },
-                                    networkdevicetype: {
-                                        label: 'label.type',
-                                        select: function (args) {
-                                            var items =[];
-                                            items.push({
-                                                id: "F5BigIpLoadBalancer",
-                                                description: "F5 Big Ip Load Balancer"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    publicinterface: {
-                                        label: 'label.public.interface'
-                                    },
-                                    privateinterface: {
-                                        label: 'label.private.interface'
-                                    },
-                                    numretries: {
-                                        label: 'label.numretries',
-                                        defaultValue: '2'
-                                    },
-                                    //Inline Mode has been moved from Add F5 Device to Create Network Offering (both backend and UI)
-                                    /*
-                                    inline: {
-                                    label: 'Mode',
-                                    select: function(args) {
-                                    var items = [];
-                                    items.push({id: "false", description: "side by side"});
-                                    items.push({id: "true", description: "inline"});
-                                    args.response.success({data: items});
-                                    }
-                                    },
-                                     */
-                                    dedicated: {
-                                        label: 'label.dedicated',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    },
-                                    capacity: {
-                                        label: 'label.capacity',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                if (nspMap[ "f5"] == null) {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider&name=F5BigIp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addF5ProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; //Job has not completed
-                                                        } else {
-                                                            clearInterval(addF5ProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                nspMap[ "f5"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse", "f5loadbalancer");
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("addNetworkServiceProvider&name=F5BigIp failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("addNetworkServiceProvider&name=F5BigIpfailed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            g_queryAsyncJobResultInterval);
-                                        }
-                                    });
-                                } else {
-                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse", "f5loadbalancer");
-                                }
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.addes.new.f5';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listF5LoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            data: {
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listf5loadbalancerresponse.f5loadbalancer;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.f5.details',
-                        actions: {
-                            'remove': {
-                                label: 'label.delete.F5',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.F5';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.F5';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteF5LoadBalancer&lbdeviceid=" + args.context.f5Devices[0].lbdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.deletef5loadbalancerresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    lbdeviceid: {
-                                        label: 'label.id'
-                                    },
-                                    ipaddress: {
-                                        label: 'label.ip.address'
-                                    },
-                                    lbdevicestate: {
-                                        label: 'label.status'
-                                    },
-                                    lbdevicename: {
-                                        label: 'label.type'
-                                    },
-                                    lbdevicecapacity: {
-                                        label: 'label.capacity'
-                                    },
-                                    lbdevicededicated: {
-                                        label: 'label.dedicated',
-                                        converter: cloudStack.converters.toBooleanText
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listF5LoadBalancers&lbdeviceid=" + args.context.f5Devices[0].lbdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listf5loadbalancerresponse.f5loadbalancer[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            //SRX devices listView
-            srxDevices: {
-                id: 'srxDevices',
-                title: 'label.devices',
-                listView: {
-                    id: 'srxDevices',
-                    fields: {
-                        ipaddress: {
-                            label: 'label.ip.address'
-                        },
-                        fwdevicestate: {
-                            label: 'label.status'
-                        },
-                        fwdevicename: {
-                            label: 'label.type'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.SRX.device',
-                            createForm: {
-                                title: 'label.add.SRX.device',
-                                fields: {
-                                    ip: {
-                                        label: 'label.ip.address'
-                                    },
-                                    username: {
-                                        label: 'label.username'
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true
-                                    },
-                                    networkdevicetype: {
-                                        label: 'label.type',
-                                        select: function (args) {
-                                            var items =[];
-                                            items.push({
-                                                id: "JuniperSRXFirewall",
-                                                description: "Juniper SRX Firewall"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    publicinterface: {
-                                        label: 'label.public.interface'
-                                    },
-                                    privateinterface: {
-                                        label: 'label.private.interface'
-                                    },
-                                    usageinterface: {
-                                        label: 'label.usage.interface'
-                                    },
-                                    numretries: {
-                                        label: 'label.numretries',
-                                        defaultValue: '2'
-                                    },
-                                    timeout: {
-                                        label: 'label.timeout',
-                                        defaultValue: '300'
-                                    },
-                                    // inline: {
-                                    //   label: 'Mode',
-                                    //   select: function(args) {
-                                    //     var items = [];
-                                    //     items.push({id: "false", description: "side by side"});
-                                    //     items.push({id: "true", description: "inline"});
-                                    //     args.response.success({data: items});
-                                    //   }
-                                    // },
-                                    publicnetwork: {
-                                        label: 'label.public.network',
-                                        defaultValue: 'untrusted',
-                                        isDisabled: true
-                                    },
-                                    privatenetwork: {
-                                        label: 'label.private.network',
-                                        defaultValue: 'trusted',
-                                        isDisabled: true
-                                    },
-                                    capacity: {
-                                        label: 'label.capacity',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    dedicated: {
-                                        label: 'label.dedicated',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                if (nspMap[ "srx"] == null) {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider&name=JuniperSRX&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addJuniperSRXProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; //Job has not completed
-                                                        } else {
-                                                            clearInterval(addJuniperSRXProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                nspMap[ "srx"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            g_queryAsyncJobResultInterval);
-                                        }
-                                    });
-                                } else {
-                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
-                                }
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.SRX.device';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listSrxFirewalls&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            data: {
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listsrxfirewallresponse.srxfirewall;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.srx.details',
-                        actions: {
-                            'remove': {
-                                label: 'label.delete.SRX',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.SRX';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.SRX';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteSrxFirewall&fwdeviceid=" + args.context.srxDevices[0].fwdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.deletesrxfirewallresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    fwdeviceid: {
-                                        label: 'label.id'
-                                    },
-                                    ipaddress: {
-                                        label: 'label.ip.address'
-                                    },
-                                    fwdevicestate: {
-                                        label: 'label.status'
-                                    },
-                                    fwdevicename: {
-                                        label: 'label.type'
-                                    },
-                                    fwdevicecapacity: {
-                                        label: 'label.capacity'
-                                    },
-                                    timeout: {
-                                        label: 'label.timeout'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listSrxFirewalls&fwdeviceid=" + args.context.srxDevices[0].fwdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listsrxfirewallresponse.srxfirewall[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            //Palo Alto devices listView
-            paDevices: {
-                id: 'paDevices',
-                title: 'label.devices',
-                listView: {
-                    id: 'paDevices',
-                    fields: {
-                        ipaddress: {
-                            label: 'label.ip.address'
-                        },
-                        fwdevicestate: {
-                            label: 'label.status'
-                        },
-                        fwdevicename: {
-                            label: 'label.type'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.PA.device',
-                            createForm: {
-                                title: 'label.add.PA.device',
-                                fields: {
-                                    ip: {
-                                        label: 'label.ip.address'
-                                    },
-                                    username: {
-                                        label: 'label.username'
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true
-                                    },
-                                    networkdevicetype: {
-                                        label: 'label.type',
-                                        select: function (args) {
-                                            var items =[];
-                                            items.push({
-                                                id: "PaloAltoFirewall",
-                                                description: "Palo Alto Firewall"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    publicinterface: {
-                                        label: 'label.public.interface'
-                                    },
-                                    privateinterface: {
-                                        label: 'label.private.interface'
-                                    },
-                                    //usageinterface: {
-                                    //  label: 'label.usage.interface'
-                                    //},
-                                    numretries: {
-                                        label: 'label.numretries',
-                                        defaultValue: '2'
-                                    },
-                                    timeout: {
-                                        label: 'label.timeout',
-                                        defaultValue: '300'
-                                    },
-                                    // inline: {
-                                    //   label: 'Mode',
-                                    //   select: function(args) {
-                                    //     var items = [];
-                                    //     items.push({id: "false", description: "side by side"});
-                                    //     items.push({id: "true", description: "inline"});
-                                    //     args.response.success({data: items});
-                                    //   }
-                                    // },
-                                    publicnetwork: {
-                                        label: 'label.public.network',
-                                        defaultValue: 'untrust'
-                                    },
-                                    privatenetwork: {
-                                        label: 'label.private.network',
-                                        defaultValue: 'trust'
-                                    },
-                                    pavr: {
-                                        label: 'label.virtual.router'
-                                    },
-                                    patp: {
-                                        label: 'label.PA.threat.profile'
-                                    },
-                                    palp: {
-                                        label: 'label.PA.log.profile'
-                                    },
-                                    capacity: {
-                                        label: 'label.capacity',
-                                        validation: {
-                                            required: false,
-                                            number: true
-                                        }
-                                    },
-                                    dedicated: {
-                                        label: 'label.dedicated',
-                                        isBoolean: true,
-                                        isChecked: false
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                if (nspMap[ "pa"] == null) {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider&name=PaloAlto&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addPaloAltoProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; //Job has not completed
-                                                        } else {
-                                                            clearInterval(addPaloAltoProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                nspMap[ "pa"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            3000);
-                                        }
-                                    });
-                                } else {
-                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
-                                }
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.PA.device';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listPaloAltoFirewalls&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            data: {
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listpaloaltofirewallresponse.paloaltofirewall;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.palo.alto.details',
-                        actions: {
-                            'remove': {
-                                label: 'label.delete.PA',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.PA';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.PA';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deletePaloAltoFirewall&fwdeviceid=" + args.context.paDevices[0].fwdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.deletepaloaltofirewallresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    fwdeviceid: {
-                                        label: 'label.id'
-                                    },
-                                    ipaddress: {
-                                        label: 'label.ip.address'
-                                    },
-                                    fwdevicestate: {
-                                        label: 'label.status'
-                                    },
-                                    fwdevicename: {
-                                        label: 'label.type'
-                                    },
-                                    fwdevicecapacity: {
-                                        label: 'label.capacity'
-                                    },
-                                    timeout: {
-                                        label: 'label.timeout'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listPaloAltoFirewalls&fwdeviceid=" + args.context.paDevices[0].fwdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listpaloaltofirewallresponse.paloaltofirewall[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            // FIXME convert to nicira detailview
-            // NiciraNvp devices listView
-            niciraNvpDevices: {
-                id: 'niciraNvpDevices',
-                title: 'label.devices',
-                listView: {
-                    id: 'niciraNvpDevices',
-                    fields: {
-                        hostname: {
-                            label: 'label.nicira.controller.address'
-                        },
-                        transportzoneuuid: {
-                            label: 'label.nicira.transportzoneuuid'
-                        },
-                        l3gatewayserviceuuid: {
-                            label: 'label.nicira.l3gatewayserviceuuid'
-                        },
-						l2gatewayserviceuuid: {
-                            label: 'label.nicira.l2gatewayserviceuuid'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.NiciraNvp.device',
-                            createForm: {
-                                title: 'label.add.NiciraNvp.device',
-                                preFilter: function (args) {
-                                },
-                                // TODO What is this?
-                                fields: {
-                                    host: {
-                                        label: 'label.ip.address'
-                                    },
-                                    username: {
-                                        label: 'label.username'
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true
-                                    },
-                                    numretries: {
-                                        label: 'label.numretries',
-                                        defaultValue: '2'
-                                    },
-                                    transportzoneuuid: {
-                                        label: 'label.nicira.transportzoneuuid'
-                                    },
-                                    l3gatewayserviceuuid: {
-                                        label: 'label.nicira.l3gatewayserviceuuid'
-                                    },
-									l2gatewayserviceuuid: {
-										label: 'label.nicira.l2gatewayserviceuuid'
-									}
-                                }
-                            },
-                            action: function (args) {
-                                if (nspMap[ "niciraNvp"] == null) {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider&name=NiciraNvp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addNiciraNvpProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; // Job has not completed
-                                                        } else {
-                                                            clearInterval(addNiciraNvpProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                nspMap[ "niciraNvp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            g_queryAsyncJobResultInterval);
-                                        }
-                                    });
-                                } else {
-                                    addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
-                                }
-                            },
-
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.added.nicira.nvp.controller';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listNiciraNvpDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            data: {
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listniciranvpdeviceresponse.niciranvpdevice;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.nicira.nvp.details',
-                        actions: {
-                            'remove': {
-                                label: 'label.delete.NiciaNvp',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.NiciraNvp';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.NiciraNvp';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteNiciraNvpDevice&nvpdeviceid=" + args.context.niciraNvpDevices[0].nvpdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.deleteniciranvpdeviceresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    nvpdeviceid: {
-                                        label: 'label.id'
-                                    },
-                                    hostname: {
-                                        label: 'label.ip.address'
-                                    },
-                                    transportzoneuuid: {
-                                        label: 'label.nicira.transportzoneuuid'
-                                    },
-                                    l3gatewayserviceuuid: {
-                                        label: 'label.nicira.l3gatewayserviceuuid'
-                                    },
-									l2gatewayserviceuuid: {
-										label: 'label.nicira.l2gatewayserviceuuid'
-									}
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listNiciraNvpDevices&nvpdeviceid=" + args.context.niciraNvpDevices[0].nvpdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listniciranvpdeviceresponse.niciranvpdevice[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            // BrocadeVcs devices listView
-            brocadeVcsDevices: {
-                id: 'brocadeVcsDevices',
-                title: 'label.devices',
-                listView: {
-                    id: 'brocadeVcsDevices',
-                    fields: {
-                        hostname: {
-                            label: 'label.brocade.vcs.address'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.BrocadeVcs.device',
-                            createForm: {
-                                title: 'label.add.BrocadeVcs.device',
-                                preFilter: function (args) {
-                                },
-                                // TODO What is this?
-                                fields: {
-                                    host: {
-                                        label: 'label.ip.address'
-                                    },
-                                    username: {
-                                        label: 'label.username'
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                if (nspMap[ "brocadeVcs"] == null) {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider&name=BrocadeVcs&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addBrocadeVcsProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; // Job has not completed
-                                                        } else {
-                                                            clearInterval(addBrocadeVcsProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                nspMap[ "brocadeVcs"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            g_queryAsyncJobResultInterval);
-                                        }
-                                    });
-                                } else {
-                                    addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
-                                }
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.added.brocade.vcs.switch';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listBrocadeVcsDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            data: {
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listbrocadevcsdeviceresponse.brocadevcsdevice;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.brocade.vcs.details',
-                        actions: {
-                            'remove': {
-                                label: 'label.delete.BrocadeVcs',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.BrocadeVcs';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.BrocadeVcs';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteBrocadeVcsDevice&vcsdeviceid=" + args.context.brocadeVcsDevices[0].vcsdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.deletebrocadevcsdeviceresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    vcsdeviceid: {
-                                        label: 'label.id'
-                                    },
-                                    hostname: {
-                                        label: 'label.ip.address'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listBrocadeVcsDevices&vcsdeviceid=" + args.context.brocadeVcsDevices[0].vcsdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listbrocadevcsdeviceresponse.brocadevcsdevice[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            bigswitchBcfDevices: {
-                id: 'bigswitchBcfDevices',
-                title: 'label.devices',
-                listView: {
-                    id: 'bigswitchBcfDevices',
-                    fields: {
-                        hostname: {
-                            label: 'label.bigswitch.controller.address'
-                        }
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.BigSwitchBcf.device',
-                            createForm: {
-                                title: 'label.add.BigSwitchBcf.device',
-                                preFilter: function (args) {
-                                },
-                                fields: {
-                                    host: {
-                                        label: 'label.ip.address',
-                                        validation: {
-                                                     required: true
-                                                 }
-                                    },
-                                    username: {
-                                        label: 'label.username',
-                                        validation: {
-                                                     required: true
-                                                 }
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true,
-                                        validation: {
-                                                     required: true
-                                                 }
-                                    },
-                                    nat: {
-                                                label: 'label.bigswitch.bcf.nat',
-                                                isBoolean: true,
-                                                isChecked: false
-                                    },
-                                    numretries: {
-                                        label: 'label.numretries',
-                                        defaultValue: '2'
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                if (nspMap[ "bigswitchBcf"] == null) {
-                                    $.ajax({
-                                        url: createURL("addNetworkServiceProvider&name=BigSwitchBcf&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                            var addBigSwitchBcfProviderIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return;
-                                                        } else {
-                                                            clearInterval(addBigSwitchBcfProviderIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                nspMap[ "bigswitchBcf"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-                                                                addBigSwitchBcfDevice(args, selectedPhysicalNetworkObj, "addBigSwitchBcfDevice", "addbigswitchbcfdeviceresponse", "bigswitchbcfdevice")
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("addNetworkServiceProvider&name=BigSwitchBcf failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("addNetworkServiceProvider&name=BigSwitchBcf failed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            3000);
-                                        }
-                                    });
-                                } else {
-                                    addBigSwitchBcfDevice(args, selectedPhysicalNetworkObj, "addBigSwitchBcfDevice", "addbigswitchbcfdeviceresponse", "bigswitchbcfdevice")
-                                }
-                            },
-
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.added.new.bigswitch.bcf.controller';
-                                }
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listBigSwitchBcfDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            data: {
-                                page: args.page,
-                                pageSize: pageSize
-                            },
-                            dataType: "json",
-                            async: false,
-                            success: function (json) {
-                                var items = json.listbigswitchbcfdeviceresponse.bigswitchbcfdevice;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    detailView: {
-                        name: 'label.bigswitch.bcf.details',
-                        actions: {
-                            'remove': {
-                                label: 'label.delete.BigSwitchBcf',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.BigSwitchBcf';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.BigSwitchBcf';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteBigSwitchBcfDevice&bcfdeviceid=" + args.context.bigswitchBcfDevices[0].bcfdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.deletebigswitchbcfdeviceresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    bcfdeviceid: {
-                                        label: 'label.id'
-                                    },
-                                    hostname: {
-                                        label: 'label.host.name'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listBigSwitchBcfDevices&bcfdeviceid=" + args.context.bigswitchBcfDevices[0].bcfdeviceid),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listbigswitchbcfdeviceresponse.bigswitchbcfdevice[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            pods: {
-                title: 'label.pods',
-                listView: {
-                    id: 'pods',
-                    section: 'pods',
-                    multiSelect: true,
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        gateway: {
-                            label: 'label.gateway'
-                        },
-                        netmask: {
-                            label: 'label.netmask'
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        allocationstate: {
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.allocation.state',
-                            indicator: {
-                                'Enabled': 'on',
-                                'Disabled': 'off'
-                            }
-                        }
-                    },
-
-                    dataProvider: function (args) {
-                        var array1 =[];
-                        if (args.filterBy != null) {
-                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                switch (args.filterBy.search.by) {
-                                    case "name":
-                                    if (args.filterBy.search.value.length > 0)
-                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                    break;
-                                }
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL("listPods&zoneid=" + args.context.zones[0].id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                            dataType: "json",
-                            async: true,
-                            success: function (json) {
-                                var items = json.listpodsresponse.pod;
-                                args.response.success({
-                                    actionFilter: podActionfilter,
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.pod',
-
-                            createForm: {
-                                title: 'label.add.pod',
-                                fields: {
-                                    zoneid: {
-                                        label: 'label.zone',
-                                        docID: 'helpPodZone',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function (args) {
-                                            var data = args.context.zones ? {
-                                                id: args.context.zones[0].id
-                                            }: {};
-
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                data: data,
-                                                success: function (json) {
-                                                    var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
-
-                                                    args.response.success({
-                                                        data: $.map(zones, function (zone) {
-                                                            return {
-                                                                id: zone.id,
-                                                                description: zone.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    podname: {
-                                        label: 'label.pod.name',
-                                        docID: 'helpPodName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    reservedSystemGateway: {
-                                        label: 'label.reserved.system.gateway',
-                                        docID: 'helpPodGateway',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    reservedSystemNetmask: {
-                                        label: 'label.reserved.system.netmask',
-                                        docID: 'helpPodNetmask',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    reservedSystemStartIp: {
-                                        label: 'label.start.reserved.system.IP',
-                                        docID: 'helpPodStartIP',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    reservedSystemEndIp: {
-                                        label: 'label.end.reserved.system.IP',
-                                        docID: 'helpPodEndIP',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-
-                                    isDedicated: {
-                                        label: 'label.dedicate',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        docID: 'helpDedicateResource'
-                                    },
-
-                                    domainId: {
-                                        label: 'label.domain',
-                                        isHidden: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'isDedicated',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    var items =[];
-
-                                                    $(domainObjs).each(function () {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    accountId: {
-                                        label: 'label.account',
-                                        isHidden: true,
-                                        dependsOn: 'isDedicated',
-                                        docID: 'helpAccountForDedication',
-                                        validation: {
-                                            required: false
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function (args) {
-                                var array1 =[];
-                                var appendData = args.data.append ? args.data.append: {
-                                };
-
-                                array1.push("&zoneId=" + args.data.zoneid);
-                                array1.push("&name=" + encodeURIComponent(args.data.podname));
-                                array1.push("&gateway=" + encodeURIComponent(args.data.reservedSystemGateway));
-                                array1.push("&netmask=" + encodeURIComponent(args.data.reservedSystemNetmask));
-                                array1.push("&startIp=" + encodeURIComponent(args.data.reservedSystemStartIp));
-
-                                var endip = args.data.reservedSystemEndIp; //optional
-                                if (endip != null && endip.length > 0)
-                                array1.push("&endIp=" + encodeURIComponent(endip));
-                                var podId = null;
-                                $.ajax({
-                                    url: createURL("createPod" + array1.join("")),
-                                    data: appendData,
-                                    dataType: "json",
-                                    success: function (json) {
-                                        var item = json.createpodresponse.pod;
-                                        podId = json.createpodresponse.pod.id;
-
-                                        //EXPLICIT DEDICATION
-                                        if (args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked') == true) {
-                                            var array2 =[];
-                                            if (args.data.accountId != "")
-                                            array2.push("&account=" + encodeURIComponent(args.data.accountId));
-
-                                            if (podId != null) {
-                                                $.ajax({
-                                                    url: createURL("dedicatePod&podId=" + podId + "&domainId=" + args.data.domainId + array2.join("")),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var jid = json.dedicatepodresponse.jobid;
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jid
-                                                            },
-                                                            notification: {
-                                                                poll: pollAsyncJobResult,
-                                                                interval: 4500,
-                                                                desc: "Dedicate Pod"
-                                                            },
-
-                                                            data: item
-                                                        });
-                                                    },
-
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function (XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function (args) {
-                                    args.complete({
-                                        actionFilter: podActionfilter
-                                    });
-                                }
-                            },
-
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.pod';
-                                }
-                            }
-                        },
-                        startRollingMaintenance: rollingMaintenanceAction({ listView: true, entity: 'pods' })
-                    },
-
-                    detailView: {
-                        viewAll: {
-                            path: '_zone.clusters',
-                            label: 'label.clusters'
-                        },
-                        tabFilter: function (args) {
-                            var hiddenTabs =[];
-                            if (selectedZoneObj.networktype == "Basic") {
-                                //basic-mode network (pod-wide VLAN)
-                                //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").show();
-                            } else if (selectedZoneObj.networktype == "Advanced") {
-                                //advanced-mode network (zone-wide VLAN)
-                                //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").hide();
-                                hiddenTabs.push("ipAllocations");
-                                //hiddenTabs.push("networkDevices"); //network devices tab is moved out of pod page at 3.0 UI. It will go to new network page.
-                            }
-                            return hiddenTabs;
-                        },
-                        actions: {
-                            startRollingMaintenance: {
-                                label: 'label.start.rolling.maintenance',
-                                textLabel: 'label.start.rolling.maintenance',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.start.rolling.maintenance';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.start.rolling.maintenance',
-                                    fields: {
-                                        timeout: {
-                                            label: 'label.timeout',
-                                        },
-                                        force: {
-                                            isBoolean: true,
-                                            label: 'label.start.rolling.maintenance.force'
-                                        },
-                                        payload: {
-                                            label: 'label.start.rolling.maintenance.payload'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = {
-                                        podids: args.context.pods[0].id,
-                                        force: args.data.force,
-                                        timeout: args.data.timeout,
-                                        payload: args.data.payload
-                                    };
-                                    $.ajax({
-                                        url: createURL("startRollingMaintenance"),
-                                        dataType: "json",
-                                        data: data,
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.rollingmaintenance;
-                                            args.response.success({
-                                                actionFilter: zoneActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var array1 =[];
-
-                                    array1.push("&name=" + encodeURIComponent(args.data.name));
-                                    array1.push("&netmask=" + encodeURIComponent(args.data.netmask));
-
-                                    if (args.data.gateway != null && args.data.gateway.length > 0)
-                                    array1.push("&gateway=" + encodeURIComponent(args.data.gateway));
-
-                                    $.ajax({
-                                        url: createURL("updatePod&id=" + args.context.pods[0].id + array1.join("")),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var item = json.updatepodresponse.pod;
-                                            args.response.success({
-                                                actionFilter: podActionfilter,
-                                                data: item
-                                            });
-                                        },
-                                        error: function (data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.action.enable.pod',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.enable.pod';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.enable.pod';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Enabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.updatepodresponse.pod;
-                                            args.response.success({
-                                                actionFilter: podActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            dedicate: {
-                                label: 'label.dedicate.pod',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.dedicate.pod.domain.account';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.pod.dedicated';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.dedicate.pod',
-                                    fields: {
-                                        domainId: {
-                                            label: 'label.domain',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function (json) {
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        var items =[];
-
-                                                        $(domainObjs).each(function () {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        accountId: {
-                                            label: 'label.account',
-                                            docID: 'helpAccountForDedication',
-                                            validation: {
-                                                required: false
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    //EXPLICIT DEDICATION
-                                    var array2 =[];
-                                    if (args.data.accountId != "")
-                                    array2.push("&account=" + encodeURIComponent(args.data.accountId));
-
-                                    $.ajax({
-                                        url: createURL("dedicatePod&podId=" +
-                                        args.context.pods[0].id +
-                                        "&domainId=" + args.data.domainId + array2.join("")),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.dedicatepodresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return podActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            release: {
-                                label: 'label.release.dedicated.pod',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.release.dedicated.pod';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.pod.dedication.released';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("releaseDedicatedPod&podid=" + args.context.pods[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.releasededicatedpodresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return podActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-
-                            disable: {
-                                label: 'label.action.disable.pod',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.disable.pod';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.disable.pod';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Disabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.updatepodresponse.pod;
-                                            args.response.success({
-                                                actionFilter: podActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            'remove': {
-                                label: 'label.delete',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.delete.pod';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.delete.pod';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deletePod&id=" + args.context.pods[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            args.response.success({
-                                                data: {
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    netmask: {
-                                        label: 'label.netmask',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    allocationstate: {
-                                        converter: function (str) {
-                                            // For localization
-                                            return str;
-                                        },
-                                        label: 'label.allocation.state'
-                                    }
-                                }, {
-                                    isdedicated: {
-                                        label: 'label.dedicated'
-                                    },
-                                    domainid: {
-                                        label: 'label.domain.id'
-                                    }
-                                }],
-
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listPods&id=" + args.context.pods[0].id),
-                                        success: function (json) {
-                                            var item = json.listpodsresponse.pod[0];
-                                            $.ajax({
-                                                url: createURL("listDedicatedPods&podid=" + args.context.pods[0].id),
-                                                success: function (json) {
-                                                    if (json.listdedicatedpodsresponse.dedicatedpod != undefined) {
-                                                        var podItem = json.listdedicatedpodsresponse.dedicatedpod[0];
-                                                        if (podItem.domainid != null) {
-                                                            $.extend(item, podItem, {
-                                                                isdedicated: _l('label.yes')
-                                                            });
-                                                        }
-                                                    } else
-                                                    $.extend(item, {
-                                                        isdedicated: _l('label.no')
-                                                    });
-
-                                                    args.response.success({
-                                                        actionFilter: podActionfilter,
-                                                        data: item
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                }
-                                            });
-                                            //  args.response.success({
-                                            //     actionFilter: podActionfilter,
-                                            //     data: item
-                                            // });
-                                        }
-                                    });
-                                }
-                            },
-
-                            ipAllocations: {
-                                title: 'label.ip.allocations',
-                                multiple: true,
-                                fields:[ {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    gateway: {
-                                        label: 'label.gateway'
-                                    },
-                                    netmask: {
-                                        label: 'label.netmask'
-                                    },
-                                    startip: {
-                                        label: 'label.start.IP'
-                                    },
-                                    endip: {
-                                        label: 'label.end.IP'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listVlanIpRanges&zoneid=" + args.context.zones[0].id + "&podid=" + args.context.pods[0].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var items = json.listvlaniprangesresponse.vlaniprange;
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            clusters: {
-                title: 'label.clusters',
-                listView: {
-                    id: 'clusters',
-                    section: 'clusters',
-                    multiSelect: true,
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        hypervisortype: {
-                            label: 'label.hypervisor'
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        podname: {
-                            label: 'label.pod'
-                        },
-                        managedstate: {
-                            label: 'label.managed.state'
-                        },
-                        allocationstate: {
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.allocation.state',
-                            indicator: {
-                                'Enabled': 'on',
-                                'Disabled': 'off'
-                            }
-                        }
-                    },
-
-                    dataProvider: function (args) {
-                        var array1 =[];
-                        if (args.filterBy != null) {
-                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                switch (args.filterBy.search.by) {
-                                    case "name":
-                                    if (args.filterBy.search.value.length > 0)
-                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                    break;
-                                }
-                            }
-                        }
-                        array1.push("&zoneid=" + args.context.zones[0].id);
-                        if ("pods" in args.context)
-                        array1.push("&podid=" + args.context.pods[0].id);
-                        $.ajax({
-                            url: createURL("listClusters" + array1.join("") + "&page=" + args.page + "&pagesize=" + pageSize),
-                            dataType: "json",
-                            async: true,
-                            success: function (json) {
-                                var items = json.listclustersresponse.cluster;
-                                $(items).each(function () {
-                                    addExtraPropertiesToClusterObject(this);
-                                });
-
-                                args.response.success({
-                                    actionFilter: clusterActionfilter,
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.cluster',
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.cluster';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.add.cluster',
-                                preFilter: function (args) {
-                                    var $form = args.$form;
-                                    $form.click(function () {
-                                        var $nexusDvsOptFields = $form.find('.form-item').filter(function () {
-                                            var nexusDvsOptFields =[
-                                            'vsmipaddress',
-                                            'vsmusername',
-                                            'vsmpassword'];
-                                            return $.inArray($(this).attr('rel'), nexusDvsOptFields) > -1;
-                                        });
-                                        var $nexusDvsReqFields = $form.find('.form-item').filter(function () {
-                                            var nexusDvsReqFields =[
-                                            'vsmipaddress_req',
-                                            'vsmusername_req',
-                                            'vsmpassword_req'];
-                                            return $.inArray($(this).attr('rel'), nexusDvsReqFields) > -1;
-                                        });
-
-                                        if ($form.find('.form-item[rel=hypervisor] select').val() == 'VMware') {
-                                            $form.find('.form-item[rel=vCenterHost]').css('display', 'inline-block');
-                                            $form.find('.form-item[rel=vCenterUsername]').css('display', 'inline-block');
-                                            $form.find('.form-item[rel=vCenterPassword]').css('display', 'inline-block');
-                                            $form.find('.form-item[rel=vCenterDatacenter]').css('display', 'inline-block');
-
-                                            var $overridePublicTraffic = $form.find('.form-item[rel=overridepublictraffic] input[type=checkbox]');
-                                            var $vSwitchPublicType = $form.find('.form-item[rel=vSwitchPublicType] select');
-                                            var $overrideGuestTraffic = $form.find('.form-item[rel=overrideguesttraffic] input[type=checkbox]');
-                                            var $vSwitchGuestType = $form.find('.form-item[rel=vSwitchGuestType] select');
-
-
-                                            var useDvs = false;
-                                            $.ajax({
-                                                url: createURL('listConfigurations'),
-                                                data: {
-                                                    name: 'vmware.use.dvswitch'
-                                                },
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                                        useDvs = true;
-                                                    }
-                                                }
-                                            });
-                                            if (useDvs == true) {
-                                                //If using Distributed vswitch, there is OverrideTraffic option.
-                                                $form.find('.form-item[rel=overridepublictraffic]').css('display', 'inline-block');
-                                                $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'inline-block');
-
-                                                var useNexusDvs = false;
-                                                $.ajax({
-                                                    url: createURL('listConfigurations'),
-                                                    data: {
-                                                        name: 'vmware.use.nexus.vswitch'
-                                                    },
-                                                    async: false,
-                                                    success: function (json) {
-                                                        if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                                            useNexusDvs = true;
-                                                        }
-                                                    }
-                                                });
-                                                if (useNexusDvs == true) {
-                                                    //If using Nexus Distributed vswitch, show Nexus Distributed vswitch fields (either required ones or optional ones).
-                                                    if (($overridePublicTraffic.is(':checked') && $vSwitchPublicType.val() == 'nexusdvs') ||
-                                                    ($overrideGuestTraffic.is(':checked') && $vSwitchGuestType.val() == 'nexusdvs')) {
-                                                        $nexusDvsReqFields.css('display', 'inline-block');
-                                                        $nexusDvsOptFields.hide();
-                                                    } else {
-                                                        $nexusDvsOptFields.css('display', 'inline-block');
-                                                        $nexusDvsReqFields.hide();
-                                                    }
-                                                } else {
-                                                    //If not using Nexus Distributed vswitch, hide Nexus Distributed vswitch fields.
-                                                    $nexusDvsOptFields.hide();
-                                                    $nexusDvsReqFields.hide();
-                                                }
-                                            } else {
-                                                //useDvs == false
-                                                $form.find('.form-item[rel=overridepublictraffic]').css('display', 'none');
-                                                $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'none');
-                                                $form.find('.form-item[rel=vSwitchPublicName]').css('display', 'none');
-
-                                                $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'none');
-                                                $form.find('.form-item[rel=vSwitchGuestType]').css('display', 'none');
-                                                $form.find('.form-item[rel=vSwitchGuestName]').css('display', 'none');
-
-                                                $nexusDvsOptFields.hide();
-                                                $nexusDvsReqFields.hide();
-                                            }
-                                        } else {
-                                            //XenServer, KVM, etc (non-VMware)
-                                            $form.find('.form-item[rel=vCenterHost]').css('display', 'none');
-                                            $form.find('.form-item[rel=vCenterUsername]').css('display', 'none');
-                                            $form.find('.form-item[rel=vCenterPassword]').css('display', 'none');
-                                            $form.find('.form-item[rel=vCenterDatacenter]').css('display', 'none');
-                                            $form.find('.form-item[rel=enableNexusVswitch]').css('display', 'none');
-
-                                            $form.find('.form-item[rel=overridepublictraffic]').css('display', 'none');
-                                            $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'none');
-                                            $nexusDvsOptFields.hide();
-                                            $nexusDvsReqFields.hide();
-                                        }
-
-                                        if ($form.find('.form-item[rel=overridepublictraffic]').css('display') != 'none' && $overridePublicTraffic.is(':checked')) {
-                                            $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'inline-block');
-                                            $form.find('.form-item[rel=vSwitchPublicName]').css('display', 'inline-block');
-                                        } else {
-                                            $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'none');
-                                            $form.find('.form-item[rel=vSwitchPublicName]').css('display', 'none');
-                                        }
-
-                                        if ($form.find('.form-item[rel=overrideguesttraffic]').css('display') != 'none' && $overrideGuestTraffic.is(':checked')) {
-                                            $form.find('.form-item[rel=vSwitchGuestType]').css('display', 'inline-block');
-                                            $form.find('.form-item[rel=vSwitchGuestName]').css('display', 'inline-block');
-                                        } else {
-                                            $form.find('.form-item[rel=vSwitchGuestType]').css('display', 'none');
-                                            $form.find('.form-item[rel=vSwitchGuestName]').css('display', 'none');
-                                        }
-                                    });
-
-                                    $form.trigger('click');
-                                },
-                                fields: {
-                                    zoneid: {
-                                        label: 'label.zone.name',
-                                        docID: 'helpClusterZone',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function (args) {
-                                            var data = args.context.zones ? {
-                                                id: args.context.zones[0].id
-                                            }: {};
-
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                data: data,
-                                                success: function (json) {
-                                                    var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
-
-                                                    args.response.success({
-                                                        data: $.map(zones, function (zone) {
-                                                            return {
-                                                                id: zone.id,
-                                                                description: zone.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    hypervisor: {
-                                        label: 'label.hypervisor',
-                                        docID: 'helpClusterHypervisor',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL("listHypervisors"),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    var hypervisors = json.listhypervisorsresponse.hypervisor;
-                                                    var items =[];
-                                                    $(hypervisors).each(function () {
-                                                        items.push({
-                                                            id: this.name,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    podId: {
-                                        label: 'label.pod.name',
-                                        docID: 'helpClusterPod',
-                                        dependsOn: 'zoneid',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL("listPods&zoneid=" + args.zoneid),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var pods = json.listpodsresponse.pod;
-                                                    var items =[];
-                                                    $(pods).each(function () {
-                                                        if (("pods" in args.context) && (this.id == args.context.pods[0].id))
-                                                        items.unshift({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        }); else
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    name: {
-                                        label: 'label.cluster.name',
-                                        docID: 'helpClusterName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    isDedicated: {
-                                        label: 'label.dedicate',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        docID: 'helpDedicateResource'
-                                    },
-
-                                    domainId: {
-                                        label: 'label.domain',
-                                        isHidden: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'isDedicated',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    var items =[];
-
-                                                    $(domainObjs).each(function () {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    accountId: {
-                                        label: 'label.account',
-                                        isHidden: true,
-                                        dependsOn: 'isDedicated',
-                                        docID: 'helpAccountForDedication',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-
-                                    //hypervisor==Ovm3 begins here
-                                    ovm3pool: {
-                                        label: 'label.ovm3.pool',
-                                        isHidden: true,
-                                        isBoolean: true,
-                                        isChecked: true,
-                                        docID: 'helpOvm3pool'
-                                    },
-                                    ovm3cluster: {
-                                        label: 'label.ovm3.cluster',
-                                        isHidden: true,
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        docID: 'helpOvm3cluster'
-                                    },
-                                    ovm3vip: {
-                                        label: 'label.ovm3.vip',
-                                        isHidden: true,
-                                        docID: 'helpOvm3Vip',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-
-                                    //hypervisor==VMWare begins here
-                                    vCenterHost: {
-                                        label: 'label.vcenter.host',
-                                        isHidden: true,
-                                        docID: 'helpClustervCenterHost',
-                                        validation: {
-                                            required: false
-                                        }
-                                        //legacy zone - validation not required for new VMware dc model
-                                    },
-                                    vCenterUsername: {
-                                        label: 'label.vcenter.username',
-                                        isHidden: true,
-                                        docID: 'helpClustervCenterUsername'
-                                    },
-                                    vCenterPassword: {
-                                        label: 'label.vcenter.password',
-                                        isHidden: true,
-                                        docID: 'helpClustervCenterPassword',
-                                        isPassword: true
-                                    },
-                                    vCenterDatacenter: {
-                                        label: 'label.vcenter.datacenter',
-                                        isHidden: true,
-                                        docID: 'helpClustervCenterDatacenter',
-                                        validation: {
-                                            required: false
-                                        }
-                                        //legacy zone - validation not required for new VMware dc model
-                                    },
-
-                                    overridepublictraffic: {
-                                        label: 'label.override.public.traffic',
-                                        isBoolean: true,
-                                        isHidden: true,
-                                        isChecked: false,
-                                        docID: 'helpOverridePublicNetwork'
-                                    },
-
-
-                                    vSwitchPublicType: {
-                                        label: 'label.public.traffic.vswitch.type',
-                                        select: function (args) {
-                                            var useNexusDvs = false;
-                                            var items =[]
-                                            $.ajax({
-                                                url: createURL('listConfigurations'),
-                                                data: {
-                                                    name: 'vmware.use.nexus.vswitch'
-                                                },
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                                        useNexusDvs = true;
-                                                    }
-                                                }
-                                            });
-
-                                            if (useNexusDvs) {
-                                                items.push({
-                                                    id: "nexusdvs",
-                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "vmwaresvs",
-                                                    description: "VMware vNetwork Standard Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "vmwaredvs",
-                                                    description: "VMware vNetwork Distributed Virtual Switch"
-                                                });
-                                            } else {
-                                                items.push({
-                                                    id: "vmwaredvs",
-                                                    description: "VMware vNetwork Distributed Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "vmwaresvs",
-                                                    description: "VMware vNetwork Standard Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "nexusdvs",
-                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
-                                                });
-                                            }
-
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    vSwitchPublicName: {
-                                        label: 'label.public.traffic.vswitch.name',
-                                        isHidden: true
-                                    },
-
-                                    overrideguesttraffic: {
-                                        label: 'label.override.guest.traffic',
-                                        isBoolean: true,
-                                        isHidden: true,
-                                        isChecked: false,
-                                        docID: 'helpOverrideGuestNetwork'
-                                    },
-
-                                    vSwitchGuestType: {
-                                        label: 'label.guest.traffic.vswitch.type',
-                                        select: function (args) {
-                                            var items =[]
-
-                                            var useNexusDvs = false;
-                                            $.ajax({
-                                                url: createURL('listConfigurations'),
-                                                data: {
-                                                    name: 'vmware.use.nexus.vswitch'
-                                                },
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                                        useNexusDvs = true;
-                                                    }
-                                                }
-                                            });
-
-
-                                            if (useNexusDvs) {
-                                                items.push({
-                                                    id: "nexusdvs",
-                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "vmwaresvs",
-                                                    description: "VMware vNetwork Standard Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "vmwaredvs",
-                                                    description: "VMware vNetwork Distributed Virtual Switch"
-                                                });
-                                            } else {
-                                                items.push({
-                                                    id: "vmwaredvs",
-                                                    description: "VMware vNetwork Distributed Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "vmwaresvs",
-                                                    description: "VMware vNetwork Standard Virtual Switch"
-                                                });
-                                                items.push({
-                                                    id: "nexusdvs",
-                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
-                                                });
-                                            }
-
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    vSwitchGuestName: {
-                                        label: 'label.guest.traffic.vswitch.name',
-                                        isHidden: true
-                                    },
-
-
-                                    vsmipaddress: {
-                                        label: 'label.cisco.nexus1000v.ip.address',
-                                        validation: {
-                                            required: false
-                                        },
-                                        isHidden: true
-                                    },
-                                    vsmipaddress_req: {
-                                        label: 'label.cisco.nexus1000v.ip.address',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    vsmusername: {
-                                        label: 'label.cisco.nexus1000v.username',
-                                        validation: {
-                                            required: false
-                                        },
-                                        isHidden: true
-                                    },
-                                    vsmusername_req: {
-                                        label: 'label.cisco.nexus1000v.username',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    vsmpassword: {
-                                        label: 'label.cisco.nexus1000v.password',
-                                        validation: {
-                                            required: false
-                                        },
-                                        isPassword: true,
-                                        isHidden: true
-                                    },
-                                    vsmpassword_req: {
-                                        label: 'label.cisco.nexus1000v.password',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isPassword: true,
-                                        isHidden: true
-                                    }
-                                    //hypervisor==VMWare ends here
-                                }
-                            },
-
-                            action: function (args) {
-                                var array1 =[];
-                                array1.push("&zoneId=" + args.data.zoneid);
-                                array1.push("&hypervisor=" + args.data.hypervisor);
-
-                                var clusterType;
-                                if (args.data.hypervisor == "VMware")
-                                clusterType = "ExternalManaged"; else
-                                clusterType = "CloudManaged";
-                                array1.push("&clustertype=" + clusterType);
-
-                                array1.push("&podId=" + args.data.podId);
-
-                                var clusterName = args.data.name;
-                                if (args.data.hypervisor == "Ovm3") {
-                                     array1.push("&ovm3pool=" + encodeURIComponent(args.data.ovm3pool));
-                                     array1.push("&ovm3cluster=" + encodeURIComponent(args.data.ovm3cluster));
-                                     array1.push("&ovm3vip=" + encodeURIComponent(args.data.ovm3vip));
-                                }
-                                if (args.data.hypervisor == "VMware") {
-                                    cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.vCenterUsername, args.data.vCenterPassword);
-
-                                    //vSwitch Public Type
-                                    if (args.$form.find('.form-item[rel=vSwitchPublicType]').css('display') != 'none' && args.data.vSwitchPublicType != "") {
-                                        array1.push("&publicvswitchtype=" + args.data.vSwitchPublicType);
-                                    }
-                                    if (args.$form.find('.form-item[rel=vSwitchPublicName]').css('display') != 'none' && args.data.vSwitchPublicName != "") {
-                                        array1.push("&publicvswitchname=" + args.data.vSwitchPublicName);
-                                    }
-
-                                    //vSwitch Guest Type
-                                    if (args.$form.find('.form-item[rel=vSwitchGuestType]').css('display') != 'none' && args.data.vSwitchGuestType != "") {
-                                        array1.push("&guestvswitchtype=" + args.data.vSwitchGuestType);
-                                    }
-                                    if (args.$form.find('.form-item[rel=vSwitchGuestName]').css('display') != 'none' && args.data.vSwitchGuestName != "") {
-                                        array1.push("&guestvswitchname=" + args.data.vSwitchGuestName);
-                                    }
-
-                                    //Nexus VSM fields
-                                    if (args.$form.find('.form-item[rel=vsmipaddress]').css('display') != 'none' && args.data.vsmipaddress != null && args.data.vsmipaddress.length > 0) {
-                                        array1.push('&vsmipaddress=' + args.data.vsmipaddress);
-                                    }
-                                    if (args.$form.find('.form-item[rel=vsmipaddress_req]').css('display') != 'none' && args.data.vsmipaddress_req != null && args.data.vsmipaddress_req.length > 0) {
-                                        array1.push('&vsmipaddress=' + args.data.vsmipaddress_req);
-                                    }
-
-                                    if (args.$form.find('.form-item[rel=vsmusername]').css('display') != 'none' && args.data.vsmusername != null && args.data.vsmusername.length > 0) {
-                                        array1.push('&vsmusername=' + args.data.vsmusername);
-                                    }
-                                    if (args.$form.find('.form-item[rel=vsmusername_req]').css('display') != 'none' && args.data.vsmusername_req != null && args.data.vsmusername_req.length > 0) {
-                                        array1.push('&vsmusername=' + args.data.vsmusername_req);
-                                    }
-
-                                    if (args.$form.find('.form-item[rel=vsmpassword]').css('display') != 'none' && args.data.vsmpassword != null && args.data.vsmpassword.length > 0) {
-                                        array1.push('&vsmpassword=' + args.data.vsmpassword);
-                                    }
-                                    if (args.$form.find('.form-item[rel=vsmpassword_req]').css('display') != 'none' && args.data.vsmpassword_req != null && args.data.vsmpassword_req.length > 0) {
-                                        array1.push('&vsmpassword=' + args.data.vsmpassword_req);
-                                    }
-
-
-                                    var hostname = args.data.vCenterHost;
-                                    var dcName = args.data.vCenterDatacenter;
-
-                                    if (hostname.length == 0 && dcName.length == 0) {
-                                        $.ajax({
-                                            url: createURL('listVmwareDcs'),
-                                            data: {
-                                                zoneid: args.data.zoneid
-                                            },
-                                            async: false,
-                                            success: function (json) {
-                                                //e.g. json == { "listvmwaredcsresponse" { "count":1 ,"VMwareDC" [ {"id":"c3c2562d-65e9-4fc7-92e2-773c2efe8f37","zoneid":1,"name":"datacenter","vcenter":"10.10.20.20"} ] } }
-                                                var vmwaredcs = json.listvmwaredcsresponse.VMwareDC;
-                                                if (vmwaredcs != null) {
-                                                    hostname = vmwaredcs[0].vcenter;
-                                                    dcName = vmwaredcs[0].name;
-                                                }
-                                            }
-                                        });
-                                    }
-
-                                    var url;
-                                    if (hostname.indexOf("http://") == -1)
-                                    url = "http://" + hostname; else
-                                    url = hostname;
-                                    url += "/" + dcName + "/" + clusterName;
-                                    array1.push("&url=" + encodeURIComponent(url));
-
-                                    clusterName = hostname + "/" + dcName + "/" + clusterName; //override clusterName
-                                }
-                                array1.push("&clustername=" + encodeURIComponent(clusterName));
-                                var clusterId = null;
-                                $.ajax({
-                                    url: createURL("addCluster" + array1.join("")),
-                                    dataType: "json",
-                                    type: "POST",
-                                    success: function (json) {
-                                        var item = json.addclusterresponse.cluster[0];
-                                        clusterId = json.addclusterresponse.cluster[0].id;
-
-                                        //EXPLICIT DEDICATION
-                                        var array2 =[];
-                                        if (args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked') == true) {
-                                            if (args.data.accountId != "")
-                                            array2.push("&account=" + encodeURIComponent(args.data.accountId));
-
-                                            if (clusterId != null) {
-                                                $.ajax({
-                                                    url: createURL("dedicateCluster&clusterId=" + clusterId + "&domainId=" + args.data.domainId + array2.join("")),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var jid = json.dedicateclusterresponse.jobid;
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jid
-                                                            },
-                                                            notification: {
-                                                                poll: pollAsyncJobResult,
-                                                                interval: 4500,
-                                                                desc: "Dedicate Cluster"
-                                                            },
-
-                                                            data: $.extend(item, {
-                                                                state: 'Enabled'
-                                                            })
-                                                        });
-                                                    },
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                        args.response.success({
-                                            data: item,
-                                            actionFilter: clusterActionfilter
-                                        });
-                                    },
-                                    error: function (XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            }
-                        },
-                        viewMetrics: {
-                            label: 'label.metrics',
-                            isHeader: true,
-                            addRow: false,
-                            action: {
-                                custom: cloudStack.uiCustom.metricsView({resource: 'clusters'})
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.metrics';
-                                }
-                            }
-                        },
-                        startRollingMaintenance: rollingMaintenanceAction({ listView: true, entity: 'clusters' })
-                    },
-
-                    detailView: {
-                        viewAll: {
-                            path: '_zone.hosts',
-                            label: 'label.hosts'
-                        },
-                        isMaximized: true,
-                        tabFilter: function (args) {
-                            var vSwichConfigEnabled, vSwitchPresentOnCluster;
-                            $.ajax({
-                                url: createURL('listConfigurations'),
-                                data: {
-                                    name: 'vmware.use.nexus.vswitch'
-                                },
-                                async: false,
-                                success: function (json) {
-                                    vSwichConfigEnabled = json.listconfigurationsresponse.configuration[0].value;
-                                }
-                            });
-
-                            var hypervisorType = args.context.clusters[0].hypervisortype;
-                            if (vSwichConfigEnabled != "true" || hypervisorType != 'VMware') {
-                                return[ 'nexusVswitch'];
-                            }
-                            return[];
-                        },
-
-                        actions: {
-
-                            startRollingMaintenance: {
-                                label: 'label.start.rolling.maintenance',
-                                textLabel: 'label.start.rolling.maintenance',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.start.rolling.maintenance';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.start.rolling.maintenance',
-                                    fields: {
-                                        timeout: {
-                                            label: 'label.timeout',
-                                        },
-                                        force: {
-                                            isBoolean: true,
-                                            label: 'label.start.rolling.maintenance.force'
-                                        },
-                                        payload: {
-                                            label: 'label.start.rolling.maintenance.payload'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = {
-                                        clusterids: args.context.clusters[0].id,
-                                        force: args.data.force,
-                                        timeout: args.data.timeout,
-                                        payload: args.data.payload
-                                    };
-                                    $.ajax({
-                                        url: createURL("startRollingMaintenance"),
-                                        dataType: "json",
-                                        data: data,
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.rollingmaintenance;
-                                            args.response.success({
-                                                actionFilter: zoneActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var array1 =[];
-
-                                    $.ajax({
-                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + array1.join("")),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.updateclusterresponse.cluster;
-                                            addExtraPropertiesToClusterObject(item);
-                                            args.response.success({
-                                                actionFilter: clusterActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.action.enable.cluster',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.enable.cluster';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.enable.cluster';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Enabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.updateclusterresponse.cluster;
-                                            args.context.clusters[0].state = item.allocationstate;
-                                            addExtraPropertiesToClusterObject(item);
-                                            args.response.success({
-                                                actionFilter: clusterActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            disable: {
-                                label: 'label.action.disable.cluster',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.disable.cluster';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.disable.cluster';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Disabled"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.updateclusterresponse.cluster;
-                                            args.context.clusters[0].state = item.allocationstate;
-                                            addExtraPropertiesToClusterObject(item);
-                                            args.response.success({
-                                                actionFilter: clusterActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            dedicate: {
-                                label: 'label.dedicate.cluster',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.dedicate.cluster.domain.account';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.cluster.dedicated';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.dedicate.cluster',
-                                    fields: {
-                                        domainId: {
-                                            label: 'label.domain',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function (json) {
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        var items =[];
-
-                                                        $(domainObjs).each(function () {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        accountId: {
-                                            label: 'label.account',
-                                            docID: 'helpAccountForDedication',
-                                            validation: {
-                                                required: false
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    //EXPLICIT DEDICATION
-                                    var array2 =[];
-                                    if (args.data.accountId != "")
-                                    array2.push("&account=" + encodeURIComponent(args.data.accountId));
-                                    $.ajax({
-                                        url: createURL("dedicateCluster&clusterId=" +
-                                        args.context.clusters[0].id +
-                                        "&domainId=" + args.data.domainId + array2.join("")),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.dedicateclusterresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return clusterActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            release: {
-                                label: 'label.release.dedicated.cluster',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.release.dedicated.cluster';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.cluster.dedication.released';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("releaseDedicatedCluster&clusterid=" + args.context.clusters[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.releasededicatedclusterresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return clusterActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-
-                            manage: {
-                                label: 'label.action.manage.cluster',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.manage.cluster';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.manage.cluster';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Managed"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.updateclusterresponse.cluster;
-                                            addExtraPropertiesToClusterObject(item);
-                                            args.response.success({
-                                                actionFilter: clusterActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            unmanage: {
-                                label: 'label.action.unmanage.cluster',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.unmanage.cluster';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.unmanage.cluster';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Unmanaged"),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.updateclusterresponse.cluster;
-                                            addExtraPropertiesToClusterObject(item);
-                                            args.response.success({
-                                                actionFilter: clusterActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            'remove': {
-                                label: 'label.action.delete.cluster',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.delete.cluster';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.delete.cluster';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("deleteCluster&id=" + args.context.clusters[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            args.response.success({
-                                                data: {
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            enableOutOfBandManagement: {
-                                label: 'label.outofbandmanagement.enable',
-                                action: function (args) {
-                                    var data = {
-                                        clusterid: args.context.clusters[0].id,
-                                    };
-                                    $.ajax({
-                                        url: createURL("enableOutOfBandManagementForCluster"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.enableoutofbandmanagementforclusterresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return clusterActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.outofbandmanagement.enable';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.outofbandmanagement.enable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            disableOutOfBandManagement: {
-                                label: 'label.outofbandmanagement.disable',
-                                action: function (args) {
-                                    var data = {
-                                        clusterid: args.context.clusters[0].id,
-                                    };
-                                    $.ajax({
-                                        url: createURL("disableOutOfBandManagementForCluster"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.disableoutofbandmanagementforclusterresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return clusterActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.outofbandmanagement.disable';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.outofbandmanagement.disable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            enableHA: {
-                                label: 'label.ha.enable',
-                                action: function (args) {
-                                    var data = {
-                                        clusterid: args.context.clusters[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL("enableHAForCluster"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.enablehaforclusterresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return clusterActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'label.ha.enable';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.ha.enable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            disableHA: {
-                                label: 'label.ha.disable',
-                                action: function (args) {
-                                    var data = {
-                                        clusterid: args.context.clusters[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL("disableHAForCluster"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.disablehaforclusterresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return clusterActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'label.ha.disable';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.ha.disable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    podname: {
-                                        label: 'label.pod'
-                                    },
-                                    hypervisortype: {
-                                        label: 'label.hypervisor'
-                                    },
-                                    clustertype: {
-                                        label: 'label.cluster.type'
-                                    },
-                                    //allocationstate: { label: 'label.allocation.state' },
-                                    //managedstate: { label: 'Managed State' },
-                                    state: {
-                                        label: 'label.state'
-                                    }
-                                }, {
-                                    isdedicated: {
-                                        label: 'label.dedicated'
-                                    },
-                                    domainid: {
-                                        label: 'label.domain.id'
-                                    }
-                                }],
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listClusters&id=" + args.context.clusters[0].id),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var item = json.listclustersresponse.cluster[0];
-                                            addExtraPropertiesToClusterObject(item);
-                                            $.ajax({
-                                                url: createURL("listDedicatedClusters&clusterid=" + args.context.clusters[0].id),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listdedicatedclustersresponse.dedicatedcluster != undefined) {
-                                                        var clusterItem = json.listdedicatedclustersresponse.dedicatedcluster[0];
-                                                        if (clusterItem.domainid != null) {
-                                                            $.extend(item, clusterItem, {
-                                                                isdedicated: _l('label.yes')
-                                                            });
-                                                        }
-                                                    } else
-                                                    $.extend(item, {
-                                                        isdedicated: _l('label.no')
-                                                    })
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                }
-                                            });
-                                            args.response.success({
-                                                actionFilter: clusterActionfilter,
-                                                data: item
-                                            });
-                                        },
-
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                        }
-                                    });
-                                }
-                            },
-                            nexusVswitch: {
-                                title: 'label.nexusVswitch',
-                                listView: {
-                                    id: 'vSwitches',
-                                    fields: {
-                                        vsmdeviceid: {
-                                            label: 'label.name'
-                                        },
-                                        vsmdevicestate: {
-                                            label: 'label.state',
-                                            indicator: {
-                                                'Enabled': 'on'
-                                            }
-                                        }
-                                    },
-                                    detailView: {
-                                        actions: {
-                                            enable: {
-                                                label: 'label.action.enable.nexusVswitch',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.action.enable.nexusVswitch';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.action.enable.nexusVswitch';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("enableCiscoNexusVSM&id=" + args.context.vSwitches[0].vsmdeviceid),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.enablecisconexusvsmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid
-                                                                }
-                                                            });
-                                                            //args.context.vSwitches[0].vsmdevicestate = item.allocationstate;
-                                                            //addExtraPropertiesToClusterObject(item);
-                                                            args.response.success({
-                                                                actionFilter: nexusActionfilter,
-                                                                data: item
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: function (args) {
-                                                        args.complete();
-                                                    }
-                                                }
-                                            },
-
-                                            disable: {
-                                                label: 'label.action.disable.nexusVswitch',
-                                                messages: {
-                                                    confirm: function (args) {
-                                                        return 'message.action.disable.nexusVswitch';
-                                                    },
-                                                    notification: function (args) {
-                                                        return 'label.action.disable.nexusVswitch';
-                                                    }
-                                                },
-                                                action: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("disableCiscoNexusVSM&id=" + args.context.vSwitches[0].vsmdeviceid),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (json) {
-                                                            var jid = json.disablecisconexusvsmresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid
-                                                                }
-                                                            });
-                                                            //args.context.vSwitches[0].vsmdevicestate = item.allocationstate;
-                                                            //addExtraPropertiesToClusterObject(item);
-                                                            args.response.success({
-                                                                actionFilter: nexusActionfilter,
-                                                                data: item
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: function (args) {
-                                                        args.complete();
-                                                    }
-                                                }
-                                            }
-
-                                            /*   'remove': {
-                                            label: 'label.action.delete.nexusVswitch' ,
-                                            messages: {
-                                            confirm: function(args) {
-                                            return 'message.action.delete.nexusVswitch';
-                                            },
-                                            notification: function(args) {
-                                            return 'label.action.delete.nexusVswitch';
-                                            }
-                                            },
-                                            action: function(args) {
-                                            $.ajax({
-                                            url: createURL("deleteCiscoNexusVSM&id=" + args.context.vSwitches[0].vsmdeviceid),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                            args.response.success({data:{}});
-                                            }
-                                            });
-                                            },
-                                            notification: {
-                                            poll: function(args) { args.complete(); }
-                                            }
-                                            }*/
-                                        },
-
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                fields: {
-                                                    vsmdeviceid: {
-                                                        label: 'label.name'
-                                                    },
-                                                    ipaddress: {
-                                                        label: 'label.ipaddress'
-                                                    },
-                                                    vsmctrlvlanid: {
-                                                        label: 'label.vsmctrlvlanid'
-                                                    },
-                                                    vsmpktvlanid: {
-                                                        label: 'label.vsmpktvlanid'
-                                                    },
-                                                    vsmstoragevlanid: {
-                                                        label: 'label.vsmstoragevlanid'
-                                                    },
-                                                    vsmdevicestate: {
-                                                        label: 'label.state',
-                                                        indicator: {
-                                                            'Enabled': 'on'
-                                                        }
-                                                    }
-                                                },
-
-                                                dataProvider: function (args) {
-                                                    $.ajax({
-                                                        url: createURL("listCiscoNexusVSMs&clusterid=" + args.context.clusters[0].id),
-                                                        dataType: "json",
-                                                        success: function (json) {
-                                                            var item = json.listcisconexusvsmscmdresponse.cisconexusvsm[0];
-                                                            addExtraPropertiesToClusterObject(item);
-                                                            args.response.success({
-                                                                actionFilter: nexusActionfilter,
-                                                                data: item
-                                                            });
-                                                        },
-                                                        error: function (json) {
-                                                            args.response.error(parseXMLHttpResponse(json));
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    },
-
-                                    dataProvider: function (args) {
-                                        $.ajax({
-                                            url: createURL("listCiscoNexusVSMs&clusterid=" + args.context.clusters[0].id),
-                                            dataType: "json",
-                                            success: function (json) {
-                                                var item = json.listcisconexusvsmscmdresponse.cisconexusvsm;
-                                                args.response.success({
-                                                    actionFilter: nexusActionfilter,
-                                                    data: item
-                                                });
-                                            },
-                                            error: function (json) {
-                                                // Not generally a real error; means vSwitch still needs setup
-                                                args.response.success({
-                                                    data:[]
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            },
-
-                            // Granular settings for cluster
-                            settings: {
-                                title: 'label.settings',
-                                custom: cloudStack.uiCustom.granularSettings({
-                                    dataProvider: function (args) {
-                                        $.ajax({
-                                            url: createURL('listConfigurations&clusterid=' + args.context.clusters[0].id),
-                                            data: listViewDataProvider(args, {
-                                            },
-                                            {
-                                                searchBy: 'name'
-                                            }),
-                                            success: function (json) {
-                                                args.response.success({
-                                                    data: json.listconfigurationsresponse.configuration
-                                                });
-                                            },
-
-                                            error: function (json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    },
-                                    actions: {
-                                        edit: function (args) {
-                                            // call updateClusterLevelParameters
-
-                                            var data = {
-                                                name: args.data.jsonObj.name,
-                                                value: args.data.value
-                                            };
-
-                                            $.ajax({
-                                                url: createURL('updateConfiguration&clusterid=' + args.context.clusters[0].id),
-                                                data: data,
-                                                success: function (json) {
-                                                    var item = json.updateconfigurationresponse.configuration;
-
-                                                    if (args.data.jsonObj.name == 'cpu.overprovisioning.factor' || args.data.jsonObj.name == 'mem.overprovisioning.factor') {
-                                                        cloudStack.dialog.notice({
-                                                            message: 'Please note - if you are changing the over provisioning factor for a cluster with vms running, please refer to the admin guide to understand the capacity calculation.'
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                },
-
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        }
-                                    }
-                                })
-                            }
-                        }
-                    }
-                }
-            },
-            hosts: {
-                title: 'label.hosts',
-                id: 'hosts',
-                listView: {
-                    section: 'hosts',
-                    id: 'hosts',
-                    multiSelect: true,
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        ipaddress: {
-                            label: 'label.ip.address'
-                        },
-                        hypervisor: {
-                            label: 'label.hypervisor'
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        clustername: {
-                            label: 'label.cluster'
-                        },
-                        resourcestate: {
-                            label: 'label.resource.state',
-                            indicator: {
-                                'Enabled': 'on',
-                                'Disabled': 'off',
-                                'Maintenance': 'warning'
-                            }
-                        },
-                        state: {
-                            label: 'label.state',
-                            indicator: {
-                                'Up': 'on',
-                                'Down': 'off',
-                                'Disconnected': 'off',
-                                'Alert': 'off',
-                                'Error': 'off',
-                                'Unsecure': 'warning'
-                            }
-                        },
-                        powerstate: {
-                            label: 'label.powerstate',
-                            indicator: {
-                                'On': 'on',
-                                'Off': 'off',
-                                'Unknown': 'warning'
-                            },
-                        },
-                    },
-
-                    dataProvider: function (args) {
-                        var array1 =[];
-                        if (args.filterBy != null) {
-                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                switch (args.filterBy.search.by) {
-                                    case "name":
-                                    if (args.filterBy.search.value.length > 0)
-                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                    break;
-                                }
-                            }
-                        }
-
-                        if (! args.context.instances) {
-                            if ("zones" in args.context)
-                                array1.push("&zoneid=" + args.context.zones[0].id);
-                            if ("pods" in args.context)
-                                array1.push("&podid=" + args.context.pods[0].id);
-                            if ("clusters" in args.context)
-                               array1.push("&clusterid=" + args.context.clusters[0].id);
-                        } else {
-                            //Instances menu > Instance detailView > View Hosts
-                            array1.push("&id=" + args.context.instances[0].hostid);
-                        }
-                        $.ajax({
-                            url: createURL("listHosts&type=Routing" + array1.join("") + "&page=" + args.page + "&pagesize=" + pageSize),
-                            dataType: "json",
-                            async: true,
-                            success: function (json) {
-                                var items = json.listhostsresponse.host;
-                                if (items) {
-                                    $.each(items, function(idx, host) {
-                                        if (host && host.outofbandmanagement) {
-                                            items[idx].powerstate = host.outofbandmanagement.powerstate;
-                                        }
-
-                                        if (host && host.hypervisor == "KVM" && host.state == 'Up' && host.details && host.details["secured"] != 'true') {
-                                            items[idx].state = 'Unsecure';
-                                        }
-                                    });
-                                }
-
-                                args.response.success({
-                                    actionFilter: hostActionfilter,
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.host',
-
-                            createForm: {
-                                title: 'label.add.host',
-                                fields: {
-                                    zoneid: {
-                                        docID: 'helpHostZone',
-                                        label: 'label.zone',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function (args) {
-                                            var data = args.context.zones ? {
-                                                id: args.context.zones[0].id
-                                            }: {};
-
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                data: data,
-                                                success: function (json) {
-                                                    var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
-
-                                                    args.response.success({
-                                                        data: $.map(zones, function (zone) {
-                                                            return {
-                                                                id: zone.id,
-                                                                description: zone.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    //always appear (begin)
-                                    podId: {
-                                        label: 'label.pod',
-                                        docID: 'helpHostPod',
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'zoneid',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL("listPods&zoneid=" + args.zoneid),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var pods = json.listpodsresponse.pod;
-                                                    var items =[];
-                                                    $(pods).each(function () {
-                                                        if (("pods" in args.context) && (this.id == args.context.pods[0].id))
-                                                        items.unshift({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        }); else
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    clusterId: {
-                                        label: 'label.cluster',
-                                        docID: 'helpHostCluster',
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'podId',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL("listClusters&podid=" + args.podId),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    clusterObjs = json.listclustersresponse.cluster;
-                                                    var items =[];
-                                                    $(clusterObjs).each(function () {
-                                                        if (("clusters" in args.context) && (this.id == args.context.clusters[0].id))
-                                                        items.unshift({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        }); else
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-
-                                            args.$select.change(function () {
-                                                var $form = $(this).closest('form');
-
-                                                var clusterId = $(this).val();
-                                                if (clusterId == null)
-                                                return;
-
-                                                var items =[];
-                                                $(clusterObjs).each(function () {
-                                                    if (this.id == clusterId) {
-                                                        selectedClusterObj = this;
-                                                        return false; //break the $.each() loop
-                                                    }
-                                                });
-                                                if (selectedClusterObj == null)
-                                                return;
-
-                                                if (selectedClusterObj.hypervisortype == "VMware") {
-                                                    //$('li[input_group="general"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=hostname]').hide();
-                                                    $form.find('.form-item[rel=username]').hide();
-                                                    $form.find('.form-item[rel=password]').hide();
-
-                                                    //$('li[input_group="vmware"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=vcenterHost]').css('display', 'inline-block');
-
-                                                    //$('li[input_group="baremetal"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=baremetalCpuCores]').hide();
-                                                    $form.find('.form-item[rel=baremetalCpu]').hide();
-                                                    $form.find('.form-item[rel=baremetalMemory]').hide();
-                                                    $form.find('.form-item[rel=baremetalMAC]').hide();
-
-                                                    //$('li[input_group="Ovm"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=agentUsername]').hide();
-                                                    $form.find('.form-item[rel=agentPassword]').hide();
-
-                                                    //$('li[input_group="Ovm3"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=agentUsername]').hide();
-                                                    $form.find('.form-item[rel=agentPassword]').hide();
-                                                    $form.find('.form-item[rel=agentPort]').hide();
-                                                    $form.find('.form-item[rel=ovm3vip]').hide();
-                                                    $form.find('.form-item[rel=ovm3pool]').hide();
-                                                    $form.find('.form-item[rel=ovm3cluster]').hide();
-                                                } else if (selectedClusterObj.hypervisortype == "BareMetal") {
-                                                    //$('li[input_group="general"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=username]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=password]').css('display', 'inline-block');
-
-                                                    //$('li[input_group="baremetal"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=baremetalCpuCores]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=baremetalCpu]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=baremetalMemory]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=baremetalMAC]').css('display', 'inline-block');
-
-                                                    //$('li[input_group="vmware"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=vcenterHost]').hide();
-
-                                                    //$('li[input_group="Ovm"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=agentUsername]').hide();
-                                                    $form.find('.form-item[rel=agentPassword]').hide();
-
-                                                    //$('li[input_group="Ovm3"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=agentUsername]').hide();
-                                                    $form.find('.form-item[rel=agentPassword]').hide();
-                                                    $form.find('.form-item[rel=agentPort]').hide();
-                                                    $form.find('.form-item[rel=ovm3vip]').hide();
-                                                    $form.find('.form-item[rel=ovm3pool]').hide();
-                                                    $form.find('.form-item[rel=ovm3cluster]').hide();
-                                                } else if (selectedClusterObj.hypervisortype == "Ovm") {
-                                                    //$('li[input_group="general"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=username]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=password]').css('display', 'inline-block');
-
-                                                    //$('li[input_group="vmware"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=vcenterHost]').hide();
-
-                                                    //$('li[input_group="baremetal"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=baremetalCpuCores]').hide();
-                                                    $form.find('.form-item[rel=baremetalCpu]').hide();
-                                                    $form.find('.form-item[rel=baremetalMemory]').hide();
-                                                    $form.find('.form-item[rel=baremetalMAC]').hide();
-
-                                                    //$('li[input_group="Ovm"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=agentUsername]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=agentUsername]').find('input').val("oracle");
-                                                    $form.find('.form-item[rel=agentPassword]').css('display', 'inline-block');
-
-                                                    //$('li[input_group="Ovm3"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=agentUsername]').hide();
-                                                    $form.find('.form-item[rel=agentPassword]').hide();
-                                                    $form.find('.form-item[rel=agentPort]').hide();
-                                                    $form.find('.form-item[rel=ovm3vip]').hide();
-                                                    $form.find('.form-item[rel=ovm3pool]').hide();
-                                                    $form.find('.form-item[rel=ovm3cluster]').hide();
-                                                } else if (selectedClusterObj.hypervisortype == "Ovm3") {
-                                                    //$('li[input_group="general"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=username]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=password]').css('display', 'inline-block');
-
-                                                    //$('li[input_group="vmware"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=vcenterHost]').hide();
-
-                                                    //$('li[input_group="baremetal"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=baremetalCpuCores]').hide();
-                                                    $form.find('.form-item[rel=baremetalCpu]').hide();
-                                                    $form.find('.form-item[rel=baremetalMemory]').hide();
-                                                    $form.find('.form-item[rel=baremetalMAC]').hide();
-
-                                                     //$('li[input_group="Ovm3"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=agentUsername]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=agentUsername]').find('input').val("oracle");
-                                                    $form.find('.form-item[rel=agentPassword]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=agentPort]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=agentPort]').find('input').val("8899");
-                                                    $form.find('.form-item[rel=ovm3vip]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=ovm3pool]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=ovm3cluster]').css('display', 'inline-block');
-                                                } else {
-                                                    //$('li[input_group="general"]', $dialogAddHost).show();
-                                                    $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=username]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=password]').css('display', 'inline-block');
-
-                                                    //$('li[input_group="vmware"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=vcenterHost]').hide();
-
-                                                    //$('li[input_group="baremetal"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=baremetalCpuCores]').hide();
-                                                    $form.find('.form-item[rel=baremetalCpu]').hide();
-                                                    $form.find('.form-item[rel=baremetalMemory]').hide();
-                                                    $form.find('.form-item[rel=baremetalMAC]').hide();
-
-                                                    //$('li[input_group="Ovm"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=agentUsername]').hide();
-                                                    $form.find('.form-item[rel=agentPassword]').hide();
-
-                                                    //$('li[input_group="Ovm3"]', $dialogAddHost).hide();
-                                                    $form.find('.form-item[rel=agentUsername]').hide();
-                                                    $form.find('.form-item[rel=agentPassword]').hide();
-                                                    $form.find('.form-item[rel=agentPort]').hide();
-                                                    $form.find('.form-item[rel=ovm3vip]').hide();
-                                                    $form.find('.form-item[rel=ovm3pool]').hide();
-                                                    $form.find('.form-item[rel=ovm3cluster]').hide();
-                                                }
-                                            });
-
-                                            args.$select.trigger("change");
-                                        }
-                                    },
-                                    //always appear (end)
-
-                                    //input_group="general" starts here
-                                    hostname: {
-                                        label: 'label.host.name',
-                                        docID: 'helpHostName',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    username: {
-                                        label: 'label.username',
-                                        docID: 'helpHostUsername',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    password: {
-                                        label: 'label.password',
-                                        docID: 'helpHostPassword',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true,
-                                        isPassword: true
-                                    },
-
-                                    isDedicated: {
-                                        label: 'label.dedicate',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        docID: 'helpDedicateResource'
-                                    },
-
-                                    domainId: {
-                                        label: 'label.domain',
-                                        isHidden: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'isDedicated',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL('listDomains'),
-                                                data: {
-                                                    listAll: true,
-                                                    details: 'min'
-                                                },
-                                                dataType: "json",
-                                                success: function (json) {
-                                                    var domainObjs = json.listdomainsresponse.domain;
-                                                    var items =[];
-
-                                                    $(domainObjs).each(function () {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    items.sort(function(a, b) {
-                                                        return a.description.localeCompare(b.description);
-                                                    });
-
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    accountId: {
-                                        label: 'label.account',
-                                        isHidden: true,
-                                        dependsOn: 'isDedicated',
-                                        docID: 'helpAccountForDedication',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-
-                                    //input_group="general" ends here
-
-                                    //input_group="VMWare" starts here
-                                    vcenterHost: {
-                                        label: 'label.esx.host',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    //input_group="VMWare" ends here
-
-                                    //input_group="BareMetal" starts here
-                                    baremetalCpuCores: {
-                                        label: 'label.num.cpu.cores',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    baremetalCpu: {
-                                        label: 'label.cpu.mhz',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    baremetalMemory: {
-                                        label: 'label.memory.mb',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    baremetalMAC: {
-                                        label: 'label.host.MAC',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    //input_group="BareMetal" ends here
-
-                                    //input_group="OVM" starts here
-                                    agentUsername: {
-                                        label: 'label.agent.username',
-                                        validation: {
-                                            required: false
-                                        },
-                                        isHidden: true
-                                    },
-                                    agentPassword: {
-                                        label: 'label.agent.password',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true,
-                                        isPassword: true
-                                    },
-                                    //input_group="OVM" ends here
-
-                                    //input_group="OVM3" starts here
-                                    agentPort: {
-                                        label: 'label.agent.port',
-                                        validation: {
-                                            required: false
-                                        },
-                                        isHidden: true
-                                    },
-                                    //input_group="OVM3" ends here
-
-                                    //always appear (begin)
-                                    hosttags: {
-                                        label: 'label.host.tags',
-                                        isTokenInput: true,
-                                        docID: 'helpHostTags',
-                                        validation: {
-                                            required: false
-                                        },
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL("listHostTags"),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var item = json.listhosttagsresponse.hosttag;
-                                                    var tags = [];
-
-                                                    if (item != null)
-                                                    {
-                                                        tags = $.map(item, function(tag) {
-                                                            return {
-                                                                       id: tag.name,
-                                                                       name: tag.name
-                                                                   };
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: tags,
-                                                        hintText: _l('hint.type.part.host.tag'),
-                                                        noResultsText: _l('hint.no.host.tags')
-                                                    });
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        }
-                                    }
-                                    //always appear (end)
-                                }
-                            },
-
-                            action: function (args) {
-                                var data = {
-                                    zoneid: args.data.zoneid,
-                                    podid: args.data.podId,
-                                    clusterid: args.data.clusterId,
-                                    hypervisor: selectedClusterObj.hypervisortype,
-                                    clustertype: selectedClusterObj.clustertype,
-                                    hosttags: args.data.hosttags
-                                };
-
-                                if (selectedClusterObj.hypervisortype == "VMware") {
-                                    $.extend(data, {
-                                        username: '',
-                                        password: ''
-                                    });
-
-                                    var hostname = args.data.vcenterHost;
-                                    var url;
-                                    if (hostname.indexOf("http://") == -1)
-                                    url = "http://" + hostname; else
-                                    url = hostname;
-
-                                    $.extend(data, {
-                                        url: url
-                                    });
-                                } else {
-                                    $.extend(data, {
-                                        username: args.data.username,
-                                        password: args.data.password
-                                    });
-
-                                    var hostname = args.data.hostname;
-                                    var url;
-                                    if (hostname.indexOf("http://") == -1)
-                                    url = "http://" + hostname; else
-                                    url = hostname;
-
-                                    $.extend(data, {
-                                        url: url
-                                    });
-
-                                    if (selectedClusterObj.hypervisortype == "BareMetal") {
-                                        $.extend(data, {
-                                            cpunumber: args.data.baremetalCpuCores,
-                                            cpuspeed: args.data.baremetalCpu,
-                                            memory: args.data.baremetalMemory,
-                                            hostmac: args.data.baremetalMAC
-                                        });
-                                    } else if (selectedClusterObj.hypervisortype == "Ovm") {
-                                        $.extend(data, {
-                                            agentusername: args.data.agentUsername,
-                                            agentpassword: args.data.agentPassword
-                                        });
-                                    } else if (selectedClusterObj.hypervisortype == "Ovm3") {
-                                        $.extend(data, {
-                                            agentusername: args.data.agentUsername,
-                                            agentpassword: args.data.agentPassword,
-                                            agentport: args.data.agentPort
-                                       });
-                                    }
-                                }
-
-                                var hostId = null;
-                                $.ajax({
-                                    url: createURL("addHost"),
-                                    type: "POST",
-                                    data: data,
-                                    success: function (json) {
-                                        var item = json.addhostresponse.host[0];
-
-                                        hostId = json.addhostresponse.host[0].id;
-
-                                        //EXPLICIT DEDICATION
-                                        var array2 =[];
-
-                                        if (args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked') == true) {
-                                            if (args.data.accountId != "")
-                                            array2.push("&account=" + encodeURIComponent(args.data.accountId));
-
-
-                                            if (hostId != null) {
-                                                $.ajax({
-                                                    url: createURL("dedicateHost&hostId=" + hostId + "&domainId=" + args.data.domainId + array2.join("")),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var jid = json.dedicatehostresponse.jobid;
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jid
-                                                            },
-                                                            notification: {
-                                                                poll: pollAsyncJobResult,
-                                                                interval: 4500,
-                                                                desc: "Dedicate Host"
-                                                            },
-
-                                                            data: item
-                                                        });
-                                                    },
-
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-
-                                    error: function (XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function (args) {
-                                    args.complete({
-                                        actionFilter: hostActionfilter
-                                    });
-                                }
-                            },
-
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.host';
-                                }
-                            }
-                        },
-                        viewMetrics: {
-                            label: 'label.metrics',
-                            isHeader: true,
-                            addRow: false,
-                            action: {
-                                custom: cloudStack.uiCustom.metricsView({resource: 'hosts'})
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.metrics';
-                                }
-                            }
-                        },
-                        startRollingMaintenance: rollingMaintenanceAction({ listView: true, entity: 'hosts' })
-                    },
-                    detailView: {
-                        name: "Host details",
-                        viewAll: {
-                            label: 'label.instances',
-                            path: 'instances'
-                        },
-                        actions: {
-                            startRollingMaintenance: {
-                                label: 'label.start.rolling.maintenance',
-                                textLabel: 'label.start.rolling.maintenance',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.start.rolling.maintenance';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.start.rolling.maintenance',
-                                    fields: {
-                                        timeout: {
-                                            label: 'label.timeout',
-                                        },
-                                        force: {
-                                            isBoolean: true,
-                                            label: 'label.start.rolling.maintenance.force'
-                                        },
-                                        payload: {
-                                            label: 'label.start.rolling.maintenance.payload'
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = {
-                                        hostids: args.context.hosts[0].id,
-                                        force: args.data.force,
-                                        timeout: args.data.timeout,
-                                        payload: args.data.payload
-                                    };
-                                    $.ajax({
-                                        url: createURL("startRollingMaintenance"),
-                                        dataType: "json",
-                                        data: data,
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.rollingmaintenance;
-                                            args.response.success({
-                                                actionFilter: zoneActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var array1 =[];
-                                    array1.push("&hosttags=" + encodeURIComponent(args.data.hosttags));
-
-                                    if (args.data.oscategoryid != null && args.data.oscategoryid.length > 0)
-                                        array1.push("&osCategoryId=" + args.data.oscategoryid);
-
-                                    if (args.data.annotation != null && args.data.annotation.length > 0)
-                                        array1.push("&annotation=" + args.data.annotation);
-
-                                    if (args.data.name != null && args.data.name.length > 0)
-                                        array1.push("&name=" + args.data.name);
-                                    $.ajax({
-                                        url: createURL("updateHost&id=" + args.context.hosts[0].id + array1.join("")),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var item = json.updatehostresponse.host;
-                                            args.response.success({
-                                                actionFilter: hostActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-
-                            dedicate: {
-                                label: 'label.dedicate.host',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.dedicate.host.domain.account';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.host.dedicated';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.dedicate.host',
-                                    fields: {
-                                        domainId: {
-                                            label: 'label.domain',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                $.ajax({
-                                                    url: createURL('listDomains'),
-                                                    data: {
-                                                        listAll: true,
-                                                        details: 'min'
-                                                    },
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function (json) {
-                                                        var domainObjs = json.listdomainsresponse.domain;
-                                                        var items =[];
-
-                                                        $(domainObjs).each(function () {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        items.sort(function(a, b) {
-                                                            return a.description.localeCompare(b.description);
-                                                        });
-
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        accountId: {
-                                            label: 'label.account',
-                                            docID: 'helpAccountForDedication',
-                                            validation: {
-                                                required: false
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    //EXPLICIT DEDICATION
-                                    var array2 =[];
-                                    if (args.data.accountId != "")
-                                    array2.push("&account=" + encodeURIComponent(args.data.accountId));
-
-                                    $.ajax({
-                                        url: createURL("dedicateHost&hostId=" +
-                                        args.context.hosts[0].id +
-                                        "&domainId=" + args.data.domainId + array2.join("")),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var jid = json.dedicatehostresponse.jobid;
-
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            release: {
-                                label: 'label.release.dedicated.host',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.release.dedicated.host';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.host.dedication.released';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("releaseDedicatedHost&hostid=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.releasededicatedhostresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            secureKVMHost: {
-                                label: 'label.action.secure.host',
-                                action: function(args) {
-                                    var data = {
-                                        hostid: args.context.hosts[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('provisionCertificate'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: json.provisioncertificateresponse.jobid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.secure.host';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.secure.host';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            enableMaintenanceMode: {
-                                label: 'label.action.enable.maintenance.mode',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("prepareHostForMaintenance&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.preparehostformaintenanceresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.host;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.host.enable.maintenance.mode';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.enable.maintenance.mode';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            cancelMaintenanceMode: {
-                                label: 'label.action.cancel.maintenance.mode',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("cancelHostMaintenance&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.cancelhostmaintenanceresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.host;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.cancel.maintenance.mode';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.cancel.maintenance.mode';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            forceReconnect: {
-                                label: 'label.action.force.reconnect',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("reconnectHost&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.reconnecthostresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.host;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.action.force.reconnect';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.force.reconnect';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            enable: {
-                                label: 'label.enable.host',
-                                action: function (args) {
-                                    var data = {
-                                         id: args.context.hosts[0].id,
-                                         allocationstate: "Enable"
-                                    };
-                                    $.ajax({
-                                        url: createURL("updateHost"),
-                                        data: data,
-                                        success: function (json) {
-                                            var item = json.updatehostresponse.host;
-                                            args.response.success({
-                                                actionFilter: hostActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.enable.host';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.enable.host';
-                                    }
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            disable: {
-                                label: 'label.disable.host',
-                                action: function (args) {
-                                    var data = {
-                                         id: args.context.hosts[0].id,
-                                         allocationstate: "Disable"
-                                    };
-                                    $.ajax({
-                                        url: createURL("updateHost"),
-                                        data: data,
-                                        success: function (json) {
-                                            var item = json.updatehostresponse.host;
-                                            args.response.success({
-                                                actionFilter: hostActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.disable.host';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.disable.host';
-                                    }
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            'remove': {
-                                label: 'label.action.remove.host',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.action.remove.host';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.remove.host',
-                                    desc: 'message.action.remove.host',
-                                    preFilter: function(args) { //bug to fix: preFilter is not picked up from here
-                                        if (!isAdmin()) {
-                                            args.$form.find('.form-item[rel=isForced]').hide();
-                                        }
-                                    },
-                                    fields: {
-                                        isForced: {
-                                            label: 'force.remove',
-                                            isBoolean: true,
-                                            isHidden: false
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = {
-                                        id: args.context.hosts[0].id
-                                    };
-                                    if(args.$form.find('.form-item[rel=isForced]').css("display") != "none") {
-                                        $.extend(data, {
-                                            forced: (args.data.isForced == "on")
-                                        });
-                                    }
-
-                                    $.ajax({
-                                        url: createURL("deleteHost"),
-                                        data: data,
-                                        success: function (json) {
-                                            //{ "deletehostresponse" : { "success" : "true"}  }
-                                            args.response.success({
-                                                data: {
-                                                }
-                                            });
-
-                                            if (args.context.hosts[0].hypervisor == "XenServer") {
-                                                cloudStack.dialog.notice({ message: _s("The host has been removed. Please eject the host from the XenServer Resource Pool.") })
-                                            }
-                                            else if (args.context.hosts[0].hypervisor == "VMware") {
-                                                cloudStack.dialog.notice({ message: _s("The host has been removed. Please eject the host from the vSphere Cluster.") })
-                                            }
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            blankHAForHost: {
-                                label: '',
-                                action: function (args) {
-                                }
-                            },
-
-                            configureHAForHost: {
-                                label: 'label.ha.configure',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'label.ha.configure';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.ha.configure';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.ha.configure',
-                                    fields: {
-                                        provider: {
-                                            label: 'label.ha.provider',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                $.ajax({
-                                                    url: createURL('listHostHAProviders'),
-                                                    data: {'hypervisor': args.context.hosts[0].hypervisor},
-                                                    dataType: 'json',
-                                                    success: function (json) {
-                                                        var response = json.listhosthaprovidersresponse;
-                                                        var items = [];
-                                                        items.push({
-                                                            id: '',
-                                                            description: _l('')
-                                                        });
-                                                        if (response.haprovider) {
-                                                            $.each(response.haprovider, function (idx, item) {
-                                                                items.push({
-                                                                    id: item.haprovider,
-                                                                    description: item.haprovider
-                                                                });
-                                                            });
-                                                        }
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    },
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = args.data;
-                                    data.hostid = args.context.hosts[0].id;
-                                    $.ajax({
-                                        url: createURL('configureHAForHost'),
-                                        data: data,
-                                        dataType: 'json',
-                                        success: function (json) {
-                                            var jid = json.configurehaforhostresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            enableHA: {
-                                label: 'label.ha.enable',
-                                action: function (args) {
-                                    var data = {
-                                        hostid: args.context.hosts[0].id,
-                                    };
-                                    $.ajax({
-                                        url: createURL("enableHAForHost"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.enablehaforhostresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'label.ha.enable';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.ha.enable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            disableHA: {
-                                label: 'label.ha.disable',
-                                action: function (args) {
-                                    var data = {
-                                        hostid: args.context.hosts[0].id,
-                                    };
-                                    $.ajax({
-                                        url: createURL("disableHAForHost"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.disablehaforhostresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'label.ha.disable';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.ha.disable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            blankOutOfBandManagement: {
-                                label: '',
-                                action: function (args) {
-                                }
-                            },
-
-                            configureOutOfBandManagement: {
-                                label: 'label.outofbandmanagement.configure',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.outofbandmanagement.configure';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.outofbandmanagement.configure';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.outofbandmanagement.configure',
-                                    fields: {
-                                        address: {
-                                            label: 'label.outofbandmanagement.address',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        port: {
-                                            label: 'label.outofbandmanagement.port',
-                                            validation: {
-                                                required: true
-                                            }
-                                        },
-                                        username: {
-                                            label: 'label.outofbandmanagement.username',
-                                            validation: {
-                                                required: false
-                                            }
-                                        },
-                                        password: {
-                                            label: 'label.outofbandmanagement.password',
-                                            isPassword: true,
-                                            validation: {
-                                                required: false
-                                            },
-                                        },
-                                        driver: {
-                                            label: 'label.outofbandmanagement.driver',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                var oobm = args.context.hosts[0].outofbandmanagement;
-                                                if (oobm) {
-                                                    args.$form.find('input[name=address]').val(oobm.address);
-                                                    args.$form.find('input[name=port]').val(oobm.port);
-                                                    args.$form.find('input[name=username]').val(oobm.username);
-
-                                                    args.$form.find('input[name=address]').change(function() {
-                                                        $this.find('input[name=address]').val(oobm.address);
-                                                    });
-                                                }
-
-                                                var items = [];
-                                                items.push({
-                                                    id: 'ipmitool',
-                                                    description: 'ipmitool - ipmitool based shell driver'
-                                                });
-                                                items.push({
-                                                    id: 'nestedcloudstack',
-                                                    description: 'nested-cloudstack - controls host that is a VM in a parent cloudstack (testing purposes only)'
-                                                });
-                                                items.push({
-                                                    id: 'redfish',
-                                                    description: 'redfish - controls host using a redfish java client'
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = args.data;
-                                    data.hostid = args.context.hosts[0].id;
-
-                                    $.ajax({
-                                        url: createURL('configureOutOfBandManagement'),
-                                        data: data,
-                                        dataType: 'json',
-                                        success: function (json) {
-                                            var response = json.configureoutofbandmanagementresponse;
-                                            args.response.success({
-                                                actionFilter: hostActionfilter,
-                                                data: response
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            },
-
-                            enableOutOfBandManagement: {
-                                label: 'label.outofbandmanagement.enable',
-                                action: function (args) {
-                                    var data = {
-                                        hostid: args.context.hosts[0].id,
-                                    };
-                                    $.ajax({
-                                        url: createURL("enableOutOfBandManagementForHost"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.enableoutofbandmanagementforhostresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.outofbandmanagement.enable';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.outofbandmanagement.enable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            disableOutOfBandManagement: {
-                                label: 'label.outofbandmanagement.disable',
-                                action: function (args) {
-                                    var data = {
-                                        hostid: args.context.hosts[0].id,
-                                    };
-                                    $.ajax({
-                                        url: createURL("disableOutOfBandManagementForHost"),
-                                        data: data,
-                                        success: function (json) {
-                                            var jid = json.disableoutofbandmanagementforhostresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.outofbandmanagement.disable';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.outofbandmanagement.disable';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            issueOutOfBandManagementPowerAction: {
-                                label: 'label.outofbandmanagement.action.issue',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.outofbandmanagement.issue';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.outofbandmanagement.issue';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.outofbandmanagement.action.issue',
-                                    desc: function(args) {
-                                          var host = args.context.hosts[0];
-                                          if (host.resourcestate == 'Maintenance' || host.resourcestate == 'PrepareForMaintenance' ||
-                                                host.resourcestate == 'ErrorInPrepareForMaintenance' || host.resourcestate == 'ErrorInMaintenance') {
-                                              return _l('message.outofbandmanagement.action.maintenance');
-                                          }
-                                    },
-                                    fields: {
-                                        action: {
-                                            label: 'label.outofbandmanagement.action',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                var items = [];
-                                                items.push({
-                                                    id: 'ON',
-                                                    description: 'ON - turn on host'
-                                                });
-                                                items.push({
-                                                    id: 'OFF',
-                                                    description: 'OFF - turn off host'
-                                                });
-                                                items.push({
-                                                    id: 'CYCLE',
-                                                    description: 'CYCLE - power cycle the host'
-                                                });
-                                                items.push({
-                                                    id: 'RESET',
-                                                    description: 'RESET - power reset the host'
-                                                });
-                                                items.push({
-                                                    id: 'SOFT',
-                                                    description: 'SOFT - soft shutdown the host using ACPI etc'
-                                                });
-                                                items.push({
-                                                    id: 'STATUS',
-                                                    description: 'STATUS - update power status of the host'
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        },
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = args.data;
-                                    data.hostid = args.context.hosts[0].id;
-                                    $.ajax({
-                                        url: createURL('issueOutOfBandManagementPowerAction'),
-                                        data: data,
-                                        dataType: 'json',
-                                        success: function (json) {
-                                            var jid = json.issueoutofbandmanagementpoweractionresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            changeOutOfBandManagementPassword: {
-                                label: 'label.outofbandmanagement.changepassword',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.outofbandmanagement.changepassword';
-                                    },
-                                    notification: function (args) {
-                                        return 'message.outofbandmanagement.changepassword';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.outofbandmanagement.changepassword',
-                                    fields: {
-                                        password: {
-                                            label: 'label.outofbandmanagement.password',
-                                            isPassword: true,
-                                            validation: {
-                                                required: false
-                                            },
-                                        },
-                                        reenterpassword: {
-                                            label: 'label.outofbandmanagement.reenterpassword',
-                                            isPassword: true,
-                                            validation: {
-                                                required: false
-                                            }
-                                        },
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = args.data;
-                                    if (data.password != data.reenterpassword) {
-                                        args.response.error("Passwords do not match");
-                                        return;
-                                    }
-                                    data.hostid = args.context.hosts[0].id;
-                                    $.ajax({
-                                        url: createURL('changeOutOfBandManagementPassword'),
-                                        data: data,
-                                        dataType: 'json',
-                                        success: function (json) {
-                                            var jid = json.changeoutofbandmanagementpasswordresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getActionFilter: function () {
-                                                        return hostActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function (json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-
-                        },
-                        tabFilter: function (args) {
-                            var hiddenTabs =[];
-                            var host = args.context.hosts[0];
-                            if (host.gpugroup == null) {
-                                hiddenTabs.push("gpu");
-                            }
-                            if (host.outofbandmanagement == null || !host.outofbandmanagement.enabled) {
-                                hiddenTabs.push("outofbandmanagement");
-                            }
-                            if (host.hostha == null || (host.hypervisor != 'KVM' && host.hypervisor != 'Simulator')) {
-                                hiddenTabs.push("ha");
-                            }
-                            return hiddenTabs;
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                preFilter: function (args) {
-                                    var hiddenFields =[];
-                                    $.ajax({
-                                        url: createURL('listConfigurations&name=ha.tag'),
-                                        dataType: 'json',
-                                        async: false,
-                                        success: function (json) {
-                                            if (json.listconfigurationsresponse.configuration == null || json.listconfigurationsresponse.configuration[0].value == null || json.listconfigurationsresponse.configuration[0].value.length == 0) {
-                                                hiddenFields.push('hahost');
-                                            }
-                                        }
-                                    });
-                                    return hiddenFields;
-                                },
-
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    resourcestate: {
-                                        label: 'label.resource.state'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    powerstate: {
-                                        label: 'label.powerstate'
-                                    },
-                                    type: {
-                                        label: 'label.type'
-                                    },
-                                    hypervisor: {
-                                        label: 'label.hypervisor'
-                                    },
-                                    hypervisorversion: {
-                                        label: 'label.hypervisor.version'
-                                    },
-                                    hastate: {
-                                        label: 'label.ha.state'
-                                    },
-                                    haprovider: {
-                                        label: 'label.ha.provider'
-                                    },
-                                    hosttags: {
-                                        label: 'label.host.tags',
-                                        isEditable: true,
-                                        isTokenInput: true,
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL("listHostTags"),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var item = json.listhosttagsresponse.hosttag;
-                                                    var tags = [];
-
-                                                    if (item != null)
-                                                    {
-                                                        tags = $.map(item, function(tag) {
-                                                            return {
-                                                                       id: tag.name,
-                                                                       name: tag.name
-                                                                   };
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: tags,
-                                                        hintText: _l('hint.type.part.host.tag'),
-                                                        noResultsText: _l('hint.no.host.tags')
-                                                    });
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        }
-                                    },
-                                    ueficapability: {
-                                        label:'label.host.ueficapability',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    hahost: {
-                                        label: 'label.ha.enabled',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    oscategoryid: {
-                                        label: 'label.os.preference',
-                                        isEditable: true,
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL("listOsCategories"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var oscategoryObjs = json.listoscategoriesresponse.oscategory;
-                                                    var items =[ {
-                                                        id: '',
-                                                        description: _l('')
-                                                    }];
-                                                    $(oscategoryObjs).each(function () {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    podname: {
-                                        label: 'label.pod'
-                                    },
-                                    clustername: {
-                                        label: 'label.cluster'
-                                    },
-                                    ipaddress: {
-                                        label: 'label.ip.address'
-                                    },
-                                    annotation: {
-                                        label: 'label.annotation',
-                                        isEditable: true
-                                    },
-                                    lastannotated: {
-                                        label: 'label.last.annotated',
-                                        converter: cloudStack.converters.toLocalDate
-                                    },
-                                    username: {
-                                        label: 'label.annotated.by'
-                                    },
-                                    disconnected: {
-                                        label: 'label.last.disconnected'
-                                    },
-                                    cpusockets: {
-                                        label: 'label.number.of.cpu.sockets'
-                                    },
-                                    managementServers: {
-                                        label: 'label.number.of.management.servers'
-                                    }
-                                }, {
-
-                                    isdedicated: {
-                                        label: 'label.dedicated'
-                                    },
-                                    domainid: {
-                                        label: 'label.domain.id'
-                                    }
-                                }],
-
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.listhostsresponse.host[0];
-                                            if (item && item.outofbandmanagement) {
-                                                item.powerstate = item.outofbandmanagement.powerstate;
-                                            }
-
-                                            if (!item.hypervisorversion && item.details && item.details["Host.OS"]) {
-                                                item.hypervisorversion =  item.details["Host.OS"] + " " +  item.details["Host.OS.Version"];
-                                            }
-
-                                            if (item && item.hostha) {
-                                                item.hastate = item.hostha.hastate;
-                                                item.haprovider = item.hostha.haprovider;
-                                                item.haenabled = item.hostha.haenable;
-                                            }
-
-                                            item.annotation = item.annotation;
-                                            item.lastannotated = item.lastannotated;
-                                            item.username = item.username;
-
-                                            $.ajax({
-                                                url: createURL("listDedicatedHosts&hostid=" + args.context.hosts[0].id),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    if (json.listdedicatedhostsresponse.dedicatedhost != undefined) {
-                                                        var hostItem = json.listdedicatedhostsresponse.dedicatedhost[0];
-                                                        if (hostItem.domainid != null) {
-                                                            $.extend(item, {
-                                                                isdedicated: _l('label.yes'),
-                                                                domainid: hostItem.domainid
-                                                            });
-                                                        }
-                                                    } else
-                                                    $.extend(item, {
-                                                        isdedicated: _l('label.no')
-                                                    })
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                                }
-                                            });
-                                            args.response.success({
-                                                actionFilter: hostActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            ha: {
-                                title: 'label.ha',
-                                fields: {
-                                    haenable: {
-                                        label: 'label.ha.enabled',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    hastate: {
-                                        label: 'label.ha.state'
-                                    },
-                                    haprovider: {
-                                        label: 'label.ha.provider'
-                                    },
-                                },
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var host = json.listhostsresponse.host[0];
-                                            var hostha = {};
-                                            if (host && host.hostha) {
-                                                hostha = host.hostha;
-                                            }
-                                            args.response.success({
-                                                data: hostha
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            outofbandmanagement: {
-                                title: 'label.outofbandmanagement',
-                                fields: {
-                                    powerstate: {
-                                        label: 'label.powerstate'
-                                    },
-                                    driver: {
-                                        label: 'label.outofbandmanagement.driver'
-                                    },
-                                    username: {
-                                        label: 'label.outofbandmanagement.username'
-                                    },
-                                    address: {
-                                        label: 'label.outofbandmanagement.address'
-                                    },
-                                    port: {
-                                        label: 'label.outofbandmanagement.port'
-                                    }
-                                },
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var host = json.listhostsresponse.host[0];
-                                            var oobm = {};
-                                            if (host && host.outofbandmanagement) {
-                                                oobm = host.outofbandmanagement;
-                                            }
-                                            args.response.success({
-                                                data: oobm
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            stats: {
-                                title: 'label.statistics',
-                                fields: {
-                                    totalCPU: {
-                                        label: 'label.total.cpu'
-                                    },
-                                    cpuused: {
-                                        label: 'label.cpu.utilized'
-                                    },
-                                    cpuallocated: {
-                                        label: 'label.cpu.allocated.for.VMs'
-                                    },
-                                    memorytotal: {
-                                        label: 'label.memory.total'
-                                    },
-                                    memoryallocated: {
-                                        label: 'label.memory.allocated'
-                                    },
-                                    memoryused: {
-                                        label: 'label.memory.used'
-                                    },
-                                    networkkbsread: {
-                                        label: 'label.network.read'
-                                    },
-                                    networkkbswrite: {
-                                        label: 'label.network.write'
-                                    }
-                                },
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jsonObj = json.listhostsresponse.host[0];
-                                            args.response.success({
-                                                data: {
-                                                    totalCPU: jsonObj.cpunumber + " x " + cloudStack.converters.convertHz(jsonObj.cpuspeed),
-                                                    cpuused: jsonObj.cpuused,
-                                                    cpuallocated: (jsonObj.cpuallocated == null || jsonObj.cpuallocated == 0) ? "N/A": jsonObj.cpuallocated,
-                                                    memorytotal: (jsonObj.memorytotal == null || jsonObj.memorytotal == 0) ? "N/A": cloudStack.converters.convertBytes(jsonObj.memorytotal),
-                                                    memoryallocated: (jsonObj.memoryallocated == null || jsonObj.memoryallocated == 0) ? "N/A": cloudStack.converters.convertBytes(jsonObj.memoryallocated),
-                                                    memoryused: (jsonObj.memoryused == null || jsonObj.memoryused == 0) ? "N/A": cloudStack.converters.convertBytes(jsonObj.memoryused),
-                                                    networkkbsread: (jsonObj.networkkbsread == null) ? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbsread * 1024),
-                                                    networkkbswrite: (jsonObj.networkkbswrite == null) ? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbswrite * 1024)
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-                            gpu: {
-                                title: 'label.gpu',
-                                custom: function (args) {
-                                    var gpugroups = null;
-                                    $.ajax({
-                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var item = json.listhostsresponse.host[0];
-                                            if (item != null && item.gpugroup != null)
-                                                gpugroups = item.gpugroup;
-                                        }
-                                    });
-
-                                    var $tabcontent = $('<div>').addClass('gpugroups');
-
-                                    $(gpugroups).each(function() {
-                                        var gpugroupObj = this;
-
-                                        var $groupcontainer = $('<div>').addClass('gpugroup-container');
-
-                                        //group name
-                                        $groupcontainer.append($('<div>').addClass('title')
-                                                            .append($('<span>').html(gpugroupObj.gpugroupname)));
-                                        //vgpu details
-                                        var $groupdetails = $('<div>').listView({
-                                            context: args.context,
-                                            listView: {
-                                                id: 'gputypes',
-                                                hideToolbar: true,
-                                                fields: {
-                                                    vgputype: {
-                                                        label: 'label.vgpu.type'
-                                                    },
-                                                    maxvgpuperpgpu: {
-                                                        label: 'label.vgpu.max.vgpu.per.gpu',
-                                                        converter: function (args) {
-                                                            return (args == null || args == 0) ? "" : args;
-                                                        }
-                                                    },
-                                                    videoram: {
-                                                        label: 'label.vgpu.video.ram',
-                                                        converter: function (args) {
-                                                            return (args == null || args == 0) ? "" : cloudStack.converters.convertBytes(args);
-                                                        }
-                                                    },
-                                                    maxresolution: {
-                                                        label: 'label.vgpu.max.resolution'
-                                                    },
-                                                    remainingcapacity: {
-                                                        label: 'label.vgpu.remaining.capacity'
-                                                    }
-                                                },
-                                                dataProvider: function (args) {
-                                                    var items;
-
-                                                    if(typeof(gpugroupObj.vgpu) != "undefined") {
-                                                        items = gpugroupObj.vgpu.sort(function(a, b) {
-                                                            return a.maxvgpuperpgpu >= b.maxvgpuperpgpu;
-                                                        });
-                                                    }
-                                                    else {
-                                                        items = gpugroupObj.vgpu;
-                                                    }
-                                                    $(items).each(function () {
-                                                        this.maxresolution = (this.maxresolutionx == null || this.maxresolutionx == 0
-                                                                || this.maxresolutiony == null || this.maxresolutiony == 0)
-                                                                ? "" : this.maxresolutionx + " x " + this.maxresolutiony;
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            }
-                                        });
-                                        $groupcontainer.append($groupdetails);
-                                        $tabcontent.append($groupcontainer);
-                                    });
-                                    return $tabcontent;
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            'primary-storage': {
-                title: 'label.primary.storage',
-                id: 'primarystorages',
-                listView: {
-                    id: 'primarystorages',
-                    section: 'primary-storage',
-                    fields: {
-                        name: {
-                            label: 'label.name',
-                            truncate: true
-                        },
-                        ipaddress: {
-                            label: 'label.server'
-                        },
-                        path: {
-                            label: 'label.path',
-                            truncate: true
-                        },
-                        type: {
-                            label: 'label.type'
-                        },
-                        scope: {
-                            label: 'label.scope'
-                        },
-                        clustername: {
-                            label: 'label.cluster',
-                            truncate: true
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        state: {
-                            label: 'label.state',
-                            converter: function (str) {
-                                // For localization
-                                return str;
-                            },
-                            indicator: {
-                                'Up': 'on',
-                                'Down': 'off',
-                                'Removed': 'off',
-                                'ErrorInMaintenance': 'off',
-                                'ErrorInPrepareForMaintenance': 'warning',
-                                'PrepareForMaintenance': 'warning',
-                                'CancelMaintenance': 'warning',
-                                'Maintenance': 'warning',
-                            }
-                        }
-                    },
-
-                    dataProvider: function (args) {
-                        var array1 =[];
-                        if (args.filterBy != null) {
-                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                switch (args.filterBy.search.by) {
-                                    case "name":
-                                    if (args.filterBy.search.value.length > 0)
-                                    array1.push("&keyword=" + args.filterBy.search.value);
-                                    break;
-                                }
-                            }
-                        }
-                        array1.push("&zoneid=" + args.context.zones[0].id);
-                        if ("pods" in args.context)
-                        array1.push("&podid=" + args.context.pods[0].id);
-                        if ("clusters" in args.context)
-                        array1.push("&clusterid=" + args.context.clusters[0].id);
-                        $.ajax({
-                            url: createURL("listStoragePools&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                            dataType: "json",
-                            async: true,
-                            success: function (json) {
-                                var items = json.liststoragepoolsresponse.storagepool;
-                                args.response.success({
-                                    actionFilter: primarystorageActionfilter,
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.primary.storage',
-
-                            createForm: {
-                                title: 'label.add.primary.storage',
-                                fields: {
-                                    scope: {
-                                        label: 'label.scope',
-                                        select: function (args) {
-                                            var scope =[ {
-                                                id: 'cluster',
-                                                description: _l('label.cluster')
-                                            },
-                                            {
-                                                id: 'zone',
-                                                description: _l('label.zone.wide')
-                                            }
-                                            // { id: 'host', description: _l('label.host') }
-                                            ];
-
-                                            args.response.success({
-                                                data: scope
-                                            });
-
-                                            args.$select.change(function () {
-                                                var $form = $(this).closest('form');
-                                                var scope = $(this).val();
-
-                                                if (scope == 'zone') {
-                                                    $form.find('.form-item[rel=podId]').hide();
-                                                    $form.find('.form-item[rel=clusterId]').hide();
-                                                    $form.find('.form-item[rel=hostId]').hide();
-                                                    $form.find('.form-item[rel=hypervisor]').css('display', 'inline-block');
-                                                } else if (scope == 'cluster') {
-
-                                                    $form.find('.form-item[rel=hostId]').hide();
-                                                    $form.find('.form-item[rel=podId]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=clusterId]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=hypervisor]').hide();
-                                                } else if (scope == 'host') {
-                                                    $form.find('.form-item[rel=podId]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=clusterId]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=hostId]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=hypervisor]').hide();
-                                                }
-                                            })
-                                        }
-                                    },
-
-
-                                    hypervisor: {
-                                        label: 'label.hypervisor',
-                                        isHidden: true,
-                                        select: function (args) {
-                                            var items =[];
-                                            items.push({
-                                                id: 'KVM',
-                                                description: _l('KVM')
-                                            });
-                                            items.push({
-                                                id: 'VMware',
-                                                description: _l('VMware')
-                                            });
-                                            items.push({
-                                                id: 'Hyperv',
-                                                description: _l('Hyperv')
-                                            });
-                                            items.push({
-                                                id: 'Any',
-                                                description: _l('Any')
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    zoneid: {
-                                        label: 'label.zone',
-                                        docID: 'helpPrimaryStorageZone',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function (args) {
-                                            var data = args.context.zones ? {
-                                                id: args.context.zones[0].id
-                                            }: {};
-
-                                            $.ajax({
-                                                url: createURL('listZones'),
-                                                data: data,
-                                                success: function (json) {
-                                                    var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
-
-                                                    args.response.success({
-                                                        data: $.map(zones, function (zone) {
-                                                            return {
-                                                                id: zone.id,
-                                                                description: zone.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-                                    podId: {
-                                        label: 'label.pod',
-                                        dependsOn: 'zoneid',
-                                        docID: 'helpPrimaryStoragePod',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL("listPods&zoneid=" + args.zoneid),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var pods = json.listpodsresponse.pod;
-                                                    var items =[];
-                                                    $(pods).each(function () {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    clusterId: {
-                                        label: 'label.cluster',
-                                        docID: 'helpPrimaryStorageCluster',
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'podId',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL("listClusters&podid=" + args.podId),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function (json) {
-                                                    clusterObjs = json.listclustersresponse.cluster;
-                                                    var items =[];
-                                                    $(clusterObjs).each(function () {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        actionFilter: clusterActionfilter,
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    hostId: {
-                                        label: 'label.host',
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'clusterId',
-                                        select: function (args) {
-                                            $.ajax({
-                                                url: createURL('listHosts'),
-                                                data: {
-                                                    clusterid: args.clusterId
-                                                },
-                                                success: function (json) {
-                                                    var hosts = json.listhostsresponse.host ?
-                                                    json.listhostsresponse.host:[]
-                                                    args.response.success({
-                                                        data: $.map(hosts, function (host) {
-                                                            return {
-                                                                id: host.id,
-                                                                description: host.name
-                                                            }
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpPrimaryStorageName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    protocol: {
-                                        label: 'label.protocol',
-                                        docID: 'helpPrimaryStorageProtocol',
-                                        validation: {
-                                            required: true
-                                        },
-                                        dependsOn: 'clusterId',
-                                        select: function (args) {
-                                            var clusterId = args.clusterId;
-                                            if (clusterId == null || clusterId.length == 0) {
-                                                args.response.success({
-                                                    data: []
-                                                });
-                                            return;
-                                            }
-
-                                            $(clusterObjs).each(function () {
-                                                if (this.id == clusterId) {
-                                                    selectedClusterObj = this;
-                                                    return false; //break the $.each() loop
-                                                }
-                                            });
-
-                                            if (selectedClusterObj.hypervisortype == "KVM") {
-                                                var items =[];
-                                                items.push({
-                                                    id: "nfs",
-                                                    description: "nfs"
-                                                });
-                                                items.push({
-                                                    id: "SharedMountPoint",
-                                                    description: "SharedMountPoint"
-                                                });
-                                                items.push({
-                                                    id: "rbd",
-                                                    description: "RBD"
-                                                });
-                                                items.push({
-                                                    id: "clvm",
-                                                    description: "CLVM"
-                                                });
-                                                items.push({
-                                                    id: "gluster",
-                                                    description: "Gluster"
-                                                });
-                                                items.push({
-                                                    id: "custom",
-                                                    description: "custom"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            } else if (selectedClusterObj.hypervisortype == "XenServer") {
-                                                var items =[];
-                                                items.push({
-                                                    id: "nfs",
-                                                    description: "nfs"
-                                                });
-                                                items.push({
-                                                    id: "PreSetup",
-                                                    description: "PreSetup"
-                                                });
-                                                items.push({
-                                                    id: "iscsi",
-                                                    description: "iscsi"
-                                                });
-                                                items.push({
-                                                    id: "custom",
-                                                    description: "custom"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            } else if (selectedClusterObj.hypervisortype == "VMware") {
-                                                var items =[];
-                                                items.push({
-                                                    id: "nfs",
-                                                    description: "nfs"
-                                                });
-                                                items.push({
-                                                    id: "presetup",
-                                                    description: "presetup"
-                                                });
-                                                items.push({
-                                                    id: "custom",
-                                                    description: "custom"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            } else if (selectedClusterObj.hypervisortype == "Hyperv") {
-                                                var items =[];
-                                                items.push({
-                                                    id: "SMB",
-                                                    description: "SMB/CIFS"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            } else if (selectedClusterObj.hypervisortype == "Ovm") {
-                                                var items =[];
-                                                items.push({
-                                                    id: "nfs",
-                                                    description: "nfs"
-                                                });
-                                                items.push({
-                                                    id: "ocfs2",
-                                                    description: "ocfs2"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            } else if (selectedClusterObj.hypervisortype == "LXC") {
-                                                var items =[];
-                                                items.push({
-                                                    id: "nfs",
-                                                    description: "nfs"
-                                                });
-                                                items.push({
-                                                    id: "SharedMountPoint",
-                                                    description: "SharedMountPoint"
-                                                });
-                                                items.push({
-                                                    id: "rbd",
-                                                    description: "RBD"
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            // 3.3.2 has ceph/ocfs2/iscsi etc
-                                            } else if (selectedClusterObj.hypervisortype == "Ovm3") {
-                                                var items =[];
-                                                items.push({
-                                                    id: "nfs",
-                                                    description: "nfs"
-                                                });
-                                            } else {
-                                                args.response.success({
-                                                    data:[]
-                                                });
-                                            }
-
-                                            args.$select.change(function () {
-                                                var $form = $(this).closest('form');
-
-                                                var protocol = $(this).val();
-                                                if (protocol == null)
-                                                return;
-
-
-                                                if (protocol == "nfs") {
-                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
-
-                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
-                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
-                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "SMB") {
-                                                    //"SMB" show almost the same fields as "nfs" does, except 3 more SMB-specific fields.
-                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
-
-                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
-                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
-                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
-
-                                                    $form.find('.form-item[rel=smbUsername]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=smbPassword]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=smbDomain]').css('display', 'inline-block');
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "ocfs2") {
-                                                    //ocfs2 is the same as nfs, except no server field.
-                                                    $form.find('.form-item[rel=server]').hide();
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
-
-                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
-                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
-                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") {
-                                                    $form.find('.form-item[rel=server]').hide();
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
-
-                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
-                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
-                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("SR Name-Label:").prepend($required);
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "custom") {
-                                                    $form.find('.form-item[rel=server]').hide();
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
-
-                                                    $form.find('.form-item[rel=path]').hide();
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "iscsi") {
-                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
-
-                                                    $form.find('.form-item[rel=path]').hide();
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=lun]').css('display', 'inline-block');
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if ($(this).val() == "clvm") {
-                                                    $form.find('.form-item[rel=server]').hide();
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
-
-                                                    $form.find('.form-item[rel=path]').hide();
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').css('display', 'inline-block');
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") {
-                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
-
-                                                    $form.find('.form-item[rel=path]').hide();
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=vCenterDataStore]').css('display', 'inline-block');
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "SharedMountPoint") {
-                                                    //"SharedMountPoint" show the same fields as "nfs" does.
-                                                    $form.find('.form-item[rel=server]').hide();
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
-
-                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
-                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
-                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "rbd") {
-                                                    $form.find('.form-item[rel=rbdmonitor]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=rbdmonitor]').find(".name").find("label").text("RADOS Monitor:");
-
-                                                    $form.find('.form-item[rel=rbdpool]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=rbdpool]').find(".name").find("label").text("RADOS Pool:");
-
-                                                    $form.find('.form-item[rel=rbdid]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=rbdid]').find(".name").find("label").text("RADOS User:");
-
-                                                    $form.find('.form-item[rel=rbdsecret]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=rbdsecret]').find(".name").find("label").text("RADOS Secret:");
-
-                                                    $form.find('.form-item[rel=server]').hide();
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-                                                    $form.find('.form-item[rel=path]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                } else if (protocol == "gluster") {
-                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input");
-
-                                                    $form.find('.form-item[rel=glustervolume]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=glustervolume]').find(".name").find("label").text("Volume:");
-
-                                                    $form.find('.form-item[rel=path]').hide();
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-                                                } else {
-                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
-
-                                                    $form.find('.form-item[rel=iqn]').hide();
-                                                    $form.find('.form-item[rel=lun]').hide();
-
-                                                    $form.find('.form-item[rel=volumegroup]').hide();
-
-                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
-                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
-
-                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
-                                                    $form.find('.form-item[rel=rbdpool]').hide();
-                                                    $form.find('.form-item[rel=rbdid]').hide();
-                                                    $form.find('.form-item[rel=rbdsecret]').hide();
-
-                                                    $form.find('.form-item[rel=smbUsername]').hide();
-                                                    $form.find('.form-item[rel=smbPassword]').hide();
-                                                    $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                    $form.find('.form-item[rel=glustervolume]').hide();
-                                                }
-                                            });
-
-                                            args.$select.trigger("change");
-                                        }
-                                    },
-                                    //always appear (end)
-
-                                    server: {
-                                        label: 'label.server',
-                                        docID: 'helpPrimaryStorageServer',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    //nfs
-                                    path: {
-                                        label: 'label.path',
-                                        docID: 'helpPrimaryStoragePath',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    provider: {
-                                        label: 'label.provider',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function (args) {
-                                            var data = args.context.providers ?
-                                                { id: args.context.providers[0].id } :
-                                                {};
-
-                                            $.ajax({
-                                                url: createURL('listStorageProviders'),
-                                                data: {
-                                                    type: 'primary'
-                                                },
-                                                success: function (json) {
-                                                    var providers = json.liststorageprovidersresponse.dataStoreProvider ? json.liststorageprovidersresponse.dataStoreProvider : [];
-
-                                                    args.response.success({
-                                                        data: $.map(providers, function (provider) {
-                                                            return {
-                                                                id: provider.name,
-                                                                description: provider.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                            args.$select.change(function () {
-                                                var $form = $(this).closest('form');
-                                                var scope = $(this).val();
-
-                                                if (scope == 'DefaultPrimary') {
-                                                    $form.find('.form-item[rel=isManaged]').hide();
-                                                    $form.find('.form-item[rel=capacityIops]').hide();
-                                                    $form.find('.form-item[rel=capacityBytes]').hide();
-                                                    $form.find('.form-item[rel=url]').hide();
-                                                } else {
-                                                    $form.find('.form-item[rel=isManaged]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=capacityIops]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=capacityBytes]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=url]').css('display', 'inline-block');
-                                                }
-                                            }
-                                        )
-                                    }},
-                                    isManaged: {
-                                        label: 'label.managed',
-                                        docID: 'helpManaged',
-                                        isBoolean: true,
-                                        isChecked: false,
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-                                    capacityBytes: {
-                                        label: 'label.capacity.bytes',
-                                        docID: 'helpCapacityBytes',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-                                    capacityIops: {
-                                        label: 'label.capacity.iops',
-                                        docID: 'helpCapacityIops',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-                                    url: {
-                                        label: 'label.url',
-                                        docID: 'helpUrl',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-                                    //SMB
-                                    smbUsername: {
-                                        label: 'label.smb.username',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    smbPassword: {
-                                        label: 'label.smb.password',
-                                        isPassword: true,
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    smbDomain: {
-                                        label: 'label.smb.domain',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    //iscsi
-                                    iqn: {
-                                        label: 'label.target.iqn',
-                                        docID: 'helpPrimaryStorageTargetIQN',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    lun: {
-                                        label: 'label.LUN.number',
-                                        docID: 'helpPrimaryStorageLun',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    //clvm
-                                    volumegroup: {
-                                        label: 'label.volgroup',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    //vmfs
-                                    vCenterDataCenter: {
-                                        label: 'label.vcenter.datacenter',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    vCenterDataStore: {
-                                        label: 'label.vcenter.datastore',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    // RBD
-                                    rbdmonitor: {
-                                        label: 'label.rbd.monitor',
-                                        docID: 'helpPrimaryStorageRBDMonitor',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    rbdpool: {
-                                        label: 'label.rbd.pool',
-                                        docID: 'helpPrimaryStorageRBDPool',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-                                    rbdid: {
-                                        label: 'label.rbd.id',
-                                        docID: 'helpPrimaryStorageRBDId',
-                                        validation: {
-                                            required: false
-                                        },
-                                        isHidden: true
-                                    },
-                                    rbdsecret: {
-                                        label: 'label.rbd.secret',
-                                        docID: 'helpPrimaryStorageRBDSecret',
-                                        validation: {
-                                            required: false
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    //gluster
-                                    glustervolume: {
-                                        label: 'label.gluster.volume',
-                                        validation: {
-                                            required: true
-                                        },
-                                        isHidden: true
-                                    },
-
-                                    //always appear (begin)
-                                    storageTags: {
-                                        label: 'label.storage.tags',
-                                        docID: 'helpPrimaryStorageTags',
-                                        isTokenInput: true,
-                                        validation: {
-                                            required: false
-                                        },
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL("listStorageTags"),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var item = json.liststoragetagsresponse.storagetag;
-                                                    var tags = [];
-
-                                                    if (item != null)
-                                                    {
-                                                        tags = $.map(item, function(tag) {
-                                                            return {
-                                                                       id: tag.name,
-                                                                       name: tag.name
-                                                                   };
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: tags,
-                                                        hintText: _l('hint.type.part.storage.tag'),
-                                                        noResultsText: _l('hint.no.storage.tags')
-                                                    });
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        }
-                                    }
-                                    //always appear (end)
-                                }
-                            },
-
-                            /******************************/
-                            action: function (args) {
-                                var array1 =[];
-                                array1.push("&scope=" + encodeURIComponent(args.data.scope));
-
-                                array1.push("&zoneid=" + args.data.zoneid);
-
-                                if (args.data.scope == 'zone') {
-
-                                    array1.push("&hypervisor=" + args.data.hypervisor);
-                                }
-
-                                if (args.data.scope == 'cluster') {
-
-                                    array1.push("&podid=" + args.data.podId);
-                                    array1.push("&clusterid=" + args.data.clusterId);
-                                }
-
-                                if (args.data.scope == 'host') {
-                                    array1.push("&podid=" + args.data.podId);
-                                    array1.push("&clusterid=" + args.data.clusterId);
-                                    array1.push("&hostid=" + args.data.hostId);
-                                }
-
-                                array1.push("&name=" + encodeURIComponent(args.data.name));
-
-                                array1.push("&provider=" + encodeURIComponent(args.data.provider));
-
-                                if (args.data.provider == "DefaultPrimary")
-                                {
-                                    var server = args.data.server;
-                                    var url = null;
-                                    if (args.data.protocol == "nfs") {
-                                        var path = args.data.path;
-                                        if (path.substring(0, 1) != "/")
-                                            path = "/" + path;
-                                        url = nfsURL(server, path);
-                                    } else if (args.data.protocol == "SMB") {
-                                        var path = args.data.path;
-                                        if (path.substring(0, 1) != "/")
-                                            path = "/" + path;
-                                        url = smbURL(server, path);
-                                        array1.push("&details[0].user=" + args.data.smbUsername);
-                                        array1.push("&details[1].password=" + encodeURIComponent(args.data.smbPassword));
-                                        array1.push("&details[2].domain=" + args.data.smbDomain);
-                                    } else if (args.data.protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") {
-                                        var path = args.data.path;
-                                        if (path.substring(0, 1) != "/")
-                                            path = "/" + path;
-                                        url = presetupURL(server, path);
-                                    } else if (args.data.protocol == "ocfs2") {
-                                        var path = args.data.path;
-                                        if (path.substring(0, 1) != "/")
-                                            path = "/" + path;
-                                        url = ocfs2URL(server, path);
-                                    } else if (args.data.protocol == "SharedMountPoint") {
-                                        var path = args.data.path;
-                                        if (path.substring(0, 1) != "/")
-                                            path = "/" + path;
-                                        url = SharedMountPointURL(server, path);
-                                    } else if (args.data.protocol == "clvm") {
-                                        var vg = args.data.volumegroup;
-                                        if (vg.substring(0, 1) != "/")
-                                            vg = "/" + vg;
-                                        url = clvmURL(vg);
-                                    } else if (args.data.protocol == "rbd") {
-                                        var rbdmonitor = args.data.rbdmonitor;
-                                        var rbdpool = args.data.rbdpool;
-                                        var rbdid = args.data.rbdid;
-                                        var rbdsecret = args.data.rbdsecret;
-                                        url = rbdURL(rbdmonitor, rbdpool, rbdid, rbdsecret);
-                                    } else if (args.data.protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") {
-                                        var path = args.data.vCenterDataCenter;
-                                        if (path.substring(0, 1) != "/")
-                                            path = "/" + path;
-                                        path += "/" + args.data.vCenterDataStore;
-                                        url = presetupURL("dummy", path);
-                                    } else if (args.data.protocol == "gluster") {
-                                        var glustervolume = args.data.glustervolume;
-
-                                        if (glustervolume.substring(0, 1) != "/")
-                                            glustervolume = "/" + glustervolume;
-                                        url = glusterURL(server, glustervolume);
-                                    } else if (args.data.protocol == "iscsi") {
-                                        var iqn = args.data.iqn;
-                                        if (iqn.substring(0, 1) != "/")
-                                            iqn = "/" + iqn;
-                                        var lun = args.data.lun;
-                                        url = iscsiURL(server, iqn, lun);
-                                    } else {
-                                        url = "";
-                                    }
-
-                                    array1.push("&url=" + encodeURIComponent(url));
-                                }
-                                else
-                                {
-                                    array1.push("&managed=" + (args.data.isManaged == "on").toString());
-
-                                    if (args.data.capacityBytes != null && args.data.capacityBytes.length > 0)
-                                    {
-                                        array1.push("&capacityBytes=" + args.data.capacityBytes.split(",").join(""));
-                                    }
-
-                                    if (args.data.capacityIops != null && args.data.capacityIops.length > 0)
-                                    {
-                                        array1.push("&capacityIops=" + args.data.capacityIops.split(",").join(""));
-                                    }
-
-                                    if (args.data.url != null && args.data.url.length > 0)
-                                    {
-                                        array1.push("&url=" + encodeURIComponent(args.data.url));
-                                    }
-                                }
-
-                                if (args.data.storageTags != null && args.data.storageTags.length > 0)
-                                {
-                                    array1.push("&tags=" + encodeURIComponent(args.data.storageTags));
-                                }
-
-                                if ("custom" in args.response) {
-                                    args.response.custom(array1);
-                                    return;
-                                }
-
-                                $.ajax({
-                                    url: createURL("createStoragePool" + array1.join("")),
-                                    dataType: "json",
-                                    success: function (json) {
-                                        var item = json.createstoragepoolresponse.storagepool;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function (XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function (args) {
-                                    args.complete({
-                                        actionFilter: primarystorageActionfilter
-                                    });
-                                }
-                            },
-
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.primary.storage';
-                                }
-                            }
-                        },
-                        viewMetrics: {
-                            label: 'label.metrics',
-                            isHeader: true,
-                            addRow: false,
-                            action: {
-                                custom: cloudStack.uiCustom.metricsView({resource: 'storagepool'})
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.metrics';
-                                }
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        name: "Primary storage details",
-                        viewAll: {
-                            label: 'label.volumes',
-                            path: 'storage.volumes'
-                        },
-                        isMaximized: true,
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function (args) {
-                                    var array1 =[];
-                                    array1.push("&tags=" + encodeURIComponent(args.data.tags));
-
-                                    if (args.data.disksizetotal != null && args.data.disksizetotal.length > 0) {
-                                        var diskSizeTotal = args.data.disksizetotal.split(",").join("");
-
-                                        array1.push("&capacitybytes=" + cloudStack.converters.toBytes(diskSizeTotal));
-                                    }
-
-                                    if (args.data.capacityiops != null && args.data.capacityiops.length > 0) {
-                                        var capacityIops = args.data.capacityiops.split(",").join("");
-
-                                        array1.push("&capacityiops=" + capacityIops);
-                                    }
-
-                                    if (args.data.name != null && args.data.name.length > 0)
-                                        array1.push("&name=" + args.data.name);
-
-                                    $.ajax({
-                                        url: createURL("updateStoragePool&id=" + args.context.primarystorages[0].id + array1.join("")),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var item = json.updatestoragepoolresponse.storagepool;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        },
-                                        error: function (XMLHttpResponse) {
-                                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                                        }
-                                    });
-                                }
-                            },
-
-                            enableMaintenanceMode: {
-                                label: 'label.action.enable.maintenance.mode',
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("enableStorageMaintenance&id=" + args.context.primarystorages[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.prepareprimarystorageformaintenanceresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.storagepool;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return primarystorageActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.primarystorage.enable.maintenance.mode';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.enable.maintenance.mode';
-                                    }
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            cancelMaintenanceMode: {
-                                label: 'label.action.cancel.maintenance.mode',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.action.cancel.maintenance.mode';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.action.cancel.maintenance.mode';
-                                    }
-                                },
-                                action: function (args) {
-                                    $.ajax({
-                                        url: createURL("cancelStorageMaintenance&id=" + args.context.primarystorages[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var jid = json.cancelprimarystoragemaintenanceresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function (json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.storagepool;
-                                                    },
-                                                    getActionFilter: function () {
-                                                        return primarystorageActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            'remove': {
-                                label: 'label.action.delete.primary.storage',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.action.delete.primary.storage';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.action.delete.primary.storage',
-                                    fields: {
-                                        isForced: {
-                                            label: 'force.remove',
-                                            isBoolean: true
-                                        }
-                                    }
-                                },
-                                action: function (args) {
-                                    var array1 =[];
-                                    array1.push("&forced=" + (args.data.isForced == "on"));
-                                    $.ajax({
-                                        url: createURL("deleteStoragePool&id=" + args.context.primarystorages[0].id + array1.join("")),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            args.response.success({
-                                                data: {
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    state: {
-                                        label: 'label.state'
-                                    },
-                                    tags: {
-                                        label: 'label.storage.tags',
-                                        isTokenInput : true,
-                                        isEditable: true,
-                                        dataProvider: function(args) {
-                                            $.ajax({
-                                                url: createURL("listStorageTags"),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var item = json.liststoragetagsresponse.storagetag;
-                                                    var tags = [];
-
-                                                    if (item != null)
-                                                    {
-                                                        tags = $.map(item, function(tag) {
-                                                            return {
-                                                                       id: tag.name,
-                                                                       name: tag.name
-                                                                   };
-                                                        });
-                                                    }
-
-                                                    args.response.success({
-                                                        data: tags,
-                                                        hintText: _l('hint.type.part.storage.tag'),
-                                                        noResultsText: _l('hint.no.storage.tags')
-                                                    });
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        }
-                                    },
-                                    zonename: {
-                                        label: 'label.zone'
-                                    },
-                                    podname: {
-                                        label: 'label.pod'
-                                    },
-                                    clustername: {
-                                        label: 'label.cluster'
-                                    },
-                                    type: {
-                                        label: 'label.type'
-                                    },
-                                    ipaddress: {
-                                        label: 'label.ip.address'
-                                    },
-                                    path: {
-                                        label: 'label.path'
-                                    },
-                                    disksizetotal: {
-                                        label: 'label.disk.total',
-                                        isEditable: true,
-                                        converter: function (args) {
-                                            if (args == null || args == 0)
-                                            return ""; else
-                                            return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    disksizeallocated: {
-                                        label: 'label.disk.allocated',
-                                        converter: function (args) {
-                                            if (args == null || args == 0)
-                                            return ""; else
-                                            return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    capacityiops: {
-                                        label: 'label.disk.iops.total',
-                                        isEditable: true,
-                                        converter: function (args) {
-                                            if (args == null || args == 0)
-                                            return ""; else
-                                            return args;
-                                        }
-                                    },
-                                    allocatediops: {
-                                        label: 'label.disk.iops.allocated',
-                                        isEditable: false,
-                                        converter: function (args) {
-                                            if (args == null || args == 0)
-                                            return ""; else
-                                            return args;
-                                        }
-                                    }
-                                }],
-
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL("listStoragePools&id=" + args.context.primarystorages[0].id),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function (json) {
-                                            var item = json.liststoragepoolsresponse.storagepool[0];
-                                            args.response.success({
-                                                actionFilter: primarystorageActionfilter,
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            // Granular settings for storage pool
-                            settings: {
-                                title: 'label.settings',
-                                custom: cloudStack.uiCustom.granularSettings({
-                                    dataProvider: function (args) {
-
-                                        $.ajax({
-                                            url: createURL('listConfigurations&storageid=' + args.context.primarystorages[0].id),
-                                            data: listViewDataProvider(args, {
-                                            },
-                                            {
-                                                searchBy: 'name'
-                                            }),
-                                            success: function (json) {
-                                                args.response.success({
-                                                    data: json.listconfigurationsresponse.configuration
-                                                });
-                                            },
-
-                                            error: function (json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    },
-                                    actions: {
-                                        edit: function (args) {
-                                            // call updateStorageLevelParameters
-                                            var data = {
-                                                name: args.data.jsonObj.name,
-                                                value: args.data.value
-                                            };
-
-                                            $.ajax({
-                                                url: createURL('updateConfiguration&storageid=' + args.context.primarystorages[0].id),
-                                                data: data,
-                                                success: function (json) {
-                                                    var item = json.updateconfigurationresponse.configuration;
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                },
-
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        }
-                                    }
-                                })
-                            }
-                        }
-                    }
-                }
-            },
-
-            ucs: {
-                title: 'UCS',
-                id: 'ucs',
-                listView: {
-                    id: 'ucsManagers',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        url: {
-                            label: 'label.url'
-                        }
-                    },
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL('listUcsManagers'),
-                            data: {
-                                zoneid: args.context.physicalResources[0].id
-                            },
-                            success: function (json) {
-                                //for testing only (begin)
-                                /*
-                                json =
-                                {
-                                "listucsmanagerreponse": {
-                                "count": 1,
-                                "ucsmanager": [
-                                {
-                                "id": "07b5b813-83ed-4859-952c-c95cafb63ac4",
-                                "name": "ucsmanager",
-                                "url": "10.223.184.2",
-                                "zoneid": "54c9a65c-ba89-4380-96e9-1d429c5372e3"
-                                }
-                                ]
-                                }
-                                };
-                                 */
-                                //for testing only (end)
-
-                                var items = json.listucsmanagerreponse.ucsmanager;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.ucs.manager',
-
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.ucs.manager';
-                                }
-                            },
-
-                            createForm: {
-                                title: 'label.add.ucs.manager',
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-                                    url: {
-                                        label: 'label.ip', //CLOUDSTACK-4629
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    username: {
-                                        label: 'label.username',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    password: {
-                                        label: 'label.password',
-                                        isPassword: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-
-                            action: function (args) {
-                                var data = {
-                                    zoneid: args.context.physicalResources[0].id,
-                                    url: args.data.url,
-                                    username: args.data.username,
-                                    password: args.data.password
-                                };
-                                if (args.data.name != null && args.data.name.length > 0) {
-                                    $.extend(data, {
-                                        name: args.data.name
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('addUcsManager'),
-                                    data: data,
-                                    type: "POST",
-                                    success: function (json) {
-                                        //e.g. json == { "addUcsManagerResponse" :  { "ucsmanager" : {"id":"11","name":"ucsmanager","url":"10.223.184.2","zoneid":"2"} }  }
-                                        var item = json.addUcsManagerResponse.ucsmanager;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function (data) {
-                                        args.response.error(parseXMLHttpResponse(data));
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function (args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        isMaximized: true,
-                        noCompact: true,
-                        actions: {
-                            remove: {
-                                label: 'label.delete.ucs.manager',
-                                messages: {
-                                    confirm: function (args) {
-                                        return 'message.confirm.delete.ucs.manager';
-                                    },
-                                    notification: function (args) {
-                                        return 'label.delete.ucs.manager';
-                                    }
-                                },
-                                action: function (args) {
-                                    var data = {
-                                        ucsmanagerid: args.context.ucsManagers[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteUcsManager'),
-                                        data: data,
-                                        success: function (json) {
-                                            args.response.success();
-                                        },
-                                        error: function (data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: function (args) {
-                                        args.complete();
-                                    }
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields:[ {
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                },
-                                {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    url: {
-                                        label: 'label.url'
-                                    }
-                                }],
-
-                                dataProvider: function (args) {
-                                    $.ajax({
-                                        url: createURL('listUcsManagers'),
-                                        data: {
-                                            id: args.context.ucsManagers[0].id
-                                        },
-                                        success: function (json) {
-                                            //for testing only (begin)
-                                            /*
-                                            json =
-                                            {
-                                            "listucsmanagerreponse": {
-                                            "count": 1,
-                                            "ucsmanager": [
-                                            {
-                                            "id": "07b5b813-83ed-4859-952c-c95cafb63ac4",
-                                            "name": "ucsmanager",
-                                            "url": "10.223.184.2",
-                                            "zoneid": "54c9a65c-ba89-4380-96e9-1d429c5372e3"
-                                            }
-                                            ]
-                                            }
-                                            };
-                                             */
-                                            //for testing only (end)
-
-                                            var item = json.listucsmanagerreponse.ucsmanager[0];
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            blades: {
-                                title: 'label.blades',
-                                listView: {
-                                    id: 'blades',
-                                    hideSearchBar: true,
-                                    fields: {
-                                        chassis: {
-                                            label: 'label.chassis'
-                                        },
-                                        bladeid: {
-                                            label: 'label.blade.id'
-                                        },
-                                        profiledn: {
-                                            label: 'label.associated.profile'
-                                        }
-                                    },
-                                    dataProvider: function (args) {
-                                        $.ajax({
-                                            url: createURL('listUcsBlades'),
-                                            data: {
-                                                ucsmanagerid: args.context.ucsManagers[0].id
-                                            },
-                                            success: function (json) {
-                                                //for testing only (begin)
-                                                /*
-                                                json = {
-                                                "listucsbladeresponse": {
-                                                "count": 4,
-                                                "ucsblade": [
-                                                {
-                                                "id": "84edb958-cf8a-4e71-99c6-190ccc3fe2bd",
-                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
-                                                "bladedn": "sys/chassis-1/blade-1",
-                                                "profiledn": "org-root/ls-profile-for-blade-1"
-                                                },
-                                                {
-                                                "id": "524a3e55-5b61-4561-9464-1b19e3543189",
-                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
-                                                "bladedn": "sys/chassis-1/blade-2",
-                                                "profiledn": "org-root/ls-profile-for-blade-2"
-                                                },
-                                                {
-                                                "id": "4828f560-6191-46e6-8a4c-23d1d7d017f0",
-                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
-                                                "bladedn": "sys/chassis-1/blade-3"
-                                                },
-                                                {
-                                                "id": "80ab25c8-3dcf-400e-8849-84dc5e1e6594",
-                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
-                                                "bladedn": "sys/chassis-1/blade-4"
-                                                }
-                                                ]
-                                                }
-                                                };
-                                                 */
-                                                //for testing only (end)
-
-                                                var items = json.listucsbladeresponse.ucsblade ? json.listucsbladeresponse.ucsblade:[];
-                                                for (var i = 0; i < items.length; i++) {
-                                                    addExtraPropertiesToUcsBladeObject(items[i]);
-                                                }
-                                                args.response.success({
-                                                    actionFilter: bladeActionfilter,
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    },
-                                    actions: {
-                                        refreshUcsBlades: {
-                                            isHeader: true,
-                                            label: 'label.refresh.blades',
-                                            messages: {
-                                                confirm: function (args) {
-                                                    return 'message.confirm.refresh.blades';
-                                                },
-                                                notification: function (args) {
-                                                    return 'label.refresh.blades';
-                                                }
-                                            },
-                                            action: function (args) {
-                                                $.ajax({
-                                                    url: createURL('refreshUcsBlades'),
-                                                    data: {
-                                                        ucsmanagerid: args.context.ucsManagers[0].id
-                                                    },
-                                                    success: function (json) {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                });
-                                            },
-                                            notification: {
-                                                poll: function (args) {
-                                                    args.complete();
-                                                }
-                                            }
-                                        },
-
-                                        associateTemplateToBlade: {
-                                            label: 'label.instanciate.template.associate.profile.blade',
-                                            addRow: 'false',
-                                            messages: {
-                                                notification: function (args) {
-                                                    return 'label.instanciate.template.associate.profile.blade';
-                                                }
-                                            },
-                                            createForm: {
-                                                title: 'label.instanciate.template.associate.profile.blade',
-                                                fields: {
-                                                    templatedn: {
-                                                        label: 'label.select.template',
-                                                        select: function (args) {
-                                                            var items =[];
-
-                                                            $.ajax({
-                                                                url: createURL('listUcsTemplates'),
-                                                                data: {
-                                                                    ucsmanagerid: args.context.ucsManagers[0].id
-                                                                },
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    //for testing only (begin)
-                                                                    /*
-                                                                    json = {
-                                                                    "listucstemplatesresponse": {
-                                                                    "count": 1,
-                                                                    "ucstemplate": [
-                                                                    {
-                                                                    "ucsdn": "org-root/ls-test"
-                                                                    }
-                                                                    ]
-                                                                    }
-                                                                    };
-                                                                     */
-                                                                    //for testing only (end)
-
-                                                                    var ucstemplates = json.listucstemplatesresponse.ucstemplate;
-                                                                    if (ucstemplates != null) {
-                                                                        for (var i = 0; i < ucstemplates.length; i++) {
-                                                                            items.push({
-                                                                                id: ucstemplates[i].ucsdn,
-                                                                                description: ucstemplates[i].ucsdn
-                                                                            });
-                                                                        }
-                                                                    }
-                                                                }
-                                                            });
-
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        },
-                                                        validation: {
-                                                            required: true
-                                                        }
-                                                    },
-                                                    profilename: {
-                                                        label: 'label.profile'
-                                                    }
-                                                }
-                                            },
-                                            action: function (args) {
-                                                var data = {
-                                                    ucsmanagerid: args.context.ucsManagers[0].id,
-                                                    templatedn: args.data.templatedn,
-                                                    bladeid: args.context.blades[0].id
-                                                };
-
-                                                if (args.data.profilename != null && args.data.profilename.length > 0) {
-                                                    $.extend(data, {
-                                                        profilename: args.data.profilename
-                                                    });
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('instantiateUcsTemplateAndAssocaciateToBlade'),
-                                                    data: data,
-                                                    success: function (json) {
-                                                        //for testing only (begin)
-                                                        /*
-                                                        json = {
-                                                        "instantiateucstemplateandassociatetobladeresponse": {
-                                                        "jobid": "cd9d0282-4dae-463f-80b6-451e168e2e92"
-                                                        }
-                                                        }
-                                                         */
-                                                        //for testing only (end)
-
-                                                        var jid = json.instantiateucstemplateandassociatetobladeresponse.jobid;
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jid,
-                                                                getUpdatedItem: function (json) {
-                                                                    //for testing only (begin)
-                                                                    /*
-                                                                    json = {
-                                                                    "queryasyncjobresultresponse": {
-                                                                    "accountid": "970b694a-2f8c-11e3-a77d-000c29b36ff5",
-                                                                    "userid": "970b7b4f-2f8c-11e3-a77d-000c29b36ff5",
-                                                                    "cmd": "org.apache.cloudstack.api.InstantiateUcsTemplateAndAssociateToBladeCmd",
-                                                                    "jobstatus": 1,
-                                                                    "jobprocstatus": 0,
-                                                                    "jobresultcode": 0,
-                                                                    "jobresulttype": "object",
-                                                                    "jobresult": {
-                                                                    "ucsblade": {
-                                                                    "id": "3d491c6e-f0b6-40b0-bf6e-f89efdd73c30",
-                                                                    "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
-                                                                    "bladedn": "sys/chassis-1/blade-3",
-                                                                    "profiledn": "org-root/ls-xxxx"
-                                                                    }
-                                                                    },
-                                                                    "created": "2013-10-10T17:29:00-0700",
-                                                                    "jobid": "cd9d0282-4dae-463f-80b6-451e168e2e92"
-                                                                    }
-                                                                    };
-                                                                     */
-                                                                    //for testing only (end)
-
-                                                                    addExtraPropertiesToUcsBladeObject(json.queryasyncjobresultresponse.jobresult.ucsblade);
-                                                                    return json.queryasyncjobresultresponse.jobresult.ucsblade;
-                                                                }
-                                                            }
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            notification: {
-                                                poll: pollAsyncJobResult
-                                            }
-                                        },
-
-                                        disassociateProfileFromBlade: {
-                                            label: 'label.disassociate.profile.blade',
-                                            addRow: 'false',
-                                            messages: {
-                                                notification: function (args) {
-                                                    return 'label.disassociate.profile.blade';
-                                                }
-                                            },
-                                            createForm: {
-                                                title: 'label.disassociate.profile.blade',
-                                                fields: {
-                                                    deleteprofile: {
-                                                        label: 'label.delete.profile',
-                                                        isBoolean: true,
-                                                        isChecked: true
-                                                    }
-                                                }
-                                            },
-                                            action: function (args) {
-                                                $.ajax({
-                                                    url: createURL('disassociateUcsProfileFromBlade'),
-                                                    data: {
-                                                        bladeid: args.context.blades[0].id,
-                                                        deleteprofile: (args.data.deleteprofile == 'on' ? true: false)
-                                                    },
-                                                    success: function (json) {
-                                                        //for testing only (begin)
-                                                        /*
-                                                        json = {
-                                                        "disassociateucsprofilefrombladeresponse": {
-                                                        "jobid": "e371592e-31be-4e53-9346-a5c565d420df"
-                                                        }
-                                                        }
-                                                         */
-                                                        //for testing only (end)
-
-                                                        var jid = json.disassociateucsprofilefrombladeresponse.jobid;
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jid,
-                                                                getUpdatedItem: function (json) {
-                                                                    //for testing only (begin)
-                                                                    /*
-                                                                    json = {
-                                                                    "queryasyncjobresultresponse": {
-                                                                    "accountid": "835fb2d5-0b76-11e3-9350-f4f3e49b5dfe",
-                                                                    "userid": "835fc0e5-0b76-11e3-9350-f4f3e49b5dfe",
-                                                                    "cmd": "org.apache.cloudstack.api.DisassociateUcsProfileCmd",
-                                                                    "jobstatus": 1,
-                                                                    "jobprocstatus": 0,
-                                                                    "jobresultcode": 0,
-                                                                    "jobresulttype": "object",
-                                                                    "jobresult": {
-                                                                    "ucsblade": {
-                                                                    "id": "f8d08575-7a1c-4f79-a588-d129c38bcc4f",
-                                                                    "ucsmanagerid": "0d87c1a6-5664-425c-9024-2ddd9605d260",
-                                                                    "bladedn": "sys/chassis-1/blade-1"
-                                                                    }
-                                                                    },
-                                                                    "created": "2013-09-13T22:17:29-0700",
-                                                                    "jobid": "2c3698a8-39ac-43e6-8ade-86eb2d3726a0"
-                                                                    }
-                                                                    };
-                                                                     */
-                                                                    //for testing only (end)
-
-                                                                    addExtraPropertiesToUcsBladeObject(json.queryasyncjobresultresponse.jobresult.ucsblade);
-                                                                    return json.queryasyncjobresultresponse.jobresult.ucsblade;
-                                                                }
-                                                            }
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            notification: {
-                                                poll: pollAsyncJobResult
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            'secondary-storage': {
-                title: 'label.secondary.storage',
-                id: 'secondarystorages',
-                sectionSelect: {
-                    label: 'label.select-view'
-                },
-                sections: {
-                    secondaryStorage: {
-                        type: 'select',
-                        title: 'label.secondary.storage',
-                        listView: {
-                            id: 'secondarystorages',
-                            section: 'seconary-storage',
-                            fields: {
-                                name: {
-                                    label: 'label.name'
-                                },
-                                url: {
-                                    label: 'label.url'
-                                },
-                                protocol: {
-                                    label: 'label.protocol'
-                                },
-                                scope: {
-                                    label: 'label.scope'
-                                },
-                                zonename: {
-                                    label: 'label.zone'
-                                }
-                            },
-
-
-                            dataProvider: function (args) {
-                                var array1 =[];
-                                if (args.filterBy != null) {
-                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                        switch (args.filterBy.search.by) {
-                                            case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                            array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                        }
-                                    }
-                                }
-                                array1.push("&zoneid=" + args.context.zones[0].id);
-
-                                $.ajax({
-                                    url: createURL("listImageStores&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function (json) {
-                                        var items = json.listimagestoresresponse.imagestore;
-                                        args.response.success({
-                                            actionFilter: secondarystorageActionfilter,
-                                            data: items
-                                        });
-                                    }
-                                });
-                            },
-
-                            actions: {
-                                add: {
-                                    label: 'label.add.secondary.storage',
-
-                                    createForm: {
-                                        title: 'label.add.secondary.storage',
-
-                                        fields: {
-                                            name: {
-                                                label: 'label.name'
-                                            },
-                                            provider: {
-                                                label: 'label.provider',
-                                                select: function (args) {
-                                                    /*
-                                                    UI no longer gets providers from "listStorageProviders&type=image" because:
-                                                    (1) Not all of returned values are handled by UI.
-                                                    (2) Provider "SMB" which is handled by UI is not returned from "listStorageProviders&type=image"
-                                                     */
-                                                    var items =[ {
-                                                        id: 'NFS',
-                                                        description: 'NFS'
-                                                    },
-                                                    {
-                                                        id: 'SMB',
-                                                        description: 'SMB/CIFS'
-                                                    },
-                                                    {
-                                                        id: 'S3',
-                                                        description: 'S3'
-                                                    },
-                                                    {
-                                                        id: 'Swift',
-                                                        description: 'Swift'
-                                                    }];
-
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-
-                                                    args.$select.change(function () {
-                                                        var $form = $(this).closest('form');
-                                                        if ($(this).val() == "NFS") {
-                                                            //NFS, SMB
-                                                            $form.find('.form-item[rel=zoneid]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=nfsServer]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=path]').css('display', 'inline-block');
-
-                                                            //SMB
-                                                            $form.find('.form-item[rel=smbUsername]').hide();
-                                                            $form.find('.form-item[rel=smbPassword]').hide();
-                                                            $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                            //S3
-                                                            $form.find('.form-item[rel=accesskey]').hide();
-                                                            $form.find('.form-item[rel=secretkey]').hide();
-                                                            $form.find('.form-item[rel=bucket]').hide();
-                                                            $form.find('.form-item[rel=endpoint]').hide();
-                                                            $form.find('.form-item[rel=usehttps]').hide();
-                                                            $form.find('.form-item[rel=connectiontimeout]').hide();
-                                                            $form.find('.form-item[rel=maxerrorretry]').hide();
-                                                            $form.find('.form-item[rel=sockettimeout]').hide();
-
-                                                            $form.find('.form-item[rel=createNfsCache]').find('input').prop('checked', false);
-                                                            $form.find('.form-item[rel=createNfsCache]').hide();
-                                                            $form.find('.form-item[rel=nfsCacheZoneid]').hide();
-                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').hide();
-                                                            $form.find('.form-item[rel=nfsCachePath]').hide();
-
-                                                            //Swift
-                                                            $form.find('.form-item[rel=url]').hide();
-                                                            $form.find('.form-item[rel=account]').hide();
-                                                            $form.find('.form-item[rel=username]').hide();
-                                                            $form.find('.form-item[rel=key]').hide();
-                                                            $form.find('.form-item[rel=storagepolicy]').hide();
-                                                        } else if ($(this).val() == "SMB") {
-                                                            //NFS, SMB
-                                                            $form.find('.form-item[rel=zoneid]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=nfsServer]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=path]').css('display', 'inline-block');
-
-                                                            //SMB
-                                                            $form.find('.form-item[rel=smbUsername]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=smbPassword]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=smbDomain]').css('display', 'inline-block');
-
-                                                            //S3
-                                                            $form.find('.form-item[rel=accesskey]').hide();
-                                                            $form.find('.form-item[rel=secretkey]').hide();
-                                                            $form.find('.form-item[rel=bucket]').hide();
-                                                            $form.find('.form-item[rel=endpoint]').hide();
-                                                            $form.find('.form-item[rel=usehttps]').hide();
-                                                            $form.find('.form-item[rel=connectiontimeout]').hide();
-                                                            $form.find('.form-item[rel=maxerrorretry]').hide();
-                                                            $form.find('.form-item[rel=sockettimeout]').hide();
-
-                                                            $form.find('.form-item[rel=createNfsCache]').find('input').prop('checked', false);
-                                                            $form.find('.form-item[rel=createNfsCache]').hide();
-                                                            $form.find('.form-item[rel=nfsCacheZoneid]').hide();
-                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').hide();
-                                                            $form.find('.form-item[rel=nfsCachePath]').hide();
-
-                                                            //Swift
-                                                            $form.find('.form-item[rel=url]').hide();
-                                                            $form.find('.form-item[rel=account]').hide();
-                                                            $form.find('.form-item[rel=username]').hide();
-                                                            $form.find('.form-item[rel=key]').hide();
-                                                            $form.find('.form-item[rel=storagepolicy]').hide();
-                                                        } else if ($(this).val() == "S3") {
-                                                            //NFS, SMB
-                                                            $form.find('.form-item[rel=zoneid]').hide();
-                                                            $form.find('.form-item[rel=nfsServer]').hide();
-                                                            $form.find('.form-item[rel=path]').hide();
-
-                                                            //SMB
-                                                            $form.find('.form-item[rel=smbUsername]').hide();
-                                                            $form.find('.form-item[rel=smbPassword]').hide();
-                                                            $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                            //S3
-                                                            $form.find('.form-item[rel=accesskey]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=secretkey]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=bucket]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=endpoint]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=usehttps]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=connectiontimeout]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=maxerrorretry]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=sockettimeout]').css('display', 'inline-block');
-
-                                                            $form.find('.form-item[rel=createNfsCache]').find('input').attr('checked', 'checked');
-                                                            //$form.find('.form-item[rel=createNfsCache]').find('input').attr('disabled', 'disabled');  //This checkbox should not be disabled any more because NFS staging (of a zone) might already exist (from "NFS secondary storage => Prepare Object Store Migration => NFS staging")
-                                                            $form.find('.form-item[rel=createNfsCache]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=nfsCacheZoneid]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=nfsCachePath]').css('display', 'inline-block');
-
-
-                                                            //Swift
-                                                            $form.find('.form-item[rel=url]').hide();
-                                                            $form.find('.form-item[rel=account]').hide();
-                                                            $form.find('.form-item[rel=username]').hide();
-                                                            $form.find('.form-item[rel=key]').hide();
-                                                            $form.find('.form-item[rel=storagepolicy]').hide();
-                                                        } else if ($(this).val() == "Swift") {
-                                                            //NFS, SMB
-                                                            $form.find('.form-item[rel=zoneid]').hide();
-                                                            $form.find('.form-item[rel=nfsServer]').hide();
-                                                            $form.find('.form-item[rel=path]').hide();
-
-                                                            //SMB
-                                                            $form.find('.form-item[rel=smbUsername]').hide();
-                                                            $form.find('.form-item[rel=smbPassword]').hide();
-                                                            $form.find('.form-item[rel=smbDomain]').hide();
-
-                                                            //S3
-                                                            $form.find('.form-item[rel=accesskey]').hide();
-                                                            $form.find('.form-item[rel=secretkey]').hide();
-                                                            $form.find('.form-item[rel=bucket]').hide();
-                                                            $form.find('.form-item[rel=endpoint]').hide();
-                                                            $form.find('.form-item[rel=usehttps]').hide();
-                                                            $form.find('.form-item[rel=connectiontimeout]').hide();
-                                                            $form.find('.form-item[rel=maxerrorretry]').hide();
-                                                            $form.find('.form-item[rel=sockettimeout]').hide();
-
-                                                            $form.find('.form-item[rel=createNfsCache]').find('input').prop('checked', false);
-                                                            $form.find('.form-item[rel=createNfsCache]').hide();
-                                                            $form.find('.form-item[rel=nfsCacheZoneid]').hide();
-                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').hide();
-                                                            $form.find('.form-item[rel=nfsCachePath]').hide();
-
-                                                            //Swift
-                                                            $form.find('.form-item[rel=url]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=account]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=username]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=key]').css('display', 'inline-block');
-                                                            $form.find('.form-item[rel=storagepolicy]').css('display', 'inline-block');
-                                                        }
-                                                    });
-
-                                                    args.$select.change();
-                                                }
-                                            },
-
-
-                                            //NFS, SMB (begin)
-                                            zoneid: {
-                                                label: 'label.zone',
-                                                docID: 'helpSecondaryStorageZone',
-                                                validation: {
-                                                    required: true
-                                                },
-                                                select: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('listZones'),
-                                                        data: {},
-                                                        success: function (json) {
-                                                            var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
-
-                                                            if (zones != null) {
-                                                                //$.map(items, fn) - items can not be null
-                                                                args.response.success({
-                                                                    data: $.map(zones, function (zone) {
-                                                                        return {
-                                                                            id: zone.id,
-                                                                            description: zone.name
-                                                                        };
-                                                                    })
-                                                                });
-                                                            } else {
-                                                                args.response.success({
-                                                                    data: null
-                                                                });
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            nfsServer: {
-                                                label: 'label.server', //change label from "NFS Server" to "Server" since this field is also shown when provider "SMB/CIFS" is elected.
-                                                docID: 'helpSecondaryStorageNFSServer',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            path: {
-                                                label: 'label.path',
-                                                docID: 'helpSecondaryStoragePath',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            //NFS, SMB (end)
-
-
-                                            //SMB (begin)
-                                            smbUsername: {
-                                                label: 'label.smb.username',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            smbPassword: {
-                                                label: 'label.smb.password',
-                                                isPassword: true,
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            smbDomain: {
-                                                label: 'label.smb.domain',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            //SMB (end)
-
-                                            //S3 (begin)
-                                            accesskey: {
-                                                label: 'label.s3.access_key',
-                                                docID: 'helpS3AccessKey',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            secretkey: {
-                                                label: 'label.s3.secret_key',
-                                                docID: 'helpS3SecretKey',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            bucket: {
-                                                label: 'label.s3.bucket',
-                                                docID: 'helpS3Bucket',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            endpoint: {
-                                                label: 'label.s3.endpoint',
-                                                docID: 'helpS3Endpoint'
-                                            },
-                                            usehttps: {
-                                                label: 'label.s3.use_https',
-                                                isEditable: true,
-                                                isBoolean: true,
-                                                isChecked: true,
-                                                converter: cloudStack.converters.toBooleanText
-                                            },
-                                            connectiontimeout: {
-                                                label: 'label.s3.connection_timeout',
-                                                docID: 'helpS3ConnectionTimeout'
-                                            },
-                                            maxerrorretry: {
-                                                label: 'label.s3.max_error_retry',
-                                                docID: 'helpS3MaxErrorRetry'
-                                            },
-                                            sockettimeout: {
-                                                label: 'label.s3.socket_timeout',
-                                                docID: 'helpS3SocketTimeout'
-                                            },
-
-                                            createNfsCache: {
-                                                label: 'label.create.nfs.secondary.staging.store',
-                                                isBoolean: true,
-                                                isChecked: true
-                                            },
-                                            nfsCacheZoneid: {
-                                                dependsOn: 'createNfsCache',
-                                                label: 'label.zone',
-                                                validation: {
-                                                    required: true
-                                                },
-                                                select: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('listZones'),
-                                                        data: {},
-                                                        success: function (json) {
-                                                            var zones = json.listzonesresponse.zone;
-
-                                                            if (zones != null) {
-                                                                //$.map(items, fn) - items can not be null
-                                                                args.response.success({
-                                                                    data: $.map(zones, function (zone) {
-                                                                        return {
-                                                                            id: zone.id,
-                                                                            description: zone.name
-                                                                        };
-                                                                    })
-                                                                });
-                                                            } else {
-                                                                args.response.success({
-                                                                    data: null
-                                                                });
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            nfsCacheNfsServer: {
-                                                dependsOn: 'createNfsCache',
-                                                label: 'label.nfs.server',
-                                                docID: 'helpNFSStagingServer',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            nfsCachePath: {
-                                                dependsOn: 'createNfsCache',
-                                                label: 'label.path',
-                                                docID: 'helpNFSStagingPath',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            //S3 (end)
-
-
-                                            //Swift (begin)
-                                            url: {
-                                                label: 'label.url',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            account: {
-                                                label: 'label.account',
-                                                 validation: {
-                                                     required: true
-                                                 }
-                                            },
-                                            username: {
-                                                label: 'label.username',
-                                                 validation: {
-                                                     required: true
-                                                 }
-                                            },
-                                            key: {
-                                                label: 'label.key',
-                                                 validation: {
-                                                     required: true
-                                                 }
-                                            },
-                                             storagepolicy: {
-                                                 label: 'label.storagepolicy'
-                                             }
-                                            //Swift (end)
-                                        }
-                                    },
-
-                                    action: function (args) {
-                                        var data = {
-                                        };
-                                        if (args.data.name != null && args.data.name.length > 0) {
-                                            $.extend(data, {
-                                                name: args.data.name
-                                            });
-                                        }
-
-                                        if (args.data.provider == 'NFS') {
-                                            var zoneid = args.data.zoneid;
-                                            var nfs_server = args.data.nfsServer;
-                                            var path = args.data.path;
-                                            var url = nfsURL(nfs_server, path);
-
-                                            $.extend(data, {
-                                                provider: args.data.provider,
-                                                zoneid: zoneid,
-                                                url: url
-                                            });
-
-                                            $.ajax({
-                                                url: createURL('addImageStore'),
-                                                data: data,
-                                                success: function (json) {
-                                                    var item = json.addimagestoreresponse.imagestore;
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                },
-                                                error: function (XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        } else if (args.data.provider == 'SMB') {
-                                            var zoneid = args.data.zoneid;
-                                            var nfs_server = args.data.nfsServer;
-                                            var path = args.data.path;
-                                            var url = smbURL(nfs_server, path);
-                                            $.extend(data, {
-                                                provider: args.data.provider,
-                                                zoneid: zoneid,
-                                                url: url,
-                                                'details[0].key': 'user',
-                                                'details[0].value': args.data.smbUsername,
-                                                'details[1].key': 'password',
-                                                'details[1].value': args.data.smbPassword,
-                                                'details[2].key': 'domain',
-                                                'details[2].value': args.data.smbDomain
-                                            });
-
-                                            $.ajax({
-                                                url: createURL('addImageStore'),
-                                                data: data,
-                                                success: function (json) {
-                                                    var item = json.addimagestoreresponse.imagestore;
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                },
-                                                error: function (XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                    args.response.error(errorMsg);
-                                                }
-                                            });
-                                        } else if (args.data.provider == 'S3') {
-                                            $.extend(data, {
-                                                provider: args.data.provider,
-                                                'details[0].key': 'accesskey',
-                                                'details[0].value': args.data.accesskey,
-                                                'details[1].key': 'secretkey',
-                                                'details[1].value': args.data.secretkey,
-                                                'details[2].key': 'bucket',
-                                                'details[2].value': args.data.bucket,
-                                                'details[3].key': 'usehttps',
-                                                'details[3].value': (args.data.usehttps != null && args.data.usehttps == 'on' ? 'true': 'false')
-                                            });
-
-                                            var index = 4;
-                                            if (args.data.endpoint != null && args.data.endpoint.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'endpoint';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.endpoint;
-                                                index++;
-                                            }
-                                            if (args.data.connectiontimeout != null && args.data.connectiontimeout.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'connectiontimeout';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.connectiontimeout;
-                                                index++;
-                                            }
-                                            if (args.data.maxerrorretry != null && args.data.maxerrorretry.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'maxerrorretry';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.maxerrorretry;
-                                                index++;
-                                            }
-                                            if (args.data.sockettimeout != null && args.data.sockettimeout.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'sockettimeout';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.sockettimeout;
-                                                index++;
-                                            }
-
-                                            $.ajax({
-                                                url: createURL('addImageStore'),
-                                                data: data,
-                                                success: function (json) {
-                                                    g_regionsecondaryenabled = true;
-
-                                                    var item = json.addimagestoreresponse.imagestore;
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-
-                                            if (args.data.createNfsCache == 'on') {
-                                                var zoneid = args.data.nfsCacheZoneid;
-                                                var nfs_server = args.data.nfsCacheNfsServer;
-                                                var path = args.data.nfsCachePath;
-                                                var url = nfsURL(nfs_server, path);
-
-                                                var nfsCacheData = {
-                                                    provider: 'NFS',
-                                                    zoneid: zoneid,
-                                                    url: url
-                                                };
-
-                                                $.ajax({
-                                                    url: createURL('createSecondaryStagingStore'),
-                                                    data: nfsCacheData,
-                                                    success: function (json) {
-                                                        //do nothing
-                                                    },
-                                                    error: function (json) {
-                                                        args.response.error(parseXMLHttpResponse(json));
-                                                    }
-                                                });
-                                            }
-                                        } else if (args.data.provider == 'Swift') {
-                                            $.extend(data, {
-                                                provider: args.data.provider,
-                                                url: args.data.url
-                                            });
-
-                                            var index = 0;
-                                            if (args.data.account != null && args.data.account.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'account';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.account;
-                                                index++;
-                                            }
-                                            if (args.data.username != null && args.data.username.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'username';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.username;
-                                                index++;
-                                            }
-                                            if (args.data.key != null && args.data.key.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'key';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.key;
-                                                index++;
-                                            }
-                                            if (args.data.storagepolicy != null && args.data.storagepolicy.length > 0) {
-                                                data[ 'details[' + index.toString() + '].key'] = 'storagepolicy';
-                                                data[ 'details[' + index.toString() + '].value'] = args.data.storagepolicy;
-                                                index++;
-                                            }
-                                            $.ajax({
-                                                url: createURL('addImageStore'),
-                                                data: data,
-                                                success: function (json) {
-                                                    g_regionsecondaryenabled = true;
-
-                                                    var item = json.addimagestoreresponse.imagestore;
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                },
-                                                error: function (json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    notification: {
-                                        poll: function (args) {
-                                            args.complete({
-                                                actionFilter: secondarystorageActionfilter
-                                            });
-                                        }
-                                    },
-
-                                    messages: {
-                                        notification: function (args) {
-                                            return 'label.add.secondary.storage';
-                                        }
-                                    }
-                                }
-                            },
-
-                            detailView: {
-                                name: 'label.secondary.storage.details',
-                                isMaximized: true,
-                                actions: {
-                                    remove: {
-                                        label: 'label.action.delete.secondary.storage',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.action.delete.secondary.storage';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.action.delete.secondary.storage';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            $.ajax({
-                                                url: createURL("deleteImageStore&id=" + args.context.secondaryStorage[0].id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    args.response.success();
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete({
-                                                    data: {
-                                                        resourcestate: 'Destroyed'
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.details',
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.name'
-                                            }
-                                        },
-                                        {
-                                            url: {
-                                                label: 'label.url'
-                                            },
-                                            protocol: {
-                                                label: 'label.protocol'
-                                            },
-                                            providername: {
-                                                label: 'label.provider'
-                                            },
-                                            scope: {
-                                                label: 'label.scope'
-                                            },
-                                            zonename: {
-                                                label: 'label.zone'
-                                            },
-                                            id: {
-                                                label: 'label.id'
-                                            }
-                                        }],
-
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL("listImageStores&id=" + args.context.secondaryStorage[0].id),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function (json) {
-                                                    var item = json.listimagestoresresponse.imagestore[0];
-                                                    processPropertiesInImagestoreObject(item);
-                                                    args.response.success({
-                                                        actionFilter: secondarystorageActionfilter,
-                                                        data: item
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    // Granular settings for image store
-									settings: {
-										title: 'label.settings',
-										custom: cloudStack.uiCustom.granularSettings({
-											dataProvider: function (args) {
-
-												$.ajax({
-													url: createURL('listConfigurations&imagestoreuuid=' + args.context.secondaryStorage[0].id),
-													data: listViewDataProvider(args, {
-													},
-													{
-														searchBy: 'name'
-													}),
-													success: function (json) {
-														args.response.success({
-															data: json.listconfigurationsresponse.configuration
-														});
-													},
-
-													error: function (json) {
-														args.response.error(parseXMLHttpResponse(json));
-													}
-												});
-											},
-											actions: {
-												edit: function (args) {
-													// call updateStorageLevelParameters
-													var data = {
-														name: args.data.jsonObj.name,
-														value: args.data.value
-													};
-
-													$.ajax({
-														url: createURL('updateConfiguration&imagestoreuuid=' + args.context.secondaryStorage[0].id),
-														data: data,
-														success: function (json) {
-															var item = json.updateconfigurationresponse.configuration;
-															args.response.success({
-																data: item
-															});
-														},
-
-														error: function (json) {
-															args.response.error(parseXMLHttpResponse(json));
-														}
-													});
-												}
-											}
-										})
-									}
-                                }
-                            }
-                        }
-                    },
-                    cacheStorage: {
-                        type: 'select',
-                        title: 'label.secondary.staging.store',
-                        listView: {
-                            id: 'secondarystorages',
-                            section: 'seconary-storage',
-                            fields: {
-                                name: {
-                                    label: 'label.name'
-                                },
-                                url: {
-                                    label: 'label.url'
-                                },
-                                providername: {
-                                    label: 'label.provider'
-                                }
-                            },
-
-                            /*
-                            dataProvider: function(args) {  //being replaced with dataProvider in line 6898
-                            var array1 = [];
-                            if(args.filterBy != null) {
-                            if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                            switch(args.filterBy.search.by) {
-                            case "name":
-                            if(args.filterBy.search.value.length > 0)
-                            array1.push("&keyword=" + args.filterBy.search.value);
-                            break;
-                            }
-                            }
-                            }
-                            array1.push("&zoneid=" + args.context.zones[0].id);
-
-                            $.ajax({
-                            url: createURL("listImageStores&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                            dataType: "json",
-                            async: true,
-                            success: function(json) {
-                            var items = json.listimagestoreresponse.imagestore;
-                            args.response.success({
-                            actionFilter: secondarystorageActionfilter,
-                            data:items
-                            });
-                            }
-                            });
-                            },
-                             */
-
-                            actions: {
-                                add: {
-                                    label: 'label.add.nfs.secondary.staging.store',
-                                    createForm: {
-                                        title: 'label.add.nfs.secondary.staging.store',
-                                        fields: {
-                                            zoneid: {
-                                                label: 'label.zone',
-                                                validation: {
-                                                    required: true
-                                                },
-                                                select: function (args) {
-                                                    $.ajax({
-                                                        url: createURL('listZones'),
-                                                        data: {},
-                                                        success: function (json) {
-                                                            var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
-
-                                                            if (zones != null) {
-                                                                //$.map(items, fn) - items can not be null
-                                                                args.response.success({
-                                                                    data: $.map(zones, function (zone) {
-                                                                        return {
-                                                                            id: zone.id,
-                                                                            description: zone.name
-                                                                        };
-                                                                    })
-                                                                });
-                                                            } else {
-                                                                args.response.success({
-                                                                    data: null
-                                                                });
-                                                            }
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            nfsServer: {
-                                                label: 'label.nfs.server',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            },
-                                            path: {
-                                                label: 'label.path',
-                                                validation: {
-                                                    required: true
-                                                }
-                                            }
-                                        }
-                                    },
-                                    action: function (args) {
-                                        var data = {
-                                            provider: 'NFS',
-                                            zoneid: args.data.zoneid,
-                                            url: nfsURL(args.data.nfsServer, args.data.path)
-                                        };
-                                        $.ajax({
-                                            url: createURL('createSecondaryStagingStore'),
-                                            data: data,
-                                            success: function (json) {
-                                                var item = json.createsecondarystagingstoreresponse.secondarystorage;
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            },
-                                            error: function (json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: function (args) {
-                                            args.complete();
-                                        }
-                                    },
-                                    messages: {
-                                        notification: function (args) {
-                                            return 'label.add.nfs.secondary.staging.store';
-                                        }
-                                    }
-                                }
-                            },
-
-                            detailView: {
-                                name: 'label.secondary.staging.store.details',
-                                isMaximized: true,
-                                actions: {
-                                    remove: {
-                                        label: 'label.delete.secondary.staging.store',
-                                        messages: {
-                                            confirm: function (args) {
-                                                return 'message.confirm.delete.secondary.staging.store';
-                                            },
-                                            notification: function (args) {
-                                                return 'label.delete.secondary.staging.store';
-                                            }
-                                        },
-                                        action: function (args) {
-                                            var data = {
-                                                id: args.context.cacheStorage[0].id
-                                            };
-                                            $.ajax({
-                                                url: createURL('deleteSecondaryStagingStore'),
-                                                data: data,
-                                                async: true,
-                                                success: function (json) {
-                                                    args.response.success();
-                                                },
-                                                error: function (data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        },
-                                        notification: {
-                                            poll: function (args) {
-                                                args.complete();
-                                            }
-                                        }
-                                    }
-                                },
-                                tabs: {
-                                    details: {
-                                        title: 'label.details',
-                                        fields:[ {
-                                            name: {
-                                                label: 'label.name'
-                                            }
-                                        },
-                                        {
-                                            url: {
-                                                label: 'label.url'
-                                            },
-                                            providername: {
-                                                label: 'label.provider'
-                                            },
-                                            scope: {
-                                                label: 'label.scope'
-                                            },
-                                            zonename: {
-                                                label: 'label.zone'
-                                            },
-                                            details: {
-                                                label: 'label.details',
-                                                converter: function (array1) {
-                                                    var string1 = '';
-                                                    if (array1 != null) {
-                                                        for (var i = 0; i < array1.length; i++) {
-                                                            if (i > 0)
-                                                            string1 += ', ';
-
-                                                            string1 += array1[i].name + ': ' + array1[i].value;
-                                                        }
-                                                    }
-                                                    return string1;
-                                                }
-                                            },
-                                            id: {
-                                                label: 'label.id'
-                                            }
-                                        }],
-
-                                        dataProvider: function (args) {
-                                            $.ajax({
-                                                url: createURL('listSecondaryStagingStores'),
-                                                data: {
-                                                    id: args.context.cacheStorage[0].id
-                                                },
-                                                async: false,
-                                                success: function (json) {
-                                                    var item = json.listsecondarystagingstoreresponse.imagestore[0];
-                                                    args.response.success({
-                                                        data: item
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    }
-
-                                    // Granular settings for storage pool for secondary storage is not required
-                                    /*  settings: {
-                                    title: 'label.menu.global.settings',
-                                    custom: cloudStack.uiCustom.granularSettings({
-                                    dataProvider: function(args) {
-                                    args.response.success({
-                                    data: [
-                                    { name: 'config.param.1', value: 1 },
-                                    { name: 'config.param.2', value: 2 }
-                                    ]
-                                    });
-                                    },
-                                    actions: {
-                                    edit: function(args) {
-                                    // call updateStorageLevelParameters
-                                    args.response.success();
-                                    }
-                                    }
-                                    })
-                                    } */
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-
-            guestIpRanges: {
-                //Advanced zone - Guest traffic type - Network tab - Network detailView - View IP Ranges
-                title: 'label.guest.ip.range',
-                id: 'guestIpRanges',
-                listView: {
-                    section: 'guest-IP-range',
-                    fields: {
-                        startip: {
-                            label: 'label.ipv4.start.ip'
-                        },
-                        endip: {
-                            label: 'label.ipv4.end.ip'
-                        },
-                        startipv6: {
-                            label: 'label.ipv6.start.ip'
-                        },
-                        endipv6: {
-                            label: 'label.ipv6.end.ip'
-                        },
-                        gateway: {
-                            label: 'label.gateway'
-                        },
-                        netmask: {
-                            label: 'label.netmask'
-                        }
-                    },
-
-                    dataProvider: function (args) {
-                        $.ajax({
-                            url: createURL("listVlanIpRanges&zoneid=" + selectedZoneObj.id + "&networkid=" + args.context.networks[0].id + "&page=" + args.page + "&pagesize=" + pageSize),
-                            dataType: "json",
-                            async: true,
-                            success: function (json) {
-                                var items = json.listvlaniprangesresponse.vlaniprange;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.ip.range',
-                            createForm: {
-                                title: 'label.add.ip.range',
-                                fields: {
-                                    gateway: {
-                                        label: 'label.gateway'
-                                    },
-                                    netmask: {
-                                        label: 'label.netmask'
-                                    },
-                                    startipv4: {
-                                        label: 'label.ipv4.start.ip'
-                                    },
-                                    endipv4: {
-                                        label: 'label.ipv4.end.ip'
-                                    },
-                                    ip6cidr: {
-                                        label: 'label.ipv6.CIDR'
-                                    },
-                                    ip6gateway: {
-                                        label: 'label.ipv6.gateway'
-                                    },
-                                    startipv6: {
-                                        label: 'label.ipv6.start.ip'
-                                    },
-                                    endipv6: {
-                                        label: 'label.ipv6.end.ip'
-                                    }
-                                }
-                            },
-                            action: function (args) {
-                                var array2 =[];
-
-                                if (args.data.gateway != null && args.data.gateway.length > 0)
-                                array2.push("&gateway=" + args.data.gateway);
-                                if (args.data.netmask != null && args.data.netmask.length > 0)
-                                array2.push("&netmask=" + args.data.netmask);
-
-                                if (args.data.startipv4 != null && args.data.startipv4.length > 0)
-                                array2.push("&startip=" + args.data.startipv4);
-                                if (args.data.endipv4 != null && args.data.endipv4.length > 0)
-                                array2.push("&endip=" + args.data.endipv4);
-
-                                if (args.data.ip6cidr != null && args.data.ip6cidr.length > 0)
-                                array2.push("&ip6cidr=" + args.data.ip6cidr);
-                                if (args.data.ip6gateway != null && args.data.ip6gateway.length > 0)
-                                array2.push("&ip6gateway=" + args.data.ip6gateway);
-
-                                if (args.data.startipv6 != null && args.data.startipv6.length > 0)
-                                array2.push("&startipv6=" + args.data.startipv6);
-                                if (args.data.endipv6 != null && args.data.endipv6.length > 0)
-                                array2.push("&endipv6=" + args.data.endipv6);
-
-                                $.ajax({
-                                    url: createURL("createVlanIpRange&forVirtualNetwork=false&networkid=" + args.context.networks[0].id + array2.join("")),
-                                    dataType: "json",
-                                    success: function (json) {
-                                        var item = json.createvlaniprangeresponse.vlan;
-                                        args.response.success({
-                                            data: item
-                                        });
-                                    },
-                                    error: function (XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: function (args) {
-                                    args.complete();
-                                }
-                            },
-                            messages: {
-                                notification: function (args) {
-                                    return 'label.add.ip.range';
-                                }
-                            }
-                        },
-
-                        'remove': {
-                            label: 'label.remove.ip.range',
-                            messages: {
-                                confirm: function (args) {
-                                    return 'message.confirm.remove.IP.range';
-                                },
-                                notification: function (args) {
-                                    return 'label.remove.ip.range';
-                                }
-                            },
-                            action: function (args) {
-                                $.ajax({
-                                    url: createURL("deleteVlanIpRange&id=" + args.data.id),
-                                    dataType: "json",
-                                    async: true,
-                                    success: function (json) {
-                                        args.response.success({
-                                            data: {
-                                            }
-                                        });
-                                    },
-                                    error: function (json) {
-                                        args.response.error(parseXMLHttpResponse(json));
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: function (args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    function addBaremetalDhcpDeviceFn(args) {
-        if (nspMap[ "BaremetalDhcpProvider"] == null) {
-            $.ajax({
-                url: createURL("addNetworkServiceProvider&name=BaremetalDhcpProvider&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                dataType: "json",
-                async: true,
-                success: function (json) {
-                    var jobId = json.addnetworkserviceproviderresponse.jobid;
-                    var addBaremetalDhcpProviderIntervalID = setInterval(function () {
-                        $.ajax({
-                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                            dataType: "json",
-                            success: function (json) {
-                                var result = json.queryasyncjobresultresponse;
-                                if (result.jobstatus == 0) {
-                                    return; //Job has not completed
-                                } else {
-                                    clearInterval(addBaremetalDhcpProviderIntervalID);
-                                    if (result.jobstatus == 1) {
-                                        nspMap[ "BaremetalDhcpProvider"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-
-                                        $.ajax({
-                                            url: createURL('addBaremetalDhcp'),
-                                            data: {
-                                                physicalnetworkid: selectedPhysicalNetworkObj.id,
-                                                dhcpservertype: 'DHCPD',
-                                                url: args.data.url,
-                                                username: args.data.username,
-                                                password: args.data.password
-                                            },
-                                            type: "POST",
-                                            success: function (json) {
-                                                var jid = json.addbaremetaldhcpresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid,
-                                                        getUpdatedItem: function (json) {
-                                                            var item = json.queryasyncjobresultresponse.jobresult.baremetaldhcp;
-                                                            return item;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    } else if (result.jobstatus == 2) {
-                                        alert(_s(result.jobresult.errortext));
-                                    }
-                                }
-                            },
-                            error: function (XMLHttpResponse) {
-                                alert(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    },
-                    g_queryAsyncJobResultInterval);
-                }
-            });
-        } else {
-            $.ajax({
-                url: createURL('addBaremetalDhcp'),
-                data: {
-                    physicalnetworkid: selectedPhysicalNetworkObj.id,
-                    dhcpservertype: 'DHCPD',
-                    url: args.data.url,
-                    username: args.data.username,
-                    password: args.data.password
-                },
-                type: "POST",
-                success: function (json) {
-                    var jid = json.addbaremetaldhcpresponse.jobid;
-                    args.response.success({
-                        _custom: {
-                            jobId: jid,
-                            getUpdatedItem: function (json) {
-                                var item = json.queryasyncjobresultresponse.jobresult.baremetaldhcp;
-                                return item;
-                            }
-                        }
-                    });
-                }
-            });
-        }
-    }
-
-    function addBaremetalPxeDeviceFn(args) {
-        if (nspMap[ "BaremetalPxeProvider"] == null) {
-            $.ajax({
-                url: createURL("addNetworkServiceProvider&name=BaremetalPxeProvider&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                dataType: "json",
-                async: true,
-                success: function (json) {
-                    var jobId = json.addnetworkserviceproviderresponse.jobid;
-                    var addBaremetalPxeProviderIntervalID = setInterval(function () {
-                        $.ajax({
-                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                            dataType: "json",
-                            success: function (json) {
-                                var result = json.queryasyncjobresultresponse;
-                                if (result.jobstatus == 0) {
-                                    return; //Job has not completed
-                                } else {
-                                    clearInterval(addBaremetalPxeProviderIntervalID);
-                                    if (result.jobstatus == 1) {
-                                        nspMap[ "BaremetalPxeProvider"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
-
-                                        $.ajax({
-                                            url: createURL('addBaremetalPxeKickStartServer'),
-                                            data: {
-                                                physicalnetworkid: selectedPhysicalNetworkObj.id,
-                                                pxeservertype: 'KICK_START',
-                                                url: args.data.url,
-                                                username: args.data.username,
-                                                password: args.data.password,
-                                                tftpdir: args.data.tftpdir
-                                            },
-                                            type: "POST",
-                                            success: function (json) {
-                                                var jid = json.addbaremetalpxeresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid,
-                                                        getUpdatedItem: function (json) {
-                                                            var item = json.queryasyncjobresultresponse.jobresult.baremetalpxeserver;
-                                                            return item;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    } else if (result.jobstatus == 2) {
-                                        alert(_s(result.jobresult.errortext));
-                                    }
-                                }
-                            },
-                            error: function (XMLHttpResponse) {
-                                alert(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    },
-                    g_queryAsyncJobResultInterval);
-                }
-            });
-        } else {
-            $.ajax({
-                url: createURL('addBaremetalPxeKickStartServer'),
-                data: {
-                    physicalnetworkid: selectedPhysicalNetworkObj.id,
-                    pxeservertype: 'KICK_START',
-                    url: args.data.url,
-                    username: args.data.username,
-                    password: args.data.password,
-                    tftpdir: args.data.tftpdir
-                },
-                type: "POST",
-                success: function (json) {
-                    var jid = json.addbaremetalpxeresponse.jobid;
-                    args.response.success({
-                        _custom: {
-                            jobId: jid,
-                            getUpdatedItem: function (json) {
-                                var item = json.queryasyncjobresultresponse.jobresult.baremetalpxeserver;
-                                return item;
-                            }
-                        }
-                    });
-                }
-            });
-        }
-    }
-
-    // Inject cloudStack infra page
-    cloudStack.sections.system.show = cloudStack.uiCustom.physicalResources(cloudStack.sections.system.physicalResourceSection);
-
-    function addExternalLoadBalancer(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
-        var array1 =[];
-        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
-        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
-        array1.push("&networkdevicetype=" + encodeURIComponent(args.data.networkdevicetype));
-
-        if (apiCmd == "addNetscalerLoadBalancer") {
-            array1.push("&gslbprovider=" + (args.data.gslbprovider == "on"));
-            array1.push("&gslbproviderpublicip=" + encodeURIComponent(args.data.gslbproviderpublicip));
-            array1.push("&gslbproviderprivateip=" + encodeURIComponent(args.data.gslbproviderprivateip));
-        }
-
-        //construct URL starts here
-        var url =[];
-
-        var ip = args.data.ip;
-        url.push("https://" + ip);
-
-        var isQuestionMarkAdded = false;
-
-        var publicInterface = args.data.publicinterface;
-        if (publicInterface != null && publicInterface.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("publicinterface=" + publicInterface);
-        }
-
-        var privateInterface = args.data.privateinterface;
-        if (privateInterface != null && privateInterface.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("privateinterface=" + privateInterface);
-        }
-
-        var numretries = args.data.numretries;
-        if (numretries != null && numretries.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("numretries=" + numretries);
-        }
-
-        var isInline = args.data.inline;
-        if (isInline != null && isInline.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("inline=" + isInline);
-        }
-
-        var capacity = args.data.capacity;
-        if (capacity != null && capacity.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("lbdevicecapacity=" + capacity);
-        }
-
-        var dedicated = (args.data.dedicated == "on");
-        //boolean    (true/false)
-        if (isQuestionMarkAdded == false) {
-            url.push("?");
-            isQuestionMarkAdded = true;
-        } else {
-            url.push("&");
-        }
-        url.push("lbdevicededicated=" + dedicated.toString());
-
-
-        array1.push("&url=" + encodeURIComponent(url.join("")));
-        //construct URL ends here
-
-        $.ajax({
-            url: createURL(apiCmd + array1.join("")),
-            dataType: "json",
-            type: "POST",
-            success: function (json) {
-                var jid = json[apiCmdRes].jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid,
-                        getUpdatedItem: function (json) {
-                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
-
-                            return item;
-                        }
-                    }
-                });
-            }
-        });
-    }
-
-    function addExternalFirewall(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
-        var array1 =[];
-        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
-        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
-        array1.push("&networkdevicetype=" + encodeURIComponent(args.data.networkdevicetype));
-
-        //construct URL starts here
-        var url =[];
-
-        var ip = args.data.ip;
-        url.push("https://" + ip);
-
-        var isQuestionMarkAdded = false;
-
-        var publicInterface = args.data.publicinterface;
-        if (publicInterface != null && publicInterface.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("publicinterface=" + publicInterface);
-        }
-
-        var privateInterface = args.data.privateinterface;
-        if (privateInterface != null && privateInterface.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("privateinterface=" + privateInterface);
-        }
-
-        var usageInterface = args.data.usageinterface;
-        if (usageInterface != null && usageInterface.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("usageinterface=" + usageInterface);
-        }
-
-        var numretries = args.data.numretries;
-        if (numretries != null && numretries.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("numretries=" + numretries);
-        }
-
-        var timeout = args.data.timeout;
-        if (timeout != null && timeout.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("timeout=" + timeout);
-        }
-
-        var isInline = args.data.inline;
-        if (isInline != null && isInline.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("inline=" + isInline);
-        }
-
-        var publicNetwork = args.data.publicnetwork;
-        if (publicNetwork != null && publicNetwork.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("publicnetwork=" + publicNetwork);
-        }
-
-        var privateNetwork = args.data.privatenetwork;
-        if (privateNetwork != null && privateNetwork.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("privatenetwork=" + privateNetwork);
-        }
-
-        var capacity = args.data.capacity;
-        if (capacity != null && capacity.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("fwdevicecapacity=" + capacity);
-        }
-
-        var dedicated = (args.data.dedicated == "on");
-        //boolean    (true/false)
-        if (isQuestionMarkAdded == false) {
-            url.push("?");
-            isQuestionMarkAdded = true;
-        } else {
-            url.push("&");
-        }
-        url.push("fwdevicededicated=" + dedicated.toString());
-
-        // START - Palo Alto Specific Fields
-        var externalVirtualRouter = args.data.pavr;
-        if (externalVirtualRouter != null && externalVirtualRouter.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("pavr=" + encodeURIComponent(externalVirtualRouter));
-        }
-
-        var externalThreatProfile = args.data.patp;
-        if (externalThreatProfile != null && externalThreatProfile.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("patp=" + encodeURIComponent(externalThreatProfile));
-        }
-
-        var externalLogProfile = args.data.palp;
-        if (externalLogProfile != null && externalLogProfile.length > 0) {
-            if (isQuestionMarkAdded == false) {
-                url.push("?");
-                isQuestionMarkAdded = true;
-            } else {
-                url.push("&");
-            }
-            url.push("palp=" + encodeURIComponent(externalLogProfile));
-        }
-        // END - Palo Alto Specific Fields
-
-        array1.push("&url=" + encodeURIComponent(url.join("")));
-        //construct URL ends here
-
-        $.ajax({
-            url: createURL(apiCmd + array1.join("")),
-            dataType: "json",
-            type: "POST",
-            success: function (json) {
-                var jid = json[apiCmdRes].jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid,
-                        getUpdatedItem: function (json) {
-                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
-
-                            return item;
-                        }
-                    }
-                });
-            }
-        });
-    }
-
-    function addNiciraNvpDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
-        var array1 =[];
-        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
-        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, rgs.data.username, args.data.password);
-        array1.push("&hostname=" + encodeURIComponent(args.data.host));
-        array1.push("&transportzoneuuid=" + encodeURIComponent(args.data.transportzoneuuid));
-
-        var l3GatewayServiceUuid = args.data.l3gatewayserviceuuid;
-        if (l3GatewayServiceUuid != null && l3GatewayServiceUuid.length > 0) {
-            array1.push("&l3gatewayserviceuuid=" + encodeURIComponent(args.data.l3gatewayserviceuuid));
-        }
-
-		var l2GatewayServiceUuid = args.data.l2gatewayserviceuuid;
-        if (l2GatewayServiceUuid != null && l2GatewayServiceUuid.length > 0) {
-            array1.push("&l2gatewayserviceuuid=" + encodeURIComponent(args.data.l2gatewayserviceuuid));
-        }
-
-        $.ajax({
-            url: createURL(apiCmd + array1.join("")),
-            dataType: "json",
-            type: "POST",
-            success: function (json) {
-                var jid = json[apiCmdRes].jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid,
-                        getUpdatedItem: function (json) {
-                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
-
-                            return item;
-                        }
-                    }
-                });
-            }
-        });
-    }
-
-    function addBrocadeVcsDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
-        var array1 =[];
-        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
-        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
-        array1.push("&hostname=" + encodeURIComponent(args.data.host));
-
-        $.ajax({
-            url: createURL(apiCmd + array1.join("")),
-            dataType: "json",
-            type: "POST",
-            success: function (json) {
-                var jid = json[apiCmdRes].jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid,
-                        getUpdatedItem: function (json) {
-                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
-
-                            return item;
-                        }
-                    }
-                });
-            }
-        });
-    }
-
-    function addOpenDaylightController(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
-        var array1 =[];
-        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
-        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
-        array1.push("&url=" + encodeURIComponent(args.data.url));
-
-        $.ajax({
-            url: createURL(apiCmd + array1.join("")),
-            dataType: "json",
-            type: "POST",
-            success: function (json) {
-                var jid = json[apiCmdRes].jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid,
-                        getUpdatedItem: function (json) {
-                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
-
-                            return item;
-                        }
-                    }
-                });
-            }
-        });
-    }
-
-    function addBigSwitchBcfDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
-        var array1 =[];
-        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
-        array1.push("&hostname=" + encodeURIComponent(args.data.host));
-        array1.push("&username=" + encodeURIComponent(args.data.username));
-        cloudStack.addPasswordToCommandUrlParameterArray(array1, args.data.password);
-        array1.push("&nat=" + (args.data.nat == 'on' ? "true": "false"));
-
-        $.ajax({
-            url: createURL(apiCmd + array1.join("")),
-            dataType: "json",
-            success: function (json) {
-                var jid = json[apiCmdRes].jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid,
-                        getUpdatedItem: function (json) {
-                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
-
-                            return item;
-                        }
-                    }
-                });
-            }
-        });
-    }
-
-    function addGloboDnsHost(args, physicalNetworkObj, apiCmd, apiCmdRes) {
-        var array1 = [];
-        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
-        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
-        array1.push("&url=" + encodeURIComponent(args.data.url));
-
-        $.ajax({
-            url: createURL(apiCmd + array1.join("")),
-            dataType: "json",
-            type: "POST",
-            success: function(json) {
-                var jid = json[apiCmdRes].jobid;
-                args.response.success({
-                    _custom: {
-                        jobId: jid
-                    }
-                });
-            }
-        });
-    }
-
-
-    var afterCreateZonePhysicalNetworkTrafficTypes = function (args, newZoneObj, newPhysicalnetwork) {
-                $.ajax({
-            url: createURL("updatePhysicalNetwork&state=Enabled&id=" + newPhysicalnetwork.id),
-            dataType: "json",
-            success: function (json) {
-                var jobId = json.updatephysicalnetworkresponse.jobid;
-                var enablePhysicalNetworkIntervalID = setInterval(function () {
-                    $.ajax({
-                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                        dataType: "json",
-                        success: function (json) {
-                            var result = json.queryasyncjobresultresponse;
-                            if (result.jobstatus == 0) {
-                                return; //Job has not completed
-                            } else {
-                                clearInterval(enablePhysicalNetworkIntervalID);
-                                if (result.jobstatus == 1) {
-                                    //alert("updatePhysicalNetwork succeeded.");
-
-                                    // get network service provider ID of Virtual Router
-                                    var virtualRouterProviderId;
-                                    $.ajax({
-                                        url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + newPhysicalnetwork.id),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                            if (items != null && items.length > 0) {
-                                                virtualRouterProviderId = items[0].id;
-                                            }
-                                        }
-                                    });
-                                    if (virtualRouterProviderId == null) {
-                                        alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID");
-                                        return;
-                                    }
-
-                                    var virtualRouterElementId;
-                                    $.ajax({
-                                        url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
-                                            if (items != null && items.length > 0) {
-                                                virtualRouterElementId = items[0].id;
-                                            }
-                                        }
-                                    });
-                                    if (virtualRouterElementId == null) {
-                                        alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id");
-                                        return;
-                                    }
-
-                                    $.ajax({
-                                        url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var jobId = json.configurevirtualrouterelementresponse.jobid;
-                                            var enableVirtualRouterElementIntervalID = setInterval(function () {
-                                                $.ajax({
-                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                    dataType: "json",
-                                                    success: function (json) {
-                                                        var result = json.queryasyncjobresultresponse;
-                                                        if (result.jobstatus == 0) {
-                                                            return; //Job has not completed
-                                                        } else {
-                                                            clearInterval(enableVirtualRouterElementIntervalID);
-                                                            if (result.jobstatus == 1) {
-                                                                //alert("configureVirtualRouterElement succeeded.");
-
-                                                                $.ajax({
-                                                                    url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + virtualRouterProviderId),
-                                                                    dataType: "json",
-                                                                    async: false,
-                                                                    success: function (json) {
-                                                                        var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                        var enableVirtualRouterProviderIntervalID = setInterval(function () {
-                                                                            $.ajax({
-                                                                                url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                dataType: "json",
-                                                                                success: function (json) {
-                                                                                    var result = json.queryasyncjobresultresponse;
-                                                                                    if (result.jobstatus == 0) {
-                                                                                        return; //Job has not completed
-                                                                                    } else {
-                                                                                        clearInterval(enableVirtualRouterProviderIntervalID);
-                                                                                        if (result.jobstatus == 1) {
-                                                                                            //alert("Virtual Router Provider is enabled");
-
-                                                                                            if (newZoneObj.networktype == "Basic") {
-                                                                                                if (args.data[ "security-groups-enabled"] == "on") {
-                                                                                                    //need to Enable security group provider first
-                                                                                                    // get network service provider ID of Security Group
-                                                                                                    var securityGroupProviderId;
-                                                                                                    $.ajax({
-                                                                                                        url: createURL("listNetworkServiceProviders&name=SecurityGroupProvider&physicalNetworkId=" + newPhysicalnetwork.id),
-                                                                                                        dataType: "json",
-                                                                                                        async: false,
-                                                                                                        success: function (json) {
-                                                                                                            var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                                                            if (items != null && items.length > 0) {
-                                                                                                                securityGroupProviderId = items[0].id;
-                                                                                                            }
-                                                                                                        }
-                                                                                                    });
-                                                                                                    if (securityGroupProviderId == null) {
-                                                                                                        alert("error: listNetworkServiceProviders API doesn't return security group provider ID");
-                                                                                                        return;
-                                                                                                    }
-
-                                                                                                    $.ajax({
-                                                                                                        url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + securityGroupProviderId),
-                                                                                                        dataType: "json",
-                                                                                                        async: false,
-                                                                                                        success: function (json) {
-                                                                                                            var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                                                            var enableSecurityGroupProviderIntervalID = setInterval(function () {
-                                                                                                                $.ajax({
-                                                                                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                                                    dataType: "json",
-                                                                                                                    success: function (json) {
-                                                                                                                        var result = json.queryasyncjobresultresponse;
-                                                                                                                        if (result.jobstatus == 0) {
-                                                                                                                            return; //Job has not completed
-                                                                                                                        } else {
-                                                                                                                            clearInterval(enableSecurityGroupProviderIntervalID);
-                                                                                                                            if (result.jobstatus == 1) {
-                                                                                                                                //alert("Security group provider is enabled");
-
-                                                                                                                                //create network (for basic zone only)
-                                                                                                                                var array2 =[];
-                                                                                                                                array2.push("&zoneid=" + newZoneObj.id);
-                                                                                                                                array2.push("&name=guestNetworkForBasicZone");
-                                                                                                                                array2.push("&displaytext=guestNetworkForBasicZone");
-                                                                                                                                array2.push("&networkofferingid=" + args.data.networkOfferingId);
-                                                                                                                                $.ajax({
-                                                                                                                                    url: createURL("createNetwork" + array2.join("")),
-                                                                                                                                    dataType: "json",
-                                                                                                                                    async: false,
-                                                                                                                                    success: function (json) {
-                                                                                                                                        var arrayOfParameters = cloudStack.createArrayOfParametersForCreatePodCommand(newZoneObj.id, args.data);
-                                                                                                                                        $.ajax({
-                                                                                                                                            url: createURL("createPod" + arrayOfParameters.join("")),
-                                                                                                                                            dataType: "json",
-                                                                                                                                            async: false,
-                                                                                                                                            success: function (json) {
-                                                                                                                                            },
-                                                                                                                                            error: function (XMLHttpResponse) {
-                                                                                                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                                                                alert("createPod failed. Error: " + errorMsg);
-                                                                                                                                            }
-                                                                                                                                        });
-                                                                                                                                    }
-                                                                                                                                });
-                                                                                                                            } else if (result.jobstatus == 2) {
-                                                                                                                                alert("failed to enable security group provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                                            }
-                                                                                                                        }
-                                                                                                                    },
-                                                                                                                    error: function (XMLHttpResponse) {
-                                                                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                                        alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
-                                                                                                                    }
-                                                                                                                });
-                                                                                                            },
-                                                                                                            g_queryAsyncJobResultInterval);
-                                                                                                        }
-                                                                                                    });
-                                                                                                } else {
-                                                                                                    //create network (for basic zone only)
-                                                                                                    var array2 =[];
-                                                                                                    array2.push("&zoneid=" + newZoneObj.id);
-                                                                                                    array2.push("&name=guestNetworkForBasicZone");
-                                                                                                    array2.push("&displaytext=guestNetworkForBasicZone");
-                                                                                                    array2.push("&networkofferingid=" + args.data.networkOfferingId);
-                                                                                                    $.ajax({
-                                                                                                        url: createURL("createNetwork" + array2.join("")),
-                                                                                                        dataType: "json",
-                                                                                                        async: false,
-                                                                                                        success: function (json) {
-                                                                                                            var arrayOfParameters = cloudStack.createArrayOfParametersForCreatePodCommand(newZoneObj.id, args.data);
-                                                                                                            $.ajax({
-                                                                                                                url: createURL("createPod" + arrayOfParameters.join("")),
-                                                                                                                dataType: "json",
-                                                                                                                async: false,
-                                                                                                                success: function (json) {
-                                                                                                                },
-                                                                                                                error: function (XMLHttpResponse) {
-                                                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                                    alert("createPod failed. Error: " + errorMsg);
-                                                                                                                }
-                                                                                                            });
-                                                                                                        }
-                                                                                                    });
-                                                                                                }
-                                                                                            } else {
-                                                                                                var arrayOfParameters = cloudStack.createArrayOfParametersForCreatePodCommand(newZoneObj.id, args.data);
-                                                                                                $.ajax({
-                                                                                                    url: createURL("createPod" + arrayOfParameters.join("")),
-                                                                                                    dataType: "json",
-                                                                                                    async: false,
-                                                                                                    success: function (json) {
-                                                                                                    },
-                                                                                                    error: function (XMLHttpResponse) {
-                                                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                        alert("createPod failed. Error: " + errorMsg);
-                                                                                                    }
-                                                                                                });
-                                                                                            }
-                                                                                        } else if (result.jobstatus == 2) {
-                                                                                            alert("failed to enable Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                        }
-                                                                                    }
-                                                                                },
-                                                                                error: function (XMLHttpResponse) {
-                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                    alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
-                                                                                }
-                                                                            });
-                                                                        },
-                                                                        g_queryAsyncJobResultInterval);
-                                                                    }
-                                                                });
-                                                            } else if (result.jobstatus == 2) {
-                                                                alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
-                                                            }
-                                                        }
-                                                    },
-                                                    error: function (XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("configureVirtualRouterElement failed. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            },
-                                            g_queryAsyncJobResultInterval);
-                                        }
-                                    });
-                                } else if (result.jobstatus == 2) {
-                                    alert("updatePhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
-                                }
-                            }
-                        },
-                        error: function (XMLHttpResponse) {
-                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                            alert("updatePhysicalNetwork failed. Error: " + errorMsg);
-                        }
-                    });
-                },
-                g_queryAsyncJobResultInterval);
-            }
-        });
-    };
-
-    //action filters (begin)
-    var zoneActionfilter = cloudStack.actionFilter.zoneActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[ 'enableSwift'];
-
-        if (jsonObj.vmwaredcId == null) {
-            allowedActions.push('addVmwareDc');
-        } else {
-            allowedActions.push('updateVmwareDc');
-            allowedActions.push('removeVmwareDc');
-        }
-
-        if (jsonObj.domainid != null)
-        allowedActions.push("releaseDedicatedZone"); else
-        allowedActions.push("dedicateZone");
-
-        allowedActions.push("edit");
-
-        if (jsonObj.allocationstate == "Disabled")
-        allowedActions.push("enable"); else if (jsonObj.allocationstate == "Enabled")
-        allowedActions.push("disable");
-
-        allowedActions.push("remove");
-
-        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('outOfBandManagementEnabled') && jsonObj['resourcedetails']['outOfBandManagementEnabled'] == 'false') {
-            allowedActions.push("enableOutOfBandManagement");
-        } else {
-            allowedActions.push("disableOutOfBandManagement");
-        }
-
-        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('resourceHAEnabled') && jsonObj['resourcedetails']['resourceHAEnabled'] == 'false') {
-            allowedActions.push("enableHA");
-        } else {
-            allowedActions.push("disableHA");
-        }
-
-        allowedActions.push("startRollingMaintenance");
-        return allowedActions;
-    }
-
-
-    var nexusActionfilter = function (args) {
-        var nexusObj = args.context.item;
-        var allowedActions =[];
-        allowedActions.push("edit");
-        if (nexusObj.vsmdevicestate == "Disabled")
-        allowedActions.push("enable"); else if (nexusObj.vsmdevicestate == "Enabled")
-        allowedActions.push("disable");
-        allowedActions.push("remove");
-        return allowedActions;
-    }
-
-    var podActionfilter = function (args) {
-        var podObj = args.context.item;
-        var dedicatedPodObj = args.context.podItem;
-        var allowedActions =[];
-
-        if (podObj.domainid != null)
-        allowedActions.push("release"); else
-        allowedActions.push("dedicate");
-
-
-        allowedActions.push("edit");
-        if (podObj.allocationstate == "Disabled")
-        allowedActions.push("enable"); else if (podObj.allocationstate == "Enabled")
-        allowedActions.push("disable");
-        allowedActions.push("remove");
-
-        /*
-        var selectedZoneObj;
-        $(zoneObjs).each(function(){
-        if(this.id == podObj.zoneid) {
-        selectedZoneObj = this;
-        return false;  //break the $.each() loop
-        }
-        });
-         */
-
-        if (selectedZoneObj.networktype == "Basic") {
-            //basic-mode network (pod-wide VLAN)
-            //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").show();
-            allowedActions.push("addIpRange");
-            allowedActions.push("addNetworkDevice");
-        } else if (selectedZoneObj.networktype == "Advanced") {
-            //advanced-mode network (zone-wide VLAN)
-            //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").hide();
-        }
-
-        allowedActions.push("startRollingMaintenance");
-        return allowedActions;
-    }
-
-    var networkDeviceActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-        return allowedActions;
-    }
-
-    var clusterActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-
-        if (jsonObj.domainid != null)
-        allowedActions.push("release"); else
-        allowedActions.push("dedicate");
-
-        if (jsonObj.state == "Enabled") {
-            //managed, allocation enabled
-            allowedActions.push("unmanage");
-            allowedActions.push("disable");
-            //allowedActions.push("edit"); // No fields to edit
-        } else if (jsonObj.state == "Disabled") {
-            //managed, allocation disabled
-            allowedActions.push("unmanage");
-            allowedActions.push("enable");
-            //allowedActions.push("edit"); // No fields to edit
-        } else {
-            //Unmanaged, PrepareUnmanaged , PrepareUnmanagedError
-            allowedActions.push("manage");
-        }
-
-        allowedActions.push("remove");
-
-        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('outOfBandManagementEnabled') && jsonObj['resourcedetails']['outOfBandManagementEnabled'] == 'false') {
-            allowedActions.push("enableOutOfBandManagement");
-        } else {
-            allowedActions.push("disableOutOfBandManagement");
-        }
-
-        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('resourceHAEnabled') && jsonObj['resourcedetails']['resourceHAEnabled'] == 'false') {
-            allowedActions.push("enableHA");
-        } else {
-            allowedActions.push("disableHA");
-        }
-
-        allowedActions.push("startRollingMaintenance");
-        return allowedActions;
-    }
-
-    var hostActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-
-        if (jsonObj.domainid != null)
-        allowedActions.push("release"); else
-        allowedActions.push("dedicate");
-
-
-        if (jsonObj.resourcestate == "Enabled") {
-            allowedActions.push("edit");
-            allowedActions.push("enableMaintenanceMode");
-            allowedActions.push("disable");
-
-            if (jsonObj.state != "Disconnected")
-            allowedActions.push("forceReconnect");
-
-            if (jsonObj.hypervisor == "KVM") {
-                allowedActions.push("secureKVMHost");
-                allowedActions.push("startRollingMaintenance");
-            }
-
-        } else if (jsonObj.resourcestate == "ErrorInMaintenance") {
-            allowedActions.push("edit");
-            allowedActions.push("enableMaintenanceMode");
-            allowedActions.push("cancelMaintenanceMode");
-            if (jsonObj.hypervisor == "KVM") {
-                allowedActions.push("startRollingMaintenance");
-            }
-        } else if (jsonObj.resourcestate == "PrepareForMaintenance" || jsonObj.resourcestate == 'ErrorInPrepareForMaintenance') {
-            allowedActions.push("edit");
-            allowedActions.push("cancelMaintenanceMode");
-        } else if (jsonObj.resourcestate == "Maintenance") {
-            allowedActions.push("edit");
-            allowedActions.push("cancelMaintenanceMode");
-            allowedActions.push("remove");
-        } else if (jsonObj.resourcestate == "Disabled") {
-            allowedActions.push("edit");
-            allowedActions.push("enable");
-            allowedActions.push("remove");
-        }
-
-        allowedActions.push("blankHAForHost");
-        allowedActions.push("configureHAForHost");
-        if (jsonObj.hasOwnProperty("hostha") && jsonObj.hostha.haenable) {
-            allowedActions.push("disableHA");
-        } else {
-            allowedActions.push("enableHA");
-        }
-
-        allowedActions.push("blankOutOfBandManagement");
-        allowedActions.push("configureOutOfBandManagement");
-        if (jsonObj.hasOwnProperty("outofbandmanagement") && jsonObj.outofbandmanagement.enabled) {
-            allowedActions.push("issueOutOfBandManagementPowerAction");
-            allowedActions.push("changeOutOfBandManagementPassword");
-            allowedActions.push("disableOutOfBandManagement");
-        } else {
-            allowedActions.push("enableOutOfBandManagement");
-        }
-
-        if ((jsonObj.state == "Down" || jsonObj.state == "Alert" || jsonObj.state == "Disconnected") && ($.inArray("remove", allowedActions) == -1)) {
-            allowedActions.push("remove");
-        }
-
-        return allowedActions;
-    }
-
-    var primarystorageActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-
-        allowedActions.push("edit");
-
-        if (jsonObj.state == 'Up' || jsonObj.state == "Connecting") {
-            allowedActions.push("enableMaintenanceMode");
-        } else if (jsonObj.state == 'Down') {
-            allowedActions.push("enableMaintenanceMode");
-            allowedActions.push("remove");
-        } else if (jsonObj.state == "Alert") {
-            allowedActions.push("remove");
-        } else if (jsonObj.state == "ErrorInMaintenance") {
-            allowedActions.push("enableMaintenanceMode");
-            allowedActions.push("cancelMaintenanceMode");
-        } else if (jsonObj.state == "PrepareForMaintenance" || jsonObj.resourcestate == "ErrorInPrepareForMaintenance") {
-            allowedActions.push("cancelMaintenanceMode");
-        } else if (jsonObj.state == "Maintenance") {
-            allowedActions.push("cancelMaintenanceMode");
-            allowedActions.push("remove");
-        } else if (jsonObj.state == "Disconnected") {
-            allowedActions.push("remove");
-        }
-        return allowedActions;
-    }
-
-    var secondarystorageActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-        allowedActions.push("remove");
-        return allowedActions;
-    }
-
-    var routerActionfilter = cloudStack.sections.system.routerActionFilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-
-        if (jsonObj.requiresupgrade == true) {
-            allowedActions.push('upgradeRouterToUseNewerTemplate');
-        }
-
-        if (jsonObj.state == 'Running') {
-            allowedActions.push("stop");
-
-            //when router is Running, only VMware support scaleUp(change service offering)
-            if (jsonObj.hypervisor == "VMware") {
-                allowedActions.push("scaleUp");
-            }
-
-            allowedActions.push("restart");
-            allowedActions.push("remove");
-            allowedActions.push("viewConsole");
-
-            if (isAdmin()) {
-                allowedActions.push("migrate");
-                allowedActions.push("diagnostics");
-                allowedActions.push("retrieveDiagnostics");
-                allowedActions.push("healthChecks");
-            }
-        } else if (jsonObj.state == 'Stopped') {
-            allowedActions.push("start");
-
-            //when router is Stopped, all hypervisors support scaleUp(change service offering)
-            allowedActions.push("scaleUp");
-
-            allowedActions.push("remove");
-        }
-        if (jsonObj.state == 'Starting' || jsonObj.state == 'Stopping' || jsonObj.state == 'Migrating') {
-            allowedActions.push("viewConsole");
-        }
-        return allowedActions;
-    }
-
-    var internallbinstanceActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-
-        if (jsonObj.state == 'Running') {
-            allowedActions.push("stop");
-            allowedActions.push("viewConsole");
-            if (isAdmin())
-            allowedActions.push("migrate");
-        } else if (jsonObj.state == 'Stopped') {
-            allowedActions.push("start");
-        }
-        if (jsonObj.state == 'Starting' || jsonObj.state == 'Stopping' || jsonObj.state == 'Migrating') {
-            allowedActions.push("viewConsole");
-        }
-        return allowedActions;
-    }
-
-    var systemvmActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-
-        if (jsonObj.state == 'Running') {
-            allowedActions.push("stop");
-            allowedActions.push("restart");
-            allowedActions.push("remove");
-
-            //when systemvm is Running, only VMware support scaleUp(change service offering)
-            if (jsonObj.hypervisor == "VMware") {
-                allowedActions.push("scaleUp");
-            }
-
-            allowedActions.push("viewConsole");
-            if (isAdmin()) {
-                allowedActions.push("migrate");
-                allowedActions.push("diagnostics");
-                allowedActions.push("retrieveDiagnostics");
-            }
-        } else if (jsonObj.state == 'Stopped') {
-            allowedActions.push("start");
-
-            //when systemvm is Stopped, all hypervisors support scaleUp(change service offering)
-            allowedActions.push("scaleUp");
-
-            allowedActions.push("remove");
-        } else if (jsonObj.state == 'Error') {
-            allowedActions.push("remove");
-        }
-        if (jsonObj.state == 'Starting' || jsonObj.state == 'Stopping' || jsonObj.state == 'Migrating') {
-            allowedActions.push("viewConsole");
-        }
-        return allowedActions;
-    }
-
-    var routerGroupActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-        if (jsonObj.routerRequiresUpgrade > 0) {
-            allowedActions.push("upgradeRouterToUseNewerTemplate");
-        }
-        return allowedActions;
-    }
-
-    var bladeActionfilter = function (args) {
-        var jsonObj = args.context.item;
-        var allowedActions =[];
-        if (jsonObj.profiledn == null) {
-            allowedActions.push("associateTemplateToBlade");
-        } else {
-            allowedActions.push("disassociateProfileFromBlade");
-        }
-        return allowedActions;
-    }
-
-    //action filters (end)
-
-    var networkProviderActionFilter = function (id) {
-        return function (args) {
-            var allowedActions =[];
-            var jsonObj = nspMap[id] ?
-            nspMap[id]: {
-            };
-
-            if (id == "netscaler") {
-                var netscalerControlCenter = null;
-
-                $.ajax({
-                    url: createURL("listNetscalerControlCenter"),
-                    dataType: "json",
-                    async: false,
-                    success: function(json) {
-                        var items = json.listNetscalerControlCenter.netscalercontrolcenter;
-                        if (items != null && items.length > 0) {
-                            netscalerControlCenter = items[0];
-                        }
-                    }
-                });
-            }
-
-            if (netscalerControlCenter != null) {
-              if (jsonObj.state == undefined) {
-                        $.ajax({
-                            url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
-                            dataType: "json",
-                            async: true,
-                            success: function (json) {
-                                var jobId = json.addnetworkserviceproviderresponse.jobid;
-                                var addNetscalerProviderIntervalID = setInterval(function () {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                        dataType: "json",
-                                        success: function (json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(addNetscalerProviderIntervalID);
-                                                if (result.jobstatus == 1) {
-                                                    nspMap[ "netscaler"] = result.jobresult.networkserviceprovider;
-                                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
-                                                } else if (result.jobstatus == 2) {
-                                                    alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + _s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        },
-                                        error: function (XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg);
-                                        }
-                                    });
-                                },
-                                g_queryAsyncJobResultInterval);
-                            }
-                        });
-                        jsonObj.state = "Disabled";
-                    }
-            }
-
-            if (jsonObj.state) {
-               if (jsonObj.state == "Enabled")
-                 allowedActions.push("disable"); else if (jsonObj.state == "Disabled")
-                 allowedActions.push("enable");
-                 allowedActions.push("destroy");
-            }
-
-            allowedActions.push('add');
-
-            return allowedActions;
-        }
-    };
-
-    var addExtraPropertiesToClusterObject = function (jsonObj) {
-        if (jsonObj.managedstate == "Managed") {
-            jsonObj.state = jsonObj.allocationstate; //jsonObj.state == Enabled, Disabled
-        } else {
-            jsonObj.state = jsonObj.managedstate; //jsonObj.state == Unmanaged, PrepareUnmanaged, PrepareUnmanagedError
-        }
-    }
-
-    var addExtraPropertiesToRouterInstanceObject = function (jsonObj) {
-        if (jsonObj.isredundantrouter == true) {
-            jsonObj[ "redundantRouterState"] = jsonObj.redundantstate;
-        } else {
-            jsonObj[ "redundantRouterState"] = "";
-        }
-    }
-
-    var refreshNspData = function (nspName) {
-        var array1 =[];
-        if (nspName != null)
-        array1.push("&name=" + nspName);
-
-        $.ajax({
-            url: createURL("listNetworkServiceProviders&physicalnetworkid=" + selectedPhysicalNetworkObj.id + array1.join("")),
-            dataType: "json",
-            async: false,
-            success: function (json) {
-                nspMap = {
-                };
-                //reset
-
-                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                if (items != null) {
-                    for (var i = 0; i < items.length; i++) {
-                        switch (items[i].name) {
-                            case "VirtualRouter":
-                            nspMap[ "virtualRouter"] = items[i];
-                            break;
-                            case "InternalLbVm":
-                            nspMap[ "InternalLbVm"] = items[i];
-                            break;
-                            case "VpcVirtualRouter":
-                            nspMap[ "vpcVirtualRouter"] = items[i];
-                            break;
-                            case "Ovs":
-                                nspMap["Ovs"] = items[i];
-                                break;
-                            case "Netscaler":
-                            nspMap[ "netscaler"] = items[i];
-                            break;
-                            case "BaremetalDhcpProvider":
-                            nspMap[ "BaremetalDhcpProvider"] = items[i];
-                            break;
-                            case "BaremetalPxeProvider":
-                            nspMap[ "BaremetalPxeProvider"] = items[i];
-                            break;
-                            case "F5BigIp":
-                            nspMap[ "f5"] = items[i];
-                            break;
-                            case "JuniperSRX":
-                            nspMap[ "srx"] = items[i];
-                            break;
-                            case "PaloAlto":
-                            nspMap[ "pa"] = items[i];
-                            break;
-                            case "SecurityGroupProvider":
-                            nspMap[ "securityGroups"] = items[i];
-                            break;
-                            case "NiciraNvp":
-                            nspMap[ "niciraNvp"] = items[i];
-                            break;
-                            case "BrocadeVcs":
-                            nspMap[ "brocadeVcs"] = items[i];
-                            break;
-                            case "BigSwitchBcf":
-                            nspMap[ "bigswitchBcf"] = items[i];
-                            break;
-                            case "Ovs":
-                            nspMap[ "Ovs"] = items[i];
-                            break;
-                            case "Opendaylight":
-                            nspMap[ "Opendaylight"] = items[i];
-                            break;
-                            case "GloboDns":
-                                nspMap["GloboDns"] = items[i];
-                                break;
-                            case "ConfigDrive":
-                                nspMap["ConfigDrive"] = items[i];
-                                break;
-                        }
-                    }
-                }
-            }
-        });
-
-        nspHardcodingArray =[ {
-            id: 'netscaler',
-            name: 'NetScaler',
-            state: nspMap.netscaler ? nspMap.netscaler.state: 'Disabled'
-        },
-        {
-            id: 'virtualRouter',
-            name: 'Virtual Router',
-            state: nspMap.virtualRouter ? nspMap.virtualRouter.state: 'Disabled'
-        },
-        {
-            id: 'niciraNvp',
-            name: 'Nicira Nvp',
-            state: nspMap.niciraNvp ? nspMap.niciraNvp.state: 'Disabled'
-        },
-        {
-            id: 'brocadeVcs',
-            name: 'Brocade',
-            state: nspMap.brocadeVcs ? nspMap.brocadeVcs.state: 'Disabled'
-        },
-        {
-            id: 'bigswitchBcf',
-            name: 'BigSwitch BCF',
-            state: nspMap.bigswitchBcf ? nspMap.bigswitchBcf.state: 'Disabled'
-        },
-        {
-            id: 'BaremetalDhcpProvider',
-            name: 'Baremetal DHCP',
-            state: nspMap.BaremetalDhcpProvider ? nspMap.BaremetalDhcpProvider.state: 'Disabled'
-        },
-        {
-            id: 'BaremetalPxeProvider',
-            name: 'Baremetal PXE',
-            state: nspMap.BaremetalPxeProvider ? nspMap.BaremetalPxeProvider.state: 'Disabled'
-        },
-        {
-            id: 'Opendaylight',
-            name: 'OpenDaylight (Experimental)',
-            state: nspMap.Opendaylight ? nspMap.Opendaylight.state: 'Disabled'
-        }];
-
-        $(window).trigger('cloudStack.system.serviceProviders.makeHarcodedArray', {
-            nspHardcodingArray: nspHardcodingArray,
-            selectedZoneObj: selectedZoneObj,
-            selectedPhysicalNetworkObj: selectedPhysicalNetworkObj
-        });
-
-        if (selectedZoneObj.networktype == "Basic") {
-            nspHardcodingArray.push({
-                id: 'securityGroups',
-                name: 'Security Groups',
-                state: nspMap.securityGroups ? nspMap.securityGroups.state: 'Disabled'
-            });
-        } else if (selectedZoneObj.networktype == "Advanced") {
-            nspHardcodingArray.push({
-                id: 'InternalLbVm',
-                name: 'Internal LB VM',
-                state: nspMap.InternalLbVm ? nspMap.InternalLbVm.state: 'Disabled'
-            });
-
-            nspHardcodingArray.push({
-                id: 'vpcVirtualRouter',
-                name: 'VPC Virtual Router',
-                state: nspMap.vpcVirtualRouter ? nspMap.vpcVirtualRouter.state: 'Disabled'
-            });
-            nspHardcodingArray.push({
-                id: 'f5',
-                name: 'F5',
-                state: nspMap.f5 ? nspMap.f5.state: 'Disabled'
-            });
-            nspHardcodingArray.push({
-                id: 'srx',
-                name: 'SRX',
-                state: nspMap.srx ? nspMap.srx.state: 'Disabled'
-            });
-            nspHardcodingArray.push({
-                id: 'pa',
-                name: 'Palo Alto',
-                state: nspMap.pa ? nspMap.pa.state: 'Disabled'
-            });
-            nspHardcodingArray.push({
-                id: 'GloboDns',
-                name: 'GloboDNS',
-                state: nspMap.GloboDns ? nspMap.GloboDns.state : 'Disabled'
-            });
-            nspHardcodingArray.push({
-                id: "ConfigDrive",
-                name: "ConfigDrive",
-                state: nspMap.ConfigDrive ? nspMap.ConfigDrive.state : 'Disabled'
-            });
-
-            //CLOUDSTACK-6840: OVS refers to SDN provider. However, we are not supporting SDN in this release.
-            /*
-            nspHardcodingArray.push({
-                id: 'Ovs',
-                name: 'Ovs',
-                state: nspMap.Ovs ? nspMap.Ovs.state: 'Disabled'
-            });
-            */
-        }
-    };
-
-    cloudStack.actionFilter.physicalNetwork = function (args) {
-        var state = args.context.item.state;
-
-        if (state != 'Destroyed') {
-            return[ 'remove'];
-        }
-
-        return[];
-    };
-
-    function addExtraPropertiesToGroupbyObjects(groupbyObjs, groupbyId) {
-        for (var i = 0; i < groupbyObjs.length; i++) {
-            addExtraPropertiesToGroupbyObject(groupbyObjs[i], groupbyId);
-        }
-    }
-
-    function addExtraPropertiesToGroupbyObject(groupbyObj, groupbyId) {
-        var currentPage = 1;
-
-        var listRoutersData = {
-            listAll: true,
-            pagesize: pageSize //global variable
-        };
-        listRoutersData[groupbyId] = groupbyObj.id;
-
-        $.ajax({
-            url: createURL('listRouters'),
-            data: $.extend({
-            },
-            listRoutersData, {
-                page: currentPage
-            }),
-            async: false,
-            success: function(json) {
-                if (json.listroutersresponse.count != undefined) {
-                    var routerCountFromAllPages = json.listroutersresponse.count;
-                    var routerCountFromFirstPageToCurrentPage = json.listroutersresponse.router.length;
-                    var routerRequiresUpgrade = 0;
-
-                    var items = json.listroutersresponse.router;
-                    for (var k = 0; k < items.length; k++) {
-                        if (items[k].requiresupgrade) {
-                            routerRequiresUpgrade++;
-                        }
-                    }
-
-                    $.ajax({
-                        url: createURL('listRouters'),
-                        data: $.extend({}, listRoutersData, {
-                            page: currentPage,
-                            projectid: -1
-                        }),
-                        async: false,
-                        success: function(json) {
-                            if (json.listroutersresponse.count != undefined) {
-                                routerCountFromAllPages += json.listroutersresponse.count;
-                                groupbyObj.routerCount = routerCountFromAllPages;
-
-                                routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
-
-                                var items = json.listroutersresponse.router;
-                                for (var k = 0; k < items.length; k++) {
-                                    if (items[k].requiresupgrade) {
-                                        routerRequiresUpgrade++;
-                                    }
-                                }
-                            } else {
-                                groupbyObj.routerCount = routerCountFromAllPages;
-                            }
-                        }
-                    });
-
-                    var callListApiWithPage = function() {
-                        $.ajax({
-                            url: createURL('listRouters'),
-                            async: false,
-                            data: $.extend({}, listRoutersData, {
-                                page: currentPage
-                            }),
-                            success: function(json) {
-                                routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
-                                var items = json.listroutersresponse.router;
-                                for (var k = 0; k < items.length; k++) {
-                                    if (items[k].requiresupgrade) {
-                                        routerRequiresUpgrade++;
-                                    }
-                                }
-
-                                $.ajax({
-                                    url: createURL('listRouters'),
-                                    async: false,
-                                    data: $.extend({}, listRoutersData, {
-                                        page: currentPage,
-                                        projectid: -1
-                                    }),
-                                    success: function(json) {
-                                        if (json.listroutersresponse.count != undefined) {
-                                            routerCountFromAllPages += json.listroutersresponse.count;
-                                            groupbyObj.routerCount = routerCountFromAllPages;
-
-                                            routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
-
-                                            var items = json.listroutersresponse.router;
-                                            for (var k = 0; k < items.length; k++) {
-                                                if (items[k].requiresupgrade) {
-                                                    routerRequiresUpgrade++;
-                                                }
-                                            }
-                                        } else {
-                                            groupbyObj.routerCount = routerCountFromAllPages;
-                                        }
-                                    }
-                                });
-
-                                if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
-                                    currentPage++;
-                                    callListApiWithPage();
-                                }
-                            }
-                        });
-                    }
-
-                    if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
-                        currentPage++;
-                        callListApiWithPage();
-                    }
-
-                    groupbyObj.routerRequiresUpgrade = routerRequiresUpgrade;
-                    groupbyObj.numberOfRouterRequiresUpgrade = routerRequiresUpgrade;
-                } else {
-                    groupbyObj.routerCount = 0;
-                    groupbyObj.routerRequiresUpgrade = 0;
-                    groupbyObj.numberOfRouterRequiresUpgrade = 0;
-                }
-            }
-        });
-    }
-})($, cloudStack);
diff --git a/ui/legacy/scripts/templates.js b/ui/legacy/scripts/templates.js
deleted file mode 100644
index 8c9ff62..0000000
--- a/ui/legacy/scripts/templates.js
+++ /dev/null
@@ -1,4216 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    var ostypeObjs;
-    var previousCollection = [];
-    var previousFilterType = null;
-
-    cloudStack.sections.templates = {
-        title: 'label.menu.templates',
-        id: 'templates',
-        sectionSelect: {
-            label: 'label.select-view'
-        },
-        sections: {
-            templates: {
-                type: 'select',
-                title: 'label.menu.templates',
-                listView: {
-                    id: 'templates',
-                    label: 'label.menu.templates',
-                    filters: {
-                        all: {
-                            preFilter: function(args) {
-                                if (isAdmin()|| isDomainAdmin()) //"listTemplates&templatefilter=all" only for root-admin and domain-admin. Domain-admin is able to see all templates in his domain.
-                                    return true;
-                                else
-                                    return false;
-                            },
-                            label: 'ui.listView.filters.all'
-                        },
-                        mine: {
-                            label: 'ui.listView.filters.mine'
-                        },
-                        shared: {
-                            label: 'label.shared'
-                        },
-                        featured: {
-                            label: 'label.featured'
-                        },
-                        community: {
-                            label: 'label.community'
-                        }
-                    },
-                    preFilter: function() {
-                        if (isAdmin()||isDomainAdmin()) {
-                            return []
-                        }
-                        return ['account']
-                    },
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        hypervisor: {
-                            label: 'label.hypervisor'
-                        },
-                        ostypename: {
-                            label: 'label.os.type'
-                        },
-                        account: {
-                            label: 'label.account'
-                        }
-                    },
-
-                    advSearchFields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        zoneid: {
-                            label: 'label.zone',
-                            select: function(args) {
-                                $.ajax({
-                                    url: createURL('listZones'),
-                                    data: {
-                                        listAll: true
-                                    },
-                                    success: function(json) {
-                                        var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                        args.response.success({
-                                            data: $.map(zones, function(zone) {
-                                                return {
-                                                    id: zone.id,
-                                                    description: zone.name
-                                                };
-                                            })
-                                        });
-                                    }
-                                });
-                            }
-                        },
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    reorder: cloudStack.api.actions.sort('updateTemplate', 'templates'),
-                    actions: {
-                        add: {
-                            label: 'label.add',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.action.register.template';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.action.register.template',
-                                docID: 'helpNetworkOfferingName',
-                                preFilter: cloudStack.preFilter.createTemplate,
-                                fields: {
-                                    url: {
-                                        label: 'label.url',
-                                        docID: 'helpRegisterTemplateURL',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpRegisterTemplateName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        docID: 'helpRegisterTemplateDescription',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    zone: {
-                                        label: 'label.zone',
-                                        docID: 'helpRegisterTemplateZone',
-                                        isMultiple: true,
-                                        validation: {
-                                            allzonesonly: true
-                                        },
-                                        select: function(args) {
-                                            if(g_regionsecondaryenabled == true) {
-                                                args.response.success({
-                                                    data: [{
-                                                        id: -1,
-                                                        description: "All Zones"
-                                                    }]
-                                                });
-                                            } else {
-                                                $.ajax({
-                                                    url: createURL("listZones&available=true"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var zoneObjs = [];
-                                                        var items = json.listzonesresponse.zone;
-                                                        if (items != null) {
-                                                            for (var i = 0; i < items.length; i++) {
-                                                                zoneObjs.push({
-                                                                    id: items[i].id,
-                                                                    description: items[i].name
-                                                                });
-                                                            }
-                                                        }
-                                                        if (isAdmin() && !(cloudStack.context.projects && cloudStack.context.projects[0])) {
-                                                            zoneObjs.unshift({
-                                                                id: -1,
-                                                                description: "All Zones"
-                                                            });
-                                                        }
-                                                        args.response.success({
-                                                            data: zoneObjs
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    },
-                                    hypervisor: {
-                                        label: 'label.hypervisor',
-                                        docID: 'helpRegisterTemplateHypervisor',
-                                        dependsOn: 'zone',
-                                        select: function(args) {
-                                            if (args.zone == null)
-                                                return;
-                                            // We want only distinct Hypervisor entries to be visible to the user
-                                            var items = [];
-                                            var distinctHVNames = [];
-                                            var length = 1;
-                                            // When only one zone is selected, args.zone is NOT an array.
-                                            if (Object.prototype.toString.call( args.zone ) === '[object Array]')
-                                                length = args.zone.length;
-                                            for (var index = 0; index < length; index++)
-                                            {
-                                                var zoneId;
-                                                if (length == 1)
-                                                        zoneId = args.zone;
-                                                else
-                                                        zoneId = args.zone[index];
-
-                                                var apiCmd;
-                                                if (zoneId == -1) { //All Zones
-                                                    apiCmd = "listHypervisors";
-                                                }
-                                                else {
-                                                    apiCmd = "listHypervisors&zoneid=" + zoneId;
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL(apiCmd),
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function(json) {
-                                                        var hypervisorObjs = json.listhypervisorsresponse.hypervisor;
-
-                                                        $(hypervisorObjs).each(function() {
-                                                        // Only if this hypervisor isn't already part of this
-                                                        // list, then add to the drop down
-                                                           if (distinctHVNames.indexOf(this.name) < 0 ){
-                                                               distinctHVNames.push(this.name);
-                                                               items.push({
-                                                                   id: this.name,
-                                                                   description: this.name
-                                                               });
-                                                           }
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                            args.$select.change(function() {
-                                                var $form = $(this).closest('form');
-                                                if ($(this).val() == "VMware") {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').hide();
-                                                    $form.find('.form-item[rel=nicAdapterType]').hide();
-                                                    $form.find('.form-item[rel=keyboardType]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=xenserverToolsVersion61plus]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').hide();
-                                                    $form.find('.form-item[rel=directdownload]').hide();
-                                                    $form.find('.form-item[rel=requireshvm]').hide();
-                                                } else if ($(this).val() == "XenServer") {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').hide();
-                                                    $form.find('.form-item[rel=nicAdapterType]').hide();
-                                                    $form.find('.form-item[rel=keyboardType]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').hide();
-                                                    $form.find('.form-item[rel=directdownload]').hide();
-                                                    $form.find('.form-item[rel=requireshvm]').css('display', 'inline-block');
-
-                                                    if (isAdmin()) {
-                                                        $form.find('.form-item[rel=xenserverToolsVersion61plus]').css('display', 'inline-block');
-                                                    }
-                                                } else if ($(this).val() == "KVM") {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').hide();
-                                                    $form.find('.form-item[rel=nicAdapterType]').hide();
-                                                    $form.find('.form-item[rel=keyboardType]').hide();
-                                                    $form.find('.form-item[rel=xenserverToolsVersion61plus]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').css('display', 'inline-block');
-                                                    $('#label_root_disk_controller').prop('selectedIndex', 2);
-                                                    $form.find('.form-item[rel=requireshvm]').css('display', 'inline-block');
-                                                    if (isAdmin()) {
-                                                      $form.find('.form-item[rel=directdownload]').css('display', 'inline-block');
-                                                    }
-                                                } else {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').hide();
-                                                    $form.find('.form-item[rel=nicAdapterType]').hide();
-                                                    $form.find('.form-item[rel=keyboardType]').hide();
-                                                    $form.find('.form-item[rel=xenserverToolsVersion61plus]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').hide();
-                                                    $form.find('.form-item[rel=directdownload]').hide();
-                                                    $form.find('.form-item[rel=requireshvm]').css('display', 'inline-block');
-                                                }
-                                            });
-
-                                            items.push({
-                                                id: "Any",
-                                                description: "Any"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                            args.$select.trigger('change');
-
-                                        }
-                                    },
-
-                                    // fields for hypervisor == XenServer (starts here)
-                                    xenserverToolsVersion61plus: {
-                                        label: 'label.xenserver.tools.version.61.plus',
-                                        isBoolean: true,
-                                        isChecked: function (args) {
-                                             var b = true;
-                                            if (isAdmin()) {
-                                                $.ajax({
-                                                    url: createURL('listConfigurations'),
-                                                    data: {
-                                                        name: 'xenserver.pvdriver.version'
-                                                    },
-                                                    async: false,
-                                                    success: function (json) {
-                                                        if (json.listconfigurationsresponse.configuration != null && json.listconfigurationsresponse.configuration[0].value != 'xenserver61') {
-                                                            b = false;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                            return b;
-                                        },
-                                        isHidden: true
-                                    },
-                                    // fields for hypervisor == XenServer (ends here)
-
-                                    // fields for hypervisor == "KVM" (starts here)
-                                    // Direct Download
-                                    directdownload : {
-                                        label: 'label.direct.download',
-                                        docID: 'helpRegisterTemplateDirectDownload',
-                                        isBoolean: true,
-                                        dependsOn: 'hypervisor',
-                                        isHidden: true
-                                    },
-                                    checksum: {
-                                        label: 'label.checksum',
-                                        dependsOn: 'directdownload',
-                                        isHidden: true
-                                    },
-                                    // Direct Download - End
-                                    rootDiskControllerTypeKVM: {
-                                        label: 'label.root.disk.controller',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            items.push({
-                                                id: "ide",
-                                                description: "ide"
-                                            });
-                                            items.push({
-                                                id: "osdefault",
-                                                description: "osdefault"
-                                            });
-                                            items.push({
-                                                id: "scsi",
-                                                description: "virtio-scsi"
-                                            });
-                                            items.push({
-                                                id: "virtio",
-                                                description: "virtio"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    // fields for hypervisor == "KVM" (ends here)
-
-                                    // fields for hypervisor == "VMware" (starts here)
-                                    rootDiskControllerType: {
-                                        label: 'label.root.disk.controller',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            items.push({
-                                                id: "scsi",
-                                                description: "scsi"
-                                            });
-                                            items.push({
-                                                id: "ide",
-                                                description: "ide"
-                                            });
-                                            items.push({
-                                                id: "osdefault",
-                                                description: "osdefault"
-                                            });
-                                            items.push({
-                                                id: "pvscsi",
-                                                description: "pvscsi"
-                                            });
-                                            items.push({
-                                                id: "lsilogic",
-                                                description: "lsilogic"
-                                            });
-                                            items.push({
-                                                id: "lsisas1068",
-                                                description: "lsilogicsas"
-                                            });
-                                            items.push({
-                                                id: "buslogic",
-                                                description: "buslogic"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    nicAdapterType: {
-                                        label: 'label.nic.adapter.type',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            items.push({
-                                                id: "E1000",
-                                                description: "E1000"
-                                            });
-                                            items.push({
-                                                id: "PCNet32",
-                                                description: "PCNet32"
-                                            });
-                                            items.push({
-                                                id: "Vmxnet2",
-                                                description: "Vmxnet2"
-                                            });
-                                            items.push({
-                                                id: "Vmxnet3",
-                                                description: "Vmxnet3"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    keyboardType: {
-                                        label: 'label.keyboard.type',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            for (var key in cloudStackOptions.keyboardOptions) {
-                                                items.push({
-                                                    id: key,
-                                                    description: _l(cloudStackOptions.keyboardOptions[key])
-                                                });
-                                            }
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    // fields for hypervisor == "VMware" (ends here)
-
-                                    format: {
-                                        label: 'label.format',
-                                        docID: 'helpRegisterTemplateFormat',
-                                        dependsOn: 'hypervisor',
-                                        select: function(args) {
-                                            var items = [];
-                                            if (args.hypervisor == "XenServer") {
-                                                //formatSelect.append("<option value='VHD'>VHD</option>");
-                                                items.push({
-                                                    id: 'VHD',
-                                                    description: 'VHD'
-                                                });
-                                            } else if (args.hypervisor == "VMware") {
-                                                //formatSelect.append("<option value='OVA'>OVA</option>");
-                                                items.push({
-                                                    id: 'OVA',
-                                                    description: 'OVA'
-                                                });
-                                            } else if (args.hypervisor == "KVM") {
-                                                //formatSelect.append("<option value='QCOW2'>QCOW2</option>");
-                                                items.push({
-                                                    id: 'QCOW2',
-                                                    description: 'QCOW2'
-                                                });
-                                                items.push({
-                                                    id: 'RAW',
-                                                    description: 'RAW'
-                                                });
-                                                items.push({
-                                                    id: 'VHD',
-                                                    description: 'VHD'
-                                                });
-                                                items.push({
-                                                    id: 'VMDK',
-                                                    description: 'VMDK'
-                                                });
-                                            } else if (args.hypervisor == "BareMetal") {
-                                                //formatSelect.append("<option value='BareMetal'>BareMetal</option>");
-                                                items.push({
-                                                    id: 'BareMetal',
-                                                    description: 'BareMetal'
-                                                });
-                                            } else if (args.hypervisor == "Ovm") {
-                                                //formatSelect.append("<option value='RAW'>RAW</option>");
-                                                items.push({
-                                                    id: 'RAW',
-                                                    description: 'RAW'
-                                                });
-                                            } else if (args.hypervisor == "LXC") {
-                                                //formatSelect.append("<option value='TAR'>TAR</option>");
-                                                items.push({
-                                                    id: 'TAR',
-                                                    description: 'TAR'
-                                                });
-                                            } else if (args.hypervisor == "Hyperv") {
-                                                items.push({
-                                                    id: 'VHD',
-                                                    description: 'VHD'
-                                                });
-                                                items.push({
-                                                    id: 'VHDX',
-                                                    description: 'VHDX'
-                                                });
-                                            }
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    osTypeId: {
-                                        label: 'label.os.type',
-                                        docID: 'helpRegisterTemplateOSType',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listOsTypes"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var ostypeObjs = json.listostypesresponse.ostype;
-                                                    args.response.success({
-                                                        data: ostypeObjs
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    isExtractable: {
-                                        label: "label.extractable",
-                                        docID: 'helpRegisterTemplateExtractable',
-                                        isBoolean: true
-                                    },
-
-                                    isPasswordEnabled: {
-                                        label: "label.password.enabled",
-                                        docID: 'helpRegisterTemplatePasswordEnabled',
-                                        isBoolean: true
-                                    },
-
-                                    isdynamicallyscalable: {
-                                        label: "label.dynamically.scalable",
-                                        docID: 'helpRegisterTemplateDynamicallyScalable',
-                                        isBoolean: true
-                                    },
-
-                                    isPublic: {
-                                        label: "label.public",
-                                        docID: 'helpRegisterTemplatePublic',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-
-                                    isFeatured: {
-                                        label: "label.featured",
-                                        docID: 'helpRegisterTemplateFeatured',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-                                    isrouting: {
-                                        label: 'label.routing',
-                                        docID: 'helpRegisterTemplateRouting',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-                                    requireshvm: {
-                                        label: 'label.hvm',
-                                        docID: 'helpRegisterTemplateHvm',
-                                        isBoolean: true,
-                                        isHidden: false,
-                                        isChecked: true
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                var zones = "";
-                                if (Object.prototype.toString.call( args.data.zone ) === '[object Array]'){
-                                    zones = args.data.zone.join(",");
-                                }
-                                else
-                                    zones = args.data.zone;
-                                var data = {
-                                    name: args.data.name,
-                                    displayText: args.data.description,
-                                    url: args.data.url,
-                                    zoneids: zones,
-                                    format: args.data.format,
-                                    isextractable: (args.data.isExtractable == "on"),
-                                    passwordEnabled: (args.data.isPasswordEnabled == "on"),
-                                    isdynamicallyscalable: (args.data.isdynamicallyscalable == "on"),
-                                    osTypeId: args.data.osTypeId,
-                                    hypervisor: args.data.hypervisor
-                                };
-
-                                if (args.$form.find('.form-item[rel=isPublic]').css("display") != "none") {
-                                    $.extend(data, {
-                                        ispublic: (args.data.isPublic == "on")
-                                    });
-                                }
-
-                                if (args.$form.find('.form-item[rel=requireshvm]').css("display") != "none") {
-                                    $.extend(data, {
-                                        requireshvm: (args.data.requireshvm == "on")
-                                    });
-                                }
-
-                                if (args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") {
-                                    $.extend(data, {
-                                        isfeatured: (args.data.isFeatured == "on")
-                                    });
-                                }
-
-                                if (args.$form.find('.form-item[rel=isrouting]').is(':visible')) {
-                                    $.extend(data, {
-                                        isrouting: (args.data.isrouting === 'on')
-                                    });
-                                }
-
-                                // for hypervisor == XenServer (starts here)
-                                if (args.$form.find('.form-item[rel=xenserverToolsVersion61plus]').css("display") != "none") {
-                                    $.extend(data, {
-                                        'details[0].hypervisortoolsversion': (args.data.xenserverToolsVersion61plus == "on") ? "xenserver61" : "xenserver56"
-                                    });
-                                }
-                                // for hypervisor == XenServer (ends here)
-
-                                // for hypervisor == KVM (starts here)
-                                if (args.$form.find('.form-item[rel=rootDiskControllerTypeKVM]').css("display") != "none" && args.data.rootDiskControllerTypeKVM != "") {
-                                    $.extend(data, {
-                                        'details[0].rootDiskController': args.data.rootDiskControllerTypeKVM
-                                    });
-                                }
-
-                                if (args.$form.find('.form-item[rel=directdownload]').css("display") != "none" && args.data.directdownload != "") {
-                                    $.extend(data, {
-                                        'directdownload': (args.data.directdownload == "on") ? "true" : "false",
-                                        'checksum': args.data.checksum
-                                    });
-                                }
-                                // for hypervisor == KVM (ends here)
-
-                                // for hypervisor == VMware (starts here)
-                                if (args.$form.find('.form-item[rel=rootDiskControllerType]').css("display") != "none" && args.data.rootDiskControllerType != "") {
-                                    $.extend(data, {
-                                        'details[0].rootDiskController': args.data.rootDiskControllerType
-                                    });
-                                }
-                                if (args.$form.find('.form-item[rel=nicAdapterType]').css("display") != "none" && args.data.nicAdapterType != "") {
-                                    $.extend(data, {
-                                        'details[0].nicAdapter': args.data.nicAdapterType
-                                    });
-                                }
-                                if (args.$form.find('.form-item[rel=keyboardType]').css("display") != "none" && args.data.keyboardType != "") {
-                                    $.extend(data, {
-                                        'details[0].keyboard': args.data.keyboardType
-                                    });
-                                }
-                                // for hypervisor == VMware (ends here)
-
-                                $.ajax({
-                                    url: createURL('registerTemplate'),
-                                    data: data,
-                                    success: function(json) {
-                                        var items = json.registertemplateresponse.template; //items might have more than one array element if it's create templates for all zones.
-                                        args.response.success({
-                                            data: items[0]
-                                        });
-                                    },
-                                    error: function(XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        },
-
-                        uploadTemplateFromLocal: {
-                            isHeader: true,
-                            label: 'label.upload.from.local',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.upload.template.from.local';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.upload.template.from.local',
-                                preFilter: cloudStack.preFilter.createTemplate,
-                                fileUpload: {
-                                    getURL: function(args) {
-                                        args.data = args.formData;
-
-                                        var data = {
-                                            name: args.data.name,
-                                            displayText: args.data.description,
-                                            zoneid: args.data.zone,
-                                            format: args.data.format,
-                                            isextractable: (args.data.isExtractable == "on"),
-                                            passwordEnabled: (args.data.isPasswordEnabled == "on"),
-                                            isdynamicallyscalable: (args.data.isdynamicallyscalable == "on"),
-                                            osTypeId: args.data.osTypeId,
-                                            hypervisor: args.data.hypervisor
-                                        };
-
-                                        // for hypervisor == XenServer (starts here)
-                                        if (args.$form.find('.form-item[rel=xenserverToolsVersion61plus]').css("display") != "none") {
-                                            $.extend(data, {
-                                                'details[0].hypervisortoolsversion': (args.data.xenserverToolsVersion61plus == "on") ? "xenserver61" : "xenserver56"
-                                            });
-                                        }
-                                        // for hypervisor == XenServer (ends here)
-
-                                        // for hypervisor == KVM (starts here)
-                                        if (args.$form.find('.form-item[rel=rootDiskControllerTypeKVM]').css("display") != "none" && args.data.rootDiskControllerTypeKVM != "") {
-                                            $.extend(data, {
-                                                'details[0].rootDiskController': args.data.rootDiskControllerTypeKVM
-                                            });
-                                        }
-                                        // for hypervisor == KVM (ends here)
-
-                                        // for hypervisor == VMware (starts here)
-                                        if (args.$form.find('.form-item[rel=rootDiskControllerType]').css("display") != "none" && args.data.rootDiskControllerType != "") {
-                                            $.extend(data, {
-                                                'details[0].rootDiskController': args.data.rootDiskControllerType
-                                            });
-                                        }
-                                        if (args.$form.find('.form-item[rel=nicAdapterType]').css("display") != "none" && args.data.nicAdapterType != "") {
-                                            $.extend(data, {
-                                                'details[0].nicAdapter': args.data.nicAdapterType
-                                            });
-                                        }
-                                        if (args.$form.find('.form-item[rel=keyboardType]').css("display") != "none" && args.data.keyboardType != "") {
-                                            $.extend(data, {
-                                                'details[0].keyboard': args.data.keyboardType
-                                            });
-                                        }
-                                        // for hypervisor == VMware (ends here)
-
-                                        if (args.$form.find('.form-item[rel=isPublic]').css("display") != "none") {
-                                            $.extend(data, {
-                                                ispublic: (args.data.isPublic == "on")
-                                            });
-                                        }
-
-                                        if (args.$form.find('.form-item[rel=requireshvm]').css("display") != "none") {
-                                            $.extend(data, {
-                                                requireshvm: (args.data.requireshvm == "on")
-                                            });
-                                        }
-
-                                        if (args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") {
-                                            $.extend(data, {
-                                                isfeatured: (args.data.isFeatured == "on")
-                                            });
-                                        }
-
-                                        if (args.$form.find('.form-item[rel=isrouting]').is(':visible')) {
-                                            $.extend(data, {
-                                                isrouting: (args.data.isrouting === 'on')
-                                            });
-                                        }
-
-                                        $.ajax({
-                                            url: createURL('getUploadParamsForTemplate'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                var uploadparams = json.postuploadtemplateresponse.getuploadparams;
-                                                var templateId = uploadparams.id;
-
-                                                args.response.success({
-                                                    url: uploadparams.postURL,
-                                                    ajaxPost: true,
-                                                    data: {
-                                                        'X-signature': uploadparams.signature,
-                                                        'X-expires': uploadparams.expires,
-                                                        'X-metadata': uploadparams.metadata
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    postUpload: function(args) {
-                                        if(args.error) {
-                                            args.response.error(args.errorMsg);
-                                        } else {
-                                            cloudStack.dialog.notice({
-                                                message: "This template file has been uploaded. Please check its status at Templates menu > " + args.data.name + " > Zones tab > click a zone > Status field and Ready field."
-                                            });
-                                            args.response.success();
-                                        }
-                                    }
-                                },
-                                fields: {
-                                    templateFileUpload: {
-                                        label: 'label.local.file',
-                                        isFileUpload: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpRegisterTemplateName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    description: {
-                                        label: 'label.description',
-                                        docID: 'helpRegisterTemplateDescription',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    zone: {
-                                        label: 'label.zone',
-                                        docID: 'helpRegisterTemplateZone',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones&available=true"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    args.response.success({
-                                                        descriptionField: 'name',
-                                                        data: zoneObjs
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    hypervisor: {
-                                        label: 'label.hypervisor',
-                                        docID: 'helpRegisterTemplateHypervisor',
-                                        dependsOn: 'zone',
-                                        select: function(args) {
-                                            if (args.zone == null)
-                                                return;
-
-                                            var apiCmd;
-                                            if (args.zone == -1) { //All Zones
-                                                //apiCmd = "listHypervisors&zoneid=-1"; //"listHypervisors&zoneid=-1" has been changed to return only hypervisors available in all zones (bug 8809)
-                                                apiCmd = "listHypervisors";
-                                            } else {
-                                                apiCmd = "listHypervisors&zoneid=" + args.zone;
-                                            }
-
-                                            $.ajax({
-                                                url: createURL(apiCmd),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    var hypervisorObjs = json.listhypervisorsresponse.hypervisor;
-                                                    var items = [];
-                                                    $(hypervisorObjs).each(function() {
-                                                        items.push({
-                                                            id: this.name,
-                                                            description: this.name
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                            args.$select.change(function() {
-                                                var $form = $(this).closest('form');
-                                                if ($(this).val() == "VMware") {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=nicAdapterType]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=keyboardType]').css('display', 'inline-block');
-                                                    $form.find('.form-item[rel=xenserverToolsVersion61plus]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').hide();
-                                                    $form.find('.form-item[rel=requireshvm]').hide();
-                                                } else if ($(this).val() == "XenServer") {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').hide();
-                                                    $form.find('.form-item[rel=nicAdapterType]').hide();
-                                                    $form.find('.form-item[rel=keyboardType]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').hide();
-                                                    $form.find('.form-item[rel=requireshvm]').css('display', 'inline-block');
-                                                    if (isAdmin()) {
-                                                        $form.find('.form-item[rel=xenserverToolsVersion61plus]').css('display', 'inline-block');
-                                                    }
-                                                } else if ($(this).val() == "KVM") {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').hide();
-                                                    $form.find('.form-item[rel=nicAdapterType]').hide();
-                                                    $form.find('.form-item[rel=keyboardType]').hide();
-                                                    $form.find('.form-item[rel=xenserverToolsVersion61plus]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').css('display', 'inline-block');
-                                                    $('#label_root_disk_controller').prop('selectedIndex', 2);
-                                                    $form.find('.form-item[rel=requireshvm]').css('display', 'inline-block');
-                                                } else {
-                                                    $form.find('.form-item[rel=rootDiskControllerType]').hide();
-                                                    $form.find('.form-item[rel=nicAdapterType]').hide();
-                                                    $form.find('.form-item[rel=keyboardType]').hide();
-                                                    $form.find('.form-item[rel=xenserverToolsVersion61plus]').hide();
-                                                    $form.find('.form-item[rel=rootDiskControllerTypeKVM]').hide();
-                                                    $form.find('.form-item[rel=requireshvm]').css('display', 'inline-block');
-                                                }
-                                            });
-                                            args.$select.trigger('change');
-                                        }
-                                    },
-
-                                    // fields for hypervisor == XenServer (starts here)
-                                    xenserverToolsVersion61plus: {
-                                        label: 'label.xenserver.tools.version.61.plus',
-                                        isBoolean: true,
-                                        isChecked: function (args) {
-                                             var b = true;
-                                            if (isAdmin()) {
-                                                $.ajax({
-                                                    url: createURL('listConfigurations'),
-                                                    data: {
-                                                        name: 'xenserver.pvdriver.version'
-                                                    },
-                                                    async: false,
-                                                    success: function (json) {
-                                                        if (json.listconfigurationsresponse.configuration != null && json.listconfigurationsresponse.configuration[0].value != 'xenserver61') {
-                                                            b = false;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                            return b;
-                                        },
-                                        isHidden: true
-                                    },
-                                    // fields for hypervisor == XenServer (ends here)
-
-                                    // fields for hypervisor == "KVM" (starts here)
-                                    rootDiskControllerTypeKVM: {
-                                        label: 'label.root.disk.controller',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            items.push({
-                                                id: "ide",
-                                                description: "ide"
-                                            });
-                                            items.push({
-                                                id: "osdefault",
-                                                description: "osdefault"
-                                            });
-                                            items.push({
-                                                id: "scsi",
-                                                description: "virtio-scsi"
-                                            });
-                                            items.push({
-                                                id: "virtio",
-                                                description: "virtio"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    // fields for hypervisor == "KVM" (ends here)
-
-                                    // fields for hypervisor == "VMware" (starts here)
-                                    rootDiskControllerType: {
-                                        label: 'label.root.disk.controller',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            items.push({
-                                                id: "scsi",
-                                                description: "scsi"
-                                            });
-                                            items.push({
-                                                id: "ide",
-                                                description: "ide"
-                                            });
-                                            items.push({
-                                                id: "osdefault",
-                                                description: "osdefault"
-                                            });
-                                            items.push({
-                                                id: "pvscsi",
-                                                description: "pvscsi"
-                                            });
-                                            items.push({
-                                                id: "lsilogic",
-                                                description: "lsilogic"
-                                            });
-                                            items.push({
-                                                id: "lsisas1068",
-                                                description: "lsilogicsas"
-                                            });
-                                            items.push({
-                                                id: "buslogic",
-                                                description: "buslogic"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    nicAdapterType: {
-                                        label: 'label.nic.adapter.type',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            items.push({
-                                                id: "E1000",
-                                                description: "E1000"
-                                            });
-                                            items.push({
-                                                id: "PCNet32",
-                                                description: "PCNet32"
-                                            });
-                                            items.push({
-                                                id: "Vmxnet2",
-                                                description: "Vmxnet2"
-                                            });
-                                            items.push({
-                                                id: "Vmxnet3",
-                                                description: "Vmxnet3"
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    keyboardType: {
-                                        label: 'label.keyboard.type',
-                                        isHidden: true,
-                                        select: function(args) {
-                                            var items = []
-                                            items.push({
-                                                id: "",
-                                                description: ""
-                                            });
-                                            for (var key in cloudStackOptions.keyboardOptions) {
-                                                items.push({
-                                                    id: key,
-                                                    description: _l(cloudStackOptions.keyboardOptions[key])
-                                                });
-                                            }
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-                                    // fields for hypervisor == "VMware" (ends here)
-
-                                    format: {
-                                        label: 'label.format',
-                                        docID: 'helpRegisterTemplateFormat',
-                                        dependsOn: 'hypervisor',
-                                        select: function(args) {
-                                            var items = [];
-                                            if (args.hypervisor == "XenServer") {
-                                                items.push({
-                                                    id: 'VHD',
-                                                    description: 'VHD'
-                                                });
-                                            } else if (args.hypervisor == "VMware") {
-                                                items.push({
-                                                    id: 'OVA',
-                                                    description: 'OVA'
-                                                });
-                                            } else if (args.hypervisor == "KVM") {
-                                                items.push({
-                                                    id: 'QCOW2',
-                                                    description: 'QCOW2'
-                                                });
-                                                items.push({
-                                                    id: 'RAW',
-                                                    description: 'RAW'
-                                                });
-                                                items.push({
-                                                    id: 'VHD',
-                                                    description: 'VHD'
-                                                });
-                                                items.push({
-                                                    id: 'VMDK',
-                                                    description: 'VMDK'
-                                                });
-                                            } else if (args.hypervisor == "BareMetal") {
-                                                items.push({
-                                                    id: 'BareMetal',
-                                                    description: 'BareMetal'
-                                                });
-                                            } else if (args.hypervisor == "Ovm") {
-                                                items.push({
-                                                    id: 'RAW',
-                                                    description: 'RAW'
-                                                });
-                                            } else if (args.hypervisor == "LXC") {
-                                                items.push({
-                                                    id: 'TAR',
-                                                    description: 'TAR'
-                                                });
-                                            } else if (args.hypervisor == "Hyperv") {
-                                                items.push({
-                                                    id: 'VHD',
-                                                    description: 'VHD'
-                                                });
-                                                items.push({
-                                                    id: 'VHDX',
-                                                    description: 'VHDX'
-                                                });
-                                            }
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    osTypeId: {
-                                        label: 'label.os.type',
-                                        docID: 'helpRegisterTemplateOSType',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listOsTypes"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var ostypeObjs = json.listostypesresponse.ostype;
-                                                    args.response.success({
-                                                        data: ostypeObjs
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    isExtractable: {
-                                        label: "label.extractable",
-                                        docID: 'helpRegisterTemplateExtractable',
-                                        isBoolean: true
-                                    },
-
-                                    isPasswordEnabled: {
-                                        label: "label.password.enabled",
-                                        docID: 'helpRegisterTemplatePasswordEnabled',
-                                        isBoolean: true
-                                    },
-
-                                    isdynamicallyscalable: {
-                                        label: "label.dynamically.scalable",
-                                        docID: 'helpRegisterTemplateDynamicallyScalable',
-                                        isBoolean: true
-                                    },
-
-                                    isPublic: {
-                                        label: "label.public",
-                                        docID: 'helpRegisterTemplatePublic',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-
-                                    isFeatured: {
-                                        label: "label.featured",
-                                        docID: 'helpRegisterTemplateFeatured',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-
-                                    isrouting: {
-                                        label: 'label.routing',
-                                        docID: 'helpRegisterTemplateRouting',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-
-                                    requireshvm: {
-                                        label: 'label.hvm',
-                                        docID: 'helpRegisterTemplateHvm',
-                                        isBoolean: true,
-                                        isHidden: false,
-                                        isChecked: true
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                return; //createForm.fileUpload.getURL() has executed the whole action. Therefore, nothing needs to be done here.
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-                        // Due to zonal grouping, low pagesize can result lower
-                        // aggregated items, resulting in no scroll shown
-                        // So, use maximum pagesize
-                        data.pagesize = 200;
-
-                        var ignoreProject = false;
-                        if (args.filterBy != null) { //filter dropdown
-                            if (args.filterBy.kind != null) {
-                                if (previousFilterType != args.filterBy.kind || args.page == 1) {
-                                    previousFilterType = args.filterBy.kind;
-                                    previousCollection = [];
-                                }
-                                switch (args.filterBy.kind) {
-                                    case "all":
-                                        $.extend(data, {
-                                            templatefilter: 'all'
-                                        });
-                                        break;
-                                    case "mine":
-                                        $.extend(data, {
-                                            templatefilter: 'self'
-                                        });
-                                        break;
-                                    case "shared":
-                                        $.extend(data, {
-                                            templatefilter: 'shared'
-                                        });
-                                        break;
-                                    case "featured":
-                                        ignoreProject = true;
-                                        $.extend(data, {
-                                            templatefilter: 'featured'
-                                        });
-                                        break;
-                                    case "community":
-                                        ignoreProject = true;
-                                        $.extend(data, {
-                                            templatefilter: 'community'
-                                        });
-                                        break;
-                                }
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL('listTemplates', {
-                                ignoreProject: ignoreProject
-                            }),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listtemplatesresponse.template;
-                                var itemsView = [];
-
-                                $(items).each(function(index, item) {
-                                    var existing = $.grep(previousCollection, function(it){
-                                        return it != null && it.id !=null && it.id == item.id;
-                                    });
-
-                                    if (existing.length > 0) {
-                                        return true; // skip adding this entry
-                                    } else {
-                                        var templateItem = $.extend(item, {
-                                            zones: item.zonename,
-                                            zoneids: [item.zoneid]
-                                        });
-                                        itemsView.push(templateItem);
-                                        previousCollection.push(templateItem);
-                                    }
-                                });
-
-                                args.response.success({
-                                    actionFilter: templateActionfilter,
-                                    data: itemsView
-                                });
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'Template details',
-                        viewAll: {
-                            label: 'label.instances',
-                            path: 'instances'
-                        },
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    //***** updateTemplate *****
-                                    var data = {
-                                        id: args.context.templates[0].id,
-                                        //zoneid: args.context.templates[0].zoneid, //can't update template/ISO in only one zone. It always get updated in all zones.
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext,
-                                        ostypeid: args.data.ostypeid,
-                                        templatetype: args.data.templatetype,
-                                        passwordenabled: (args.data.passwordenabled == "on"),
-                                        isdynamicallyscalable: (args.data.isdynamicallyscalable == "on")
-                                    };
-                                    if (args.data.isrouting != null) {
-                                        $.extend(data, {
-                                            isrouting: (args.data.isrouting === 'on')
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('updateTemplate'),
-                                        data: data,
-                                        async: false,
-                                        success: function(json) {
-                                            //API returns an incomplete embedded object  (some properties are missing in the embedded template object)
-                                        }
-                                    });
-
-
-                                    //***** updateTemplatePermissions *****
-                                    var data = {
-                                        id: args.context.templates[0].id
-                                        //zoneid: args.context.templates[0].zoneid //can't update template/ISO in only one zone. It always get updated in all zones.
-                                    };
-
-                                    //if args.data.ispublic is undefined(i.e. checkbox is hidden), do not pass ispublic to API call.
-                                    if (args.data.ispublic == "on") {
-                                        $.extend(data, {
-                                            ispublic: true
-                                        });
-                                    } else if (args.data.ispublic == "off") {
-                                        $.extend(data, {
-                                            ispublic: false
-                                        });
-                                    }
-                                    //if args.data.isfeatured is undefined(i.e. checkbox is hidden), do not pass isfeatured to API call.
-                                    if (args.data.isfeatured == "on") {
-                                        $.extend(data, {
-                                            isfeatured: true
-                                        });
-                                    } else if (args.data.isfeatured == "off") {
-                                        $.extend(data, {
-                                            isfeatured: false
-                                        });
-                                    }
-                                    //if args.data.isextractable is undefined(i.e. checkbox is hidden), do not pass isextractable to API call.
-                                    if (args.data.isextractable == "on") {
-                                        $.extend(data, {
-                                            isextractable: true
-                                        });
-                                    } else if (args.data.isextractable == "off") {
-                                        $.extend(data, {
-                                            isextractable: false
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('updateTemplatePermissions'),
-                                        data: data,
-                                        async: false,
-                                        success: function(json) {
-                                            //API doesn't return an embedded object
-                                        }
-                                    });
-
-
-                                    //***** addResourceDetail *****
-                                    //XenServer only (starts here)
-                                      if(args.$detailView.find('form').find('div .detail-group').find('.xenserverToolsVersion61plus').length > 0) {
-                                          $.ajax({
-                                              url: createURL('addResourceDetail'),
-                                              data: {
-                                                  resourceType: 'template',
-                                                  resourceId: args.context.templates[0].id,
-                                                  'details[0].key': 'hypervisortoolsversion',
-                                                  'details[0].value': (args.data.xenserverToolsVersion61plus == "on") ? 'xenserver61' : 'xenserver56'
-                                              },
-                                              success: function(json) {
-                                                   var jobId = json.addResourceDetailresponse.jobid;
-                                                   var addResourceDetailIntervalID = setInterval(function() {
-                                                       $.ajax({
-                                                           url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                           dataType: "json",
-                                                           success: function(json) {
-                                                               var result = json.queryasyncjobresultresponse;
-
-                                                               if (result.jobstatus == 0) {
-                                                                   return; //Job has not completed
-                                                               } else {
-                                                                   clearInterval(addResourceDetailIntervalID);
-
-                                                                   if (result.jobstatus == 1) {
-                                                                       //do nothing
-                                                                   } else if (result.jobstatus == 2) {
-                                                                       cloudStack.dialog.notice({
-                                                                           message: "message.XSTools61plus.update.failed" + " " + _s(result.jobresult.errortext)
-                                                                       });
-                                                                   }
-                                                               }
-                                                           },
-                                                           error: function(XMLHttpResponse) {
-                                                               cloudStack.dialog.notice({
-                                                                   message: "message.XSTools61plus.update.failed" + " " + parseXMLHttpResponse(XMLHttpResponse)
-                                                               });
-                                                           }
-                                                       });
-                                                   }, g_queryAsyncJobResultInterval);
-                                              }
-                                          });
-                                      }
-                                      //XenServer only (ends here)
-
-
-                                    //***** listTemplates *****
-                                    //So, we call listTemplates API to get a complete template object
-                                    var data = {
-                                        id: args.context.templates[0].id,
-                                        zoneid: args.context.templates[0].zoneid,
-                                        templatefilter: 'self'
-                                    };
-                                    $.ajax({
-                                        url: createURL('listTemplates'),
-                                        data: data,
-                                        async: false,
-                                        success: function(json) {
-                                            var item = json.listtemplatesresponse.template;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            downloadTemplate: {
-                                label: 'label.action.download.template',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.download.template';
-                                    },
-                                    notification: function(args) {
-                                        return 'message.action.downloading.template';
-                                    },
-                                    complete: function(args) {
-                                        var url = args.url;
-                                        var htmlMsg = _l('message.download.template');
-                                        var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
-                                        return htmlMsg2;
-                                    }
-                                },
-                                action: function(args) {
-                                    var apiCmd = "extractTemplate&mode=HTTP_DOWNLOAD&id=" + args.context.templates[0].id;
-                                    if (args.context.templates[0].zoneid != null)
-                                        apiCmd += "&zoneid=" + args.context.templates[0].zoneid;
-
-                                    $.ajax({
-                                        url: createURL(apiCmd),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.extracttemplateresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.template;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return templateActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            // Share template
-                            shareTemplate: {
-                                label: 'label.action.share.template',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.action.share.template';
-                                    }
-                                },
-
-                                createForm: {
-                                    title: 'label.action.share.template',
-                                    desc: '',
-                                    fields: {
-                                        operation: {
-                                            label: 'label.operation',
-                                            docID: 'helpUpdateTemplateOperation',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                var items = [];
-                                                items.push({
-                                                    id: "add",
-                                                    description: "Add"
-                                                });
-                                                items.push({
-                                                    id: "remove",
-                                                    description: "Remove"
-                                                });
-                                                items.push({
-                                                    id: "reset",
-                                                    description: "Reset"
-                                                });
-
-                                                args.response.success({
-                                                    data: items
-                                                });
-
-                                                // Select change
-                                                args.$select.change(function () {
-                                                    var $form = $(this).closest('form');
-                                                    var selectedOperation = $(this).val();
-                                                    if (selectedOperation === "reset") {
-                                                        $form.find('[rel=projects]').hide();
-                                                        $form.find('[rel=sharewith]').hide();
-                                                        $form.find('[rel=accounts]').hide();
-                                                        $form.find('[rel=accountlist]').hide();
-                                                    } else {
-                                                        // allow.user.view.domain.accounts = true
-                                                        // Populate List of accounts in domain as dropdown multiselect
-                                                        $form.find('[rel=sharewith]').css('display', 'inline-block');
-                                                        if (!isUser() || g_allowUserViewAllDomainAccounts === true) {
-                                                            $form.find('[rel=projects]').css('display', 'inline-block');
-                                                            $form.find('[rel=accounts]').css('display', 'inline-block');
-                                                            $form.find('[rel=accountlist]').hide();
-                                                        } else {
-                                                            // If users are not allowed to see accounts in the domain, show input text field for Accounts
-                                                            // Projects will always be shown as dropdown multiselect
-                                                            $form.find('[rel=projects]').css('display', 'inline-block');
-                                                            $form.find('[rel=accountslist]').css('display', 'inline-block');
-                                                            $form.find('[rel=accounts]').hide();
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        shareWith: {
-                                            label: 'label.share.with',
-                                            docID: 'helpUpdateTemplateShareWith',
-                                            validation: {
-                                                required: true
-                                            },
-                                            dependsOn: 'operation',
-                                            select: function (args) {
-                                                var items = [];
-                                                items.push({
-                                                    id: "account",
-                                                    description: "Account"
-                                                });
-                                                items.push({
-                                                    id: "project",
-                                                    description: "Project"
-                                                });
-
-                                                args.response.success({ data: items });
-
-                                                // Select change
-                                                args.$select.change(function () {
-                                                    var $form = $(this).closest('form');
-                                                    var sharedWith = $(this).val();
-                                                    if (args.operation !== "reset") {
-                                                        if (sharedWith === "project") {
-                                                            $form.find('[rel=accounts]').hide();
-                                                            $form.find('[rel=accountlist]').hide();
-                                                            $form.find('[rel=projects]').css('display', 'inline-block');
-                                                        } else {
-                                                            // allow.user.view.domain.accounts = true
-                                                            // Populate List of accounts in domain as dropdown multiselect
-                                                            if (!isUser() || g_allowUserViewAllDomainAccounts === true) {
-                                                                $form.find('[rel=projects]').hide();
-                                                                $form.find('[rel=accountlist]').hide();
-                                                                $form.find('[rel=accounts]').css('display', 'inline-block');
-                                                            } else {
-                                                                // If users are not allowed to see accounts in the domain, show input text field for Accounts
-                                                                // Projects will always be shown as dropdown multiselect
-                                                                $form.find('[rel=projects]').hide();
-                                                                $form.find('[rel=accounts]').hide();
-                                                                $form.find('[rel=accountlist]').css('display', 'inline-block');
-                                                            }
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        },
-
-                                        accountlist: {
-                                            label: 'label.accounts',
-                                            docID: 'helpUpdateTemplateAccountList'
-                                        },
-
-                                        accounts: {
-                                            label: 'label.accounts',
-                                            docID: 'helpUpdateTemplateAccounts',
-                                            dependsOn: 'shareWith',
-                                            isMultiple: true,
-                                            select: function (args) {
-                                                var operation = args.operation;
-                                                if (operation !== "reset") {
-                                                    $.ajax({
-                                                        url: createURL("listAccounts&listall=true"),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (jsonAccounts) {
-                                                            var accountByName = {};
-                                                            $.each(jsonAccounts.listaccountsresponse.account, function(idx, account) {
-                                                                // Only add current domain's accounts for add as update template permissions supports that
-                                                                if (account.domainid === g_domainid && operation === "add") {
-                                                                    accountByName[account.name] = {
-                                                                        projName: account.name,
-                                                                        hasPermission: false
-                                                                    };
-                                                                }
-                                                            });
-                                                            $.ajax({
-                                                                url: createURL('listTemplatePermissions&id=' + args.context.templates[0].id),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    items = json.listtemplatepermissionsresponse.templatepermission.account;
-                                                                    $.each(items, function(idx, accountName) {
-                                                                        if (accountByName[accountName]) {
-                                                                            accountByName[accountName].hasPermission = true;
-                                                                        }
-                                                                    });
-
-                                                                    var accountObjs = [];
-                                                                    if (operation === "add") {
-                                                                        // Skip already permitted accounts
-                                                                        $.each(Object.keys(accountByName), function(idx, accountName) {
-                                                                            if (accountByName[accountName].hasPermission == false) {
-                                                                                accountObjs.push({
-                                                                                    name: accountName,
-                                                                                    description: accountName
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    } else if (items != null) {
-                                                                        $.each(items, function(idx, accountName) {
-                                                                            if (accountName !== g_account) {
-                                                                                accountObjs.push({
-                                                                                    name: accountName,
-                                                                                    description: accountName
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    }
-                                                                    args.$select.html('');
-                                                                    args.response.success({data: accountObjs});
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-
-                                        projects: {
-                                            label: 'label.projects',
-                                            docID: 'helpUpdateTemplateProjectIds',
-                                            dependsOn: 'shareWith',
-                                            isMultiple: true,
-                                            select: function (args) {
-                                                var operation = args.operation;
-                                                if (operation !== "reset") {
-                                                    $.ajax({
-                                                        url: createURL("listProjects&listall=true"),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (jsonProjects) {
-                                                            var projectsByIds = {};
-                                                            $.each(jsonProjects.listprojectsresponse.project, function(idx, project) {
-                                                                // Only add current domain's projects for add operation as update template permissions supports that
-                                                                if ((project.domainid === g_domainid && operation === "add") || operation === "remove") {
-                                                                    projectsByIds[project.id] = {
-                                                                        projName: project.name,
-                                                                        hasPermission: false
-                                                                    };
-                                                                }
-                                                            });
-
-                                                            $.ajax({
-                                                                url: createURL('listTemplatePermissions&id=' + args.context.templates[0].id),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    items = json.listtemplatepermissionsresponse.templatepermission.projectids;
-                                                                    $.each(items, function(idx, projectId) {
-                                                                        if (projectsByIds[projectId]) {
-                                                                            projectsByIds[projectId].hasPermission = true;
-                                                                        }
-                                                                    });
-
-                                                                    var projectObjs = [];
-                                                                    if (operation === "add") {
-                                                                        // Skip already permitted accounts
-                                                                        $.each(Object.keys(projectsByIds), function(idx, projectId) {
-                                                                            if (projectsByIds[projectId].hasPermission == false) {
-                                                                                projectObjs.push({
-                                                                                    id: projectId,
-                                                                                    description: projectsByIds[projectId].projName
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    } else if (items != null) {
-                                                                        $.each(items, function(idx, projectId) {
-                                                                            if (projectId !== g_account) {
-                                                                                projectObjs.push({
-                                                                                    id: projectId,
-                                                                                    description: projectsByIds[projectId] ? projectsByIds[projectId].projName : projectId
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    }
-                                                                    args.$select.html('');
-                                                                    args.response.success({data: projectObjs});
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                },
-
-                                action: function (args) {
-                                    // Load data from form
-                                    var data = {
-                                        id: args.context.templates[0].id,
-                                        op: args.data.operation
-                                    };
-                                    var selectedOperation = args.data.operation;
-                                    if (selectedOperation === "reset") {
-                                        // Do not append Project ID or Account to data object
-                                    } else {
-                                        var projects = args.data.projects;
-                                        var accounts = args.data.accounts;
-                                        var accountList = args.data.accountlist;
-
-                                        if (accounts !== undefined || (accountList !== undefined && accountList.length > 0)) {
-                                            var accountNames = "";
-                                            if (accountList !== undefined && accounts === undefined) {
-                                                accountNames = accountList;
-                                            } else {
-                                                if (Object.prototype.toString.call(accounts) === '[object Array]') {
-                                                    accountNames = accounts.join(",");
-                                                } else {
-                                                    accountNames = accounts;
-                                                }
-                                            }
-                                            $.extend(data, {
-                                                accounts: accountNames
-                                            });
-                                        }
-
-                                        if (projects !== undefined) {
-                                            var projectIds = "";
-                                            if (Object.prototype.toString.call(projects) === '[object Array]') {
-                                                projectIds = projects.join(",");
-                                            } else {
-                                                projectIds = projects;
-                                            }
-
-                                            $.extend(data, {
-                                                projectids: projectIds
-                                            });
-                                        }
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('updateTemplatePermissions'),
-                                        data: data,
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var item = json.updatetemplatepermissionsresponse.success;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    }); //end ajax
-                                }
-                            }
-                        },
-                        tabFilter: function (args) {
-                            var hiddenTabs = [];
-                            return hiddenTabs;
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                preFilter: function(args) {
-                                    var hiddenFields;
-                                    if (isAdmin()) {
-                                        hiddenFields = [];
-                                    } else {
-                                        hiddenFields = ["hypervisor", 'xenserverToolsVersion61plus', 'isrouting'];
-                                    }
-
-                                    if ('templates' in args.context && args.context.templates[0].hypervisor != 'XenServer') {
-                                        hiddenFields.push('xenserverToolsVersion61plus');
-                                    }
-
-                                    if ('templates' in args.context && args.context.templates[0].ostypeid != undefined) {
-                                        var ostypeObjs;
-                                        $.ajax({
-                                            url: createURL("listOsTypes"),
-                                            dataType: "json",
-                                            async: false,
-                                            success: function(json) {
-                                                var ostypeObjs = json.listostypesresponse.ostype;
-                                            }
-                                        });
-
-                                        if (ostypeObjs != undefined) {
-                                            var ostypeName;
-                                            for (var i = 0; i < ostypeObjs.length; i++) {
-                                                if (ostypeObjs[i].id == args.context.templates[0].ostypeid) {
-                                                    ostypeName = ostypeObjs[i].description;
-                                                    break;
-                                                }
-                                            }
-                                            if (ostypeName == undefined || ostypeName.indexOf("Win") == -1) {
-                                                hiddenFields.push('xenserverToolsVersion61plus');
-                                            }
-                                        }
-                                    }
-
-                                    if (!('templates' in args.context && args.context.templates[0].domainid == g_domainid && args.context.templates[0].account == g_account) && !isAdmin()) {
-                                        hiddenFields.push('url');
-                                    }
-                                    return hiddenFields;
-                                },
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    hypervisor: {
-                                        label: 'label.hypervisor'
-                                    },
-                                    xenserverToolsVersion61plus: {
-                                        label: 'label.xenserver.tools.version.61.plus',
-                                        isBoolean: true,
-                                        isEditable: function () {
-                                            if (isAdmin())
-                                                return true;
-                                            else
-                                                return false;
-                                        },
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    size: {
-                                        label: 'label.size',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    directdownload: {
-                                        label: 'label.direct.download',
-                                        isBoolean: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    isextractable: {
-                                        label: 'label.extractable.lower',
-                                        isBoolean: true,
-                                        isEditable: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    passwordenabled: {
-                                        label: 'label.password.enabled',
-                                        isBoolean: true,
-                                        isEditable: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    isdynamicallyscalable: {
-                                        label: 'label.dynamically.scalable',
-                                        isBoolean: true,
-                                        isEditable: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    ispublic: {
-                                        label: 'label.public',
-                                        isBoolean: true,
-                                        isEditable: function() {
-                                            if (isAdmin()) {
-                                                return true;
-                                            } else {
-                                                if (g_userPublicTemplateEnabled == "true")
-                                                    return true;
-                                                else
-                                                    return false;
-                                            }
-                                        },
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    isfeatured: {
-                                        label: 'label.featured',
-                                        isBoolean: true,
-                                        isEditable: function() {
-                                            if (isAdmin())
-                                                return true;
-                                            else
-                                                return false;
-                                        },
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    ostypeid: {
-                                        label: 'label.os.type',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            var ostypeObjs;
-                                            $.ajax({
-                                                url: createURL("listOsTypes"),
-                                                dataType: "json",
-                                                async: false,
-                                                success: function(json) {
-                                                    ostypeObjs = json.listostypesresponse.ostype;
-                                                }
-                                            });
-
-                                            var items = [];
-                                            $(ostypeObjs).each(function() {
-                                                items.push({
-                                                    id: this.id,
-                                                    description: this.description
-                                                });
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    isrouting: {
-                                        label: 'label.routing',
-                                        isBoolean: true,
-                                        isEditable: function() {
-                                            if (isAdmin()) {
-                                                return true;
-                                            } else {
-                                                return false;
-                                            }
-                                        },
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    crossZones: {
-                                        label: 'label.cross.zones',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    },
-                                    url: {
-                                        label: 'label.url'
-                                    },
-
-                                    templatetype: {
-                                        label: 'label.type',
-                                        isEditable: function() {
-                                            if (isAdmin()) {
-                                                return true;
-                                            } else {
-                                                return false;
-                                            }
-                                        },
-                                        select: function(args) {
-                                            var items = [];
-                                            items.push({
-                                                id: 'ROUTING',
-                                                description: 'ROUTING'
-                                            });
-                                            items.push({
-                                                id: 'SYSTEM',
-                                                description: 'SYSTEM'
-                                            });
-                                            items.push({
-                                                id: 'BUILTIN',
-                                                description: 'BUILTIN'
-                                            });
-                                            items.push({
-                                                id: 'PERHOST',
-                                                description: 'PERHOST'
-                                            });
-                                            items.push({
-                                                id: 'USER',
-                                                description: 'USER'
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    id: {
-                                        label: 'label.id'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'Template',
-                                    contextId: 'templates'
-                                }),
-
-
-                                dataProvider: function(args) {  // UI > Templates menu (listing) > select a template from listing > Details tab
-                                    $.ajax({
-                                        url: createURL("listTemplates"),
-                                        data: {
-                                            templatefilter: "self",
-                                            id: args.context.templates[0].id
-                                        },
-                                        success: function(json) {
-                                            var jsonObj = json.listtemplatesresponse.template[0];
-
-                                            if ('details' in jsonObj && 'hypervisortoolsversion' in jsonObj.details) {
-                                                if (jsonObj.details.hypervisortoolsversion == 'xenserver61')
-                                                    jsonObj.xenserverToolsVersion61plus = true;
-                                                else
-                                                    jsonObj.xenserverToolsVersion61plus = false;
-                                            }
-                                            if (jsonObj.templatetype == 'ROUTING') {
-                                                jsonObj.isrouting = true;
-                                            } else {
-                                                jsonObj.isrouting = false;
-                                            }
-
-                                            args.response.success({
-                                                actionFilter: templateActionfilter,
-                                                data: jsonObj
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            zones: {
-                                title: 'label.zones',
-                                listView: {
-                                    id: 'zones',
-                                    fields: {
-                                        zonename: {
-                                            label: 'label.name'
-                                        },
-                                        status: {
-                                            label: 'label.status'
-                                        },
-                                        isready: {
-                                            label: 'state.Ready',
-                                            converter: cloudStack.converters.toBooleanText
-                                        }
-                                    },
-                                    hideSearchBar: true,
-
-
-                                    dataProvider: function(args) {  // UI > Templates menu (listing) > select a template from listing > Details tab > Zones tab (listing)
-                                        var data = { templatefilter: "self",
-                                                     id: args.context.templates[0].id
-                                                   };
-                                        listViewDataProvider(args, data);
-                                        $.ajax({
-                                            url: createURL("listTemplates"),
-                                            data: data,
-                                            success: function(json) {
-                                                var jsonObjs = json.listtemplatesresponse.template;
-
-                                                if (jsonObjs != undefined) {
-                                                    for (var i = 0; i < jsonObjs.length; i++) {
-                                                        var jsonObj = jsonObjs[i];
-                                                        if ('details' in jsonObj && 'hypervisortoolsversion' in jsonObj.details) {
-                                                            if (jsonObj.details.hypervisortoolsversion == 'xenserver61')
-                                                                jsonObj.xenserverToolsVersion61plus = true;
-                                                            else
-                                                                jsonObj.xenserverToolsVersion61plus = false;
-                                                        }
-                                                    }
-                                                    if (!'zonename' in jsonObj) {
-                                                        jsonObj.zonename = 'All Zones';
-                                                    }
-                                                }
-
-                                                args.response.success({
-                                                    actionFilter: templateActionfilter,
-                                                    data: jsonObjs
-                                                });
-                                            }
-                                        });
-                                    },
-
-                                    detailView: {
-                                        noCompact: true,
-                                        actions: {
-                                             remove: {
-                                                 label: 'label.action.delete.template',
-                                                 createForm: {
-                                                    title: 'label.action.delete.template',
-                                                    desc: function(args) {
-                                                       if(args.context.templates[0].crossZones == true) {
-                                                          return 'message.action.delete.template.for.all.zones';
-                                                       } else {
-                                                          return 'message.action.delete.template';
-                                                       }
-                                                      },
-                                                    fields: {
-                                                        forced: {
-                                                            label: 'force.delete',
-                                                            isBoolean: true,
-                                                            isChecked: false
-                                                        }
-                                                    }
-                                                 },
-                                                 messages: {
-                                                     notification: function(args) {
-                                                         return 'label.action.delete.template';
-                                                     }
-                                                 },
-                                                 action: function(args) {
-                                                     var queryParams = "deleteTemplate&id=" + args.context.templates[0].id;
-                                                     if (!args.context.templates[0].crossZones){
-                                                        queryParams += "&zoneid=" + args.context.zones[0].zoneid;
-                                                     }
-                                                     $.ajax({
-                                                         url: createURL(queryParams + "&forced=" + (args.data.forced == "on")),
-                                                         dataType: "json",
-                                                         async: true,
-                                                         success: function(json) {
-                                                             var jid = json.deletetemplateresponse.jobid;
-                                                             args.response.success({
-                                                                 _custom: {
-                                                                     jobId: jid
-                                                                 }
-                                                             });
-                                                         }
-                                                     });
-                                                 },
-                                                 notification: {
-                                                     poll: pollAsyncJobResult
-                                                 }
-                                             },
-                                             copyTemplate: {
-                                                 label: 'label.action.copy.template',
-                                                 messages: {
-                                                     success: function(args) {
-                                                         return 'message.template.copying';
-                                                     },
-                                                     notification: function(args) {
-                                                         return 'label.action.copy.template';
-                                                     }
-                                                 },
-                                                action: {
-                                                    custom: cloudStack.uiCustom.copyTemplate({
-                                                        listView: {
-                                                            listView: {
-                                                                id: 'destinationZones',
-                                                                fields: {
-                                                                    destinationZoneName: {
-                                                                        label: 'label.name'
-                                                                    }
-                                                                },
-                                                                dataProvider: function(args) {
-                                                                     var data = {
-                                                                        page: args.page,
-                                                                        pagesize: pageSize
-                                                                    };
-                                                                    if (args.filterBy.search.value) {
-                                                                        data.keyword = args.filterBy.search.value;
-                                                                    }
-                                                                     $.ajax({
-                                                                             url: createURL("listZones&available=true"),
-                                                                             dataType: "json",
-                                                                             data: data,
-                                                                             async: true,
-                                                                             success: function(json) {
-                                                                                 var zoneObjs = [];
-                                                                                 var items = json.listzonesresponse.zone;
-                                                                                 if (items != null) {
-                                                                                     for (var i = 0; i < items.length; i++) {
-                                                                                         if (args.context.zones[0].zoneid != items[i].id) {
-                                                                                             zoneObjs.push({
-                                                                                                 id: items[i].id,
-                                                                                                 destinationZoneName: items[i].name
-                                                                                             });
-                                                                                         }
-                                                                                     }
-                                                                                     args.response.success({
-                                                                                         data: zoneObjs
-                                                                                     });
-                                                                                }else if(args.page == 1) {
-							                             args.response.success({
-                                                                                         data: []
-                                                                                     });
-                                                                            } else {
-							                             args.response.success({
-                                                                                         data: []
-                                                                                     });
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                }
-                                                            }
-                                                        },
-                                                        action: function(args) {
-                                                            var zoneids = "";
-                                                            if (args.context.selectedZone != null &&
-                                                                    args.context.selectedZone.length > 0) {
-                                                                for (var i = 0; i < args.context.selectedZone.length; i++){
-                                                                    if (i != 0 )
-                                                                        zoneids += ",";
-                                                                    zoneids += args.context.selectedZone[i].id;
-                                                                }
-                                                            }
-                                                            if (zoneids == "")
-                                                                return;
-                                                            var data = {
-                                                                 id: args.context.templates[0].id,
-                                                                 destzoneids: zoneids,
-                                                                 sourcezoneid: args.context.zones[0].zoneid
-                                                            };
-
-                                                             $.ajax({
-                                                                 url: createURL('copyTemplate'),
-                                                                 data: data,
-                                                                 success: function(json) {
-                                                                     var jid = json.copytemplateresponse.jobid;
-                                                                     args.response.success({
-                                                                         _custom: {
-                                                                             jobId: jid,
-                                                                             getUpdatedItem: function(json) {
-                                                                                 return {}; //nothing in this template needs to be updated
-                                                                             },
-                                                                             getActionFilter: function() {
-                                                                                 return templateActionfilter;
-                                                                             }
-                                                                         }
-                                                                     });
-                                                                 }
-                                                             });
-                                                         }
-                                                    })
-                                                 },
-                                                 notification: {
-                                                     poll: pollAsyncJobResult
-                                                 }
-                                            }
-                                        },
-
-                                    tabs: {
-                                        details: {
-                                            title: 'label.details',
-                                            preFilter: function(args) {
-                                                var hiddenFields;
-                                                if (isAdmin()) {
-                                                    hiddenFields = [];
-                                                } else {
-                                                    hiddenFields = ["hypervisor", 'xenserverToolsVersion61plus'];
-                                                }
-
-                                                if ('templates' in args.context && args.context.templates[0].hypervisor != 'XenServer') {
-                                                    hiddenFields.push('xenserverToolsVersion61plus');
-                                                }
-
-                                                if ('templates' in args.context && args.context.templates[0].ostypeid != undefined) {
-                                                    var ostypeObjs;
-                                                    $.ajax({
-                                                        url: createURL("listOsTypes"),
-                                                        dataType: "json",
-                                                        async: false,
-                                                        success: function(json) {
-                                                            ostypeObjs = json.listostypesresponse.ostype;
-                                                        }
-                                                    });
-
-                                                    if (ostypeObjs != undefined) {
-                                                        var ostypeName;
-                                                        for (var i = 0; i < ostypeObjs.length; i++) {
-                                                            if (ostypeObjs[i].id == args.context.templates[0].ostypeid) {
-                                                                ostypeName = ostypeObjs[i].description;
-                                                                break;
-                                                            }
-                                                        }
-                                                        if (ostypeName == undefined || ostypeName.indexOf("Win") == -1) {
-                                                            hiddenFields.push('xenserverToolsVersion61plus');
-                                                        }
-                                                    }
-                                                }
-
-                                                return hiddenFields;
-                                            },
-
-                                            fields: [{
-                                                name: {
-                                                    label: 'label.name',
-                                                    isEditable: true,
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                }
-                                            }, {
-                                                id: {
-                                                    label: 'label.id'
-                                                },
-                                                zonename: {
-                                                    label: 'label.zone.name'
-                                                },
-                                                zoneid: {
-                                                    label: 'label.zone.id'
-                                                },
-                                                isready: {
-                                                    label: 'state.Ready',
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                status: {
-                                                    label: 'label.status'
-                                                }
-                                            }, {
-                                                hypervisor: {
-                                                    label: 'label.hypervisor'
-                                                },
-                                                xenserverToolsVersion61plus: {
-                                                    label: 'label.xenserver.tools.version.61.plus',
-                                                    isBoolean: true,
-                                                    isEditable: function () {
-                                                        if (isAdmin())
-                                                            return true;
-                                                        else
-                                                            return false;
-                                                    },
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-
-                                                size: {
-                                                    label: 'label.size',
-                                                    converter: function(args) {
-                                                        if (args == null || args == 0)
-                                                            return "";
-                                                        else
-                                                            return cloudStack.converters.convertBytes(args);
-                                                    }
-                                                },
-                                                isextractable: {
-                                                    label: 'label.extractable.lower',
-                                                    isBoolean: true,
-                                                    isEditable: true,
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                passwordenabled: {
-                                                    label: 'label.password.enabled',
-                                                    isBoolean: true,
-                                                    isEditable: true,
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                isdynamicallyscalable: {
-                                                    label: 'label.dynamically.scalable',
-                                                    isBoolean: true,
-                                                    isEditable: true,
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                ispublic: {
-                                                    label: 'label.public',
-                                                    isBoolean: true,
-                                                    isEditable: function() {
-                                                        if (isAdmin()) {
-                                                            return true;
-                                                        } else {
-                                                            if (g_userPublicTemplateEnabled == "true")
-                                                                return true;
-                                                            else
-                                                                return false;
-                                                        }
-                                                    },
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                isfeatured: {
-                                                    label: 'label.featured',
-                                                    isBoolean: true,
-                                                    isEditable: function() {
-                                                        if (isAdmin())
-                                                            return true;
-                                                        else
-                                                            return false;
-                                                    },
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-
-                                                ostypeid: {
-                                                    label: 'label.os.type',
-                                                    isEditable: true,
-                                                    select: function(args) {
-                                                        var ostypeObjs;
-                                                        $.ajax({
-                                                            url: createURL("listOsTypes"),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                ostypeObjs = json.listostypesresponse.ostype;
-                                                            }
-                                                        });
-
-                                                        var items = [];
-                                                        $(ostypeObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.description
-                                                            });
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                },
-
-
-                                                displaytext: {
-                                                    label: 'label.description',
-                                                    isEditable: true,
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                },
-
-                                                domain: {
-                                                    label: 'label.domain'
-                                                },
-                                                account: {
-                                                    label: 'label.account'
-                                                },
-                                                created: {
-                                                    label: 'label.created',
-                                                    converter: cloudStack.converters.toLocalDate
-                                                },
-
-                                                templatetype: {
-                                                    label: 'label.type'
-                                                }
-
-                                            }],
-
-                                            tags: cloudStack.api.tags({
-                                                resourceType: 'Template',
-                                                contextId: 'templates'
-                                            }),
-
-
-                                            dataProvider: function(args) {  // UI > Templates menu (listing) > select a template from listing > Details tab > Zones tab (listing) > select a zone from listing > Details tab
-                                                var jsonObj = args.context.zones[0];
-
-                                                if ('details' in jsonObj && 'hypervisortoolsversion' in jsonObj.details) {
-                                                    if (jsonObj.details.hypervisortoolsversion == 'xenserver61')
-                                                        jsonObj.xenserverToolsVersion61plus = true;
-                                                    else
-                                                        jsonObj.xenserverToolsVersion61plus = false;
-                                                }
-
-                                                args.response.success({
-                                                    actionFilter: templateActionfilter,
-                                                    data: jsonObj
-                                                });
-                                            }
-                                        }
-                                    }}
-                                }
-                            },
-                            /**
-							 * Settings tab
-							 */
-							settings: {
-								title: 'label.settings',
-								custom: cloudStack.uiCustom.granularDetails({
-                                    resourceType: 'Template',
-									dataProvider: function(args) {
-									    // no paging for listTemplates details
-									    if (args.page > 1) {
-									        args.response.success({
-									            data: []
-									        });
-									        return;
-									    }
-										$.ajax({
-											url: createURL('listTemplates'),
-											data: {
-												templatefilter: "self",
-												id: args.context.templates[0].id
-											},
-											success: function(json) {
-												var details = json.listtemplatesresponse.template[0].details;
-												var listDetails = [];
-												for (detail in details){
-													var det = {};
-													det["name"] = detail;
-													det["value"] = details[detail];
-													listDetails.push(det);
-												}
-												args.response.success({
-													data: listDetails
-												});
-											},
-
-											error: function(json) {
-												args.response.error(parseXMLHttpResponse(json));
-											}
-										});
-
-									},
-									actions: {
-										edit: function(args) {
-											var data = {
-												name: args.data.jsonObj.name,
-												value: args.data.value
-											};
-											var existingDetails = args.context.templates[0].details;
-											var newDetails = '';
-											for (d in existingDetails) {
-												if (d != data.name) {
-													newDetails += 'details[0].' + d + '=' + existingDetails[d] + '&';
-												}
-											}
-											newDetails += 'details[0].' + data.name + '=' + data.value;
-
-											$.ajax({
-												url: createURL('updateTemplate&id=' + args.context.templates[0].id + '&' + newDetails),
-												success: function(json) {
-													var template = json.updatetemplateresponse.template;
-													args.context.templates[0].details = template.details;
-													args.response.success({
-														data: template.details
-													});
-												},
-
-												error: function(json) {
-													args.response.error(parseXMLHttpResponse(json));
-												}
-											});
-										},
-										remove: function(args) {
-											var existingDetails = args.context.templates[0].details;
-											var detailToDelete = args.data.jsonObj.name;
-											var newDetails = ''
-											for (detail in existingDetails) {
-												if (detail != detailToDelete) {
-													newDetails += 'details[0].' + detail + '=' + existingDetails[detail] + '&';
-												}
-											}
-											if (newDetails != '') {
-												newDetails = newDetails.substring(0, newDetails.length - 1);
-											}
-											else {
-												newDetails += 'cleanupdetails=true';
-											}
-											$.ajax({
-												url: createURL('updateTemplate&id=' + args.context.templates[0].id + '&' + newDetails),
-												success: function(json) {
-													var template = json.updatetemplateresponse.template;
-													args.context.templates[0].details = template.details;
-													args.response.success({
-														data: template.details
-													});
-												},
-												error: function(json) {
-													args.response.error(parseXMLHttpResponse(json));
-												}
-											});
-										},
-										add: function(args) {
-											var name = args.data.name;
-											var value = args.data.value;
-											var details = args.context.templates[0].details;
-											var detailsFormat = '';
-											for (key in details) {
-												detailsFormat += "details[0]." + key + "=" + details[key] + "&";
-											}
-											// Add new detail to the existing ones
-											detailsFormat += "details[0]." + name + "=" + value;
-											$.ajax({
-												url: createURL('updateTemplate&id=' + args.context.templates[0].id + "&" + detailsFormat),
-												async: false,
-												success: function(json) {
-													var template = json.updatetemplateresponse.template;
-													args.context.templates[0].details = template.details;
-													args.response.success({
-														data: template.details
-													});
-												}
-											});
-										}
-									}
-								})
-							}
-						}
-                    }
-                }
-            },
-            isos: {
-                type: 'select',
-                title: 'label.iso',
-                listView: {
-                    label: 'label.iso',
-                    filters: {
-                        all: {
-                            preFilter: function(args) {
-                                if (isAdmin()||isDomainAdmin()) //"listIsos&filter=all" works for root-admin and domain-admin. Domain-admin is able to see all Isos in his domain.
-                                    return true;
-                                else
-                                    return false;
-                            },
-                            label: 'ui.listView.filters.all'
-                        },
-                        mine: {
-                            label: 'ui.listView.filters.mine'
-                        },
-                        shared: {
-                            label: 'label.shared'
-                        },
-                        featured: {
-                            label: 'label.featured'
-                        },
-                        community: {
-                            label: 'label.community'
-                        }
-                    },
-                    preFilter: function() {
-                        if (isAdmin()||isDomainAdmin()) {
-                            return []
-                        }
-                        return ['account']
-                    },
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        ostypename: {
-                            label: 'label.os.type'
-                        },
-                        account: {
-                            label: 'label.account'
-                        }
-                    },
-
-                    reorder: cloudStack.api.actions.sort('updateIso', 'isos'),
-
-                    actions: {
-                        add: {
-                            label: 'label.action.register.iso',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.action.register.iso';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.action.register.iso',
-                                preFilter: cloudStack.preFilter.createTemplate,
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpRegisterISOName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        docID: 'helpRegisterISODescription',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    url: {
-                                        label: 'label.url',
-                                        docID: 'helpRegisterISOURL',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    // For KVM only: Direct Download
-                                    directdownload : {
-                                        label: 'label.direct.download',
-                                        docID: 'helpRegisterTemplateDirectDownload',
-                                        isBoolean: true
-                                    },
-                                    checksum: {
-                                        label: 'label.checksum',
-                                        dependsOn: 'directdownload',
-                                        isHidden: true
-                                    },
-                                    // Direct Download - End
-                                    zone: {
-                                        label: 'label.zone',
-                                        docID: 'helpRegisterISOZone',
-                                        select: function(args) {
-                                            if(g_regionsecondaryenabled == true) {
-                                                args.response.success({
-                                                    data: [{
-                                                        id: -1,
-                                                        description: "All Zones"
-                                                    }]
-                                                });
-                                            } else {
-                                                $.ajax({
-                                                    url: createURL("listZones&available=true"),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var zoneObjs = [];
-                                                        var items = json.listzonesresponse.zone;
-                                                        if (items != null) {
-                                                            for (var i = 0; i < items.length; i++) {
-                                                                zoneObjs.push({
-                                                                    id: items[i].id,
-                                                                    description: items[i].name
-                                                                });
-                                                            }
-                                                        }
-                                                        if (isAdmin() && !(cloudStack.context.projects && cloudStack.context.projects[0])) {
-                                                            zoneObjs.unshift({
-                                                                id: -1,
-                                                                description: "All Zones"
-                                                            });
-                                                        }
-                                                        args.response.success({
-                                                            data: zoneObjs
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        }
-                                    },
-
-                                    isBootable: {
-                                        label: "label.bootable",
-                                        docID: 'helpRegisterISOBootable',
-                                        isBoolean: true,
-                                        isChecked: true
-                                    },
-
-                                    osTypeId: {
-                                        label: 'label.os.type',
-                                        docID: 'helpRegisterISOOSType',
-                                        dependsOn: 'isBootable',
-                                        isHidden: false,
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listOsTypes"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var ostypeObjs = json.listostypesresponse.ostype;
-                                                    var items = [];
-                                                    //items.push({id: "", description: "None"}); //shouldn't have None option when bootable is checked
-                                                    $(ostypeObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.description
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    isExtractable: {
-                                        label: "label.extractable",
-                                        docID: 'helpRegisterISOExtractable',
-                                        isBoolean: true
-                                    },
-
-                                    isPublic: {
-                                        label: "label.public",
-                                        docID: 'helpRegisterISOPublic',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-
-                                    isFeatured: {
-                                        label: "label.featured",
-                                        docID: 'helpRegisterISOFeatured',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    }
-                                }
-                            },
-
-
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.name,
-                                    displayText: args.data.description,
-                                    url: args.data.url,
-                                    zoneid: args.data.zone,
-                                    isextractable: (args.data.isExtractable == "on"),
-                                    bootable: (args.data.isBootable == "on"),
-                                    directdownload: (args.data.directdownload == "on")
-                                };
-
-                                if (args.$form.find('.form-item[rel=osTypeId]').css("display") != "none") {
-                                    $.extend(data, {
-                                        osTypeId: args.data.osTypeId
-                                    });
-                                }
-                                if (args.$form.find('.form-item[rel=isPublic]').css("display") != "none") {
-                                    $.extend(data, {
-                                        ispublic: (args.data.isPublic == "on")
-                                    });
-                                }
-                                if (args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") {
-                                    $.extend(data, {
-                                        isfeatured: (args.data.isFeatured == "on")
-                                    });
-                                }
-                                if (args.$form.find('.form-item[rel=checksum]').css("display") != "none") {
-                                    $.extend(data, {
-                                        checksum: args.data.checksum
-                                    });
-                                }
-
-                                $.ajax({
-                                    url: createURL('registerIso'),
-                                    data: data,
-                                    success: function(json) {
-                                        var items = json.registerisoresponse.iso; //items might have more than one array element if it's create ISOs for all zones.
-                                        args.response.success({
-                                            data: items[0]
-                                        });
-
-                                        /*
-                     if(items.length > 1) {
-                     for(var i=1; i<items.length; i++) {
-                     var $midmenuItem2 = $("#midmenu_item").clone();
-                     ISOToMidmenu(items[i], $midmenuItem2);
-                     bindClickToMidMenu($midmenuItem2, templateToRightPanel, ISOGetMidmenuId);
-                     $("#midmenu_container").append($midmenuItem2.show());              }
-                     }
-                     */
-                                    },
-                                    error: function(XMLHttpResponse) {
-                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        },
-                        uploadISOFromLocal: {
-                            isHeader: true,
-                            label: 'label.upload.from.local',
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.upload.iso.from.local';
-                                }
-                            },
-                            createForm: {
-                                title: 'label.upload.iso.from.local',
-                                preFilter: cloudStack.preFilter.createTemplate,
-                                fileUpload: {
-                                    getURL: function(args) {
-                                        args.data = args.formData;
-
-                                        var data = {
-                                            name: args.data.name,
-                                            displayText: args.data.description,
-                                            zoneid: args.data.zone,
-                                            format: "ISO",
-                                            isextractable: (args.data.isExtractable == "on"),
-                                            bootable: (args.data.isBootable == "on"),
-                                            ispublic: (args.data.isPublic == "on"),
-                                            isfeatured: (args.data.isFeatured == "on")
-                                        };
-
-                                        if (args.$form.find('.form-item[rel=osTypeId]').is(':visible')) {
-                                            $.extend(data, {
-                                                osTypeId: args.data.osTypeId,
-                                            });
-                                        }
-
-                                        $.ajax({
-                                            url: createURL('getUploadParamsForIso'),
-                                            data: data,
-                                            async: false,
-                                            success: function(json) {
-                                                var uploadparams = json.postuploadisoresponse.getuploadparams;
-                                                var templateId = uploadparams.id;
-
-                                                args.response.success({
-                                                    url: uploadparams.postURL,
-                                                    ajaxPost: true,
-                                                    data: {
-                                                        'X-signature': uploadparams.signature,
-                                                        'X-expires': uploadparams.expires,
-                                                        'X-metadata': uploadparams.metadata
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    postUpload: function(args) {
-                                        if(args.error) {
-                                            args.response.error(args.errorMsg);
-                                        } else {
-                                            cloudStack.dialog.notice({
-                                                message: "This ISO file has been uploaded. Please check its status at Templates menu > " + args.data.name + " > Zones tab > click a zone > Status field and Ready field."
-                                            });
-                                            args.response.success();
-                                        }
-                                    }
-                                },
-                                fields: {
-                                    templateFileUpload: {
-                                        label: 'label.local.file',
-                                        isFileUpload: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    name: {
-                                        label: 'label.name',
-                                        docID: 'helpRegisterISOName',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        docID: 'helpRegisterISODescription',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-
-                                    zone: {
-                                        label: 'label.zone',
-                                        docID: 'helpRegisterISOZone',
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listZones&available=true"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var zoneObjs = json.listzonesresponse.zone;
-                                                    args.response.success({
-                                                        descriptionField: 'name',
-                                                        data: zoneObjs
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    isBootable: {
-                                        label: "label.bootable",
-                                        docID: 'helpRegisterISOBootable',
-                                        isBoolean: true,
-                                        isChecked: true
-                                    },
-
-                                    osTypeId: {
-                                        label: 'label.os.type',
-                                        docID: 'helpRegisterISOOSType',
-                                        dependsOn: 'isBootable',
-                                        isHidden: false,
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            $.ajax({
-                                                url: createURL("listOsTypes"),
-                                                dataType: "json",
-                                                async: true,
-                                                success: function(json) {
-                                                    var ostypeObjs = json.listostypesresponse.ostype;
-                                                    var items = [];
-                                                    $(ostypeObjs).each(function() {
-                                                        items.push({
-                                                            id: this.id,
-                                                            description: this.description
-                                                        });
-                                                    });
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    },
-
-                                    isExtractable: {
-                                        label: "label.extractable",
-                                        docID: 'helpRegisterISOExtractable',
-                                        isBoolean: true
-                                    },
-
-                                    isPublic: {
-                                        label: "label.public",
-                                        docID: 'helpRegisterISOPublic',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    },
-
-                                    isFeatured: {
-                                        label: "label.featured",
-                                        docID: 'helpRegisterISOFeatured',
-                                        isBoolean: true,
-                                        isHidden: true
-                                    }
-                                }
-                            },
-
-                            action: function(args) {
-                                return;
-                            },
-
-                            notification: {
-                                poll: function(args) {
-                                    args.complete();
-                                }
-                            }
-                        }
-                    },
-
-                    advSearchFields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        zoneid: {
-                            label: 'label.zone',
-                            select: function(args) {
-                                $.ajax({
-                                    url: createURL('listZones'),
-                                    data: {
-                                        listAll: true
-                                    },
-                                    success: function(json) {
-                                        var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                        args.response.success({
-                                            data: $.map(zones, function(zone) {
-                                                return {
-                                                    id: zone.id,
-                                                    description: zone.name
-                                                };
-                                            })
-                                        });
-                                    }
-                                });
-                            }
-                        },
-                        tagKey: {
-                            label: 'label.tag.key'
-                        },
-                        tagValue: {
-                            label: 'label.tag.value'
-                        }
-                    },
-
-                    dataProvider: function(args) {
-                        var data = {};
-                        listViewDataProvider(args, data);
-                        // Due to zonal grouping, low pagesize can result lower
-                        // aggregated items, resulting in no scroll shown
-                        // So, use maximum pagesize
-                        data.pagesize = 200;
-
-                        var ignoreProject = false;
-                        if (args.filterBy != null) { //filter dropdown
-                            if (args.filterBy.kind != null) {
-                                if (previousFilterType != args.filterBy.kind || args.page == 1) {
-                                    previousFilterType = args.filterBy.kind;
-                                    previousCollection = [];
-                                }
-                                switch (args.filterBy.kind) {
-                                    case "all":
-                                        $.extend(data, {
-                                            isofilter: 'all'
-                                        });
-                                        break;
-                                    case "mine":
-                                        $.extend(data, {
-                                            isofilter: 'self'
-                                        });
-                                        break;
-                                    case "shared":
-                                        $.extend(data, {
-                                            isofilter: 'shared'
-                                        });
-                                        break;
-                                    case "featured":
-                                        ignoreProject = true;
-                                        $.extend(data, {
-                                            isofilter: 'featured'
-                                        });
-                                        break;
-                                    case "community":
-                                        ignoreProject = true;
-                                        $.extend(data, {
-                                            isofilter: 'community'
-                                        });
-                                        break;
-                                }
-                            }
-                        }
-
-                        $.ajax({
-                            url: createURL('listIsos', {
-                                ignoreProject: ignoreProject
-                            }),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listisosresponse.iso;
-
-                                var itemsView = [];
-                                $(items).each(function(index, item) {
-                                    var existing = $.grep(previousCollection, function(it){
-                                        return it != null && it.id !=null && it.id == item.id;
-                                    });
-
-
-                                    if (existing.length > 0) {
-                                        return true; // skip adding this entry
-                                    } else {
-                                        var isoItem = {
-                                            id: item.id,
-                                            name: item.name,
-                                            description: item.description,
-                                            ostypename: item.ostypename,
-                                            ostypeid: item.ostypeid,
-                                            account: item.account,
-                                            domain: item.domain,
-                                            zones: item.zonename,
-                                            zoneids: [item.zoneid]
-                                        };
-                                        itemsView.push(isoItem);
-                                        previousCollection.push(isoItem);
-                                    }
-                                }
-);
-                                args.response.success({
-                                    actionFilter: isoActionfilter,
-                                    data: itemsView
-                                });
-                            }
-                        });
-                    },
-
-                    detailView: {
-                        name: 'label.details',
-                        viewAll: {
-                            label: 'label.instances',
-                            path: 'instances'
-                        },
-                        actions: {
-                            edit: {
-                                label: 'label.edit',
-                                action: function(args) {
-                                    //***** updateIso *****
-                                    var data = {
-                                        id: args.context.isos[0].id,
-                                        //zoneid: args.context.isos[0].zoneid, //can't update template/ISO in only one zone. It always get updated in all zones.
-                                        name: args.data.name,
-                                        displaytext: args.data.displaytext,
-                                        bootable: (args.data.bootable == "on"),
-                                        ostypeid: args.data.ostypeid
-                                    };
-                                    $.ajax({
-                                        url: createURL('updateIso'),
-                                        data: data,
-                                        async: false,
-                                        success: function(json) {
-                                            //updateIso API returns an incomplete ISO object (isextractable and isfeatured are missing)
-                                        }
-                                    });
-
-
-                                    //***** updateIsoPermissions *****
-                                    var data = {
-                                        id: args.context.isos[0].id
-                                        //zoneid: args.context.isos[0].zoneid //can't update template/ISO in only one zone. It always get updated in all zones.
-                                    };
-                                    //if args.data.ispublic is undefined(i.e. checkbox is hidden), do not pass ispublic to API call.
-                                    if (args.data.ispublic == "on") {
-                                        $.extend(data, {
-                                            ispublic: true
-                                        });
-                                    } else if (args.data.ispublic == "off") {
-                                        $.extend(data, {
-                                            ispublic: false
-                                        });
-                                    }
-                                    //if args.data.isfeatured is undefined(i.e. checkbox is hidden), do not pass isfeatured to API call.
-                                    if (args.data.isfeatured == "on") {
-                                        $.extend(data, {
-                                            isfeatured: true
-                                        });
-                                    } else if (args.data.isfeatured == "off") {
-                                        $.extend(data, {
-                                            isfeatured: false
-                                        });
-                                    }
-                                    //if args.data.isextractable is undefined(i.e. checkbox is hidden), do not pass isextractable to API call.
-                                    if (args.data.isextractable == "on") {
-                                        $.extend(data, {
-                                            isextractable: true
-                                        });
-                                    } else if (args.data.isextractable == "off") {
-                                        $.extend(data, {
-                                            isextractable: false
-                                        });
-                                    }
-                                    $.ajax({
-                                        url: createURL('updateIsoPermissions'),
-                                        data: data,
-                                        async: false,
-                                        success: function(json) {
-                                            //updateIsoPermissions API doesn't return ISO object
-                                        }
-                                    });
-
-
-                                    //***** listIsos *****
-                                    //So, we call listIsos API to get a complete ISO object
-                                    var data = {
-                                        id: args.context.isos[0].id,
-                                        zoneid: args.context.isos[0].zoneid,
-                                        isofilter: 'self'
-                                    };
-                                    $.ajax({
-                                        url: createURL('listIsos'),
-                                        data: data,
-                                        async: false,
-                                        success: function(json) {
-                                            var item = json.listisosresponse.iso;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-                            downloadISO: {
-                                label: 'label.action.download.ISO',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.action.download.iso';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.action.download.ISO';
-                                    },
-                                    complete: function(args) {
-                                        var url = args.url;
-                                        var htmlMsg = _l('message.download.ISO');
-                                        var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
-                                        return htmlMsg2;
-                                    }
-                                },
-                                action: function(args) {
-                                    var apiCmd = "extractIso&mode=HTTP_DOWNLOAD&id=" + args.context.isos[0].id;
-                                    if (args.context.isos[0].zoneid != null)
-                                        apiCmd += "&zoneid=" + args.context.isos[0].zoneid;
-
-                                    $.ajax({
-                                        url: createURL(apiCmd),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.extractisoresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.iso;
-                                                    },
-                                                    getActionFilter: function() {
-                                                        return isoActionfilter;
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-
-                            shareISO: {
-                                label: 'label.action.share.iso',
-                                messages: {
-                                    notification: function (args) {
-                                        return 'label.action.share.iso';
-                                    }
-                                },
-
-                                createForm: {
-                                    title: 'label.action.share.iso',
-                                    desc: '',
-                                    fields: {
-                                        operation: {
-                                            label: 'label.operation',
-                                            docID: 'helpUpdateTemplateOperation',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function (args) {
-                                                var items = [];
-                                                items.push({
-                                                    id: "add",
-                                                    description: "Add"
-                                                });
-                                                items.push({
-                                                    id: "remove",
-                                                    description: "Remove"
-                                                });
-                                                items.push({
-                                                    id: "reset",
-                                                    description: "Reset"
-                                                });
-
-                                                args.response.success({
-                                                    data: items
-                                                });
-
-                                                // Select change
-                                                args.$select.change(function () {
-                                                    var $form = $(this).closest('form');
-                                                    var selectedOperation = $(this).val();
-                                                    if (selectedOperation === "reset") {
-                                                        $form.find('[rel=projects]').hide();
-                                                        $form.find('[rel=sharewith]').hide();
-                                                        $form.find('[rel=accounts]').hide();
-                                                        $form.find('[rel=accountlist]').hide();
-                                                    } else {
-                                                        // allow.user.view.domain.accounts = true
-                                                        // Populate List of accounts in domain as dropdown multiselect
-                                                        $form.find('[rel=sharewith]').css('display', 'inline-block');
-                                                        if (!isUser() || g_allowUserViewAllDomainAccounts === true) {
-                                                            $form.find('[rel=projects]').css('display', 'inline-block');
-                                                            $form.find('[rel=accounts]').css('display', 'inline-block');
-                                                            $form.find('[rel=accountlist]').hide();
-                                                        } else {
-                                                            // If users are not allowed to see accounts in the domain, show input text field for Accounts
-                                                            // Projects will always be shown as dropdown multiselect
-                                                            $form.find('[rel=projects]').css('display', 'inline-block');
-                                                            $form.find('[rel=accountslist]').css('display', 'inline-block');
-                                                            $form.find('[rel=accounts]').hide();
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        shareWith: {
-                                            label: 'label.share.with',
-                                            docID: 'helpUpdateTemplateShareWith',
-                                            validation: {
-                                                required: true
-                                            },
-                                            dependsOn: 'operation',
-                                            select: function (args) {
-                                                var items = [];
-                                                items.push({
-                                                    id: "account",
-                                                    description: "Account"
-                                                });
-                                                items.push({
-                                                    id: "project",
-                                                    description: "Project"
-                                                });
-
-                                                args.response.success({ data: items });
-
-                                                // Select change
-                                                args.$select.change(function () {
-                                                    var $form = $(this).closest('form');
-                                                    var sharedWith = $(this).val();
-                                                    if (args.operation !== "reset") {
-                                                        if (sharedWith === "project") {
-                                                            $form.find('[rel=accounts]').hide();
-                                                            $form.find('[rel=accountlist]').hide();
-                                                            $form.find('[rel=projects]').css('display', 'inline-block');
-                                                        } else {
-                                                            // allow.user.view.domain.accounts = true
-                                                            // Populate List of accounts in domain as dropdown multiselect
-                                                            if (!isUser() || g_allowUserViewAllDomainAccounts === true) {
-                                                                $form.find('[rel=projects]').hide();
-                                                                $form.find('[rel=accountlist]').hide();
-                                                                $form.find('[rel=accounts]').css('display', 'inline-block');
-                                                            } else {
-                                                                // If users are not allowed to see accounts in the domain, show input text field for Accounts
-                                                                // Projects will always be shown as dropdown multiselect
-                                                                $form.find('[rel=projects]').hide();
-                                                                $form.find('[rel=accounts]').hide();
-                                                                $form.find('[rel=accountlist]').css('display', 'inline-block');
-                                                            }
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        },
-
-                                        accountlist: {
-                                            label: 'label.accounts',
-                                            docID: 'helpUpdateTemplateAccountList'
-                                        },
-
-                                        accounts: {
-                                            label: 'label.accounts',
-                                            docID: 'helpUpdateTemplateAccounts',
-                                            dependsOn: 'shareWith',
-                                            isMultiple: true,
-                                            select: function (args) {
-                                                var operation = args.operation;
-                                                if (operation !== "reset") {
-                                                    $.ajax({
-                                                        url: createURL("listAccounts&listall=true"),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (jsonAccounts) {
-                                                            var accountByName = {};
-                                                            $.each(jsonAccounts.listaccountsresponse.account, function(idx, account) {
-                                                                // Only add current domain's accounts for add as update template permissions supports that
-                                                                if (account.domainid === g_domainid && operation === "add") {
-                                                                    accountByName[account.name] = {
-                                                                        projName: account.name,
-                                                                        hasPermission: false
-                                                                    };
-                                                                }
-                                                            });
-                                                            $.ajax({
-                                                                url: createURL('listIsoPermissions&id=' + args.context.isos[0].id),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    items = json.listtemplatepermissionsresponse.templatepermission.account;
-                                                                    $.each(items, function(idx, accountName) {
-                                                                        if (accountByName[accountName]) {
-                                                                            accountByName[accountName].hasPermission = true;
-                                                                        }
-                                                                    });
-
-                                                                    var accountObjs = [];
-                                                                    if (operation === "add") {
-                                                                        // Skip already permitted accounts
-                                                                        $.each(Object.keys(accountByName), function(idx, accountName) {
-                                                                            if (accountByName[accountName].hasPermission == false) {
-                                                                                accountObjs.push({
-                                                                                    name: accountName,
-                                                                                    description: accountName
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    } else if (items != null) {
-                                                                        $.each(items, function(idx, accountName) {
-                                                                            if (accountName !== g_account) {
-                                                                                accountObjs.push({
-                                                                                    name: accountName,
-                                                                                    description: accountName
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    }
-                                                                    args.$select.html('');
-                                                                    args.response.success({data: accountObjs});
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        },
-
-                                        projects: {
-                                            label: 'label.projects',
-                                            docID: 'helpUpdateTemplateProjectIds',
-                                            dependsOn: 'shareWith',
-                                            isMultiple: true,
-                                            select: function (args) {
-                                                var operation = args.operation;
-                                                if (operation !== "reset") {
-                                                    $.ajax({
-                                                        url: createURL("listProjects&listall=true"),
-                                                        dataType: "json",
-                                                        async: true,
-                                                        success: function (jsonProjects) {
-                                                            var projectsByIds = {};
-                                                            $.each(jsonProjects.listprojectsresponse.project, function(idx, project) {
-                                                                // Only add current domain's projects for add operation as update template permissions supports that
-                                                                if ((project.domainid === g_domainid && operation === "add") || operation === "remove") {
-                                                                    projectsByIds[project.id] = {
-                                                                        projName: project.name,
-                                                                        hasPermission: false
-                                                                    };
-                                                                }
-                                                            });
-
-                                                            $.ajax({
-                                                                url: createURL('listIsoPermissions&id=' + args.context.isos[0].id),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function (json) {
-                                                                    items = json.listtemplatepermissionsresponse.templatepermission.projectids;
-                                                                    $.each(items, function(idx, projectId) {
-                                                                        if (projectsByIds[projectId]) {
-                                                                            projectsByIds[projectId].hasPermission = true;
-                                                                        }
-                                                                    });
-
-                                                                    var projectObjs = [];
-                                                                    if (operation === "add") {
-                                                                        // Skip already permitted accounts
-                                                                        $.each(Object.keys(projectsByIds), function(idx, projectId) {
-                                                                            if (projectsByIds[projectId].hasPermission == false) {
-                                                                                projectObjs.push({
-                                                                                    id: projectId,
-                                                                                    description: projectsByIds[projectId].projName
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    } else if (items != null) {
-                                                                        $.each(items, function(idx, projectId) {
-                                                                            if (projectId !== g_account) {
-                                                                                projectObjs.push({
-                                                                                    id: projectId,
-                                                                                    description: projectsByIds[projectId] ? projectsByIds[projectId].projName : projectId
-                                                                                });
-                                                                            }
-                                                                        });
-                                                                    }
-                                                                    args.$select.html('');
-                                                                    args.response.success({data: projectObjs});
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                },
-
-                                action: function (args) {
-                                    // Load data from form
-                                    var data = {
-                                        id: args.context.isos[0].id,
-                                        op: args.data.operation
-                                    };
-                                    var selectedOperation = args.data.operation;
-                                    if (selectedOperation === "reset") {
-                                        // Do not append Project ID or Account to data object
-                                    } else {
-                                        var projects = args.data.projects;
-                                        var accounts = args.data.accounts;
-                                        var accountList = args.data.accountlist;
-
-                                        if (accounts !== undefined || (accountList !== undefined && accountList.length > 0)) {
-                                            var accountNames = "";
-                                            if (accountList !== undefined && accounts === undefined) {
-                                                accountNames = accountList;
-                                            } else {
-                                                if (Object.prototype.toString.call(accounts) === '[object Array]') {
-                                                    accountNames = accounts.join(",");
-                                                } else {
-                                                    accountNames = accounts;
-                                                }
-                                            }
-                                            $.extend(data, {
-                                                accounts: accountNames
-                                            });
-                                        }
-
-                                        if (projects !== undefined) {
-                                            var projectIds = "";
-                                            if (Object.prototype.toString.call(projects) === '[object Array]') {
-                                                projectIds = projects.join(",");
-                                            } else {
-                                                projectIds = projects;
-                                            }
-
-                                            $.extend(data, {
-                                                projectids: projectIds
-                                            });
-                                        }
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('updateIsoPermissions'),
-                                        data: data,
-                                        dataType: "json",
-                                        async: false,
-                                        success: function (json) {
-                                            var item = json.updateisopermissionsresponse.success;
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    }); //end ajax
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    displaytext: {
-                                        label: 'label.description',
-                                        isEditable: true,
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    directdownload: {
-                                        label: 'label.direct.download',
-                                        isBoolean: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    size: {
-                                        label: 'label.size',
-                                        converter: function(args) {
-                                            if (args == null || args == 0)
-                                                return "";
-                                            else
-                                                return cloudStack.converters.convertBytes(args);
-                                        }
-                                    },
-                                    isextractable: {
-                                        label: 'label.extractable.lower',
-                                        isBoolean: true,
-                                        isEditable: function() {
-                                            if (isAdmin())
-                                                return true;
-                                            else
-                                                return false;
-                                        },
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    bootable: {
-                                        label: 'label.bootable',
-                                        isBoolean: true,
-                                        isEditable: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    ispublic: {
-                                        label: 'label.public',
-                                        isBoolean: true,
-                                        isEditable: true,
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    isfeatured: {
-                                        label: 'label.featured',
-                                        isBoolean: true,
-                                        isEditable: function() {
-                                            if (isAdmin())
-                                                return true;
-                                            else
-                                                return false;
-                                        },
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-                                    crossZones: {
-                                        label: 'label.cross.zones',
-                                        converter: cloudStack.converters.toBooleanText
-                                    },
-
-                                    ostypeid: {
-                                        label: 'label.os.type',
-                                        isEditable: true,
-                                        select: function(args) {
-                                            if (ostypeObjs == undefined) {
-                                                $.ajax({
-                                                    url: createURL("listOsTypes"),
-                                                    dataType: "json",
-                                                    async: false,
-                                                    success: function(json) {
-                                                        ostypeObjs = json.listostypesresponse.ostype;
-                                                    }
-                                                });
-                                            }
-                                            var items = [];
-                                            $(ostypeObjs).each(function() {
-                                                items.push({
-                                                    id: this.id,
-                                                    description: this.description
-                                                });
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    },
-
-                                    domain: {
-                                        label: 'label.domain'
-                                    },
-                                    account: {
-                                        label: 'label.account'
-                                    },
-                                    created: {
-                                        label: 'label.created',
-                                        converter: cloudStack.converters.toLocalDate
-                                    },
-                                    url: {
-                                        label: 'label.url'
-                                    }
-                                }],
-
-                                tags: cloudStack.api.tags({
-                                    resourceType: 'ISO',
-                                    contextId: 'isos'
-                                }),
-
-                                dataProvider: function(args) {
-                                    var jsonObj = args.context.isos[0];
-                                    var apiCmd = "listIsos&isofilter=self&id=" + jsonObj.id;
-                                    if (jsonObj.zoneid != null)
-                                        apiCmd = apiCmd + "&zoneid=" + jsonObj.zoneid;
-
-                                    $.ajax({
-                                        url: createURL(apiCmd),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            args.response.success({
-                                                actionFilter: isoActionfilter,
-                                                data: json.listisosresponse.iso[0]
-                                            });
-                                        }
-                                    });
-
-                                }
-                            },
-                            zones: {
-                                title: 'label.zones',
-                                listView: {
-                                    id: 'zones',
-                                    fields: {
-                                        zonename: {
-                                            label: 'label.name'
-                                        },
-                                        status: {
-                                            label: 'label.status'
-                                        },
-                                        isready: {
-                                            label: 'state.Ready',
-                                            converter: cloudStack.converters.toBooleanText
-                                        }
-                                    },
-                                    hideSearchBar: true,
-
-                                    dataProvider: function(args) {
-                                                var data = {
-                                                    isofilter: 'self',
-                                                    id: args.context.isos[0].id
-                                                };
-                                                listViewDataProvider(args, data);
-                                                $.ajax({
-                                                    url: createURL('listIsos'),
-                                                    data: data,
-                                                    dataType: "json",
-                                                    success: function(json) {
-                                                            var isos = json.listisosresponse.iso;
-                                                            var zones = [];
-                                                            zones = isos;
-
-                                                args.response.success({
-                                                            actionFilter: isoActionfilter,
-                                                            data: zones
-                                                });
-                                        }
-                                    });
-                                },
-
-                                detailView: {
-                                    actions: {
-                                        copyISO: {
-                                            label: 'label.action.copy.ISO',
-                                            messages: {
-                                                notification: function(args) {
-                                                    return 'label.copying.iso';
-                                                }
-                                            },
-                                            createForm: {
-                                                title: 'label.action.copy.ISO',
-                                                desc: 'label.action.copy.ISO',
-                                                fields: {
-                                                    destinationZoneId: {
-                                                        label: 'label.destination.zone',
-                                                        validation: {
-                                                            required: true
-                                                        },
-                                                        select: function(args) {
-                                                            $.ajax({
-                                                                url: createURL("listZones&available=true"),
-                                                                dataType: "json",
-                                                                async: true,
-                                                                success: function(json) {
-                                                                    var zoneObjs = [];
-                                                                    var items = json.listzonesresponse.zone;
-                                                                    if (items != null) {
-                                                                        for (var i = 0; i < items.length; i++) {
-                                                                            if (items[i].id != args.context.zones[0].zoneid) {
-                                                                                zoneObjs.push({
-                                                                                    id: items[i].id,
-                                                                                    description: items[i].name
-                                                                                });
-                                                                            }
-                                                                        }
-                                                                    }
-                                                                    args.response.success({
-                                                                        data: zoneObjs
-                                                                    });
-                                                                }
-                                                            });
-                                                        }
-                                                    }
-                                                }
-                                            },
-                                            action: function(args) {
-                                                var data = {
-                                                    id: args.context.isos[0].id,
-                                                    destzoneid: args.data.destinationZoneId
-                                                };
-                                                if (args.context.zones[0].zoneid != undefined) {
-                                                    $.extend(data, {
-                                                        sourcezoneid: args.context.zones[0].zoneid
-                                                    });
-                                                }
-
-                                                $.ajax({
-                                                    url: createURL('copyIso'),
-                                                    data: data,
-                                                    success: function(json) {
-                                                        var jid = json.copytemplateresponse.jobid;
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jid,
-                                                                getUpdatedItem: function(json) {
-                                                                    return {}; //nothing in this ISO needs to be updated
-                                                                },
-                                                                getActionFilter: function() {
-                                                                    return isoActionfilter;
-                                                                }
-                                                            }
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            notification: {
-                                                poll: pollAsyncJobResult
-                                            }
-                                        },
-
-                                        remove: {
-                                            label: 'label.action.delete.ISO',
-                                            messages: {
-                                                confirm: function(args) {
-                                                    return 'message.action.delete.ISO';
-                                                },
-                                                notification: function(args) {
-                                                    return 'label.action.delete.ISO';
-                                                }
-                                            },
-                                            action: function(args) {
-                                                var queryParams = "deleteIso&id=" + args.context.isos[0].id;
-                                                if (!args.context.isos[0].crossZones){
-                                                    queryParams += "&zoneid=" + args.context.zones[0].zoneid;
-                                                }
-                                                $.ajax({
-                                                    url: createURL(queryParams),
-                                                    dataType: "json",
-                                                    async: true,
-                                                    success: function(json) {
-                                                        var jid = json.deleteisoresponse.jobid;
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jid
-                                                            }
-                                                        });
-                                                    }
-                                                });
-                                            },
-                                            notification: {
-                                                poll: pollAsyncJobResult
-                                            }
-                                        }
-                                    },
-                                    tabs: {
-                                        details: {
-                                            title: 'label.details',
-
-                                            fields: [{
-                                                name: {
-                                                    label: 'label.name',
-                                                    isEditable: true,
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                }
-                                            }, {
-                                                id: {
-                                                    label: 'label.id'
-                                                },
-                                                zonename: {
-                                                    label: 'label.zone.name'
-                                                },
-                                                zoneid: {
-                                                    label: 'label.zone.id'
-                                                },
-                                                isready: {
-                                                    label: 'state.Ready',
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                status: {
-                                                    label: 'label.status'
-                                                }
-                                             },{
-                                                displaytext: {
-                                                    label: 'label.description',
-                                                    isEditable: true,
-                                                    validation: {
-                                                        required: true
-                                                    }
-                                                },
-                                                size: {
-                                                    label: 'label.size',
-                                                    converter: function(args) {
-                                                        if (args == null || args == 0)
-                                                            return "";
-                                                        else
-                                                            return cloudStack.converters.convertBytes(args);
-                                                    }
-                                                },
-                                                isextractable: {
-                                                    label: 'label.extractable.lower',
-                                                    isBoolean: true,
-                                                    isEditable: true,
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                bootable: {
-                                                    label: 'label.bootable',
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                ispublic: {
-                                                    label: 'label.public',
-                                                    isBoolean: true,
-                                                    isEditable: true,
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-                                                isfeatured: {
-                                                    label: 'label.featured',
-                                                    isBoolean: true,
-                                                    isEditable: function() {
-                                                        if (isAdmin())
-                                                            return true;
-                                                        else
-                                                            return false;
-                                                    },
-                                                    converter: cloudStack.converters.toBooleanText
-                                                },
-
-                                                ostypeid: {
-                                                    label: 'label.os.type',
-                                                    isEditable: true,
-                                                    select: function(args) {
-                                                        var ostypeObjs;
-                                                        $.ajax({
-                                                            url: createURL("listOsTypes"),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                ostypeObjs = json.listostypesresponse.ostype;
-                                                            }
-                                                        });
-
-                                                        var items = [];
-                                                        $(ostypeObjs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.description
-                                                            });
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                },
-
-                                                domain: {
-                                                    label: 'label.domain'
-                                                },
-                                                account: {
-                                                    label: 'label.account'
-                                                },
-                                                created: {
-                                                    label: 'label.created',
-                                                    converter: cloudStack.converters.toLocalDate
-                                                }
-                                            }],
-
-                                            tags: cloudStack.api.tags({
-                                                resourceType: 'ISO',
-                                                contextId: 'isos'
-                                            }),
-
-                                            dataProvider: function(args) {
-                                                var jsonObj = args.context.isos[0];
-                                                var apiCmd = "listIsos&isofilter=self&id=" + jsonObj.id;
-                                                if (jsonObj.zoneid != null)
-                                                    apiCmd = apiCmd + "&zoneid=" + args.context.zones[0].zoneid;
-
-                                                $.ajax({
-                                                    url: createURL(apiCmd),
-                                                    dataType: "json",
-                                                    success: function(json) {
-                                                        args.response.success({
-                                                            actionFilter: isoActionfilter,
-                                                            data: json.listisosresponse.iso[0]
-                                                        });
-                                                    }
-                                                });
-
-                                            }
-                                        }
-                                    }
-                                }}
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    var templateActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-
-        // "Edit Template", "Copy Template", "Create VM"
-        if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)) //if neither root-admin, nor the same account, nor the same project
-            || jsonObj.isready == false) {
-            //do nothing
-        } else {
-            allowedActions.push("edit");
-
-            allowedActions.push("copyTemplate");
-        }
-
-        // "Download Template" , "Update Template Permissions"
-        if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project
-            || (jsonObj.isready == false)) {
-            //do nothing
-        } else {
-            if (jsonObj.isextractable){
-                allowedActions.push("downloadTemplate");
-            }
-            allowedActions.push("shareTemplate");
-        }
-
-        // "Delete Template"
-        //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
-        if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project
-            || (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1) || (jsonObj.account == "system")) {
-            //do nothing
-        } else {
-            allowedActions.push("remove");
-        }
-
-        return allowedActions;
-    }
-
-    var isoActionfilter = function(args) {
-        var jsonObj = args.context.item;
-        var allowedActions = [];
-
-        if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)) //if neither root-admin, nor the same account, nor the same project
-            || (jsonObj.isready == false) || (jsonObj.domainid == 1 && jsonObj.account == "system")
-        ) {
-            //do nothing
-        } else {
-            allowedActions.push("edit");
-
-            allowedActions.push("copyISO");
-        }
-
-        // "Create VM"
-        // Commenting this out for Beta2 as it does not support the new network.
-        /*
-     //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))  //if neither root-admin, nor the same account, nor the same project
-     if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))  //if neither root-admin, nor item owner
-     || jsonObj.isready == false)
-     || (jsonObj.bootable == false)
-     || (jsonObj.domainid ==    1 && jsonObj.account ==    "system")
-     ) {
-       //do nothing
-     }
-     else {
-       allowedActions.push("createVm");
-     }
-     */
-
-        // "Download ISO"
-        //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
-        if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project
-            || (jsonObj.isready == false) || (jsonObj.domainid == 1 && jsonObj.account == "system")
-        ) {
-            //do nothing
-        } else {
-            if (jsonObj.isextractable){
-                allowedActions.push("downloadISO");
-            }
-            allowedActions.push("shareISO");
-        }
-
-        // "Delete ISO"
-        //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
-        if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project
-            || (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1) || (jsonObj.account == "system")
-        ) {
-            //do nothing
-        } else {
-            allowedActions.push("remove");
-        }
-
-        return allowedActions;
-    }
-
-})(cloudStack, jQuery);
diff --git a/ui/legacy/scripts/ui-custom/accountsWizard.js b/ui/legacy/scripts/ui-custom/accountsWizard.js
deleted file mode 100644
index dfaad05..0000000
--- a/ui/legacy/scripts/ui-custom/accountsWizard.js
+++ /dev/null
@@ -1,285 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    cloudStack.uiCustom.accountsWizard = function(args, isLdap) {
-        return function(listViewArgs) {
-            var context = listViewArgs.context;
-            var ldapStatus = isLdap;
-            var accountsWizard = function(data) {
-                var $wizard = $('#template').find('div.accounts-wizard').clone();
-                var $form = $wizard.find('form');
-
-                var close = function() {
-                    $wizard.dialog('destroy');
-                    $wizard.remove();
-                    $('div.overlay').fadeOut(function() {
-                        $('div.overlay').remove();
-                    });
-                };
-
-                var completeAction = function() {
-                    var data = cloudStack.serializeForm($form);
-                    var groupname = $.trim(data.ldapGroupName);
-                    if (groupname) {
-                        args.action({
-                            context: context,
-                            data: data,
-                            isLdap: isLdap,
-                            groupname: groupname,
-                            response: {
-                                error: function(message) {
-                                    if (message) {
-                                        cloudStack.dialog.notice({
-                                            message: message
-                                        });
-                                    }
-                                }
-                            }
-                        });
-                    } else {
-                        var username = data.username;
-                        var bulkAdd = (username instanceof Array);
-                        if (bulkAdd) {
-                            for (var i = 0; i < username.length; i++) {
-                                args.action({
-                                    context: context,
-                                    data: data,
-                                    isLdap: isLdap,
-                                    username: username[i],
-                                    response: {
-                                        error: function(message) {
-                                            if (message) {
-                                                cloudStack.dialog.notice({
-                                                    message: message
-                                                });
-                                            }
-                                        }
-                                    }
-                                });
-                            }
-                        } else {
-                            args.action({
-                                context: context,
-                                data: data,
-                                isLdap: isLdap,
-                                username: username,
-                                response: {
-                                    error: function(message) {
-                                        if (message) {
-                                            cloudStack.dialog.notice({
-                                                message: message
-                                            });
-                                        }
-                                    }
-                                }
-                            });
-                        }
-                    }
-                };
-
-                $wizard.click(function(event) {
-                    var $target = $(event.target);
-                    if ($target.closest('button.next').length) {
-                        $form.validate();
-                        if ($form.valid()) {
-                            completeAction();
-                            $(window).trigger('cloudStack.fullRefresh');
-                            close();
-                            return true;
-                        }
-                    }
-
-                    if ($target.closest('button.cancel').length) {
-                        close();
-                        return false;
-                    }
-                });
-
-                if (ldapStatus) {
-                    var userFilter = $wizard.find('#label_filterBy').val();
-                    if (userFilter == null) {
-                        userFilter = 'AnyDomain';
-                    }
-                    var domainId = $wizard.find('#label_domain').val();
-                    if (domainId == null) {
-                        domainId = $.cookie('domainid');
-                    }
-                    var $table = $wizard.find('.ldap-account-choice tbody');
-                    $("#label_ldap_group_name").on("keypress", function(event) {
-                        if ($table.find("#tr-groupname-message").length === 0) {
-                            $("<tr id='tr-groupname-message'>").appendTo($table).append("<td colspan=\"4\">"+_l('message.ldap.group.import')+"</td>");
-                        }
-                        $table.find("tr").hide();
-                        $table.find("#tr-groupname-message").show();
-                    });
-                    $("#label_ldap_group_name").on("blur", function(event) {
-                        if (!$(this).val()) {
-                            $table.find("tr").show();
-                            $table.find("#tr-groupname-message").hide();
-                        }
-                    });
-                    loadList = function() { $.ajax({
-                        url: createURL("listLdapUsers&listtype=new&domainid=" + domainId + "&userfilter=" + userFilter),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-
-                            $table.find('tr').remove();
-                            if (json.ldapuserresponse.count > 0) {
-                                $(json.ldapuserresponse.LdapUser).each(function() {
-                                    var $result = $('<tr>');
-
-                                    $result.append(
-                                        $('<td>').addClass('select').append(
-                                            $('<input>').attr({
-                                                type: 'checkbox', name: 'username', value: _s(this.username)
-                                            })
-                                        ),
-                                        $('<td>').addClass('name').html(_s(this.firstname) + ' ' + _s(this.lastname))
-                                            .attr('title', _s(this.firstname) + ' ' + _s(this.lastname)),
-                                        $('<td>').addClass('username').html(_s(this.username))
-                                            .attr('title', this.username),
-                                        $('<td>').addClass('email').html(_s(this.email))
-                                            .attr('title', _s(this.email)),
-                                        $('<td>').addClass('email').html(_s(this.conflictingusersource))
-                                            .attr('title', _s(this.conflictingusersource))
-                                    )
-
-                                    $table.append($result);
-                                });
-                            } else {
-                                var $result = $('<tr>');
-
-                                $result.append(
-                                    $('<td>').attr('colspan', 4).html(_l('label.no.data'))
-                                );
-
-                                $table.append($result);
-                            }
-                        }
-                    }) };
-                    loadList();
-
-                } else {
-                    var informationWithinLdapFields = $.extend(true,{},args.informationWithinLdap);
-                    // we are not in ldap so
-                    delete informationWithinLdapFields.conflictingusersource;
-
-                    var informationWithinLdap = cloudStack.dialog.createForm({
-                        context: context,
-                        noDialog: true,
-                        form: {
-                            title: '',
-                            fields: informationWithinLdapFields
-                        }
-                    });
-
-                    var informationWithinLdapForm = informationWithinLdap.$formContainer.find('form .form-item');
-                    informationWithinLdapForm.find('.value #label_username').addClass('required');
-                    informationWithinLdapForm.find('.value #password').addClass('required');
-                    informationWithinLdapForm.find('.value #label_confirm_password').addClass('required');
-                    informationWithinLdapForm.find('.value #label_confirm_password').attr('equalTo', '#password');
-                    informationWithinLdapForm.find('.value #label_email').addClass('required');
-                    informationWithinLdapForm.find('.value #label_first_name').addClass('required');
-                    informationWithinLdapForm.find('.value #label_last_name').addClass('required');
-                    $wizard.find('.manual-account-details').append(informationWithinLdapForm).children().css('background', 'none');
-                    $wizard.find('.ldap-account-choice').css('display', 'none');
-                    $wizard.removeClass('multi-wizard');
-                }
-
-                var informationNotInLdap = $.extend(true,{},args.informationNotInLdap);
-
-                if (!ldapStatus) {
-                    delete informationNotInLdap.filter;
-                    delete informationNotInLdap.ldapGroupName;
-                }
-
-                if (g_idpList == null) {
-                    delete informationNotInLdap.samlEnable;
-                    delete informationNotInLdap.samlEntity;
-                }
-
-                var informationNotInLdap = cloudStack.dialog.createForm({
-                    context: context,
-                    noDialog: true,
-                    form: {
-                        title: '',
-                        fields: informationNotInLdap
-                    }
-                });
-
-                var informationNotInLdapForm = informationNotInLdap.$formContainer.find('form .form-item');
-                informationNotInLdapForm.find('.value #label_filterBy').addClass('required');
-                informationNotInLdapForm.find('.value #label_filterBy').change(function() {
-                    userFilter = $wizard.find('#label_filterBy').val();
-                    loadList();
-                });
-                informationNotInLdapForm.find('.value #label_domain').addClass('required');
-                informationNotInLdapForm.find('.value #label_domain').change(function() {
-                    domainId = $wizard.find('#label_domain').val();
-                    loadList();
-                });
-                informationNotInLdapForm.find('.value #label_type').addClass('required');
-                if (!ldapStatus) {
-                    informationNotInLdapForm.css('background', 'none');
-                }
-                $wizard.find('.manual-account-details').append(informationNotInLdapForm);
-
-                if (g_idpList && g_appendIdpDomain && !ldapStatus) {
-                    var samlChecked = false;
-                    var idpUrl = $wizard.find('select[name=samlEntity]').children(':selected').val();
-                    var appendDomainToUsername = function() {
-                        if (!g_appendIdpDomain) {
-                            return;
-                        }
-                        var username = $wizard.find('input[name=username]').val();
-                        if (username) {
-                            username = username.split('@')[0];
-                        }
-                        if (samlChecked) {
-                            var link = document.createElement('a');
-                            link.setAttribute('href', idpUrl);
-                            $wizard.find('input[name=username]').val(username + "@" + link.host.split('.').splice(-2).join('.'));
-                        } else {
-                            $wizard.find('input[name=username]').val(username);
-                        }
-                    };
-                    $wizard.find('select[name=samlEntity]').change(function() {
-                        idpUrl = $(this).children(':selected').val();
-                        appendDomainToUsername();
-                    });
-                    $wizard.find('input[name=samlEnable]').change(function() {
-                        samlChecked = $(this).context.checked;
-                        appendDomainToUsername();
-                    });
-                }
-
-                var $dialog = $wizard.dialog({
-                    title: ldapStatus ? _l('label.add.LDAP.account') : _l('label.add.account'),
-                    width: ldapStatus ? 800 : 330,
-                    height: ldapStatus ? 500 : 500,
-                    closeOnEscape: false
-                });
-                
-                return cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-            };
-
-            accountsWizard(args);
-        };
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui-custom/affinity.js b/ui/legacy/scripts/ui-custom/affinity.js
deleted file mode 100644
index d074093..0000000
--- a/ui/legacy/scripts/ui-custom/affinity.js
+++ /dev/null
@@ -1,174 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.affinity = function(args) {
-        var listView = args.listView;
-        var action = args.action;
-        var tierSelect = args.tierSelect;
-
-        return function(args) {
-            var context = args.context;
-            var $instanceRow = args.$instanceRow;
-
-            var vmList = function(args) {
-                // Create a listing of instances, based on limited information
-                // from main instances list view
-                var $listView;
-                var instances = $.extend(true, {}, args.listView, {
-                    context: context,
-                    uiCustom: true
-                });
-
-                instances.listView.actions = {
-                    select: {
-                        label: _l('label.select.instance'),
-                        type: 'checkbox',
-                        action: {
-                            uiCustom: function(args) {
-                                var $item = args.$item;
-                                var $input = $item.find('td.actions input:visible');
-
-                                if ($input.attr('type') == 'checkbox') {
-                                    if ($input.is(':checked'))
-                                        $item.addClass('multi-edit-selected');
-                                    else
-                                        $item.removeClass('multi-edit-selected');
-                                } else {
-                                    $item.siblings().removeClass('multi-edit-selected');
-                                    $item.addClass('multi-edit-selected');
-                                }
-                            }
-                        }
-                    }
-                };
-
-                $listView = $('<div>').listView(instances);
-
-                // Change action label
-                $listView.find('th.actions').html(_l('label.select'));
-
-                return $listView;
-            };
-
-            var $dataList = vmList({
-                listView: listView
-            }).dialog({
-                dialogClass: 'multi-edit-add-list panel',
-                width: 825,
-                title: _l('label.affinity.groups'),
-                buttons: [{
-                    text: _l('label.apply'),
-                    'class': 'ok',
-                    click: function() {
-                        if ($dataList.find('.tier-select select').val() == -1) {
-                            cloudStack.dialog.notice({
-                                message: ('Please select a tier')
-                            });
-                            return false;
-                        }
-
-                        var complete = args.complete;
-                        var start = args.start;
-
-                        start();
-                        $dataList.fadeOut(function() {
-                            action({
-                                tierID: $dataList.find('.tier-select select').val(),
-                                _subselect: $dataList.find('tr.multi-edit-selected .subselect select').val(),
-                                context: $.extend(true, {}, context, {
-                                    affinityGroups: $dataList.find('tbody tr').map(function(index, elem) {
-                                        var itemData = $(elem).data('json-obj');
-                                        itemData._isSelected = false;
-
-                                        if ($(elem).hasClass('multi-edit-selected')) {
-                                            itemData._isSelected = true;
-                                        }
-
-                                        return itemData;
-                                    })
-                                }),
-                                response: {
-                                    success: function(args) {
-                                        complete({
-                                            _custom: args._custom,
-                                            $item: $instanceRow
-                                        });
-                                    },
-                                    error: function(args) {
-                                        cloudStack.dialog.notice({
-                                            message: args
-                                        });
-                                    }
-                                }
-                            });
-                            $dataList.remove();
-                        });
-
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                            $(':ui-dialog').dialog('destroy');
-                        });
-                    }
-                }, {
-                    text: _l('label.cancel'),
-                    'class': 'cancel',
-                    click: function() {
-                        $dataList.fadeOut(function() {
-                            $dataList.remove();
-                        });
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                            $(':ui-dialog').dialog('destroy');
-                        });
-                    }
-                }]
-            });
-            cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dataList);
-            // Add tier select dialog
-            if (tierSelect) {
-                var $toolbar = $dataList.find('.toolbar');
-                var $tierSelect = $('<div>').addClass('filters tier-select').prependTo($toolbar);
-                var $tierSelectLabel = $('<label>').html('Select tier').appendTo($tierSelect);
-                var $tierSelectInput = $('<select>').appendTo($tierSelect);
-
-                // Get tier data
-                tierSelect({
-                    context: context,
-                    $tierSelect: $tierSelect,
-                    response: {
-                        success: function(args) {
-                            var data = args.data;
-
-                            $(data).map(function(index, item) {
-                                var $option = $('<option>');
-
-                                $option.attr('value', item.id);
-                                $option.html(item.description);
-                                $option.appendTo($tierSelectInput);
-                            });
-                        },
-                        error: function(message) {
-                            cloudStack.dialog.notice({
-                                message: message ? message : 'Could not retrieve VPC tiers'
-                            });
-                        }
-                    }
-                });
-            }
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/autoscaler.js b/ui/legacy/scripts/ui-custom/autoscaler.js
deleted file mode 100644
index 52eb5ea..0000000
--- a/ui/legacy/scripts/ui-custom/autoscaler.js
+++ /dev/null
@@ -1,421 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    cloudStack.uiCustom.autoscaler = function(args) {
-        // Place outer args here as local variables
-        // i.e, -- var dataProvider = args.dataProvider
-        var forms = $.extend(true, {}, args.forms);
-        var topfields = forms.topFields;
-        var bottomfields = forms.bottomFields;
-        var scaleuppolicy = forms.scaleUpPolicy;
-        var scaledownpolicy = forms.scaleDownPolicy;
-        var dataProvider = cloudStack.autoscaler.dataProvider;
-        var actions = cloudStack.autoscaler.autoscaleActions;
-        var actionFilter = cloudStack.autoscaler.actionFilter;
-
-        return function(args) {
-            var context = args.data ?
-                $.extend(true, {}, args.context, {
-                    lbRules: [args.data]
-                }) : args.context;
-            var formData = args.formData;
-            var $autoscalerDialog = $('<div>').addClass('autoscaler');
-            var $topFields = $('<div>').addClass('field-group top-fields');
-            var $bottomFields = $('<div>').addClass('field-group bottom-fields');
-            var $scaleUpPolicy = $('<div>').addClass('scale-up-policy');
-            var $slideScaleUp = $('<div></div>').addClass('expand');
-            var $hideScaleUp = $('<div></div>').addClass('hide');
-            var $scaleUpLabel = $('<div>Show</div>').addClass('slide-label');
-            var $scaleUpHideLabel = $('<div>Hide</div>').addClass('slide-label');
-            var $scaleDownHideLabel = $('<div>Hide</div>').addClass('slide-label');
-            var $scaleDownLabel = $('<div>Show</div>').addClass('slide-label');
-            var $slideScaleDown = $('<div></div>').addClass('expand');
-            var $hideScaleDown = $('<div></div>').addClass('hide');
-            var $scaleUpDivider = $('<hr></hr>').addClass('policy-divider');
-            var $scaleDownDivider = $('<hr></hr>').addClass('policy-divider');
-            var $bottomFieldDivider = $('<hr></hr>').addClass('policy-divider');
-            var $scaleDownPolicy = $('<div>').addClass('scale-down-policy');
-            var $scaleUpPolicyTitle = $('<div>').addClass('scale-up-policy-title')
-                .html("Scale Up Policy");
-            var $scaleDownPolicyTitle = $('<div>').addClass('scale-down-policy-title')
-                .html("Scale Down Policy");
-            var topFieldForm, $topFieldForm,
-                bottomFieldForm, $bottomFieldForm,
-                scaleUpPolicyTitleForm, $scaleUpPolicyTitleForm,
-                scaleDownPolicyTitleForm, $scaleDownPolicyTitleForm,
-                scaleUpPolicyForm, scaleDownPolicyForm;
-
-            var renderActions = function(args) {
-                var targetActionFilter = args.actionFilter ? args.actionFilter : actionFilter;
-                var data = args.data;
-                var context = args.context;
-                var $actions = $('<div>').addClass('detail-group');
-                var $actionsTable = $('<table>').append('<tr>');
-                var $detailActions = $('<td>').addClass('detail-actions');
-                var $buttons = $('<div>').addClass('buttons');
-                var visibleActions = targetActionFilter ?
-                    targetActionFilter({
-                        context: $.extend(true, {}, context, {
-                            originalAutoscaleData: data ? [data] : null
-                        })
-                    }) :
-                    $.map(actions, function(value, key) {
-                        return key;
-                    });
-
-                $detailActions.append($buttons);
-                $actionsTable.find('tr').append($detailActions);
-                $actions.append($actionsTable);
-
-                $(visibleActions).map(function(index, actionID) {
-                    var action = actions[actionID];
-                    var label = _l(action.label);
-                    var $action = $('<div>').addClass('action').addClass(actionID);
-                    var $icon = $('<a>')
-                        .attr({
-                            href: '#',
-                            title: label
-                        })
-                        .append($('<span>').addClass('icon'));
-
-                    if (visibleActions.length == 1) $action.addClass('single');
-                    else if (!index) $action.addClass('first');
-                    else if (index == visibleActions.length - 1) $action.addClass('last');
-
-                    // Perform action event
-                    $action.click(function() {
-                        var $loading = $('<div>').addClass('loading-overlay').appendTo($autoscalerDialog);
-                        var success = function(args) {
-                            $loading.remove();
-                            cloudStack.dialog.notice({
-                                message: _l('label.task.completed') + ': ' + label
-                            });
-
-                            // Reload actions
-                            if (data != null) { //data is originalAutoscaleData in \ui\scripts\autoscaler.js
-                                data['afterActionIsComplete'] = args.data;
-                            }
-
-                            var $newActions = renderActions({
-                                data: data ? $.extend(data, args.data) : args.data,
-                                actionFilter: args.actionFilter,
-                                context: context
-                            });
-
-                            $actions.after($newActions);
-                            $actions.remove();
-                        };
-                        var error = function(message) {
-                            $loading.remove();
-                            cloudStack.dialog.notice({
-                                message: message
-                            });
-                        };
-
-                        action.action({
-                            context: {
-                                originalAutoscaleData: args.data
-                            },
-                            response: {
-                                success: function(args) {
-                                    var notification = $.extend(args.notification, {
-                                        _custom: args._custom,
-                                        desc: label
-                                    });
-
-                                    cloudStack.ui.notifications.add(
-                                        notification,
-                                        success, {},
-                                        error, {}
-                                    );
-                                },
-                                error: error
-                            }
-                        });
-                    });
-
-                    $action.append($icon);
-                    $action.appendTo($buttons);
-                });
-
-                if (!visibleActions || !visibleActions.length) $actions.hide();
-
-                return $actions;
-            };
-
-            var renderDialogContent = function(args) {
-                var data = args.data ? args.data : {};
-
-                // Setup default values, in case where existing data is present
-                var setDefaultFields = function(fieldID, field) {
-                    var fieldData = data[fieldID];
-
-                    if (fieldData && !field.isBoolean) {
-                        field.defaultValue = fieldData;
-                    } else {
-                        field.isChecked = fieldData;
-                    }
-                };
-                $.each(topfields, setDefaultFields);
-                $.each(bottomfields, setDefaultFields);
-
-                $.extend(context, {
-                    originalAutoscaleData: args.data
-                });
-
-                // Create and append top fields
-                // -- uses create form to generate fields
-                topFieldForm = cloudStack.dialog.createForm({
-                    context: context,
-                    noDialog: true, // Don't render a dialog, just return $formContainer
-                    form: {
-                        title: '',
-                        fields: topfields
-                    }
-                });
-                $topFieldForm = topFieldForm.$formContainer;
-                $topFieldForm.appendTo($topFields);
-
-                scaleUpPolicyTitleForm = cloudStack.dialog.createForm({
-                    context: context,
-                    noDialog: true,
-                    form: {
-                        title: '',
-                        fields: {
-                            scaleUpDuration: {
-                                label: 'label.duration.in.sec',
-                                validation: {
-                                    required: true
-                                }
-                            }
-                        }
-                    }
-                });
-                $scaleUpPolicyTitleForm = scaleUpPolicyTitleForm.$formContainer;
-                $scaleUpPolicyTitleForm.appendTo($scaleUpPolicyTitle);
-
-
-                scaleDownPolicyTitleForm = cloudStack.dialog.createForm({
-                    context: context,
-                    noDialog: true,
-                    form: {
-                        title: '',
-                        fields: {
-                            scaleDownDuration: {
-                                label: 'label.duration.in.sec',
-                                validation: {
-                                    required: true
-                                }
-                            }
-                        }
-                    }
-                });
-                $scaleDownPolicyTitleForm = scaleDownPolicyTitleForm.$formContainer;
-                $scaleDownPolicyTitleForm.appendTo($scaleDownPolicyTitle);
-
-                // Make multi-edits
-                //
-                // Scale up policy
-                if (data.scaleUpPolicy && $.isArray(data.scaleUpPolicy.conditions)) {
-                    $autoscalerDialog.data('autoscaler-scale-up-data',
-                        data.scaleUpPolicy.conditions);
-                }
-
-                if (data.scaleUpPolicy && data.scaleUpPolicy.duration) {
-                    $scaleUpPolicyTitleForm.find('input[name=scaleUpDuration]').val(
-                        data.scaleUpPolicy.duration
-                    );
-                }
-
-                scaleuppolicy.context = context;
-                scaleUpPolicyForm = $scaleUpPolicy.multiEdit(scaleuppolicy);
-
-                // Scale down policy
-                if (data.scaleDownPolicy && $.isArray(data.scaleDownPolicy.conditions)) {
-                    $autoscalerDialog.data('autoscaler-scale-down-data',
-                        data.scaleDownPolicy.conditions);
-                }
-
-                if (data.scaleDownPolicy && data.scaleDownPolicy.duration) {
-                    $scaleDownPolicyTitleForm.find('input[name=scaleDownDuration]').val(
-                        data.scaleDownPolicy.duration
-                    );
-                }
-
-                scaledownpolicy.context = context;
-                scaleDownPolicyForm = $scaleDownPolicy.multiEdit(scaledownpolicy);
-
-                // Create and append bottom fields
-                bottomFieldForm = cloudStack.dialog.createForm({
-                    context: context,
-                    noDialog: true, // Don't render a dialog, just return $formContainer
-                    form: {
-                        title: '',
-                        fields: bottomfields
-                    }
-                });
-                $bottomFieldForm = bottomFieldForm.$formContainer;
-                $bottomFieldForm.appendTo($bottomFields);
-
-                // Append main div elements
-                $autoscalerDialog.append(
-                    $topFields,
-                    $scaleUpPolicyTitle,
-                    $scaleUpPolicy,
-                    $scaleDownPolicyTitle,
-                    $scaleDownPolicy,
-                    $bottomFields
-                );
-
-                // Render dialog
-                //$autoscalerDialog.find('.form-item[rel=templateNames] label').hide();
-                /* Duration Fields*/
-                //$('div.ui-dialog div.autoscaler').find('div.scale-up-policy-title').append("<br></br>").append($inputLabel = $('<label>').html('Duration').attr({left:'200'})).append($('<input>').attr({ name: 'username' }));
-                //$('div.ui-dialog div.autoscaler').find('div.scale-down-policy-title').append("<br></br>").append($inputLabel = $('<label>').html('Duration').attr({left:'200'})).append($('<input>').attr({ name: 'username' }));
-
-                /*Dividers*/
-                $autoscalerDialog.find('div.scale-up-policy-title').prepend($scaleUpDivider);
-                $autoscalerDialog.find('div.scale-down-policy-title').prepend($scaleDownDivider);
-                $autoscalerDialog.find('div.field-group.bottom-fields').prepend($bottomFieldDivider);
-
-                /* Hide effects for multi-edit table*/
-                $autoscalerDialog.find('div.scale-up-policy').prepend($hideScaleUp);
-                $autoscalerDialog.find('div.scale-down-policy ').prepend($hideScaleDown);
-                $autoscalerDialog.find('div.scale-up-policy').prepend($scaleUpHideLabel);
-                $autoscalerDialog.find('div.scale-down-policy').prepend($scaleDownHideLabel);
-
-                /*Toggling the labels and data-item table - SCALE UP POLICY*/
-                $autoscalerDialog.find('div.scale-up-policy div.hide').click(function() {
-                    $autoscalerDialog.find('div.scale-up-policy div.multi-edit div.data-item').slideToggle();
-                    $scaleUpLabel = $autoscalerDialog.find('div.scale-up-policy div.slide-label').replaceWith($scaleUpLabel);
-                });
-
-                /*Toggling the images */
-                $('div.ui-dialog div.autoscaler div.scale-up-policy div.hide').click(function() {
-                    $(this).toggleClass('expand hide');
-                });
-
-                $('div.ui-dialog div.autoscaler div.scale-down-policy div.hide').click(function() {
-                    $(this).toggleClass('expand hide');
-                });
-
-                /*Toggling the labels and data-item table - SCALE DOWN POLICY*/
-                $('div.ui-dialog div.autoscaler div.scale-down-policy div.hide').click(function() {
-                    $('div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit div.data div.data-item').slideToggle();
-                    $scaleDownLabel = $('div.ui-dialog div.autoscaler div.scale-down-policy div.slide-label').replaceWith($scaleDownLabel);
-                });
-
-                $('div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit div.data div.expand').click(function() {
-                    $('div.ui-dialog div.autoscaler div.scale-down-policy div.multi-edit div.data div.data-item').slideToggle();
-                });
-
-                $autoscalerDialog.dialog('option', 'position', 'center');
-                $autoscalerDialog.dialog('option', 'height', 'auto');
-
-                // Setup actions
-                renderActions(args).prependTo($autoscalerDialog);
-            };
-
-            var $loading = $('<div>').addClass('loading-overlay').appendTo($autoscalerDialog);
-            $autoscalerDialog.dialog({
-                title: _l('label.autoscale.configuration.wizard'),
-                width: 825,
-                height: 600,
-                draggable: true,
-                closeonEscape: false,
-                overflow: 'auto',
-                open: function() {
-                    $("button").each(function() {
-                        $(this).attr("style", "left: 600px; position: relative; margin-right: 5px; ");
-                    });
-                },
-                buttons: [{
-                    text: _l('label.cancel'),
-                    'class': 'cancel',
-                    click: function() {
-                        $autoscalerDialog.dialog('destroy');
-                        $('.overlay').remove();
-                    }
-                }, {
-                    text: _l('Apply'),
-                    'class': 'ok',
-                    click: function() {
-                        var data = cloudStack.serializeForm($('.ui-dialog .autoscaler form'));
-
-                        // Fix for missing formData, when editing existing rules;
-                        if (!formData) formData = data;
-
-                        // Pass VPC data
-                        if (formData.tier) {
-                            data.tier = formData.tier;
-                        }
-
-                        $loading.appendTo($autoscalerDialog);
-                        cloudStack.autoscaler.actions.apply({
-                            formData: formData,
-                            context: context,
-                            data: data,
-                            response: {
-                                success: function() {
-                                    $loading.remove();
-                                    $autoscalerDialog.dialog('destroy');
-                                    $autoscalerDialog.closest(':ui-dialog').remove();
-                                    $('.overlay').remove();
-                                    cloudStack.dialog.notice({
-                                        message: 'Autoscale configured successfully.'
-                                    });
-                                },
-                                error: function(message) {
-                                    cloudStack.dialog.notice({
-                                        message: message
-                                    });
-                                    $loading.remove();
-                                }
-                            }
-                        });
-                    }
-                }]
-            }).closest('.ui-dialog').overlay();
-
-            dataProvider({
-                context: context,
-                response: {
-                    success: function(args) {
-                        $loading.remove();
-                        renderDialogContent(args);
-
-                        if (args.data == null) { //from a new LB rule
-                            $autoscalerDialog.find('select[name=serviceOfferingId]').removeAttr('disabled');
-                            $autoscalerDialog.find('select[name=securityGroups]').removeAttr('disabled');
-                            $autoscalerDialog.find('select[name=diskOfferingId]').removeAttr('disabled');
-                        } else { //from an existing LB rule
-                            $autoscalerDialog.find('select[name=serviceOfferingId]').attr('disabled', true);
-                            $autoscalerDialog.find('select[name=securityGroups]').attr('disabled', true);
-                            $autoscalerDialog.find('select[name=diskOfferingId]').attr('disabled', true);
-
-                            if (args.data.isAdvanced != null) {
-                                $autoscalerDialog.find('input[type=checkbox]').trigger('click');
-                                $autoscalerDialog.find('input[type=checkbox]').attr('checked', 'checked');
-                            }
-                        }
-                    }
-                }
-            });
-        };
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/backupSchedule.js b/ui/legacy/scripts/ui-custom/backupSchedule.js
deleted file mode 100644
index 5646898..0000000
--- a/ui/legacy/scripts/ui-custom/backupSchedule.js
+++ /dev/null
@@ -1,181 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.backupSchedule = function(args) {
-        var desc = args.desc;
-        var selects = args.selects;
-        var actions = args.actions;
-        var dataProvider = args.dataProvider;
-
-        return function(args) {
-            var $backups = $('#template').find('.recurring-snapshots').clone();
-            var context = args.context;
-
-            // Update labels
-            $backups.find('.forms ul li.hourly a').html(_l('label.hourly'));
-            $backups.find('.forms ul li.daily a').html(_l('label.daily'));
-            $backups.find('.forms ul li.weekly a').html(_l('label.weekly'));
-            $backups.find('.forms ul li.monthly a').html(_l('label.monthly'));
-            $backups.find('.field.timezone .name').html(_l('label.timezone'));
-            $backups.find('.field.time .name').html(_l('label.time'));
-            $backups.find('.field.time .value label').html(_l('label.minute.past.hour'));
-            $backups.find('.field.maxsnaps').hide();
-            $backups.find('.add-snapshot-action.add').html(_l('label.configure'));
-
-            $backups.find('.desc').html(_l(desc));
-            $backups.find('.forms').tabs();
-
-            $backups.find('form select').each(function() {
-                var $select = $(this);
-                var selectData = selects[$select.attr('name')];
-
-                if (selectData) {
-                    selectData({
-                        response: {
-                            success: function(args) {
-                                $(args.data).each(function() {
-                                    var $option = $('<option>').appendTo($select);
-
-                                    $option.val(this.id).html(_l(this.name));
-                                });
-                            }
-                        }
-                    });
-                }
-            });
-
-            $backups.find('form').validate();
-            $backups.find('.scheduled-snapshots p').html('Backup Schedule');
-            $($.find('.scheduled-snapshots tr td.keep')).hide();
-
-            $backups.find('.add-snapshot-action.add').click(function() {
-                var $form = $backups.find('form:visible');
-                if (!$form.valid()) return false;
-                var formData = cloudStack.serializeForm($form);
-                actions.add({
-                    context: context,
-                    snapshot: formData,
-                    response: {
-                        success: function(args) {
-                            $backups.find('.scheduled-snapshots tr').hide();
-                            var $backupScheduleRow = $backups.find('.scheduled-snapshots tr').filter(function() {
-                                return $(this).index() == args.data.type;
-                            }).addClass('active').show();
-
-                            $backupScheduleRow.data('json-obj', args.data);
-
-                            // Update fields
-                            $backupScheduleRow.find('td.time span').html(args.data.time);
-                            $backupScheduleRow.find('td.day-of-week span').html(_l(
-                                args.data['day-of-week'] ?
-                                $backups.find('select[name=day-of-week] option').filter(function() {
-                                    return $(this).val() == args.data['day-of-week'];
-                                }).html() :
-                                args.data['day-of-month']
-                            ));
-                            $backupScheduleRow.find('td.timezone span').html(
-                                $backups.find('select[name=timezone] option').filter(function() {
-                                    return $(this).val() == args.data['timezone'];
-                                }).html()
-                            );
-                            $backupScheduleRow.find('td.keep').hide();
-
-                            $(':ui-dialog').dialog('option', 'position', 'center');
-
-                        }
-                    }
-                });
-
-                return true;
-            });
-
-            // Remove backup
-            $backups.find('.action.destroy').click(function() {
-                var $tr = $(this).closest('tr');
-                actions.remove({
-                    context: context,
-                    snapshot: $tr.data('json-obj'),
-                    response: {
-                        success: function(args) {
-                            $tr.hide().removeClass('active');
-                            $(':ui-dialog').dialog('option', 'position', 'center');
-
-                        }
-                    }
-                });
-            });
-
-            // Get existing data
-            dataProvider({
-                context: context,
-                response: {
-                    success: function(args) {
-                        $(args.data).each(function() {
-                            var backup = this;
-
-                            // Get matching table row
-                            var $tr = $backups.find('tr').filter(function() {
-                                return $(this).index() == backup.type;
-                            }).addClass('active').show();
-
-                            $tr.data('json-obj', backup);
-
-                            $tr.find('td.time span').html(backup.time);
-                            $tr.find('td.timezone span').html(
-                                $backups.find('select[name=timezone] option').filter(function() {
-                                    return $(this).val() == backup['timezone'];
-                                }).html()
-                            );
-                            $tr.find('td.day-of-week span').html(
-                                backup['day-of-week'] ?
-                                $backups.find('select[name=day-of-week] option').filter(function() {
-                                    return $(this).val() == backup['day-of-week'];
-                                }).html() :
-                                backup['day-of-month']
-                            );
-                            $tr.find('td.keep').hide();
-                        });
-
-                    }
-                }
-            });
-
-            // Create dialog
-            var $dialog = $backups.dialog({
-                title: _l('Backup Schedule'),
-                dialogClass: 'recurring-snapshots',
-                closeOnEscape: false,
-                width: 600,
-                buttons: [{
-                    text: _l('label.close'),
-                    'class': 'ok',
-                    click: function() {
-                        $dialog.fadeOut(function() {
-                            $dialog.remove();
-                        });
-
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-                    }
-                }]
-            });
-
-            return cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/copyTemplate.js b/ui/legacy/scripts/ui-custom/copyTemplate.js
deleted file mode 100644
index 60125fe..0000000
--- a/ui/legacy/scripts/ui-custom/copyTemplate.js
+++ /dev/null
@@ -1,130 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.copyTemplate = function(args) {
-        var listView = args.listView;
-        var action = args.action;
-
-        return function(args) {
-            var context = args.context;
-
-            var destZoneList = function(args) {
-                var $listView;
-
-                var destZones = $.extend(true, {}, args.listView, {
-                    context: context,
-                    uiCustom: true
-                });
-
-                destZones.listView.actions = {
-                    select: {
-                        label: _l('label.select.zone'),
-                        type: 'checkbox',
-                        action: {
-                            uiCustom: function(args) {
-                                var $item = args.$item;
-                                var $input = $item.find('td.actions input:visible');
-
-                                if ($input.attr('type') == 'checkbox') {
-                                    if ($input.is(':checked'))
-                                        $item.addClass('multi-edit-selected');
-                                    else
-                                        $item.removeClass('multi-edit-selected');
-                                } else {
-                                    $item.siblings().removeClass('multi-edit-selected');
-                                    $item.addClass('multi-edit-selected');
-                                }
-                            }
-                        }
-                    }
-                };
-
-                $listView = $('<div>').listView(destZones);
-
-                // Change action label
-                $listView.find('th.actions').html(_l('label.select'));
-
-                return $listView;
-            };
-
-            var $dataList = destZoneList({
-                listView: listView
-            }).dialog({
-                dialogClass: 'multi-edit-add-list panel copy-template-destination-list',
-                width: 625,
-                draggable: false,
-                title: _l('label.action.copy.template'),
-                buttons: [{
-                    text: _l('label.ok'),
-                    'class': 'ok copytemplateok',
-                    click: function() {
-                        var complete = args.complete;
-                         var selectedZoneObj = [];
-                        $dataList.find('tr.multi-edit-selected').map(function(index, elem) {
-                                var itemData = $(elem).data('json-obj');
-                                selectedZoneObj.push(itemData)        ;
-                                });
-                        if(selectedZoneObj != undefined) {
-                            $dataList.fadeOut(function() {
-                                action({
-                                    context: $.extend(true, {}, context, {
-                                        selectedZone: selectedZoneObj
-                                    }),
-                                    response: {
-                                        success: function(args) {
-                                            complete({
-                                                _custom: args._custom,
-                                                $item: $('<div>'),
-                                            });
-                                        },
-                                        error: function(args) {
-                                            cloudStack.dialog.notice({
-                                                message: args
-                                            });
-                                        }
-                                    }
-                                });
-                            });
-
-                            $('div.overlay').fadeOut(function() {
-                                $('div.overlay').remove();
-                            });
-                        }
-                        else {
-                            cloudStack.dialog.notice({
-				 message: _l('message.template.copy.select.zone')
-                            });
-                        }
-
-                    }
-                }, {
-                    text: _l('label.cancel'),
-                    'class': 'cancel copytemplatecancel',
-                    click: function() {
-                        $dataList.fadeOut(function() {
-                            $dataList.remove();
-                        });
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                            $(':ui-dialog').dialog('destroy');
-                        });
-                    }
-                }]
-            }).parent('.ui-dialog').overlay();
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/dashboard.js b/ui/legacy/scripts/ui-custom/dashboard.js
deleted file mode 100644
index 7ee2eb7..0000000
--- a/ui/legacy/scripts/ui-custom/dashboard.js
+++ /dev/null
@@ -1,205 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    cloudStack.uiCustom.dashboard = function() {
-        /**
-         * Retrieve chart data
-         */
-        var getData = function() {
-            // Populate data
-            $dashboard.find('[data-item]').hide();
-            cloudStack.sections.dashboard[dashboardType].dataProvider({
-                response: {
-                    success: function(args) {
-                        var $browser = $dashboard.closest('#browser .container');
-                        var data = args.data;
-
-                        // Iterate over data; populate corresponding DOM elements
-                        $.each(data, function(key, value) {
-                            var $elem = $dashboard.find('[data-item=' + key + ']');
-
-                            // This assumes an array of data
-                            if ($elem.is('ul')) {
-                                $elem.show();
-                                var $liTmpl = $elem.find('li').remove();
-                                $(value).each(function() {
-                                    var item = this;
-                                    var $li = $liTmpl.clone().appendTo($elem).hide();
-
-                                    if ($li.is('.zone-stats li')) {
-                                        $li.click(function() {
-                                            $browser.cloudBrowser('addPanel', {
-                                                title: _l('label.zone.details'),
-                                                parent: $dashboard.closest('.panel'),
-                                                maximizeIfSelected: true,
-                                                complete: function($newPanel) {
-                                                    $newPanel.detailView($.extend(true, {},
-                                                        cloudStack.sections.dashboard.admin.zoneDetailView, {
-                                                            $browser: $browser,
-                                                            context: $.extend(true, {}, cloudStack.context, {
-                                                                physicalResources: [{
-                                                                    id: item.zoneID
-                                                                }]
-                                                            })
-                                                        }
-                                                    ));
-                                                }
-                                            });
-                                        });
-                                    }
-
-                                    $.each(item, function(arrayKey, arrayValue) {
-                                        if (!arrayValue) arrayValue = '';
-
-                                        var $arrayElem = $li.find('[data-list-item=' + arrayKey + ']');
-
-                                        $arrayElem.each(function() {
-                                            var $arrayElem = $(this);
-
-                                            if ($arrayElem.hasClass('pie-chart')) {
-                                                // Generate pie chart
-                                                // -- values above 80 have a red color
-                                                setTimeout(function() {
-                                                    pieChart($arrayElem, [{
-                                                        data: [
-                                                            [1, 100 - arrayValue]
-                                                        ],
-                                                        color: '#54697e'
-                                                    }, {
-                                                        data: [
-                                                            [1, arrayValue]
-                                                        ],
-                                                        color: arrayValue < 80 ? 'orange' : 'red'
-                                                    }]);
-                                                });
-                                            } else {
-                                                if ($li.attr('concat-value')) {
-                                                    var val = $(_l(arrayValue).toString().split(', ')).map(function() {
-                                                        var val = _s(this.toString());
-                                                        var concatValue = parseInt($li.attr('concat-value'));
-
-                                                        return val.length >= concatValue ?
-                                                            val.substring(0, concatValue).concat('...') : val;
-                                                    }).toArray().join('<br />');
-
-                                                    $arrayElem.html(val);
-                                                } else {
-                                                    $arrayElem.html(_s(_l(arrayValue)));
-                                                }
-
-                                                $arrayElem.attr('title', _l(arrayValue).toString().replace('<br/>', ', '));
-                                            }
-                                        });
-                                    });
-
-                                    $li.attr({
-                                        title: _s(_l(item.description))
-                                    });
-
-                                    $li.fadeIn();
-                                });
-                            } else {
-                                $elem.each(function() {
-                                    var $item = $(this);
-                                    if ($item.hasClass('chart-line')) {
-                                        $item.show().animate({
-                                            width: value + '%'
-                                        });
-                                    } else {
-                                        $item.hide().html(_s(value)).fadeIn();
-                                    }
-                                });
-                            }
-                        });
-                    }
-                }
-            });
-        };
-
-        /**
-         * Render circular pie chart, without labels
-         */
-        var pieChart = function($container, data) {
-            $container.css({
-                width: 70,
-                height: 66
-            });
-            $.plot($container, data, {
-                width: 100,
-                height: 100,
-                series: {
-                    pie: {
-                        innerRadius: 0.7,
-                        show: true,
-                        label: {
-                            show: false
-                        }
-                    }
-                },
-                legend: {
-                    show: false
-                }
-            });
-        };
-
-        // Determine if user or admin dashboard should be shown
-        var dashboardType = cloudStack.sections.dashboard.adminCheck({
-            context: cloudStack.context
-        }) ? 'admin' : 'user';
-
-        // Get dashboard layout
-        var $dashboard = $('#template').find('div.dashboard.' + dashboardType).clone();
-
-        // Update text
-        $dashboard.find('.button.view-all').html(_l('label.view.all'));
-        $dashboard.find('.dashboard-container.sub.alerts.first .top .title span').html(_l('label.general.alerts'));
-        $dashboard.find('.dashboard-container.sub.alerts.last .top .title span').html(_l('label.host.alerts'));
-        $dashboard.find('.dashboard-container.head .top .title span').html(_l('label.system.capacity'));
-
-        // View all action
-        $dashboard.find('.view-all').click(function() {
-            var $browser = $('#browser .container');
-
-            if ($(this).hasClass('network')) $('#navigation li.network').click();
-            else {
-                $browser.cloudBrowser('addPanel', {
-                    title: $dashboard.hasClass('admin') ? 'Alerts' : 'Events',
-                    maximizeIfSelected: true,
-                    complete: function($newPanel) {
-                        $newPanel.listView({
-                            $browser: $browser,
-                            context: cloudStack.context,
-                            listView: $dashboard.hasClass('admin') ? cloudStack.sections.events.sections.alerts.listView : cloudStack.sections.events.sections.events.listView // Users cannot see events
-                        });
-                    }
-                });
-            };
-        });
-
-        //Fetch Latest action
-        $dashboard.find('.fetch-latest').click(function() {
-            window.fetchLatestflag = 1;
-            var $browser = $('#browser .container');
-
-            if ($(this).hasClass('fetch-latest')) $('#navigation li.dashboard').click();
-        });
-
-        getData();
-
-        return $dashboard;
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/enableStaticNAT.js b/ui/legacy/scripts/ui-custom/enableStaticNAT.js
deleted file mode 100644
index 37d7180..0000000
--- a/ui/legacy/scripts/ui-custom/enableStaticNAT.js
+++ /dev/null
@@ -1,178 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.enableStaticNAT = function(args) {
-        var listView = args.listView;
-        var action = args.action;
-        var tierSelect = args.tierSelect;
-
-        return function(args) {
-            var context = args.context;
-            var $instanceRow = args.$instanceRow;
-
-            var vmList = function(args) {
-                // Create a listing of instances, based on limited information
-                // from main instances list view
-                var $listView;
-                var instances = $.extend(true, {}, args.listView, {
-                    context: context,
-                    uiCustom: true
-                });
-
-                instances.listView.multiSelect = false;
-
-                instances.listView.actions = {
-                    select: {
-                        label: _l('label.select.instance'),
-                        type: 'radio',
-                        action: {
-                            uiCustom: function(args) {
-                                var $item = args.$item;
-                                var $input = $item.find('td.actions input:visible');
-
-                                if ($input.attr('type') == 'checkbox') {
-                                    if ($input.is(':checked'))
-                                        $item.addClass('multi-edit-selected');
-                                    else
-                                        $item.removeClass('multi-edit-selected');
-                                } else {
-                                    $item.siblings().removeClass('multi-edit-selected');
-                                    $item.addClass('multi-edit-selected');
-                                }
-                            }
-                        }
-                    }
-                };
-
-                $listView = $('<div>').listView(instances);
-
-                // Change action label
-                $listView.find('th.actions').html(_l('label.select'));
-
-                return $listView;
-            };
-
-            var $dataList = vmList({
-                listView: listView
-            }).dialog({
-                dialogClass: 'multi-edit-add-list panel',
-                width: 875,
-                title: _l('label.select.vm.for.static.nat'),
-                buttons: [{
-                    text: _l('label.apply'),
-                    'class': 'ok',
-                    click: function() {
-                        if ($dataList.find('.tier-select select').val() == -1) {
-                            cloudStack.dialog.notice({
-                                message: ('Please select a tier')
-                            });
-                            return false;
-                        }
-
-                        if (!$dataList.find(
-                            'input[type=radio]:checked, input[type=checkbox]:checked'
-                        ).length) {
-                            cloudStack.dialog.notice({
-                                message: _l('message.select.instance')
-                            });
-
-                            return false;
-                        }
-
-                        var complete = args.complete;
-                        var start = args.start;
-
-                        start();
-                        $dataList.fadeOut(function() {
-                            action({
-                                tierID: $dataList.find('.tier-select select').val(),
-                                _subselect: $dataList.find('tr.multi-edit-selected .subselect select').val(),
-                                context: $.extend(true, {}, context, {
-                                    instances: [
-                                        $dataList.find('tr.multi-edit-selected').data('json-obj')
-                                    ]
-                                }),
-                                response: {
-                                    success: function(args) {
-                                        complete({
-                                            $item: $instanceRow
-                                        });
-                                    },
-                                    error: function(args) {
-                                        cloudStack.dialog.notice({
-                                            message: args
-                                        });
-                                    }
-                                }
-                            });
-                            $dataList.remove();
-                        });
-
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-                    }
-                }, {
-                    text: _l('label.cancel'),
-                    'class': 'cancel',
-                    click: function() {
-                        $dataList.fadeOut(function() {
-                            $dataList.remove();
-                        });
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-                    }
-                }]
-            });
-            
-            cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dataList);
-
-            // Add tier select dialog
-            if (tierSelect) {
-                var $toolbar = $dataList.find('.toolbar');
-                var $tierSelect = $('<div>').addClass('filters tier-select').prependTo($toolbar);
-                var $tierSelectLabel = $('<label>').html('Select tier').appendTo($tierSelect);
-                var $tierSelectInput = $('<select>').appendTo($tierSelect);
-
-                // Get tier data
-                tierSelect({
-                    context: context,
-                    $tierSelect: $tierSelect,
-                    response: {
-                        success: function(args) {
-                            var data = args.data;
-
-                            $(data).map(function(index, item) {
-                                var $option = $('<option>');
-
-                                $option.attr('value', item.id);
-                                $option.html(item.description);
-                                $option.appendTo($tierSelectInput);
-                            });
-                        },
-                        error: function(message) {
-                            cloudStack.dialog.notice({
-                                message: message ? message : 'Could not retrieve VPC tiers'
-                            });
-                        }
-                    }
-                });
-            }
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/granularSettings.js b/ui/legacy/scripts/ui-custom/granularSettings.js
deleted file mode 100644
index 42177e3..0000000
--- a/ui/legacy/scripts/ui-custom/granularSettings.js
+++ /dev/null
@@ -1,226 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    cloudStack.uiCustom.granularSettings = function(args) {
-        var dataProvider = args.dataProvider;
-        var actions = args.actions;
-
-        return function(args) {
-            var context = args.context;
-
-            var listView = {
-                id: 'settings',
-                fields: {
-                    name: {
-                        label: 'label.name'
-                    },
-                    description: {
-                        label: 'label.description'
-                    },
-                    value: {
-                        label: 'label.value',
-                        editable: true
-                    }
-                },
-                actions: {
-                    edit: {
-                        label: 'label.change.value',
-                        action: actions.edit
-                    }
-                },
-                dataProvider: dataProvider
-            };
-
-            var $listView = $('<div>').listView({
-                context: context,
-                listView: listView
-            });
-
-            return $listView;
-        }
-    };
-    cloudStack.uiCustom.granularDetails = function(args) {
-        var dataProvider = args.dataProvider;
-        var actions = args.actions;
-        var resourceType = args.resourceType;
-
-        return function(args) {
-            var context = args.context;
-
-            var listView = {
-                id: 'details',
-                fields: {
-                    name: {
-                        label: 'label.name'
-                    },
-                    value: {
-                        label: 'label.value',
-                        editable: true
-                    }
-                },
-                actions: {
-                    edit: {
-                        label: 'label.change.value',
-                        action: actions.edit
-                    },
-                    remove: {
-                        label: 'Remove Setting',
-                        messages: {
-                            confirm: function(args) {
-                                return 'Delete Setting';
-                            },
-                            notification: function(args) {
-                                return 'Setting deleted';
-                            }
-                        },
-                        action: actions.remove,
-                        notification: {
-                            poll: function(args) {
-                                args.complete();
-                            }
-                        }
-                    },
-                    add : {
-                        label: 'Add Setting',
-                        messages: {
-                            confirm: function(args) {
-                                return 'Add Setting';
-                            },
-                            notification: function(args) {
-                                return 'Setting added';
-                            }
-                        },
-                        preFilter: function(args) {
-                            return true;
-                        },
-                        createForm: {
-                            title: 'Add New Setting',
-                            preFilter: function(args) {
-                                var data = {
-                                    resourcetype: resourceType
-                                };
-                                if (resourceType === 'UserVm') {
-                                    data.resourceid = args.context.instances[0].id;
-                                }
-                                if (resourceType === 'Template') {
-                                    data.resourceid = args.context.templates[0].id;
-                                }
-
-                                $.ajax({
-                                    url: createURL("listDetailOptions"),
-                                    data: data,
-                                    dataType: "json",
-                                    success: function(json) {
-                                        var details = json.listdetailoptionsresponse.detailoptions.details;
-                                        var keys = [];
-                                        Object.keys(details).forEach(function(key,index) {
-                                            keys.push(key);
-                                        });
-                                        $(args.$form.find('input[name="name"]')).blur();
-                                        $(args.$form.find('input[name="name"]')).autocomplete({
-                                            minLength: 0,
-                                            delay: 0,
-                                            source: keys.sort(),
-                                            select: function(event, ui) {
-                                                const key = ui.item.value;
-                                                const options = details[key];
-                                                $(args.$form.find('input[name="value"]')).autocomplete({
-                                                    minLength: 0,
-                                                    delay: 0,
-                                                    autoFocus: true,
-                                                    source: options.sort()
-                                                }).focus(function() {
-                                                    $(this).data("uiAutocomplete").search($(this).val());
-                                                });
-                                            }
-                                        }).focus(function() {
-                                            $(this).data("uiAutocomplete").search($(this).val());
-                                        });
-                                    }
-                                });
-
-                                return true;
-                            },
-                            fields: {
-                                name: {
-                                    label: 'label.name',
-                                    validation: {
-                                        required: true
-                                    }
-                                },
-                                value: {
-                                    label: 'label.value',
-                                    validation: {
-                                        required: true
-                                    }
-                                }
-                            }
-                        },
-                        action: actions.add
-                    }
-                },
-                dataProvider: function(args) {
-                    var data = {
-                        resourcetype: resourceType
-                    };
-                    if (resourceType === 'UserVm') {
-                        data.resourceid = args.context.instances[0].id;
-                    }
-                    if (resourceType === 'Template') {
-                        data.resourceid = args.context.templates[0].id;
-                    }
-
-                    $.ajax({
-                        url: createURL("listDetailOptions"),
-                        data: data,
-                        dataType: "json",
-                        success: function(json) {
-                            var details = json.listdetailoptionsresponse.detailoptions.details;
-                            var tbody = $.find('#details-tab-settings .data-table tbody');
-                            $(tbody).on('DOMNodeInserted', "tr", function() {
-                                $.each($.find('#details-tab-settings .data-table tbody tr'), function(idx, row) {
-                                    const key = $(row).find('td.name').attr('title');
-                                    const options = details[key];
-                                    if (options) {
-                                        $($(row).find('input.edit')).autocomplete({
-                                            minLength: 0,
-                                            delay: 0,
-                                            autoFocus: true,
-                                            source: options.sort()
-                                        }).focus(function() {
-                                            $(this).data("uiAutocomplete").search("");
-                                        });
-                                        $(row).find('input.edit').blur();
-                                    }
-                                });
-                            });
-                            dataProvider(args);
-                        }
-                    });
-                }
-            };
-
-            var $listView = $('<div>').listView({
-                context: context,
-                listView: listView
-            });
-
-            return $listView;
-        }
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/healthCheck.js b/ui/legacy/scripts/ui-custom/healthCheck.js
deleted file mode 100644
index 43070c3..0000000
--- a/ui/legacy/scripts/ui-custom/healthCheck.js
+++ /dev/null
@@ -1,383 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-
-    cloudStack.uiCustom.healthCheck = function(args) {
-
-        // Place outer args here as local variables
-        // i.e, -- var dataProvider = args.dataProvider
-
-        return function(args) {
-            if (args.context.multiRules == undefined) { //LB rule is not created yet
-                cloudStack.dialog.notice({
-                    message: _l('Health Check can only be configured on a created LB rule')
-                });
-                return;
-            }
-
-            var formData = args.formData;
-            var forms = $.extend(true, {}, args.forms);
-            var topFieldForm, bottomFieldForm, $topFieldForm, $bottomFieldForm;
-            var topfields = forms.topFields;
-
-            var $healthCheckDesc = $('<div>' + _l('label.health.check.message.desc') + '</div>').addClass('health-check-description');
-            var $healthCheckConfigTitle = $('<div><br><br>' + _l('label.health.check.configurations.options') + '</div>').addClass('health-check-config-title');
-            var $healthCheckAdvancedTitle = $('<div><br><br>' + _l('label.health.check.advanced.options') + '</div>').addClass('health-check-advanced-title');
-
-            var $healthCheckDialog = $('<div>').addClass('health-check');
-            $healthCheckDialog.append($healthCheckDesc);
-            $healthCheckDialog.append($healthCheckConfigTitle);
-            var $loadingOnDialog = $('<div>').addClass('loading-overlay');
-
-            var policyObj = null;
-            var pingpath1 = '/';
-            var responsetimeout1 = '2';
-            var healthinterval1 = '5';
-            var healthythreshold1 = '2';
-            var unhealthythreshold1 = '1';
-
-            $.ajax({
-                url: createURL('listLBHealthCheckPolicies'),
-                data: {
-                    lbruleid: args.context.multiRules[0].id
-                },
-                async: false,
-                success: function(json) {
-                    if (json.listlbhealthcheckpoliciesresponse.healthcheckpolicies[0].healthcheckpolicy[0] != undefined) {
-                        policyObj = json.listlbhealthcheckpoliciesresponse.healthcheckpolicies[0].healthcheckpolicy[0];
-                        pingpath1 = policyObj.pingpath; //API bug: API doesn't return it
-                        responsetimeout1 = policyObj.responsetime;
-                        healthinterval1 = policyObj.healthcheckinterval;
-                        healthythreshold1 = policyObj.healthcheckthresshold;
-                        unhealthythreshold1 = policyObj.unhealthcheckthresshold;
-                    }
-                }
-            });
-
-            topFieldForm = cloudStack.dialog.createForm({
-                context: args.context,
-                noDialog: true, // Don't render a dialog, just return $formContainer
-                form: {
-                    title: '',
-                    fields: {
-                        pingpath: {
-                            label: 'label.ping.path',
-                            validation: {
-                                required: false
-                            },
-                            defaultValue: pingpath1
-                        }
-                    }
-                }
-            });
-
-            $topFieldForm = topFieldForm.$formContainer;
-            $topFieldForm.appendTo($healthCheckDialog);
-
-            $healthCheckDialog.append($healthCheckAdvancedTitle);
-
-            bottomFieldForm = cloudStack.dialog.createForm({
-                context: args.context,
-                noDialog: true,
-                form: {
-                    title: '',
-                    fields: {
-                        responsetimeout: {
-                            label: 'label.response.timeout.in.sec',
-                            validation: {
-                                required: false
-                            },
-                            defaultValue: responsetimeout1
-                        },
-                        healthinterval: {
-                            label: 'label.health.check.interval.in.sec',
-                            validation: {
-                                required: false
-                            },
-                            defaultValue: healthinterval1
-                        },
-                        healthythreshold: {
-                            label: 'label.healthy.threshold',
-                            validation: {
-                                required: false
-                            },
-                            defaultValue: healthythreshold1
-                        },
-                        unhealthythreshold: {
-                            label: 'label.unhealthy.threshold',
-                            validation: {
-                                required: false
-                            },
-                            defaultValue: unhealthythreshold1
-                        }
-                    }
-                }
-            });
-
-            $bottomFieldForm = bottomFieldForm.$formContainer;
-            $bottomFieldForm.appendTo($healthCheckDialog);
-
-
-            var buttons = [{
-                text: _l('label.cancel'),
-                'class': 'cancel',
-                click: function() {
-                    $healthCheckDialog.dialog('destroy');
-                    $('.overlay').remove();
-                }
-            }];
-
-            if (policyObj == null) { //policy is not created yet
-                buttons.push({
-                    text: _l('Create'),
-                    'class': 'ok',
-                    click: function() {
-                        $loadingOnDialog.appendTo($healthCheckDialog);
-                        var formData = cloudStack.serializeForm($healthCheckDialog.find('form'));
-                        var data = {
-                            lbruleid: args.context.multiRules[0].id,
-                            pingpath: formData.pingpath,
-                            responsetimeout: formData.responsetimeout,
-                            intervaltime: formData.healthinterval,
-                            healthythreshold: formData.healthythreshold,
-                            unhealthythreshold: formData.unhealthythreshold
-                        };
-
-                        $.ajax({
-                            url: createURL('createLBHealthCheckPolicy'),
-                            data: data,
-                            success: function(json) {
-                                var jobId = json.createlbhealthcheckpolicyresponse.jobid;
-                                var createLBHealthCheckPolicyIntervalId = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL('queryAsyncJobResult'),
-                                        data: {
-                                            jobid: jobId
-                                        },
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(createLBHealthCheckPolicyIntervalId);
-
-                                                if (result.jobstatus == 1) {
-                                                    cloudStack.dialog.notice({
-                                                        message: _l('Health Check Policy has been created')
-                                                    });
-                                                    $loadingOnDialog.remove();
-                                                    $healthCheckDialog.dialog('destroy');
-                                                    $('.overlay').remove();
-                                                } else if (result.jobstatus == 2) {
-                                                    cloudStack.dialog.notice({
-                                                        message: _s(result.jobresult.errortext)
-                                                    });
-                                                    $loadingOnDialog.remove();
-                                                    $healthCheckDialog.dialog('destroy');
-                                                    $('.overlay').remove();
-                                                }
-                                            }
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            },
-
-                            error: function(json) {
-
-                                cloudStack.dialog.notice({
-                                    message: parseXMLHttpResponse(json)
-                                }); //Error message in the API needs to be improved
-                                $healthCheckDialog.dialog('close');
-                                $('.overlay').remove();
-                            }
-
-                        });
-                    }
-                });
-            } else { //policy exists already
-                buttons.push(
-                    //Update Button (begin) - call delete API first, then create API
-                    {
-                        text: _l('Update'),
-                        'class': 'ok',
-                        click: function() {
-                            $loadingOnDialog.appendTo($healthCheckDialog);
-
-                            $.ajax({
-                                url: createURL('deleteLBHealthCheckPolicy'),
-                                data: {
-                                    id: policyObj.id
-                                },
-                                success: function(json) {
-                                    var jobId = json.deletelbhealthcheckpolicyresponse.jobid;
-                                    var deleteLBHealthCheckPolicyIntervalId = setInterval(function() {
-                                        $.ajax({
-                                            url: createURL('queryAsyncJobResult'),
-                                            data: {
-                                                jobid: jobId
-                                            },
-                                            success: function(json) {
-                                                var result = json.queryasyncjobresultresponse;
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                    clearInterval(deleteLBHealthCheckPolicyIntervalId);
-
-                                                    if (result.jobstatus == 1) {
-                                                        var formData = cloudStack.serializeForm($healthCheckDialog.find('form'));
-                                                        var data = {
-                                                            lbruleid: args.context.multiRules[0].id,
-                                                            pingpath: formData.pingpath,
-                                                            responsetimeout: formData.responsetimeout,
-                                                            intervaltime: formData.healthinterval,
-                                                            healthythreshold: formData.healthythreshold,
-                                                            unhealthythreshold: formData.unhealthythreshold
-                                                        };
-
-                                                        $.ajax({
-                                                            url: createURL('createLBHealthCheckPolicy'),
-                                                            data: data,
-                                                            success: function(json) {
-                                                                var jobId = json.createlbhealthcheckpolicyresponse.jobid;
-                                                                var createLBHealthCheckPolicyIntervalId = setInterval(function() {
-                                                                    $.ajax({
-                                                                        url: createURL('queryAsyncJobResult'),
-                                                                        data: {
-                                                                            jobid: jobId
-                                                                        },
-                                                                        success: function(json) {
-                                                                            var result = json.queryasyncjobresultresponse;
-                                                                            if (result.jobstatus == 0) {
-                                                                                return; //Job has not completed
-                                                                            } else {
-                                                                                clearInterval(createLBHealthCheckPolicyIntervalId);
-
-                                                                                if (result.jobstatus == 1) {
-                                                                                    cloudStack.dialog.notice({
-                                                                                        message: _l('Health Check Policy has been updated')
-                                                                                    });
-                                                                                    $loadingOnDialog.remove();
-                                                                                    $healthCheckDialog.dialog('destroy');
-                                                                                    $('.overlay').remove();
-                                                                                } else if (result.jobstatus == 2) {
-                                                                                    cloudStack.dialog.notice({
-                                                                                        message: _s(result.jobresult.errortext)
-                                                                                    });
-                                                                                    $loadingOnDialog.remove();
-                                                                                    $healthCheckDialog.dialog('destroy');
-                                                                                    $('.overlay').remove();
-                                                                                }
-                                                                            }
-                                                                        }
-                                                                    });
-                                                                }, g_queryAsyncJobResultInterval);
-                                                            }
-                                                        });
-                                                    } else if (result.jobstatus == 2) {
-                                                        cloudStack.dialog.notice({
-                                                            message: _s(result.jobresult.errortext)
-                                                        });
-                                                        $loadingOnDialog.remove();
-                                                        $healthCheckDialog.dialog('destroy');
-                                                        $('.overlay').remove();
-                                                    }
-                                                }
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        }
-                    }
-                    //Update Button (end)
-                    ,
-                    //Delete Button (begin) - call delete API
-                    {
-                        text: _l('Delete'),
-                        'class': 'delete',
-                        click: function() {
-                            $loadingOnDialog.appendTo($healthCheckDialog);
-
-                            $.ajax({
-                                url: createURL('deleteLBHealthCheckPolicy'),
-                                data: {
-                                    id: policyObj.id
-                                },
-                                success: function(json) {
-                                    var jobId = json.deletelbhealthcheckpolicyresponse.jobid;
-                                    var deleteLBHealthCheckPolicyIntervalId = setInterval(function() {
-                                        $.ajax({
-                                            url: createURL('queryAsyncJobResult'),
-                                            data: {
-                                                jobid: jobId
-                                            },
-                                            success: function(json) {
-                                                var result = json.queryasyncjobresultresponse;
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                    clearInterval(deleteLBHealthCheckPolicyIntervalId);
-
-                                                    if (result.jobstatus == 1) {
-                                                        cloudStack.dialog.notice({
-                                                            message: _l('Health Check Policy has been deleted')
-                                                        });
-                                                        $loadingOnDialog.remove();
-                                                        $healthCheckDialog.dialog('destroy');
-                                                        $('.overlay').remove();
-                                                    } else if (result.jobstatus == 2) {
-                                                        cloudStack.dialog.notice({
-                                                            message: _s(result.jobresult.errortext)
-                                                        });
-                                                        $loadingOnDialog.remove();
-                                                        $healthCheckDialog.dialog('destroy');
-                                                        $('.overlay').remove();
-                                                    }
-                                                }
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        }
-                    }
-                    //Delete Button (end)
-                );
-            }
-
-            $healthCheckDialog.dialog({
-                title: _l('label.health.check.wizard'),
-                width: 630,
-                height: 600,
-                draggable: true,
-                closeonEscape: false,
-                overflow: 'auto',
-                open: function() {
-                    $("button").each(function() {
-                        $(this).attr("style", "left: 400px; position: relative; margin-right: 5px; ");
-                    });
-
-                    $('.ui-dialog .delete').css('left', '140px');
-
-                },
-                buttons: buttons
-            }).closest('.ui-dialog').overlay();
-
-        }
-    }
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/installWizard.js b/ui/legacy/scripts/ui-custom/installWizard.js
deleted file mode 100644
index f7ed074..0000000
--- a/ui/legacy/scripts/ui-custom/installWizard.js
+++ /dev/null
@@ -1,928 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    var installWizard = function(args) {
-        var context = args.context;
-        var $installWizard = $('<div>').addClass('install-wizard');
-        var $container = args.$container;
-        var state = {}; // Hold wizard form state
-        var launchStart; // Holds last launch callback, in case of error
-        var $launchState;
-
-        /**
-         * Successful installation action
-         */
-        var complete = function() {
-            $installWizard.remove();
-            $('html body').removeClass('install-wizard');
-
-            args.complete();
-        };
-
-        /**
-         * Retrive copy text and append to element -- async
-         * @param id
-         * @param $elem
-         */
-        var getCopy = function(id, $elem) {
-            cloudStack.installWizard.copy[id]({
-                response: {
-                    success: function(args) {
-                        $elem.append(_l(args.text));
-                    }
-                }
-            });
-
-            return $elem;
-        };
-
-        /**
-         * Go to specified step in flow -- for use in individual steps
-         * @param stateStepID ID to group state elements in (i.e., zone, pod, cluster, ...)
-         * @param $elem (optional) Element containing <form>, to serialize for state
-         */
-        var goTo = cloudStack._goto = function(stepID, stateID, $elem, options) {
-            if (!options) options = {};
-
-            var $body = $installWizard.find('.body');
-
-            if (stateID && $elem) {
-                state[stateID] = cloudStack.serializeForm($elem.is('form') ? $elem : $elem.find('form'));
-            }
-
-            $body.children().fadeOut('fast', function() {
-                var $nextStep = steps[stepID]({
-                    nextStep: options.nextStep
-                });
-
-                $body.children().detach();
-                $nextStep.appendTo($body).hide();
-                $nextStep.addClass('step').fadeIn();
-            });
-        };
-
-        /**
-         * Generic page elements
-         */
-        var elems = {
-            /**
-             * A standard intro text wizard step template
-             */
-            stepIntro: function(args) {
-                var title = args.title;
-                var subtitle = args.subtitle;
-                var copyID = args.copyID;
-                var prevStepID = args.prevStepID;
-                var nextStepID = args.nextStepID;
-                var diagram = args.diagram;
-
-                var $intro = $('<div></div>').addClass('intro');
-                var $title = $('<div></div>').addClass('title')
-                    .html(title);
-                var $subtitle = $('<div></div>').addClass('subtitle')
-                    .html(subtitle);
-                var $copy = getCopy(copyID, $('<p></p>'));
-                var $prev = elems.prevButton(_l('label.back'));
-                var $continue = elems.nextButton('OK');
-
-                $continue.click(function() {
-                    goTo(nextStepID);
-
-                    return false;
-                });
-
-                $prev.click(function() {
-                    goTo(prevStepID);
-                });
-
-                return function(args) {
-                    showDiagram(diagram);
-
-                    return $intro.append(
-                        $title, $subtitle,
-                        $copy,
-                        $prev,
-                        $continue
-                    );
-                };
-            },
-
-            /**
-             * A standard form-based wizard step template
-             * -- relies on createForm for form generation
-             */
-            step: function(args) {
-                var title = args.title;
-                var formData = args.form;
-                var diagram = args.diagram;
-                var id = args.id;
-                var stateID = args.stateID;
-                var tooltipID = args.tooltipID;
-                var prevStepID = args.prevStepID;
-                var nextStepID = args.nextStepID;
-                var form;
-
-                var $container = $('<div></div>').addClass(id);
-                var $form = $('<div>').addClass('setup-form');
-                var $save = elems.nextButton(_l('label.continue'), {
-                    type: 'submit'
-                });
-                var $prev = elems.prevButton(_l('label.back'));
-                var $title = $('<div></div>').addClass('title').html(_l(title));
-
-                // Generate form
-                form = cloudStack.dialog.createForm({
-                    noDialog: true,
-                    form: {
-                        title: title,
-                        desc: '',
-                        fields: formData
-                    },
-                    after: function(args) {
-                        goTo(nextStepID, stateID, $form);
-                    }
-                });
-
-                $form.append(form.$formContainer);
-                $form.find('.form-item').addClass('field');
-                $prev.appendTo($form.find('form'));
-                $save.appendTo($form.find('form'));
-
-                // Submit handler
-                $form.find('form').submit(function() {
-                    form.completeAction($form);
-
-                    return false;
-                });
-
-                // Go back handler
-                $prev.click(function(event) {
-                    goTo(prevStepID);
-                });
-
-                // Cleanup
-                $form.find('.message').remove();
-                $form.find('label.error').hide();
-                $container.append($form.prepend($title));
-
-                showTooltip($form, tooltipID);
-
-                return function(args) {
-                    var overrideGotoEvent = function(event) {
-                        goTo(args.nextStep, stateID, $form);
-
-                        return false;
-                    };
-
-                    if (args && args.nextStep) {
-                        $save.unbind('click');
-                        $save.click(overrideGotoEvent);
-                    }
-
-                    // Setup diagram, tooltips
-                    showDiagram(diagram);
-                    setTimeout(function() {
-                        $form.find('input[type=text]:first').focus();
-                    }, 600);
-
-                    return $container;
-                };
-            },
-
-            /**
-             * A form item tooltip
-             */
-            tooltip: function(title, content) {
-                return $('<div>').addClass('tooltip-info').append(
-                    $('<div>').addClass('arrow'),
-                    $('<div>').addClass('title').html(_l(title)),
-                    $('<div>').addClass('content').append($('<p>').html(_l(content)))
-                );
-            },
-
-            /**
-             * The main header
-             */
-            header: function() {
-                return $('<div></div>').addClass('header')
-                    .append(
-                        $.merge(
-                            $('<h2></h2>').html(_l('label.installWizard.title')),
-                            $('<h3></h3>').html(_l('label.installWizard.subtitle'))
-                        )
-                );
-            },
-
-            /**
-             * The wizard body (contains form)
-             */
-            body: function() {
-                return $('<div></div>').addClass('body');
-            },
-
-            /**
-             * A standard next button
-             */
-            nextButton: function(label, options) {
-                var $button = options && !options.type ?
-                    $('<div>').addClass('button goTo').html(label) :
-                    $('<input>').attr({
-                        type: 'submit'
-                    }).addClass('button goTo').val(label);
-
-                return $button;
-            },
-
-            /**
-             * A standard previous/go back button
-             */
-            prevButton: function(label) {
-                return $('<div>').addClass('button go-back').html(label);
-            },
-
-            diagramParts: function() {
-                return $('<div>').addClass('diagram').append(
-                    $('<div>').addClass('part zone'),
-                    $('<div>').addClass('part pod'),
-                    $('<div>').addClass('part cluster'),
-                    $('<div>').addClass('part host'),
-                    $('<div>').addClass('part primaryStorage'),
-                    $('<div>').addClass('part secondaryStorage'),
-                    $('<div>').addClass('part loading').append($('<div>').addClass('icon'))
-                );
-            }
-        };
-
-        var $diagramParts = elems.diagramParts();
-
-        var showDiagram = function(parts) {
-            $diagramParts.children().hide();
-            $diagramParts.find(parts).show();
-        };
-
-        /**
-         * Show tooltip for focused form elements
-         */
-        var showTooltip = function($formContainer, sectionID) {
-            var $tooltip = elems.tooltip(_l('label.hints'), '');
-
-            $formContainer.find('input[type=text]').focus(function() {
-                var $input = $(this);
-
-                $tooltip.find('p').html('');
-                $tooltip.appendTo($formContainer);
-                $tooltip.css({
-                    top: $(this).position().top - 20
-                });
-
-                var content = getCopy(
-                    'tooltip.' + sectionID + '.' + $input.attr('name'),
-                    $tooltip.find('p')
-                );
-            });
-
-            $formContainer.find('input').blur(function() {
-                $tooltip.remove();
-            });
-        };
-
-        /**
-         * Layout/behavior for each step in wizard
-         */
-        var steps = {
-            start: function(args) {
-                if (cloudStack.preInstall) {
-                    return cloudStack.preInstall({
-                        complete: function() {
-                            goTo('intro');
-                        }
-                    });
-                }
-
-                return steps.intro(args);
-            },
-            intro: function(args) {
-                var $intro = $('<div></div>').addClass('intro what-is-cloudstack');
-                var $title = $('<div></div>').addClass('title').html(_l('label.what.is.cloudstack'));
-                var $subtitle = $('<div></div>').addClass('subtitle').html(_l('label.introduction.to.cloudstack'));
-                var $copy = getCopy('whatIsCloudStack', $('<p></p>'));
-                var $continue = elems.nextButton(_l('label.continue.basic.install'));
-                var $advanced = elems.nextButton(_l('label.skip.guide')).addClass('advanced-installation');
-
-                $continue.click(function() {
-                    goTo('changeUser');
-
-                    return false;
-                });
-
-                $advanced.click(function() {
-                    complete();
-
-                    return false;
-                });
-
-                return $intro.append($title, $subtitle,
-                    $copy,
-                    $advanced,
-                    $continue);
-            },
-
-            changeUser: function(args) {
-                var $changeUser = $('<div></div>').addClass('step change-user');
-                var $form = $('<form></form>').appendTo($changeUser);
-
-                // Fields
-                var $password = $('<input>').addClass('required').attr({
-                    id: 'password',
-                    type: 'password',
-                    name: 'password'
-                });
-                var $passwordConfirm = $('<input>').addClass('required').attr({
-                    id: 'password-confirm',
-                    type: 'password',
-                    name: 'password-confirm'
-                });
-                var $save = elems.nextButton(_l('label.save.and.continue'), {
-                    type: 'submit'
-                });
-
-                $form.append(
-                    $('<div></div>').addClass('title').html(_l('message.change.password')),
-                    $('<div></div>').addClass('field').append(
-                        $('<label>' + _l('label.new.password') + ':</label>'), $password
-                    ),
-                    $('<div></div>').addClass('field').append(
-                        $('<label>' + _l('label.confirm.password') + ':</label>'), $passwordConfirm
-                    ),
-                    $save
-                );
-
-                $form.validate({
-                    rules: {
-                        'password-confirm': {
-                            equalTo: '#password'
-                        }
-                    },
-                    messages: {
-                        'password-confirm': {
-                            equalTo: _l('error.password.not.match')
-                        }
-                    }
-                });
-
-                // Save event
-                $form.submit(function() {
-                    if (!$form.valid()) return false;
-
-                    var $loading = $('<div></div>').addClass('loading-overlay').prependTo($form);
-                    cloudStack.installWizard.changeUser({
-                        data: cloudStack.serializeForm($form),
-                        response: {
-                            success: function(args) {
-                                goTo('addZoneIntro', 'newUser', $form);
-                            }
-                        }
-                    });
-
-                    return false;
-                });
-
-                showDiagram('');
-
-                return $changeUser;
-            },
-
-            /**
-             * Add zone intro text
-             * @param args
-             */
-            addZoneIntro: elems.stepIntro({
-                title: _l('label.installWizard.addZoneIntro.title'),
-                subtitle: _l('label.installWizard.addZoneIntro.subtitle'),
-                copyID: 'whatIsAZone',
-                prevStepID: 'changeUser',
-                nextStepID: 'addZone',
-                diagram: '.part.zone'
-            }),
-
-            /**
-             * Add zone form
-             */
-            addZone: elems.step({
-                title: _l('label.installWizard.addZone.title'),
-                id: 'add-zone',
-                stateID: 'zone',
-                tooltipID: 'addZone',
-                diagram: '.part.zone',
-                prevStepID: 'addZoneIntro',
-                nextStepID: 'addPodIntro',
-                form: {
-                    name: {
-                        label: 'label.name',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    ip4dns1: {
-                        label: 'label.dns.1',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    ip4dns2: {
-                        label: 'label.dns.2'
-                    },
-                    internaldns1: {
-                        label: 'label.internal.dns.1',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    internaldns2: {
-                        label: 'label.internal.dns.2'
-                    }
-                }
-            }),
-
-            /**
-             * Add pod intro text
-             * @param args
-             */
-            addPodIntro: elems.stepIntro({
-                title: _l('label.installWizard.addPodIntro.title'),
-                subtitle: _l('label.installWizard.addPodIntro.subtitle'),
-                copyID: 'whatIsAPod',
-                prevStepID: 'addZone',
-                nextStepID: 'addPod',
-                diagram: '.part.zone, .part.pod'
-            }),
-
-            /**
-             * Add pod form
-             * @param args
-             */
-            addPod: elems.step({
-                title: _l('label.add.pod'),
-                id: 'add-pod',
-                stateID: 'pod',
-                tooltipID: 'addPod',
-                diagram: '.part.zone, .part.pod',
-                prevStepID: 'addPodIntro',
-                nextStepID: 'configureGuestTraffic',
-                form: {
-                    name: {
-                        label: 'label.name',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    reservedSystemGateway: {
-                        label: 'label.gateway',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    reservedSystemNetmask: {
-                        label: 'label.netmask',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    ipRange: {
-                        label: 'label.ip.range',
-                        range: ['reservedSystemStartIp', 'reservedSystemEndIp'],
-                        validation: {
-                            required: true
-                        }
-                    }
-                }
-            }),
-
-            /**
-             * Add guest network form
-             */
-            configureGuestTraffic: elems.step({
-                title: _l('label.add.guest.network'),
-                id: 'add-guest-network',
-                stateID: 'guestTraffic',
-                tooltipID: 'configureGuestTraffic',
-                diagram: '.part.zone, .part.pod',
-                prevStepID: 'addPod',
-                nextStepID: 'addClusterIntro',
-                form: {
-                    guestGateway: {
-                        label: 'label.gateway',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    guestNetmask: {
-                        label: 'label.netmask',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    guestIPRange: {
-                        label: 'label.ip.range',
-                        range: ['guestStartIp', 'guestEndIp'],
-                        validation: {
-                            required: true
-                        }
-                    }
-                }
-            }),
-
-            /**
-             * Add cluster intro text
-             * @param args
-             */
-            addClusterIntro: elems.stepIntro({
-                title: _l('label.installWizard.addClusterIntro.title'),
-                subtitle: _l('label.installWizard.addClusterIntro.subtitle'),
-                copyID: 'whatIsACluster',
-                prevStepID: 'configureGuestTraffic',
-                nextStepID: 'addCluster',
-                diagram: '.part.zone, .part.cluster'
-            }),
-
-            /**
-             * Add cluster form
-             * @param args
-             */
-            addCluster: elems.step({
-                title: _l('label.add.cluster'),
-                id: 'add-cluster',
-                stateID: 'cluster',
-                tooltipID: 'addCluster',
-                prevStepID: 'addClusterIntro',
-                nextStepID: 'addHostIntro',
-                diagram: '.part.zone, .part.cluster',
-                form: {
-                    hypervisor: {
-                        label: 'label.hypervisor',
-                        select: function(args) {
-                            args.response.success({
-                                data: [{
-                                    id: 'XenServer',
-                                    description: 'XenServer'
-                                }, {
-                                    id: 'KVM',
-                                    description: 'KVM'
-                                }]
-                            });
-                        }
-                    },
-                    name: {
-                        label: 'label.name',
-                        validation: {
-                            required: true
-                        }
-                    }
-                }
-            }),
-
-            /**
-             * Add host intro text
-             * @param args
-             */
-            addHostIntro: elems.stepIntro({
-                title: _l('label.installWizard.addHostIntro.title'),
-                subtitle: _l('label.installWizard.addHostIntro.subtitle'),
-                copyID: 'whatIsAHost',
-                prevStepID: 'addCluster',
-                nextStepID: 'addHost',
-                diagram: '.part.zone, .part.host'
-            }),
-
-            /**
-             * Add host form
-             * @param args
-             */
-            addHost: elems.step({
-                title: _l('label.add.host'),
-                id: 'add-host',
-                stateID: 'host',
-                tooltipID: 'addHost',
-                prevStepID: 'addHostIntro',
-                nextStepID: 'addPrimaryStorageIntro',
-                diagram: '.part.zone, .part.host',
-                form: {
-                    hostname: {
-                        label: 'label.host.name',
-                        validation: {
-                            required: true
-                        }
-                    },
-
-                    username: {
-                        label: 'label.username',
-                        validation: {
-                            required: true
-                        }
-                    },
-
-                    password: {
-                        label: 'label.password',
-                        validation: {
-                            required: true
-                        },
-                        isPassword: true
-                    }
-                }
-            }),
-
-            /**
-             * Add primary storage intro text
-             * @param args
-             */
-            addPrimaryStorageIntro: elems.stepIntro({
-                title: _l('label.installWizard.addPrimaryStorageIntro.title'),
-                subtitle: _l('label.installWizard.addPrimaryStorageIntro.subtitle'),
-                copyID: 'whatIsPrimaryStorage',
-                prevStepID: 'addHost',
-                nextStepID: 'addPrimaryStorage',
-                diagram: '.part.zone, .part.primaryStorage'
-            }),
-
-            /**
-             * Add primary storage
-             * @param args
-             */
-            addPrimaryStorage: elems.step({
-                title: _l('label.add.primary.storage'),
-                id: 'add-primary-storage',
-                stateID: 'primaryStorage',
-                tooltipID: 'addPrimaryStorage',
-                prevStepID: 'addPrimaryStorageIntro',
-                nextStepID: 'addSecondaryStorageIntro',
-                diagram: '.part.zone, .part.primaryStorage',
-                form: {
-                    name: {
-                        label: 'label.name',
-                        validation: {
-                            required: true
-                        }
-                    },
-
-                    protocol: {
-                        label: 'label.protocol',
-                        select: function(args) {
-                            args.response.success({
-                                data: {
-                                    id: 'nfs',
-                                    description: 'NFS'
-                                }
-                            });
-                        }
-                    },
-
-                    scope: {
-                        label: 'label.scope',
-                        select: function(args) {
-                            var scopeData = [];
-                            //intelligence to handle different hypervisors to be added here
-                            /*  if( selectedHypervisor == 'XenServer'){
-                       scopeData.push({ id: 'cluster', description: _l('label.cluster') });
-               }*/
-                            // else if (selectedHypervisor == 'KVM'){
-                            scopeData.push({
-                                id: 'cluster',
-                                description: _l('label.cluster')
-                            });
-                            scopeData.push({
-                                id: 'zone',
-                                description: _l('label.zone.wide')
-                            });
-
-                            args.response.success({
-
-                                data: scopeData
-                            });
-                        }
-                    },
-
-                    server: {
-                        label: 'label.server',
-                        validation: {
-                            required: true
-                        }
-                    },
-
-                    path: {
-                        label: 'label.path',
-                        validation: {
-                            required: true
-                        }
-                    }
-                }
-            }),
-
-            /**
-             * Add secondary storage intro text
-             * @param args
-             */
-            addSecondaryStorageIntro: elems.stepIntro({
-                title: _l('label.installWizard.addSecondaryStorageIntro.title'),
-                subtitle: _l('label.installWizard.addSecondaryStorageIntro.subtitle'),
-                copyID: 'whatIsSecondaryStorage',
-                prevStepID: 'addPrimaryStorage',
-                nextStepID: 'addSecondaryStorage',
-                diagram: '.part.zone, .part.secondaryStorage'
-            }),
-
-            /**
-             * Add secondary storage
-             * @param args
-             */
-            addSecondaryStorage: elems.step({
-                title: _l('label.add.secondary.storage'),
-                id: 'add-secondary-storage',
-                stateID: 'secondaryStorage',
-                tooltipID: 'addSecondaryStorage',
-                prevStepID: 'addSecondaryStorageIntro',
-                nextStepID: 'launchInfo',
-                diagram: '.part.zone, .part.secondaryStorage',
-                form: {
-                    nfsServer: {
-                        label: 'label.nfs.server',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    provider: {
-                        label: 'label.provider',
-                        select: function(args) {
-                            args.response.success({
-                                data: [
-                                    { id: 'NFS', description: 'NFS' }
-                                ]
-                            });
-                        }
-                    },
-                    path: {
-                        label: 'label.path',
-                        validation: {
-                            required: true
-                        }
-                    }
-                }
-            }),
-
-            /**
-             * Pre-launch text
-             */
-            launchInfo: function(args) {
-                var $intro = $('<div></div>').addClass('intro');
-                var $title = $('<div></div>').addClass('title')
-                    .html(_l('label.congratulations'));
-                var $subtitle = $('<div></div>').addClass('subtitle')
-                    .html(_l('label.installWizard.click.launch'));
-                var $continue = elems.nextButton(_l('label.launch'));
-                var $prev = elems.prevButton(_l('label.back'));
-
-                $continue.click(function() {
-                    goTo('launch');
-
-                    return false;
-                });
-
-                $prev.click(function() {
-                    goTo('addSecondaryStorage');
-                });
-
-                showDiagram('.part.zone, .part.secondaryStorage');
-
-                return $intro.append(
-                    $title, $subtitle,
-                    $prev, $continue
-                );
-            },
-
-            /**
-             * Pre-launch test -- after error correction
-             */
-            launchInfoError: function(args) {
-                var $intro = $('<div></div>').addClass('intro');
-                var $title = $('<div></div>').addClass('title')
-                    .html(_l('label.corrections.saved'));
-                var $subtitle = $('<div></div>').addClass('subtitle')
-                    .html(_l('message.installWizard.click.retry'));
-                var $continue = elems.nextButton(_l('label.launch'));
-
-                $continue.click(function() {
-                    goTo('launch');
-
-                    return false;
-                });
-
-                showDiagram('.part.zone, .part.secondaryStorage');
-
-                return $intro.append(
-                    $title, $subtitle,
-                    $continue
-                );
-            },
-
-            /**
-             * Initiates launch tasks
-             */
-            launch: function(args) {
-                var $intro = $('<div>').addClass('intro');
-                var $title = $('<div>').addClass('title')
-                    .html(_l('message.installWizard.now.building'));
-                var $subtitle = $('<div></div>').addClass('subtitle');
-
-                showDiagram('.part.loading');
-                $intro.append(
-                    $title, $subtitle
-                );
-
-                cloudStack.installWizard.action({
-                    data: state,
-                    startFn: launchStart,
-                    response: {
-                        message: function(msg) {
-                            var $li = $('<li>').html(_l(msg));
-
-                            $subtitle.append($li);
-                            $li.siblings().addClass('complete');
-                        },
-                        success: function() {
-                            goTo('complete');
-                        },
-                        error: function(stepID, message, callback) {
-                            launchStart = callback;
-                            $subtitle.find('li:last').addClass('error');
-
-                            $subtitle.append(
-                                $('<p>').html(
-                                    _l('error.installWizard.message') + ':<br/>' + message
-                                ),
-                                $('<div>').addClass('button').append(
-                                    $('<span>').html(_l('label.back'))
-                                ).click(function() {
-                                    goTo(stepID, null, null, {
-                                        nextStep: 'launchInfoError'
-                                    });
-                                })
-                            );
-                        }
-                    }
-                });
-
-                return $intro;
-            },
-
-            complete: function(args) {
-                var $intro = $('<div></div>').addClass('intro');
-                var $title = $('<div></div>').addClass('title')
-                    .html(_l('message.setup.successful'));
-                var $subtitle = $('<div></div>').addClass('subtitle')
-                    .html(_l('label.may.continue'));
-                var $continue = elems.nextButton(_l('label.launch'));
-
-                showDiagram('');
-
-                $continue.click(function() {
-                    $installWizard.fadeOut(function() {
-                        complete();
-                    });
-                });
-
-                return $intro.append(
-                    $title, $subtitle, $continue
-                );
-            }
-        };
-
-        var initialStep = steps.start().addClass('step');
-
-
-        showDiagram('');
-        $('html body').addClass('install-wizard');
-
-        $installWizard.append(
-            elems.header(),
-            elems.body().append(initialStep),
-            $diagramParts
-        ).appendTo($container);
-
-
-    };
-
-    cloudStack.uiCustom.installWizard = installWizard;
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/instanceWizard.js b/ui/legacy/scripts/ui-custom/instanceWizard.js
deleted file mode 100644
index 2004257..0000000
--- a/ui/legacy/scripts/ui-custom/instanceWizard.js
+++ /dev/null
@@ -1,1768 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    /**
-     * Instance wizard
-     */
-    cloudStack.uiCustom.instanceWizard = function(args) {
-        return function(listViewArgs) {
-            var context = listViewArgs.context;
-
-            var instanceWizard = function(data) {
-                var $wizard = $('#template').find('div.instance-wizard').clone();
-                var $progress = $wizard.find('div.progress ul li');
-                var $steps = $wizard.find('div.steps').children().hide();
-                var $diagramParts = $wizard.find('div.diagram').children().hide();
-                var $form = $wizard.find('form');
-
-                $form.validate();
-
-                // Close instance wizard
-                var close = function() {
-                    $wizard.dialog('destroy');
-                    $('div.overlay').fadeOut(function() {
-                        $('div.overlay').remove();
-                    });
-                };
-
-                // Save instance and close wizard
-                var completeAction = function() {
-                    var data = cloudStack.serializeForm($form);
-                    var $wizardLoading = $('<div>').addClass('loading-overlay').appendTo($wizard).css('z-index', '10000');
-
-                    // Pass network IPs
-                    data['my-network-ips'] = [];
-                    $form.find('.my-networks .select .specify-ip input[type=text]').each(function() {
-                        var $input = $(this);
-
-                        if (!$input.closest('.select').find('input[type=checkbox]').is(':checked')) return true;
-
-                        data['my-network-ips'].push(
-                            $input.closest('.select').hasClass('advanced') ?
-                                $input.val() : null
-                        );
-                    });
-                    data['new-network-ip'] = $form.find('.new-network .select.advanced .specify-ip input[type=text]').val();
-
-                    // Handle multi-disk service offerings
-                    if ($form.find('.multi-disk-select-container').length) {
-                        data['disk-offerings-multi'] = [];
-
-                        var $diskGroups = $form.find('.disk-select-group');
-                        var $selectedDisks = $.grep($diskGroups, function (diskGroup) {
-                            return $(diskGroup).find('input[type=checkbox]:checked').length;
-                        });
-
-                        $selectedDisks.map(function (disk) {
-                            data['disk-offerings-multi'].push(
-                                $.extend($(disk).data('json-obj'), {
-                                    _diskOfferingId: $(disk).find('input[type=radio]:checked').val()
-                                })
-                            );
-                        });
-                    }
-
-                    args.action({
-                        // Populate data
-                        context: context,
-                        data: data,
-                        $wizard: $wizard,
-                        response: {
-                            success: function(args) {
-                                var $listView = $('.list-view.instances');
-
-                                if ($listView.length) {
-                                    var $loading = $('.list-view.instances').listView('prependItem', {
-                                        data: [{
-                                            name: data.displayname ? data.displayname : _l('label.new.vm'),
-                                            zonename: $wizard.find('select[name=zoneid] option').filter(function() {
-                                                return $(this).val() == data.zoneid;
-                                            }).html(),
-                                            state: 'Creating'
-                                        }],
-                                        actionFilter: function(args) {
-                                            return [];
-                                        }
-                                    });
-                                }
-
-                                listViewArgs.complete({
-                                    _custom: args._custom,
-                                    messageArgs: cloudStack.serializeForm($form),
-                                    $item: $listView.length ? $loading : $('<div>')
-                                });
-
-                                close();
-                            },
-                            error: function(message) {
-                                $wizard.remove();
-                                $('div.overlay').remove();
-
-                                if (message) {
-                                    cloudStack.dialog.notice({
-                                        message: message
-                                    });
-                                }
-                            }
-                        }
-                    });
-                };
-
-                var makeSelectsOvfProperties = function (data, fields) {
-                    var $selects = $('<div>');
-
-                    $(data).each(function() {
-                        var item = this;
-                        var key = item[fields.key];
-                        var type = item[fields.type];
-                        var value = item[fields.value];
-                        var qualifiers = item[fields.qualifiers];
-                        var label = item[fields.label];
-                        var description = item[fields.description];
-                        var password = item[fields.password];
-
-                        var propertyField;
-
-                        var fieldType = password ? "password" : "text";
-                        if (type && type.toUpperCase() == "BOOLEAN") {
-                            propertyField = $('<select id=ovf-property-' + key + '>')
-                                .append($('<option>').attr({value: "True"}).html("True"))
-                                .append($('<option>').attr({value: "False"}).html("False"));
-                        } else if (type && (type.includes("int") || type.includes("real"))) {
-                            if (qualifiers && qualifiers.includes("MinValue") && qualifiers.includes("MaxValue")) {
-                                var split = qualifiers.split(",");
-                                var minValue = split[0].replace("MinValue(","").slice(0, -1);
-                                var maxValue = split[1].replace("MaxValue(","").slice(0, -1);
-                                fieldType = "number";
-                                propertyField = $('<input id=ovf-property-'+key+'>')
-                                    .attr({type: fieldType, min: minValue, max:maxValue})
-                                    .addClass('name').val(_s(this[fields.value]));
-                            } else {
-                                propertyField = $('<input id=ovf-property-'+key+'>')
-                                    .attr({type: fieldType})
-                                    .addClass('name').val(_s(this[fields.value]))
-                            }
-                        } else if (type && type.toUpperCase() == "STRING") {
-                            if (qualifiers) {
-                                propertyField = $('<select id=ovf-property-'+key+'>')
-                                if (qualifiers.startsWith("ValueMap")) {
-                                    var possibleValues = qualifiers.replace("ValueMap","").substr(1).slice(0, -1).split(",");
-                                    $(possibleValues).each(function() {
-                                        var qualifier = this.substr(1).slice(0, -1); //remove first and last quotes
-                                        var option = $('<option>')
-                                            .attr({
-                                                value: qualifier,
-                                                type: fieldType
-                                            })
-                                            .html(qualifier)
-                                        propertyField.append(option);
-                                    });
-                                } else if (qualifiers.includes("MinLen") || qualifiers.includes("MaxLen") ) {
-                                    var split = qualifiers.split(",");
-                                    var minLen = 0;
-                                    var maxLen = 524288; /* 524288 being the default according to w3schools */
-                                    for ( var i = 0; i < split.length; i++ ) {
-                                        if (split[i].startsWith("MaxLen")) {
-                                            maxLen = split[i].replace("MaxLen(","").replace(")","");
-                                        } else if (split[i].startsWith("MinLen")) {
-                                            minLen = split[i].replace("MinLen(","").replace(")","");
-                                        }
-                                    }
-                                    propertyField = $('<input id=ovf-property-'+key+'>')
-                                        .attr({pattern : '.{' + minLen + ',' + maxLen + '}'})
-                                        .attr({type: fieldType})
-                                        .addClass('name').val(_s(this[fields.value]))
-                                }
-                            } else {
-                                propertyField = $('<input id=ovf-property-'+key+'>')
-                                    .attr({type: fieldType})
-                                    .addClass('name').val(_s(this[fields.value]))
-                            }
-                        } else {
-                            propertyField = $('<input id=ovf-property-'+key+'>')
-                                .attr({type: fieldType})
-                                .addClass('name').val(_s(this[fields.value]))
-                        }
-
-                        var $select = $('<div>')
-                            .addClass('select')
-                            .append(
-                                $('<div>')
-                                    .addClass('select-desc')
-                                    .addClass('ovf-property')
-                                    .append($('<div>').addClass('name').html(_s(this[fields.label])))
-                                    .append(propertyField)
-                                    .append($('<div>').addClass('desc').html(_s(this[fields.description])))
-                                    .data('json-obj', this)
-                            );
-                        $selects.append($select);
-                    });
-
-                    cloudStack.evenOdd($selects, 'div.select', {
-                        even: function($elem) {
-                            $elem.addClass('even');
-                        },
-                        odd: function($elem) {
-                            $elem.addClass('odd');
-                        }
-                    });
-
-                    return $selects.children();
-                };
-
-                var makeSelects = function(name, data, fields, options, selectedObj, selectedObjNonEditable) {
-                    var $selects = $('<div>');
-                    options = options ? options : {};
-
-                    $(data).each(function() {
-                        var item = this;
-                        var id = item[fields.id];
-
-                        var $select = $('<div>')
-                            .addClass('select')
-                            .append(
-                                $('<input>')
-                                .attr({
-                                    type: (function(type) {
-                                        return type ? type : 'radio';
-                                    })(options ? options.type : null),
-                                    name: name,
-                                    'wizard-field': options['wizard-field']
-                                })
-                                .val(id)
-                                .click(function() {
-                                    var $select = $(this).closest('.select');
-                                    var isSingleSelect = $select.hasClass('single-select');
-                                    var $radio = $select.find('input[type=radio]');
-                                    var $newNetwork = $(this).closest('.content').find('.select.new-network');
-                                    var $otherSelects = $select.siblings().filter(':visible');
-                                    var isCheckbox = $(this).attr('type') == 'checkbox';
-
-                                    if (isCheckbox) {
-                                        if (isSingleSelect) {
-                                            $select.siblings('.single-select:visible').find('input[type=checkbox]')
-                                                .attr('checked', false);
-
-                                            var $checkedOtherSelect = $otherSelects.filter(function() {
-                                                return $(this).not('.single-select') &&
-                                                    $(this).find('input[type=checkbox]:checked').length &&
-                                                    $(this).find('input[type=radio]:checked').length;
-                                            });
-
-                                            if (!$checkedOtherSelect.length &&
-                                                !$('.new-network:visible input[type=radio]:checked').length) {
-                                                $(this).closest('.select').find('input[type=radio]').click();
-                                            }
-                                        }
-
-                                        if ((!$otherSelects.length) &&
-                                            $newNetwork.find('input[type=checkbox]').is(':unchecked')) {
-                                            // Set as default
-                                            $(this).closest('.select').find('input[type=radio]').click();
-                                        }
-                                    }
-
-                                    if ($radio.is(':checked') && !$(this).is(':checked')) {
-                                        if (!$radio.closest('.select').index()) {
-                                            return false;
-                                        } else {
-                                            $otherSelects.filter(':first')
-                                                .find('input[type=radio]').click();
-                                        }
-                                    }
-
-                                    return true;
-                                })
-                        )
-                            .append(
-                                $('<div>').addClass('select-desc')
-                                .append($('<div>').addClass('name').html(_s(this[fields.name])))
-                                .append($('<div>').addClass('desc').html(_s(this[fields.desc])))
-                        )
-                            .data('json-obj', this);
-
-                        if (selectedObj != null && selectedObj.id == item.id) {
-                            $select.find('input[type=checkbox]').attr('checked', 'checked');
-
-                            if (selectedObjNonEditable) {
-                                $select.find('input[type=checkbox]').attr('disabled', 'disabled');
-                                $select.find('input[type=checkbox]').clone().attr({
-                                    type: 'hidden',
-                                    disabled: false
-                                }).appendTo($selects);
-                            }
-                        }
-
-                        $selects.append($select);
-
-                        if (item._singleSelect) {
-                            $select.addClass('single-select');
-                        }
-
-                        if (options.secondary) {
-                            var $secondary = $('<div>').addClass('secondary-input').append(
-                                $('<input>')
-                                .attr({
-                                    type: options.secondary.type,
-                                    name: options.secondary.name,
-                                    'wizard-field': options.secondary['wizard-field']
-                                })
-                                .val(id)
-                                .click(function() {
-                                    var $checkbox = $(this).closest('.select').find('input[type=checkbox]');
-
-                                    if (!$checkbox.is(':checked')) {
-                                        $checkbox.attr('checked', true);
-                                    }
-
-                                    if ($(this).closest('.select-container').hasClass('single-select')) {
-                                        $(this).closest('.select').siblings().find('input[type=checkbox]')
-                                            .attr('checked', false);
-                                    }
-
-                                    if ($select.hasClass('single-select')) {
-                                        $select.siblings('.single-select:visible').find('input[type=checkbox]')
-                                            .attr('checked', false);
-                                    }
-                                })
-                            ).append(
-                                $('<div>').addClass('name').html(options.secondary.desc)
-                            ).appendTo($select);
-                        }
-                    });
-
-                    cloudStack.evenOdd($selects, 'div.select', {
-                        even: function($elem) {
-                            $elem.addClass('even');
-                        },
-                        odd: function($elem) {
-                            $elem.addClass('odd');
-                        }
-                    });
-
-                    return $selects.children();
-                };
-
-                var dataProvider = function(step, providerArgs, callback) {
-                    // Call appropriate data provider
-                    args.steps[step - 1]($.extend(providerArgs, {
-                        currentData: cloudStack.serializeForm($form),
-                        initArgs: args,
-                        context: context
-                    }));
-                };
-
-                var dataGenerators = {
-                    setup: function($step, formData) {
-                        var originalValues = function(formData, initialValue) {
-                            var selectedValue = formData.zoneid || initialValue;
-                            $step.find('select').val(selectedValue);
-
-                            $step.find('input[type=radio]').filter(function() {
-                                return $(this).val() == formData['select-template'];
-                            }).click();
-                        };
-
-                        if (isAdmin()) {
-                            $step.find('.select-deployment .podid').parent().show();
-                            $step.find('.select-deployment .clusterid').parent().show();
-                            $step.find('.select-deployment .hostid').parent().show();
-
-
-                            var updateFieldOptions = function(fieldClass, wizardField) {
-                                return function(data) {
-                                    var fieldSelect = $step.find('.select-deployment .' + fieldClass);
-                                    fieldSelect.find('option').remove().end();
-                                    $(data).each(function() {
-                                        fieldSelect.append(
-                                            $('<option>')
-                                            .attr({
-                                                value: this.id,
-                                                'wizard-field': wizardField,
-                                                'parentId': this.parentId
-                                            })
-                                            .html(this.description)
-                                            .data('json-obj', this)
-                                        );
-                                    });
-                                }
-                            };                        
-
-                            var $zoneSelect = $step.find('.select-deployment .zoneid');
-                            $zoneSelect.unbind('change');
-                            $zoneSelect.change(function() {
-                                zoneId = $zoneSelect.val();
-                                if (zoneId != null && isAdmin()) {
-                                    args.fetchPodList(updateFieldOptions('podid', 'pod'), zoneId);
-                                    args.fetchClusterList(updateFieldOptions('clusterid', 'cluster'), -1, zoneId);
-                                    args.fetchHostList(updateFieldOptions('hostid', 'host'), -1,  -1, zoneId);
-                                }
-                            });
-                            
-                            var $podSelect = $step.find('.select-deployment .podid');
-                            $podSelect.unbind('change');
-                            $podSelect.change(function() {
-                                podId = $podSelect.val();
-                                if (podId != null) {
-                                    args.fetchClusterList(updateFieldOptions('clusterid', 'cluster'), podId, -1);
-                                    args.fetchHostList(updateFieldOptions('hostid', 'host'), -1,  podId, -1);
-                                }
-                            });
-
-                            var $clusterSelect = $step.find('.select-deployment .clusterid');
-                            $clusterSelect.unbind('change');
-                            $clusterSelect.change(function() {
-                                clusterId = $clusterSelect.val();
-                                if (clusterId != null) {
-                                    args.fetchHostList(updateFieldOptions('hostid', 'host'), clusterId,  -1, -1);
-                                }
-                            });
-                        } else {
-                            $step.find('.select-deployment .podid').parent().hide();
-                            $step.find('.select-deployment .clusterid').parent().hide();
-                            $step.find('.select-deployment .hostid').parent().hide();
-                        }
-
-                        return {
-                            response: {
-                                success: function(args) {
-                                    // Zones
-                                    var initialValue = '';
-                                    $(args.data.zones).each(function( index ) {
-                                        if(index == 0){
-                                          initialValue = this.id;
-                                        }
-                                        $step.find('.select-deployment .zoneid').append(
-                                            $('<option>')
-                                            .attr({
-                                                value: this.id,
-                                                'wizard-field': 'zone'
-                                            })
-                                            .html(this.name)
-                                            .data('json-obj', this)
-                                        )
-                                    });
-                                    // Pods
-                                    $(args.data.pods).each(function() {
-                                        $step.find('.select-deployment .podid').append(
-                                            $('<option>')
-                                            .attr({
-                                                value: this.id,
-                                                'wizard-field': 'pod',
-                                                'parentId': this.parentId
-                                            })
-                                            .html(this.description)
-                                            .data('json-obj', this)
-                                        )
-                                    });
-                                    // Clusters
-                                    $(args.data.clusters).each(function() {
-                                        $step.find('.select-deployment .clusterid').append(
-                                            $('<option>')
-                                            .attr({
-                                                value: this.id,
-                                                'wizard-field': 'cluster',
-                                                'parentId': this.parentId
-                                            })
-                                            .html(this.description)
-                                            .data('json-obj', this)
-                                        )
-                                    });
-                                    // Hosts
-                                    $(args.data.hosts).each(function() {
-                                        $step.find('.select-deployment .hostid').append(
-                                            $('<option>')
-                                            .attr({
-                                                value: this.id,
-                                                'wizard-field': 'host',
-                                                'parentId': this.parentId
-                                            })
-                                            .html(this.description)
-                                            .data('json-obj', this)
-                                        );
-                                    });
-
-                                    originalValues(formData, initialValue);
-                                }
-                            }
-                        };
-                    },
-
-                    'select-iso': function($step, formData) {
-                        $step.find('.section.custom-size').hide();
-
-                        var originalValues = function(formData) {
-                            var $inputs = $step.find('.wizard-step-conditional:visible')
-                                .find('input[type=radio]');
-                            var $selected = $inputs.filter(function() {
-                                return $(this).val() === formData.templateid;
-                            });
-
-                            if (!$selected.length) {
-                                $inputs.filter(':first').click();
-                            } else {
-                                $selected.click();
-                            }
-                            $step.find('select[name=hypervisorid]:visible').val(
-                                formData.hypervisorid
-                            );
-                        };
-
-                        $step.find('.wizard-step-conditional').hide();
-
-                        return {
-                            response: {
-                                success: function(args) {
-                                    if (formData['select-template']) {
-                                        $step.find('.wizard-step-conditional').filter(function() {
-                                            return $(this).hasClass(formData['select-template']);
-                                        }).show();
-                                    } else {
-                                        $step.find('.select-iso').show();
-                                    }
-                                    var makeIsos = function(type, append) {
-                                        var $selects = makeSelects('templateid', args.data.templates[type], {
-                                            name: 'name',
-                                            desc: 'displaytext',
-                                            id: 'id'
-                                        }, {
-                                            'wizard-field': 'template'
-                                        });
-                                        var $templateHypervisor = $step.find('input[type=hidden][wizard-field=hypervisor]');
-
-                                        // Get hypervisor from template
-                                        if (type == 'featuredtemplates' || type == 'communitytemplates' || type == 'mytemplates' || type == 'sharedtemplates') {
-                                            $selects.each(function() {
-                                                var $select = $(this);
-                                                var template = $.grep(args.data.templates[type], function(tmpl, v) {
-                                                    return tmpl.id == $select.find('input').val();
-                                                })[0];
-
-                                                $select.change(function() {
-                                                    $templateHypervisor
-                                                        .attr('disabled', false)
-                                                        .val(template.hypervisor);
-                                                });
-                                            });
-                                        } else {
-                                            $templateHypervisor.attr('disabled', 'disabled');
-                                        }
-
-                                        if (type == 'featuredisos' || type == 'communityisos' || type == 'myisos' || type == 'sharedisos') {
-                                            // Create hypervisor select
-                                            $selects.find('input').bind('click', function() {
-                                                var $select = $(this).closest('.select');
-
-                                                //$select.siblings().removeClass('selected').find('.hypervisor').remove(); //SelectISO has 3 tabs now. This line only remove hypervisor div in the same tab, not enough. The following 3 lines will remove hypervisor div in all of 3 tabs.
-                                                $("#instance-wizard-featured-isos .select-container div.selected").removeClass('selected').find('div.hypervisor').remove();
-                                                $("#instance-wizard-community-isos .select-container div.selected").removeClass('selected').find('div.hypervisor').remove();
-                                                $("#instance-wizard-my-isos .select-container div.selected").removeClass('selected').find('div.hypervisor').remove();
-                                                $("#instance-wizard-shared-isos .select-container div.selected").removeClass('selected').find('div.hypervisor').remove();
-
-                                                $select.addClass('selected').append(
-                                                    $('<div>').addClass('hypervisor')
-                                                    .append($('<label>').html(_l('label.hypervisor') + ':'))
-                                                    .append($('<select>').attr({
-                                                        name: 'hypervisorid'
-                                                    }))
-                                                );
-
-                                                // Get hypervisor data
-                                                $(args.data.hypervisors).each(function() {
-                                                    $select.find('select').append(
-                                                        $('<option>').attr({
-                                                            value: this[args.hypervisor.idField],
-                                                            'wizard-field': 'hypervisor'
-                                                        })
-                                                        .html(this[args.hypervisor.nameField])
-                                                    );
-                                                });
-                                            });
-                                        }
-
-                                        append($selects);
-                                    };
-
-                                    // Featured ISOs
-                                    $(
-                                        [
-                                            // Templates
-                                            ['featuredtemplates', 'instance-wizard-featured-templates'],
-                                            ['communitytemplates', 'instance-wizard-community-templates'],
-                                            ['mytemplates', 'instance-wizard-my-templates'],
-                                            ['sharedtemplates', 'instance-wizard-shared-templates'],
-
-                                            // ISOs
-                                            ['featuredisos', 'instance-wizard-featured-isos'],
-                                            ['communityisos', 'instance-wizard-community-isos'],
-                                            ['myisos', 'instance-wizard-my-isos'],
-                                            ['sharedisos', 'instance-wizard-shared-isos']
-                                            //['isos', 'instance-wizard-all-isos']
-                                        ]
-                                    ).each(function() {
-                                        var item = this;
-                                        var $selectContainer = $wizard.find('#' + item[1]).find('.select-container');
-
-                                        makeIsos(item[0], function($elem) {
-                                            $selectContainer.append($elem);
-                                        });
-                                    });
-
-                                    var custom = args.customHidden({
-                                        context: context,
-                                        data: args.data
-                                    });
-
-                                    $step.find('.custom-size-label').remove();
-
-                                    if (custom) {
-                                        $step.find('.section.custom-size').hide();
-                                        $step.removeClass('custom-slider-container');
-                                    }
-
-                                    $step.find('input[type=radio]').bind('change', function() {
-                                        var $target = $(this);
-                                        var val = $target.val();
-                                        var item = null;
-                                        if (item == null && args.data.templates.featuredtemplates != undefined) {
-                                            item = $.grep(args.data.templates.featuredtemplates, function(elem) {
-                                                return elem.id == val;
-                                            })[0];
-                                        }
-                                        if (item == null && args.data.templates.communitytemplates != undefined) {
-                                            item = $.grep(args.data.templates.communitytemplates, function(elem) {
-                                                return elem.id == val;
-                                            })[0];
-                                        }
-                                        if (item == null && args.data.templates.mytemplates!=undefined) {
-                                            item = $.grep(args.data.templates.mytemplates, function(elem) {
-                                                return elem.id == val;
-                                            })[0];
-                                        }
-                                        if (item == null && args.data.templates.sharedtemplates!=undefined) {
-                                            item = $.grep(args.data.templates.sharedtemplates, function(elem) {
-                                                return elem.id == val;
-                                            })[0];
-                                        }
-
-                                        if (!item) return true;
-
-                                        var hypervisor = item['hypervisor'];
-                                        if (hypervisor == 'KVM' || hypervisor == 'XenServer' || hypervisor == 'VMware') {
-                                            $step.find('.section.custom-size').show();
-                                            $step.addClass('custom-slider-container');
-                                        } else {
-                                            $step.find('.section.custom-size').hide();
-                                            $step.removeClass('custom-slider-container');
-                                        }
-
-                                        return true;
-                                    });
-
-                                    originalValues(formData);
-
-                                }
-                            }
-                        };
-                    },
-
-                    'service-offering': function($step, formData) {
-                        var originalValues = function(formData) {
-                            if (formData.serviceofferingid) {
-                                $step.find('input[type=radio]').filter(function() {
-                                    return $(this).val() == formData.serviceofferingid;
-                                }).click();
-                            } else {
-                                $step.find('input[type=radio]:first').click();
-                            }
-                        };
-
-                        return {
-                            response: {
-                                success: function(args) {
-                                    $step.find('.content .select-container').append(
-                                        makeSelects('serviceofferingid', args.data.serviceOfferings, {
-                                            name: 'name',
-                                            desc: 'displaytext',
-                                            id: 'id'
-                                        }, {
-                                            'wizard-field': 'service-offering'
-                                        })
-                                    );
-
-                                    $step.find('input[type=radio]').bind('change', function() {
-                                        var $target = $(this);
-                                        var val = $target.val();
-                                        var item = $.grep(args.data.serviceOfferings, function(elem) {
-                                            return elem.id == val;
-                                        })[0];
-
-                                        if (!item) return true;
-
-                                        var custom = item[args.customFlag];
-
-                                        if (custom) {
-                                            // contains min/max CPU and Memory values
-                                            $step.addClass('custom-size');
-                                            var offeringDetails = item['serviceofferingdetails'];
-                                            var offeringCpuSpeed = item['cpuspeed'];
-                                            $step.find('.custom-no-limits').hide();
-                                            $step.find('.custom-slider-container').hide();
-
-                                            var minCpuNumber = 0, maxCpuNumber = 0, minMemory = 0, maxMemory = 0;
-                                            if (offeringDetails){
-                                                minCpuNumber = offeringDetails['mincpunumber'];
-                                                maxCpuNumber = offeringDetails['maxcpunumber'];
-                                                minMemory = offeringDetails['minmemory'];
-                                                maxMemory = offeringDetails['maxmemory'];
-                                            }
-
-                                            if (minCpuNumber > 0 && maxCpuNumber > 0 && minMemory > 0 && maxMemory > 0) {
-                                                $step.find('.custom-slider-container.slider-cpu-speed input[type=text]').val(parseInt(offeringCpuSpeed));
-                                                $step.find('.custom-slider-container').show();
-                                                var setupSlider = function(sliderClassName, minVal, maxVal) {
-                                                    $step.find('.custom-slider-container .' + sliderClassName + ' .size.min span').html(minVal);
-                                                    $step.find('.custom-slider-container .' + sliderClassName + ' .size.max span').html(maxVal);
-                                                    $step.find('.custom-slider-container .' + sliderClassName + ' input[type=text]').val(minVal);
-                                                    $step.find('.custom-slider-container .' + sliderClassName + ' .slider').each(function() {
-                                                        var $slider = $(this);
-                                                        $slider.slider({
-                                                            min: parseInt(minVal),
-                                                            max: parseInt(maxVal),
-                                                            slide: function(event, ui) {
-                                                                $slider.closest('.section.custom-size .' + sliderClassName + '').find('input[type=text]').val(ui.value);
-                                                                $step.find('span.custom-slider-container .' + sliderClassName + '').html(ui.value);
-                                                            }
-                                                        });
-                                                    });
-
-                                                    $step.find('.custom-slider-container .' + sliderClassName + ' input[type=text]').bind('change', function() {
-                                                        var val = parseInt($(this).val(), 10);
-                                                        if (val < minVal || val > maxVal) {
-                                                            cloudStack.dialog.notice({ message: $.validator.format(_l('message.validate.range'), [minVal, maxVal]) });
-                                                        }
-                                                        if (val < minVal) {
-                                                            val = minVal;
-                                                            $(this).val(val);
-                                                        }
-                                                        if(val > maxVal) {
-                                                            val = maxVal;
-                                                            $(this).val(val);
-                                                        }
-                                                        $step.find('span.custom-slider-container .' + sliderClassName).html(_s(val));
-                                                        $step.find('.custom-slider-container .' + sliderClassName + ' span.ui-slider-handle').css('left', (((val-minVal)/(maxVal-minVal))*100)+'%');
-                                                    });
-                                                    $step.find('.custom-slider-container .' + sliderClassName + ' span.ui-slider-handle').css('left', '0%');
-                                                }
-                                                setupSlider('slider-cpu-cores', minCpuNumber, maxCpuNumber);
-                                                setupSlider('slider-memory-mb', minMemory, maxMemory);
-                                            } else {
-                                                $step.find('.custom-slider-container.slider-cpu-speed.slider-compute-cpu-speed').val(0);
-                                                $step.find('.custom-no-limits').show();
-                                            }
-                                        } else {                                            
-                                            $step.find('.custom-no-limits').hide();
-                                            $step.find('.custom-slider-container').hide();
-                                            $step.removeClass('custom-size');
-                                        }
-
-                                        var customIops = item[args.customIopsFlag];
-
-                                        if (customIops && args.canShowCustomIops) {
-                                            $step.addClass('custom-iops');
-                                        } else {
-                                            $step.removeClass('custom-iops');
-                                        }
-
-                                        return true;
-                                    });
-
-                                    originalValues(formData);
-                                }
-                            }
-                        };
-                    },
-
-                    'data-disk-offering': function($step, formData) {
-                        var originalValues = function(formData) {
-                            var $targetInput = $step.find('input[type=radio]').filter(function() {
-                                return $(this).val() == formData.diskofferingid;
-                            }).click();
-
-                            if (!$targetInput.length) {
-                                $step.find('input[type=radio]:visible').filter(':first').click();
-                            }
-                        };
-
-                        $step.find('.section.custom-size').hide();
-
-                        return {
-                            response: {
-                                success: function(args) {
-                                    var multiDisk = args.multiDisk;
-
-                                    $step.find('.multi-disk-select-container').remove();
-                                    $step.removeClass('custom-slider-container');
-                                    $step.find('.main-desc, p.no-datadisk').remove();
-
-                                    if (!multiDisk){
-                                            if (args.required) {
-                                            $step.find('.section.no-thanks')
-                                                    .hide();
-                                            $step.addClass('required');
-                                        } else {
-                                            $step.find('.section.no-thanks')
-                                                    .show();
-                                            $step.removeClass('required');
-                                        }
-                                    } else {
-                                        $step.find('.section.no-thanks').hide();
-                                        $step.addClass('required');
-                                    }
-
-                                    var $selectContainer = $step.find('.content .select-container:not(.multi-disk)');
-
-                                    if (multiDisk) { // Render as multiple groups for each disk
-                                        if (multiDisk[0].id == "none"){
-                                            $step.find('.select-container').append(
-                                                $('<p>').addClass('no-datadisk').html(_l('message.no.datadisk'))
-                                            );
-                                            return;
-                                        }
-                                        var $multiDiskSelect = $('<div>').addClass('multi-disk-select-container');
-
-                                        $(multiDisk).map(function(index, disk) {
-                                            var array_do = [];
-                                            $.each(args.data.diskOfferings, function( key, value ) {
-                                              if (value){
-                                                      if (value.disksize >= disk.size && value.name != "Custom"){
-                                                          array_do.push(value);
-                                                     }
-                                                 }
-                                            })
-                                            var $group = $('<div>').addClass('disk-select-group');
-                                            var $header = $('<div>').addClass('disk-select-header').append(
-                                                $('<div>').addClass('title').html(disk.label)
-                                            ).appendTo($group);
-                                            var $checkbox = $('<input>').addClass('multi-disk-select')
-                                            .attr({
-                                                type: 'checkbox',
-                                                'disk-id': disk.id
-                                            })
-                                            .prependTo($header);
-                                            var $multiSelectContainer = $selectContainer.clone().append(
-                                                makeSelects('diskofferingid.' + disk.id, array_do, {
-                                                    id: 'id',
-                                                    name: 'name',
-                                                    desc: 'displaytext'
-                                                }, {
-                                                    'wizard-field': 'disk-offering'
-                                                })
-                                            ).appendTo($group).addClass('multi-disk');
-
-                                            $group.appendTo($multiDiskSelect);
-                                            $group.data('json-obj', disk);
-
-                                            // Show-hide disk group selects
-                                            $checkbox.click(function() {
-                                                $group.toggleClass('selected');
-                                                $group.find('.select:first input[type=radio]').click();
-
-                                                if (!$multiDiskSelect.find('input[type=checkbox]:checked').length) {
-                                                    $step.find('.no-thanks input[type=radio]').click();
-                                                } else {
-                                                    $step.find('.no-thanks input[type=radio]').attr('checked', false);
-                                                }
-                                            });
-
-                                            // Add custom disk size box
-                                            $step.find('.section.custom-size').clone().hide().appendTo($group);
-                                        });
-
-                                        $multiDiskSelect.insertAfter($selectContainer);
-                                        $selectContainer.hide();
-
-                                        // Fix issue with containers always showing after reload
-                                        $multiDiskSelect.find('.select-container').attr('style', null);
-                                    } else {
-                                        $selectContainer.show();
-                                        $step.find('.content .select-container').append(
-                                            makeSelects('diskofferingid', args.data.diskOfferings, {
-                                                id: 'id',
-                                                name: 'name',
-                                                desc: 'displaytext'
-                                            }, {
-                                                'wizard-field': 'disk-offering'
-                                            })
-                                        );
-                                    }
-
-                                    $step.find('input[type=radio]').bind('change', function() {
-                                        var $target = $(this);
-                                        var val = $target.val();
-                                        var item = $.grep(args.data.diskOfferings, function(elem) {
-                                            return elem.id == val;
-                                        })[0];
-                                        var isMultiDisk = $step.find('.multi-disk-select').length;
-
-                                        // Uncheck any multi-select groups
-                                        if ($target.closest('.no-thanks').length && isMultiDisk) {
-                                            $step.find('.disk-select-group input[type=checkbox]:checked').click();
-                                            $(this).attr('checked', true);
-
-                                            return true;
-                                        }
-
-                                        if (!item) {
-                                            if (isMultiDisk) {
-                                                $(this).closest('.disk-select-group .section.custom-size').hide();
-                                                $(this).closest('.disk-select-group').removeClass('custom-size');
-                                            } else {
-                                                // handle removal of custom size controls
-                                                $step.find('.section.custom-size').hide();
-                                                $step.removeClass('custom-slider-container');
-
-                                                // handle removal of custom IOPS controls
-                                                $step.removeClass('custom-iops-do');
-                                            }
-
-                                            return true;
-                                        }
-
-                                        var custom = item[args.customFlag];
-
-                                        if (!isMultiDisk) $step.find('.custom-size-label').remove();
-
-                                        if (custom && !isMultiDisk) {
-                                            $target.parent().find('.name')
-                                            .append(
-                                                $('<span>').addClass('custom-size-label')
-                                                .append(': ')
-                                                .append(
-                                                    $('<span>').addClass('custom-slider-container').html(
-                                                        $step.find('.custom-size input[name=size]').val()
-                                                )
-                                                )
-                                                .append(' GB')
-                                            );
-                                            $target.parent().find('.select-desc .desc')
-                                            .append(
-                                                $('<span>').addClass('custom-size-label')
-                                                .append(', ')
-                                                .append(
-                                                    $('<span>').addClass('custom-slider-container').html(
-                                                        $step.find('.custom-size input[name=size]').val()
-                                                )
-                                                )
-                                                .append(' GB')
-                                            );
-                                            $step.find('.section.custom-size').show();
-                                            $step.addClass('custom-slider-container');
-                                            $target.closest('.select-container').scrollTop(
-                                                $target.position().top
-                                            );
-                                        } else if (custom && isMultiDisk) {
-                                            $(this).closest('.disk-select-group').addClass('custom-size');
-                                        } else {
-                                            if (isMultiDisk) {
-                                                $(this).closest('.disk-select-group').removeClass('custom-size');
-                                            } else {
-                                                $step.find('.section.custom-size').hide();
-                                                $step.removeClass('custom-slider-container');
-                                            }
-                                        }
-
-                                        var customIops = item[args.customIopsDoFlag];
-
-                                        if (customIops) {
-                                            $step.addClass('custom-iops-do');
-                                        } else {
-                                            $step.removeClass('custom-iops-do');
-                                        }
-
-                                        return true;
-                                    });
-
-                                    originalValues(formData);
-                                }
-                            }
-                        };
-                    },
-
-                    'affinity': function($step, formData) {
-                        return {
-                            response: {
-                                success: function(args) {
-                                    // Cleanup
-                                    $step.find('.main-desc, p.no-affinity-groups').remove();
-
-                                    if (args.data.affinityGroups && args.data.affinityGroups.length) {
-
-                                        sortArrayByKey(args.data.affinityGroups, 'name');
-
-                                        $step.prepend(
-                                            $('<div>').addClass('main-desc').append(
-                                                $('<p>').html(_l('message.select.affinity.groups'))
-                                            )
-                                        );
-                                        $step.find('.select-container').append(
-                                            makeSelects(
-                                                'affinity-groups',
-                                                args.data.affinityGroups, {
-                                                    name: 'name',
-                                                    desc: 'description',
-                                                    id: 'id'
-                                                }, {
-                                                    type: 'checkbox',
-                                                    'wizard-field': 'affinity-groups'
-                                                },
-                                                args.data.selectedObj,
-                                                args.data.selectedObjNonEditable
-                                            )
-                                        );
-                                    } else {
-                                        $step.find('.select-container').append(
-                                            $('<p>').addClass('no-affinity-groups').html(_l('message.no.affinity.groups'))
-                                        );
-                                    }
-                                }
-                            }
-                        };
-                    },
-
-                    'sshkeyPairs': function($step, formData) {
-                        var originalValues = function(formData) {
-                            if (formData.sshkeypair) {
-                                $step.find('input[type=radio]').filter(function() {
-                                    return $(this).val() == formData.sshkeypair;
-                                }).click();
-                            } else {
-                                $step.find('input[type=radio]:first').click();
-                            }
-                        };
-                        return {
-                            response: {
-                                success: function(args) {
-                                    $step.find('.main-desc, p.no-sshkey-pairs').remove();
-
-                                    if (args.data.sshkeyPairs && args.data.sshkeyPairs.length) {
-
-                                        sortArrayByKey(args.data.sshkeyPairs, 'name');
-
-                                        $step.prepend(
-                                            $('<div>').addClass('main-desc').append(
-                                                $('<p>').html(_l('message.please.select.ssh.key.pair.use.with.this.vm'))
-                                            )
-                                        );
-                                        $step.find('.section.no-thanks').show();
-                                        $step.find('.select-container').append(
-                                            makeSelects(
-                                                'sshkeypair',
-                                                args.data.sshkeyPairs, {
-                                                    name: 'name',
-                                                    id: 'name'
-                                                }, {
-                                                    'wizard-field': 'sshkey-pairs'
-                                                }
-                                            )
-                                        );
-                                        originalValues(formData); // if we can select only one.
-                                    } else {
-                                        $step.find('.section.no-thanks').hide();
-                                        $step.find('.select-container').append(
-                                            $('<p>').addClass('no-sshkey-pairs').html(_l('You do not have any ssh key pairs. Please continue to the next step.'))
-                                        );
-                                    }
-                                }
-                            }
-                        };
-                    },
-
-                    'network': function($step, formData) {
-                        var showAddNetwork = true;
-
-                        var checkShowAddNetwork = function($newNetwork) {
-                            if (!showAddNetwork) {
-                                $newNetwork.hide();
-                            } else {
-                                $newNetwork.show();
-                            }
-                        };
-
-                        var originalValues = function(formData) {
-                            // Default networks
-                            $step.find('input[type=radio]').filter(function() {
-                                return $(this).val() == formData['defaultNetwork'];
-                            }).click();
-
-                            // Optional networks
-                            var selectedOptionalNetworks = [];
-
-                            if ($.isArray(formData['shared-networks']) != -1) {
-                                $(formData['shared-networks']).each(function() {
-                                    selectedOptionalNetworks.push(this);
-                                });
-                            } else {
-                                selectedOptionalNetworks.push(formData['shared-networks']);
-                            }
-
-                            var $checkboxes = $step.find('input[name=shared-networks]');
-                            $(selectedOptionalNetworks).each(function() {
-                                var networkID = this;
-                                $checkboxes.filter(function() {
-                                    return $(this).val() == networkID;
-                                }).attr('checked', 'checked');
-                            });
-                        };
-
-                        var $newNetwork = $step.find('.new-network');
-                        var $newNetworkCheckbox = $newNetwork.find('input[type=checkbox]');
-
-                        // Setup new network field
-                        $newNetworkCheckbox.unbind('click');
-                        $newNetworkCheckbox.click(function() {
-                            $newNetwork.toggleClass('unselected');
-
-                            // Select another default if hiding field
-                            if ($newNetwork.hasClass('unselected')) {
-                                $step.find('input[type=radio]:visible:first').click();
-                            } else {
-                                $newNetwork.find('input[type=radio]').click();
-                            }
-                        });
-
-                        setTimeout(function() {
-                            var $checkbox = $step.find('.new-network input[type=checkbox]');
-                            var $newNetwork = $checkbox.closest('.new-network');
-
-                            if ($step.find('.select.my-networks .select-container .select:visible').length) {
-                                $checkbox.attr('checked', false);
-                                $newNetwork.addClass('unselected');
-                            } else {
-                                $newNetwork.find('input[name=defaultNetwork]').filter('[value=new-network]').click();
-                            }
-
-                            $checkbox.change();
-                        });
-
-                        // Show relevant conditional sub-step if present
-                        $step.find('.wizard-step-conditional').hide();
-
-                        if ($.isFunction(args.showAddNetwork)) {
-                            showAddNetwork = args.showAddNetwork({
-                                data: formData,
-                                context: context
-                            });
-                        }
-
-                        // Filter network list by VPC ID
-                        var filterNetworkList = function(vpcID) {
-                            var $selects = $step.find('.my-networks .select-container .select');
-                            var $visibleSelects = $($.grep($selects, function(select) {
-                                var $select = $(select);
-
-                                return args.vpcFilter($select.data('json-obj'), vpcID);
-                            }));
-                            var $addNetworkForm = $step.find('.select.new-network');
-                            var $addNewNetworkCheck = $addNetworkForm.find('input[name=new-network]');
-
-                            // VPC networks cannot be created via instance wizard
-                            if (vpcID != -1) {
-                                $step.find('.my-networks .select-container').addClass('single-select');
-                                $addNetworkForm.hide();
-
-                                if ($addNewNetworkCheck.is(':checked')) {
-                                    $addNewNetworkCheck.click();
-                                    $addNewNetworkCheck.attr('checked', false);
-                                }
-                            } else {
-                                $step.find('.my-networks .select-container').removeClass('single-select');
-                                $addNetworkForm.show();
-                                checkShowAddNetwork($addNetworkForm);
-                            }
-
-                            $selects.find('input[type=checkbox]').attr('checked', false);
-                            $selects.hide();
-                            $visibleSelects.show();
-
-                            // Select first visible item by default
-                            $visibleSelects.filter(':first')
-                                .find('input[type=radio]')
-                                .click();
-
-                            cloudStack.evenOdd($visibleSelects, 'div.select', {
-                                even: function($elem) {
-                                    $elem.removeClass('odd');
-                                    $elem.addClass('even');
-                                },
-                                odd: function($elem) {
-                                    $elem.removeClass('even');
-                                    $elem.addClass('odd');
-                                }
-                            });
-                        };
-
-                        var $vpcSelect = $step.find('select[name=vpc-filter]');
-
-                        $vpcSelect.unbind('change');
-                        $vpcSelect.change(function() {
-                            filterNetworkList($vpcSelect.val());
-                        });
-
-                        return {
-                            response: {
-                                success: function(args) {
-                                    var vpcs = args.data.vpcs;
-                                    var addClass = args.addClass;
-                                    var removeClass = args.removeClass;
-
-                                    // Populate VPC drop-down
-                                    $vpcSelect.html('');
-
-                                    sortArrayByKey(vpcs, 'name');
-
-                                    $(vpcs).map(function(index, vpc) {
-                                        var $option = $('<option>');
-                                        var id = vpc.id;
-                                        var description = vpc.name;
-
-                                        $option.attr('value', id);
-                                        $option.html(description);
-                                        $option.appendTo($vpcSelect);
-                                    });
-
-                                    // 'No VPC' option
-                                    $('<option>').attr('value', '-1').html(_l('ui.listView.filters.all')).prependTo($vpcSelect);
-
-                                    $vpcSelect.val(-1);
-
-                                    // Populate network offering drop-down
-                                    $(args.data.networkOfferings).each(function() {
-                                        $('<option>')
-                                            .val(this.id)
-                                            .html(this.name)
-                                            .appendTo($newNetwork.find('select'));
-                                    });
-
-                                    if (args.type) {
-                                        $step.find('.wizard-step-conditional').filter(function() {
-                                            return $(this).hasClass(args.type);
-                                        }).show();
-                                    } else {
-                                        $step.find('.select-network').show();
-                                    }
-
-                                    // My networks
-                                    $step.find('.my-networks .select-container').append(
-                                        makeSelects('my-networks', args.data.networkObjs, {
-                                            name: 'name',
-                                            desc: 'type',
-                                            id: 'id'
-                                        }, {
-                                            type: 'checkbox',
-                                            'wizard-field': 'my-networks',
-                                            secondary: {
-                                                desc: 'Default',
-                                                name: 'defaultNetwork',
-                                                type: 'radio',
-                                                'wizard-field': 'default-network'
-                                            }
-                                        })
-                                    );
-
-                                    // Add IP/advanced option fields
-                                    $step.find('.my-networks .select-container .select, .select.new-network .select').each(function () {
-                                        var $select = $(this);
-                                        var $advancedLink = $('<div>').addClass('advanced-options hide-if-unselected');
-                                        var $specifyIpField = $('<div>').addClass('specify-ip hide-if-unselected').append(
-                                            $('<label>').html(_l('label.ip.address')),
-                                            $('<input>').attr({ type: 'text' })
-                                        );
-
-                                        // Cleanup
-                                        if ($select.closest('.new-network').length) {
-                                            $select.find('.advanced-options, .specify-ip').remove();
-                                        }
-
-                                        $select.append($advancedLink, $specifyIpField);
-                                        $advancedLink.click(function() {
-                                            $select.toggleClass('advanced');
-                                        });
-                                    });
-
-                                    // Show non-VPC networks by default
-                                    filterNetworkList(-1);
-
-                                    // Security groups (alt. page)
-                                    var $sgSelects = makeSelects('security-groups', args.data.securityGroups, {
-                                        name: 'name',
-                                        desc: 'description',
-                                        id: 'id'
-                                    }, {
-                                        type: 'checkbox',
-                                        'wizard-field': 'security-groups'
-                                    });
-                                    $step.find('.security-groups .select-container').append($sgSelects);
-
-                                    //If there is only one security group and the only one is 'default', make it selected by default
-                                    if ($sgSelects.length == 1) {
-                                        var $firstCheckbox = $sgSelects.eq(0);
-                                      if ($firstCheckbox.find('div .name').text() == 'default') {
-                                        $firstCheckbox.find('input:checkbox').click();
-                                      }
-                                  }
-
-                                    originalValues(formData);
-                                    checkShowAddNetwork($newNetwork);
-                                }
-                            }
-                        };
-                    },
-
-                    'ovfProperties': function($step, formData) {
-                        return {
-                            response: {
-                                success: function(args) {
-                                    $step.find('.content .select-container').append(
-                                        makeSelectsOvfProperties(args.data.ovfProperties, {
-                                            key: 'key',
-                                            type: 'type',
-                                            value: 'value',
-                                            qualifiers: 'qualifiers',
-                                            label: 'label',
-                                            description : 'description',
-                                            password : 'password'
-                                        })
-                                    );
-                                }
-                            }
-                        };
-                    },
-
-                    'review': function($step, formData) {
-                        $step.find('[wizard-field]').each(function() {
-                            var field = $(this).attr('wizard-field');
-                            var fieldName;
-
-                            var $input = $wizard.find('[wizard-field=' + field + ']').filter(function() {
-                                return ($(this).is(':selected') ||
-                                    $(this).is(':checked') ||
-                                    $(this).attr('type') == 'hidden') &&
-                                    $(this).is(':not(:disabled)');
-                            });
-
-                            if ($input.is('option')) {
-                                fieldName = $input.html();
-                            } else if ($input.is('input[type=radio]')) {
-                                // Choosen New network as default
-                                if ($input.parents('div.new-network').length) {
-                                    fieldName = $input.closest('div.new-network').find('input[name="new-network-name"]').val();
-                                    // Choosen Network from existed
-                                } else if ($input.parents('div.my-networks').length) {
-                                    fieldName = $input.closest('div.select').find('.select-desc .name').html();
-                                } else {
-                                    fieldName = $input.parent().find('.select-desc .name').html();
-                                }
-                            } else if ($input.eq(0).is('input[type=checkbox]')) {
-                                fieldName = '';
-                                $input.each(function(index) {
-                                    if (index != 0) fieldName += '<br />';
-                                    fieldName += $(this).next('div.select-desc').find('.name').html();
-                                });
-                            } else if ($input.is('input[type=hidden]')) {
-                                fieldName = $input.val();
-                            }
-
-                            if (fieldName) {
-                                $(this).html(fieldName);
-                            } else {
-                                $(this).html('(' + _l('label.none') + ')');
-                            }
-
-                            var conditionalFieldFrom = $(this).attr('conditional-field');
-                            if (conditionalFieldFrom) {
-                                if ($wizard.find('.' + conditionalFieldFrom).css('display') == 'block') {
-                                    $(this).closest('div.select').show();
-                                } else {
-                                    $(this).closest('div.select').hide();
-                                }
-                            }
-
-                            var uefi = function(bootType){
-                                var $bootmode  = $step.find('select[name=bootmode]');
-
-                                if(bootType.toLowerCase() == 'uefi' ){
-                                    $bootmode.html('');
-                                    var $option = $('<option>');
-                                    var id = 'LEGACY';
-                                    var description = 'LEGACY';
-
-                                    $option.attr('value', id);
-                                    $option.html(description);
-                                    $option.appendTo($bootmode);
-
-                                    var $option2 = $('<option>');
-                                    var id2 = 'SECURE';
-                                    var description2 = 'SECURE';
-
-                                    $option2.attr('value', id2);
-                                    $option2.html(description2);
-                                    $option2.appendTo($bootmode);
-
-                                }
-
-                                if(bootType.toLowerCase() == 'bios' ){
-                                     $bootmode.html('');
-
-                                     var $option = $('<option>');
-                                     var id = 'LEGACY';
-                                     var description = 'LEGACY';
-
-                                     $option.attr('value', id);
-                                     $option.html(description);
-                                     $option.appendTo($bootmode);
-                                }
-
-                            }
-
-                            var $uefiselect  = $step.find('select[name=customboot]');
-                            $uefiselect.unbind('change');
-                            $uefiselect.change(function(){
-                                 uefi($uefiselect.val());
-                            });
-
-                        });
-                    }
-                };
-
-                $wizard.bind('cloudStack.instanceWizard.showStep', function(e, args) {
-                    showStep(args.index, { refresh: true });
-                });
-
-                // Go to specified step in wizard,
-                // updating nav items and diagram
-                var showStep = function(index, options) {
-                    if (!options) options = {};
-                    var targetIndex = index - 1;
-
-                    if (index <= 1) targetIndex = 0;
-                    if (targetIndex == $steps.length) {
-                        completeAction();
-                        return;
-                    }
-
-                    var $targetStep = $($steps.hide()[targetIndex]).show();
-                    var stepID = $targetStep.attr('wizard-step-id');
-                    var formData = cloudStack.serializeForm($form);
-
-                    if (options.refresh) {
-                        $targetStep.removeClass('loaded');
-                    }
-
-                    if (!$targetStep.hasClass('loaded')) {
-                        // Remove previous content
-                        if (!$targetStep.hasClass('review')) { // Review row content is not autogenerated
-                            $targetStep.find('.select-container:not(.fixed) div, option:not(:disabled)').remove();
-                        }
-
-                        dataProvider(
-                            index,
-                            dataGenerators[stepID](
-                                $targetStep,
-                                formData
-                            )
-                        );
-
-                        if (!$targetStep.hasClass('repeat') && !$targetStep.hasClass('always-load')) $targetStep.addClass('loaded');
-                    }
-
-                    // Show launch vm button if last step
-                    var $nextButton = $wizard.find('.button.next');
-                    $nextButton.find('span').html(_l('label.next'));
-                    $nextButton.removeClass('final');
-                    if ($targetStep.hasClass('review')) {
-                        $nextButton.find('span').html(_l('label.launch.vm'));
-                        $nextButton.addClass('final');
-                    }
-
-                    // Hide previous button on first step
-                    var $previousButton = $wizard.find('.button.previous');
-                    if (index == 1) $previousButton.hide();
-                    else $previousButton.show();
-
-                    // Update progress bar
-                    var $targetProgress = $progress.removeClass('active').filter(function() {
-                        return $(this).index() <= targetIndex;
-                    }).toggleClass('active');
-
-                    // Update diagram; show/hide as necessary
-                    $diagramParts.filter(function() {
-                        return $(this).index() <= targetIndex;
-                    }).fadeIn('slow');
-                    $diagramParts.filter(function() {
-                        return $(this).index() > targetIndex;
-                    }).fadeOut('slow');
-
-                    setTimeout(function() {
-                        if (!$targetStep.find('input[type=radio]:checked').length) {
-                            $targetStep.find('input[type=radio]:first').click();
-                        }
-                    }, 50);
-                };
-
-                // Events
-                $wizard.click(function(event) {
-                    var $target = $(event.target);
-                    var $activeStep = $form.find('.step:visible');
-
-                    // Next button
-                    if ($target.closest('div.button.next').length) {
-                        //step 2 - select template/ISO
-                        if($activeStep.hasClass('select-iso')) {
-                            if ($activeStep.find('.content:visible input:checked').length == 0) {
-                                cloudStack.dialog.notice({
-                                    message: 'message.step.1.continue'
-                                });
-                                return false;
-                            }
-                            $(window).trigger("cloudStack.module.instanceWizard.clickNextButton", {
-                                $form: $form,
-                                currentStep: 2
-                            });
-                        }
-
-                        //step 6 - select network
-                        if ($activeStep.find('.wizard-step-conditional.select-network:visible').length > 0) {
-                            var data = $activeStep.data('my-networks');
-
-                            if (!data) {
-                                $activeStep.closest('form').data('my-networks', cloudStack.serializeForm(
-                                    $activeStep.closest('form')
-                                )['my-networks']);
-                            }
-
-                            if ($activeStep.find('input[type=checkbox]:checked').length == 0) { //if no checkbox is checked
-                                cloudStack.dialog.notice({
-                                    message: 'message.step.4.continue'
-                                });
-                                return false;
-                            }
-
-                            if ($activeStep.hasClass('next-use-security-groups')) {
-                                var advSGFilter = args.advSGFilter({
-                                    data: cloudStack.serializeForm($form)
-                                });
-
-                                if (advSGFilter == 0) { //when total number of selected sg networks is 0, then 'Select Security Group' is skipped, go to step 6 directly
-                                    showStep(6);
-                                } else if (advSGFilter > 0) { //when total number of selected sg networks > 0
-                                    if ($activeStep.find('input[type=checkbox]:checked').length > 1) { //when total number of selected networks > 1
-                                        cloudStack.dialog.notice({
-                                            message: "Can't create a vm with multiple networks one of which is Security Group enabled"
-                                        });
-                                        return false;
-                                    }
-                                } else if (advSGFilter == -1) { // vm with multiple IPs is supported in KVM
-                                    var $selectNetwork = $activeStep.find('input[type=checkbox]:checked');
-                                    var myNetworkIps = [];
-                                    $selectNetwork.each(function() {
-                                        var $specifyIp = $(this).parent().find('.specify-ip input[type=text]');
-                                        myNetworkIps.push($specifyIp.val() == -1 ? null : $specifyIp.val());
-                                    });
-                                    $activeStep.closest('form').data('my-network-ips', myNetworkIps);
-                                    $selectNetwork.each(function() {
-                                        if ($(this).parent().find('input[type=radio]').is(':checked')) {
-                                            $activeStep.closest('form').data('defaultNetwork', $(this).val());
-                                            return;
-                                        }
-                                    })
-                                }
-
-                            }
-                        }
-
-                        //step 6 - review (spcifiy displyname, group as well)
-                        if ($activeStep.hasClass('review')) {
-                            if ($activeStep.find('input[name=displayname]').length > 0 && $activeStep.find('input[name=displayname]').val().length > 0) {
-                                //validate
-                                var b = cloudStack.validate.vmHostName($activeStep.find('input[name=displayname]').val());
-                                if (b == false)
-                                    return false;
-                            }
-                        }
-
-                        // Step 7 - Skip OVF properties tab if there are no OVF properties for the template
-                        if ($activeStep.hasClass('sshkeyPairs')) {
-                            if ($activeStep.hasClass('next-skip-ovf-properties')) {
-                                showStep(8);
-                            }
-                        }
-
-                        // Optional Step - Pre-step 8
-                        if ($activeStep.hasClass('ovf-properties')) {
-                            var ok = true;
-                            if ($activeStep.find('input').length > 0) { //if no checkbox is checked
-                                $.each($activeStep.find('input'), function(index, item) {
-                                    var item = $activeStep.find('input#' + item.id);
-                                    var internalCheck = true;
-                                    if (this.maxLength && this.maxLength !== -1) {
-                                        internalCheck = item.val().length <= this.maxLength;
-                                    } else if (this.min && this.max) {
-                                        var numberValue = parseFloat(item.val());
-                                        internalCheck = numberValue >= this.min && numberValue <= this.max;
-                                    }
-                                    ok = ok && internalCheck;
-                                });
-                            }
-                            if (!ok) {
-                                cloudStack.dialog.notice({
-                                    message: 'Please enter valid values for every property'
-                                });
-                                return false;
-                            }
-                        }
-
-                        if (!$form.valid()) {
-                            if ($form.find('input.error:visible, select.error:visible').length) {
-                                return false;
-                            }
-                        }
-
-                        if ($activeStep.hasClass('repeat')) {
-                            showStep($steps.filter(':visible').index() + 1);
-                        } else {
-                            showStep($steps.filter(':visible').index() + 2);
-                        }
-
-                        return false;
-                    }
-
-                    // Previous button
-                    if ($target.closest('div.button.previous').length) {
-                        var $step = $steps.filter(':visible');
-                        var $networkStep = $steps.filter('.network');
-                        var index = $step.index();
-
-                        $networkStep.removeClass('next-use-security-groups');
-
-                        if (index) {
-                            if (index == $steps.length - 1 && $networkStep.hasClass('next-use-security-groups')) {
-                                showStep(5);
-                            } else if ($activeStep.find('.select-security-group:visible').length &&
-                                $activeStep.find('.select-network.no-add-network').length) {
-                                showStep(5);
-                            } else {
-                                showStep(index);
-                            }
-                        }
-
-                        if ($activeStep.hasClass('review')) {
-                            if ($activeStep.hasClass('previous-skip-ovf-properties')) {
-                                showStep(7);
-                            }
-                        }
-
-                        return false;
-                    }
-
-                    // Close button
-                    if ($target.closest('div.button.cancel').length) {
-                        close();
-
-                        return false;
-                    }
-
-                    // Edit link
-                    if ($target.closest('div.edit').length) {
-                        var $edit = $target.closest('div.edit');
-
-                        showStep($edit.find('a').attr('href'));
-
-                        return false;
-                    }
-
-                    return true;
-                });
-
-                showStep(1);
-
-                $wizard.bind('change', function(event) {
-                    var $target = $(event.target);
-                    var $step = $target.closest('.step');
-                    var $futureSteps = $step.siblings().filter(function() {
-                        return $(this).index() > $step.index();
-                    });
-
-                    // Reset all fields in futher steps
-                    $futureSteps.removeClass('loaded');
-                });
-
-                var minCustomDiskSize = args.minDiskOfferingSize ?
-                                    args.minDiskOfferingSize() : 1;
-
-                var maxCustomDiskSize = args.maxDiskOfferingSize ?
-                    args.maxDiskOfferingSize() : 100;
-
-                // Setup tabs and slider
-                $wizard.find('.section.custom-size.custom-slider-container .size.min span').html(minCustomDiskSize);
-                $wizard.find('.section.custom-size.custom-slider-container input[type=text]').val(minCustomDiskSize);
-                $wizard.find('.section.custom-size.custom-slider-container .size.max span').html(maxCustomDiskSize);
-                $wizard.find('.tab-view').tabs();
-                $wizard.find('.slider').each(function() {
-                   var $slider = $(this);
-
-                    $slider.slider({
-                        min: minCustomDiskSize,
-                        max: maxCustomDiskSize,
-                        start: function(event) {
-                            $slider.closest('.section.custom-size').find('input[type=radio]').click();
-                        },
-                        slide: function(event, ui) {
-                            $slider.closest('.section.custom-size').find('input[type=text]').val(
-                                ui.value
-                            );
-                            $slider.closest('.step').find('span.custom-slider-container').html(
-                                ui.value
-                            );
-                        }
-                    });
-                });
-
-                $wizard.find('div.data-disk-offering div.custom-size input[type=text]').bind('change', function() {
-                    var old = $wizard.find('div.data-disk-offering div.custom-size input[type=text]').val();
-                    $wizard.find('div.data-disk-offering span.custom-slider-container').html(_s(old));
-                });
-                
-                var wizardDialog = $wizard.dialog({
-                    title: _l('label.vm.add'),
-                    width: 896,
-                    minHeight: 600,
-                    height: 'auto',
-                    closeOnEscape: false,
-                    modal: true
-                });
-                var wizardDialogDiv = wizardDialog.closest('.ui-dialog');
-
-                $('button.ui-dialog-titlebar-close').remove();
-                return wizardDialogDiv.overlay();
-            };
-
-            instanceWizard(args);
-        };
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui-custom/ipRules.js b/ui/legacy/scripts/ui-custom/ipRules.js
deleted file mode 100644
index 28ec8db..0000000
--- a/ui/legacy/scripts/ui-custom/ipRules.js
+++ /dev/null
@@ -1,163 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    cloudStack.ipRules = function(args) {
-        return function(detailArgs) {
-            var context = detailArgs.context;
-
-            var portMultiEdit = function(args) {
-                return $('<div>').multiEdit(args);
-            };
-
-            var makeMultiEditPanel = function($item) {
-                if ($item.closest('li').hasClass('disabled'))
-                    return false;
-
-                var targetId = $item.attr('net-target');
-                var targetName = $item.parent().find('.name').find('span').html();
-                var target = args[targetId];
-
-                var $browser = $item.closest('.detail-view').data('view-args').$browser;
-
-                $browser.cloudBrowser('addPanel', {
-                    title: targetName,
-                    maximizeIfSelected: true,
-                    complete: function($newPanel) {
-                        $newPanel.detailView({
-                            $browser: $browser,
-                            name: targetId,
-                            context: context,
-                            tabs: {
-                                network: {
-                                    title: targetName,
-                                    custom: function(args) {
-                                        return portMultiEdit($.extend(target, {
-                                            context: context
-                                        }));
-                                    }
-                                }
-                            }
-                        });
-                    }
-                });
-
-                return true;
-            };
-
-            var staticNATChart = function(args, includingFirewall) {
-                var $chart = $('#template').find('.network-chart.static-nat').clone();
-                var $vmName = $chart.find('li.static-nat-enabled .vmname');
-                var $browser = $('#browser .container');
-                var vmDataProvider = args.vmDataProvider;
-                var vmDetails = args.vmDetails;
-
-                args.staticNATDataProvider({
-                    context: context,
-                    response: {
-                        success: function(args) {
-                            var vmID = args.data.virtualmachineid;
-                            var vmIP = args.data.vmipaddress;
-                            var vmName = args.data.virtualmachinename;
-
-                            $vmName.append(
-                                $('<span>').html('VM: ' + _s(vmName)),
-                                $('<span>').html('<br/>VM IP: ' + vmIP)
-                            );
-
-                            $vmName.click(function() {
-                                $browser.cloudBrowser('addPanel', {
-                                    title: _l('label.static.nat.vm.details'),
-                                    complete: function($newPanel) {
-                                        vmDataProvider({
-                                            context: context,
-                                            response: {
-                                                success: function(args) {
-                                                    var instance = args.data;
-                                                    var detailViewArgs = $.extend(true, {}, vmDetails, {
-                                                        $browser: $browser,
-                                                        context: $.extend(true, {}, context, {
-                                                            instances: [instance]
-                                                        }),
-                                                        jsonObj: instance,
-                                                        id: instance.id
-                                                    });
-
-                                                    // No actions available
-                                                    detailViewArgs.actions = {};
-
-                                                    $newPanel.detailView(detailViewArgs);
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            });
-                        }
-                    }
-                });
-
-                if (includingFirewall == true) {
-                    $chart.find('li.firewall .view-details').click(function() {
-                        //makeMultiEditPanel($(this), { title: _l('label.nat.port.range')});
-                        makeMultiEditPanel($(this));
-                    });
-                } else {
-                    $chart.find('li.firewall').hide();
-                }
-
-                return $chart;
-            };
-
-            var netChart = function(args) {
-
-                var $chart = $('#template').find('.network-chart.normal').clone();
-                var preFilter = args.preFilter ? args.preFilter({
-                    items: ['firewall', 'portForwarding', 'loadBalancing'],
-                    context: context
-                }) : [];
-
-                // 1. choose between staticNAT chart and non-staticNAT chart  2. filter disabled tabs
-                if (preFilter.length) {
-                    if ($.inArray('nonStaticNATChart', preFilter) != -1) { //choose static NAT chart
-                        if ($.inArray('firewall', preFilter) == -1) {
-                            return staticNATChart(args, true); //static NAT including Firewall
-                        } else {
-                            return staticNATChart(args, false); //static NAT excluding Firewall
-                        }
-                    } else { //choose non-static NAT chart
-                        $(preFilter).each(function() {
-                            var id = this;
-
-                            var $li = $chart.find('li').filter(function() {
-                                return $(this).hasClass(id);
-                            }).addClass('disabled');
-                        });
-                    }
-                }
-
-                $chart.find('.view-details').click(function() {
-                    makeMultiEditPanel($(this));
-                    return false;
-                });
-
-                return $chart;
-            };
-
-            return netChart(args);
-        };
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui-custom/login.js b/ui/legacy/scripts/ui-custom/login.js
deleted file mode 100644
index 5825529..0000000
--- a/ui/legacy/scripts/ui-custom/login.js
+++ /dev/null
@@ -1,217 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    /**
-     * Login process
-     */
-    cloudStack.uiCustom.login = function(args) {
-        var $container = args.$container;
-        var $login = $('#template').find('.login').clone();
-        var $form = $login.find('form');
-        var $inputs = $form.find('input[type=text], input[type=password]');
-        var complete = args.complete;
-        var bypass = args.bypassLoginCheck && args.bypassLoginCheck();
-
-        // Check to see if we can bypass login screen
-        if (bypass) {
-            complete({
-                user: bypass.user
-            });
-            $(window).trigger('cloudStack.init');
-
-            return;
-        }
-
-        $login.appendTo('html body');
-        $('html body').addClass('login');
-
-        // Remove label if field was auto filled
-        $.each($form.find('label'), function() {
-            var $label = $(this);
-            var $input = $form.find('input').filter(function() {
-                return $(this).attr('name') == $label.attr('for');
-            });
-            if ($input.val()) {
-                $label.hide();
-            }
-        });
-
-        // Form validation
-        $form.validate();
-
-        // Form label behavior
-        $inputs.bind('keydown focus click blur', function(event) {
-            var $target = $(event.target);
-            var $label = $form.find('label').filter(function() {
-                return $(this).attr('for') == $target.attr('name');
-            });
-
-            if (event.type == 'keydown') {
-                $label.hide();
-
-                return true;
-            } else if (event.type == 'blur') {
-                if ($target.hasClass('first-input')) {
-                    $target.removeClass('first-input');
-                }
-                if (!$(this).val()) {
-                    $label.show();
-                }
-            } else {
-                if (!$target.hasClass('first-input')) {
-                    $label.hide();
-                }
-            }
-
-            return true;
-        });
-
-        if (!args.hasLogo) $login.addClass('nologo');
-
-        // Labels cause related input to be focused
-        $login.find('label').click(function() {
-            var $input = $inputs.filter('[name=' + $(this).attr('for') + ']');
-            var $label = $(this);
-
-            $input.focus();
-            $label.hide();
-        });
-
-        $inputs.filter(':first').addClass('first-input').focus();
-
-        // Login action
-        var selectedLogin = 'cloudstack';
-        $login.find('#login-submit').click(function() {
-            if (selectedLogin === 'cloudstack') {
-                // CloudStack Local Login
-                if (!$form.valid()) return false;
-
-                var data = cloudStack.serializeForm($form);
-
-                args.loginAction({
-                    data: data,
-                    response: {
-                        success: function(args) {
-                            $login.remove();
-                            $('html body').removeClass('login');
-                            complete({
-                                user: args.data.user
-                            });
-                        },
-                        error: function(args) {
-                            cloudStack.dialog.notice({
-                                message: args
-                            });
-                        }
-                    }
-                });
-            } else if (selectedLogin === 'saml') {
-                // SAML
-                args.samlLoginAction({
-                    data: {'idpid': $login.find('#login-options').find(':selected').val()}
-                });
-            }
-            return false;
-        });
-
-
-        var toggleLoginView = function (selectedOption) {
-            $login.find('#login-submit').show();
-            if (selectedOption === '') {
-                    $login.find('#cloudstack-login').hide();
-                    $login.find('#login-submit').hide();
-                    selectedLogin = 'none';
-            } else if (selectedOption === 'cloudstack-login') {
-                    $login.find('#cloudstack-login').show();
-                    selectedLogin = 'cloudstack';
-            } else {
-                    $login.find('#cloudstack-login').hide();
-                    selectedLogin = 'saml';
-            }
-        };
-
-        $login.find('#login-options').change(function() {
-            var selectedOption = $login.find('#login-options').find(':selected').val();
-            toggleLoginView(selectedOption);
-            if (selectedOption && selectedOption !== '') {
-                $.cookie('login-option', selectedOption);
-            }
-        });
-
-        // By Default hide login option dropdown
-        $login.find('#login-dropdown').hide();
-        $login.find('#login-submit').show();
-        $login.find('#cloudstack-login').show();
-
-        // If any IdP servers were set, SAML is enabled
-        if (g_idpList && g_idpList.length > 0) {
-            $login.find('#login-dropdown').show();
-            $login.find('#login-submit').hide();
-            $login.find('#cloudstack-login').hide();
-
-            $login.find('#login-options')
-                .append($('<option>', {
-                    value: '',
-                    text: '--- Select Identity Provider -- ',
-                    selected: true
-                }));
-
-            $.each(g_idpList, function(index, idp) {
-                $login.find('#login-options')
-                    .append($('<option>', {
-                        value: idp.id,
-                        text: idp.orgName
-                    }));
-            });
-
-            var loginOption = $.cookie('login-option');
-            if (loginOption) {
-                var option = $login.find('#login-options option[value="' + loginOption + '"]');
-                if (option.length > 0) {
-                    option.prop('selected', true);
-                    toggleLoginView(loginOption);
-                }
-            }
-        }
-
-        // Select language
-        var $languageSelect = $login.find('select[name=language]');
-        $languageSelect.change(function() {
-            if ($(this).val() != '') //language dropdown is not blank
-                $.cookie('lang', $(this).val()); //the selected option in language dropdown will be used (instead of browser's default language)
-            else //language dropdown is blank
-                $.cookie('lang', null); //null $.cookie('lang'), so browser's default language will be used.
-            document.location.reload();
-        });
-
-        $languageSelect.val($.cookie('lang'));
-
-        // Hide login screen, mainly for SSO
-        if (args.hideLoginScreen) {
-            $login.children().hide();
-            $login.append($('<div>').addClass('loading-overlay').append(
-                $('<span>').html(
-                    // _l is not set yet, so localize directly to dictionary
-                    // [should fix in future]
-                    dictionary['label.loading'] + '...'
-                )
-            ));
-        }
-
-        $(window).trigger('cloudStack.init');
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui-custom/metricsView.js b/ui/legacy/scripts/ui-custom/metricsView.js
deleted file mode 100644
index fccbd00..0000000
--- a/ui/legacy/scripts/ui-custom/metricsView.js
+++ /dev/null
@@ -1,209 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-
-    cloudStack.uiCustom.metricsView = function(args) {
-        return function(ctxArgs) {
-
-            var metricsListView = cloudStack.sections.metrics.listView;
-            var metricsLabel = _l('label.metrics');
-            var context = {};
-            if (ctxArgs && ctxArgs.hasOwnProperty('context')) {
-                context = ctxArgs.context;
-            }
-
-            if (args.resource == 'zones') {
-                metricsLabel = _l('label.zones') + ' ' + metricsLabel;
-                metricsListView = cloudStack.sections.metrics.zones.listView;
-
-            } else if (args.resource == 'clusters') {
-                metricsLabel = _l('label.clusters') + ' ' + metricsLabel;
-                metricsListView = cloudStack.sections.metrics.clusters.listView;
-
-            } else if (args.resource == 'hosts') {
-                metricsLabel = _l('label.hosts') + ' ' + metricsLabel;
-                metricsListView = cloudStack.sections.metrics.hosts.listView;
-
-                if (context && !context.filterBy) {
-                    if (context.hasOwnProperty('clusters') && context.clusters[0]) {
-                        context.filterBy = 'clusterid';
-                        context.id = context.clusters[0].id;
-                    }
-                    if (context.hasOwnProperty('instances') && context.instances[0]) {
-                        context.filterBy = 'virtualmachineid';
-                        context.id = context.instances[0].id;
-                    }
-                }
-            } else if (args.resource == 'storagepool') {
-                metricsLabel = _l('label.primary.storage') + ' ' + metricsLabel;
-                metricsListView = cloudStack.sections.metrics.storagepool.listView;
-
-            } else if (args.resource == 'vms') {
-                metricsLabel = _l('label.instances') + ' ' + metricsLabel;
-                metricsListView = cloudStack.sections.metrics.instances.listView;
-                metricsListView.advSearchFields = cloudStack.sections.instances.listView.advSearchFields;
-
-                if (context && !context.filterBy) {
-                    if (context.hasOwnProperty('hosts') && context.hosts[0]) {
-                        context.filterBy = 'hostid';
-                        context.id = context.hosts[0].id;
-                    }
-                }
-            } else if (args.resource == 'volumes') {
-                metricsLabel = _l('label.volumes') + ' ' + metricsLabel;
-                metricsListView = cloudStack.sections.metrics.volumes.listView;
-                metricsListView.advSearchFields = cloudStack.sections.storage.sections.volumes.listView.advSearchFields;
-                metricsListView.groupableColumns = false;
-
-                if (context && !context.filterBy) {
-                    if (context.hasOwnProperty('instances') && context.instances[0]) {
-                        context.filterBy = 'virtualmachineid';
-                        context.id = context.instances[0].id;
-                    }
-                    if (context.hasOwnProperty('primarystorages') && context.primarystorages[0]) {
-                        context.filterBy = 'storageid';
-                        context.id = context.primarystorages[0].id;
-                    }
-                }
-            }
-
-            if (context.metricsFilterData) {
-                delete context.metricsFilterData;
-            }
-
-            if (context.filterBy) {
-                context.metricsFilterData = {
-                    key: context.filterBy,
-                    value: context.id
-                };
-            }
-
-            // list view refresh button
-            metricsListView.actions = {
-                refreshMetrics: {
-                    label: 'label.refresh',
-                    isHeader: true,
-                    addRow: true,
-                    action: {
-                        custom: function (args) {
-                            return function() {
-                            };
-                        }
-                    }
-                }
-            };
-
-            metricsListView.hideSearchBar = false;
-            metricsListView.needsRefresh = true;
-            metricsListView.noSplit = true;
-            metricsListView.horizontalOverflow = true;
-            metricsListView.groupableColumns = true;
-
-            if (args.resource != 'vms' && args.resource != 'volumes' && args.resource != 'zones') {
-                metricsListView.advSearchFields = {
-                    name: {
-                        label: 'label.name'
-                    },
-                    zoneid: {
-                        label: 'label.zone',
-                        select: function(args) {
-                            $.ajax({
-                                url: createURL('listZones'),
-                                data: {
-                                    listAll: true
-                                },
-                                success: function(json) {
-                                    var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
-
-                                    args.response.success({
-                                        data: $.map(zones, function(zone) {
-                                            return {
-                                                id: zone.id,
-                                                description: zone.name
-                                            };
-                                        })
-                                    });
-                                }
-                            });
-                        }
-                    }
-                };
-            }
-
-            var $browser = $('#browser .container');
-            return $browser.cloudBrowser('addPanel', {
-                  title: metricsLabel,
-                  maximizeIfSelected: true,
-                  complete: function($newPanel) {
-                      $newPanel.listView({
-                          $browser: $browser,
-                          context: context,
-                          listView: metricsListView
-                      });
-                      // Make metrics tables horizontally scrollable
-                      $newPanel.find('.list-view').css({'overflow-x': 'visible'});
-                      // Refresh metrics when refresh button is clicked
-                      $newPanel.find('.refreshMetrics').click(function() {
-                          var sortedTh = $newPanel.find('table thead tr:last th.sorted');
-                          var thIndex = sortedTh.index();
-                          var thClassName = null;
-                          var wasSorted = false;
-                          var sortClassName = 'asc';
-                          if (sortedTh && sortedTh.hasClass('sorted')) {
-                              wasSorted = true;
-                              var classes = sortedTh.attr('class').split(/\s+/);
-                              thClassName = classes[0];
-                              if (classes.indexOf('desc') > -1) {
-                                  sortClassName = 'desc';
-                              }
-                          }
-                          $browser.cloudBrowser('removeLastPanel', {});
-                          var refreshedPanel = cloudStack.uiCustom.metricsView(args)(ctxArgs);
-                          if (wasSorted && thClassName) {
-                              refreshedPanel.find('th.' + thClassName).filter(function() {
-                                  return $(this).index() == thIndex;
-                              }).addClass('sorted').addClass(sortClassName);
-                          }
-                      });
-
-                      var browseBy = metricsListView.browseBy;
-                      if (browseBy) {
-                          $newPanel.bind('click', function(event) {
-                              event.stopPropagation();
-                              var $target = $(event.target);
-                              var id = $target.closest('tr').data('list-view-item-id');
-                              var jsonObj = $target.closest('tr').data('jsonObj');
-                              if (browseBy.filterKey && jsonObj) {
-                                  if (jsonObj.hasOwnProperty(browseBy.filterKey)) {
-                                      id = jsonObj[browseBy.filterKey];
-                                  } else {
-                                      return; // return if provided key is missing
-                                  }
-                              }
-                              if (id && ($target.hasClass('first') || $target.parent().hasClass('first')) && ($target.is('td') || $target.parent().is('td'))) {
-                                  context.id = id;
-                                  context.filterBy = browseBy.filterBy;
-                                  ctxArgs.context = context;
-                                  cloudStack.uiCustom.metricsView({resource: browseBy.resource})(ctxArgs);
-                              }
-                          });
-                      }
-                  }
-            });
-        };
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui-custom/migrate.js b/ui/legacy/scripts/ui-custom/migrate.js
deleted file mode 100644
index 40a6d41..0000000
--- a/ui/legacy/scripts/ui-custom/migrate.js
+++ /dev/null
@@ -1,129 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.migrate = function(args) {
-        var listView = args.listView;
-        var action = args.action;
-
-        return function(args) {
-            var context = args.context;
-
-            var hostList = function(args) {
-                var $listView;
-
-                var hosts = $.extend(true, {}, args.listView, {
-                    context: context,
-                    uiCustom: true
-                });
-
-                hosts.listView.actions = {
-                    select: {
-                        label: _l('label.select.host'),
-                        type: 'radio',
-                        action: {
-                            uiCustom: function(args) {
-                                var $item = args.$item;
-                                var $input = $item.find('td.actions input:visible');
-
-                                if ($input.attr('type') == 'checkbox') {
-                                    if ($input.is(':checked'))
-                                        $item.addClass('multi-edit-selected');
-                                    else
-                                        $item.removeClass('multi-edit-selected');
-                                } else {
-                                    $item.siblings().removeClass('multi-edit-selected');
-                                    $item.addClass('multi-edit-selected');
-                                }
-                            }
-                        }
-                    }
-                };
-
-                $listView = $('<div>').listView(hosts);
-
-                // Change action label
-                $listView.find('th.actions').html(_l('label.select'));
-
-                return $listView;
-            };
-
-            var $dataList = hostList({
-                listView: listView
-            }).dialog({
-                dialogClass: 'multi-edit-add-list panel migrate-vm-available-host-list',
-                width: 825,
-                draggable: false,
-                title: _l('label.migrate.instance.to.host'),
-                buttons: [{
-                    text: _l('label.ok'),
-                    'class': 'ok migrateok',
-                    click: function() {
-                        var complete = args.complete;
-                        var selectedHostObj = $dataList.find('tr.multi-edit-selected').data('json-obj');
-                        if(selectedHostObj != undefined) {
-                            $dataList.fadeOut(function() {
-                                action({
-                                    context: $.extend(true, {}, context, {
-                                        selectedHost: [
-                                            selectedHostObj
-                                        ]
-                                    }),
-                                    response: {
-                                        success: function(args) {
-                                            complete({
-                                                _custom: args._custom,
-                                                $item: $('<div>'),
-                                            });
-                                        },
-                                        error: function(args) {
-                                            cloudStack.dialog.notice({
-                                                message: args
-                                            });
-                                        }
-                                    }
-                                });
-                            });
-
-                            $('div.overlay').fadeOut(function() {
-                                $('div.overlay').remove();
-                                $(':ui-dialog').dialog('destroy');
-                            });
-                        }
-                        else {
-                            cloudStack.dialog.notice({
-                                message: _l('message.migrate.instance.select.host')
-                            });
-                        }
-                    }
-                }, {
-                    text: _l('label.cancel'),
-                    'class': 'cancel migratecancel',
-                    click: function() {
-                        $dataList.fadeOut(function() {
-                            $dataList.remove();
-                        });
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                            $(':ui-dialog').dialog('destroy');
-                        });
-                    }
-                }]
-            });
-            cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dataList);
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/physicalResources.js b/ui/legacy/scripts/ui-custom/physicalResources.js
deleted file mode 100644
index d0aaaf9..0000000
--- a/ui/legacy/scripts/ui-custom/physicalResources.js
+++ /dev/null
@@ -1,270 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.physicalResources = function(args) {
-        var listView = function(targetID) {
-            var target = args.sections.physicalResources.listView[targetID];
-            var listViewArgs = $.isFunction(target) ? target() : target;
-
-            return $('<div>').listView(
-                (listViewArgs.listView || listViewArgs.sections) ? listViewArgs : {
-                    listView: listViewArgs
-                }
-            );
-        };
-        var $dashboard = $('#template').find('.system-dashboard-view').clone();
-        var getData = function() {
-            // Populate data
-            $dashboard.find('[data-item]').hide();
-            cloudStack.sections.system.dashboard.dataProvider({
-                response: {
-                    success: function(args) {
-                        var data = args.data;
-                        $.each(data, function(key, value) {
-                            var $elem = $dashboard.find('[data-item=' + key + ']');
-                            $elem.hide().html(value).fadeIn();
-                        });
-
-                        // Socket info
-                        var $socketInfo = $dashboard.find('.socket-info ul');
-                        $socketInfo.find('li').remove(); // Clean up
-                        $(args.data.socketInfo).each(function() {
-                            var item = this;
-                            var name = item.name;
-                            var hosts = item.hosts;
-                            var sockets = item.sockets;
-
-                            var $li = $('<li>').append(
-                                $('<div>').addClass('name').html(name),
-                                $('<div>').addClass('hosts').append(
-                                    $('<div>').addClass('title').html(_l('label.hosts')),
-                                    $('<div>').addClass('value').html(hosts)
-                                ),
-                                $('<div>').addClass('sockets').append(
-                                    $('<div>').addClass('title').html(_l('label.sockets')),
-                                    $('<div>').addClass('value').html(sockets)
-                                )
-                            );
-
-                            $li.appendTo($socketInfo);
-                        });
-                    }
-                }
-            });
-        };
-        var resourceChart = function(args) {
-            getData();
-            return $dashboard
-                .click(function(event) {
-                    var $target = $(event.target);
-                    if ($target.closest('[view-all-target]').length) {
-                        var targetID = $target.closest('[view-all-target]').attr('view-all-target');
-                        args.$browser.cloudBrowser('addPanel', {
-                            title: $target.closest('[view-all-title]').attr('view-all-title'),
-                            data: '',
-                            noSelectPanel: true,
-                            maximizeIfSelected: true,
-                            complete: function($newPanel) {
-                                listView(targetID).appendTo($newPanel);
-                            }
-                        });
-                    }
-                });
-        };
-        $(window).bind('cloudStack.fullRefresh cloudStack.updateResources', function() {
-            if ($dashboard.is(':visible')) {
-                getData();
-            }
-        });
-        return function(args) {
-            $dashboard.find('#update_ssl_button').click(function() {
-                cloudStack.dialog.createForm({
-                    form: {
-                        title: 'label.update.ssl',
-                        desc: 'message.update.ssl',
-                        preFilter: function (args) {
-                            var $form = args.$form;
-
-                            // insert the "Add intermediate certificate" button
-                            var $addButton = $('<div>')
-                                .addClass('add ui-button')
-                                .append(
-                                    $('<span>').html(_l('label.add.intermediate.certificate'))
-                                );
-                            var $servercertificate = $form.find('.form-item[rel=certificate]');
-                            $addButton.insertBefore($servercertificate);
-                            var count = 0;
-                            var $intermediatecertificate = $form.find('.form-item[rel=intermediatecertificate]');
-
-                            $addButton.click(function() {
-                                // clone the template intermediate certificate and make it visible
-                                var $newcertificate = $intermediatecertificate.clone().attr('id','intermediate'+count);
-                                $newcertificate.insertBefore($addButton);
-                                $newcertificate.css('display', 'inline-block');
-                                $newcertificate.addClass('sslcertificate');
-                                count++;
-                                // change label
-                                var $label = $newcertificate.find('label');
-                                $label.html($label.html().replace('{0}', count)); // 'Intermediate certificate ' + count + ':'
-                            });
-                        },
-                        fields: {
-                            rootcertificate: {
-                                label: 'label.root.certificate',
-                                isTextarea: true,
-                                validation: { required: true }
-                            },
-                            intermediatecertificate: { // this is the template 'intermediate certificate', always hidden
-                                label: 'label.intermediate.certificate',
-                                isTextarea: true,
-                                isHidden: true
-                            },
-                            certificate: {
-                                label: 'label.certificate',
-                                isTextarea: true,
-                                validation: { required: true }
-                            },
-                            privatekey: {
-                                label: 'label.privatekey',
-                                isTextarea: true,
-                                validation: { required: true }
-                            },
-                            domainsuffix: {
-                                label: 'label.domain.suffix',
-                                validation: { required: true }
-                            }
-                        }
-                    },
-                    after: function(args) {
-                        var $loading = $('<div>').addClass('loading-overlay');
-                        $('.system-dashboard-view:visible').prepend($loading);
-
-                        // build a list with all certificates that need to be uploaded
-                        var certificates = [];
-                        certificates.push(args.data.rootcertificate);
-                        if ($.isArray(args.data.intermediatecertificate))
-                        {
-                            $.merge(certificates, args.data.intermediatecertificate);
-                        }
-                        else
-                        {
-                            certificates.push(args.data.intermediatecertificate);
-                        }
-                        certificates.push(args.data.certificate);
-
-                        // Recursively uploads certificates.
-                        // When the upload succeeds, proceeds to uploading the next certificate.
-                        // When the upload fails, stops and reports failure.
-                        var uploadCertificate = function(index) {
-                            if (index >=  certificates.length)
-                            {
-                                return;
-                            }
-                            if ( !$.trim(certificates[index])) // skip empty certificate
-                            {
-                                uploadCertificate(index + 1);
-                                return;
-                            }
-
-                            // build certificate data
-                            var certificateData = {
-                                id: index + 1, // id start from 1
-                                certificate: certificates[index],
-                                domainsuffix: args.data.domainsuffix
-                            };
-                            switch (index) {
-                                case (0): //first certificate is the root certificate
-                                    certificateData['name'] = 'root';
-                                    break;
-                                case (certificates.length - 1): // last certificate is the server certificate
-                                    certificateData['privatekey'] = args.data.privatekey;
-                                    break;
-                                default: // intermediate certificates
-                                    certificateData['name'] = 'intermediate' + index;
-                            }
-
-                            $.ajax({
-                                type: "POST",
-                                url: createURL('uploadCustomCertificate'),
-                                data:  certificateData,
-                                dataType: 'json',
-                                success: function(json) {
-                                    var jid = json.uploadcustomcertificateresponse.jobid;
-                                    var uploadCustomCertificateIntervalID = setInterval(function() {
-                                        $.ajax({
-                                            url: createURL("queryAsyncJobResult&jobId=" + jid),
-                                            dataType: "json",
-                                            success: function(json) {
-                                                var result = json.queryasyncjobresultresponse;
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                    clearInterval(uploadCustomCertificateIntervalID);
-                                                    if (result.jobstatus == 1) {
-                                                        if (index ==  certificates.length - 1) // last one, report success
-                                                        {
-                                                            cloudStack.dialog.notice({
-                                                                message: 'message.update.ssl.succeeded'
-                                                            });
-                                                            $loading.remove();
-                                                        }
-                                                        else // upload next certificate
-                                                        {
-                                                            uploadCertificate(index + 1);
-                                                        }
-                                                    } else if (result.jobstatus == 2) {
-                                                        cloudStack.dialog.notice({
-                                                            message: _l('message.update.ssl.failed') + ' ' + _s(result.jobresult.errortext)
-                                                        });
-                                                        $loading.remove();
-                                                    }
-                                                }
-                                            },
-                                            error: function(XMLHttpResponse) {
-                                                cloudStack.dialog.notice({
-                                                    message: _l('message.update.ssl.failed') + ' ' + parseXMLHttpResponse(XMLHttpResponse)
-                                                });
-                                                $loading.remove();
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                },
-                                error: function(XMLHttpResponse) {
-                                    cloudStack.dialog.notice({
-                                        message: _l('message.update.ssl.failed') + ' ' + parseXMLHttpResponse(XMLHttpResponse)
-                                    });
-                                    $loading.remove();
-                                }
-                            });
-                            return;
-                        };
-
-                        // start uploading the certificates
-                        uploadCertificate(0);
-                    },
-                    context: {}
-                });
-                return false;
-            });
-            $dashboard.find('#refresh_button').click(function() {
-                getData();
-                return false;
-            });
-            return resourceChart(args);
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/pluginListing.js b/ui/legacy/scripts/ui-custom/pluginListing.js
deleted file mode 100644
index 357d676..0000000
--- a/ui/legacy/scripts/ui-custom/pluginListing.js
+++ /dev/null
@@ -1,129 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// the License.  You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    var elems = {
-        pluginItem: function(args) {
-            var id = args.id;
-            var title = args.title;
-            var desc = args.desc;
-            var iconURL = args.iconURL;
-            var $pluginItem = $('<li>').addClass('plugin-item').addClass(id);
-            var $title = $('<span>').addClass('title').html(title);
-            var $desc = $('<span>').addClass('desc').html(desc);
-            var $icon = $('<span>').addClass('icon').append(
-                $('<img>').attr({
-                    src: iconURL
-                })
-            );
-
-            $pluginItem.append(
-                $icon, $title, $desc
-            );
-
-            return $pluginItem;
-        },
-        pluginListing: function(args) {
-            var plugins = args.plugins;
-            var $plugins = $('<ul>');
-            var $pluginsListing = $('<div>').addClass('plugins-listing');
-
-            $(plugins).each(function() {
-                var plugin = this;
-                var $plugin = elems.pluginItem({
-                    id: plugin.id,
-                    title: plugin.title,
-                    desc: plugin.desc,
-                    iconURL: 'plugins/' + plugin.id + '/icon.png'
-                });
-                var $browser = $('#browser .container');
-
-                $plugin.click(function() {
-                    var $mainSection = $('#navigation ul li').filter('.' + plugin.id);
-
-                    if ($mainSection.length) {
-                        $mainSection.click();
-
-                        return;
-                    }
-
-                    $browser.cloudBrowser('addPanel', {
-                        title: plugin.title,
-                        $parent: $('.panel:first'),
-                        complete: function($panel) {
-                            $panel.detailView({
-                                name: 'Plugin details',
-                                tabs: {
-                                    details: {
-                                        title: 'label.plugin.details',
-                                        fields: [{
-                                            name: {
-                                                label: 'label.name'
-                                            }
-                                        }, {
-                                            desc: {
-                                                label: 'label.description'
-                                            },
-                                            externalLink: {
-                                                isExternalLink: true,
-                                                label: 'label.external.link'
-                                            }
-                                        }, {
-                                            authorName: {
-                                                label: 'label.author.name'
-                                            },
-                                            authorEmail: {
-                                                label: 'label.author.email'
-                                            },
-                                            id: {
-                                                label: 'label.id'
-                                            }
-                                        }],
-                                        dataProvider: function(args) {
-                                            args.response.success({
-                                                data: plugin
-                                            });
-                                        }
-                                    }
-                                }
-                            });
-                        }
-                    });
-                });
-
-                $plugin.appendTo($plugins);
-            });
-
-            $pluginsListing.append($plugins);
-
-            return $pluginsListing;
-        }
-    };
-
-    cloudStack.uiCustom.pluginListing = function() {
-        var plugins = cloudStack.plugins;
-
-        return elems.pluginListing({
-            plugins: $(plugins).map(function(index, pluginID) {
-                var plugin = cloudStack.plugins[pluginID].config;
-
-                return $.extend(plugin, {
-                    id: pluginID
-                });
-            })
-        });
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/projectSelect.js b/ui/legacy/scripts/ui-custom/projectSelect.js
deleted file mode 100644
index d1e9153..0000000
--- a/ui/legacy/scripts/ui-custom/projectSelect.js
+++ /dev/null
@@ -1,86 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    $(window).bind('cloudStack.ready', function() {
-        var $header = $('#header .controls');
-        var $projectSwitcher = $('<div>').addClass('project-switcher');
-        var $projectSelect = $('<select>').append(
-            $('<option>').attr('value', '-1').html(_l('Default view'))
-        );
-        var $label = $('<label>').html(_l('label.project'));
-
-        var populateProjectSelect = function() {
-            // Get project list
-            cloudStack.projects.dataProvider({
-                context: cloudStack.context,
-                response: {
-                    success: function(args) {
-                        var projects = args.data;
-                        var arrayOfProjs = [];
-
-                        $(projects).map(function(index, project) {
-                            var proj = {id: _s(project.id), html: _s(project.displaytext ? project.displaytext : project.name)};
-                            arrayOfProjs.push(proj);
-                        });
-
-                        arrayOfProjs.sort(function(a,b) {
-                            return a.html.localeCompare(b.html);
-                        });
-
-                        $(arrayOfProjs).map(function(index, project) {
-                            var $option = $('<option>').val(_s(project.id));
-
-                            $option.html(_s(project.html));
-                            $option.appendTo($projectSelect);
-                        });
-                    },
-                    error: function() {}
-                }
-            });
-        }
-
-        $projectSwitcher.append($label, $projectSelect);
-        $projectSwitcher.insertBefore($header.find('.region-switcher'));
-
-        // Change project event
-        $projectSelect.change(function() {
-            var projectID = $projectSelect.val();
-
-            if (projectID != -1) {
-                cloudStack.context.projects = [{
-                    id: projectID
-                }];
-
-                cloudStack.uiCustom.projects({
-                    alreadySelected: true
-                });
-            } else {
-                cloudStack.context.projects = null;
-                $('#cloudStack3-container').removeClass('project-view');
-                $('#navigation li.dashboard').click();
-            }
-        });
-
-        $projectSelect.mousedown(function() {
-           var projectID = $projectSelect.val();
-           $('.project-switcher option:not(:first)').remove();
-           populateProjectSelect();
-           $projectSelect.val(projectID);
-        });
-    });
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/projects.js b/ui/legacy/scripts/ui-custom/projects.js
deleted file mode 100644
index efffd2a..0000000
--- a/ui/legacy/scripts/ui-custom/projects.js
+++ /dev/null
@@ -1,797 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    var pageElems = cloudStack.uiCustom.projectsTabs = {
-        /**
-         * User management multi-edit
-         */
-        userManagement: function(args) {
-            var multiEdit = !args.useInvites ?
-                cloudStack.projects.addUserForm :
-                cloudStack.projects.inviteForm;
-
-            var $multi = $('<div>').multiEdit($.extend(true, {}, multiEdit, {
-                context: args.context
-            }));
-
-            if (args.useInvites) {
-                var $fields = $multi.find('form table').find('th, td');
-                var $accountFields = $fields.filter(function() {
-                    return $(this).hasClass('account');
-                });
-                var $emailFields = $fields.filter(function() {
-                    return $(this).hasClass('email');
-                });
-
-                $multi.prepend(
-                    $('<div>').addClass('add-by')
-                    .append($('<span>').html(_l('label.add.by') + ':'))
-                    .append(
-                        $('<div>').addClass('selection')
-                        .append(
-                            $('<input>').attr({
-                                type: 'radio',
-                                name: 'add-by',
-                                checked: 'checked'
-                            }).click(function() {
-                                $accountFields.show();
-                                $emailFields.hide();
-                                $emailFields.find('input').val('');
-
-                                return true;
-                            }).click()
-                        )
-                        .append($('<label>').html(_l('label.account')))
-                        .append(
-                            $('<input>').attr({
-                                type: 'radio',
-                                name: 'add-by'
-                            }).click(function() {
-                                $accountFields.hide();
-                                $accountFields.find('input').val('');
-                                $emailFields.show();
-
-                                return true;
-                            })
-                        )
-                        .append($('<label>').html(_l('label.email')))
-                    )
-                );
-            }
-
-            return $multi;
-        },
-
-        dashboardTabs: {
-            overview: function() {
-                var $dashboard = $('#template').find('.project-dashboard-view').clone();
-                $dashboard.data('tab-title', _l('label.menu.dashboard'));
-
-                var getData = function() {
-                    // Populate data
-                    $dashboard.find('[data-item]').hide();
-                    var $loading = $('<div>').addClass('loading-overlay').prependTo($dashboard);
-                    cloudStack.projects.dashboard({
-                        response: {
-                            success: function(args) {
-                                $loading.remove();
-                                var data = args.data;
-
-                                // Iterate over data; populate corresponding DOM elements
-                                $.each(data, function(key, value) {
-                                    var $elem = $dashboard.find('[data-item=' + key + ']');
-
-                                    // This assumes an array of data
-                                    if ($elem.is('ul')) {
-                                        $elem.show();
-                                        var $liTmpl = $elem.find('li').remove();
-                                        $(value).each(function() {
-                                            var item = this;
-                                            var $li = $liTmpl.clone().appendTo($elem).hide();
-
-                                            $.each(item, function(arrayKey, arrayValue) {
-                                                var $arrayElem = $li.find('[data-list-item=' + arrayKey + ']');
-
-                                                $arrayElem.text(_s(arrayValue));
-                                                $arrayElem.attr('title', _s(arrayValue));
-                                            });
-
-                                            $li.attr({
-                                                title: item.description
-                                            });
-
-                                            $li.fadeIn();
-                                        });
-                                    } else {
-                                        $elem.each(function() {
-                                            var $item = $(this);
-                                            if ($item.hasClass('chart-line')) {
-                                                $item.show().animate({
-                                                    width: value + '%'
-                                                });
-                                            } else {
-                                                $item.hide().html(_s(value)).fadeIn();
-                                            }
-                                        });
-                                    }
-                                });
-                            }
-                        }
-                    });
-                };
-
-                getData();
-
-                $dashboard.find('.button.manage-resources').click(function() {
-                    $('.navigation-item.network').click();
-                });
-
-                $dashboard.find('.info-box.events .button').click(function() {
-                    $('.navigation-item.events').click();
-                });
-
-                return $dashboard;
-            },
-
-            users: function() {
-                return $('<div>').addClass('management').data('tab-title', _l('label.menu.accounts'));
-            },
-
-            invitations: function() {
-                return $('<div>').addClass('management-invite').data('tab-title', _l('label.invitations'));
-            },
-
-            resources: function(options) {
-                if (!options) options = {};
-
-                var $resources = $('<div>').addClass('resources').data('tab-title', _l('label.resources'));
-                var $form = $('<form>');
-                var $submit = $('<input>').attr({
-                    type: 'submit'
-                }).val(_l('label.apply'));
-
-                cloudStack.projects.resourceManagement.dataProvider({
-                    response: {
-                        success: function(args) {
-                            $(args.data).each(function() {
-                                var resource = this;
-                                var $field = $('<div>').addClass('field');
-                                var $label = $('<label>').attr({
-                                    'for': resource.type
-                                }).html(_s(resource.label));
-                                var $input = $('<input>').attr({
-                                    type: 'text',
-                                    name: resource.type,
-                                    value: resource.value,
-                                    id: resource.type
-                                }).addClass('required');
-
-                                $field.append($label, $input);
-                                $field.appendTo($form);
-                            });
-
-                            $form.validate();
-                            $form.submit(function() {
-                                if (!$form.valid) {
-                                    return false;
-                                }
-
-                                var $loading = $('<div>').addClass('loading-overlay').appendTo($form);
-
-                                cloudStack.projects.resourceManagement.update({
-                                    data: cloudStack.serializeForm($form),
-                                    response: {
-                                        success: function(args) {
-                                            $loading.remove();
-                                            $('.notifications').notifications('add', {
-                                                section: 'dashboard',
-                                                desc: 'label.update.project.resources',
-                                                interval: 1000,
-                                                poll: function(args) {
-                                                    args.complete();
-                                                }
-                                            });
-                                        }
-                                    }
-                                }, options.projectID);
-
-                                return false;
-                            });
-
-                            $submit.appendTo($form);
-                            $form.appendTo($resources);
-                        }
-                    }
-                }, options.projectID);
-
-                return $resources;
-            }
-        },
-
-        /**
-         * Projects dashboard
-         */
-        dashboard: function() {
-            var tabs = {
-                dashboard: pageElems.dashboardTabs.overview
-            };
-
-            // Only show management tabs to owner of project
-            if (isAdmin() || isDomainAdmin() || (
-                cloudStack.context.projects &&
-                (cloudStack.context.projects[0].account == cloudStack.context.users[0].account)
-            )) {
-                tabs.users = pageElems.dashboardTabs.users;
-
-                if (g_capabilities.projectinviterequired) {
-                    tabs.invitations = pageElems.dashboardTabs.invitations;
-                }
-
-                if (isAdmin() || isDomainAdmin()) {
-                    tabs.resources = pageElems.dashboardTabs.resources;
-                }
-            }
-
-            var $tabs = $('<div>').addClass('tab-content').append($('<ul>'));
-            var $toolbar = $('<div>').addClass('toolbar');
-
-            // Make UI tabs
-            $.each(tabs, function(tabName, tab) {
-                var $tab = $('<li>').appendTo($tabs.find('ul:first'));
-                var $tabContent = tab();
-                var $tabLink = $('<a>')
-                    .attr({
-                        href: '#project-view-dashboard-' + tabName
-                    })
-                    .html($tabContent.data('tab-title'))
-                    .appendTo($tab);
-                var $content = $('<div>')
-                    .appendTo($tabs)
-                    .attr({
-                        id: 'project-view-dashboard-' + tabName
-                    })
-                    .append($tabContent);
-            });
-
-            $tabs.find('ul li:first').addClass('first');
-            $tabs.find('ul li:last').addClass('last');
-
-            $tabs.bind('tabsactivate', function(event, ui) {
-                var $panel = $(ui.newPanel);
-                var $management = $panel.find('.management');
-                var $managementInvite = $panel.find('.management-invite');
-
-                if ($management.length) {
-                    $management.children().remove();
-                    $management.append(pageElems.userManagement({
-                        context: cloudStack.context
-                    }));
-
-                    return true;
-                }
-
-                if ($managementInvite.length) {
-                    $managementInvite.children().remove();
-                    $managementInvite.append(pageElems.userManagement({
-                        context: cloudStack.context,
-                        useInvites: true
-                    }));
-                }
-
-                return true;
-            });
-
-            return $('<div>').addClass('project-dashboard')
-                .append($.merge(
-                    $toolbar,
-                    $tabs.tabs()
-                ));
-        },
-
-        /**
-         * Add new project flow
-         */
-        newProjectForm: function() {
-            var $newProject = $('<div>').addClass('new-project');
-            $newProject.append($('<div>').addClass('title').html(_l('label.create.project')));
-
-            var $form = $('<form>');
-            var $formDesc = $('<div>').addClass('form-desc');
-            var $projectName = $('<div>').addClass('field name')
-                .append($('<label>').attr('for', 'project-name').html(_l('label.project.name')))
-                .append($('<input>').addClass('required disallowSpecialCharacters').attr({
-                    type: 'text',
-                    name: 'project-name',
-                    id: 'project-name'
-                }));
-            var $projectDesc = $('<div>').addClass('field desc')
-                .append($('<label>').attr('for', 'project-desc').html(_l('label.display.text')))
-                .append($('<input>').addClass('disallowSpecialCharacters').attr({
-                    type: 'text',
-                    name: 'project-display-text',
-                    id: 'project-desc'
-                }));
-            var $submit = $('<input>').attr({
-                type: 'submit'
-            }).val(_l('label.create.project'));
-            var $cancel = $('<div>').addClass('button cancel').html(_l('label.cancel'));
-            var $loading = $('<div>').addClass('loading-overlay');
-
-            // Form events/validation
-            $form.validate();
-            $form.submit(function() {
-                if (!$form.valid()) return false;
-
-                $form.prepend($loading);
-
-                cloudStack.projects.add({
-                    context: cloudStack.context,
-                    data: cloudStack.serializeForm($form),
-                    response: {
-                        success: function(args) {
-                            var project = args.data;
-                            var $projectSwitcher = $('div.project-switcher');
-
-                            $(window).trigger('cloudStack.fullRefresh');
-
-                            // dynamically add newly created project into project switcher
-                            $projectSwitcher.find('select').append(
-                                $('<option>').val(project.id).html(project.name)
-                            );
-
-                            $loading.remove();
-
-                            // Confirmation
-                            $form.replaceWith(function() {
-                                var $confirm = $('<div>').addClass('confirm');
-
-                                // Update title with project name
-                                $newProject.find('.title').html(_s(args.data.name));
-
-                                // Show field data
-                                $confirm.append($projectName).find('input').replaceWith( // Name
-                                    $('<span>').addClass('value').html(_s(
-                                        args.data.name
-                                    ))
-                                );
-                                $confirm.append($projectDesc).find('input').replaceWith( // Display text
-                                    $('<span>').addClass('value').html(_s(
-                                        args.data.displayText
-                                    ))
-                                );
-
-                                var $buttons = $('<div>').addClass('buttons');
-                                var $addAccountButton = $('<div>').addClass('button confirm').html(_l('label.add.accounts'));
-
-                                $addAccountButton.click(function() {
-                                    // Show add user form
-                                    $confirm.replaceWith(function() {
-                                        var $userManagement = pageElems.userManagement({
-                                            context: $.extend(true, {}, cloudStack.context, {
-                                                projects: [project]
-                                            }),
-                                            useInvites: cloudStack.projects.requireInvitation()
-                                        });
-                                        var $nextButton = $('<div>').addClass('button confirm next').html(_l('label.next'));
-
-                                        $newProject.find('.title').html(
-                                            cloudStack.projects.requireInvitation() ?
-                                            _l('label.invite.to') + ' ' + _s(args.data.name) :
-                                            _l('label.add.accounts.to') + ' ' + _s(args.data.name)
-                                        );
-                                        $nextButton.appendTo($userManagement).click(function() {
-                                            $newProject.find('.title').html(_l('label.review'));
-                                            $userManagement.replaceWith(function() {
-                                                var $review = $('<div>').addClass('review');
-                                                var $projectData = $('<div>').addClass('project-data');
-
-                                                // Basic project data
-                                                $review.append($projectData);
-                                                $projectData.append($projectName).find('input').replaceWith( // Name
-                                                    $('<span>').addClass('value').html(_s(
-                                                        args.data.name
-                                                    ))
-                                                );
-                                                $projectData.append($projectDesc).find('input').replaceWith( // Display text
-                                                    $('<span>').addClass('value').html(_s(
-                                                        args.data.displayText
-                                                    ))
-                                                );
-
-                                                // User/resouce tabs
-                                                var $tabs = $('<div>').addClass('tabs resources').appendTo($review);
-                                                var $ul = $('<ul>').appendTo($tabs)
-                                                    .append(
-                                                        // Users tab
-                                                        $('<li>').addClass('first').append(
-                                                            $('<a>').attr({
-                                                                href: '#new-project-review-tabs-users'
-                                                            }).html(
-                                                                cloudStack.projects.requireInvitation() ?
-                                                                _l('label.invitations') : _l('label.accounts')
-                                                            )
-                                                        )
-                                                );
-
-                                                if (isAdmin() || isDomainAdmin()) {
-                                                    $ul.append(
-                                                        // Resources tab
-                                                        $('<li>').addClass('last').append(
-                                                            $('<a>').attr({
-                                                                href: '#new-project-review-tabs-resouces'
-                                                            }).html(_l('label.resources'))
-                                                        )
-                                                    );
-                                                }
-
-                                                var $users = $('<div>').attr({
-                                                    id: 'new-project-review-tabs-users'
-                                                }).appendTo($tabs);
-                                                cloudStack.context.projects = [project];
-
-                                                var $resources;
-                                                if (isAdmin() || isDomainAdmin()) {
-                                                    $resouces = $('<div>')
-                                                        .attr({
-                                                            id: 'new-project-review-tabs-resouces'
-                                                        })
-                                                        .appendTo($tabs)
-                                                        .append(pageElems.dashboardTabs.resources);
-                                                }
-
-                                                $tabs.tabs();
-
-                                                $users.listView({
-                                                    listView: {
-                                                        id: 'project-accounts',
-                                                        disableInfiniteScrolling: true,
-                                                        fields: !cloudStack.projects.requireInvitation() ? {
-                                                            username: {
-                                                                label: _l('label.account')
-                                                            }
-                                                        } : {
-                                                            account: {
-                                                                label: _l('label.invited.accounts')
-                                                            }
-                                                        },
-                                                        dataProvider: function(args) {
-                                                            setTimeout(function() {
-                                                                args.response.success({
-                                                                    data: $.map($userManagement.find('.data-item tr'), function(elem) {
-                                                                        // Store previous user data in list table
-                                                                        return !cloudStack.projects.requireInvitation() ? {
-                                                                            username: $(elem).find('td.username span').html()
-                                                                        } : {
-                                                                            account: $(elem).find('td.account span').html()
-                                                                        };
-                                                                    })
-                                                                });
-                                                            }, 0);
-                                                        }
-                                                    }
-                                                });
-
-                                                // Save button
-                                                var $saveButton = $nextButton.clone().appendTo($review);
-                                                $saveButton.html(_l('label.save'));
-                                                $saveButton.click(function() {
-                                                    $('#new-project-review-tabs-resouces').find('form').submit();
-                                                    $('.ui-dialog, .overlay').remove();
-                                                });
-
-                                                $laterButton.click(function() {
-                                                    $(':ui-dialog, .overlay').remove();
-
-                                                    return false;
-                                                });
-
-                                                return $review;
-                                            });
-
-                                            $(':ui-dialog').dialog('option', 'position', 'center');
-                                        });
-                                        $laterButton.html(_l('label.close')).appendTo($userManagement);
-
-                                        return $userManagement;
-                                    });
-
-                                    $(':ui-dialog').dialog('option', 'position', 'center');
-
-                                    return false;
-                                });
-
-                                var $laterButton = $('<div>').addClass('button later').html(_l('label.remind.later'));
-                                $laterButton.click(function() {
-                                    $(':ui-dialog, .overlay').remove();
-
-                                    return false;
-                                });
-
-                                $buttons.appendTo($confirm).append($.merge(
-                                    $addAccountButton, $laterButton
-                                ));
-
-                                return $confirm;
-                            });
-                        },
-                        error: cloudStack.dialog.error(function() {
-                            $loading.remove();
-                        })
-                    }
-                });
-
-                return false;
-            });
-
-            $cancel.click(function() {
-                $(':ui-dialog, .overlay').remove();
-            });
-
-            return $newProject
-                .append(
-                    $form
-                    .append($formDesc)
-                    .append($projectName)
-                    .append($projectDesc)
-                    .append($cancel)
-                    .append($submit)
-            );
-        },
-
-        /**
-         * Project selection list
-         */
-        selector: function(args) {
-            var $selector = $('<div>').addClass('project-selector');
-            var $toolbar = $('<div>').addClass('toolbar');
-            var $list = $('<div>').addClass('listing')
-                .append($('<div>').addClass('header').html(_l('label.name')))
-                .append($('<div>').addClass('data').append($('<ul>')));
-            var $searchForm = $('<form>');
-            var $search = $('<div>').appendTo($toolbar).addClass('search')
-                .append(
-                    $searchForm
-                    .append($('<input>').attr({
-                        type: 'text'
-                    }))
-                    .append($('<input>').attr({
-                        type: 'submit'
-                    }).val(''))
-            );
-            var $projectSelect = args.$projectSelect;
-            var $cancel = $('<div>').addClass('button cancel').html(_l('label.cancel'));
-
-            // Get project data
-            var loadData = function(complete, options) {
-                cloudStack.projects.dataProvider({
-                    projectName: options ? options.projectName : null,
-                    context: cloudStack.context,
-                    response: {
-                        success: function(args) {
-                            var data = args.data;
-
-                            $projectSelect.find('option').remove();
-                            $(data).each(function() {
-                                var displayText = this.displayText ? this.displayText : this.name;
-
-                                $('<li>')
-                                    .data('json-obj', this)
-                                    .html(_s(displayText))
-                                    .appendTo($list.find('ul'));
-
-                                // Populate project select
-                                $('<option>')
-                                    .appendTo($projectSelect)
-                                    .data('json-obj', this)
-                                    .html(_s(displayText));
-                            });
-
-                            cloudStack.evenOdd($list, 'li', {
-                                even: function($elem) {
-                                    $elem.addClass('even');
-                                },
-
-                                odd: function($elem) {
-                                    $elem.addClass('odd');
-                                }
-                            });
-
-                            if (complete) complete();
-                        }
-                    }
-                });
-            };
-
-            // Search form
-            $searchForm.submit(function() {
-                $list.find('li').remove();
-                loadData(null, {
-                    projectName: $(this).find('input[type=text]').val()
-                });
-
-                return false;
-            });
-
-            //Cancel button
-            $cancel.click(function() {
-                $(':ui-dialog, .overlay').remove();
-                $('.select.default-view').click();
-            });
-
-
-            // Initial load
-            loadData(function() {
-                if (!$list.find('li').length) {
-                    cloudStack.dialog.notice({
-                        message: isAdmin() || isDomainAdmin() || g_userProjectsEnabled ? _l('message.no.projects') : _l('message.no.projects.adminOnly')
-                    }).closest('.ui-dialog');
-                    $.merge($selector, $('.overlay')).remove();
-                    $('.select.default-view').click();
-                } else {
-                    $selector.dialog({
-                        title: _l('label.select.project'),
-                        dialogClass: 'project-selector-dialog',
-                        closeOnEscape: false,
-                        width: 420
-                    }).closest('.ui-dialog').overlay();
-                }
-            });
-
-            // Project item click event
-            $selector.click(function(event) {
-                var $target = $(event.target);
-
-                if ($target.is('li')) {
-                    cloudStack.context.projects = [$target.data('json-obj')];
-                    showDashboard();
-
-                    var $switcher = $('.select.project-view');
-                    var projectName = _s(cloudStack.context.projects[0].name);
-
-                    $switcher.attr('title', projectName);
-                    if (projectName.length > 10) {
-                        projectName = projectName.substr(0, 10).concat('...');
-                    }
-
-                    // Put project name in header
-                    $switcher.html('<span class="icon">&nbsp;</span>' + projectName);
-
-
-                    $.merge($selector, $('.overlay')).remove();
-
-                    // Select active project
-                    $projectSelect
-                        .find('option').attr('selected', '')
-                        .filter(function() {
-                            return $(this).data('json-obj').name == _s(cloudStack.context.projects[0].name);
-                        }).attr('selected', 'selected');
-
-                    ////
-                    // Hidden for now
-                    //$projectSelect.parent().show();
-                }
-            });
-
-            return $selector
-                .append($toolbar)
-                .append($list)
-                .append($cancel);
-        }
-    };
-
-    /**
-     * Show project-mode appearance on CloudStack UI
-     */
-    var applyProjectStyle = function() {
-        var $container = $('#cloudStack3-container');
-        $container.addClass('project-view');
-    };
-
-    /**
-     * Initiate new project flow
-     */
-    var addProject = function() {
-        var $dialog = pageElems.newProjectForm().dialog({
-            title: _l('label.new.project'),
-            closeOnEscape: false,
-            width: 760
-        });
-        cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-    };
-
-    var deleteProject = function(args) {
-        var projectId = args.id;
-        var $projectSwitcher = $('div.project-switcher');
-        var contextProjectId = cloudStack.context.projects ? cloudStack.context.projects[0].id : -1;
-
-        $projectSwitcher.find('option[value="' + projectId + '"]').remove();
-
-        //return to default view if current project is deleted
-        if (contextProjectId == projectId) {
-            $projectSwitcher.find('select').trigger('change');
-        }
-        return false;
-    };
-
-    /**
-     * Show the dashboard, in panel
-     */
-    var showDashboard = function() {
-        var $browser = $('#browser .container');
-        applyProjectStyle($('html body'));
-
-        // Cleanup project context
-        if (cloudStack.context.projects)
-            cloudStack.context.projects[0].isNew = false;
-
-        $browser.cloudBrowser('removeAllPanels');
-        $browser.cloudBrowser('addPanel', {
-            title: _l('label.project.dashboard'),
-            complete: function($newPanel) {
-                $('#navigation li.dashboard').addClass('active').siblings().removeClass('active');
-                $newPanel.append(pageElems.dashboard);
-            }
-        });
-    };
-
-    /**
-     * Projects entry point
-     */
-    cloudStack.uiCustom.projects = function(args) {
-        var $dashboardNavItem = $('#navigation li.navigation-item.dashboard');
-
-        // Use project dashboard
-        var event = function() {
-            if (!$('#cloudStack3-container').hasClass('project-view')) {
-                // No longer in project view, go back to normal dashboard
-                $dashboardNavItem.unbind('click', event);
-
-                return true;
-            }
-
-            $(this).addClass('active');
-            $(this).siblings().removeClass('active');
-
-            if (cloudStack.context.projects && cloudStack.context.projects[0]) {
-                showDashboard();
-            }
-
-            return false;
-        };
-        $dashboardNavItem.bind('click', event);
-
-        if (args.alreadySelected) {
-            showDashboard();
-        } else {
-            pageElems.selector(args);
-        }
-    };
-
-    /**
-     * New project event
-     */
-    $(window).bind('cloudStack.newProject', function() {
-        addProject();
-    });
-
-
-    $(window).bind('cloudStack.deleteProject', function(event, args) {
-        deleteProject({
-            id: args.data.id
-        });
-    });
-})(cloudStack, jQuery);
diff --git a/ui/legacy/scripts/ui-custom/recurringSnapshots.js b/ui/legacy/scripts/ui-custom/recurringSnapshots.js
deleted file mode 100644
index 82b3489..0000000
--- a/ui/legacy/scripts/ui-custom/recurringSnapshots.js
+++ /dev/null
@@ -1,219 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.recurringSnapshots = function(args) {
-        var desc = args.desc;
-        var selects = args.selects;
-        var actions = args.actions;
-        var dataProvider = args.dataProvider;
-
-        return function(args) {
-            var $snapshots = $('#template').find('.recurring-snapshots').clone();
-            var context = args.context;
-
-            // Update labels
-            $snapshots.find('.forms ul li.hourly a').html(_l('label.hourly'));
-            $snapshots.find('.forms ul li.daily a').html(_l('label.daily'));
-            $snapshots.find('.forms ul li.weekly a').html(_l('label.weekly'));
-            $snapshots.find('.forms ul li.monthly a').html(_l('label.monthly'));
-            $snapshots.find('.field.timezone .name').html(_l('label.timezone'));
-            $snapshots.find('.field.time .name').html(_l('label.time'));
-            $snapshots.find('.field.time .value label').html(_l('label.minute.past.hour'));
-            $snapshots.find('.add-snapshot-action.add').html(_l('label.add'));
-
-            // Get description
-            $snapshots.find('.desc').html(_l(desc));
-
-            // Snapshot type tabs
-            $snapshots.find('.forms').tabs();
-
-            // Populate selects
-            $snapshots.find('form select').each(function() {
-                var $select = $(this);
-                var selectData = selects[$select.attr('name')];
-
-                if (selectData) {
-                    selectData({
-                        response: {
-                            success: function(args) {
-                                $(args.data).each(function() {
-                                    var $option = $('<option>').appendTo($select);
-
-                                    $option.val(this.id).html(_l(this.name));
-                                });
-                            }
-                        }
-                    });
-                }
-            });
-
-            $($snapshots.find('.taggerContainer')).each(function() {
-                $('<div>').taggerInForm().appendTo(this);
-            });
-
-            // Form validation
-            $snapshots.find('form').validate();
-
-            // Add snapshot
-            $snapshots.find('.add-snapshot-action.add').click(function() {
-                var $form = $snapshots.find('form:visible');
-
-                if (!$form.valid()) return false;
-
-                var formData = $.extend(cloudStack.serializeForm($form), {'tags' : cloudStack.getTagsFromForm($form)});
-
-                actions.add({
-                    context: context,
-                    snapshot: formData,
-                    response: {
-                        success: function(args) {
-                            var $snapshotRow = $snapshots.find('.scheduled-snapshots tr').filter(function() {
-                                return $(this).index() == args.data.type;
-                            }).addClass('active').show();
-
-                            $snapshotRow.data('json-obj', args.data);
-
-                            // Update fields
-                            $snapshotRow.find('td.time span').html(args.data.time);
-                            $snapshotRow.find('td.day-of-week span').html(_l(
-                                args.data['day-of-week'] ?
-                                $snapshots.find('select[name=day-of-week] option').filter(function() {
-                                    return $(this).val() == args.data['day-of-week'];
-                                }).html() :
-                                args.data['day-of-month']
-                            ));
-                            $snapshotRow.find('td.timezone span').html(
-                                $snapshots.find('select[name=timezone] option').filter(function() {
-                                    return $(this).val() == args.data['timezone'];
-                                }).html()
-                            );
-                            $snapshotRow.find('td.keep span').html(args.data.keep);
-
-                            $(':ui-dialog').dialog('option', 'position', 'center');
-
-                            refreshSnapshotTabs();
-                        }
-                    }
-                });
-
-                return true;
-            });
-
-            // Enable/disable snapshot tabs based on table contents;
-            var refreshSnapshotTabs = function() {
-                $snapshots.find('li').each(function() {
-                    var index = $(this).index();
-                    var $tr = $snapshots.find('tr').filter(function() {
-                        return $(this).index() == index;
-                    });
-
-                    if ($tr.length && $tr.hasClass('active')) {
-                        $(this).addClass('disabled ui-state-disabled');
-                    } else {
-                        $(this).removeClass('disabled ui-state-disabled');
-                    }
-
-                    if ($(this).is('.ui-tabs-selected.ui-state-disabled')) {
-                        $snapshots.find('form').show();
-
-                        if ($snapshots.find('li.ui-state-disabled').length == $snapshots.find('li').length) {
-                            $snapshots.find('form').hide();
-                        } else {
-                            $snapshots.find('li:not(.ui-state-disabled):first a').click();
-                        }
-                    }
-                });
-            };
-
-            // Remove snapshot
-            $snapshots.find('.action.destroy').click(function() {
-                var $tr = $(this).closest('tr');
-                actions.remove({
-                    context: context,
-                    snapshot: $tr.data('json-obj'),
-                    response: {
-                        success: function(args) {
-                            $tr.hide().removeClass('active');
-                            $(':ui-dialog').dialog('option', 'position', 'center');
-
-                            refreshSnapshotTabs();
-                        }
-                    }
-                });
-            });
-
-            // Get existing data
-            dataProvider({
-                context: context,
-                response: {
-                    success: function(args) {
-                        $(args.data).each(function() {
-                            var snapshot = this;
-
-                            // Get matching table row
-                            var $tr = $snapshots.find('tr').filter(function() {
-                                return $(this).index() == snapshot.type;
-                            }).addClass('active').show();
-
-                            $tr.data('json-obj', snapshot);
-
-                            $tr.find('td.time span').html(snapshot.time);
-                            $tr.find('td.timezone span').html(
-                                $snapshots.find('select[name=timezone] option').filter(function() {
-                                    return $(this).val() == snapshot['timezone'];
-                                }).html()
-                            );
-                            $tr.find('td.keep span').html(snapshot.keep);
-                            $tr.find('td.day-of-week span').html(
-                                snapshot['day-of-week'] ?
-                                $snapshots.find('select[name=day-of-week] option').filter(function() {
-                                    return $(this).val() == snapshot['day-of-week'];
-                                }).html() :
-                                snapshot['day-of-month']
-                            );
-                        });
-
-                        refreshSnapshotTabs();
-                    }
-                }
-            });
-
-            // Create dialog
-            var $dialog = $snapshots.dialog({
-                title: _l('label.action.recurring.snapshot'),
-                dialogClass: 'recurring-snapshots',
-                closeOnEscape: false,
-                width: 600,
-                buttons: [{
-                    text: _l('label.done'),
-                    'class': 'ok',
-                    click: function() {
-                        $dialog.fadeOut(function() {
-                            $dialog.remove();
-                        });
-
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-                    }
-                }]
-            });
-
-            return cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/regions.js b/ui/legacy/scripts/ui-custom/regions.js
deleted file mode 100644
index e950c12..0000000
--- a/ui/legacy/scripts/ui-custom/regions.js
+++ /dev/null
@@ -1,128 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    $(window).bind('cloudStack.ready', function() {
-        // Region switcher
-        var $regionList = $('<ul>');
-
-        // Get region listing
-        var refreshRegions = function() {
-            $regionList.find('li').remove();
-            cloudStack.sections.regions.regionSelector.dataProvider({
-                response: {
-                    success: function(args) {
-                        var data = args.data;
-
-                        var currentRegion = null;
-                        $(data).each(function() {
-                            var region = this;
-                            var regionName = region.name;
-                            var $li = $('<li>').append($('<span>').html(_s(region.name)));
-
-                            $li.data('region-data', region);
-
-                            if (document.location.href.indexOf(region.endpoint) != -1) {
-                                currentRegion = region;
-                                $li.addClass('active');
-                            }
-
-                            $regionList.append($li);
-                        });
-
-                        if (currentRegion != null) {
-                            $regionSwitcherButton.find('.title').html(_s(currentRegion.name)).attr('title', _s(currentRegion.name));
-                        } else {
-                            $regionSwitcherButton.find('.title').html('').attr('title', '');
-                        }
-                    }
-                }
-            });
-        };
-
-        $(window).bind('cloudStack.refreshRegions', refreshRegions);
-
-        var $regionSelector = $('<div>').addClass('region-selector')
-            .append($('<div>').addClass('top-arrow'))
-            .append($('<h2>').html(_l('label.menu.regions')))
-            .append($regionList)
-            .append(
-                $('<div>').addClass('buttons')
-                .append(
-                    $('<div>').addClass('button close').append($('<span>').html(_l('label.close')))
-                )
-        )
-            .hide();
-        var $regionSwitcherButton = $('<div>').addClass('region-switcher')
-            .attr('title', _l('label.select.region'))
-            .append(
-                $('<span>').addClass('icon').html('&nbsp;'),
-                $('<span>').addClass('title').html('')
-        );
-
-        var closeRegionSelector = function(args) {
-            $regionSwitcherButton.removeClass('active');
-            $regionSelector.fadeOut(args ? args.complete : null);
-            $('body > .overlay').fadeOut(function() {
-                $('body > .overlay').remove()
-            });
-        };
-
-        var switchRegion = function(url) {
-            closeRegionSelector({
-                complete: function() {
-                    $('#container').prepend($('<div>').addClass('loading-overlay'));
-                    document.location.href = url;
-                }
-            });
-        };
-
-        $regionList.click(function(event) {
-            var $target = $(event.target);
-            var $li = $target.closest('li');
-            var region, url;
-
-            if ($li.length && !$li.hasClass('active')) {
-                region = $li.data('region-data');
-                url = region.endpoint;
-                id = region.id;
-
-                if (id != '-1') {
-                    switchRegion(url);
-                }
-            }
-        });
-
-        $regionSwitcherButton.click(function() {
-            if ($regionSwitcherButton.hasClass('active')) {
-                closeRegionSelector();
-            } else {
-                $regionSwitcherButton.addClass('active');
-                $regionSelector.fadeIn('fast').overlay({
-                    closeAction: closeRegionSelector
-                });
-            }
-        });
-
-        $regionSelector.find('.button.close').click(function() {
-            closeRegionSelector();
-        });
-
-        $('#header .controls .view-switcher.button:last').after($regionSwitcherButton, $regionSelector);
-        refreshRegions();
-    });
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/saml.js b/ui/legacy/scripts/ui-custom/saml.js
deleted file mode 100644
index 1879bdc..0000000
--- a/ui/legacy/scripts/ui-custom/saml.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    $(window).bind('cloudStack.ready', function() {
-        var showSamlDomainSwitcher = false;
-        if (g_idpList) {
-            showSamlDomainSwitcher = true;
-        }
-        if (!showSamlDomainSwitcher) {
-            return;
-        }
-
-        var $label = $('<label>').html('Domain:');
-        var $header = $('#header .controls');
-        var $domainSwitcher = $('<div>').addClass('domain-switcher');
-        var $domainSelect = $('<select>');
-        $domainSwitcher.append($label, $domainSelect);
-
-        var switchAccount = function(userId, domainId) {
-            var toReload = true;
-            $.ajax({
-                url: createURL('listAndSwitchSamlAccount'),
-                type: 'POST',
-                async: false,
-                data: {
-                    userid: userId,
-                    domainid: domainId
-                },
-                success: function(data, textStatus) {
-                    document.location.reload(true);
-                },
-                error: function(data) {
-                    cloudStack.dialog.notice({
-                        message: parseXMLHttpResponse(data)
-                    });
-                    if (data.status !== 200) {
-                        toReload = false;
-                    }
-                },
-                complete: function() {
-                    if (toReload) {
-                        document.location.reload(true);
-                    }
-                    toReload = true;
-                }
-            });
-        };
-
-        $domainSelect.change(function() {
-            var selectedOption = $domainSelect.val();
-            var userId = selectedOption.split('/')[0];
-            var domainId = selectedOption.split('/')[1];
-            switchAccount(userId, domainId);
-        });
-
-        $.ajax({
-            url: createURL('listAndSwitchSamlAccount'),
-            success: function(json) {
-                var accounts = json.listandswitchsamlaccountresponse.samluseraccount;
-                if (accounts.length < 2) {
-                    return;
-                };
-                $domainSelect.empty();
-                for (var i = 0; i < accounts.length; i++) {
-                    var option = $('<option>');
-                    option.data("userId", accounts[i].userId);
-                    option.data("domainId", accounts[i].domainId);
-                    option.val(accounts[i].userId + '/' + accounts[i].domainId);
-                    option.html(accounts[i].accountName + accounts[i].domainPath);
-					if (accounts[i].domainName == 'ROOT') {
-						option.append('ROOT');
-					}
-                    option.appendTo($domainSelect);
-                }
-                var currentAccountDomain = g_userid + '/' + g_domainid;
-                $domainSelect.find('option[value="' + currentAccountDomain + '"]').attr("selected", "selected");
-                $domainSwitcher.insertAfter($header.find('.region-switcher'));
-            },
-            error: function(data) {
-                // if call fails, the logged in user in not a SAML authenticated user
-            }
-        });
-    });
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/securityRules.js b/ui/legacy/scripts/ui-custom/securityRules.js
deleted file mode 100644
index a5cbbee..0000000
--- a/ui/legacy/scripts/ui-custom/securityRules.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    cloudStack.uiCustom.securityRules = function(args) {
-        var multiEdit = args;
-
-        return function(args) {
-            var context = args.context;
-            var $multi = $('<div>').addClass('security-rules').multiEdit(
-                $.extend(true, {}, multiEdit, {
-                    context: context
-                })
-            );
-            var $fields = $multi.find('form table').find('th, td');
-            var $accountFields = $fields.filter(function() {
-                return $(this).hasClass('accountname') ||
-                    $(this).hasClass('securitygroupname');
-            });
-            var $cidrFields = $fields.filter(function() {
-                return $(this).hasClass('cidr');
-            });
-
-            $multi.prepend(
-                $('<div>').addClass('add-by')
-                .append($('<span>').html('Add by:'))
-                .append(
-                    $('<div>').addClass('selection')
-                    .append(
-                        $('<input>').attr({
-                            type: 'radio',
-                            name: 'add-by',
-                            checked: 'checked'
-                        }).click(function() {
-                            $accountFields.hide();
-                            $cidrFields.show();
-
-                            return true;
-                        }).click()
-                    )
-                    .append($('<label>').html('CIDR'))
-                    .append(
-                        $('<input>').attr({
-                            type: 'radio',
-                            name: 'add-by'
-                        }).click(function() {
-                            $accountFields.show();
-                            $cidrFields.hide();
-
-                            return true;
-                        })
-                    )
-                    .append($('<label>').html('Account'))
-                )
-            );
-
-            return $multi;
-        };
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui-custom/uploadVolume.js b/ui/legacy/scripts/ui-custom/uploadVolume.js
deleted file mode 100644
index 2283de1..0000000
--- a/ui/legacy/scripts/ui-custom/uploadVolume.js
+++ /dev/null
@@ -1,176 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function(cloudStack, $) {
-    cloudStack.uiCustom.uploadVolume = function(args) {
-        var listView = args.listView;
-        var action = args.action;
-
-        var validate = function($uploadVolume) {
-            if (!$uploadVolume.find('input[type=text]').val()) {
-                cloudStack.dialog.notice({
-                    message: _l('message.specify.url')
-                });
-
-                return false;
-            }
-
-            if (!$uploadVolume.find(
-                'input[type=radio]:checked, input[type=checkbox]:checked'
-            ).length) {
-                cloudStack.dialog.notice({
-                    message: _l('message.select.instance')
-                });
-
-                return false;
-            }
-
-            return true;
-        };
-
-        return function(args) {
-            var $uploadVolume = $('<div>').addClass('upload-volume');
-            var context = args.context;
-            var topFields = function() {
-                var $form = $('<form>').addClass('top-fields');
-                var $urlLabel = $('<label>').html(_l('label.url') + ':');
-                var $urlField = $('<div>').addClass('field url');
-                var $nameLabel = $('<label>').html(_l('label.name') + ':');
-                var $nameField = $('<div>').addClass('field name');
-                var $urlInput = $('<input>').attr({
-                    type: 'text',
-                    name: 'url'
-                }).addClass('required');
-                var $nameInput = $('<input>').attr({
-                    type: 'text',
-                    name: 'name'
-                }).addClass('required');
-
-                $urlField.append($urlLabel, $urlInput);
-                $nameField.append($nameLabel, $nameInput);
-                $form.append($nameField, $urlField);
-
-                return $form;
-            };
-            var vmList = function(args) {
-                // Create a listing of instances, based on limited information
-                // from main instances list view
-                var $listView;
-                var instances = $.extend(true, {}, args.listView, {
-                    context: context,
-                    uiCustom: true
-                });
-
-                instances.listView.actions = {
-                    select: {
-                        label: _l('label.select.instance'),
-                        type: 'radio',
-                        action: {
-                            uiCustom: function(args) {
-                                var $item = args.$item;
-                                var $input = $item.find('td.actions input:visible');
-
-                                if ($input.attr('type') == 'checkbox') {
-                                    if ($input.is(':checked'))
-                                        $item.addClass('multi-edit-selected');
-                                    else
-                                        $item.removeClass('multi-edit-selected');
-                                } else {
-                                    $item.siblings().removeClass('multi-edit-selected');
-                                    $item.addClass('multi-edit-selected');
-                                }
-                            }
-                        }
-                    }
-                };
-
-                $listView = $('<div>').listView(instances);
-
-                // Change action label
-                $listView.find('th.actions').html(_l('label.select'));
-
-                return $listView;
-            };
-
-            $uploadVolume.append(
-                topFields,
-                $('<div>').addClass('desc').html(_l('label.select.instance.to.attach.volume.to') + ':'),
-                $('<div>').addClass('listView-container').append(
-                    vmList({
-                        listView: listView
-                    })
-                )
-            );
-            $uploadVolume.dialog({
-                dialogClass: 'multi-edit-add-list panel',
-                width: 900,
-                title: _l('label.upload.volume'),
-                buttons: [{
-                    text: _l('label.upload'),
-                    'class': 'ok',
-                    click: function() {
-                        if (!validate($uploadVolume)) return false;
-
-                        var complete = args.complete;
-                        var $loading = $('<div>').addClass('loading-overlay');
-
-                        $loading.appendTo($uploadVolume);
-                        action({
-                            data: cloudStack.serializeForm($uploadVolume.find('form')),
-                            context: $.extend(true, {}, context, {
-                                instances: [
-                                    $uploadVolume.find('tr.multi-edit-selected').data('json-obj')
-                                ]
-                            }),
-                            response: {
-                                success: function(args) {
-                                    $('.ui-dialog').fadeOut(function() {
-                                        $('.ui-dialog').remove();
-                                        $(window).trigger('cloudStack.fullRefresh');
-                                    });
-                                    $('div.overlay').fadeOut(function() {
-                                        $('div.overlay').remove();
-                                    });
-                                    complete({
-                                        $item: $('<div>'),
-                                        _custom: args._custom
-                                    });
-                                },
-                                error: function(args) {
-                                    $loading.remove();
-                                    cloudStack.dialog.notice({
-                                        message: args
-                                    });
-                                }
-                            }
-                        });
-                    }
-                }, {
-                    text: _l('label.cancel'),
-                    'class': 'cancel',
-                    click: function() {
-                        $('.ui-dialog').fadeOut(function() {
-                            $('.ui-dialog').remove();
-                        });
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-                    }
-                }]
-            }).closest('.ui-dialog').overlay();
-        };
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/scripts/ui-custom/vpc.js b/ui/legacy/scripts/ui-custom/vpc.js
deleted file mode 100644
index 5444874..0000000
--- a/ui/legacy/scripts/ui-custom/vpc.js
+++ /dev/null
@@ -1,940 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    var elems = {
-        aclDialog: function(args) {
-            var isDialog = args.isDialog;
-            var actionArgs = args.actionArgs;
-            var context = args.context;
-            var $acl = $('<div>').addClass('acl').multiEdit(
-                $.extend(true, {}, actionArgs.multiEdit, {
-                    context: context
-                })
-            );
-
-            // Show ACL dialog
-            if (isDialog) {
-                $acl.dialog({
-                    title: _l('label.configure.network.ACLs'),
-                    dialogClass: 'configure-acl',
-                    width: 900,
-                    height: 600,
-                    buttons: {
-                        'Done': function() {
-                            $(':ui-dialog').remove();
-                            $('.overlay').remove();
-                        }
-                    }
-                });
-            }
-
-            return $acl;
-        },
-        vpcConfigureTooltip: function(args) {
-            var context = args.context;
-            var $browser = args.$browser;
-            var $chart = args.$chart;
-            var ipAddresses = args.ipAddresses;
-            var acl = args.acl;
-            var gateways = args.gateways;
-            var siteToSiteVPN = args.siteToSiteVPN;
-            var links = {
-                'ip-addresses': _l('label.menu.ipaddresses'),
-                'gateways': _l('label.private.Gateway'),
-                'site-to-site-vpn': _l('label.site.to.site.VPN'),
-                'network-acls': _l('label.network.ACLs')
-            };
-            var $links = $('<ul>').addClass('links');
-            var $tooltip = $('<div>').addClass('vpc-configure-tooltip').append(
-                $('<div>').addClass('arrow')
-            );
-            var tierDetailView = args.tierDetailView;
-
-            // Make links
-            $.map(links, function(label, id) {
-                var $link = $('<li>').addClass('link').addClass(id);
-                var $label = $('<span>').html(label);
-
-                $link.append($label);
-                $link.appendTo($links);
-
-                // Link event
-                $link.click(function() {
-                    switch (id) {
-                        case 'network-acls':
-                            $browser.cloudBrowser('addPanel', {
-                                title: _l('label.network.ACLs'),
-                                maximizeIfSelected: true,
-                                complete: function($panel) {
-                                    $panel.listView(
-                                        $.extend(true, {}, acl.listView, {
-                                            listView: {
-                                                actions: {
-                                                    add: {
-                                                        label: 'label.add.network.ACL',
-                                                        action: {
-                                                            custom: function() {
-                                                                elems.aclDialog({
-                                                                    isDialog: true,
-                                                                    actionArgs: acl,
-                                                                    context: context
-                                                                });
-                                                            }
-                                                        }
-                                                    }
-                                                },
-                                                detailView: function() {
-                                                    var detailView = $.extend(true, {}, tierDetailView);
-
-                                                    detailView.tabs = {
-                                                        acl: tierDetailView.tabs.acl
-                                                    };
-
-                                                    return detailView;
-                                                }
-                                            }
-                                        }), {
-                                            context: acl.context
-                                        }
-                                    );
-                                }
-                            });
-                            break;
-
-                        case 'ip-addresses':
-                            $browser.cloudBrowser('addPanel', {
-                                title: _l('label.menu.ipaddresses'),
-                                maximizeIfSelected: true,
-                                complete: function($panel) {
-                                    //ipAddresses.listView is a function
-                                    $panel.listView(ipAddresses.listView(), {
-                                        context: ipAddresses.context
-                                    });
-                                }
-                            });
-                            break;
-                        case 'gateways':
-                            //siteToSiteVPN is an object
-                            var addAction = gateways.add;
-                            var isGatewayPresent = addAction.preCheck({
-                                context: gateways.context
-                            });
-                            var showGatewayListView = function() {
-                                $browser.cloudBrowser('addPanel', {
-                                    title: _l('label.private.Gateway'),
-                                    maximizeIfSelected: true,
-                                    complete: function($panel) {
-                                        $panel.listView(gateways.listView(), {
-                                            context: gateways.context
-                                        });
-                                    }
-                                });
-                            };
-
-                            if (isGatewayPresent) {
-                                showGatewayListView();
-                            } else {
-                                cloudStack.dialog.createForm({
-                                    form: addAction.createForm,
-                                    context: args.gateways.context,
-                                    after: function(args) {
-                                        var data = args.data;
-                                        var error = function(message) {
-                                            cloudStack.dialog.notice({
-                                                message: message
-                                            });
-                                        };
-
-                                        addAction.action({
-                                            data: data,
-                                            $form: args.$form,
-                                            context: gateways.context,
-                                            response: {
-                                                success: function(args) {
-                                                    var _custom = args._custom;
-                                                    var notification = {
-                                                        poll: addAction.notification.poll,
-                                                        _custom: _custom,
-                                                        desc: addAction.messages.notification()
-                                                    };
-                                                    var success = function(args) {
-                                                        if (!$chart.is(':visible')) return;
-
-                                                        cloudStack.dialog.confirm({
-                                                            message: 'Gateway for VPC has been created successfully. Would you like to see its details?',
-                                                            action: showGatewayListView
-                                                        });
-                                                    };
-
-                                                    cloudStack.dialog.notice({
-                                                        message: 'Your gateway is being created; please see notifications window.'
-                                                    });
-
-                                                    cloudStack.ui.notifications.add(
-                                                        notification,
-                                                        success, {},
-                                                        error, {}
-                                                    );
-                                                },
-                                                error: error
-                                            }
-                                        });
-                                    }
-                                });
-                            }
-                            break;
-                        case 'site-to-site-vpn':
-                            //siteToSiteVPN is an object
-                            var addAction = siteToSiteVPN.add;
-                            var isVPNPresent = addAction.preCheck({
-                                context: siteToSiteVPN.context
-                            });
-                            var showVPNListView = function() {
-                                $browser.cloudBrowser('addPanel', {
-                                    title: _l('label.site.to.site.VPN'),
-                                    maximizeIfSelected: true,
-                                    complete: function($panel) {
-                                        $panel.listView(siteToSiteVPN, {
-                                            context: siteToSiteVPN.context
-                                        });
-                                    }
-                                });
-                            };
-
-                            if (isVPNPresent) {
-                                showVPNListView();
-                            } else {
-                                cloudStack.dialog.confirm({
-                                    message: 'Please confirm that you want to add a Site-to-Site VPN gateway.',
-                                    action: function() {
-                                        var error = function(message) {
-                                            cloudStack.dialog.notice({
-                                                message: message
-                                            });
-                                        };
-
-                                        addAction.action({
-                                            context: siteToSiteVPN.context,
-                                            response: {
-                                                success: function(args) {
-                                                    var _custom = args._custom;
-                                                    var notification = {
-                                                        poll: addAction.notification.poll,
-                                                        _custom: _custom,
-                                                        desc: addAction.messages.notification()
-                                                    };
-                                                    var success = function(args) {
-                                                        if (!$chart.is(':visible')) return;
-                                                        cloudStack.dialog.confirm({
-                                                            message: 'Gateway for VPC has been created successfully. Would you like to see its details?',
-                                                            action: showVPNListView
-                                                        });
-                                                    };
-
-                                                    cloudStack.dialog.notice({
-                                                        message: 'Your VPN is being created; please see notifications window.'
-                                                    });
-
-                                                    cloudStack.ui.notifications.add(
-                                                        notification,
-                                                        success, {},
-                                                        error, {}
-                                                    );
-                                                },
-                                                error: error
-                                            }
-                                        });
-                                    }
-                                });
-                            }
-                            break;
-                    }
-                });
-            });
-
-            $tooltip.append($links);
-
-            // Tooltip hover event
-            $tooltip.hover(
-                function() {
-                    $tooltip.addClass('active');
-                },
-                function() {
-                    $tooltip.removeClass('active');
-
-                    setTimeout(function() {
-                        if (!$tooltip.hasClass('active')) {
-                            $tooltip.remove();
-                        }
-                    }, 500);
-                }
-            );
-
-            return $tooltip;
-        },
-        vpcConfigureArea: function(args) {
-            var context = args.context;
-            var $browser = args.$browser;
-            var $chart = args.$chart;
-            var ipAddresses = args.ipAddresses;
-            var acl = args.acl;
-            var gateways = args.gateways;
-            var siteToSiteVPN = args.siteToSiteVPN;
-            var $config = $('<div>').addClass('config-area');
-            var $configIcon = $('<span>').addClass('icon').html('&nbsp');
-            var tierDetailView = args.tierDetailView;
-
-            $config.append($configIcon);
-
-            // Tooltip event
-            $configIcon.mouseover(function() {
-                var $tooltip = elems.vpcConfigureTooltip({
-                    context: context,
-                    $browser: $browser,
-                    $chart: $chart,
-                    ipAddresses: ipAddresses,
-                    gateways: gateways,
-                    acl: acl,
-                    siteToSiteVPN: siteToSiteVPN,
-                    tierDetailView: tierDetailView
-                });
-
-                // Make sure tooltip is center aligned with icon
-                $tooltip.css({
-                    left: $configIcon.position().left
-                });
-                $tooltip.appendTo($config).hide();
-                $tooltip.stop().fadeIn('fast');
-            });
-
-            return $config;
-        },
-        router: function(args) {
-            var $browser = args.$browser;
-            var detailView = args.detailView;
-            var $router = $('<li>').addClass('tier virtual-router');
-            var $title = $('<span>').addClass('title').html(_l('label.virtual.router'));
-
-            $router.append($title);
-
-            // Append horizontal chart line
-            $router.append($('<div>').addClass('connect-line'));
-
-            $router.click(function() {
-                if ($router.hasClass('disabled')) return false;
-
-                $browser.cloudBrowser('addPanel', {
-                    title: _l('label.VPC.router.details'),
-                    complete: function($panel) {
-                        $panel.detailView(detailView);
-                    }
-                });
-            });
-
-            return $router;
-        },
-        tier: function(args) {
-            var ipAddresses = args.ipAddresses;
-            var acl = args.acl;
-            var name = args.name;
-            var cidr = args.cidr;
-            var context = args.context;
-            var vmListView = args.vmListView;
-            var actionPreFilter = args.actionPreFilter;
-            var actions = $.map(
-                args.actions ? args.actions : {}, function(value, key) {
-                    return {
-                        id: key,
-                        action: value
-                    };
-                }
-            );
-            var detailView = args.detailView;
-            var $browser = args.$browser;
-            var isPlaceholder = args.isPlaceholder;
-            var virtualMachines = args.virtualMachines;
-            var $tier = $('<li>').addClass('tier');
-            var $title = $('<span>').addClass('title');
-            var $cidr = $('<span>').addClass('cidr');
-            var $vmCount = $('<span>').addClass('vm-count');
-            var $actions = $('<div>').addClass('actions');
-
-            // Ignore special actions
-            // -- Add tier action is handled separately
-            actions = $.grep(actions, function(action) {
-                return action.id != 'add';
-            });
-
-            // Add loading indicator
-            $vmCount.append(
-                $('<div>').addClass('loading-overlay')
-                .attr('title', 'VMs are launching in this tier.')
-            );
-
-            // VM count shows instance list
-            $vmCount.click(function() {
-                var $dialog = $('<div>');
-                var $listView = $('<div>').listView($.extend(true, {}, vmListView, {
-                    context: context
-                }));
-
-                $dialog.append($listView);
-                $dialog.dialog({
-                    title: _l('label.VMs.in.tier') + ': ' + name,
-                    dialogClass: 'multi-edit-add-list panel configure-acl',
-                    width: 825,
-                    height: 600,
-                    buttons: {
-                        'Done': function() {
-                            $(':ui-dialog').remove();
-                            $('.overlay').remove();
-                        }
-                    }
-                }).closest('.ui-dialog').overlay();
-            });
-
-            // Title shows tier details
-            $title.click(function() {
-                if ($browser && $browser.length) { // Fix null exception, if add tier returns error
-                    $browser.cloudBrowser('addPanel', {
-                        title: name,
-                        maximizeIfSelected: true,
-                        complete: function($panel) {
-                            $panel.detailView($.extend(true, {}, detailView, {
-                                $browser: $browser,
-                                context: context
-                            }));
-                        }
-                    });
-                }
-            });
-
-            if (isPlaceholder) {
-                $tier.addClass('placeholder');
-                $title.html(_l('label.add.new.tier'));
-            } else {
-                $title.html(
-                    cloudStack.concat(name, 8)
-                );
-                $title.attr('title', name);
-                $cidr.html(cidr);
-                $vmCount.append(
-                    $('<span>').addClass('total').html(virtualMachines != null ? virtualMachines.length : 0),
-                    _l('label.vms')
-                );
-                $tier.append($actions);
-
-                // Build action buttons
-                $(actions).map(function(index, action) {
-                    var $action = $('<div>').addClass('action');
-                    var shortLabel = action.action.shortLabel;
-                    var label = action.action.label;
-
-                    $action.addClass(action.id);
-
-                    if (action.id != 'remove') {
-                        $action.append($('<span>').addClass('label').html(_l(shortLabel)));
-                    } else {
-                        $action.append($('<span>').addClass('icon').html('&nbsp;'));
-                    }
-
-                    $actions.append($action);
-                    $action.attr('title', label);
-                    $action.data('vpc-tier-action-id', action.id);
-
-                    // Action event
-                    $action.click(function() {
-                        if ($action.hasClass('disabled')) {
-                            return false;
-                        }
-
-                        tierAction({
-                            action: action,
-                            actionPreFilter: actionPreFilter,
-                            context: context,
-                            $tier: $tier,
-                            $actions: $actions
-                        });
-
-                        return true;
-                    });
-                });
-            }
-
-            $tier.prepend($title);
-
-            if (!isPlaceholder) {
-                $tier.append($title, $cidr, $vmCount);
-            }
-
-            // Append horizontal chart line
-            $tier.append($('<div>').addClass('connect-line'));
-
-            // Handle action filter
-            filterActions({
-                $actions: $actions,
-                actionPreFilter: actionPreFilter,
-                context: context
-            });
-
-            return $tier;
-        },
-        chart: function(args) {
-            var $browser = args.$browser;
-            var acl = args.acl;
-            var ipAddresses = args.ipAddresses;
-            var gateways = args.gateways;
-            var siteToSiteVPN = args.siteToSiteVPN;
-            var tiers = args.tiers;
-            var vmListView = args.vmListView;
-            var actions = args.actions;
-            var actionPreFilter = args.actionPreFilter;
-            var vpcName = args.vpcName;
-            var context = args.context;
-            var tierDetailView = args.tierDetailView;
-            var $tiers = $('<ul>').addClass('tiers');
-            var $router;
-
-            $router = elems.router({
-                $browser: $browser,
-                detailView: $.extend(true, {}, args.routerDetailView(), {
-                    context: context
-                })
-            });
-
-            if (!isAdmin()) $router.addClass('disabled');
-
-            var $chart = $('<div>').addClass('vpc-chart');
-            var $title = $('<div>').addClass('vpc-title')
-                .append(
-                    $('<span>').html(vpcName)
-            )
-                .append(
-                    elems.vpcConfigureArea({
-                        context: context,
-                        $browser: $browser,
-                        $chart: $chart,
-                        ipAddresses: $.extend(ipAddresses, {
-                            context: context
-                        }),
-                        gateways: $.extend(gateways, {
-                            context: context
-                        }),
-                        siteToSiteVPN: $.extend(siteToSiteVPN, {
-                            context: context
-                        }),
-                        acl: $.extend(acl, {
-                            context: context
-                        }),
-                        tierDetailView: tierDetailView
-                    })
-            );
-
-            var showAddTierDialog = function() {
-                if ($(this).find('.loading-overlay').length) {
-                    return false;
-                }
-
-                addTierDialog({
-                    ipAddresses: ipAddresses,
-                    $browser: $browser,
-                    tierDetailView: tierDetailView,
-                    $tiers: $tiers,
-                    acl: acl,
-                    context: context,
-                    actions: actions,
-                    vmListView: vmListView,
-                    actionPreFilter: actionPreFilter
-                });
-
-                return true;
-            };
-
-            if (tiers != null && tiers.length > 0) {
-                $(tiers).map(function(index, tier) {
-                    var $tier = elems.tier({
-                        ipAddresses: ipAddresses,
-                        acl: acl,
-                        $browser: $browser,
-                        detailView: tierDetailView,
-                        name: tier.name,
-                        cidr: tier.cidr,
-                        virtualMachines: tier.virtualMachines,
-                        vmListView: vmListView,
-                        actions: actions,
-                        actionPreFilter: actionPreFilter,
-                        context: $.extend(true, {}, context, {
-                            networks: [tier]
-                        })
-                    });
-
-                    $tier.appendTo($tiers);
-                });
-
-            }
-
-            elems.tier({
-                isPlaceholder: true
-            }).appendTo($tiers)
-                .click(showAddTierDialog);
-            $tiers.prepend($router);
-            $chart.append($title, $tiers);
-
-            if (!tiers || !tiers.length) {
-                showAddTierDialog();
-            }
-
-            return $chart;
-        }
-    };
-
-    var filterActions = function(args) {
-        var $actions = args.$actions;
-        var actionPreFilter = args.actionPreFilter;
-        var context = args.context;
-        var disabledActions, allowedActions;
-
-        disabledActions = actionPreFilter ? actionPreFilter({
-            context: context
-        }) : [];
-
-        // Visual appearance for disabled actions
-        $actions.find('.action').map(function(index, action) {
-            var $action = $(action);
-            var actionID = $action.data('vpc-tier-action-id');
-
-            if ($.inArray(actionID, disabledActions) > -1) {
-                $action.addClass('disabled');
-            } else {
-                $action.removeClass('disabled');
-            }
-        });
-    };
-
-    // Handles tier action, including UI effects
-    var tierAction = function(args) {
-        var $tier = args.$tier;
-        var $loading = $('<div>').addClass('loading-overlay');
-        var $actions = args.$actions;
-        var actionArgs = args.action.action;
-        var action = actionArgs.action;
-        var actionID = args.action.id;
-        var notification = actionArgs.notification;
-        var label = actionArgs.label;
-        var context = args.context;
-        var actionPreFilter = args.actionPreFilter;
-
-        var success = function(args) {
-            var remove = args ? args.remove : false;
-            var _custom = args ? args._custom : {};
-
-            var updateVMLoadingState = function() {
-                var pendingVMs = $tier.data('vpc-tier-pending-vms');
-
-                pendingVMs = pendingVMs ? pendingVMs - 1 : 0;
-
-                if (!pendingVMs) {
-                    $tier.data('vpc-tier-pending-vms', 0);
-                    $tier.removeClass('loading');
-                } else {
-                    $tier.data('vpc-tier-pending-vms', pendingVMs);
-                }
-            };
-
-            cloudStack.ui.notifications.add(
-                // Notification
-                {
-                    desc: label,
-                    poll: notification.poll,
-                    _custom: _custom
-                },
-
-                // Success
-
-                function(args) {
-                    if (actionID == 'addVM') {
-                        // Increment VM total
-                        var $total = $tier.find('.vm-count .total');
-                        var prevTotal = parseInt($total.html());
-                        var newTotal = prevTotal + 1;
-                        var newVM = args.data;
-                        var newContext = $.extend(true, {}, context, {
-                            vms: [newVM]
-                        });
-
-                        $total.html(newTotal);
-
-                        filterActions({
-                            $actions: $actions,
-                            actionPreFilter: actionPreFilter,
-                            context: newContext
-                        });
-
-                        updateVMLoadingState();
-                    } else if (actionID == 'remove') { //remove tier
-                        $loading.remove();
-                        $tier.remove();
-                    } else {
-                        $loading.remove();
-                    }
-
-                },
-
-                {},
-
-                // Error
-
-                function(args) {
-                    if (actionID == 'addVM') {
-                        updateVMLoadingState();
-                    } else {
-                        $loading.remove();
-                    }
-                }
-            );
-        };
-
-        switch (actionID) {
-            case 'addVM':
-                action({
-                    context: context,
-                    complete: function(args) {
-                        var pendingVMs = $tier.data('vpc-tier-pending-vms');
-
-                        pendingVMs = pendingVMs ? pendingVMs + 1 : 1;
-                        $tier.addClass('loading');
-                        $tier.data('vpc-tier-pending-vms', pendingVMs);
-                        success(args);
-                    }
-                });
-                break;
-            case 'remove':
-                $loading.appendTo($tier);
-                action({
-                    context: context,
-                    response: {
-                        success: function(args) {
-                            success($.extend(args, {
-                                remove: true
-                            }));
-                        }
-                    }
-                });
-                break;
-            case 'acl':
-                elems.aclDialog({
-                    isDialog: true,
-                    actionArgs: actionArgs,
-                    context: context
-                }).closest('.ui-dialog').overlay();
-                break;
-            default:
-                $loading.appendTo($tier);
-                action({
-                    context: context,
-                    complete: success,
-                    response: {
-                        success: success,
-                        error: function(args) {
-                            $loading.remove();
-                        }
-                    }
-                });
-        }
-    };
-
-    // Appends a new tier to chart
-    var addNewTier = function(args) {
-        var ipAddresses = args.ipAddresses;
-        var acl = args.acl;
-        var actions = args.actions;
-        var vmListView = args.vmListView;
-        var actionPreFilter = args.actionPreFilter;
-        var context = args.context;
-        var $browser = args.$browser;
-        var tierDetailView = args.tierDetailView;
-        var tier = $.extend(args.tier, {
-            ipAddresses: ipAddresses,
-            $browser: $browser,
-            detailView: tierDetailView,
-            context: context,
-            vmListView: vmListView,
-            actions: actions,
-            actionPreFilter: actionPreFilter,
-            acl: acl,
-            virtualMachines: []
-        });
-        var $tiers = args.$tiers;
-
-        $tiers.find('li.placeholder')
-            .before(
-                elems.tier(tier)
-                .hide()
-                .fadeIn('slow')
-        );
-    };
-
-    // Renders the add tier form, in a dialog
-    var addTierDialog = function(args) {
-        var ipAddresses = args.ipAddresses;
-        var actions = args.actions;
-        var context = args.context;
-        var vmListView = args.vmListView;
-        var actionPreFilter = args.actionPreFilter;
-        var $tiers = args.$tiers;
-        var $browser = args.$browser;
-        var tierDetailView = args.tierDetailView;
-        var acl = args.acl;
-
-        cloudStack.dialog.createForm({
-            context: context,
-            form: actions.add.createForm,
-            after: function(args) {
-                var $loading = $('<div>').addClass('loading-overlay').prependTo($tiers.find('li.placeholder'));
-                actions.add.action({
-                    context: context,
-                    data: args.data,
-                    response: {
-                        success: function(args) {
-                            var tier = args.data;
-
-                            cloudStack.ui.notifications.add(
-                                // Notification
-                                {
-                                    desc: actions.add.label
-                                },
-
-                                // Success
-
-                                function(args) {
-                                    $loading.remove();
-                                    addNewTier({
-                                        ipAddresses: ipAddresses,
-                                        $browser: $browser,
-                                        tierDetailView: tierDetailView,
-                                        context: $.extend(true, {}, context, {
-                                            networks: [tier]
-                                        }),
-                                        tier: tier,
-                                        acl: acl,
-                                        $tiers: $tiers,
-                                        actions: actions,
-                                        actionPreFilter: actionPreFilter,
-                                        vmListView: vmListView
-                                    });
-                                },
-
-                                {},
-
-                                // Error
-
-                                function(args) {
-                                    $loading.remove();
-                                }
-                            );
-                        },
-                        error: function(errorMsg) {
-                            cloudStack.dialog.notice({
-                                message: _s(errorMsg)
-                            });
-                            $loading.remove();
-                        }
-                    }
-                });
-            }
-        });
-    };
-
-    cloudStack.uiCustom.vpc = function(args) {
-        var vmListView = args.vmListView;
-        var tierArgs = args.tiers;
-        var ipAddresses = args.ipAddresses;
-        var gateways = args.gateways;
-        var acl = args.acl;
-        var siteToSiteVPN = args.siteToSiteVPN;
-        var routerDetailView = args.routerDetailView;
-
-        return function(args) {
-            var context = args.context;
-            var $browser = $('#browser .container');
-            var $toolbar = $('<div>').addClass('toolbar');
-            var vpc = args.context.vpc[0];
-
-            $browser.cloudBrowser('addPanel', {
-                maximizeIfSelected: true,
-                title: _l('label.configure.vpc') + ': ' + vpc.name,
-                complete: function($panel) {
-                    var $loading = $('<div>').addClass('loading-overlay').appendTo($panel);
-
-                    $panel.append($toolbar);
-
-                    // Load data
-                    tierArgs.dataProvider({
-                        context: context,
-                        response: {
-                            success: function(args) {
-                                // Setup detail view tabs
-                                var tierDetailView = $.extend(true, {}, tierArgs.detailView, {
-                                    tabs: {
-                                        acl: {
-                                            custom: function(args) {
-                                                var $acl = elems.aclDialog({
-                                                    isDialog: false,
-                                                    actionArgs: acl,
-                                                    context: args.context
-                                                });
-
-                                                return $acl;
-                                            }
-                                        },
-                                        ipAddresses: {
-                                            custom: function(args) {
-                                                return $('<div>').listView(ipAddresses.listView(), {
-                                                    context: args.context
-                                                });
-                                            }
-                                        }
-                                    }
-                                });
-
-                                var tiers = args.tiers;
-                                var $chart = elems.chart({
-                                    $browser: $browser,
-                                    ipAddresses: ipAddresses,
-                                    gateways: gateways,
-                                    acl: acl,
-                                    tierDetailView: tierDetailView,
-                                    routerDetailView: routerDetailView,
-                                    siteToSiteVPN: siteToSiteVPN,
-                                    vmListView: vmListView,
-                                    context: context,
-                                    actions: tierArgs.actions,
-                                    actionPreFilter: tierArgs.actionPreFilter,
-                                    vpcName: vpc.name,
-                                    tiers: tiers
-                                }).appendTo($panel);
-
-                                $loading.remove();
-                                $chart.fadeIn(function() {});
-                            }
-                        }
-                    });
-                }
-            });
-        };
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/zoneChart.js b/ui/legacy/scripts/ui-custom/zoneChart.js
deleted file mode 100644
index 188a9e7..0000000
--- a/ui/legacy/scripts/ui-custom/zoneChart.js
+++ /dev/null
@@ -1,463 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    /**
-     * Zone details chart
-     */
-    cloudStack.uiCustom.systemChart = function(chartID, chartFunc) {
-        /**
-         * Make view all button
-         */
-        var viewAllButton = function(args) {
-            var $viewAll = $('<div>').addClass('button view-all');
-            var $label = $('<span>').addClass('view-all-label').html(args.label ? args.label : _l('label.view.all'));
-            var $browser = args.$browser;
-            var action = args.action;
-            // Launch a list view
-            //var $multiple-click=$viewAll.data('multiple-click',false);
-            $viewAll.click(function() {
-                if ($viewAll.data('multiple-click')) return false;
-                //@pranav-handling the multiple clicks by using a flag variable
-                $viewAll.data('multiple-click', true);
-                $browser.cloudBrowser('addPanel', {
-                    title: args.title,
-                    maximizeIfSelected: true,
-                    complete: function($newPanel) {
-                        $viewAll.data('multiple-click', false);
-                        action({
-                            $panel: $newPanel
-                        });
-                    }
-                });
-            });
-
-            $viewAll.append($label);
-
-            return $viewAll;
-        };
-
-        /**
-         * Chart button action generators
-         */
-        var actions = {
-            /**
-             * Makes a list view from given zone sub-section
-             */
-            listView: function(targetID, context) {
-                return function(args) {
-                    var $elem = args.$panel;
-                    var listView = cloudStack.sections.system.subsections[targetID];
-
-                    $elem.listView($.extend(true, {}, listView, {
-                        context: context
-                    }));
-                };
-            },
-
-            providerListView: function(context) {
-                return function(args) {
-                    var $elem = args.$panel;
-                    var listViewArgs = cloudStack.sections.system.naas.providerListView;
-
-                    $elem.listView({
-                        context: context,
-                        listView: listViewArgs
-                    });
-                };
-            },
-
-            /**
-             * Makes details for a given traffic type
-             */
-            trafficTypeDetails: function(targetID, context) {
-                return function(args) {
-                    var $elem = args.$panel;
-                    var detailViewArgs = cloudStack.sections.system.naas.mainNetworks[targetID].detailView;
-
-                    $elem.detailView($.extend(true, {}, detailViewArgs, {
-                        $browser: $('#browser .container'),
-                        context: context
-                    }));
-                };
-            }
-        };
-
-        /**
-         * Chart generators
-         */
-        var charts = {
-            /**
-             * Compute tab
-             */
-            compute: function(args) {
-                var $chart = $('<div>');
-                var $browser = $('#browser .container');
-                var context = args.context;
-
-                // Resource items
-                var computeResources = {
-                    zone: {
-                        label: 'label.zone'
-                    },
-
-                    pods: {
-                        label: 'label.pods',
-                        viewAll: {
-                            action: actions.listView('pods', context)
-                        }
-                    },
-
-                    clusters: {
-                        label: 'label.clusters',
-                        viewAll: {
-                            action: actions.listView('clusters', context)
-                        }
-                    },
-
-                    hosts: {
-                        label: 'label.hosts',
-                        viewAll: {
-                            action: actions.listView('hosts', context)
-                        }
-                    },
-
-                    primaryStorage: {
-                        label: 'label.primary.storage',
-                        viewAll: {
-                            action: actions.listView('primary-storage', context)
-                        }
-                    },
-
-                    ucs: {
-                        label: 'label.ucs',
-                        viewAll: {
-                            action: actions.listView('ucs', context)
-                        }
-                    },
-
-                    secondaryStorage: {
-                        label: 'label.secondary.storage',
-                        viewAll: {
-                            action: actions.listView('secondary-storage', context)
-                        }
-                    }
-                };
-
-
-                var $computeResources = $('<ul>').addClass('resources');
-
-                // Make resource items
-                $.each(computeResources, function(id, resource) {
-                    var $li = $('<li>');
-                    var $label = $('<span>').addClass('label');
-
-                    $li.addClass(id);
-                    $label.html(_l(resource.label));
-                    $label.appendTo($li);
-
-                    // View all
-                    if (resource.viewAll) {
-                        viewAllButton($.extend(resource.viewAll, {
-                            title: _l(resource.label),
-                            $browser: $browser,
-                            context: context
-                        })).appendTo($li);
-                    }
-
-                    $li.appendTo($computeResources);
-                });
-
-                $chart.append($computeResources);
-
-                return $chart;
-            },
-
-            network: function(args) {
-                var $chart = $('<div>');
-                var $browser = $('#browser .container');
-                var $loading = $('<div>').addClass('loading-overlay');
-                var context = args.context;
-                var networkDataProvider = cloudStack.sections.system.naas.networks.dataProvider;
-                var trafficTypeDataProvider = cloudStack.sections.system.naas.trafficTypes.dataProvider;
-
-                $loading.appendTo($chart);
-
-                var renderChart = function(args) {
-                    var $targetChart = args.$chart ? args.$chart : $chart;
-                    var targetContext = $.extend(true, {}, context, {
-                        physicalNetworks: [args.data]
-                    });
-
-                    // Get traffic type data
-                    trafficTypeDataProvider({
-                        context: targetContext,
-                        response: {
-                            success: function(args) {
-                                var $networkChart = $('<div>').addClass('system-network-chart');
-                                var $trafficTypes = $('<ul>').addClass('resources traffic-types');
-
-                                $loading.remove();
-
-                                var trafficTypes = {
-                                    'public': {
-                                        label: _l('label.public'),
-                                        configure: {
-                                            action: actions.trafficTypeDetails('public', targetContext)
-                                        }
-                                    },
-
-                                    'guest': {
-                                        label: _l('label.guest'),
-                                        configure: {
-                                            action: actions.trafficTypeDetails('guest', targetContext)
-                                        }
-                                    },
-
-                                    'management': {
-                                        label: _l('label.management'),
-                                        configure: {
-                                            action: actions.trafficTypeDetails('management', targetContext)
-                                        }
-                                    },
-
-                                    'storage': {
-                                        label: _l('label.storage'),
-                                        configure: {
-                                            action: actions.trafficTypeDetails('storage', targetContext)
-                                        }
-                                    },
-
-                                    'providers': {
-                                        label: _l('label.network.service.providers'),
-                                        ignoreChart: true,
-                                        dependsOn: 'guest',
-                                        configure: {
-                                            action: actions.providerListView(targetContext)
-                                        }
-                                    }
-                                };
-
-                                var validTrafficTypes = $.map(args.data, function(trafficType) {
-                                    return trafficType.name.toLowerCase();
-                                });
-
-                                // Make traffic type elems
-                                $.each(trafficTypes, function(id, trafficType) {
-                                    if ($.inArray(id, validTrafficTypes) == -1) { //if it is not a valid traffic type
-                                        if (trafficType.dependsOn != null && trafficType.dependsOn.length > 0) { //if it has dependsOn
-                                            if ($.inArray(trafficType.dependsOn, validTrafficTypes) == -1) { //if its dependsOn is not a valid traffic type, either
-                                                return true; //skip this item
-                                            }
-                                            //else, if its dependsOn is a valid traffic type, continue to Make list item    (e.g. providers.dependsOn is 'guest')
-                                        } else {
-                                            return true; //if it doesn't have dependsOn, skip this item
-                                        }
-                                    }
-
-                                    // Make list item
-                                    var $li = $('<li>').addClass(id);
-                                    var $label = $('<span>').addClass('label').html(trafficType.label);
-                                    var $configureButton = viewAllButton($.extend(trafficType.configure, {
-                                        label: _l('label.configure'),
-                                        title: trafficType.label,
-                                        $browser: $browser,
-                                        targetContext: targetContext
-                                    }));
-
-                                    $li.append($label, $configureButton);
-                                    $li.appendTo($trafficTypes);
-
-                                    // Make chart
-                                    if (trafficType.ignoreChart)
-                                        return true;
-
-                                    var $targetChartItem = $('<div>').addClass('network-chart-item').addClass(id);
-                                    $targetChartItem.appendTo($networkChart);
-                                });
-
-                                var $switchIcon = $('<div>').addClass('network-switch-icon').append(
-                                    $('<span>').html('L2/L3 switch')
-                                );
-                                var $circleIcon = $('<div>').addClass('base-circle-icon');
-
-                                $targetChart.append($trafficTypes, $switchIcon, $networkChart, $circleIcon);
-                            }
-                        }
-                    });
-                };
-
-                // Get network data
-                networkDataProvider({
-                    context: context,
-                    response: {
-                        success: function(args) {
-                            var data = args.data;
-                            var actionFilter = args.actionFilter;
-
-                            $chart.listView({
-                                listView: $.extend(true, {}, cloudStack.sections.system.naas.networks.listView, {
-                                    dataProvider: function(args) {
-                                        args.response.success({
-                                            actionFilter: actionFilter,
-                                            data: data
-                                        });
-                                    },
-                                    detailView: {
-                                        noCompact: true,
-                                        tabs: {
-                                            network: {
-                                                title: 'label.network',
-                                                custom: function(args) {
-                                                    var $chart = $('<div>').addClass('system-chart network');
-
-                                                    renderChart({
-                                                        $chart: $chart,
-                                                        data: args.context.physicalNetworks[0]
-                                                    });
-
-                                                    return $chart;
-                                                }
-                                            }
-                                        }
-                                    }
-                                })
-                            });
-                            $loading.remove();
-                        }
-                    }
-                });
-
-                return $chart;
-            },
-
-            resources: function(args) {
-                var $chart = $('<div>').addClass('dashboard admin');
-                var $chartItems = $('<ul>');
-                var $stats = $('<div>').addClass('stats');
-                var $container = $('<div>').addClass('dashboard-container head');
-                var $top = $('<div>').addClass('top');
-                var $title = $('<div>').addClass('title').append($('<span>').html(_l('label.system.wide.capacity')));
-
-                var chartItems = {
-                    // The keys are based on the internal type ID associated with each capacity
-                    0: {
-                        name: _l('label.memory.allocated')
-                    },
-                    1: {
-                        name: _l('label.cpu.allocated')
-                    },
-                    2: {
-                        name: _l('label.primary.used')
-                    },
-                    3: {
-                        name: _l('label.primary.allocated')
-                    },
-                    6: {
-                        name: _l('label.secondary.storage')
-                    },
-                    9: {
-                        name: _l('label.local.storage')
-                    },
-                    4: {
-                        name: _l('label.public.ips')
-                    },
-                    5: {
-                        name: _l('label.management.ips')
-                    },
-                    8: {
-                        name: _l('label.direct.ips')
-                    },
-                    7: {
-                        name: _l('label.vlan')
-                    },
-                    19: {
-                        name: _l('GPU')
-                    },
-                    90: {
-                        name: _l('label.num.cpu.cores')
-                    }
-                };
-
-                $top.append($title);
-                $container.append($top, $stats.append($chartItems));
-                $chart.append($container);
-                var $loading = $('<div>').addClass('loading-overlay').prependTo($chart);
-
-                cloudStack.sections.system.zoneDashboard({
-                    context: args.context,
-                    response: {
-                        success: function(args) {
-                            $loading.remove();
-                            $.each(chartItems, function(id, chartItem) {
-                                var data = args.data[id] ? args.data[id] : {
-                                    used: 0,
-                                    total: 0,
-                                    percent: 0
-                                };
-                                var $item = $('<li>');
-                                var $name = $('<div>').addClass('name').html(chartItem.name);
-                                var $value = $('<div>').addClass('value');
-                                var $content = $('<div>').addClass('content').html('Allocated: ');
-                                var $allocatedValue = $('<span>').addClass('allocated').html(data.used);
-                                var $totalValue = $('<span>').addClass('total').html(data.total);
-                                var $chart = $('<div>').addClass('chart');
-                                var $chartLine = $('<div>').addClass('chart-line')
-                                    .css({
-                                        width: '0%'
-                                    })
-                                    .animate({
-                                        width: data.percent + '%'
-                                    });
-                                var $percent = $('<div>').addClass('percentage');
-                                var $percentValue = $('<soan>').addClass('value').html(data.percent);
-
-                                $chartItems.append(
-                                    $item.append(
-                                        $name,
-                                        $value.append(
-                                            $content.append(
-                                                $allocatedValue,
-                                                ' / ',
-                                                $totalValue
-                                            )
-                                        ),
-                                        $chart.append($chartLine),
-                                        $percent.append($percentValue, '%')
-                                    )
-                                );
-                            });
-                        }
-                    }
-                });
-
-                return $chart;
-            }
-        };
-
-        return function(args) {
-            // Fix zone context naming
-            args.context.zones = args.context.physicalResources;
-
-            if (chartFunc == null)
-                chartFunc = charts[chartID];
-
-            var $chart = chartFunc(args).addClass('system-chart').addClass(chartID);
-
-            return $chart;
-        };
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui-custom/zoneFilter.js b/ui/legacy/scripts/ui-custom/zoneFilter.js
deleted file mode 100644
index 6b9454c..0000000
--- a/ui/legacy/scripts/ui-custom/zoneFilter.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    $(window).bind('cloudStack.ready', function() {
-        var $header = $('#header .controls');
-        var $zoneFilter = $('<div>').addClass('zone-filter');
-        var $zoneTypeSelect = $('<select>').append(
-            $('<option>').attr('value', '').html(_l('All zones')),
-            $('<option>').attr('value', 'Basic').html(_l('Basic')),
-            $('<option>').attr('value', 'Advanced').html(_l('Advanced'))
-        );
-        var $label = $('<label>').html('Zone type:');
-
-        $zoneFilter.append($label, $zoneTypeSelect);
-        $zoneFilter.insertAfter($header.find('.project-switcher'));
-        $zoneTypeSelect.change(function() {
-            cloudStack.context.zoneType = $zoneTypeSelect.val();
-
-            // Go to default/start page (dashboard)
-            $('#breadcrumbs .home').click();
-        });
-    });
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui-custom/zoneWizard.js b/ui/legacy/scripts/ui-custom/zoneWizard.js
deleted file mode 100644
index d2360ab..0000000
--- a/ui/legacy/scripts/ui-custom/zoneWizard.js
+++ /dev/null
@@ -1,1434 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    /**
-     * Serialize form data as object
-     */
-    var getData = function($wizard, options) {
-        if (!options) options = {};
-
-        var $forms = $wizard.find('form').filter(function() {
-            return !options.all ? !$(this).closest('.multi-edit').length : true;
-        });
-        var $physicalNetworkItems = $wizard.find(
-            '.steps .setup-physical-network .select-container.multi'
-        ).filter(':not(.disabled)');
-        var $publicTrafficItems = $wizard.find(
-            '.steps .setup-public-traffic .data-body .data-item');
-        var $storageTrafficItems = $wizard.find(
-            '.steps .setup-storage-traffic .data-body .data-item');
-        var groupedForms = {};
-
-        if ($physicalNetworkItems.find('li.traffic-type-draggable.storage').length) {
-            $wizard.find('li.conditional.storage-traffic').show();
-        } else {
-            $wizard.find('li.conditional.storage-traffic').hide();
-        }
-
-        if (options.all) {
-            return cloudStack.serializeForm($forms, {
-                escapeSlashes: true
-            });
-        }
-
-        // Group form fields together, by form ID
-        $forms.each(function() {
-            var $form = $(this);
-            var id = $form.attr('rel');
-
-            if (!id) return true;
-
-            groupedForms[id] = cloudStack.serializeForm($form, {
-                escapeSlashes: true
-            });
-
-            return true;
-        });
-
-        // Get physical network data
-        groupedForms.physicalNetworks = $.map(
-            $physicalNetworkItems,
-            function(network) {
-                var $network = $(network);
-                var $guestForm = $wizard.find('form[guest-network-id=' + $network.index() + ']');
-                var trafficTypeConfiguration = {};
-
-                $network.find('.traffic-type-draggable').each(function() {
-                    var $trafficType = $(this);
-                    var trafficTypeID = $trafficType.attr('traffic-type-id');
-
-
-                    trafficTypeConfiguration[trafficTypeID] = $trafficType.data('traffic-type-data');
-                });
-
-                return {
-                    id: $network.index(),
-                    name: $network.find('.field.name input[type=text]').val(),
-                    isolationMethod: $network.find('.field.name select').val(),
-
-                    // Traffic type list
-                    trafficTypes: $.map(
-                        $network.find('.traffic-type-draggable'),
-                        function(trafficType) {
-                            var $trafficType = $(trafficType);
-
-                            return $trafficType.attr('traffic-type-id');
-                        }
-                    ),
-
-                    // Traffic type configuration data
-                    trafficTypeConfiguration: trafficTypeConfiguration,
-
-                    guestConfiguration: $guestForm.length ? cloudStack.serializeForm($guestForm) : null
-                };
-            }
-        );
-
-        // Get public traffic data (multi-edit)
-        groupedForms.publicTraffic = $.map(
-            $publicTrafficItems,
-            function(publicTrafficItem) {
-                var $publicTrafficItem = $(publicTrafficItem);
-                var publicTrafficData = {};
-                var fields = [
-                    'gateway',
-                    'netmask',
-                    'vlanid',
-                    'startip',
-                    'endip'
-                ];
-
-                $(fields).each(function() {
-                    publicTrafficData[this] =
-                        $publicTrafficItem.find('td.' + this + ' span').html();
-                });
-
-                return publicTrafficData;
-            }
-        );
-
-        // Get storage traffic data (multi-edit)
-        groupedForms.storageTraffic = $.map(
-            $storageTrafficItems,
-            function(storageTrafficItem) {
-                var $storageTrafficItem = $(storageTrafficItem);
-                var storageTrafficData = {};
-                var fields = [
-                    'gateway',
-                    'netmask',
-                    'vlan',
-                    'startip',
-                    'endip'
-                ];
-
-                $(fields).each(function() {
-                    storageTrafficData[this] =
-                        $storageTrafficItem.find('td.' + this + ' span').html();
-                });
-
-                return storageTrafficData;
-            }
-        );
-
-        // Hack to fix forward slash JS error
-        $.each(groupedForms, function(key1, value1) {
-            $.each(value1, function(key2, value2) {
-                if (typeof value2 == 'string') {
-                    groupedForms[key1][key2] = value2.replace(/__forwardSlash__/g, '\/');
-                }
-            });
-        });
-
-        // Include zone network type
-        if (groupedForms.zone) {
-            groupedForms.zone.networkType = $forms.find('input[name=network-model]:checked').val();
-
-            // Include zone isolation mode, supported for Advanced zones only
-            if (groupedForms.zone.networkType == 'Advanced') {
-                groupedForms.zone.sgEnabled = $forms.find('input[name=zone-advanced-sg-enabled]')
-                    .is(':checked') ? true : false;
-            }
-        }
-
-        return groupedForms;
-    };
-
-    /**
-     * Handles validation for custom UI components
-     */
-    var customValidation = {
-        networkRanges: function($form) {
-            if ($form.closest('.multi-edit').find('.data-item').length) {
-                return true;
-            }
-
-            cloudStack.dialog.notice({
-                message: _l('message.please.add.at.lease.one.traffic.range')
-            });
-            return false;
-        },
-
-        physicalNetworks: function($form) {
-            var $enabledPhysicalNetworks = $form.filter(':not(.disabled)').filter(function() {
-                return $(this).find('.traffic-type-draggable').length;
-            });
-            var $trafficTypes = $enabledPhysicalNetworks.find('.traffic-type-draggable');
-            var $configuredTrafficTypes = $trafficTypes.filter(function() {
-                var $trafficType = $(this);
-
-                return ($trafficType.data('traffic-type-data') != null);
-            });
-
-            if ($enabledPhysicalNetworks.length > 1 &&
-                $configuredTrafficTypes.length != $trafficTypes.length) {
-                cloudStack.dialog.notice({
-                    message: _l('message.configure.all.traffic.types')
-                });
-
-                return false;
-            }
-
-            return true;
-        }
-    };
-
-    /**
-     * Determine if UI components in step should be custom-validated
-     * (i.e., not a standard form)
-     */
-    var checkCustomValidation = function($step) {
-        var $multiEditForm = $step.find('.multi-edit form');
-        var $physicalNetworks = $step.find('.select-container.multi');
-        var isCustomValidated;
-
-        if ($multiEditForm.length) {
-            isCustomValidated = customValidation.networkRanges($multiEditForm);
-        } else if ($physicalNetworks.length) {
-            isCustomValidated = customValidation.physicalNetworks($physicalNetworks);
-        } else {
-            isCustomValidated = true;
-        }
-
-        return isCustomValidated;
-    };
-
-    var isAdvancedNetwork = function($wizard) {
-        return getData($wizard, {
-            all: true
-        })['network-model'] == 'Advanced';
-    };
-
-    /**
-     * Setup physical network wizard UI
-     */
-    var physicalNetwork = {
-        init: function($wizard) {
-            var $existingPhysicalNetworks = physicalNetwork.getNetworks($wizard);
-
-            // Initialize physical networks
-            if (!$existingPhysicalNetworks.length) {
-                physicalNetwork.add($wizard);
-            } else if (!isAdvancedNetwork($wizard)) {
-                $existingPhysicalNetworks.filter(':first').siblings().each(function() {
-                    physicalNetwork.remove($(this));
-                });
-            }
-
-            physicalNetwork.updateNetworks(physicalNetwork.getNetworks($wizard));
-
-            $wizard.find('.traffic-types-drag-area ul li').removeClass('required disabled clone');
-
-            // Setup clone traffic types
-            $(physicalNetwork.cloneTrafficTypes($wizard)).each(function() {
-                var trafficTypeID = this;
-
-                $wizard.find('.traffic-types-drag-area ul li').filter(function() {
-                    return $(this).hasClass(trafficTypeID);
-                }).addClass('clone');
-            });
-
-            // Setup required traffic types
-            $(physicalNetwork.requiredTrafficTypes($wizard)).each(function() {
-                var trafficTypeID = this;
-                var $firstPhysicalNetwork = physicalNetwork.getNetworks($wizard).filter(':first');
-
-                // First physical network gets required traffic types
-                physicalNetwork.assignTrafficType(trafficTypeID, $firstPhysicalNetwork);
-
-                $wizard.find('.traffic-types-drag-area ul li').filter(function() {
-                    return $(this).hasClass(trafficTypeID);
-                }).addClass('required');
-            });
-
-            // Setup disabled traffic types
-            $(physicalNetwork.disabledTrafficTypes($wizard)).each(function() {
-                var trafficTypeID = this;
-                var $trafficType = physicalNetwork.getTrafficType(this, $wizard);
-
-                physicalNetwork.unassignTrafficType($trafficType);
-
-                $wizard.find('.traffic-types-drag-area ul li').filter(function() {
-                    return $(this).hasClass(trafficTypeID);
-                }).addClass('disabled');
-            });
-        },
-
-        /**
-         * Traffic type edit dialog
-         */
-        editTrafficTypeDialog: function($trafficType) {
-            var trafficData = $trafficType.data('traffic-type-data') ?
-                $trafficType.data('traffic-type-data') : {};
-            var hypervisor = getData($trafficType.closest('.zone-wizard')).zone.hypervisor;
-            var zoneType = getData($trafficType.closest('.zone-wizard')).zone.networkType;
-            var fields;
-
-            if (hypervisor == 'VMware') {
-                fields = {
-                    vSwitchName: {
-                        label: 'label.vswitch.name' ,
-                        defaultValue: trafficData.vSwitchName
-                    },
-                    vlanId: {
-                            label: 'label.vlan.id',
-                        defaultValue: trafficData.vlanId
-                    }
-                };
-
-                if(zoneType == 'Advanced') {
-                    if(trafficData.vSwitchType == null) {
-                         var useDvs = false;
-                         $.ajax({
-                             url: createURL('listConfigurations'),
-                             data: {
-                                 name: 'vmware.use.dvswitch'
-                             },
-                             async: false,
-                             success: function(json) {
-                                 if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                     useDvs = true;
-                                 }
-                             }
-                         });
-                         if (useDvs == true) {
-                             var useNexusDvs = false;
-                             $.ajax({
-                                 url: createURL('listConfigurations'),
-                                 data: {
-                                     name: 'vmware.use.nexus.vswitch'
-                                 },
-                                 async: false,
-                                 success: function(json) {
-                                     if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                         useNexusDvs = true;
-                                     }
-                                 }
-                             });
-                             if (useNexusDvs == true) {
-                                 trafficData.vSwitchType = 'nexusdvs';
-                                 fields.vSwitchName.defaultValue = 'epp0';
-                             } else {
-                                 trafficData.vSwitchType = 'vmwaredvs';
-                                 fields.vSwitchName.defaultValue = 'dvSwitch0';
-                             }
-                         } else { //useDvs == false
-                             trafficData.vSwitchType = 'vmwaresvs';
-                             fields.vSwitchName.defaultValue = 'vSwitch0';
-                         }
-                    }
-
-                    $.extend(fields, {
-                        vSwitchType: {
-                                label: 'label.vSwitch.type',
-                            select: function (args) {
-                                args.response.success({
-                                    data: [{
-                                        id: 'nexusdvs',
-                                        description: 'Cisco Nexus 1000v Distributed Virtual Switch'
-                                    }, {
-                                        id: 'vmwaresvs',
-                                        description: 'VMware vNetwork Standard Virtual Switch'
-                                    }, {
-                                        id: 'vmwaredvs',
-                                        description: 'VMware vNetwork Distributed Virtual Switch'
-                                    }]
-                                });
-                            },
-                            defaultValue: trafficData.vSwitchType
-                        }
-                    });
-                }
-            } else {
-                fields = {
-                    label: {
-                        label: hypervisor + ' ' + _l('label.traffic.label'),
-                        defaultValue: trafficData.label
-                    }
-                };
-            }
-
-            cloudStack.dialog.createForm({
-                form: {
-                    title: _l('label.edit.traffic.type'),
-                    desc: _l('message.edit.traffic.type'),
-                    fields: fields
-                },
-
-                after: function(args) {
-                    $trafficType.data('traffic-type-data', args.data);
-                }
-            });
-        },
-
-        /**
-         * Get required traffic type IDs for proper validation
-         */
-        requiredTrafficTypes: function($wizard) {
-            return cloudStack.zoneWizard.requiredTrafficTypes({
-                data: getData($wizard)
-            });
-        },
-
-        /**
-         * Get required traffic type IDs for proper validation
-         */
-        disabledTrafficTypes: function($wizard) {
-            return cloudStack.zoneWizard.disabledTrafficTypes({
-                data: getData($wizard)
-            });
-        },
-
-        /**
-         * Get clone-type traffic type IDs for proper validation
-         */
-        cloneTrafficTypes: function($wizard) {
-            return cloudStack.zoneWizard.cloneTrafficTypes({
-                data: getData($wizard)
-            });
-        },
-
-        /**
-         * Physical network step: Renumber network form items
-         */
-        renumberFormItems: function($container) {
-            var $items = $container.find('.select-container.multi');
-
-            $items.each(function() {
-                var $item = $(this);
-                var $networkName = $item.find('.field.name input[type=text]');
-                var $networkId = $item.find('input[name=id]');
-                var $networkTypes = $item.find('.field.network-types input');
-                var index = $item.index();
-
-                $networkId.val(index);
-                $networkName.attr('name', 'physicalNetworks[' + index + ']' + '.name');
-                $networkTypes.val(index);
-            });
-        },
-
-        /**
-         * Get main physical network wizard step container
-         *
-         * @param $elem Any elem within the container
-         */
-        getMainContainer: function($elem) {
-            return $elem.closest('.steps .setup-physical-network');
-        },
-
-        /**
-         * Returns traffic elem
-         *
-         * @param trafficTypeID ID of desired traffic type
-         */
-        getTrafficType: function(trafficTypeID, $container) {
-            var $trafficType = $container.find('li.traffic-type-draggable').filter(function() {
-                return $(this).attr('traffic-type-id') == trafficTypeID;
-            });
-
-            if (physicalNetwork.isTrafficTypeClone($trafficType) && !$container.closest('.select-container.multi').length) {
-                // Get traffic type from original container
-                return $trafficType.filter(function() {
-                    return $(this).closest(
-                        physicalNetwork.getOriginalTrafficContainer($trafficType)
-                    ).length;
-                });
-            }
-
-            return $trafficType;
-        },
-
-        /**
-         * Get original drag container for traffic type elem
-         *
-         * @param $trafficType Traffic type elem
-         */
-        getOriginalTrafficContainer: function($trafficType) {
-            var $dragContainer = physicalNetwork.getMainContainer($trafficType)
-                .find('.traffic-types-drag-area ul > li')
-                .filter(function() {
-                    return $(this).hasClass($trafficType.attr('traffic-type-id'));
-                })
-                .find('ul');
-
-            return $dragContainer;
-        },
-
-        /**
-         * Get all physical networks
-         *
-         * @param $container Physical network step - main container
-         */
-        getNetworks: function($container) {
-            return $container.find('.select-container.multi');
-        },
-
-        /**
-         * Determine if traffic type is a 'cloned' type
-         *
-         * @param $trafficType
-         */
-        isTrafficTypeClone: function($trafficType) {
-            return physicalNetwork.getOriginalTrafficContainer($trafficType).parent().hasClass('clone');
-        },
-
-        /**
-         * Assigns traffic type to specified physical network
-         *
-         * @param trafficTypeID ID of desired traffic type
-         * @param $physicalNetwork Physical network elem
-         */
-        assignTrafficType: function(trafficTypeID, $physicalNetwork, data) {
-            var $container = physicalNetwork.getMainContainer($physicalNetwork);
-            var $trafficType = physicalNetwork.getTrafficType(trafficTypeID, $container);
-            var $dropArea = $physicalNetwork.find('.drop-container ul');
-
-            if ($physicalNetwork.find('.traffic-type-draggable[traffic-type-id=' + trafficTypeID + ']').length) return false;
-
-            if (physicalNetwork.isTrafficTypeClone($trafficType)) {
-                if (!physicalNetwork.getTrafficType(trafficTypeID, $physicalNetwork).length) {
-                    $trafficType = $trafficType.clone()
-                        .removeClass('disabled')
-                        .appendTo($dropArea)
-                        .draggable(physicalNetwork.draggableOptions($physicalNetwork.closest('.zone-wizard')));
-                } else {
-                    return false;
-                }
-            } else {
-                $trafficType.appendTo($dropArea);
-            }
-
-            if (data) {
-                $trafficType.data('traffic-type-data', data);
-            }
-
-            physicalNetwork.updateNetworks($.merge($physicalNetwork, $physicalNetwork.siblings()));
-
-            return $trafficType;
-        },
-
-        /**
-         * Assigns traffic type to original drag container
-         *
-         * @param trafficTypeID ID of desired traffic type
-         * @param $container Physical network wizard step container
-         * @param $physicalNetwork (optional) Specific physical network to remove from -- only for clones
-         */
-        unassignTrafficType: function($trafficType) {
-            var $wizard = $trafficType.closest('.zone-wizard');
-            var $originalContainer = physicalNetwork.getOriginalTrafficContainer($trafficType);
-            var $physicalNetworks = physicalNetwork.getNetworks($wizard);
-            var trafficTypeID = $trafficType.attr('traffic-type-id');
-
-            if (!physicalNetwork.isTrafficTypeClone($trafficType) &&
-                $.inArray(trafficTypeID, physicalNetwork.requiredTrafficTypes($wizard)) == -1) {
-                $trafficType.appendTo($originalContainer);
-            } else {
-                physicalNetwork.assignTrafficType(
-                    trafficTypeID,
-                    $physicalNetworks.filter(':first')
-                );
-
-                if (physicalNetwork.isTrafficTypeClone($trafficType) &&
-                    $physicalNetworks.find('.traffic-type-draggable[traffic-type-id=' + trafficTypeID + ']').length > 1) {
-                    $trafficType.remove();
-                }
-            }
-
-            return $trafficType;
-        },
-
-        /**
-         * Returns true if new physical network item needs to be added
-         */
-        needsNewNetwork: function($containers) {
-            // Basic zones do not have multiple physical networks
-            if (!isAdvancedNetwork($containers.closest('.zone-wizard')))
-                return false;
-
-            var $emptyContainers = $containers.filter(function() {
-                return !$(this).find('li').length;
-            });
-
-            return !$emptyContainers.length ? $containers.length : false;
-        },
-
-        /**
-         * Cleanup physical network containers
-         */
-        updateNetworks: function($containers) {
-            var $mainContainer = physicalNetwork.getMainContainer($containers);
-            var $allPhysicalNetworks = physicalNetwork.getNetworks($mainContainer);
-            var containerTotal = isAdvancedNetwork($containers.closest('.zone-wizard')) ?
-                2 : 1;
-
-            $allPhysicalNetworks.each(function() {
-                var $ul = $(this).find('.drop-container ul');
-
-                if (!$(this).find('li').length) {
-                    $(this).addClass('disabled');
-                    $ul.fadeOut();
-                } else {
-                    $(this).removeClass('disabled');
-                    $ul.show();
-                }
-            });
-
-            $containers.each(function() {
-                var $currentContainer = $(this);
-                if (!$currentContainer.find('li').length &&
-                    $containers.length > containerTotal) {
-                    $currentContainer.remove();
-                }
-            });
-
-            $containers = $containers.closest('.setup-physical-network')
-                .find('.select-container.multi');
-
-            if (physicalNetwork.needsNewNetwork($containers)) {
-                physicalNetwork.add($mainContainer.parent());
-            }
-
-            $containers.filter(':first').find('.remove.physical-network').remove();
-
-            return $containers;
-        },
-
-        /**
-         * Default options for initializing traffic type draggables
-         */
-        draggableOptions: function($wizard) {
-            return {
-                appendTo: $wizard,
-                helper: 'clone',
-
-                // Events
-                start: function(event, ui) {
-                    $(this).addClass('disabled');
-                },
-
-                stop: function(event, ui) {
-                    $(this).removeClass('disabled');
-                },
-
-                cancel: '.edit-traffic-type'
-            };
-        },
-
-        /**
-         * Physical network step: Generate new network element
-         */
-        add: function($wizard) {
-            var $container = $wizard.find('.setup-physical-network .content.input-area form');
-            var $physicalNetworkItem = $('<div>').addClass('select-container multi');
-            var $deleteButton = $('<div>').addClass('button remove physical-network')
-                .attr({
-                    title: _l('label.remove.this.physical.network')
-                })
-                .append('<span>').addClass('icon').html('&nbsp;');
-            var $icon = $('<div>').addClass('physical-network-icon');
-
-            var $nameField = $('<div>').addClass('field name').append(
-                $('<div>').addClass('name').append(
-                    $('<label>').html(_l('label.physical.network.name'))
-                ),
-                $('<div>').addClass('value').append(
-                    $('<input>').attr({
-                        type: 'text'
-                    }).addClass('required disallowSpecialCharacters')
-                )
-            );
-
-
-            var ovsTunnelManager = false;
-            $.ajax({
-                url: createURL('listConfigurations'),
-                data: {
-                    name: 'sdn.ovs.controller'
-                },
-                dataType: "json",
-                async: false,
-                success: function(json) {
-                    var items = json.listconfigurationsresponse.configuration; //2 entries returned: 'sdn.ovs.controller', 'sdn.ovs.controller.default.label'
-                    $(items).each(function() {
-                        if (this.name == 'sdn.ovs.controller') {
-                            if (this.value == 'true' || this.value == true) {
-                                ovsTunnelManager = true;
-                            }
-                            return false; //break each loop
-                        }
-                    });
-                }
-            });
-            //when OVS tunnel manager is used
-            //if(ovsTunnelManager == true) {
-            //Advanced zone supports 2 isolation method(VLAN, GRE), so show dropdown including the 2 options
-            if ($wizard.find('.select-network-model input:radio[name=network-model]:checked').val() == 'Advanced') {
-                $nameField.append(
-                    $('<div>').append(
-                        $('<span style=\"font-size:11px;padding-right:5px;padding-left:40px\">').html(_l('label.isolation.method')),
-                        $('<select>').append(
-                            $('<option>').attr({
-                                value: 'VLAN'
-                            }).html('VLAN'),
-                            $('<option>').attr({
-                                value: 'GRE'
-                            }).html('GRE'),
-                            $('<option>').attr({
-                                value: 'STT'
-                            }).html('STT'),
-                            $('<option>').attr({
-                                value: 'BCF_SEGMENT'
-                            }).html('BCF_SEGMENT'),
-                            $('<option>').attr({
-                                value: 'SSP'
-                            }).html('SSP'),
-                            $('<option>').attr({
-                                value: 'VXLAN'
-                            }).html('VXLAN'),
-                            $('<option>').attr({
-                                value: 'ODL'
-                            }).html('ODL'),
-                            $('<option>').attr({
-                                value: 'L3VPN'
-                            }).html('L3VPN'),
-                            $('<option>').attr({
-                                value: 'VCS'
-                            }).html('VCS')
-                        )
-                    )
-                );
-            }
-            //Basic zone supports only 1 isolation method (L3), so there is no point showing dropdown.
-            //            }
-            //when OVS tunnel manager is not used, isolationmethods parameter in createPhysicalNetwork API is ignored. So no showing dropdown.
-            //isolationmethods parameter has not been used by network gurus so far. By default(i.e. when OVS tunnel manager is not used), networks are isolated with VLANs in Advanced zone, with L3 in basic zone.
-            //No longer the case, as the Nicira stuff also depends on this now
-
-
-            var $dropContainer = $('<div>').addClass('drop-container').append(
-                $('<span>').addClass('empty-message').html(
-                    'Drag and drop traffic types you would like to add here.'
-                ),
-                $('<ul>').hide()
-            ).droppable({
-                over: function(event, ui) {
-                    var $ul = $(this).find('ul');
-
-                    $ul.addClass('active');
-
-                    if (!$ul.find('li').length) {
-                        $(this).closest('.select-container.multi').removeClass('disabled');
-                        $ul.fadeIn();
-                    }
-                },
-
-                out: function(event, ui) {
-                    var $ul = $(this).find('ul');
-
-                    $ul.removeClass('active');
-                    physicalNetwork.updateNetworks($(this).closest('.select-container.multi'));
-                },
-
-                drop: function(event, ui) {
-                    var trafficTypeID = ui.draggable.attr('traffic-type-id');
-                    var $physicalNetwork = $(this).closest('.select-container.multi');
-                    var trafficTypeData = ui.draggable.data('traffic-type-data');
-
-                    if (trafficTypeID == 'guest' &&
-                        ui.draggable.closest('.select-container.multi').length) {
-                        ui.draggable.remove();
-                    }
-
-                    physicalNetwork.assignTrafficType(trafficTypeID, $physicalNetwork, trafficTypeData);
-                }
-            });
-
-            var $idField = $('<input>').attr({
-                type: 'hidden',
-                name: 'id',
-                value: 0
-            });
-
-            // Initialize new default network form elem
-            $physicalNetworkItem.append(
-                $icon,
-                $nameField,
-                $idField,
-                $dropContainer
-            );
-
-            // Only advanced zones can remove physical network
-            if (isAdvancedNetwork($wizard)) {
-                $physicalNetworkItem.prepend($deleteButton);
-            }
-
-            $physicalNetworkItem.hide().appendTo($container).fadeIn('fast');
-            $physicalNetworkItem.find('.name input').val('Physical Network ' + parseInt($physicalNetworkItem.index() + 1));
-            physicalNetwork.renumberFormItems($container);
-
-            // Remove network action
-            $physicalNetworkItem.find('.button.remove.physical-network').click(function() {
-                physicalNetwork.remove($physicalNetworkItem);
-            });
-
-            $physicalNetworkItem.addClass('disabled'); // Since there are no traffic types yet
-
-            return $physicalNetworkItem;
-        },
-
-        /**
-         * Physical network step: Remove specified network element
-         *
-         * @param $physicalNetworkItem Physical network container to remove
-         */
-        remove: function($physicalNetworkItem) {
-            var $container = $physicalNetworkItem.closest('.setup-physical-network .content.input-area form');
-            var $trafficTypes = $physicalNetworkItem.find('li.traffic-type-draggable');
-
-            $trafficTypes.each(function() {
-                var trafficTypeID = $(this).attr('traffic-type-id');
-
-                physicalNetwork.assignTrafficType(
-                    trafficTypeID,
-                    $physicalNetworkItem.prev()
-                );
-            });
-
-            $trafficTypes.filter('.clone').remove();
-            physicalNetwork.updateNetworks($physicalNetworkItem.parent().find('.multi'));
-            $container.validate('refresh');
-        }
-    };
-
-    /**
-     * Configure guest traffic UI
-     */
-    var guestTraffic = {
-        init: function($wizard, args) {
-            var $physicalNetworks = physicalNetwork.getNetworks($wizard);
-            var $tabs = guestTraffic.makeTabs($physicalNetworks, args);
-            var $container = guestTraffic.getMainContainer($wizard);
-
-            // Cleanup
-            guestTraffic.remove($wizard);
-
-            $container.find('.content form').hide();
-            $tabs.appendTo($container.find('.content .select-container'));
-            var $subnav = $container.find('ul.subnav').remove(); // Fix to avoid subnav becoming tab ul
-            $container.tabs();
-            $container.prepend($subnav);
-            $container.find('.field').hide();
-            $container.find('[rel=vlanRange]').show();
-        },
-
-        /**
-         * Cleanup
-         */
-        remove: function($wizard) {
-            var $container = guestTraffic.getMainContainer($wizard);
-
-            // Cleanup
-            $container.tabs('destroy');
-            $container.find('.physical-network-item').remove();
-            $container.find('.content form').show();
-        },
-
-        getMainContainer: function($wizard) {
-            return $wizard.find('.steps .setup-guest-traffic');
-        },
-
-        makeTabs: function($physicalNetworks, args) {
-            var $tabs = $('<ul></ul>').addClass('physical-network-item');
-            var $content = $();
-
-            // Only use networks w/ guest traffic type
-            $physicalNetworks = $physicalNetworks.filter(function() {
-                return $(this).find('li.guest').length;
-
-                return true;
-            });
-
-            $physicalNetworks.each(function() {
-                var $network = $(this);
-                var $form = makeForm(args, 'guestTraffic', {});
-                var refID = $network.find('input[name=id]').val();
-                var networkID = 'physical-network-' + refID;
-
-                $form.attr('guest-network-id', refID);
-
-                $tabs.append($('<li></li>').append(
-                    $('<a></a>')
-                    .attr({
-                        href: '#' + networkID
-                    })
-                    .html($network.find('.field.name input').val())
-                ));
-                $.merge(
-                    $content,
-                    $('<div></div>')
-                    .addClass('physical-network-item')
-                    .attr({
-                        id: networkID
-                    })
-                    .append($form)
-                );
-
-                $form.validate();
-            });
-
-            $tabs.find('li:first').addClass('first');
-            $tabs.find('li:last').addClass('last');
-
-            return $.merge($tabs, $content);
-        }
-    };
-
-    /**
-     * Generate dynamic form, based on ID of form object given
-     */
-    var makeForm = function(args, id, formState) {
-        var form = cloudStack.dialog.createForm({
-            noDialog: true,
-            context: $.extend(true, {}, cloudStack.context, {
-                zones: [formState]
-            }),
-            form: {
-                title: '',
-                desc: '',
-                fields: args.forms[id].fields
-            },
-            after: function(args) {}
-        });
-
-        var $form = form.$formContainer.find('form');
-
-        // Cleanup form to follow zone wizard CSS naming
-        $form.attr('rel', id);
-        $form.find('input[type=submit]').remove();
-        $form.find('.form-item').addClass('field').removeClass('form-item');
-        $form.find('label.error').hide();
-        $form.find('.form-item .name').each(function() {
-            $(this).html($(this).find('label'));
-        });
-        $form.find('label[for]').each(function() {
-            var forAttr = $(this).attr('for');
-            $form.find('#' + forAttr).attr('id', id + '_' + forAttr);
-            $(this).attr('for', id + '_' + forAttr)
-        });
-
-        $form.find('select, input').change(function() {
-            cloudStack.evenOdd($form, '.field:visible', {
-                even: function($row) {
-                    $row.removeClass('odd');
-                },
-                odd: function($row) {
-                    $row.addClass('odd');
-                }
-            });
-        });
-
-        return $form;
-    };
-
-    cloudStack.uiCustom.zoneWizard = function(args) {
-        return function() {
-            var $wizard = $('#template').find('div.zone-wizard').clone();
-            var $progress = $wizard.find('div.progress ul li');
-            var $steps = $wizard.find('div.steps').children().hide().filter(':not(.disabled)');
-
-            $wizard.data('startfn', null);
-
-            // Close wizard
-            var close = function() {
-                $wizard.dialog('destroy');
-                $('div.overlay').fadeOut(function() {
-                    $('div.overlay').remove();
-                });
-            };
-
-            // Save and close wizard
-            var completeAction = function() {
-                var $launchStep = $wizard.find('.steps .review');
-                var data = getData($wizard);
-                var enableZoneAction = args.enableZoneAction;
-
-                // Convert last step to launch appearance
-                $launchStep.find('.main-desc').hide();
-                $launchStep.find('.main-desc.launch').show();
-                $launchStep.find('.launch-container').show();
-                $launchStep.find('ul').html('');
-                $wizard.find('.buttons').hide();
-                $wizard.find('.button.previous').remove();
-
-                var makeMessage = function(message, isError) {
-                    var $li = $('<li>')
-                        .addClass(!isError ? 'loading' : 'info')
-                        .append(
-                            $('<span>').addClass('icon').html('&nbsp;'),
-                            $('<span>').addClass('text').html(message)
-                    );
-                    var $launchContainer = $launchStep.find('.launch-container');
-
-                    $launchStep.find('ul').append($li);
-                    $li.prev().removeClass('loading');
-                    $launchContainer.scrollTop($launchContainer.height());
-
-                    if (isError) {
-                        $li.prev().addClass('error');
-                    }
-
-                };
-
-                args.action({
-                    data: data,
-                    wizard: $wizard,
-                    startFn: $wizard.data('startfn'),
-                    uiSteps: $.map(
-                        $wizard.find('.steps > div'),
-                        function(step) {
-                            return $(step).attr('zone-wizard-step-id');
-                        }
-                    ),
-                    response: {
-                        success: function(args) {
-                            $launchStep.find('ul li').removeClass('loading');
-
-                            var closeWindow = function() {
-                                close();
-                                $(window).trigger('cloudStack.fullRefresh');
-                            };
-
-                            var enableZone = function() {
-                                makeMessage(_l('message.enabling.zone'));
-
-                                enableZoneAction({
-                                    formData: data,
-                                    data: data,
-                                    launchData: args.data,
-                                    response: {
-                                        success: function(args) {
-                                            closeWindow();
-                                        },
-
-                                        error: function(message) {
-                                            cloudStack.dialog.notice({
-                                                message: _l('error.could.not.enable.zone') + ':</br>' + message
-                                            });
-                                        }
-                                    }
-                                });
-                            };
-
-                            cloudStack.dialog.confirm({
-                                message: _l('message.zone.creation.complete.would.you.like.to.enable.this.zone'),
-                                action: function() {
-                                    enableZone();
-                                },
-                                cancelAction: function() {
-                                    closeWindow();
-                                }
-                            });
-                        },
-                        error: function(stepID, message, start) {
-                            var goNextOverride = function(event) {
-                                $(this).unbind('click', goNextOverride);
-                                showStep(stepID, false, {
-                                    nextStep: 'launch'
-                                });
-
-                                return false;
-                            };
-
-                            $wizard.find('.buttons').show();
-                            $wizard.find('.buttons .button.next')
-                                .removeClass('final')
-                                .html('<span>Fix errors</span>')
-                                .click(goNextOverride);
-                            makeMessage(_l('error.something.went.wrong.please.correct.the.following') + ':<br/>' + message, true);
-                            $wizard.data('startfn', start);
-                        },
-                        message: makeMessage
-                    }
-                });
-            };
-
-            // Go to specified step in wizard,
-            // updating nav items and diagram
-            var showStep = function(index, goBack, options) {
-                if (!options) options = {};
-
-                if (typeof index == 'string') {
-                    index = $wizard.find('[zone-wizard-step-id=' + index + ']').index() + 1;
-                }
-
-                var targetIndex = index - 1;
-
-                if (index <= 1) targetIndex = 0;
-                if (targetIndex == $steps.length) {
-                    completeAction();
-                }
-
-                $steps.hide();
-                $wizard.find('.buttons').show();
-
-                var $targetStep = $($steps[targetIndex]).show();
-                var $uiCustom = $targetStep.find('[ui-custom]');
-                var formState = getData($wizard, {
-                    all: true
-                });
-                var groupedFormState = getData($wizard);
-                var formID = $targetStep.attr('zone-wizard-form');
-                var stepPreFilter = cloudStack.zoneWizard.preFilters[
-                    $targetStep.attr('zone-wizard-prefilter')
-                ];
-
-                // Bypass step check
-                if (stepPreFilter && !stepPreFilter({
-                    data: formState,
-                    groupedData: groupedFormState
-                })) {
-                    return showStep(!goBack ? index + 1 : index - 1,
-                        goBack
-                    );
-                }
-
-                if (formID) {
-                    if (!$targetStep.find('form').length) {
-                        makeForm(args, formID, formState).appendTo($targetStep.find('.content.input-area .select-container'));
-
-                        setTimeout(function() {
-                            cloudStack.evenOdd($targetStep, '.field:visible', {
-                                even: function() {},
-                                odd: function($row) {
-                                    $row.addClass('odd');
-                                }
-                            });
-                        }, 50);
-                    } else {
-                        // Always re-activate selects
-                        $targetStep.find('form select').each(function() {
-                            var $select = $(this);
-                            var selectFn = $select.data('dialog-select-fn');
-                            var originalVal = $select.val();
-
-                            if (selectFn) {
-                                $select.html('');
-                                selectFn({
-                                    context: {
-                                        zones: [formState]
-                                    }
-                                });
-                                $select.val(originalVal);
-                                $select.trigger('change');
-                            }
-                        });
-                    }
-
-                    if (args.forms[formID].preFilter) {
-                        var preFilter = args.forms[formID].preFilter({
-                            $form: $targetStep.find('form'),
-                            data: formState
-                        });
-                    }
-                }
-
-                // Custom UI manipulations for specific steps
-                switch ($targetStep.attr('zone-wizard-step-id')) {
-                    case 'configureGuestTraffic':
-                        if (formState['network-model'] == 'Advanced' && formState['zone-advanced-sg-enabled'] == undefined) {
-                            guestTraffic.init($wizard, args); //initialize multiple tabs (tabs is as many as Guest Traffic types in multiple physical networks in Advanced Zone without SG)
-                        } else {
-                            guestTraffic.remove($wizard);
-                        }
-                        break;
-
-                    case 'setupPhysicalNetwork':
-                        if(!goBack) {
-                            physicalNetwork.init($wizard);
-                        }
-                }
-
-                if ($uiCustom.length) {
-                    $uiCustom.each(function() {
-                        var $item = $(this);
-                        var id = $item.attr('ui-custom');
-
-                        $item.replaceWith(
-                            args.customUI[id]({
-                                data: formState,
-                                context: cloudStack.context
-                            })
-                        )
-                    });
-                }
-
-                if (!targetIndex) {
-                    $wizard.find('.button.previous').hide();
-                } else {
-                    $wizard.find('.button.previous').show();
-                }
-
-                var $nextButton = $wizard.find('.button.next');
-                $nextButton.find('span').html(_l('label.next'));
-                $nextButton.removeClass('final post-launch');
-
-                // Show launch button if last step
-                if ($targetStep.index() == $steps.length - 1 || options.nextStep) {
-                    $nextButton.find('span').html(options.nextStep ? _l('label.save.changes') : _l('label.launch.zone'));
-                    $nextButton.addClass('final');
-
-                    if (options.nextStep) {
-                        $nextButton.addClass('post-launch');
-                    }
-                }
-
-                // Update progress bar
-                var $targetProgress = $progress.removeClass('active').filter(function() {
-                    return $(this).index() <= targetIndex;
-                }).toggleClass('active');
-
-                setTimeout(function() {
-                    if (!$targetStep.find('input[type=radio]:checked').length) {
-                        $targetStep.find('input[type=radio]:first').click();
-                    }
-                }, 50);
-
-                $targetStep.find('form').validate();
-            };
-
-            // Events
-            $wizard.find('select').change(function(event) {
-                // Conditional selects (on step 4 mainly)
-                var $target = $(this);
-                var $tagged = $wizard.find('.conditional.vlan-type-tagged');
-                var $untagged = $wizard.find('.conditional.vlan-type-untagged');
-                var $accountSpecific = $wizard.find('.field.conditional.ip-scope-account-specific');
-
-                // VLAN - tagged
-                if ($target.is('[name=vlan-type]')) {
-                    $tagged.hide();
-                    $untagged.hide();
-                    $accountSpecific.hide();
-
-                    if ($target.val() == 'tagged') {
-                        $untagged.hide();
-                        $tagged.show();
-                    } else if ($target.val() == 'untagged') {
-                        $tagged.hide();
-                        $untagged.show();
-                    }
-
-                    $.merge($tagged, $untagged).find('select:visible').trigger('change');
-
-                    cloudStack.evenOdd($wizard, '.field:visible', {
-                        even: function($elem) {
-                            $elem.removeClass('odd');
-                            $elem.addClass('even');
-                        },
-                        odd: function($elem) {
-                            $elem.removeClass('even');
-                            $elem.addClass('odd');
-                        }
-                    });
-
-                    return true;
-                }
-
-                // IP Scope - acct. specific
-                if ($target.is('select.ip-scope')) {
-                    $accountSpecific.hide();
-                    if ($target.val() == 'account-specific') $accountSpecific.show();
-
-                    cloudStack.evenOdd($wizard, '.field:visible', {
-                        even: function($elem) {
-                            $elem.removeClass('odd');
-                            $elem.addClass('even');
-                        },
-                        odd: function($elem) {
-                            $elem.removeClass('even');
-                            $elem.addClass('odd');
-                        }
-                    });
-                }
-
-                return true;
-            });
-
-            $wizard.click(function(event) {
-                var $target = $(event.target);
-
-                // Radio button
-                if ($target.is('[type=radio]')) {
-
-                    if ($target.attr('name') == 'network-model') {
-                        var $inputs = $wizard.find('.isolation-mode').find('input[name=isolation-mode]').attr({
-                            disabled: 'disabled'
-                        });
-
-                        var $selectArea = $target.closest('.select-area');
-
-                        if ($target.val() == 'Advanced') {
-                            $inputs.attr('disabled', false);
-                            $selectArea.removeClass('disabled')
-                                .find('.isolation-mode input').attr('disabled', false);
-                        } else if ($target.val() == 'Basic') {
-                            $selectArea.siblings('.advanced-zone').addClass('disabled')
-                                .find('.isolation-mode input').attr('disabled', 'disabled');
-                        }
-                    }
-
-                    return true;
-                }
-
-                // Checkbox
-                if ($target.is('[type=checkbox]:checked')) {
-                    $('div.conditional.' + $target.attr('name')).hide();
-
-                    return true;
-                } else if ($target.is('[type=checkbox]:unchecked')) {
-                    $('div.conditional.' + $target.attr('name')).show();
-
-                    return true;
-                }
-
-                // Next button
-                if ($target.closest('div.button.next').length) {
-                    var $step = $steps.filter(':visible');
-                    // Validation
-                    var $form = $('form:visible').filter(function() {
-                        // Don't include multi-edit (validation happens separately)
-                        return !$(this).closest('.multi-edit').length;
-                    });
-
-                    // Handle validation for custom UI components
-                    var isCustomValidated = checkCustomValidation($step);
-                    if (($form.length && !$form.valid()) || !isCustomValidated) {
-                        if (($form && $form.find('.error:visible').length) || !isCustomValidated)
-                            return false;
-                    }
-
-                    //when hypervisor is BareMetal (begin)
-                    var data = getData($wizard);
-                    if (('zone' in data) && (data.zone.hypervisor == 'BareMetal')) {
-                        if ($('.zone-wizard:visible').find('#add_zone_guest_traffic_desc:visible').length > 0) { //$steps.filter(':visible').index() == 6
-                            showStep('launch');
-                            completeAction();
-                            return false;
-                        }
-                    }
-                    //when hypervisor is BareMetal (end)
-
-                    if (!$target.closest('.button.next.final').length)
-                        showStep($steps.filter(':visible').index() + 2);
-                    else {
-                        if ($target.closest('.button.next.final.post-launch').length) {
-                            showStep('launch');
-                        }
-
-                        completeAction();
-                    }
-
-                    return false;
-                }
-
-                // Previous button
-                if ($target.closest('div.button.previous').length) {
-                    showStep($steps.filter(':visible').index(), true);
-
-                    return false;
-                }
-
-                // Close button
-                if ($target.closest('div.button.cancel').length) {
-                    close();
-
-                    return false;
-                }
-
-                // Edit link
-                if ($target.closest('div.edit').length) {
-                    var $edit = $target.closest('div.edit');
-
-                    showStep($edit.find('a').attr('href'));
-
-                    return false;
-                }
-
-                // Edit traffic type button
-                var $editTrafficTypeButton = $target.closest('.drop-container .traffic-type-draggable .edit-traffic-type');
-                var $trafficType = $editTrafficTypeButton.closest('.traffic-type-draggable');
-
-                if ($editTrafficTypeButton.length) {
-                    physicalNetwork.editTrafficTypeDialog($trafficType);
-
-                    return false;
-                }
-
-                return true;
-            });
-
-            // Add/remove network action
-            $wizard.find('.button.add.new-physical-network').click(function() {
-                addPhysicalNetwork($wizard);
-            });
-
-            // Traffic type draggables
-            $wizard.find('.traffic-type-draggable').draggable(physicalNetwork.draggableOptions($wizard));
-
-            // For removing traffic types from physical network
-            $wizard.find('.traffic-types-drag-area').droppable({
-                drop: function(event, ui) {
-                    physicalNetwork.unassignTrafficType(ui.draggable);
-
-                    return true;
-                }
-            });
-
-            showStep(1);
-
-            var $dialog = $wizard.dialog({
-                title: _l('label.installWizard.addZone.title'),
-                closeOnEscape: false,
-                width: 750,
-                height: 665,
-                resizable: false
-            });
-            
-            return cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-        };
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui/core.js b/ui/legacy/scripts/ui/core.js
deleted file mode 100644
index 09a3ebc..0000000
--- a/ui/legacy/scripts/ui/core.js
+++ /dev/null
@@ -1,488 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    $.extend(cloudStack, {
-        ui: {
-            widgets: {} // Defines API methods for UI widgets
-        },
-        uiCustom: {}
-    });
-
-    /**
-     * Generate navigation <li>s
-     *
-     * @param args cloudStack data args
-     */
-    var makeNavigation = function(args) {
-        var $navList = $('<ul>');
-        var preFilter = cloudStack.sectionPreFilter ?
-            cloudStack.sectionPreFilter({
-                context: $.extend(true, {}, args.context, {
-                    sections: $.map(cloudStack.sections, function(value, key) {
-                        return key;
-                    })
-                })
-            }) : null;
-
-        $.each(args.sections, function(sectionID, args) {
-            if (preFilter && $.inArray(sectionID, preFilter) == -1) {
-                if (!(args.preFilter && args.preFilter())) {
-                    return true;
-                }
-            }
-
-
-            var $li = $('<li>')
-                .addClass('navigation-item')
-                .addClass(sectionID)
-                .append($('<span>').addClass('icon').html('&nbsp;'))
-                .append($('<span>').text(_l(args.title)))
-                .data('cloudStack-section-id', sectionID);
-
-            if (args.customIcon) {
-                $li.addClass('custom-icon').find('span.icon').html('').append(
-                    $('<img>').attr({
-                        src: args.customIcon
-                    })
-                );
-            }
-
-            if (args.isPlugin && !args.showOnNavigation) {
-                $li.hide();
-            }
-
-            $li.appendTo($navList);
-
-            return true;
-        });
-
-        // Special classes for first and last items
-        $navList.find('li:first').addClass('first');
-        $navList.find('li:last').addClass('last');
-
-        return $navList;
-    };
-
-    /**
-     * Create section contents
-     *
-     * @param sectionID Section's ID to show
-     * @param args CloudStack3 configuration
-     */
-    var showSection = function(sectionID, args, $browser) {
-        var $navItem = $('#navigation').find('li').filter(function() {
-            return $(this).hasClass(sectionID);
-        });
-        var data = args.sections[sectionID];
-        var isPlugin = data.isPlugin && !data.showOnNavigation;
-
-        data.$browser = $browser;
-
-        // Reset browser panels
-        if (!isPlugin) {
-            $navItem.siblings().removeClass('active');
-            $navItem.addClass('active');
-            $browser.cloudBrowser('removeAllPanels');
-        }
-
-        $browser.cloudBrowser('addPanel', {
-            title: '<span class="section">' + _l(data.title) + '</span>' + '<span class="subsection"></span>',
-            data: '',
-            complete: function($panel, $breadcrumb) {
-                if(!isPlugin) {
-                    $breadcrumb.attr('title', _l(data.title));
-                }
-
-                data.$breadcrumb = $breadcrumb;
-
-                // Hide breadcrumb if this is the home section
-                if (args.home === sectionID) {
-                    $('#breadcrumbs').find('li:first, div.end:last').hide();
-                }
-
-                // Append specified widget to view
-                if (data.show)
-                    $panel.append(data.show(data));
-                else if (data.treeView)
-                    $panel.treeView(data, {
-                        context: args.context
-                    });
-                else
-                    $panel.listView(data, {
-                        context: args.context
-                    });
-            }
-        });
-
-        return $navItem;
-    };
-
-    // Define page element generation fns
-    var pageElems = {
-        header: function(args) {
-            // Make notification area
-            var $notificationArea = $('<div>').addClass('button notifications')
-                .append(
-                    $('<div>').addClass('total')
-                    // Total notifications
-                    .append($('<span>').html(0))
-            )
-                .append($('<span>').html(_l('label.notifications')))
-                .notifications();
-
-            // Project switcher
-            var $viewSwitcher = $('<div>').addClass('button view-switcher')
-                .append(
-                    // Default View
-                    $('<div>').addClass('select default-view active')
-                    .html(_l('label.default.view'))
-                    .prepend(
-                        $('<span>').addClass('icon').html('&nbsp;')
-
-
-                    )
-            )
-                .append(
-                    // Project View
-                    $('<div>').addClass('select project-view')
-                    .html(_l('label.project.view'))
-                    .prepend(
-                        $('<span>').addClass('icon').html('&nbsp;')
-                    )
-            )
-                .click(function(event) {
-                    var $target = $(event.target);
-                    var $projectSwitcher = $(this);
-                    var $container = $('html body');
-                    var $navDisabled = $(
-                        $.map([
-                            'projects',
-                            'accounts',
-                            'domains',
-                            'system',
-                            'global-settings',
-                            'configuration'
-                        ], function(id) {
-                            return '#navigation li.' + id;
-                        }).join(',')
-                    );
-
-                    if ($target.closest('.select.project-view').length) {
-                        $('#cloudStack3-container').addClass('project-view');
-                        $projectSwitcher.addClass('alt');
-                        $projectSwitcher.find('.select.project-view').addClass('active')
-                            .siblings().removeClass('active');
-
-                        // Activate project view
-                        $navDisabled.hide();
-                        cloudStack.uiCustom.projects({
-                            $projectSelect: $projectSelect.hide().find('select')
-                        });
-                    } else {
-                        $navDisabled.show();
-                        $('#cloudStack3-container').removeClass('project-view');
-                        $projectSwitcher.removeClass('alt');
-                        $projectSelect.hide();
-                        $projectSwitcher.find('.select.default-view').addClass('active')
-                            .siblings().removeClass('active');
-
-                        // Put project name in header
-                        $('.select.project-view').html(
-                            '<span class="icon">&nbsp;</span>' + _l('label.project.view')
-                        ).attr('title', '');
-
-                        // Clear out project
-                        cloudStack.context.projects = null;
-                    }
-
-                    $('#navigation li.dashboard').click();
-
-                    return false;
-                });
-            var $projectSelect = $('<div>').addClass('view-switcher').hide()
-                .append($('<select>'));
-
-            // User status area
-            var userLabel = args.context.users[0].name ?
-                args.context.users[0].name : args.context.users[0].login;
-            var $userInfo = $('<div>').attr({
-                id: 'user'
-            }).addClass('button')
-                .append(
-                    $('<div>').addClass('name').text(
-                        args.context && args.context.users ?
-                        cloudStack.concat(userLabel, 21) : 'Invalid User'
-                    )
-            )
-                .append(
-                    $('<div>').addClass('icon options')
-                    .append(
-                        $('<div>').addClass('icon arrow')
-                    )
-            );
-            $userInfo.attr('title', userLabel);
-
-            return [
-                $('<div>').addClass('logo'),
-                $('<div>').addClass('controls')
-                .append($notificationArea)
-                .append($viewSwitcher)
-                .append($projectSelect)
-                .append($userInfo)
-            ];
-        },
-
-        'main-area': function(args) {
-            var $navigation = $('<div>').attr({
-                id: 'navigation'
-            });
-            var $browser = $('<div>').attr({
-                id: 'browser'
-            })
-                .append(
-                    // Home breadcrumb
-                    $('<div>').attr({
-                        id: 'breadcrumbs'
-                    })
-                    .append($('<div>').addClass('home').text(_l('label.home')))
-                    .append($('<div>').addClass('end'))
-            )
-
-            .append(
-                // Panel container
-                $('<div>').addClass('container')
-            );
-
-            makeNavigation(args).appendTo($navigation);
-
-            return [
-                $navigation, $browser
-            ];
-        }
-    };
-
-    $.fn.cloudStack = function(args) {
-        var $container = $('<div>')
-            .attr({
-                id: 'container',
-                'cloudStack-container': true
-            })
-            .data('cloudStack-args', args)
-            .appendTo(this);
-        var context = args.context;
-
-        // Cleanup login
-        $('.login').remove();
-
-        // Create pageElems
-        $.each(pageElems, function(id, fn) {
-            var $elem = $('<div>').attr({
-                id: id
-            });
-
-            $(fn(args)).each(function() {
-                $elem.append($(this));
-            });
-
-            $elem.appendTo($container);
-        });
-
-        // User options
-        var $options = $('<div>').attr({
-            id: 'user-options'
-        })
-            .appendTo($('#user'));
-
-        $(['label.logout', 'label.help', 'label.about']).each(function() {
-            var $link = $('<a>')
-                .attr({
-                    href: '#'
-                })
-                .text(_l(this.toString()))
-                .appendTo($options);
-
-            if (this == 'label.help') {
-                $link.addClass('help').click(function() {
-                    window.open(cloudStackOptions.helpURL, '_blank');
-                    return false;
-                });
-            }
-            if (this == 'label.about') {
-                $link.addClass('about').click(function() {
-                    var $logo = $('<div>').addClass('logo').text(_l(cloudStackOptions.aboutText)),
-                        $version = $('<div>').addClass('version').text(_l(g_cloudstackversion)),
-                        $about = $('<div>').addClass('about').append($logo).append($version);
-
-                    var $aboutDialog = $about.dialog({
-                        modal: true,
-                        width: 300,
-                        title: _l(cloudStackOptions.aboutTitle),
-                        closeOnEscape: false,
-                        dialogClass: 'dialog-about',
-                        buttons: {
-                            'Close': function() {
-                                $(this).dialog("close");
-                                $(':ui-dialog, .overlay').remove();
-                            }
-                        }
-                    });
-                    cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($aboutDialog);
-                    return false;
-                });
-            }
-        });
-
-        // Initialize browser
-        $container.find('#browser div.container').cloudBrowser();
-        $container.find('#navigation li')
-            .filter(function() {
-                return $(this).hasClass(args.home);
-            })
-            .click();
-
-        // Validation
-        $.extend($.validator.messages, {
-            required: _l('label.required')
-        });
-
-        $.validator.addMethod(
-            "disallowSpecialCharacters",
-            function(value, element) {
-                return (value.indexOf("<") == -1 && value.indexOf(">") == -1);
-            },
-            jQuery.validator.format('message.disallowed.characters')
-        );
-
-        // Check for pending project invitations
-        if (args.projects) {
-            args.projects.invitationCheck({
-                context: cloudStack.context,
-                response: {
-                    success: function(args) {
-                        if (!args.data.length) return;
-
-                        var projectList = $.map(args.data, function(invitation) {
-                            return '<li>' + invitation.project + '</li>';
-                        }).join('');
-
-                        cloudStack.dialog.notice({
-                            message: _l('message.pending.projects.1') + '<ul>' + projectList + '</ul>' + '<p>' + _l('message.pending.projects.2') + '</p>'
-                        });
-                    }
-                }
-            });
-        }
-
-        // Hide logo conditionally
-        if (!args.hasLogo) $('#header, #header .controls').addClass('nologo');
-
-        $(window).trigger('cloudStack.ready');
-
-        return this;
-    };
-
-    // Events
-    $(function() {
-        // Check if target should be hovered
-        function checkHoveredLabel($target) {
-            var $multiWizard = $('div.ui-dialog div.multi-wizard');
-            if (($target.is('label[for]') && !$target.parents('body.login')) ||
-                ($multiWizard.length &&
-                    ($target.is('.multi-wizard label') && $target.prev('input[type="radio"],input[type="checkbox"]').length) ||
-                    ($target.is('.multi-wizard .select-desc div.name') && $target.parent('div.select-desc').prev('input[type="radio"],input[type="checkbox"]').length)
-                ))
-                return true;
-
-            return false;
-        }
-
-        // Rollover behavior for user options
-        $(document).bind('mouseover', function(event) {
-            var $target = $(event.target);
-            if (checkHoveredLabel($target)) {
-                $target.addClass('label-hovered');
-            }
-            if ($target.closest('#user, #user-options').length) {
-                return false;
-            } else $('#user-options').hide();
-
-            return false;
-        });
-
-        $(document).bind('mouseout', function(event) {
-            var $target = $(event.target);
-            if (checkHoveredLabel($target)) {
-                $target.removeClass('label-hovered');
-            }
-        });
-
-        $(document).bind('click', function(event) {
-            var $target = $(event.target);
-            var $container = $target.closest('[cloudStack-container]');
-            var args = $container.data('cloudStack-args');
-            var $browser = $container.find('#browser .container');
-            var $multiWizard = $('div.ui-dialog div.multi-wizard');
-
-            // Wizard: trigger click event for input when click it label
-            if ($multiWizard.length) {
-                if ($target.is('.multi-wizard label') && $target.prev('input[type="radio"],input[type="checkbox"]').length) {
-                    $target.prev('input').trigger('click');
-                }
-                if ($target.is('.multi-wizard .select-desc div.name') && $target.parent('div.select-desc').prev('input[type="radio"],input[type="checkbox"]').length) {
-                    $target.parent('div.select-desc').prev('input').trigger('click');
-                }
-            }
-
-            if (!$container.length) return true;
-
-            // Navigation items
-            if ($target.closest('li.navigation-item').length && $target.closest('#navigation').length) {
-                var $navItem = $target.closest('li.navigation-item');
-
-                if ($navItem.is('.disabled')) return false;
-                showSection($navItem.data('cloudStack-section-id'), args, $browser);
-
-                return false;
-            }
-
-            // Browser expand
-            if ($target.hasClass('control expand') && $target.closest('div.panel div.toolbar').length) {
-                $browser.cloudBrowser('toggleMaximizePanel', {
-                    panel: $target.closest('div.panel')
-                });
-
-                return false;
-            }
-
-            // Home breadcrumb
-            if ($target.is('#breadcrumbs div.home')) {
-                showSection(args.home, args, $browser);
-                return false;
-            }
-
-            // User options
-            if ($target.closest('#user div.icon.options').length) {
-                $('#user-options').toggle();
-
-                return false;
-            }
-
-            return true;
-        });
-    });
-})(window.jQuery,
-    window.cloudStack ? window.cloudStack : window.cloudStack = {});
diff --git a/ui/legacy/scripts/ui/dialog.js b/ui/legacy/scripts/ui/dialog.js
deleted file mode 100644
index d014ac9..0000000
--- a/ui/legacy/scripts/ui/dialog.js
+++ /dev/null
@@ -1,1139 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack, _l) {
-    cloudStack.dialog = {
-        /**
-         * Error message form
-         *
-         * Returns callback, that can be plugged into a standard data provider response
-         */
-        error: function(callback) {
-            return function(args) {
-                var message = args.message ? args.message : args;
-                if (message) cloudStack.dialog.notice({
-                    message: message
-                });
-
-                if (callback) callback();
-            };
-        },
-
-        /**
-         * Dialog with form
-         */
-        createForm: function(args) {
-            var cancel = args.cancel;
-            var $formContainer = $('<div>').addClass('form-container');
-            var $form = $('<form>').appendTo($formContainer)
-                    .submit(function() {
-                        $(this).closest('.ui-dialog').find('button.ok').click();
-
-                        return false;
-                    });
-            var createLabel = _l(args.form.createLabel);
-
-            // Description text
-            var formDesc;
-            if (typeof(args.form.desc) == 'function') {
-                formDesc = args.form.desc(args);
-            } else { //typeof(args.form.desc) == 'string' or 'undefined'
-                formDesc = args.form.desc;
-            }
-            $('<span>').addClass('message').prependTo($formContainer).html(
-                _l(formDesc)
-            );
-
-            // Submit button
-            $('<input>')
-                .attr({
-                    type: 'submit'
-                })
-                .hide()
-                .appendTo($form);
-
-            // Render fields and events
-            var fields = $.map(args.form.fields, function(value, key) {
-                return key;
-            });
-
-            $(window).trigger('cloudStack.createForm.makeFields', {
-                $form: $form,
-                fields: args.form.fields
-            });
-
-            var ret = function() {
-                $('.overlay').remove();
-
-                var $dialog = $formContainer.dialog({
-                    dialogClass: args.form.isWarning ? 'create-form warning' : 'create-form',
-                    closeOnEscape: false,
-                    draggable: false,
-                    width: 400,
-                    title: _l(args.form.title),
-                    open: function() {
-                        if (args.form.preFilter) {
-                            args.form.preFilter({
-                                $form: $form,
-                                context: args.context
-                            });
-                        }
-
-                        $(window).trigger('cloudStack.createForm.open', {
-                          $form: $form
-                        });
-                    },
-                    buttons: [{
-                        text: createLabel ? createLabel : _l('label.ok'),
-                        'class': 'ok',
-                        click: function() {
-                            if (!complete($formContainer)) {
-                                return false;
-                            }
-
-                            $('div.overlay').remove();
-                            $('.tooltip-box').remove();
-                            $formContainer.remove();
-                            if ($(this).data('dialog')) {
-                                $(this).dialog('destroy');
-                            }
-
-                            $('.hovered-elem').hide();
-
-                            return true;
-                        }
-                    }, {
-                        text: _l('label.cancel'),
-                        'class': 'cancel',
-                        click: function() {
-                            $(this).dialog('destroy');
-
-                            $('div.overlay').remove();
-                            $('.tooltip-box').remove();
-                            $formContainer.remove();
-
-                            $('.hovered-elem').hide();
-
-                            if (cancel) {
-                                cancel();
-                            }
-                        }
-                    }]
-                });
-
-                return cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-            };
-
-            var isLastAsync = function(idx) {
-                for (var i = idx + 1; i < $(fields).length; i++) {
-                    var f = args.form.fields[$(fields).get(i)];
-                    if (f.select || f.dynamic) {
-                        return false;
-                    }
-                }
-                return true;
-            };
-
-            var isAsync = false;
-            var isNoDialog = args.noDialog ? args.noDialog : false;
-            $(fields).each(function(idx, element) {
-                var key = this;
-                var field = args.form.fields[key];
-
-                var $formItem = $('<div>')
-                        .addClass('form-item')
-                        .attr({
-                            rel: key
-                        });
-
-                if (field.isHidden != null) {
-                    if (typeof(field.isHidden) == 'boolean' && field.isHidden == true)
-                        $formItem.hide();
-                    else if (typeof(field.isHidden) == 'function' && field.isHidden(args) == true)
-                        $formItem.hide();
-                }
-
-                $formItem.appendTo($form);
-
-                //Handling Escape KeyPress events
-                /*   $('.ui-dialog').keypress(function(event) {
-                 if ( event.which == 27 ) {
-                 event.stopPropagation();
-                 }
-                 });
-
-                 $(document).ready(function(){
-                 $('.ui-dialog').keydown(function(event) {
-                 if(event.keyCode == 27)
-                 {
-                 alert("you pressed the Escape key");
-                 event.preventdefault();
-                 }
-                 })
-                 });
-
-                 $(':ui-dialog').dialog({
-                 closeOnEscape: false
-                 }); */
-                // Label field
-                var $name = $('<div>').addClass('name')
-                        .appendTo($formItem)
-                        .append(
-                            $('<label>').html(_l(field.label) + ':')
-                        );
-
-                // red asterisk
-                var $asterisk = $('<span>').addClass('field-required').html('*');
-
-                $name.find('label').prepend($asterisk);
-
-                if (field.validation == null || !field.validation.required) {
-                    $asterisk.hide();
-                }
-
-                // Tooltip description
-                if (field.desc) {
-                    $formItem.attr({
-                        title: _l(field.desc)
-                    });
-                }
-
-                // Input area
-                var $value = $('<div>').addClass('value')
-                        .appendTo($formItem);
-                var $input, $dependsOn, selectFn, selectArgs;
-                var dependsOn = field.dependsOn;
-
-                // Depends on fields
-                if (field.dependsOn) {
-                    $formItem.attr('depends-on', dependsOn);
-                    $dependsOn = $form.find('input, select').filter(function() {
-                        return $.isArray(dependsOn) ?
-                            $.inArray($(this).attr('name'), dependsOn) > -1 :
-                            $(this).attr('name') === dependsOn;
-                    });
-
-                    if ($dependsOn.is('[type=checkbox]')) {
-                        var isReverse = false;
-
-                        if (args.form.fields[dependsOn]) {
-                            isReverse = args.form.fields[dependsOn].isReverse;
-                            isChecked = args.form.fields[dependsOn].isChecked;
-                        }
-
-                        // Checkbox
-                        $dependsOn.bind('click', function(event) {
-                            var $target = $(this);
-                            var $dependent = $target.closest('form').find('[depends-on=\'' + dependsOn + '\']');
-
-                            if (($target.is(':checked') && !isReverse) ||
-                                ($target.is(':unchecked') && isReverse)) {
-
-                                $dependent.css('display', 'inline-block'); //show dependent dropdown field
-                                $dependent.change(); //trigger event handler for default option in dependent dropdown field (CLOUDSTACK-7826)
-
-                                $dependent.each(function() {
-                                    if ($(this).data('dialog-select-fn')) {
-                                        $(this).data('dialog-select-fn')();
-                                    }
-                                });
-                            } else if (($target.is(':unchecked') && !isReverse) ||
-                                       ($target.is(':checked') && isReverse)) {
-                                $dependent.hide();
-                            }
-
-                            $dependent.find('input[type=checkbox]').click();
-
-                            if (!isReverse) {
-                                $dependent.find('input[type=checkbox]').attr('checked', false);
-                            } else {
-                                $dependent.find('input[type=checkbox]').attr('checked', true);
-                            }
-
-                            return true;
-                        });
-
-                        // Show fields by default if it is reverse checkbox
-                        if (isReverse) {
-                            $dependsOn.click();
-
-                            if (isChecked) {
-                                $dependsOn.attr('checked', true);
-                            }
-                        }
-                    } else  if (typeof(field.isHidden) == 'function') {
-                        //If a checkbox depends on a field. Call the isHidden function of the checkbox.
-                        $dependsOn.bind('change', function(event) {
-                            var $target = $(this);
-                            var $dependent = $target.closest('form').find('[depends-on=\'' + dependsOn + '\']');
-                            $dependsOn.attr('checked', isChecked);
-                            if (field.isHidden(args)) {
-                                $dependent.hide();
-                            } else {
-                                $dependent.show();
-                            }
-                        });
-                    }
-                }
-
-                // Determine field type of input
-                if (field.select) {
-                    var multiple = false;
-                    if (field.isMultiple != null){
-                        if (typeof(field.isMultiple) == 'boolean' && field.isMultiple == true)
-                            multiple = true;
-                    }
-                    isAsync = true;
-                    selectArgs = {
-                        context: args.context,
-                        response: {
-                            success: function(args) {
-                                if (args.data == undefined || args.data.length == 0) {
-                                    var $option = $('<option>')
-                                    .appendTo($input)
-                                    .html("");
-                                } else {
-                                $(args.data).each(function() {
-                                    var id;
-                                    if (field.valueField)
-                                        id = this[field.valueField];
-                                    else
-                                        id = this.id !== undefined ? this.id : this.name;
-
-                                    var desc;
-                                    if (args.descriptionField)
-                                        desc = this[args.descriptionField];
-                                    else
-                                        desc = _l(this.description);
-
-                                    var $option = $('<option>')
-                                            .appendTo($input)
-                                            .val(_s(id))
-                                            .data('json-obj', this)
-                                            .html(_s(desc));
-                                });
-                                }
-
-                                if (field.defaultValue) {
-                                    $input.val(_s(strOrFunc(field.defaultValue, args.data)));
-                                }
-
-                                $input.trigger('change');
-
-                                if ((!isNoDialog) && isLastAsync(idx)) {
-                                    ret();
-                                }
-                            }
-                        }
-                    };
-
-                    selectFn = field.select;
-                    var attrib = {};
-                    if (multiple)
-                        attrib = {
-                            name: key,
-                            multiple: 'multiple'
-                        };
-                    else
-                        attrib = {
-                            name: key
-                        }
-                    $input = $('<select>')
-                        .attr(attrib)
-                        .data('dialog-select-fn', function(args) {
-                            selectFn(args ? $.extend(true, {}, selectArgs, args) : selectArgs);
-                        })
-                        .appendTo($value);
-
-                    // Pass form item to provider for additional manipulation
-                    $.extend(selectArgs, {
-                        $select: $input,
-                        $form: $form,
-                        type: 'createForm'
-                    });
-
-                    if (dependsOn) {
-                        $dependsOn = $input.closest('form').find('input, select').filter(function() {
-                            return $.isArray(dependsOn) ?
-                                $.inArray($(this).attr('name'), dependsOn) > -1 :
-                                $(this).attr('name') === dependsOn;
-                        });
-
-                        // Reload selects linked to in dependsOn
-                        $dependsOn.each(function() {
-                            var $targetDependsOn = $(this);
-
-                            $targetDependsOn.bind('change', function(event) {
-                                var formData = cloudStack.serializeForm($form);
-                                var dependsOnLoaded;
-
-                                // Make sure all data is loaded to pass to select fn
-                                dependsOnLoaded = $.inArray(
-                                    true, $dependsOn.map(function(index, item) { return $(item).find('option').length ? true : false; })
-                                ) > -1;
-
-                                if (!dependsOnLoaded) {
-                                    return false;
-                                }
-
-                                var $target = $(this);
-
-                                if (!$target.is('select')) {
-                                    return true;
-                                }
-
-                                $input.find('option').remove();
-
-                                // Re-execute select
-                                selectFn($.extend(selectArgs, formData, {
-                                    data: formData
-                                }));
-                                return true;
-                            });
-                        });
-
-                        if (!$dependsOn.is('select')) {
-                            selectFn(selectArgs);
-                        }
-                    } else {
-                        selectFn(selectArgs);
-                    }
-                } else if (field.isBoolean) {
-                    if (field.multiArray) {
-                        $input = $('<div>')
-                            .addClass('multi-array').addClass(key).appendTo($value);
-
-                        $.each(field.multiArray, function(itemKey, itemValue) {
-                            $input.append(
-                                $('<div>').addClass('item')
-                                    .append(
-                                        $.merge(
-                                            $('<div>').addClass('name').html(_l(itemValue.label)),
-                                            $('<div>').addClass('value').append(
-                                                $('<input>').attr({
-                                                    name: itemKey,
-                                                    type: 'checkbox'
-                                                }).appendTo($value)
-                                            )
-                                        )
-                                    )
-                            );
-                        });
-
-                    } else if (field.multiDataArray) {
-
-                        $input = $('<div>');
-
-                        multiArgs = {
-                            context: args.context,
-                            response: {
-                                success: function(args) {
-                                    if (args.data == undefined || args.data.length == 0) {
-
-                                        var label = field.emptyMessage != null ? field.emptyMessage : 'No data available';
-
-                                        $input
-                                            .addClass('value')
-                                            .appendTo($value)
-                                            .append(
-                                                $('<label>').html(_l(label))
-                                            );
-
-                                    } else {
-
-                                        $input.addClass('multi-array').addClass(key).appendTo($value);
-
-                                        $(args.data).each(function() {
-
-                                            var id;
-                                            if (field.valueField)
-                                                id = this[field.valueField];
-                                             else
-                                                id = this.id !== undefined ? this.id : this.name;
-
-                                            var desc;
-                                            if (args.descriptionField)
-                                                desc = this[args.descriptionField];
-                                            else
-                                                desc = _l(this.description);
-
-                                            $input.append(
-                                                $('<div>')
-                                                    .addClass('item')
-                                                    .append(
-                                                        $.merge(
-                                                            $('<div>').addClass('name').html(_l(desc)),
-                                                            $('<div>').addClass('value').append(
-                                                                $('<input>').attr({
-                                                                    name: id,
-                                                                    type: 'checkbox'
-                                                                })
-                                                                .data('json-obj', this)
-                                                                .appendTo($value)
-                                                            )
-                                                        )
-                                                    )
-                                            );
-                                        });
-                                    }
-                                }
-                            }
-                        }
-
-                        multiFn = field.multiData;
-                        multiFn(multiArgs);
-                    } else {
-                        $input = $('<input>').attr({
-                            name: key,
-                            type: 'checkbox'
-                        }).appendTo($value);
-                        var isChecked;
-                        if (typeof (field.isChecked) == 'function') {
-                            isChecked = field.isChecked(args);
-                        } else {
-                            isChecked = field.isChecked;
-                        }
-                        if (isChecked) {
-                            $input.attr('checked', strOrFunc(field.isChecked, args));
-                        } else {
-                            // This is mainly for IE compatibility
-                            setTimeout(function() {
-                                $input.attr('checked', false);
-                            }, 100);
-                        }
-                    }
-
-                    // Setup on click event
-                    if (field.onChange) {
-                        $input.click(function() {
-                            field.onChange({
-                                $checkbox: $input
-                            });
-                        });
-                    }
-                } else if (field.dynamic) {
-                    isAsync = true;
-                    // Generate a 'sub-create-form' -- append resulting fields
-                    $input = $('<div>').addClass('dynamic-input').appendTo($value);
-                    $form.hide();
-
-                    field.dynamic({
-                        context: args.context,
-                        response: {
-                            success: function(args) {
-                                var form = cloudStack.dialog.createForm({
-                                    noDialog: true,
-                                    form: {
-                                        title: '',
-                                        fields: args.fields
-                                    }
-                                });
-
-                                var $fields = form.$formContainer.find('.form-item').appendTo($input);
-                                $form.show();
-
-                                // Form should be slightly wider
-                                $form.closest(':ui-dialog').dialog('option', {
-                                    position: 'center',
-                                    closeOnEscape: false
-                                });
-                                if ((!isNoDialog) && isLastAsync(idx)) {
-                                    ret();
-                                }
-                            }
-                        }
-                    });
-                } else if (field.isTextarea) {
-                    $input = $('<textarea>').attr({
-                        name: key
-                    }).appendTo($value);
-
-                    if (field.defaultValue) {
-                        $input.val(strOrFunc(field.defaultValue));
-                    }
-                } else if (field.isFileUpload) {
-                    $input = $('<input>').attr({
-                        type: 'file',
-                        name: 'files[]'
-                    }).appendTo($value);
-
-                    // Add events
-                    $input.change(function(event) {
-                        $form.data('files', event.target.files);
-                    });
-                } else if (field.isTokenInput) { // jquery.tokeninput.js
-                    isAsync = true;
-
-                    selectArgs = {
-                        context: args.context,
-                        response: {
-                            success: function(args) {
-                                $input.tokenInput(unique_tags(args.data),
-                                {
-                                    theme: "facebook",
-                                    preventDuplicates: true,
-                                    hintText: args.hintText,
-                                    noResultsText: args.noResultsText
-                                });
-                            }
-                        }
-                    };
-
-                    $input = $('<input>').attr({
-                        name: key,
-                        type: 'text'
-                    }).appendTo($value);
-
-                    $.extend(selectArgs, {
-                        $form: $form,
-                        type: 'createForm'
-                    });
-
-                    field.dataProvider(selectArgs);
-                } else if (field.isDatepicker) { //jQuery datepicker
-                    $input = $('<input>').attr({
-                        name: key,
-                        type: 'text'
-                    }).appendTo($value);
-
-                    if (field.defaultValue) {
-                        $input.val(strOrFunc(field.defaultValue));
-                    }
-                    if (field.id) {
-                        $input.attr('id', field.id);
-                    }
-                    $input.addClass("disallowSpecialCharacters");
-                    $input.datepicker({
-                        dateFormat: 'yy-mm-dd',
-                        maxDate: field.maxDate,
-                        minDate: field.minDate
-                    });
-
-                } else if (field.range) { //2 text fields on the same line (e.g. port range: startPort - endPort)
-                    $input = $.merge(
-                        // Range start
-                        $('<input>').attr({
-                            type: 'text',
-                            name: field.range[0]
-                        }),
-
-                        // Range end
-                        $('<input>').attr({
-                            type: 'text',
-                            name: field.range[1]
-                        })
-                    ).appendTo(
-                        $('<div>').addClass('range-edit').appendTo($value)
-                    );
-                    $input.wrap($('<div>').addClass('range-item'));
-                    $input.addClass("disallowSpecialCharacters");
-
-                } else if (field.has_units) { // An input box and a drop down with unit options
-                    var textbox = $('<input>')
-                        .attr({
-                            type: 'text',
-                            name: key
-                        })
-                        .css('width', 'auto');
-                    var unitSelect = $('<select>')
-                        .attr({
-                            name: key+'_unit'
-                        })
-                        .data('key', key)
-                        .css('width', 'auto');
-
-                    $input = textbox;
-
-                    textbox.appendTo($value);
-                    unitSelect.appendTo($value);
-
-                    $.each(field.units, function() {
-                        var id = this.id;
-                        var text = this.text;
-                        var toBase = this.toBase;
-                        var fromBase = this.fromBase;
-
-                        var option = $('<option>')
-                                .appendTo(unitSelect)
-                                .val(_s(id))
-                                .html(_s(text))
-                                .data('toBase', toBase)
-                                .data('fromBase', fromBase);
-                    });
-
-                    unitSelect.focus(function() {
-                        this.oldUnit = this.value;
-                    });
-
-                    unitSelect.change(function() {
-                        if ($(this).parent().length == 0)
-                            return;
-
-                        var oldUnit = this.oldUnit;
-                        var newUnit = this.value;
-                        var key = $(this).data('key');
-                        var value = $(this).closest('form').find('input[name='+key+']').attr('value');
-
-                        if (!value || value.length === 0 || !oldUnit || oldUnit == newUnit)
-                            return;
-
-                        var toBase = $(this).closest('form').find('option[value='+oldUnit+']').data('toBase');
-                        var fromBase = $(this).closest('form').find('option[value='+newUnit+']').data('fromBase');
-
-                        var baseValue = toBase(value);
-                        var newValue = fromBase(baseValue);
-
-                        $(this).closest('form').find('input[name='+key+']').attr('value', newValue);
-
-                        this.oldUnit = newUnit;
-                    })
-                } else if (field.tagger) {
-                    $name.hide();
-                    $value.hide();
-                    $input = $('<div>').taggerInForm().appendTo($formItem);
-                } else { //text field
-                    $input = $('<input>').attr({
-                        name: key,
-                        type: field.password || field.isPassword ? 'password' : 'text'
-                    }).appendTo($value);
-
-                    if (field.defaultValue) {
-                        $input.val(strOrFunc(field.defaultValue, args.context));
-                    }
-                    if (field.id) {
-                        $input.attr('id', field.id);
-                    }
-                    $input.addClass("disallowSpecialCharacters");
-                }
-
-                if (!field.tagger) { // Tagger has it's own validation
-                    if (field.validation != null)
-                        $input.data('validation-rules', field.validation);
-                    else
-                        $input.data('validation-rules', {});
-                }
-
-                var fieldLabel = field.label;
-
-                var inputId = $input.attr('id') ? $input.attr('id') : fieldLabel.replace(/\./g, '_');
-
-                $input.attr('id', inputId);
-                $name.find('label').attr('for', inputId);
-
-                if(field.isDisabled ){
-                    if(typeof(field.isDisabled) == 'boolean' && field.isDisabled == true){
-                        $input.attr("disabled","disabled");
-                    }
-                    else if (typeof(field.isDisabled) == 'function' && field.isDisabled(args) == true){
-                        $input.attr("disabled","disabled");
-                    }
-                }
-
-                // Tooltip
-                if (field.docID) {
-                    $input.toolTip({
-                        docID: field.docID,
-                        tooltip: '.tooltip-box',
-                        mode: 'focus',
-                        attachTo: '.form-item'
-                    });
-                }
-
-
-                /*     $input.blur(function() {
-                 console.log('tooltip remove->' + $input.attr('name'));
-                 });*/
-            });
-
-
-            var getFormValues = function() {
-                var formValues = {};
-                $.each(args.form.fields, function(key) {});
-            };
-
-            // Setup form validation
-            $formContainer.find('form').validate();
-            $formContainer.find('input, select').each(function() {
-                if ($(this).data('validation-rules')) {
-                    $(this).rules('add', $(this).data('validation-rules'));
-                } else {
-                    $(this).rules('add', {});
-                }
-            });
-            $form.find('select').trigger('change');
-
-
-            var complete = function($formContainer) {
-                var $form = $formContainer.find('form');
-                var data = cloudStack.serializeForm($form);
-                if (!data.tags) {
-                    // Some APIs consume tags as a string (such as disk offering creation).
-                    // The UI of those use a tagger that is not a custom cloudStack.tagger
-                    // but rather a string. That case is handled by usual serialization. We
-                    // only need to check extract tags when the string tags are not present.
-                    $.extend(data, {'tags' : cloudStack.getTagsFromForm($form)});
-                }
-
-                if (!$formContainer.find('form').valid()) {
-                    // Ignore hidden field validation
-                    if ($formContainer.find('input.error:visible, select.error:visible').length) {
-                        return false;
-                    }
-                }
-
-                var uploadFiles = function() {
-                    $form.prepend($('<div>').addClass('loading-overlay'));
-                    args.form.fileUpload.getURL({
-                        $form: $form,
-                        formData: data,
-                        context: args.context,
-                        response: {
-                            success: function(successArgs) {
-                                var $file = $form.find('input[type=file]');
-                                var postUploadArgs = {
-                                    $form: $form,
-                                    data: data,
-                                    context: args.context,
-                                    response: {
-                                        success: function() {
-                                            args.after({
-                                                data: data,
-                                                ref: args.ref, // For backwards compatibility; use context
-                                                context: args.context,
-                                                $form: $form
-                                            });
-
-                                            $('div.overlay').remove();
-                                            $form.find('.loading-overlay').remove();
-                                            $('div.loading-overlay').remove();
-
-                                            $('.tooltip-box').remove();
-                                            $formContainer.remove();
-                                            $(this).dialog('destroy');
-
-                                            $('.hovered-elem').hide();
-                                        },
-                                        error: function(msg) {
-                                            $('div.overlay').remove();
-                                            $form.find('.loading-overlay').remove();
-                                            $('div.loading-overlay').remove();
-
-                                            if (!msg) {
-                                                msg = "Failed to upload file due to system misconfiguration. Please contact admin.";
-                                            }
-                                            cloudStack.dialog.notice({ message: msg });
-
-                                            $('.tooltip-box').remove();
-                                            $formContainer.remove();
-                                            $(this).dialog('destroy');
-
-                                            $('.hovered-elem').hide();
-                                        }
-                                    }
-                                };
-                                var postUploadArgsWithStatus = $.extend(true, {}, postUploadArgs);
-
-                                if(successArgs.ajaxPost) {
-                                    var request = new FormData();
-                                    request.append('file', $file.prop("files")[0]);
-                                    $.ajax({
-                                            type: 'POST',
-                                            url: successArgs.url,
-                                            data: request,
-                                            dataType : 'html',
-                                            processData: false,
-                                            contentType: false,
-                                            headers: successArgs.data,
-                                            success: function(r) {
-                                                postUploadArgsWithStatus.error = false;
-                                                args.form.fileUpload.postUpload(postUploadArgsWithStatus);
-                                            },
-                                            error: function(r) {
-                                                postUploadArgsWithStatus.error = true;
-                                                postUploadArgsWithStatus.errorMsg = r.responseText;
-                                                args.form.fileUpload.postUpload(postUploadArgsWithStatus);
-                                            }
-                                        });
-                                } else {
-                                    //
-                                    // Move file field into iframe; keep visible for consistency
-                                    //
-                                    var $uploadFrame = $('<iframe>');
-                                    var $frameForm = $('<form>').attr({
-                                        method: 'POST',
-                                        action: successArgs.url,
-                                        enctype: 'multipart/form-data'
-                                    });
-                                    var $field = $file.closest('.form-item .value');
-
-                                    // Add additional passed data
-                                    $.map(successArgs.data, function(v, k) {
-                                        var $hidden = $('<input>').attr({
-                                            type: 'hidden',
-                                            name: k,
-                                            value: v
-                                        });
-
-                                        $hidden.appendTo($frameForm);
-
-                                    });
-
-                                    console.log("The following object is a hidden HTML form that will submit local file with hidden field signature/expires/metadata:");
-                                    console.log($frameForm);
-
-                                    $uploadFrame.css({ width: $field.outerWidth(), height: $field.height() }).show();
-                                    $frameForm.append($file);
-                                    $field.append($uploadFrame);
-                                    $uploadFrame.contents().find('html body').append($frameForm);
-                                    $frameForm.submit(function() {
-                                        console.log("callback() in $frameForm.submit(callback(){}) is triggered");
-                                        $uploadFrame.load(function() {
-                                            console.log("callback() in $uploadFrame.load(callback(){}) is triggered");
-                                            args.form.fileUpload.postUpload(postUploadArgs);
-                                        });
-                                        return true;
-                                    });
-                                    $frameForm.submit();
-                                }
-                            },
-                            error: function(msg) {
-                                cloudStack.dialog.error({ message: msg });
-                            }
-                        }
-                    });
-                };
-
-                if ($form.data('files')) {
-                    uploadFiles();
-
-                    return false;
-                } else {
-                    args.after({
-                        data: data,
-                        ref: args.ref, // For backwards compatibility; use context
-                        context: args.context,
-                        $form: $form
-                    });
-                }
-
-                return true;
-            };
-
-            if (args.noDialog) {
-                return {
-                    $formContainer: $formContainer,
-                    completeAction: complete
-                };
-            } else if (!isAsync) {
-                return ret();
-            }
-        },
-
-        // Dialog with list view selector
-        listView: function(args) {
-            var listView = args.listView;
-            var after = args.after;
-            var context = args.context;
-            var $listView = $('<div>');
-
-            listView.actions = {
-                select: {
-                    label: _l('label.select.instance'),
-                    type: listView.type,
-                    action: {
-                        uiCustom: function(args) {
-                            var $item = args.$item;
-                            var $input = $item.find('td.actions input:visible');
-
-                            if ($input.attr('type') == 'checkbox') {
-                                if ($input.is(':checked'))
-                                    $item.addClass('multi-edit-selected');
-                                else
-                                    $item.removeClass('multi-edit-selected');
-                            } else {
-                                $item.siblings().removeClass('multi-edit-selected');
-                                $item.addClass('multi-edit-selected');
-                            }
-                        }
-                    }
-                }
-            };
-
-            // Init list view
-            $listView = $('<div>').listView({
-                context: context,
-                uiCustom: true,
-                listView: listView
-            });
-
-            // Change action label
-            $listView.find('th.actions').html(_l('label.select'));
-
-            $listView.dialog({
-                dialogClass: 'multi-edit-add-list panel',
-                width: 900,
-                title: _l('Select VM'),
-                buttons: [{
-                    text: _l('label.apply'),
-                    'class': 'ok',
-                    click: function() {
-                        if (!$listView.find(
-                            'input[type=radio]:checked, input[type=checkbox]:checked'
-                        ).length) {
-                            cloudStack.dialog.notice({
-                                message: _l('message.select.instance')
-                            });
-
-                            return false;
-                        }
-
-                        after({
-                            context: $.extend(true, {}, context, {
-                                instances: $listView.find('tr.multi-edit-selected').map(function(index, row) {
-                                    var $row = $(row);
-
-                                    return $row.data('json-obj');
-                                })
-                            })
-                        });
-
-                        $listView.remove();
-
-                        $('div.overlay').remove();
-                    }
-                }, {
-                    text: _l('label.cancel'),
-                    'class': 'cancel',
-                    click: function() {
-                        $listView.fadeOut(function() {
-                            $listView.remove();
-                        });
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-                    }
-                }]
-            }).parent('.ui-dialog').overlay();
-        },
-
-        /**
-         * to change a property(e.g. validation) of a createForm field after a createForm is rendered
-         */
-        createFormField: {
-            validation: {
-                required: {
-                    add: function($formField) {
-                        var $input = $formField.find('input, select');
-                        var validationRules = $input.data('validation-rules');
-
-                        if (validationRules == null || validationRules.required == null || validationRules.required == false) {
-                            $formField.find('.name').find('label').find('span.field-required').css('display', 'inline'); //show red asterisk
-
-                            if (validationRules == null)
-                                validationRules = {};
-                            validationRules.required = true;
-                            $input.data('validation-rules', validationRules);
-                            $input.rules('add', {
-                                required: true
-                            });
-                        }
-                    },
-                    remove: function($formField) {
-                        var $input = $formField.find('input, select');
-                        var validationRules = $input.data('validation-rules');
-
-                        if (validationRules != null && validationRules.required != null && validationRules.required == true) {
-                            $formField.find('.name').find('label').find('span.field-required').hide(); //hide red asterisk
-                            delete validationRules.required;
-                            $input.data('validation-rules', validationRules);
-
-                            $input.rules('remove', 'required');
-                            $formField.find('.value').find('label.error').hide();
-                        }
-                    }
-                }
-            }
-        },
-
-        /**
-         * Confirmation dialog
-         */
-        confirm: function(args) {
-            var $dialog = $(
-                $('<span>').addClass('message').html(
-                    _l(args.message)
-                )
-            ).dialog({
-                title: args.isWarning ? _l('label.warning') : _l('label.confirmation'),
-                dialogClass: args.isWarning ? 'confirm warning': 'confirm',
-                closeOnEscape: false,
-                buttons: [{
-                    text: _l('label.no'),
-                    'class': 'cancel',
-                    click: function() {
-                        $(this).dialog('destroy');
-                        $('div.overlay').remove();
-                        if (args.cancelAction) {
-                            args.cancelAction();
-                        }
-                        $('.hovered-elem').hide();
-                    }
-                }, {
-                    text: _l('label.yes'),
-                    'class': 'ok',
-                    click: function() {
-                        args.action();
-                        $(this).dialog('destroy');
-                        $('div.overlay').remove();
-                        $('.hovered-elem').hide();
-                    }
-                }]
-            });
-
-            return  cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-        },
-
-        /**
-         * Notice dialog
-         */
-        notice: function(args) {
-            if (args.message) {
-                var $dialog = $(
-                    $('<span>').addClass('message').html(
-                        _l(args.message)
-                    )
-                ).dialog({
-                    title: _l('label.status'),
-                    dialogClass: 'notice',
-                    closeOnEscape: false,
-                    buttons: [{
-                        text: _l('label.close'),
-                        'class': 'close',
-                        click: function() {
-                            $(this).dialog('destroy');
-                            if (args.clickAction) args.clickAction();
-                            $('.hovered-elem').hide();
-                            $('div.overlay').hide();
-                        }
-                    }]
-                });
-
-                return cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog, 5001);
-            }
-            return false;
-        }
-    };
-})(window.jQuery, window.cloudStack, _l);
diff --git a/ui/legacy/scripts/ui/events.js b/ui/legacy/scripts/ui/events.js
deleted file mode 100644
index ffb0baa..0000000
--- a/ui/legacy/scripts/ui/events.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    cloudStack.ui.event = {
-        // Attach element to specific event type
-        elem: function(widget, elem, $elem, extraData) {
-            // Setup DOM metadata
-            var data = {
-                cloudStack: {}
-            };
-            data.cloudStack[widget] = {
-                elem: elem
-            };
-            if (extraData) $.extend(data.cloudStack[widget], extraData);
-
-            return $elem
-                .addClass('cloudStack-elem')
-                .addClass(widget)
-                .data(data);
-        },
-
-        // Create widget-based event
-        bind: function(widget, events) {
-            return function(event) {
-                var $target = $(event.target);
-                var $widget, $elem;
-                var data, elem;
-
-                $elem = $target.closest('.cloudStack-elem.' + widget);
-                if (!$elem.length)
-                    return true;
-
-                $widget = $('.cloudStack-widget.' + widget);
-                data = $elem.data('cloudStack')[widget];
-                elem = data.elem;
-
-                events[elem]($elem, $widget, data);
-
-                return false;
-            };
-        },
-
-        // Trigger CloudStack UI event (cloudStack.*)
-        call: function(eventName, data) {
-            $(window).trigger('cloudStack.' + eventName, data);
-        }
-    };
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui/utils.js b/ui/legacy/scripts/ui/utils.js
deleted file mode 100644
index ec2ecda..0000000
--- a/ui/legacy/scripts/ui/utils.js
+++ /dev/null
@@ -1,162 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    // General utils
-    cloudStack.serializeForm = function($form, options) {
-        if (!options) options = {};
-
-        var data = {};
-
-        $($form.serializeArray()).each(function() {
-            var dataItem = data[this.name];
-            var value = _s(this.value.toString());
-
-            if (options.escapeSlashes) {
-                value = value.replace(/\//g, '__forwardSlash__');
-            }
-
-            if (!dataItem) {
-                data[this.name] = value;
-            } else if (dataItem && !$.isArray(dataItem)) {
-                data[this.name] = [dataItem, value];
-            } else if ($.isArray(dataItem)) {
-                dataItem.push(value);
-            }
-        });
-
-        return data;
-    };
-
-    // Even/odd row handling
-    cloudStack.evenOdd = function($container, itemSelector, args) {
-        var even = false;
-
-        $container.find(itemSelector).each(function() {
-            var $elem = $(this);
-
-            if (even) {
-                even = false;
-                args.odd($elem);
-            } else {
-                even = true;
-                args.even($elem);
-            }
-        });
-    };
-
-    /**
-     * Localization -- shortcut _l
-     *
-     * Takes string and runs through localization function -- if no code
-     * exists or function isn't present, return string as-is
-     */
-    cloudStack.localize = window._l = function(str) {
-        var localized = cloudStack.localizationFn ?
-            cloudStack.localizationFn(str) : null;
-
-        return localized ? localized : str;
-    };
-
-    /**
-     * Sanitize user input (HTML Encoding) -- shortcut _s
-     *
-     * Strip unwanted characters from user-based input
-     */
-    cloudStack.sanitize = window._s = function(value) {
-        if (typeof(value) == "number") {
-            //alert("number does not need to be sanitized. Only string needs to be sanitized.");
-            return value;
-        } else if (typeof(value) == "boolean") {
-            //alert("boolean does not need to be sanitized. Only string needs to be sanitized.");
-            return value;
-        } else if (typeof(value) == "object") {
-            //alert("object cant not be sanitized. Only string can be sanitized.");
-            return value;
-        } else if (typeof(value) == null || typeof(value) == "undefined") {
-            return '';
-        }
-
-        var sanitized = value
-            .replace(/</g, "&lt;")
-            .replace(/>/g, "&gt;");
-
-        return sanitized;
-    };
-
-    /**
-     * Reverse sanitization (HTML Decoding)
-     */
-    cloudStack.sanitizeReverse = function(value) {
-        var reversedValue = value
-            .replace(/&amp;/g, "&")
-            .replace(/&lt;/g, "<")
-            .replace(/&gt;/g, ">");
-
-        return reversedValue;
-    };
-
-    /**
-     * If the str.length is > maxLen,
-     * then concatenate and add '...' to the end of the string
-     */
-    cloudStack.concat = function(str, maxLen) {
-        if (str.length > maxLen) {
-            return str.substr(0, maxLen) + '...';
-        } else {
-            return str;
-        }
-    };
-
-    /**
-     * Localize validator messages
-     */
-    cloudStack.localizeValidatorMessages = function() {
-        $.extend($.validator.messages, {
-            required: _l('message.validate.fieldrequired'),
-            remote: _l('message.validate.fixfield'),
-            email: _l('message.validate.email.address'),
-            url: _l('message.validate.URL'),
-            date: _l('message.validate.date'),
-            dateISO: _l('message.validate.date.ISO'),
-            number: _l('message.validate.number'),
-            digits: _l('message.validate.digits'),
-            creditcard: _l('message.validate.creditcard'),
-            equalTo: _l('message.validate.equalto'),
-            accept: _l('message.validate.accept'),
-            maxlength: $.validator.format(_l('message.validate.maxlength')),
-            minlength: $.validator.format(_l('message.validate.minlength')),
-            rangelength: $.validator.format(_l('message.validate.range.length')),
-            range: $.validator.format(_l('message.validate.range')),
-            max: $.validator.format(_l('message.validate.max')),
-            min: $.validator.format(_l('messgae.validate.min'))
-        });
-    };
-    
-    var applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton = function($dialog, customZindex){
-        var defaultZindex = 5000;
-        if(!customZindex){
-            customZindex = defaultZindex;
-        }
-        $('button.ui-dialog-titlebar-close').remove()
-        
-        var $dialogDiv = $dialog.closest('.ui-dialog');
-        $dialogDiv.css('z-index', customZindex);
-        
-        return $dialogDiv.overlay();
-    };
-    cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton = applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton;
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui/widgets/cloudBrowser.js b/ui/legacy/scripts/ui/widgets/cloudBrowser.js
deleted file mode 100644
index dc38450..0000000
--- a/ui/legacy/scripts/ui/widgets/cloudBrowser.js
+++ /dev/null
@@ -1,357 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    cloudStack.ui.widgets.browser = {};
-
-    /**
-     * Breadcrumb-related functions
-     */
-    var _breadcrumb = cloudStack.ui.widgets.browser.breadcrumb = {
-        /**
-         * Generate new breadcrumb
-         */
-        create: function($panel, title) {
-            // Attach panel as ref for breadcrumb
-            return cloudStack.ui.event.elem(
-                'cloudBrowser', 'breadcrumb',
-                $('<div>')
-                .append(
-                    $('<li>')
-                    .attr({
-                        title: title
-                    })
-                    .append(
-                        $('<span>').html(title)
-                    )
-                )
-                .append($('<div>').addClass('end'))
-                .children(), {
-                    panel: $panel
-                }
-            );
-        },
-
-        /**
-         * Get breadcrumbs matching specified panels
-         */
-        filter: function($panels) {
-            var $breadcrumbs = $('#breadcrumbs ul li');
-            var $result = $([]);
-
-            $panels.each(function() {
-                var $panel = $(this);
-
-                $.merge(
-                    $result,
-                    $.merge(
-                        $breadcrumbs.filter(function() {
-                            return $(this).index('#breadcrumbs ul li') == $panel.index();
-                        }),
-
-                        // Also include ends
-                        $breadcrumbs.siblings('div.end').filter(function() {
-                            return $(this).index('div.end') == $panel.index() + 1;
-                        })
-                    )
-                );
-            });
-
-            return $result;
-        }
-    };
-
-    /**
-     * Container-related functions
-     */
-    var _container = cloudStack.ui.widgets.browser.container = {
-        /**
-         * Get all panels from container
-         */
-        panels: function($container) {
-            return $container.find('div.panel');
-        }
-    };
-
-    /**
-     * Panel-related functions
-     */
-    var _panel = cloudStack.ui.widgets.browser.panel = {
-        /**
-         * Compute width of panel, relative to container
-         */
-        width: function($container, options) {
-            options = options ? options : {};
-            var width = $container.find('div.panel').length < 1 || !options.partial ?
-                $container.width() : $container.width() - $container.width() / 4;
-
-            return width;
-        },
-
-        /**
-         * Get left position
-         */
-        position: function($container, options) {
-            return $container.find('div.panel').length <= 1 || !options.partial ?
-                0 : _panel.width($container, options) - _panel.width($container, options) / 1.5;
-        },
-
-        /**
-         * Get the top panel z-index, for proper stacking
-         */
-        topIndex: function($container) {
-            var base = 50; // Minimum z-index
-
-            return Math.max.apply(
-                null,
-                $.map(
-                    $container.find('div.panel'),
-                    function(elem) {
-                        return parseInt($(elem).css('z-index')) || base;
-                    }
-                )
-            ) + 1;
-        },
-
-        /**
-         * State when panel is outside container
-         */
-        initialState: function($container) {
-            return {
-                left: $container.width()
-            };
-        },
-
-        /**
-         * Get panel and breadcrumb behind specific panel
-         */
-        lower: function($container, $panel) {
-            return _container.panels($container).filter(function() {
-                return $(this).index() < $panel.index();
-            });
-        },
-
-        /**
-         * Get panel and breadcrumb stacked above specific panel
-         */
-        higher: function($container, $panel) {
-            return _container.panels($container).filter(function() {
-                return $(this).index() > $panel.index();
-            });
-        },
-
-        /**
-         * Generate new panel
-         */
-        create: function($container, options) {
-            var $panel = $('<div>').addClass('panel').css({
-                position: 'absolute',
-                width: _panel.width($container, {
-                    partial: options.partial
-                }),
-                zIndex: _panel.topIndex($container)
-            }).append(
-                // Shadow
-                $('<div>').addClass('shadow')
-            ).append(options.data);
-
-            return $panel;
-        }
-    };
-
-    /**
-     * Browser -- jQuery widget
-     */
-    $.widget('cloudStack.cloudBrowser', {
-        _init: function() {
-            this.element.addClass('cloudStack-widget cloudBrowser');
-            $('#breadcrumbs').append(
-                $('<ul>')
-            );
-        },
-
-        /**
-         * Make target panel the top-most
-         */
-        selectPanel: function(args) {
-            var $panel = args.panel;
-            var $container = this.element;
-            var $toShow = _panel.lower($container, $panel);
-            var $toRemove = _panel.higher($container, $panel);
-            var complete = args.complete;
-
-            _breadcrumb.filter($toRemove).remove();
-            _breadcrumb.filter($panel.siblings()).removeClass('active');
-            _breadcrumb.filter($panel).addClass('active');
-            _breadcrumb.filter($('div.panel')).find('span').css({
-                opacity: 1
-            });
-            _breadcrumb.filter(
-                $('div.panel.maximized')
-                .removeClass('maximized')
-                .addClass('reduced')
-            ).removeClass('active maximized');
-
-            $toRemove.remove();
-            $toShow.show();
-            $panel.css({
-                left: _panel.position($container, {
-                    maximized: $panel.hasClass('always-maximized')
-                })
-            });
-            $panel.show().removeClass('reduced');
-        },
-
-        /**
-         * Toggle selected panel as fully expanded, hiding/showing other panels
-         */
-        toggleMaximizePanel: function(args) {
-            var $panel = args.panel;
-            var $container = this.element;
-            var $toHide = $panel.siblings(':not(.always-maximized)');
-            var $shadow = $toHide.find('div.shadow');
-
-            if (args.panel.hasClass('maximized')) {
-                _breadcrumb.filter($panel).removeClass('maximized');
-                $panel.removeClass('maximized');
-                $panel.addClass('reduced');
-                _breadcrumb.filter($panel.siblings()).find('span').css({
-                    opacity: 1
-                });
-                $toHide.css({
-                    left: _panel.position($container, {})
-                });
-                $shadow.show();
-            } else {
-                _breadcrumb.filter($panel).addClass('maximized');
-                $panel.removeClass('reduced');
-                $panel.addClass('maximized');
-                $toHide.css(_panel.initialState($container));
-                $shadow.hide();
-            }
-        },
-
-        /**
-         * Append new panel to end of container
-         */
-        addPanel: function(args) {
-            var duration = args.duration ? args.duration : 500;
-            var $container = this.element;
-            var $parent = args.parent;
-            var $panel, $reduced, targetPosition;
-
-            // Create panel
-            $panel = _panel.create(this.element, {
-                partial: args.partial,
-                data: args.data
-            });
-
-            // Remove existing panels from parent
-            if ($parent) {
-                // Cleanup transitioning panels -- prevent old complete actions from running
-                $parent.siblings().stop();
-
-                _breadcrumb.filter(
-                    $('div.panel.maximized')
-                    .removeClass('maximized')
-                    .addClass('reduced')
-                ).removeClass('active maximized');
-
-                $parent.removeClass('maximized');
-                _breadcrumb.filter($parent.next()).remove();
-                $container.find($parent.next()).remove();
-            }
-
-            // Append panel
-            $panel.appendTo($container);
-            _breadcrumb.filter($panel.siblings()).removeClass('active');
-            _breadcrumb.create($panel, args.title)
-                .addClass('active')
-                .appendTo('#breadcrumbs ul');
-
-            // Reduced appearance for previous panels
-            $panel.siblings().filter(function() {
-                return $(this).index() < $panel.index();
-            }).addClass('reduced');
-
-            // Panel initial state
-            if ($panel.index() == 0) $panel.addClass('always-maximized');
-            $panel.css(
-                _panel.initialState($container, $panel)
-            );
-
-            // Panel slide-in
-            targetPosition = _panel.position($container, {
-                maximized: args.maximizeIfSelected,
-                partial: args.partial
-            });
-            if (!$panel.index()) {
-                // Just show immediately if this is the first panel
-                $panel.css({
-                    left: targetPosition
-                });
-                if (args.complete) args.complete($panel, _breadcrumb.filter($panel));
-            } else {
-                // Animate slide-in
-                $panel.css({
-                    left: targetPosition
-                });
-
-                // Hide panels
-                $panel.siblings().filter(function() {
-                    return $(this).width() == $panel.width();
-                });
-
-                if ($panel.is(':visible') && args.complete) args.complete($panel);
-            };
-
-            return $panel;
-        },
-
-        removeLastPanel: function(args) {
-            $('div.panel:last').stop(); // Prevent destroyed panels from animating
-            this.element.find('div.panel:last').remove();
-            this.element.find('div.panel:last').removeClass('reduced');
-            $('#breadcrumbs').find('ul li:last').remove();
-            $('#breadcrumbs').find('ul div.end').remove();
-        },
-
-        /**
-         * Clear all panels
-         */
-        removeAllPanels: function(args) {
-            $('div.panel').stop(); // Prevent destroyed panels from animating
-            this.element.find('div.panel').remove();
-            $('#breadcrumbs').find('ul li').remove();
-            $('#breadcrumbs').find('ul div.end').remove();
-        }
-    });
-
-    $(document).on('click', '#breadcrumbs li', cloudStack.ui.event.bind(
-        'cloudBrowser', {
-            'breadcrumb': function($target, $browser, data) {
-
-                if ($('#browser').hasClass('panel-highlight')) {
-                    return false;
-                }
-
-                $browser.cloudBrowser('selectPanel', {
-                    panel: data.panel
-                });
-            }
-        }
-    ));
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui/widgets/dataTable.js b/ui/legacy/scripts/ui/widgets/dataTable.js
deleted file mode 100644
index 1254ea6..0000000
--- a/ui/legacy/scripts/ui/widgets/dataTable.js
+++ /dev/null
@@ -1,397 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($) {
-    /**
-     * Convert table to be resizable and sortable
-     *
-     */
-    $.fn.dataTable = function(method, options) {
-        var $table = this;
-
-        /**
-         * Check if position is in 'resize zone'
-         *
-         * @return boolean, true if position is within bounds
-         */
-        var withinResizeBounds = function($elem, posX) {
-            var leftBound = $elem.offset().left + $elem.width() / 1.2;
-
-            return posX > leftBound;
-        };
-
-        /**
-         * Handles actual resizing of table headers
-         */
-        var resizeDragEvent = function(event) {
-            var $elem = $(this);
-
-            if (event.type == 'mousedown') {
-                $elem.addClass('dragging');
-
-                return false;
-            } else if (event.type == 'mouseup') {
-                $table.find('th').removeClass('dragging');
-
-                return false;
-            }
-
-            var isDraggable = $elem.hasClass('dragging');
-
-            if (!isDraggable) {
-                return false;
-            }
-
-            var columnIndex = $elem.index();
-
-            // Get all TDs from column
-            var columnCells = [];
-            $table.find('tbody tr:first').each(function() {
-                var targetCell = $($(this).find('td')[columnIndex]);
-
-                columnCells.push(targetCell);
-            });
-
-            var tolerance = 25;
-            var targetWidth = event.pageX - $elem.offset().left + tolerance;
-            $(columnCells).each(function() {
-                $(this).css({
-                    width: targetWidth
-                });
-            });
-
-            resizeHeaders();
-
-            return true;
-        };
-
-        var reattachTable = function() {
-            var $mainContainer = $('<div>')
-                .addClass('data-table')
-                .appendTo($table.parent())
-                .append($table.detach()
-            );
-        };
-
-        /**
-         * Event to set resizable appearance on hover
-         */
-        var hoverResizableEvent = function(event) {
-            var $elem = $(this);
-            var posX = event.pageX;
-
-            if (event.type != 'mouseout' && withinResizeBounds($elem, posX)) {
-                $elem.addClass('resizable');
-            } else {
-                $elem.removeClass('resizable');
-            }
-
-            return true;
-        };
-
-        /**
-         * Make row at specified index selected or unselected
-         *
-         * @param rowIndex Row's index, starting at 1
-         */
-        var toggleSelectRow = function(rowIndex) {
-            var $rows = $table.find('tbody tr');
-            var $row = $($rows[rowIndex]);
-
-            $row.siblings().removeClass('selected');
-            return $row.addClass('selected');
-        };
-
-        var computeEvenOddRows = function() {
-            var currentRowType = 'even';
-            $table.find('tbody tr').each(function() {
-                var $row = $(this);
-
-                $row.removeClass('even').removeClass('odd');
-                $row.addClass(currentRowType);
-
-                if (currentRowType == 'even') currentRowType = 'odd';
-                else currentRowType = 'even';
-            });
-        };
-
-        /**
-         * Sort table by column
-         *
-         * @param columnIndex Index of column (starting at 0) to sort by
-         */
-        var sortTable = function(columnIndex) {
-            var direction = 'asc';
-
-            if ($table.find('thead tr:last th').hasClass('sorted ' + direction)) {
-                direction = 'desc';
-            }
-
-            $table.find('thead tr:last th').removeClass('sorted desc asc');
-            $($table.find('thead tr:last th')[columnIndex]).addClass('sorted').addClass(direction);
-
-            var $elems = $table.find('tbody td').filter(function() {
-                return $(this).index() == columnIndex;
-            });
-
-            if ($elems.length < 2) {
-                return;
-            }
-            // strict function for filtering numbers (e.g. "2.3", "-2" but not "8 CPUs")
-            var filterNumber = function (value) {
-              if(/^[-+]?\d*\.?\d*$/.test(value))
-                return Number(value);
-              return NaN;
-            };
-            var stringComparator = function(a,b) {
-                return a.html().localeCompare(b.html());
-            };
-            var numericComparator = function(a,b) {
-                return filterNumber(a.children().html()) < filterNumber(b.children().html()) ? 1 : -1;
-            };
-            var stateComparator = function(a,b) {
-                return a.attr('title').localeCompare(b.attr('title'));
-            };
-            var ipV4AddressCIDRComparator = function(a,b) {
-                a = a.children().html().split(/[./]/gm);
-                b = b.children().html().split(/[./]/gm);
-                for( var i = 0; i < a.length; i++ )
-                {
-                  if( ( a[i] = parseInt( a[i] ) ) < ( b[i] = parseInt( b[i] ) ) )
-                    return -1;
-                  else if( a[i] > b[i] )
-                    return 1;
-                }
-                return 0;
-            };
-            var ipV6AddressCIDRComparator = function(a,b) {
-              a = a.children().html().split(/[:/]/gm);
-              b = b.children().html().split(/[:/]/gm);
-              for( var i = 0; i < a.length; i++ )
-              {
-                if((a[i] = parseInt("0x" + a[i] , 16)) < ( b[i] = parseInt( "0x" + b[i], 16)))
-                  return -1;
-                else if( a[i] > b[i] )
-                  return 1;
-              }
-              return 0;
-            };
-            var isIpV4Address = function(obj) {
-              return !$.isArray(obj) && (/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/gm).test(obj);
-            };
-            var isIpV6Address = function(obj) {
-              return !$.isArray(obj) && (/^[a-fA-F0-9:]+$/gm).test(obj);
-            };
-            var isIpV4CIDRAddress = function(obj) {
-              return !$.isArray(obj) && (/^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/gm).test(obj);
-            };
-            var isIpV6CIDRAddress = function(obj) {
-              return !$.isArray(obj) && (/^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$/gm).test(obj);
-            };
-
-            var isNumeric = function(obj) {
-                return !$.isArray(obj) && !isNaN(filterNumber(obj));
-            };
-
-            var comparator = stringComparator;
-            var hasAllRowsSameValue = true;
-            var firstElem = $($elems[0]).html();
-            var sortData = [];
-            var numericDataCount = 0;
-            var ipV4AddressDataCount = 0;
-            var ipV4CIDRDataCount = 0;
-            var ipV6AddressDataCount = 0;
-            var ipV6CIDRDataCount = 0;
-            $elems.each(function() {
-                var text = $(this);
-                if (hasAllRowsSameValue) {
-                    if (firstElem !== text.html()) {
-                        hasAllRowsSameValue = false;
-                    }
-                }
-                if (text.children()) {
-                    text = text.children().html();
-                } else {
-                    text = text.html();
-                }
-                if (isIpV4CIDRAddress(text) || !text){
-                    ipV4CIDRDataCount += 1;
-                }
-                if (isIpV4Address(text) || !text){
-                    ipV4AddressDataCount += 1;
-                }
-                if (isIpV6Address(text) || !text){
-                    ipV6AddressDataCount += 1;
-                }
-                if (isIpV6CIDRAddress(text) || !text){
-                    ipV6CIDRDataCount += 1;
-                }
-                if (isNumeric(text) || !text) {
-                    numericDataCount += 1;
-                }
-                sortData.push($(this));
-            });
-
-            if ($($elems[0]).hasClass('state')) {
-                comparator = stateComparator;
-            } else {
-                if (hasAllRowsSameValue) {
-                    return;
-                }
-                if (columnIndex !== 0){
-                  var relevantElementsBorder = $elems.length / 4;
-                  if (numericDataCount > relevantElementsBorder) {
-                    comparator = numericComparator;
-                  }
-                  if (ipV4AddressDataCount + ipV4CIDRDataCount > relevantElementsBorder){
-                    comparator = ipV4AddressCIDRComparator;
-                  }
-                  if (ipV6AddressDataCount + ipV6AddressDataCount > relevantElementsBorder){
-                    comparator = ipV6AddressCIDRComparator;
-                  }
-                }
-
-            }
-
-            sortData.sort(comparator);
-
-            if (direction == 'asc') {
-                sortData.reverse();
-            }
-
-            var elements = [];
-            $(sortData).each(function() {
-                elements.push($(this).parent().clone(true));
-            });
-
-            var $tbody = $table.find('tbody');
-            $tbody.empty();
-            $(elements).each(function() {
-                $(this).appendTo($tbody);
-            });
-
-            computeEvenOddRows();
-        };
-
-        var resizeHeaders = function() {
-            var $thead = $table.hasClass('no-split') ? $table.find('thead') : $table.closest('div.data-table').find('thead');
-            var $tbody = $table.find('tbody');
-            var $ths = $thead.find('th');
-            var $tds = $tbody.find('tr:first td');
-
-            if ($table.hasClass('no-split')) {
-                $tbody.width($thead.width());
-            }
-
-            if ($ths.length > $tds.length) {
-                $ths.width(
-                    $table.width() / $ths.length
-                );
-                return false;
-            }
-
-            $ths.each(function() {
-                var $th = $(this);
-
-                if ($th.hasClass('collapsible-column')) {
-                    return true;
-                }
-
-                var $td = $tds.filter(function() {
-                    return $(this).index() == $th.index();
-                });
-
-                $th.width($td.width());
-
-                return true;
-            });
-
-            return $ths;
-        };
-
-        var methods = {
-            removeRow: function(rowIndex) {
-                var $row = $($table.find('tbody tr')[rowIndex]);
-
-                $row.fadeOut(function() {
-                    $row.remove();
-                    computeEvenOddRows();
-                });
-
-                return $row;
-            },
-
-            refresh: function() {
-                resizeHeaders();
-                computeEvenOddRows();
-            },
-
-            selectRow: function(rowIndex) {
-                var $row = $($table.find('tbody tr')[rowIndex]);
-
-                $row.siblings().removeClass('selected');
-                $row.addClass('selected');
-            }
-        };
-
-        var init = function() {
-            var noSelect = options && options.noSelect == true ? true : false;
-            if (!$table.closest('div.data-table').length && !$table.hasClass('no-split')) {
-                reattachTable();
-                $table.find('tbody').closest('table').addClass('body');
-            }
-
-            if (!$table.hasClass('horizontal-overflow')) {
-                $table.find('th:not(:has(input))').bind('mousemove mouseout', hoverResizableEvent);
-                $table.find('th:not(:has(input))').bind('mousedown mousemove mouseup mouseout', resizeDragEvent);
-            }
-
-            $table.find('thead tr:last th:not(:has(input)):not(.collapsible-column):not(.quick-view)').unbind('click').bind('click', function(event) {
-                if ($(this).hasClass('resizable')) {
-                    return false;
-                }
-
-                sortTable($(event.target).index());
-
-                return false;
-            });
-
-            $table.bind('click', function(event) {
-                var $tr = $(event.target).closest('tr');
-
-                if (!$tr.length || noSelect) return true;
-                var rowIndex = $tr.index();
-
-                toggleSelectRow(rowIndex);
-
-                return true;
-            });
-
-            computeEvenOddRows();
-            resizeHeaders();
-        };
-
-        if (methods[method]) {
-            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-        } else if (!method) {
-            init();
-        } else {
-            $.error('Method ' + method + ' does not exist on jQuery.dataTable');
-        }
-
-        return $table;
-    };
-}(jQuery));
diff --git a/ui/legacy/scripts/ui/widgets/detailView.js b/ui/legacy/scripts/ui/widgets/detailView.js
deleted file mode 100644
index cca7063..0000000
--- a/ui/legacy/scripts/ui/widgets/detailView.js
+++ /dev/null
@@ -1,1687 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack, _l) {
-    var replaceListViewItem = function($detailView, newData, options) {
-        var $row = $detailView ? $detailView.data('list-view-row') :
-            options.$row;
-
-        if (!$row) return;
-
-        var $listView = $row.closest('.list-view');
-
-        if (!$listView.parents('html').length) return;
-
-        var $newRow;
-        var jsonObj = $row.data('json-obj');
-
-        if ($listView.length > 0) { //$listView.length is 0 after calling $(window).trigger('cloudStack.fullRefresh')
-            $listView.listView('replaceItem', {
-                $row: $row,
-                data: $.extend(jsonObj, newData),
-                after: function($newRow) {
-                    if ($detailView) {
-                        $detailView.data('list-view-row', $newRow);
-                    }
-
-                    setTimeout(function() {
-                        $('.data-table').dataTable('selectRow', $newRow.index());
-                    }, 100);
-                }
-            });
-        }
-
-        // Refresh detail view context
-        if ($detailView) {
-            var detailViewArgs = $detailView.data('view-args');
-            var listViewArgs = $listView.data('view-args');
-            var contextID = listViewArgs.sections && listViewArgs.sections[detailViewArgs.section].id ?
-                listViewArgs.sections[detailViewArgs.section].id :
-                detailViewArgs.section;
-
-            $.extend($detailView.data('view-args').context[contextID][0], newData);
-        }
-    };
-
-    var tabEvents = {
-        create: function(event, ui) {
-          manageTabsContent(event, ui);
-        },
-        activate: function(event, ui) {
-          manageTabsContent(event, ui);
-        }
-    };
-
-    /**
-     * Available UI actions to perform for buttons
-     */
-    var uiActions = {
-        /**
-         * Default behavior for actions -- just show a confirmation popup and add notification
-         */
-        standard: function($detailView, args, additional) {
-            var tab = args.tabs[args.activeTab];
-            var isMultiple = tab.multiple;
-            var action = isMultiple ? tab.actions[args.actionName] : args.actions[args.actionName];
-            var preAction = action.preAction;
-            var notification = action.notification ?
-                action.notification : {};
-            var messages = action.messages;
-            var id = args.id;
-            var jsonObj = args.jsonObj;
-            var context = $.extend(true, {},
-                args.context ? args.context : $detailView.data('view-args').context);
-            var _custom = $detailView.data('_custom');
-            var customAction = action.action.custom;
-            var noAdd = action.noAdd;
-            var noRefresh = additional.noRefresh;
-            var messageArgs = {
-                name: $detailView.find('tr.name td.value').html(),
-                context: context
-            };
-
-            // Handle pre-action (occurs before any other behavior happens)
-            if (preAction) {
-                if (!preAction({
-                    context: context
-                })) return false;
-            }
-
-            var updateTabContent = function(newData) {
-                var $detailViewElems = $detailView.find('ul.ui-tabs-nav, .detail-group').remove();
-                var viewArgs = $detailView.data('view-args');
-                var context = viewArgs.context;
-                var activeContextItem = viewArgs.section && context[viewArgs.section] ?
-                    context[viewArgs.section][0] : null;
-
-                $detailView.tabs('destroy');
-                $detailView.data('view-args').jsonObj = newData;
-
-                if (activeContextItem) {
-                    $.extend(activeContextItem, newData);
-                }
-
-                makeTabs(
-                    $detailView,
-                    $detailView.data('view-args').tabs, {
-                        context: context,
-                        tabFilter: $detailView.data('view-args').tabFilter,
-                        newData: newData
-                    }
-                ).appendTo($detailView);
-
-                $detailView.tabs(tabEvents);
-            };
-
-            var performAction = function(data, options) {
-                if (!options) options = {};
-
-                var $form = options.$form;
-                var viewArgs = $detailView.data('view-args');
-                var $loading = $('<div>').addClass('loading-overlay');
-
-                var setLoadingState = function() {
-                    if (viewArgs && viewArgs.onPerformAction) {
-                        viewArgs.onPerformAction();
-                    }
-
-                    $detailView.addClass('detail-view-loading-state');
-                    $detailView.prepend($loading);
-                };
-
-                if (customAction && !noAdd) {
-                    customAction({
-                        context: context,
-                        $detailView: $detailView,
-                        start: setLoadingState,
-                        complete: function(args) {
-                            if (!$detailView.hasClass('detail-view-loading-state')) {
-                                setLoadingState();
-                            }
-
-                            args = args ? args : {};
-
-                            var $item = args.$item;
-                            var $row = $detailView.data('list-view-row');
-                            var error = args.error;
-
-                            notification.desc = messages.notification(args.messageArgs);
-                            notification._custom = $.extend(args._custom ? args._custom : {}, {
-                                $detailView: $detailView
-                            });
-
-                            if (error) {
-                                notification.interval = 1;
-                                notification.poll = function(args) {
-                                    cloudStack.dialog.notice({ message: error });
-                                    args.error(error);
-                                }
-                            }
-
-                            cloudStack.ui.notifications.add(
-                                notification,
-
-                                // Success
-
-                                function(args) {
-                                    if (viewArgs && viewArgs.onActionComplete) {
-                                        viewArgs.onActionComplete();
-                                    }
-
-                                    if (!$detailView.parents('html').length) {
-                                        replaceListViewItem(null, args.data, {
-                                            $row: $row
-                                        });
-                                        return;
-                                    }
-
-                                    replaceListViewItem($detailView, args.data);
-                                    $loading.remove();
-                                    $detailView.removeClass('detail-view-loading-state');
-
-                                    if (!noRefresh) {
-                                        updateTabContent(args.data);
-                                    }
-                                },
-
-                                {},
-
-                                // Error
-
-                                function(args) {
-                                    $loading.remove();
-                                }
-                            );
-                        }
-                    });
-                } else {
-                    // Set loading appearance
-                    var $loading = $('<div>').addClass('loading-overlay');
-                    $detailView.prepend($loading);
-
-                    action.action({
-                        data: data,
-                        _custom: _custom,
-                        ref: options.ref,
-                        context: context,
-                        $form: $form,
-                        response: {
-                            success: function(args) {
-                                args = args ? args : {};
-                                notification._custom = $.extend(args._custom ? args._custom : {}, {
-                                    $detailView: $detailView
-                                });
-
-                                if (additional && additional.success) additional.success(args);
-
-                                // Setup notification
-                                cloudStack.ui.notifications.add(
-                                    notification,
-                                    function(args2) { //name parameter as "args2" instead of "args" to avoid override "args" from success: function(args) {
-                                        if ($detailView.parents('html').length) {
-                                            $loading.remove();
-
-                                            if (!noRefresh && !viewArgs.compact) {
-                                                if (isMultiple) {
-                                                    $detailView.find('.refresh').click();
-                                                } else {
-                                                    updateTabContent(args.data ? args.data : args2.data);
-                                                }
-                                            }
-                                        }
-
-                                        if (messages.complete) {
-                                            if( messages.complete(args2.data) != null && messages.complete(args2.data).length > 0) {
-                                                 cloudStack.dialog.notice({
-                                                     message: messages.complete(args2.data)
-                                                 });
-                                            }
-                                        }
-                                        if (additional && additional.complete) additional.complete($.extend(true, args, {
-                                            $detailView: $detailView
-                                        }), args2);
-
-                                        replaceListViewItem($detailView, args.data ? args.data : args2.data);
-
-                                        if (viewArgs && viewArgs.onActionComplete) {
-                                            viewArgs.onActionComplete();
-                                        }
-                                    },
-
-                                    {},
-
-                                    // Error
-
-                                    function(args) {
-                                        $loading.remove();
-                                    }
-                                );
-
-                                return true;
-                            },
-                            error: function(args) { //args here is parsed errortext from API response
-                                if (args != null & args.length > 0) {
-                                    cloudStack.dialog.notice({
-                                        message: args
-                                    });
-                                }
-
-                                // Quickview: Remove loading state on list row
-                                if (viewArgs && viewArgs.$listViewRow) {
-                                    viewArgs.$listViewRow.removeClass('loading')
-                                        .find('.loading').removeClass('loading');
-                                }
-                                $loading.remove();
-                            }
-                        }
-                    });
-
-                    if (viewArgs && viewArgs.onPerformAction) {
-                        viewArgs.onPerformAction();
-                    }
-                }
-            };
-
-            var externalLinkAction = action.action.externalLink;
-            if (externalLinkAction) {
-                // Show popup immediately, do not proceed through normal action process
-                window.open(
-                    // URL
-                    externalLinkAction.url({
-                        context: context
-                    }),
-
-                    // Title
-                    externalLinkAction.title({
-                        context: context
-                    }),
-
-                    // Window options
-                    'menubar=0,resizable=1,' + 'width=' + externalLinkAction.width + ',' + 'height=' + externalLinkAction.height
-                );
-            } else {
-                notification.desc = messages.notification(messageArgs);
-                notification.section = 'instances';
-
-                if (!action.createForm && !action.listView) {
-                    if (messages && messages.confirm) {
-                        cloudStack.dialog.confirm({
-                            message: messages.confirm(messageArgs),
-                isWarning: messages.isWarning,
-                            action: function() {
-                                performAction({
-                                    id: id
-                                });
-                            }
-                        });
-                    } else {
-                        performAction({
-                            id: id
-                        });
-                    }
-                } else if (action.createForm) {
-                    cloudStack.dialog.createForm({
-                        form: action.createForm,
-                        after: function(args) {
-                            performAction(args.data, {
-                                ref: args.ref,
-                                context: context,
-                                $form: args.$form
-                            });
-                        },
-                        ref: {
-                            id: id
-                        },
-                        context: context,
-                        jsonObj: jsonObj
-                    });
-                } else if (action.listView) {
-                    cloudStack.dialog.listView({
-                        context: context,
-                        listView: action.listView,
-                        after: function(args) {
-                            context = args.context;
-                            performAction();
-                        }
-                    });
-                }
-            }
-        },
-
-        remove: function($detailView, args) {
-            var tab = args.tabs[args.activeTab];
-            var isMultiple = tab.multiple;
-
-            uiActions.standard($detailView, args, {
-                noRefresh: true,
-                complete: function(args) {
-                    if (isMultiple && $detailView.is(':visible')) {
-                        $detailView.find('.refresh').click(); // Reload tab
-                    } else {
-                        var $browser = $('#browser .container');
-                        var $panel = $detailView.closest('.panel');
-
-                        if ($detailView.is(':visible')) {
-                            $browser.cloudBrowser('selectPanel', {
-                                panel: $panel.prev()
-                            });
-                        }
-
-                        if ($detailView.data("list-view-row") != null) {
-                            var $row = $detailView.data('list-view-row');
-                            var $tbody = $row.closest('tbody');
-
-                            $row.remove();
-                            if (!$tbody.find('tr').length) {
-                                $("<tr>").addClass('empty').append(
-                                    $("<td>").html(_l('label.no.data'))
-                                ).appendTo($tbody);
-                            }
-                            $tbody.closest('table').dataTable('refresh');
-                        }
-                    }
-                }
-            });
-        },
-
-        destroy: function($detailView, args) {
-            var tab = args.tabs[args.activeTab];
-            var isMultiple = tab.multiple;
-
-            uiActions.standard($detailView, args, {
-                noRefresh: true,
-                complete: function(args, args2) {
-                    if ((!('id' in args2.data)) && ('toRemove' in args2.data) && (args2.data.toRemove == true)) {
-                        if (isMultiple && $detailView.is(':visible')) {
-                            $detailView.find('.refresh').click(); // Reload tab
-                        } else {
-                            var $browser = $('#browser .container');
-                            var $panel = $detailView.closest('.panel');
-
-                            if ($detailView.is(':visible')) {
-                                $browser.cloudBrowser('selectPanel', {
-                                    panel: $panel.prev()
-                                });
-                            }
-
-                            if ($detailView.data("list-view-row") != null) {
-                                var $row = $detailView.data('list-view-row');
-                                var $tbody = $row.closest('tbody');
-
-                                $row.remove();
-                                if (!$tbody.find('tr').length) {
-                                    $("<tr>").addClass('empty').append(
-                                        $("<td>").html(_l('label.no.data'))
-                                    ).appendTo($tbody);
-                                }
-                                $tbody.closest('table').dataTable('refresh');
-                            }
-                        }
-                    }  else {
-                        $detailView.find('.refresh').click(); // Reload tab
-                    }
-                }
-            });
-        },
-
-
-        /**
-         * Convert editable fields to text boxes; clicking again saves data
-         *
-         * @param $detailView
-         * @param callback
-         */
-        edit: function($detailView, args) {
-            $detailView.addClass('edit-mode');
-            var token_value = "";
-
-            if ($detailView.find('.button.done').length) return false;
-
-            // Convert value TDs
-            var $inputs = $detailView.find('input, select, textarea').filter(function() {
-                return !$(this).closest('.tagger').length && !$(this).attr('type') == 'submit';
-            });
-            var action = args.actions[args.actionName];
-            var id = $detailView.data('view-args').id;
-            var $editButton = $('<div>').addClass('button done').html(_l('label.apply')).hide();
-            var $cancelButton = $('<div>').addClass('button cancel').html(_l('label.cancel')).hide();
-
-            // Show buttons
-            $.merge($editButton, $cancelButton)
-                .appendTo(
-                    $detailView.find('.ui-tabs-panel .detail-group.actions')
-            ).fadeIn();
-
-            $detailView.find('.tagger').find('input[type=text]').val('');
-
-            $('div.container div.panel div.detail-group .details .main-groups').find('.cidr').toolTip({
-                docID: 'helpIPReservationCidr',
-                mode: 'hover',
-                tooltip: '.tooltip-box'
-            });
-
-            var removeCopyPasteIcons = function() {
-                $detailView.find('.copypasteactive').removeClass('copypasteactive').addClass('copypasteenabledvalue');
-                $detailView.find('td.value .copypasteicon').hide();
-            };
-
-            removeCopyPasteIcons();
-
-            var convertInputs = function($inputs) {
-                // Save and turn back into labels
-                var $token;
-                var tags_value = "";
-                $inputs.each(function() {
-                    if ($(this).closest('.tagger').length) return true;
-
-                    var $input = $(this);
-                    var $value = $input.closest('td.value span');
-
-                    if ($input.is('input[type=text]'))
-                    {
-                        if ($input.attr('name') === "token-input-")
-                        {
-                            $token = $value;
-                        }
-                        else if (($input.attr('name') === "tags") || ($input.attr('name') === "hosttags"))
-                        {
-                            tags_value = $input.attr('value');
-                        }
-                        $value.html(_s(
-                            $input.attr('value')
-                        ));
-                    }
-                    else if ($input.is('input[type=password]')) {
-                        $value.html('');
-                    } else if ($input.is('input[type=checkbox]')) {
-                        var val = $input.is(':checked');
-
-                        $value.data('detail-view-boolean-value', _s(val));
-                        $value.html(_s(val) ? _l('label.yes') : _l('label.no'));
-                    } else if ($input.is('select')) {
-                        $value.html(_s(
-                            $input.find('option:selected').html()
-                        ));
-                        $value.data('detail-view-selected-option', _s($input.find('option:selected').val()));
-                    } else if ($input.is('textarea')) {
-                        $value.html(_s(
-                            $input.val()
-                        ));
-                        $value.data('detail-view-editable-textarea', _s($input.find('option:selected').val()));
-                    }
-                });
-
-                if ($token) {
-                    $token.html(_s(tags_value));
-                }
-            };
-
-            var removeEditForm = function() {
-                $detailView.removeClass('edit-mode');
-
-                // Remove Edit form
-                var $form = $detailView.find('form').filter(function() {
-                    return !$(this).closest('.tagger').length;
-                });
-                if ($form.length) {
-                    var $mainGroups = $form.find('div.main-groups').detach();
-                    $form.parent('div').append($mainGroups);
-                    $form.remove();
-                }
-                //Remove required labels
-                $detailView.find('span.field-required').remove();
-            };
-
-            // Put in original values
-            var cancelEdits = function($inputs, $editButton) {
-                $inputs.each(function() {
-                    if ($(this).closest('.tagger').length) return true;
-
-                    var $input = $(this);
-                    var $value = $input.closest('td.value span');
-                    var originalValue = $input.data('original-value');
-
-                    if ($input.attr('id') === 'token-input-')
-                    {
-                        originalValue = token_value;
-                    }
-
-                    $value.html(_s(originalValue));
-                });
-
-                $editButton.fadeOut('fast', function() {
-                    $editButton.remove();
-                });
-
-                removeEditForm();
-            };
-
-            var applyEdits = function($inputs, $editButton) {
-                if ($inputs.length) {
-                    $inputs.animate({
-                        opacity: 0.5
-                    }, 500);
-
-                    var data = {};
-                    $inputs.each(function() {
-                        var $input = $(this);
-
-                        if ($input.is('[type=checkbox]')) {
-                            data[$input.attr('name')] = $input.is(':checked') ? 'on' : 'off';
-                        } else {
-                            data[$input.attr('name')] = $input.val();
-                        }
-                    });
-
-                    $editButton.fadeOut('fast', function() {
-                        $editButton.remove();
-                    });
-
-                    var $loading = $('<div>').addClass('loading-overlay');
-
-                    action.action({
-                        data: data,
-                        _custom: $detailView.data('_custom'),
-                        $detailView: $detailView,
-                        context: $detailView.data('view-args').context,
-                        response: {
-                            success: function(args) {
-                                var notificationArgs = {
-                                    section: id,
-                                    desc: _l('changed.item.properties'),
-                                    _custom: args ? args._custom : null
-                                };
-
-                                if (!action.notification) {
-                                    convertInputs($inputs);
-                                    cloudStack.ui.notifications.add(
-                                        notificationArgs, function() {}, []
-                                    );
-                                    replaceListViewItem($detailView, data);
-                                    removeEditForm();
-                                } else {
-                                    $loading.appendTo($detailView);
-                                    cloudStack.ui.notifications.add(
-                                        $.extend(true, {}, notificationArgs, action.notification),
-                                        function(args) {
-                                            replaceListViewItem($detailView, data);
-
-                                            convertInputs($inputs);
-                                            removeEditForm();
-                                            $loading.remove();
-                                        }, [],
-                                        function() {
-                                            $loading.remove();
-                                            $inputs.closest('.detail-view').find('.toolbar .refresh').click();
-                                        }, []
-                                    );
-                                }
-                            },
-                            error: function(message) {
-                                cancelEdits($inputs, $editButton);
-                                if (message) cloudStack.dialog.notice({
-                                    message: message
-                                });
-                            }
-                        }
-                    });
-                }
-            };
-
-            $editButton.click(function() {
-                var $inputs = $detailView.find('input, select, textarea').filter(function() {
-                    return !$(this).closest('.tagger').length;
-                });
-                var $form = $detailView.find('form').filter(function() {
-                    return !$(this).closest('.tagger').length;
-                });
-
-                if ($(this).hasClass('done')) {
-                    if (!$form.valid()) {
-                        // Ignore hidden field validation
-                        if ($form.find('input.error:visible, select.error:visible').length) {
-                            return false;
-                        }
-                    }
-                    restoreCopyPasteIcons();
-                    applyEdits($inputs, $editButton);
-                } else { // Cancel
-                    restoreCopyPasteIcons();
-                    cancelEdits($inputs, $editButton);
-                }
-                return true;
-            });
-
-            $('div.container div.panel div.detail-group .details .main-groups').find('.reservediprange').toolTip({
-                docID: 'helpReservedIPRange',
-                mode: 'hover',
-                tooltip: '.tooltip-box'
-            });
-            $('div.container div.panel div.detail-group .details .main-groups').find('.networkcidr').toolTip({
-                docID: 'helpIPReservationNetworkCidr',
-                mode: 'hover',
-                tooltip: '.tooltip-box'
-            });
-
-            var restoreCopyPasteIcons = function() {
-                $detailView.find('td.value .copypasteicon').show();
-            };
-
-            $detailView.find('td.value span').each(function() {
-                var name = $(this).closest('tr').data('detail-view-field');
-                var $value = $(this);
-                if (!$value.data('detail-view-is-editable')) return true;
-
-                // Turn into form field
-                var selectData = $value.data('detail-view-editable-select');
-                var isBoolean = $value.data('detail-view-editable-boolean');
-                var textArea = $value.data('detail-view-editable-textarea');
-                var isTokenInput = $value.data('detail-view-is-token-input');
-                var data = !isBoolean ? cloudStack.sanitizeReverse($value.html()) : $value.data('detail-view-boolean-value');
-                var rules = $value.data('validation-rules') ? $value.data('validation-rules') : {};
-                var isPassword = $value.data('detail-view-is-password');
-
-                $value.html('');
-
-                if (selectData) {
-                    // Select
-                    $value.append(
-                        $('<select>')
-                        .attr({
-                            name: name,
-                            type: 'text',
-                            value: data
-                        })
-                        .addClass('disallowSpecialCharacters').data('original-value', data)
-                    );
-
-                    // Make option values from given array
-                    $(selectData).each(function() {
-                        $('<option>')
-                            .attr({
-                                value: _s(this.id)
-                            })
-                            .html(_s(this.description))
-                            .appendTo($value.find('select'));
-                    });
-
-                    $value.find('select').val($value.data('detail-view-selected-option'));
-                } else if (isBoolean) {
-                    $value.append(
-                        $('<input>').attr({
-                            name: name,
-                            type: 'checkbox',
-                            checked: data
-                        })
-                    );
-                } else if (isTokenInput) { // jquery.tokeninput.js
-                    function to_json_array(str) {
-                        var simple_array = str.split(",");
-                        var json_array = [];
-
-                        $.each(simple_array, function(index, value) {
-                            if ($.trim(value).length > 0)
-                            {
-                                var obj = {
-                                    id : value,
-                                    name : value
-                                };
-
-                                json_array.push(obj);
-                            }
-                        });
-
-                        return json_array;
-                    }
-
-                    var existing_tags = to_json_array(data);
-
-                    isAsync = true;
-
-                    selectArgs = {
-                        context: $detailView.data('view-args').context,
-                        response: {
-                            success: function(args) {
-                                $input.tokenInput(unique_tags(args.data),
-                                {
-                                    theme: "facebook",
-                                    preventDuplicates: true,
-                                    prePopulate: existing_tags,
-                                    processPrePopulate: true,
-                                    hintText: args.hintText,
-                                    noResultsText: args.noResultsText
-                                });
-                            }
-                        }
-                    };
-
-                    $input = $('<input>').attr({
-                        name: name,
-                        type: 'text',
-                        value: data
-                    }).data('original-value', data);
-
-                    $value.append($input);
-                    token_value = data;
-                    $value.data('value-token').dataProvider(selectArgs);
-                } else if (textArea) {
-                    // Text area
-                    $value.append(
-                        $('<textarea>').attr({
-                            name: name,
-                            value: data
-                        }).css({'min-height': '80px'}).data('original-value', data)
-                    );
-                    $value.css({'width': '100%', 'height': '100%'});
-                } else {
-                    // Text input
-                    $value.append(
-                        $('<input>').attr({
-                            name: name,
-                            type: isPassword ? 'password' : 'text',
-                            value: data
-                        }).addClass('disallowSpecialCharacters').data('original-value', data)
-                    );
-                }
-
-                if (rules && rules.required) {
-                    var $required = $('<span>').addClass('field-required').text(' *');
-                    $value.parent('td.value').prev('td.name').append($required);
-                }
-
-                return true;
-            });
-
-            if ($detailView.find('td.value span:data(detail-view-is-editable)').length) {
-                var $detailsEdit = $detailView.find('div.main-groups').detach(),
-                    $detailsEditForm = $('<form>').append($detailsEdit);
-
-                $detailView.find('div.details').append($detailsEditForm);
-            }
-
-            // Setup form validation
-            var $form = $detailView.find('form').filter(function() {
-                return !$(this).closest('.tagger').length;
-            });
-            $form.validate();
-            $form.find('input, select').each(function() {
-                var data = $(this).parent('span').data('validation-rules');
-                if (data) {
-                    $(this).rules('add', data);
-                } else {
-                    $(this).rules('add', {});
-                }
-            });
-
-            return $detailView;
-        }
-    };
-
-    var viewAll = function(viewAllID, options) {
-        var $detailView = $('div.detail-view:visible:last');
-        var args = $detailView.data('view-args');
-        var cloudStackArgs = $('[cloudstack-container]').data('cloudStack-args');
-        var $browser = args.$browser;
-        var listViewArgs, viewAllPath;
-        var $listView;
-        var isCustom = $.isFunction(viewAllID.custom);
-        var updateContext = options.updateContext;
-        var customTitle = options.title;
-
-        if (isCustom) {
-            $browser.cloudBrowser('addPanel', {
-                title: _l(viewAllID.label),
-                maximizeIfSelected: true,
-                complete: function($newPanel) {
-                    $newPanel.append(
-                        viewAllID.custom({
-                            $browser: $browser,
-                            context: $detailView.data('view-args').context,
-                            listViewArgs: $detailView.data('list-view') ? $detailView.data('list-view').data('view-args') : null
-                        })
-                    );
-                }
-            });
-
-            return;
-        }
-
-        // Get path in cloudStack args
-        viewAllPath = viewAllID.split('.');
-
-        if (viewAllPath.length == 2) {
-            if (viewAllPath[0] != '_zone') {
-                listViewArgs = $.extend(true, {}, cloudStackArgs.sections[viewAllPath[0]].sections[viewAllPath[1]]);
-            } else {
-                // Sub-section of the zone chart
-                listViewArgs = $.extend(true, {}, cloudStackArgs.sections.system
-                    .subsections[viewAllPath[1]]);
-            }
-        } else {
-            listViewArgs = $.extend(true, {}, cloudStackArgs.sections[viewAllPath[0]]);
-        }
-
-        // Make list view
-        listViewArgs.$browser = $browser;
-
-        if (viewAllPath.length == 2)
-            listViewArgs.id = viewAllPath[0];
-        else
-            listViewArgs.id = viewAllID;
-
-        listViewArgs.ref = {
-            id: args.id,
-            type: $detailView.data('view-args').section
-        };
-
-        // Load context data
-        var context = $.extend(true, {}, $detailView.data('view-args').context);
-
-        if (updateContext) {
-            $.extend(context, updateContext({
-                context: context
-            }));
-        }
-
-        // Make panel
-        var $panel = $browser.cloudBrowser('addPanel', {
-            title: customTitle ? customTitle({
-                context: context
-            }) : _l(listViewArgs.title),
-            data: '',
-            noSelectPanel: true,
-            maximizeIfSelected: true,
-            complete: function($newPanel) {
-                return $('<div>').listView(listViewArgs, {
-                    context: context
-                }).appendTo($newPanel);
-            }
-        });
-    };
-
-    /**
-     * Make action button elements
-     *
-     * @param actions {object} Actions to generate
-     */
-    var makeActionButtons = function(actions, options) {
-        options = options ? options : {};
-        var $actions = $('<td>').addClass('detail-actions').append(
-            $('<div>').addClass('buttons')
-        );
-
-        var allowedActions = [];
-
-        if (actions) {
-            allowedActions = $.map(actions, function(value, key) {
-                return key;
-            });
-
-            if (options.actionFilter)
-                allowedActions = options.actionFilter({
-                    context: $.extend(true, {}, options.context, {
-                        actions: allowedActions,
-                        item: options.data
-                    })
-                });
-
-            $.each(actions, function(key, value) {
-                if ((!value.preFilter && $.inArray(key, allowedActions) == -1) ||
-                    (value.preFilter && !value.preFilter({ context: options.context })) ||
-                    (options.ignoreAddAction && key == 'add') ||
-                    (key == 'edit' && options.compact)) {
-
-                    return true;
-                }
-
-                var $action = $('<div></div>')
-                    .addClass('action').addClass(key)
-                    .appendTo($actions.find('div.buttons'))
-                    .attr({
-                        title: _l(value.label),
-                        alt: _l(value.label)
-                    });
-                var $actionLink = $('<a></a>')
-                    .attr({
-                        href: '#',
-                        title: _l(value.label),
-                        alt: _l(value.label),
-                        'detail-action': key
-                    })
-                    .data('detail-view-action-callback', value.action)
-                    .append(
-                        $('<span>').addClass('icon').html('&nbsp;')
-                )
-                    .appendTo($action);
-
-                if (value.textLabel || options.compact) {
-                    $action
-                        .addClass('single text')
-                        .prepend(
-                            $('<span>').addClass('label').html(
-                                _l(
-                                    options.compact ?
-                                    (value.compactLabel ?
-                                        value.compactLabel : value.label) : value.textLabel
-                                )
-                            )
-                    );
-                }
-
-                return true;
-            });
-
-            var $actionButtons = $actions.find('div.action:not(.text)');
-            if ($actionButtons.length == 1)
-                $actionButtons.addClass('single');
-            else {
-                $actionButtons.filter(':first').addClass('first');
-                $actionButtons.filter(':last').addClass('last');
-            }
-        }
-
-        return $('<div>')
-            .addClass('detail-group actions')
-            .append(
-                $('<table>').append(
-                    $('<tbody>').append(
-                        $('<tr>').append($actions)
-                    )
-                )
-        );
-    };
-
-    /**
-     * Generate attribute field rows in tab
-     */
-    var makeFieldContent = function(tabData, $detailView, data, args) {
-        if (!args) args = {};
-
-        var $detailGroups = $('<div>').addClass('details');
-        var isOddRow = false; // Even/odd row coloring
-        var $header;
-        var detailViewArgs = $detailView.data('view-args');
-        var fields = $.isArray(tabData.fields) ? tabData.fields.slice() : tabData.fields;
-        var hiddenFields;
-        var context = $.extend(true, {}, detailViewArgs ? detailViewArgs.context : cloudStack.context);
-        var isMultiple = tabData.multiple || tabData.isMultiple;
-        var actions = tabData.actions;
-
-        if (isMultiple) {
-            context[tabData.id] = [data];
-            $detailGroups.data('item-context', context);
-        }
-
-        // Make header
-        if (args.header) {
-            $detailGroups.addClass('group-multiple');
-            $header = $('<table>').addClass('header').appendTo($detailGroups);
-            $header.append($('<thead>').append($('<tr>')));
-            $header.find('tr').append($('<th>'));
-        }
-
-        if (tabData.preFilter) {
-            hiddenFields = tabData.preFilter({
-                context: context,
-                fields: $.map(fields, function(fieldGroup) {
-                    return $.map(fieldGroup, function(value, key) {
-                        return key;
-                    });
-                })
-            });
-        }
-
-        $detailGroups.append($('<div>').addClass('main-groups'));
-
-        $(window).trigger('cloudStack.detailView.makeFieldContent', {
-            fields: fields,
-            data: data,
-            detailViewArgs: detailViewArgs,
-            $detailView: $detailView,
-            $detailGroups: $detailGroups
-        });
-
-        $(fields).each(function() {
-            var fieldGroup = this;
-            var $detailTable = $('<tbody></tbody>').appendTo(
-                $('<table></table>').appendTo(
-                    $('<div></div>').addClass('detail-group').appendTo($detailGroups.find('.main-groups'))
-                ));
-
-            $.each(fieldGroup, function(key, value) {
-                if (hiddenFields && $.inArray(key, hiddenFields) >= 0) return true;
-                if ($header && key == args.header) {
-                    $header.find('th').html(_s(data[key]));
-                    return true;
-                }
-
-                var $detail = $('<tr></tr>').addClass(key + '-row').appendTo($detailTable);
-                var $name = $('<td></td>').addClass('name').appendTo($detail);
-                var $value = $('<span>').appendTo($('<td></td>').addClass('value').appendTo($detail));
-                var content = data[key];
-
-                if (this.converter) content = this.converter(content);
-
-                $detail.data('detail-view-field', key);
-
-                // Even/odd row coloring
-                if (isOddRow && key != 'name') {
-                    $detail.addClass('odd');
-                    isOddRow = false;
-                } else if (key != 'name') {
-                    isOddRow = true;
-                }
-
-                $name.html(_l(value.label));
-                $value.html(_s(content));
-                $value.attr('title', _s(content));
-
-                // Set up validation metadata
-                $value.data('validation-rules', value.validation);
-
-                //add copypaste icon
-                if (value.isCopyPaste) {
-                    var $copyicon = $('<div>').addClass('copypasteicon').insertAfter($value);
-                    $value.addClass('copypasteenabledvalue');
-
-                    //set up copypaste eventhandler
-                    $copyicon.click(function() {
-                        //reset other values' formatting
-                        $(this).closest('table').find('span.copypasteactive').removeClass('copypasteactive').addClass('copypasteenabledvalue');
-                        //find the corresponding value
-                        var $correspValue = $(this).closest('tr').find('.value').find('span');
-                        $value.removeClass("copypasteenabledvalue").addClass("copypasteactive");
-                        var correspValueElem = $correspValue.get(0);
-                        //select the full value
-                        var range = document.createRange();
-                        range.selectNodeContents(correspValueElem);
-                        var selection = window.getSelection();
-                        selection.removeAllRanges();
-                        selection.addRange(range);
-                    });
-                }
-
-                // Set up editable metadata
-                if (typeof(value.isEditable) == 'function')
-                {
-                    $value.data('detail-view-is-editable', value.isEditable(context));
-                }
-                else // typeof(value.isEditable) == 'boolean' or 'undefined'
-                {
-                    $value.data('detail-view-is-editable', value.isEditable);
-
-                    if (value.isTokenInput)
-                    {
-                         $value.data('detail-view-is-token-input', true);
-                         $value.data('value-token', value);
-                    }
-                }
-
-                if (value.select) {
-                    value.selected = $value.html();
-
-                    value.select({
-                        context: context,
-                        response: {
-                            success: function(args) {
-                                // Get matching select data
-                                var matchedSelectValue = $.grep(args.data, function(option, index) {
-                                    return option.id == value.selected;
-                                })[0];
-
-                                if (matchedSelectValue != null) {
-                                    $value.html(_s(matchedSelectValue.description));
-                                    $value.data('detail-view-selected-option', matchedSelectValue.id);
-                                }
-
-                                $value.data('detail-view-editable-select', args.data);
-
-                                return true;
-                            }
-                        }
-                    });
-                } else if (value.isBoolean) {
-                    $value.data('detail-view-editable-boolean', true);
-                    $value.data('detail-view-boolean-value', content == 'Yes' ? true : false);
-                } else if (value.textArea) {
-                    $value.data('detail-view-editable-textarea', true);
-                } else {
-                    $value.data('detail-view-is-password', value.isPassword);
-                }
-
-                return true;
-            });
-        });
-
-        if (args.isFirstPanel) {
-            var $firstRow = $detailGroups.filter(':first').find('div.detail-group:first table tr:first');
-            var $actions;
-            var actions = detailViewArgs.actions;
-            var actionFilter = args.actionFilter;
-
-            // Detail view actions
-            if (actions || detailViewArgs.viewAll)
-                $actions = makeActionButtons(detailViewArgs.actions, {
-                    actionFilter: actionFilter,
-                    data: data,
-                    context: $detailView.data('view-args').context,
-                    compact: detailViewArgs.compact
-                }).prependTo($firstRow.closest('div.detail-group').closest('.details'));
-
-            // 'View all' button
-            var showViewAll = detailViewArgs.viewAll ?
-                (
-                detailViewArgs.viewAll.preFilter ?
-                detailViewArgs.viewAll.preFilter({
-                    context: context
-                }) : true
-            ) : true;
-            if ($actions && ($actions.find('div.action').length || (detailViewArgs.viewAll && showViewAll))) {
-                $actions.prependTo($firstRow.closest('div.detail-group').closest('.details'));
-            }
-            if (detailViewArgs.viewAll && showViewAll) {
-                if (!$.isArray(detailViewArgs.viewAll)) {
-                    $('<div>')
-                        .addClass('view-all')
-                        .append(
-                            $('<a>')
-                            .attr({
-                                href: '#'
-                            })
-                            .data('detail-view-link-view-all', detailViewArgs.viewAll)
-                            .append(
-                                $('<span>').html(_l('label.view') + ' ' + _l(detailViewArgs.viewAll.label))
-                            )
-                    )
-                        .append(
-                            $('<div>').addClass('end')
-                    )
-                        .appendTo(
-                            $('<td>')
-                            .addClass('view-all')
-                            .appendTo($actions.find('tr'))
-                    );
-                } else {
-                    $(detailViewArgs.viewAll).each(function() {
-                        var viewAllItem = this;
-
-                        if (viewAllItem.preFilter && !viewAllItem.preFilter({
-                            context: context
-                        })) {
-                            return true;
-                        }
-
-                        $('<div>')
-                            .addClass('view-all')
-                            .append(
-                                $('<a>')
-                                .attr({
-                                    href: '#'
-                                })
-                                .data('detail-view-link-view-all', viewAllItem)
-                                .append(
-                                    $('<span>').html(_l('label.view') + ' ' + _l(viewAllItem.label))
-                                )
-                        )
-                            .append(
-                                $('<div>').addClass('end')
-                        )
-                            .appendTo(
-                                $('<td>')
-                                .addClass('view-all multiple')
-                                .appendTo($actions.find('tr'))
-                        );
-
-                        $actions.find('td.view-all:first').addClass('first');
-                        $actions.find('td.view-all:last').addClass('last');
-                        $actions.find('td.detail-actions').addClass('full-length');
-                    });
-                }
-            }
-        }
-
-        return $detailGroups;
-    };
-
-    /**
-     * Load field data for specific tab from data provider
-     *
-     * @param $tabContent {jQuery} tab div to load content into
-     * @param args {object} Detail view data
-     * @param options {object} Additional options
-     */
-    var loadTabContent = function($tabContent, args, options) {
-        if (!options) options = {};
-        $tabContent.html('');
-
-        var targetTabID = $tabContent.data('detail-view-tab-id');
-        var tabList = args.tabs;
-        var tabs = tabList[targetTabID];
-        var dataProvider = tabs.dataProvider;
-        var isMultiple = tabs.multiple || tabs.isMultiple;
-        var viewAllArgs = args.viewAll;
-        var $detailView = $tabContent.closest('.detail-view');
-        var jsonObj = $detailView.data('view-args').jsonObj;
-
-        if (tabs.custom) {
-            return tabs.custom({
-                context: args.context
-            }).appendTo($tabContent);
-        }
-
-        $detailView.find('.detail-group:hidden').html('');
-
-        if (tabs.listView) {
-            return $('<div>').listView({
-                context: args.context,
-                listView: tabs.listView
-            }).appendTo($tabContent);
-        }
-
-        $.extend(
-            $detailView.data('view-args'), {
-                activeTab: targetTabID
-            }
-        );
-
-        if (!$detailView.data('view-args').compact) {
-            $tabContent.append(
-                $('<div>').addClass('loading-overlay')
-            );
-        }
-
-        return dataProvider({
-            tab: targetTabID,
-            id: args.id,
-            jsonObj: jsonObj,
-            context: $.extend(args.context, options),
-            response: {
-                success: function(args) {
-                    if (options.newData) {
-                        $.extend(args.data, options.newData);
-                    }
-
-                    if (args._custom) {
-                        $detailView.data('_custom', args._custom);
-                    }
-                    var tabData = $tabContent.data('detail-view-tab-data');
-                    var data = args.data;
-
-                    var isFirstPanel = $tabContent.index($detailView.find('div.detail-group.ui-tabs-panel')) == 0;
-                    var actionFilter = args.actionFilter;
-
-                    $tabContent.find('.loading-overlay').remove();
-
-                    if (isMultiple) {
-                        $(data).each(function() {
-                            var item = this;
-
-                            var $fieldContent = makeFieldContent(
-                                $.extend(true, {}, tabs, {
-                                    id: targetTabID
-                                }),
-                                $tabContent.closest('div.detail-view'), this, {
-                                    header: 'name',
-                                    isFirstPanel: isFirstPanel,
-                                    actionFilter: actionFilter
-                                }
-                            ).appendTo($tabContent);
-
-                            if (tabData.viewAll) {
-                                $fieldContent.find('tr')
-                                    .filter('.' + tabData.viewAll.attachTo + '-row').find('td.value')
-                                    .append(
-                                        $('<div>').addClass('view-all').append(
-                                            $('<span>').html(
-                                                tabData.viewAll.label ?
-                                                _l(tabData.viewAll.label) :
-                                                _l('label.view.all')
-                                            ),
-                                            $('<div>').addClass('end')
-                                        ).click(function() {
-                                            viewAll(
-                                                tabData.viewAll.path, {
-                                                    updateContext: function(args) {
-                                                        var obj = {};
-
-                                                        obj[targetTabID] = [item];
-
-                                                        return obj;
-                                                    },
-                                                    title: tabData.viewAll.title
-                                                }
-                                            );
-                                        })
-                                );
-                            }
-
-                            // Add action bar
-                            if (tabData.multiple && tabData.actions) {
-                                var $actions = makeActionButtons(tabData.actions, {
-                                    actionFilter: actionFilter,
-                                    data: item,
-                                    context: $.extend(true, {}, $detailView.data('view-args').context, {
-                                        item: [item]
-                                    }),
-                                    ignoreAddAction: true
-                                });
-
-                                $fieldContent.find('th').append($actions);
-                            }
-                        });
-
-                        // Add item action
-                        if (tabData.multiple && tabData.actions && tabData.actions.add) {
-                            $tabContent.prepend(
-                                $('<div>').addClass('button add').append(
-                                    $('<span>').addClass('icon').html('&nbsp;'),
-                                    $('<span>').html(_l(tabData.actions.add.label))
-                                ).click(function() {
-                                    uiActions.standard(
-                                        $detailView, {
-                                            tabs: tabList,
-                                            activeTab: targetTabID,
-                                            actions: tabData.actions,
-                                            actionName: 'add'
-                                        }, {
-                                            noRefresh: true,
-                                            complete: function(args) {
-                                                if ($detailView.is(':visible')) {
-                                                    loadTabContent(
-                                                        $detailView.find('div.detail-group:visible'),
-                                                        $detailView.data('view-args')
-                                                    );
-                                                }
-                                            }
-                                        }
-                                    )
-                                })
-                            );
-                        }
-
-                        return true;
-                    }
-
-                    makeFieldContent(tabs, $tabContent.closest('div.detail-view'), data, {
-                        isFirstPanel: isFirstPanel,
-                        actionFilter: actionFilter
-                    }).appendTo($tabContent);
-
-                    if (tabs.tags &&
-                        $detailView.data('view-args') && !$detailView.data('view-args').compact) {
-                        $('<div>').tagger(
-                            $.extend(true, {}, tabs.tags, {
-                                context: $detailView.data('view-args').context,
-                                jsonObj: $detailView.data('view-args').jsonObj
-                            })
-                        ).appendTo($detailView.find('.main-groups'));
-                    }
-
-                    if ($detailView.data('view-args').onLoad) {
-                        $detailView.data('view-args').onLoad($detailView);
-                    }
-
-                    return true;
-                },
-                error: function() {
-                    alert('error!');
-                }
-            }
-        });
-    };
-
-    var makeTabs = function($detailView, tabs, options) {
-        if (!options) options = {};
-
-        var $tabs = $('<ul>');
-        var $tabContentGroup = $('<div>');
-        var removedTabs = [];
-        var tabFilter = options.tabFilter;
-        var context = options.context ? options.context : {};
-        var updateContext = $detailView.data('view-args').updateContext;
-        var compact = options.compact;
-
-        if (updateContext) {
-            $.extend($detailView.data('view-args').context, updateContext({
-                context: $detailView.data('view-args').context
-            }));
-        }
-
-        if (options.newData &&
-            ($detailView.data('view-args').section != null && context[$detailView.data('view-args').section] != null && context[$detailView.data('view-args').section].length > 0)) {
-            $.extend(
-                context[$detailView.data('view-args').section][0],
-                options.newData
-            );
-        }
-
-        if (tabFilter && !compact) {
-            removedTabs = tabFilter({
-                context: context
-            });
-        } else if (compact) {
-            removedTabs = $.grep(
-                $.map(
-                    tabs,
-                    function(value, key) {
-                        return key;
-                    }
-                ), function(tab, index) {
-                    return index > 0;
-                }
-            );
-        }
-
-        $.each(tabs, function(key, value) {
-            // Don't render tab, if filtered out
-            if ($.inArray(key, removedTabs) > -1) return true;
-
-            var propGroup = key;
-            var prop = value;
-            var title = prop.title;
-            var $tab = $('<li>').attr('detail-view-tab', true).appendTo($tabs);
-
-            var $tabLink = $('<a></a>').attr({
-                href: '#details-tab-' + propGroup
-            }).html(_l(title)).appendTo($tab);
-
-            var $tabContent = $('<div>').attr({
-                id: 'details-tab-' + propGroup
-            }).addClass('detail-group').appendTo($tabContentGroup);
-
-            $tabContent.data('detail-view-tab-id', key);
-            $tabContent.data('detail-view-tab-data', value);
-
-            return true;
-        });
-
-        $tabs.find('li:first').addClass('first');
-        $tabs.find('li:last').addClass('last');
-
-        return $.merge(
-            $tabs, $tabContentGroup.children()
-        );
-    };
-
-    var replaceTabs = function($detailView, tabs, options) {
-        var $detailViewElems = $detailView.find('ul.ui-tabs-nav, .detail-group');
-        $detailView.tabs('destroy');
-        $detailViewElems.remove();
-
-        makeTabs($detailView, tabs, options).appendTo($detailView);
-    };
-
-    var makeToolbar = function() {
-        return $('<div class="toolbar">')
-            .append(
-                $('<div>')
-                .addClass('button refresh')
-                .append(
-                    $('<span>').html(_l('label.refresh'))
-                )
-        );
-    };
-
-    $.fn.detailView = function(args, options) {
-        var $detailView = this;
-        var compact = args.compact;
-        var $toolbar = makeToolbar();
-        var $tabs;
-
-        if (options == 'refresh') {
-            $tabs = replaceTabs($detailView, args.tabs, {
-                context: args.context,
-                tabFilter: args.tabFilter
-            });
-        } else {
-            $detailView.addClass('detail-view');
-            $detailView.data('view-args', args);
-
-            if (args.$listViewRow) {
-                $detailView.data('list-view-row', args.$listViewRow);
-            }
-
-            $tabs = makeTabs($detailView, args.tabs, {
-                compact: compact,
-                context: args.context,
-                tabFilter: args.tabFilter
-            });
-
-            $tabs.appendTo($detailView);
-
-            // Create toolbar
-            if (!compact) {
-                $toolbar.appendTo($detailView);
-            }
-        }
-
-        $detailView.tabs(
-            $.extend(true, {}, tabEvents, {
-              select: function() {
-                // Cleanup old tab content
-                $detailView.find('.detail-group').children().remove();
-              }}
-            )
-        );
-
-        return $detailView;
-    };
-
-    var manageTabsContent = function(event, ui){
-        var $target = $(event.target);
-
-        if (!$target.hasClass('detail-view') || $target.hasClass('detail-view ui-state-active')) return true;
-
-        var $targetDetailGroup = undefined;
-        if(ui.panel){
-            $targetDetailGroup = $(ui.panel);
-        }else{
-            $targetDetailGroup = $(ui.newPanel);
-        }
-        if(!$targetDetailGroup){
-            throw 'Could not find a panel to load tab\'s data';
-        }
-        loadTabContent($targetDetailGroup, $target.data('view-args'));
-
-        return true;
-    };
-
-    // View all links
-    $(document).on('click', 'a', function(event) {
-        var $target = $(event.target);
-        var $viewAll = $target.closest('td.view-all a');
-        var viewAllArgs;
-
-        if ($target.closest('div.detail-view').length && $target.closest('td.view-all a').length) {
-            viewAllArgs = $viewAll.data('detail-view-link-view-all');
-            viewAll(
-                viewAllArgs.custom ?
-                viewAllArgs :
-                viewAllArgs.path, {
-                    updateContext: viewAllArgs.updateContext
-                }
-            );
-            return false;
-        }
-
-        return true;
-    });
-
-    // Setup view events
-    $(window).bind('cloudstack.view.details.remove', function(event, data) {
-        var $detailView = data.view;
-        $('#browser .container').cloudBrowser('selectPanel', {
-            panel: $detailView.closest('div.panel').prev()
-        });
-    });
-
-    // Setup action button events
-    $(document).bind('click', function(event) {
-        var $target = $(event.target);
-
-        // Refresh
-        if ($target.closest('div.toolbar div.refresh').length) {
-            loadTabContent(
-                $target.closest('div.detail-view').find('div.detail-group:visible'),
-                $target.closest('div.detail-view').data('view-args'),
-                { refresh: true }
-            );
-
-            return false;
-        }
-
-        // Detail action
-        if ($target.closest('div.detail-view [detail-action], div.detail-view .action.text').length &&
-            !$target.closest('.list-view').length) {
-            var $action = $target.closest('.action').find('[detail-action]');
-            var actionName = $action.attr('detail-action');
-            var actionCallback = $action.data('detail-view-action-callback');
-            var detailViewArgs = $.extend(true, {}, $action.closest('div.detail-view').data('view-args'));
-            var additionalArgs = {};
-            var actionSet = uiActions;
-            var $details = $action.closest('.details');
-
-            var uiCallback = actionSet[actionName];
-            if (!uiCallback)
-                uiCallback = actionSet['standard'];
-
-            detailViewArgs.actionName = actionName;
-
-            if ($details.data('item-context')) {
-                detailViewArgs.context = $details.data('item-context');
-            }
-
-            uiCallback($target.closest('div.detail-view'), detailViewArgs, additionalArgs);
-
-            return false;
-        }
-
-        return true;
-    });
-
-    // Detail view refresh handler
-    $(window).bind('cloudStack.detailsRefresh', function() {
-        var $detailView = $('.detail-view');
-
-        $detailView.each(function() {
-            var $detailView = $(this),
-                args = $detailView.data('view-args');
-
-            $detailView.detailView(args, 'refresh');
-        });
-    });
-
-}(window.jQuery, window.cloudStack, window._l));
diff --git a/ui/legacy/scripts/ui/widgets/listView.js b/ui/legacy/scripts/ui/widgets/listView.js
deleted file mode 100644
index 7449a61..0000000
--- a/ui/legacy/scripts/ui/widgets/listView.js
+++ /dev/null
@@ -1,2552 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-/**
- * Create dynamic list view based on data callbacks
- */
-(function($, cloudStack, _l, _s) {
-    var uiActions = {
-        standard: function($instanceRow, args, additional) {
-            var isAddAction = args.action.isAdd;
-
-            var listViewArgs = $instanceRow.closest('div.list-view').data('view-args');
-            var notification = args.action.notification ? args.action.notification : {};
-            var messages = args.action ? args.action.messages : {};
-            var preAction = args.action ? args.action.preAction : {};
-            var action = args.action ? args.action.action : {};
-            var multiSelect = args.action.isMultiSelectAction;
-            var needsRefresh = args.action.needsRefresh;
-            var section;
-            var data;
-            var messageArgs;
-            if (multiSelect) {
-                data = {
-                    id: $.map($instanceRow, function(elem) { return $(elem).data('list-view-item-id'); }),
-                    jsonObj: $.map($instanceRow, function(elem) { return $(elem).data('jsonObj'); })
-                };
-                messageArgs = {
-                    name: $.map($instanceRow, function(elem) { return $(elem).find('td.name span').html() })
-                };
-            } else {
-                data = {
-                    id: $instanceRow.data('list-view-item-id'),
-                    jsonObj: $instanceRow.data('jsonObj')
-                };
-                messageArgs = {
-                    name: $instanceRow.find('td.name span').html()
-                };
-            }
-            var $listView = $instanceRow.closest('.list-view');
-
-            if (args.data) $.extend(true, data, args.data);
-            if (listViewArgs) section = listViewArgs.section;
-
-            notification.desc = messages ?
-                messages.notification(messageArgs) : null;
-
-            if (listViewArgs)
-                notification.section = listViewArgs.id;
-
-            // Handle pre-action (occurs before any other behavior happens)
-            if (preAction) {
-                var preActionContext = $.extend(true, {}, listViewArgs.context);
-
-                preActionContext[
-                    listViewArgs.activeSection
-                ] = (multiSelect ? data.jsonObj : [data.jsonObj]);
-
-                if (!preAction({
-                    context: preActionContext
-                })) return false;
-            }
-
-            var performAction = function(data, options) {
-                if (!options) options = {};
-
-                var $form = options.$form;
-                var isHeader = options.isHeader;
-
-                $instanceRow = options.$item ? options.$item : $instanceRow;
-                var $item = options.$item;
-                var context = $.extend(true, {}, listViewArgs.context);
-                context[
-                    listViewArgs.activeSection
-                ] = (multiSelect ? $.map($instanceRow, function(elem) { return $(elem).data('jsonObj'); }) : [$instanceRow.data('jsonObj')]);
-
-                // Make sure the master checkbox is unselected
-                if (multiSelect) {
-                    var $listView2 = $instanceRow.closest('.list-view');
-                    $listView2.find('input.multiSelectMasterCheckbox').prop('checked', false);
-                    toggleMultiSelectActions($listView2, false);
-                }
-
-                var externalLinkAction = action.externalLink;
-                if (externalLinkAction) {
-                    // Show popup immediately, do not proceed through normal action process
-                    window.open(
-                        // URL
-                        externalLinkAction.url({
-                            context: context
-                        }),
-
-                        // Title
-                        externalLinkAction.title({
-                            context: context
-                        }),
-
-                        // Window options
-                        'menubar=0,resizable=0,' + 'width=' + externalLinkAction.width + ',' + 'height=' + externalLinkAction.height
-                    );
-                } else if (action.custom && !action.noAdd) {
-                    action.custom({
-                        data: data,
-                        ref: options.ref,
-                        context: context,
-                        $instanceRow: $instanceRow,
-                        complete: function(args) {
-                            args = args ? args : {};
-
-                            var $item = args.$item;
-
-                            notification.desc = messages.notification(args.messageArgs);
-                            notification._custom = args._custom;
-
-                            cloudStack.ui.notifications.add(
-                                notification,
-                                function(args) {
-                                    if (listViewArgs.onActionComplete) {
-                                        listViewArgs.onActionComplete();
-                                    }
-
-                                    if ($item.is(':visible') && !isHeader) {
-                                        replaceItem(
-                                            $item,
-                                            args.data,
-                                            args.actionFilter ?
-                                            args.actionFilter : $instanceRow.next().data('list-view-action-filter')
-                                        );
-                                    }
-                                },
-
-                                {},
-
-                                // Error
-
-                                function(args) {
-                                    if (args && args.updatedData) {
-                                        if ($item.is(':visible') && !isHeader) {
-                                            replaceItem(
-                                                $item,
-                                                args.updatedData,
-                                                args.actionFilter
-                                            );
-                                        }
-                                    } else {
-                                        $item.remove();
-                                    }
-                                }
-                            );
-                        }
-                    });
-                } else if (action.uiCustom) {
-                    action.uiCustom({
-                        $item: $instanceRow
-                    });
-                } else {
-                    if (needsRefresh) {
-                        var $loading = $('<div>').addClass('loading-overlay');
-                        if ($listView) {
-                            $listView.prepend($loading);
-                        } else {
-                            $instanceRow.closest('.list-view').prepend($loading)
-                        }
-                    }
-
-                    var actionArgs = {
-                        data: data,
-                        ref: options.ref,
-                        context: options.context,
-                        $form: $form,
-                        response: {
-                            success: function(args) {
-                                args = args ? args : {};
-
-                                var $prevRow, $newRow;
-
-                                // Make copy of previous row, in case data is needed
-                                $prevRow = $instanceRow.clone();
-                                if (multiSelect) {
-                                    $prevRow.find('.quick-view').addClass('loading-overlay');
-                                    $.each($prevRow, function(index, elem) {
-                                        $(elem).data($($instanceRow[index]).data());
-                                    });
-                                } else {
-                                    $prevRow.data($instanceRow.data());
-                                }
-
-                                // Set loading appearance
-                                if (args.data && (!isHeader || multiSelect)) {
-                                    if (multiSelect) {
-                                        $instanceRow = $.map($instanceRow, function(elem, index) {
-                                            return replaceItem(
-                                                $(elem),
-                                                $.extend($(elem).data('json-obj'), args.data[index]),
-                                                $(elem).data('list-view-action-filter')
-                                            )[0];
-                                        });
-                                    } else {
-                                        $instanceRow = replaceItem(
-                                            $instanceRow,
-                                            $.extend($instanceRow.data('json-obj'), args.data),
-                                            $instanceRow.data('list-view-action-filter')
-                                        );
-                                    }
-                                }
-
-                                if (multiSelect) {
-                                    $.each($instanceRow, function(index, elem) {
-                                        $(elem).find('td:last').children().remove();
-                                        $(elem).find('td:last').append($('<div>').addClass('loading'));
-                                        $(elem).addClass('loading');
-
-                                        if (options.$item) $(elem).data('list-view-new-item', true);
-
-                                        // Disable any clicking/actions for row
-                                        $(elem).bind('click', function() {
-                                            return false;
-                                        });
-                                    });
-                                } else {
-                                    $instanceRow.find('td:last').children().remove();
-                                    $instanceRow.find('td:last').append($('<div>').addClass('loading'));
-                                    $instanceRow.addClass('loading');
-
-                                    if (options.$item) $instanceRow.data('list-view-new-item', true);
-
-                                    // Disable any clicking/actions for row
-                                    $instanceRow.bind('click', function() {
-                                        return false;
-                                    });
-                                }
-
-                                if(args.notification) notification = args.notification;
-
-                                notification._custom = args._custom;
-
-                                if (additional && additional.success) additional.success(args);
-
-                                if (listViewArgs.onActionComplete == true) {
-                                    listViewArgs.onActionComplete();
-                                }
-
-                                cloudStack.ui.notifications.add(
-                                    notification,
-
-                                    // Success
-
-                                    function(args) {
-                                        if (!args) args = {};
-
-                                        var actionFilter = args.actionFilter ?
-                                            args.actionFilter : (multiSelect ?
-                                                $.map($instanceRow, function(elem) { $(elem).data('list-view-action-filter') }) :
-                                                $instanceRow.data('list-view-action-filter'));
-
-                                        if (!isHeader || multiSelect) {
-                                            var visible = (multiSelect ? $($instanceRow[0]).is(':visible') : $instanceRow.is(':visible'));
-                                            if (visible) {
-                                                if (args.data) {
-                                                    if (multiSelect) {
-                                                        $newRow = [];
-                                                        $.each($instanceRow, function(index, elem) {
-                                                            $newRow.push(
-                                                                replaceItem($(elem),
-                                                                    args.data, //$.extend($(elem).data('json-obj'), args.data[index]),
-                                                                    actionFilter)
-                                                            );
-                                                        });
-                                                    } else {
-                                                        $newRow = replaceItem($instanceRow,
-                                                            args.data,
-                                                            actionFilter);
-                                                    }
-                                                } else {
-                                                    // Nothing new, so just put in existing data
-                                                    if (multiSelect) {
-                                                        $instanceRow = $.map($instanceRow, function(elem) {
-                                                            replaceItem($(elem),
-                                                                $(elem).data('json-obj'),
-                                                                actionFilter)[0]
-                                                        });
-                                                    } else {
-                                                        $newRow = replaceItem($instanceRow,
-                                                            $instanceRow.data('json-obj'),
-                                                            actionFilter);
-                                                    }
-                                                }
-
-                                                if (needsRefresh) {
-                                                    if ($listView.closest('.detail-view').length) {
-                                                        $('.detail-view:last .button.refresh').click();
-                                                    } else {
-                                                        $loading.remove();
-                                                        $listView.listView('refresh');
-                                                    }
-                                                }
-                                            }
-
-                                            if (additional && additional.complete)
-                                                additional.complete(args, $newRow);
-                                        }
-
-                                        if (messages.complete) {
-                                            cloudStack.dialog.notice({
-                                                message: messages.complete(args.data)
-                                            });
-                                        }
-
-                                        if (options.complete) {
-                                            options.complete(args);
-                                        }
-
-                                        if (listViewArgs.onActionComplete) {
-                                            listViewArgs.onActionComplete();
-                                        }
-                                    },
-
-                                    {},
-
-                                    // Error
-
-                                    function(errorArgs) {
-                                        if (!isHeader) {
-                                            if (isAddAction == true && $instanceRow.data('list-view-new-item')) {
-                                                // For create forms
-                                                $instanceRow.remove();
-                                            } else {
-                                                // For standard actions
-                                                if(!args.notification) {
-                                                    if (multiSelect) {
-                                                        $.each($instanceRow, function(index, elem) {
-                                                            replaceItem(
-                                                                $(elem),
-                                                                $.extend($(elem).data('json-obj'), errorArgs.data),
-                                                                errorArgs.actionFilter ?
-                                                                errorArgs.actionFilter :
-                                                                $(elem).data('list-view-action-filter')
-                                                            );
-                                                        });
-                                                    } else {
-                                                        replaceItem(
-                                                            $instanceRow,
-                                                            $.extend($instanceRow.data('json-obj'), errorArgs.data),
-                                                            errorArgs.actionFilter ?
-                                                            errorArgs.actionFilter :
-                                                            $instanceRow.data('list-view-action-filter')
-                                                        );
-                                                    }
-                                                }
-                                            }
-                                        }
-
-                                        if (options.error) {
-                                            options.error(errorArgs);
-                                        }
-                                    }
-                                );
-                            },
-                            error: function(message) {
-                                $instanceRow.removeClass('loading');
-                                $instanceRow.find('td.quick-view').removeClass('loading-overlay');
-
-                                if (!isHeader) {
-                                    if (($.isPlainObject(args.action.createForm) && args.action.addRow != 'false') ||
-                                        (!args.action.createForm && args.action.addRow == 'true')) {
-                                        $instanceRow.remove();
-                                    }
-                                }
-
-                                if (needsRefresh) {
-                                    if (!$listView.closest('.detail-view').length) {
-                                        $loading.remove();
-                                    }
-                                }
-
-                                if (options.error) options.error(message);
-
-                                if (message) cloudStack.dialog.notice({
-                                    message: message
-                                });
-                            }
-                        }
-                    };
-
-                    if (action.custom && action.noAdd) {
-                        action.custom({
-                            data: data,
-                            ref: options.ref,
-                            context: context,
-                            $instanceRow: $instanceRow,
-                            complete: actionArgs.response.success
-                        });
-                    } else {
-                        action(actionArgs);
-                    }
-                }
-            };
-
-            var context = $.extend({}, listViewArgs.context);
-
-            context[
-                listViewArgs.activeSection
-            ] = (multiSelect ? $.map($instanceRow, function(elem) { return $(elem).data('jsonObj'); }) : [$instanceRow.data('jsonObj')]);
-
-            messageArgs.context = context;
-
-            if (!args.action.action.externalLink && !args.action.createForm &&
-                args.action.addRow != 'true' && !action.custom && !action.uiCustom && !args.action.listView) {
-                cloudStack.dialog.confirm({
-                    message: messages.confirm(messageArgs),
-                    action: function() {
-                        performAction(data, {
-                            context: context,
-                            isMultiSelectAction: multiSelect,
-                            isHeader: args.action.isHeader
-                        });
-                    }
-                });
-            } else if (action.custom || action.uiCustom) {
-                performAction();
-            } else if (args.action.listView) {
-                cloudStack.dialog.listView({
-                    context: context,
-                    listView: args.action.listView,
-                    after: function(args) {
-                        performAction(null, {
-                            context: args.context
-                        });
-                    }
-                });
-            } else {
-                var addRow = args.action.addRow == "false" ? false : true;
-                var isHeader = args.action.isHeader;
-                var createFormContext = $.extend({}, context);
-
-                var externalLinkAction = action.externalLink;
-                if (externalLinkAction) {
-                    // Show popup immediately, do not proceed through normal action process
-                    window.open(
-                        // URL
-                        externalLinkAction.url({
-                            context: context
-                        }),
-
-                        // Title
-                        externalLinkAction.title({
-                            context: context
-                        }),
-
-                        // Window options
-                        'menubar=0,resizable=0,' + 'width=' + externalLinkAction.width + ',' + 'height=' + externalLinkAction.height
-                    );
-                } else if (args.action.createForm) {
-                    cloudStack.dialog.createForm({
-                        form: args.action.createForm,
-                        after: function(args) {
-                            var $newItem;
-
-                            if (!isHeader) {
-                                if (addRow != false) {
-                                    $newItem = $listView.listView('prependItem', {
-                                        data: [
-                                            $.extend(args.data, {
-                                                state: 'Creating',
-                                                status: 'state.Creating',
-                                                allocationstate: 'Creating'
-                                            })
-                                        ]
-                                    });
-                                } else {
-                                    $newItem = $instanceRow;
-                                }
-
-                                performAction(args.data, {
-                                    ref: args.ref,
-                                    context: createFormContext,
-                                    $item: $newItem,
-                                    $form: args.$form
-                                });
-                            } else {
-                                var $loading = $('<div>').addClass('loading-overlay');
-
-                                $loading.appendTo($listView);
-                                performAction(args.data, {
-                                    ref: args.ref,
-                                    context: createFormContext,
-                                    $form: args.$form,
-                                    isHeader: isHeader,
-                                    complete: function(args) {
-                                        $loading.remove();
-                                        $listView.listView('refresh');
-                                    },
-                                    error: function(args) {
-                                        $loading.remove();
-                                    }
-                                });
-                            }
-                        },
-                        ref: listViewArgs.ref,
-                        context: createFormContext
-                    });
-                } else {
-                    cloudStack.dialog.confirm({
-                        message: messages.confirm(messageArgs),
-                        action: function() {
-                            var $newItem;
-                            if (addRow && !action.isHeader) {
-                                $newItem = $listView.listView('prependItem', {
-                                    data: [
-                                        $.extend(args.data, {
-                                            state: 'Creating',
-                                            status: 'state.Creating',
-                                            allocationstate: 'Creating'
-                                        })
-                                    ]
-                                });
-                            } else if (action.isHeader) {
-                                $newItem = $('<div>');
-                            } else {
-                                $newItem = $instanceRow;
-                            }
-
-                            performAction(args.data, {
-                                ref: args.ref,
-                                context: createFormContext,
-                                $item: $newItem,
-                                $form: args.$form
-                            });
-                        }
-                    });
-                }
-            }
-        },
-
-        remove: function($instanceRow, args) {
-            uiActions.standard($instanceRow, args, {
-                complete: function(args, $newRow) {
-                    $newRow.remove();
-                }
-            });
-        },
-
-        edit: function($instanceRow, args) {
-            var $td = $instanceRow.find('td.editable');
-            var $edit = $td.find('div.edit');
-            var $editInput = $edit.find('input');
-            var $label = $td.find('span');
-            var $listView = $instanceRow.closest('.list-view');
-            var listViewArgs = $listView.data('view-args');
-
-            // Hide label, show edit field
-            var showEditField = function() {
-                $edit.css({
-                    opacity: 1
-                });
-                $label.fadeOut('fast', function() {
-                    $edit.fadeIn();
-                    $editInput.focus();
-                    $instanceRow.closest('div.data-table').dataTable('refresh');
-                });
-            };
-
-            // Hide edit field, validate and save changes
-            var showLabel = function(val, options) {
-                if (!options) options = {};
-
-                var oldVal = $label.html();
-
-                if (val != null)
-                    $label.html(_s(val));
-
-                var data = {
-                    id: $instanceRow.data('list-view-item-id'),
-                    jsonObj: $instanceRow.data('jsonObj')
-                };
-
-                data[$td.data('list-view-item-field')] = $editInput.val();
-
-                var context = $.extend({}, listViewArgs.context);
-                context[
-                    listViewArgs.activeSection
-                ] = $instanceRow.data('jsonObj');
-
-                args.callback({
-                    data: data,
-                    context: context,
-                    response: {
-                        success: function(args) {
-                            $edit.hide();
-                            $label.fadeIn();
-                            $instanceRow.closest('div.data-table').dataTable('refresh');
-
-                            if (options.success) options.success(args);
-                        },
-                        error: function(message) {
-                            if (message) {
-                                cloudStack.dialog.notice({
-                                    message: message
-                                });
-                                $edit.hide(),
-                                $label.html(_s(oldVal)).fadeIn();
-                                $instanceRow.closest('div.data-table').dataTable('refresh');
-
-                                if (options.error) options.error(args);
-                            }
-                        }
-                    }
-                });
-            };
-
-            if (args.cancel) { //click Cancel button
-                // showLabel();
-                var oldVal = $label.html();
-                $edit.hide();
-                $label.fadeIn();
-                $instanceRow.closest('div.data-table').dataTable('refresh');
-                $editInput.val(_s(oldVal));
-                return false;
-            }
-
-            if (!$editInput.is(':visible') || !(typeof(args.action) == 'undefined')) { //click Edit button
-                showEditField();
-            } else if ($editInput.val() != $label.html()) { //click Save button with changed value
-                if ($editInput.val().match(/<|>/)) {
-                    cloudStack.dialog.notice({ message: 'message.validate.invalid.characters' });
-                    return false;
-                }
-
-                $edit.animate({
-                    opacity: 0.5
-                });
-
-                var originalName = $label.html();
-                var newName = $editInput.val();
-                showLabel(newName, {
-                    success: function() {
-                        cloudStack.ui.notifications.add({
-                                section: $instanceRow.closest('div.view').data('view-args').id,
-                                desc: newName ? _l('Set value of') + ' ' + $instanceRow.find('td.name span').html() + ' ' + _l('to') + ' ' + _s(newName) : _l('Unset value for') + ' ' + $instanceRow.find('td.name span').html()
-                            },
-                            function(args) {}, [{
-                                name: newName
-                            }]
-                        );
-                    }
-                });
-            } else { //click Save button with unchanged value
-                showLabel();
-            }
-
-            return $instanceRow;
-        }
-    };
-
-    var rowActions = {
-        _std: function($tr, action) {
-            action();
-
-            $tr.closest('.data-table').dataTable('refresh');
-
-            setTimeout(function() {
-                $tr.closest('.data-table').dataTable('selectRow', $tr.index());
-            }, 0);
-        },
-
-        moveTop: function($tr) {
-            rowActions._std($tr, function() {
-                $tr.closest('tbody').prepend($tr);
-                $tr.closest('.list-view').animate({
-                    scrollTop: 0
-                });
-            });
-        },
-
-        moveBottom: function($tr) {
-            rowActions._std($tr, function() {
-                $tr.closest('tbody').append($tr);
-                $tr.closest('.list-view').animate({
-                    scrollTop: 0
-                });
-            });
-        },
-
-        moveUp: function($tr) {
-            rowActions._std($tr, function() {
-                $tr.prev().before($tr);
-            });
-        },
-
-        moveDown: function($tr) {
-            rowActions._std($tr, function() {
-                $tr.next().after($tr);
-            });
-        },
-
-        moveTo: function($tr, index, after) {
-            rowActions._std($tr, function() {
-                var $target = $tr.closest('tbody').find('tr').filter(function() {
-                    return $(this).index() == index;
-                });
-
-                //    if ($target.index() > $tr.index()) $target.after($tr);
-                //  else $target.before($tr);
-
-                $tr.closest('.list-view').scrollTop($tr.position().top - $tr.height() * 2);
-
-                if (after)
-                    setTimeout(function() {
-                        after();
-                    });
-            });
-        }
-    };
-
-    /**
-     * Edit field text
-     *
-     * @param $td {jQuery} <td> to put input field into
-     */
-    var createEditField = function($td) {
-        $td.addClass('editable');
-
-        // Put <td> label into a span
-        var sanitizedValue = $td.html();
-        $('<span></span>').html(sanitizedValue).appendTo($td.html(''));
-
-        var $editArea = $('<div></div>').addClass('edit');
-        var $editField = $('<input />').addClass('edit').attr({
-            type: 'text',
-            value: cloudStack.sanitizeReverse(sanitizedValue)
-        });
-        var $actionButton = $('<div></div>').addClass('action');
-        var $saveButton = $actionButton.clone().addClass('save').attr({
-            'title': _l('Save')
-        });
-        var $cancelButton = $actionButton.clone().addClass('cancel').attr({
-            'title': _l('Cancel edit')
-        });
-
-        $([$editField, $saveButton, $cancelButton]).each(function() {
-            this.appendTo($editArea);
-        });
-
-        return $editArea.hide();
-    };
-
-    var renderActionCol = function(actions) {
-        return $.grep(
-            $.map(actions, function(value, key) {
-                return key;
-            }),
-            function(elem) {
-                return elem != 'add';
-            }
-        ).length;
-    };
-
-    var createHeader = function(preFilter, fields, $table, actions, options) {
-        if (!options) options = {};
-
-        var $tr = $('<tr>');
-        var $thead = $('<thead>').prependTo($table).append($tr);
-        var reorder = options.reorder;
-        var detailView = options.detailView;
-        var multiSelect = options.multiSelect;
-        var groupableColumns = options.groupableColumns;
-        var viewArgs = $table.closest('.list-view').data('view-args');
-        var uiCustom = viewArgs.uiCustom;
-        var hiddenFields = [];
-
-        if (preFilter != null)
-            hiddenFields = preFilter();
-
-        var addColumnToTr = function($tr, key, colspan, label, needsCollapsibleColumn) {
-            var trText = _l(label);
-            var $th = $('<th>').addClass(key).attr('colspan', colspan).attr('title', trText).appendTo($tr);
-            if ($th.index()) $th.addClass('reduced-hide');
-            $th.css({'border-right': '1px solid #C6C3C3', 'border-left': '1px solid #C6C3C3'});
-            if (needsCollapsibleColumn) {
-                var karetLeft = $('<span>').css({'margin-right': '10px'});
-                karetLeft.attr('title', trText);
-                karetLeft.appendTo($th);
-                $('<span>').html('&laquo').css({'font-size': '15px', 'float': 'right'}).appendTo(karetLeft);
-                $('<span>').html(trText).appendTo(karetLeft);
-
-                $th.click(function(event) {
-                    event.stopPropagation();
-                    var $th = $(this);
-                    var startIndex = 0;
-                    $th.prevAll('th').each(function() {
-                        startIndex += parseInt($(this).attr('colspan'));
-                    });
-                    var endIndex = startIndex + parseInt($th.attr('colspan'));
-                    // Hide Column group
-                    $th.hide();
-                    $th.closest('table').find('tbody td').filter(function() {
-                        return $(this).index() >= startIndex && $(this).index() < endIndex;
-                    }).hide();
-                    $th.closest('table').find('thead tr:last th').filter(function() {
-                        return $(this).index() >= startIndex && $(this).index() < endIndex;
-                    }).hide();
-                    // Show collapsible column with blank cells
-                    $th.next('th').show();
-                    $th.closest('table').find('tbody td').filter(function() {
-                        return $(this).index() == endIndex;
-                    }).show();
-                    $th.closest('table').find('thead tr:last th').filter(function() {
-                        return $(this).index() == endIndex;
-                    }).show();
-                    // Refresh list view
-                    $tr.closest('.list-view').find('.no-split').dataTable('refresh');
-                });
-
-                var karetRight = addColumnToTr($tr, 'collapsible-column', 1, '');
-                $('<span>').html(trText.substring(0,3)).appendTo(karetRight);
-                $('<span>').css({'font-size': '15px'}).html(' &raquo').appendTo(karetRight);
-                karetRight.attr('title', trText);
-                karetRight.css({'border-right': '1px solid #C6C3C3', 'border-left': '1px solid #C6C3C3', 'min-width': '10px', 'width': '10px', 'max-width': '45px', 'padding': '2px'});
-                karetRight.hide();
-                karetRight.click(function(event) {
-                    event.stopPropagation();
-                    var prevTh = $(this).prev('th');
-                    var startIndex = 0;
-                    prevTh.prevAll('th').each(function() {
-                        startIndex += parseInt($(this).attr('colspan'));
-                    });
-                    var endIndex = startIndex + parseInt(prevTh.attr('colspan'));
-
-                    prevTh.show();
-                    prevTh.closest('table').find('tbody td').filter(function() {
-                        return $(this).index() >= startIndex && $(this).index() < endIndex;
-                    }).show();
-                    prevTh.closest('table').find('thead tr:last th').filter(function() {
-                        return $(this).index() >= startIndex && $(this).index() < endIndex;
-                    }).show();
-
-                    prevTh.next('th').hide();
-                    prevTh.closest('table').find('tbody td').filter(function() {
-                        return $(this).index() == endIndex;
-                    }).hide();
-                    prevTh.closest('table').find('thead tr:last th').filter(function() {
-                        return $(this).index() == endIndex;
-                    }).hide();
-
-                    $tr.closest('.list-view').find('.no-split').dataTable('refresh');
-                });
-            } else {
-                $th.html(trText);
-            }
-            return $th;
-        };
-
-        if (groupableColumns) {
-            $tr.addClass('groupable-header-columns').addClass('groupable-header');
-            $.each(fields, function(key) {
-                if ($.inArray(key, hiddenFields) != -1) {
-                    return true;
-                }
-
-                var field = this;
-                if (field.columns) {
-                    var colspan = Object.keys(field.columns).length;
-                    addColumnToTr($tr, key, colspan, field.label, true);
-                } else {
-                    var label = '';
-                    if (key == 'name') {
-                        label = 'label.resources';
-                    }
-                    addColumnToTr($tr, key, 1, label);
-                }
-                return true;
-            });
-            if (detailView && !$.isFunction(detailView) && !detailView.noCompact && !uiCustom) {
-                addColumnToTr($tr, 'quick-view', 1, '');
-            }
-            $tr = $('<tr>').appendTo($thead);
-            $tr.addClass('groupable-header');
-        }
-
-        if (multiSelect) {
-            var $th = $('<th>').addClass('multiselect').appendTo($tr);
-            var $multiSelectMaster = $('<input>')
-                .attr('type', 'checkbox')
-                .addClass('multiSelectMasterCheckbox');
-            $multiSelectMaster.appendTo($th);
-
-            $multiSelectMaster.click(function() {
-                var isMasterChecked = $(this).prop('checked');
-                $('.multiSelectCheckbox').prop('checked', isMasterChecked);
-                toggleMultiSelectActions($table.closest('.list-view'), isMasterChecked);
-            });
-        }
-
-        $.each(fields, function(key) {
-            if ($.inArray(key, hiddenFields) != -1)
-                return true;
-            var field = this;
-            if (field.columns) {
-                $.each(field.columns, function(idx) {
-                    var subfield = this;
-                    addColumnToTr($tr, key, 1, subfield.label);
-                    return true;
-                });
-                var blankCell = addColumnToTr($tr, 'collapsible-column', 1, '');
-                blankCell.css({'min-width': '10px', 'width': '10px'});
-                blankCell.hide();
-            } else {
-                addColumnToTr($tr, key, 1, field.label);
-            }
-            return true;
-        });
-
-        // Re-order row buttons
-        if (reorder) {
-            $tr.append(
-                $('<th>').html(_l('label.order')).addClass('reorder-actions reduced-hide')
-            );
-        }
-
-        // Actions column
-        var actionsArray = actions ? $.map(actions, function(v, k) {
-            if (k == 'add' || k == 'rootAdminAddGuestNetwork') {
-                v.isAdd = true;
-            }
-
-            return v;
-        }) : [];
-        var headerActionsArray = $.grep(
-            actionsArray,
-            function(action) {
-                return action.isHeader || action.isAdd;
-            }
-        );
-
-        if (actions && !options.noActionCol && renderActionCol(actions) && actionsArray.length != headerActionsArray.length) {
-            $tr.append(
-                $('<th></th>')
-                .html(_l('label.actions'))
-                .addClass('actions reduced-hide')
-            );
-        }
-
-        // Quick view
-        if (detailView && !$.isFunction(detailView) && !detailView.noCompact && !uiCustom) {
-            $tr.append(
-                $('<th></th>')
-                .html(_l('label.quickview'))
-                .addClass('quick-view reduced-hide')
-            );
-        }
-
-        return $thead;
-    };
-
-    var createFilters = function($toolbar, filters) {
-        if (!filters) return false;
-
-        var $filters = $('<div></div>').addClass('filters reduced-hide');
-        $filters.append($('<label>').html(_l('label.filterBy')));
-
-        var $filterSelect = $('<select id="filterBy"></select>').appendTo($filters);
-
-        if (filters)
-            $.each(filters, function(key) {
-                if (this.preFilter != null && this.preFilter() == false) {
-                    return true; //skip to next item in each loop
-                }
-                var $option = $('<option>').attr({
-                    value: key
-                }).html(_l(this.label));
-
-                $option.appendTo($filterSelect);
-
-                return true;
-            });
-
-        return $filters.appendTo($toolbar);
-    };
-
-    var createSearchBar = function($toolbar, listViewData) {
-        var $search = $('<div></div>').addClass('text-search reduced-hide');
-        var $searchBar = $('<div></div>').addClass('search-bar reduced hide').appendTo($search);
-        $searchBar.append('<input type="text" />');
-        $search.append('<div id="basic_search" class="button search"></div>');
-
-        if (listViewData.advSearchFields != null) {
-            $search.append(
-                $('<div>').attr({
-                    id: 'advanced_search'
-                })
-                .addClass('button search advanced-search')
-                .append($('<div>').addClass('icon'))
-            );
-        }
-
-        return $search.appendTo($toolbar);
-    };
-
-    /**
-     * Makes set of icons from data, in the for of a table cell
-     */
-    var makeActionIcons = function($td, actions, options) {
-        options = options ? options : {};
-        var allowedActions = options.allowedActions;
-        var $tr = $td.closest('tr');
-        var data = $tr && $tr.data('json-obj') ? $tr.data('json-obj') : null;
-
-        $.each(actions, function(actionName, action) {
-            if (actionName == 'add' || action.isHeader)
-                return true;
-
-            if (action.type == 'radio') {
-                $td.closest('.list-view').addClass('list-view-select');
-                $td.append(
-                    $('<div></div>')
-                    .addClass('action')
-                    .addClass(actionName)
-                    .append(
-                        $('<input>').attr({
-                            type: 'radio',
-                            name: actionName
-                        })
-                    )
-                    .attr({
-                        alt: _l(action.label),
-                        title: _l(action.label)
-                    })
-                    .data('list-view-action-id', actionName)
-                );
-
-                return true;
-            } else if (action.type == 'checkbox') {
-                $td.closest('.list-view').addClass('list-view-select');
-                $td.append(
-                    $('<div></div>')
-                    .addClass('action')
-                    .addClass(actionName)
-                    .append(
-                        $('<input>').attr({
-                            type: 'checkbox',
-                            name: actionName,
-                            checked: data && data._isSelected ? 'checked' : false
-                        })
-                    )
-                    .attr({
-                        alt: _l(action.label),
-                        title: _l(action.label)
-                    })
-                    .data('list-view-action-id', actionName)
-                );
-
-                if ($td.find('input[type=checkbox]').is(':checked')) {
-                    $tr.addClass('multi-edit-selected');
-                }
-
-                return true;
-            }
-
-            var $action = $('<div></div>')
-                .addClass('action')
-                .addClass(actionName)
-                .append($('<span>').addClass('icon').html('&nbsp;'))
-                .attr({
-                    alt: _l(action.label),
-                    title: _l(action.label)
-                })
-                .data('list-view-action-id', actionName);
-
-            if (action.textLabel) {
-                $action
-                    .addClass('text')
-                    .prepend(
-                        $('<span>').addClass('label').html(_l(action.textLabel))
-                );
-            }
-
-            // Disabled appearance/behavior for filtered actions
-            if (allowedActions && $.inArray(actionName, allowedActions) == -1) {
-                $action.addClass('disabled');
-            }
-
-            $td.append($action);
-
-            return true;
-        });
-    };
-
-    /**
-     * Initialize detail view for specific ID from list view
-     */
-    var createDetailView = function(args, complete, $row, options) {
-        var $panel = args.$panel;
-        var title = args.title;
-        var id = args.id;
-        var data = $.extend(true, {}, args.data, {
-            $browser: $('#browser .container'),
-            id: id,
-            jsonObj: args.jsonObj,
-            section: args.section,
-            context: args.context,
-            $listViewRow: $row,
-            compact: options ? options.compact : false
-        });
-
-        var noPanel = options ? options.noPanel : false;
-        var $detailView, $detailsPanel;
-        var panelArgs = {
-            title: title,
-            parent: $panel,
-            maximizeIfSelected: data.isMaximized,
-            complete: function($newPanel) {
-                // Make detail view element
-                if (!args.pageGenerator && !data.isMaximized)
-                    $detailView = $('<div>').addClass('detail-view').detailView(data).appendTo($newPanel);
-                else if (!args.pageGenerator && data.isMaximized)
-                    $detailView = $newPanel.detailView(data);
-                else
-                    $detailView = args.pageGenerator(data).appendTo($newPanel);
-
-                if (complete){
-                    complete($detailView);
-                }
-                return $detailView;
-            }
-        };
-
-        if (noPanel) {
-            return $('<div>').detailView(data);
-        } else {
-            $detailsPanel = data.$browser.cloudBrowser('addPanel', panelArgs);
-        }
-    };
-
-    var addTableRows = function(preFilter, fields, data, $tbody, actions, options) {
-        if (!options) options = {};
-        var rows = [];
-        var reorder = options.reorder;
-        var detailView = options.detailView;
-        var multiSelect = options.multiSelect;
-        var $listView = $tbody.closest('.list-view');
-        var listViewArgs = $listView.data('view-args');
-        var uiCustom = listViewArgs.uiCustom;
-        var subselect = uiCustom ? listViewArgs.listView.subselect : null;
-        var hasCollapsibleColumn = false;
-
-        if (!(data && data.length)) {
-            $listView.data('end-of-table', true);
-            if (!$tbody.find('tr').length) {
-                return [
-                    $('<tr>').addClass('empty last').append(
-                        $('<td>').html(_l('label.no.data'))
-                    ).appendTo($tbody)
-                ];
-            }
-        }
-
-        $tbody.find('tr.empty').remove();
-
-        $(data).each(function() {
-            var dataItem = this;
-            var id = dataItem.id;
-            var $quickView;
-
-            var $tr = $('<tr>');
-            rows.push($tr);
-
-            if (options.prepend) {
-                $tr.prependTo($tbody);
-            } else {
-                $tr.appendTo($tbody);
-            }
-
-            var hiddenFields = [];
-            if (preFilter != null)
-                hiddenFields = preFilter();
-
-            if (multiSelect) {
-                var $td = $('<td>')
-                        .addClass('multiselect')
-                        .appendTo($tr);
-                var content = $('<input>')
-                    .attr('type', 'checkbox')
-                    .addClass('multiSelectCheckbox')
-                    .click(function() {
-                        var checked = $(this).is(':checked');
-                        var $tbody = $(this).closest('tbody');
-                        var numRows = $tbody.find('input.multiSelectCheckbox').length;
-                        var numRowsChecked = $tbody.find('input.multiSelectCheckbox:checked').length;
-                        var enabled = checked || (numRowsChecked > 0);
-
-                        toggleMultiSelectActions($(this).closest('.list-view'), enabled);
-
-                        $(this).closest('.list-view').find('input.multiSelectMasterCheckbox').prop('checked', (numRows === numRowsChecked));
-                    });
-
-                $td.append(
-                    $('<span></span>').html(content)
-                );
-            }
-
-            var reducedFields = {};
-            var idx = 0;
-            $.each(fields, function(key) {
-                if ($.inArray(key, hiddenFields) != -1)
-                    return true;
-                var field = this;
-                if (field.columns) {
-                    $.each(field.columns, function(innerKey) {
-                        reducedFields[innerKey] = this;
-                    });
-                    reducedFields['blank-cell-' + idx] = {blankCell: true};
-                    idx += 1;
-                    hasCollapsibleColumn = true;
-                } else {
-                    reducedFields[key] = this;
-                }
-                return true;
-            });
-
-            // Add field data
-            $.each(reducedFields, function(key) {
-                if ($.inArray(key, hiddenFields) != -1)
-                    return true;
-                var field = this;
-                var $td = $('<td>')
-                    .addClass(key)
-                    .data('list-view-item-field', key)
-                    .appendTo($tr);
-                var content = dataItem[key];
-
-                if (field.truncate) {
-                    $td.addClass('truncated');
-                }
-
-                if (field.blankCell) {
-                    $td.css({'min-width': '10px', 'width': '10px'});
-                    $td.hide();
-                }
-
-                if (field.indicator) {
-                    $td.addClass('state').addClass(field.indicator[content]);
-
-                    // Disabling indicator for now per new design
-                    //$tr.find('td:first').addClass('item-state-' + field.indicator[content]);
-                }
-
-                if (field.thresholdcolor && field.thresholds) {
-                    if ((field.thresholds.disable in dataItem) && (field.thresholds.notification in dataItem)) {
-                        var disableThreshold = dataItem[field.thresholds.disable];
-                        var notificationThreshold = dataItem[field.thresholds.notification];
-                        if (disableThreshold) {
-                            $td.addClass('alert-disable-threshold');
-                        } else if (notificationThreshold) {
-                            $td.addClass('alert-notification-threshold');
-                        }
-                    }
-                }
-
-
-                if (field.limitcolor && field.limits) {
-                    if ((field.limits.lowerlimit in dataItem) && (field.limits.upperlimit in dataItem)) {
-                        var upperlimit = parseFloat(dataItem[field.limits.upperlimit]);
-                        var lowerlimit = parseFloat(dataItem[field.limits.lowerlimit ]);
-                        var value = parseFloat(content);
-                        if (value <= lowerlimit) {
-                            $td.addClass('alert-disable-threshold');
-                        } else if (value <= upperlimit) {
-                            $td.addClass('alert-notification-threshold');
-                        }
-                    }
-                }
-
-                if (field.id == true) id = field.id;
-                if ($td.index()) $td.addClass('reduced-hide');
-                if (field.action) {
-                    $td.data('list-view-action', key);
-                }
-                if (field.converter) {
-                    content = _l(field.converter(content, dataItem));
-                }
-                if (field.editable) {
-                    $td.html(_s(content));
-                    createEditField($td).appendTo($td);
-                } else {
-                    $td.html('');
-
-                    if ($.isArray(content)) {
-                        var $ul = $('<ul>');
-
-                        $(content).map(function (index, contentItem) {
-                            var $li = $('<li>');
-
-                            $li.append('<span>').text(contentItem.toString());
-                            $li.appendTo($ul);
-                        });
-
-                        $ul.appendTo($td);
-                    } else if (field.span == false) {
-                        $td.append(
-                            $('<pre>').html(_s(content))
-                        );
-                    } else {
-                        var span = $('<span>').html(_s(content));
-                        if (field.compact) {
-                            span.addClass('compact');
-                            span.html('');
-                        }
-                        $td.append(span);
-                    }
-                }
-
-                $td.attr('title', _s(content));
-            });
-
-            var $first = $tr.find('td:first');
-            if (multiSelect)
-                $first = $first.next();
-            $first.addClass('first');
-
-            // Add reorder actions
-            if (reorder) {
-                var sort = function($tr, action) {
-                    var $listView = $tr.closest('.list-view');
-                    var viewArgs = $listView.data('view-args');
-                    var context = $.extend(
-                        true, {},
-                        $tr.closest('.list-view').data('view-args').context
-                    );
-                    var sortKey;
-                    if (g_sortKeyIsAscending) {
-                        sortKey = $tr.index() + 1;
-                    } else {
-                        sortKey = ($tr.closest('tbody').find('tr').length - ($tr.index()));
-                    }
-
-                    context[viewArgs.activeSection] = $tr.data('json-obj');
-
-                    action.action({
-                        context: context,
-                        sortKey: sortKey,
-                        response: {
-                            success: function(args) {},
-                            error: function(args) {
-                                // Move back to previous position
-                                rowActions.moveTo($tr, rowIndex);
-                            }
-                        }
-                    });
-                };
-
-                $('<td>').addClass('actions reorder').appendTo($tr).append(function() {
-                    var $td = $(this);
-
-                    $.each(reorder, function(actionName, action) {
-                        var fnLabel = {
-                            moveTop: _l('label.move.to.top'),
-                            moveBottom: _l('label.move.to.bottom'),
-                            moveUp: _l('label.move.up.row'),
-                            moveDown: _l('label.move.down.row'),
-                            moveDrag: _l('label.drag.new.position')
-                        };
-
-                        $('<div>')
-                            .addClass('action reorder')
-                            .addClass(actionName)
-                            .append(
-                                $('<span>').addClass('icon').html('&nbsp;')
-                        )
-                            .attr({
-                                title: _l(fnLabel[actionName])
-                            })
-                            .appendTo($td)
-                            .click(function() {
-                                if (actionName == 'moveDrag') return false;
-
-                                rowActions[actionName]($tr);
-                                var map1 = {};
-                                $tr.closest('tbody').find('tr').each(function() {
-                                    /*
-                                     * fire only one sorting API call(updateXXXXXXX&sortKey=n&id=UUID) for items who have the same UUID.
-                                     * e.g. An Template/ISO of multiple zones have the same UUID.
-                                     */
-                                    var objId = $(this).data('json-obj').id;
-                                    if(!(objId in map1)) {
-                                    sort($(this), action);
-                                        map1[objId] = 1;
-                                    }
-                                });
-                                $tr.closest('.data-table').dataTable('selectRow', $tr.index());
-
-                                return false;
-                            });
-                    });
-                });
-
-                // Draggable action
-                var initDraggable = function($tr) {
-                    var originalIndex;
-
-                    return $tr.closest('tbody').sortable({
-                        handle: '.action.moveDrag',
-                        start: function(event, ui) {
-                            originalIndex = ui.item.index();
-                        },
-                        stop: function(event, ui) {
-                            rowActions._std($tr, function() {});
-                            var map1 = {};
-                            $tr.closest('tbody').find('tr').each(function() {
-                                /*
-                                 * fire only one sorting API call(updateXXXXXXX&sortKey=n&id=UUID) for items who have the same UUID.
-                                 * e.g. An Template/ISO of multiple zones have the same UUID.
-                                 */
-                                var objId = $(this).data('json-obj').id;
-                                if(!(objId in map1)) {
-                                sort($(this), reorder.moveDrag);
-                                    map1[objId] = 1;
-                                }
-                            });
-                        }
-                    });
-                };
-
-                if (reorder && reorder.moveDrag) {
-                    initDraggable($tr);
-                }
-            }
-
-            // Add action data
-            $tr.data('list-view-item-id', id);
-            $tr.data('jsonObj', dataItem);
-            $tr.data('list-view-action-filter', options.actionFilter);
-
-            var actionsArray = actions ? $.map(actions, function(v, k) {
-                if (k == 'add') {
-                    v.isAdd = true;
-                }
-
-                return v;
-            }) : [];
-            var headerActionsArray = $.grep(
-                actionsArray,
-                function(action) {
-                    return action.isHeader || action.isAdd;
-                }
-            );
-
-            if (actions && !options.noActionCol && renderActionCol(actions) && actionsArray.length != headerActionsArray.length) {
-                var allowedActions = $.map(actions, function(value, key) {
-                    return key;
-                });
-
-                var $listView = $tr.closest('.list-view');
-                var isUICustom = $listView.data('view-args') ?
-                    $tr.closest('.list-view').data('view-args').uiCustom : false;
-
-                if ($.isFunction(options.actionFilter) && !isUICustom) {
-                    allowedActions = options.actionFilter({
-                        context: $.extend(true, {}, options.context, {
-                            actions: allowedActions,
-                            item: dataItem
-                        })
-                    });
-                }
-
-                makeActionIcons(
-                    $('<td></td>').addClass('actions reduced-hide')
-                    .appendTo($tr),
-                    actions, {
-                        allowedActions: allowedActions
-                    }
-                );
-            }
-
-          $tr.closest('.list-view').trigger('cloudStack.listView.addRow', {
-            $tr: $tr
-          });
-
-          // Add sub-select
-            if (subselect) {
-                var $td = $tr.find('td.first');
-                var $select = $('<div></div>').addClass('subselect').append(
-                    $('<span>').html(_l(subselect.label))
-                ).hide();
-                var $selectionArea = $tr.find('td:last').find('input');
-
-                if (subselect.isMultiple) {
-                    $select.append(
-                        $('<select multiple>'),
-                        $('<span>').addClass('info').html(_l('message.listView.subselect.multi'))
-                    );
-                } else {
-                  $select.append($('<select>'));
-                }
-
-                $td.append($select);
-
-                // Show and populate selection
-                $selectionArea.change(function() {
-                    if ($(this).is(':checked')) {
-                        // Populate data
-                        subselect.dataProvider({
-                            context: $.extend(true, {},
-                                ($listView && $listView.data('view-args') ?
-                                    $.extend(true, {}, $listView.data('view-args').context, options.context) :
-                                    options.context), {
-                                instances: [$tr.data('json-obj')]
-                            }),
-                            response: {
-                                success: function(args) {
-                                    var data = args.data;
-
-                                    if (data.length) {
-                                        $(data).map(function(index, item) {
-                                            var $option = $('<option>');
-
-                                            $option.attr('value', item.id);
-                                            $option.attr('title', item.description);
-                                            $option.append(item.description);
-                                            $option.appendTo($select.find('select'));
-                                        });
-                                        $select.show();
-                                    } else {
-                                        $select.hide();
-                                    }
-
-                                    $select.find('option:first').attr('selected', 'selected');
-                                    $listView.find('.data-table').dataTable('refresh');
-                                }
-                            }
-                        });
-
-                        if ($(this).is('input[type=radio]')) {
-                            $(this).closest('tr').siblings().find('input[type=radio]').change();
-                        }
-                    } else {
-                        $select.find('option').remove();
-                        $select.hide();
-                    }
-                });
-            }
-
-            // Add quick view
-            if (detailView && !$.isFunction(detailView) && !detailView.noCompact && !uiCustom) {
-                $quickView = $('<td>').addClass('quick-view reduced-hide')
-                    .append(
-                        $('<span>').addClass('icon').html('&nbsp;')
-                )
-                    .appendTo($tr);
-                $quickView.mouseover(
-                    // Show quick view
-                    function() {
-                        var $quickView = $(this);
-                        var $quickViewTooltip = $('<div>').addClass('quick-view-tooltip hovered-elem');
-                        var $tr = $quickView.closest('tr');
-                        var $listView = $tr.closest('.list-view');
-                        var $title = $('<div>').addClass('title');
-                        var $detailsContainer = $('<div>').addClass('container').appendTo($quickViewTooltip);
-                        var context = $.extend(true, {}, $listView.data('view-args').context);
-                        var activeSection = $listView.data('view-args').activeSection;
-                        var itemID = $tr.data('list-view-item-id');
-                        var jsonObj = $tr.data('json-obj');
-                        var $loading = $('<div>').addClass('loading-overlay').appendTo($detailsContainer);
-                        var listViewArgs = $listView.data('view-args');
-                        var listViewActiveSection = activeSection;
-                        var targetSection;
-
-                        if ($tr.hasClass('loading')) return;
-
-                        if (listViewActiveSection != '_zone') {
-                            if (listViewArgs.sections &&
-                                listViewArgs.sections[listViewActiveSection] &&
-                                listViewArgs.sections[listViewActiveSection].id) {
-                                targetSection = listViewArgs.sections[listViewActiveSection].id;
-                            } else {
-                                targetSection = listViewActiveSection;
-                            }
-                        } else {
-                            targetSection = detailViewArgs.section;
-                        }
-
-                        // Title
-                        $title.append(
-                            $('<span>').html(_l('label.quickview') + ': '),
-                            $('<span>').addClass('title').html(
-                                cloudStack.concat(
-                                    $tr.find('td.first span').html(), 30
-                                )
-                            ).attr({
-                                title: $tr.find('td.first span').html()
-                            }),
-                            $('<span>').addClass('icon').html('&nbsp;')
-                        );
-                        $quickViewTooltip.append($title);
-                        $('.quick-view-tooltip').remove();
-                        // Setup positioning
-                        $quickViewTooltip.hide().appendTo('#container').fadeIn(200, function() {
-                            if (!$quickViewTooltip.is(':visible')) return;
-
-                            // Init detail view
-                            context[targetSection] = [jsonObj];
-                            createDetailView({
-                                    data: $.extend(true, {}, detailView, {
-                                        onLoad: function($detailView) {
-                                            $loading.remove();
-                                            $detailView.slideToggle('fast');
-                                        },
-                                        onPerformAction: function() {
-                                            $tr.addClass('loading').find('td:last').prepend($('<div>').addClass('loading'));
-                                            $quickViewTooltip.detach();
-                                        },
-                                        onActionComplete: function() {
-                                            if (listViewArgs.onActionComplete) {
-                                                listViewArgs.onActionComplete();
-                                            }
-
-                                            $tr.removeClass('loading').find('td:last .loading').remove();
-                                            $quickViewTooltip.remove();
-                                        }
-                                    }),
-                                    id: itemID,
-                                    jsonObj: jsonObj,
-                                    section: activeSection,
-                                    context: context,
-                                    $listViewRow: $tr
-                                },
-                                function($detailView) { //complete(), callback funcion
-                                    $detailView.data('list-view', $listView);
-                                }, $tr, {
-                                    compact: true,
-                                    noPanel: true
-                                }
-                            ).appendTo($detailsContainer).hide();
-                        });
-                        $quickViewTooltip.css({
-                            position: 'absolute',
-                            left: $quickView.offset().left + $quickView.outerWidth() - $quickViewTooltip.width() - 2*(parseInt($quickView.css('border-left-width')) + parseInt($quickView.css('border-right-width'))),
-                            top: $quickView.offset().top,
-                            zIndex: $tr.closest('.panel').css("zIndex") + 1
-                        });
-
-                        $quickViewTooltip.mouseleave(function() {
-                            if (!$('.overlay:visible').length) {
-                                $quickViewTooltip.remove();
-                            }
-                        });
-                    }
-                );
-            }
-        });
-
-        // Toggle collapsible column to fix alignment of hidden/shown cells
-        if (hasCollapsibleColumn) {
-            $tbody.closest('table').find('tr:first th.collapsible-column:visible').prev('th').click();
-        }
-
-        // Re-sort table if a column was previously sorted
-        $listView.find('thead tr:last th.sorted').click().click();
-
-        return rows;
-    };
-
-    var setLoading = function($table, completeFn) {
-        var $loading = $('<tr>')
-            .addClass('loading')
-            .appendTo($table.find('tbody'))
-            .append(
-                $('<td>')
-                .addClass('loading icon')
-                .attr({
-                    'colspan': $table.find('th').length
-                })
-        );
-
-        $table.closest('div.list-view').scrollTop($table.height() + 100);
-
-        return completeFn({
-            loadingCompleted: function() {
-                $loading.remove();
-            }
-        });
-    };
-
-    var loadBody = function($table, dataProvider, preFilter, fields, append, loadArgs, actions, options) {
-        if (!options) options = {};
-        var context = options.context;
-        var reorder = options.reorder;
-        var multiSelect = options.multiSelect;
-        var $tbody = $table.find('tbody');
-        var $listView = $table.closest('.list-view');
-
-        if (!loadArgs) loadArgs = {
-            page: 1,
-            filterBy: {
-                search: {},
-                kind: 'all',
-                page: 1
-            }
-        };
-
-        if (options.clearEndTable) {
-            $listView.data('page', 1);
-            $table.closest('.list-view').data('end-of-table', false);
-        }
-
-        if (!append) {
-            if (!append) $table.find('tbody tr').remove();
-        }
-
-        var viewArgs = $listView.data('view-args');
-        var uiCustom = viewArgs.listView ? viewArgs.listView.uiCustom : false;
-
-        setLoading($table, function(setLoadingArgs) {
-            $table.dataTable();
-            $.extend(loadArgs, {
-                context: options.context,
-                response: {
-                    success: function(args) {
-                        setLoadingArgs.loadingCompleted();
-
-                        addTableRows(preFilter, fields, args.data, $tbody, actions, {
-                            actionFilter: args.actionFilter,
-                            context: context,
-                            reorder: reorder,
-                            detailView: options.detailView,
-                            'multiSelect': options.multiSelect,
-                            noActionCol: options.noActionCol
-                        });
-                        $table.dataTable(null, {
-                            noSelect: uiCustom
-                        });
-
-                        setTimeout(function() {
-                            $table.dataTable('refresh');
-                        });
-                    },
-                    error: function(args) {
-                        setLoadingArgs.loadingCompleted();
-                        addTableRows(preFilter, fields, [], $tbody, actions);
-                        $table.find('td:first').html(_l('ERROR'));
-                        $table.dataTable(null, {
-                            noSelect: uiCustom
-                        });
-                    }
-                }
-            });
-        });
-
-        return dataProvider(loadArgs);
-    };
-
-    /**
-     * Make 'switcher' buttons for sections
-     */
-    var createSectionSwitcher = function(args) {
-        var sections = args.sections;
-        var $switcher = $('<div>').addClass('section-switcher reduced-hide');
-        var $sectionSelect = $('<select></select>')
-            .appendTo(
-                $('<div></div>')
-                .addClass('section-select')
-                .appendTo($switcher)
-        );
-        var sectionPreFilter;
-
-        if (args.sectionSelect) {
-            $('<label>')
-                .prependTo($sectionSelect.parent())
-                .html(_l(args.sectionSelect.label) + ':');
-
-            sectionPreFilter = args.sectionSelect.preFilter ?
-                args.sectionSelect.preFilter({
-                    context: $.extend({}, cloudStack.context, args.context)
-                }) : null;
-        } else {
-            $sectionSelect.hide();
-        }
-
-        // No need to display switcher if only one entry is present
-        if (sectionPreFilter && sectionPreFilter.length == 1) {
-            $switcher.find('select').hide();
-            $switcher.find('label').html(
-                _l('label.viewing') + ' ' + _l(sections[sectionPreFilter[0]].title)
-            );
-        }
-
-        $.each(sections, function(key) {
-            if (sectionPreFilter && $.inArray(key, sectionPreFilter) == -1) {
-                return true;
-            }
-
-            var $sectionButton;
-
-            if (!this.type || this.type == 'button') {
-                $sectionButton = $('<div>')
-                    .addClass('section')
-                    .append(
-                        $('<a>')
-                        .addClass(key)
-                        .attr({
-                            href: '#'
-                        })
-                        .data('list-view-section-id', key)
-                        .html(_l(this.title))
-                );
-
-                $sectionButton.appendTo($switcher);
-            } else if (this.type == 'select') {
-                $sectionSelect.append(
-                    $('<option></option>')
-                    .attr('value', key)
-                    .html(_l(this.title))
-                );
-            }
-
-            return true;
-        });
-
-        $switcher.find('div.section:first').addClass('first');
-        $switcher.find('div.section:last').addClass('last');
-
-        return $switcher;
-    };
-
-    /**
-     * Generate/reset entire list view elements
-     *
-     * @param $container Container to place list view inside
-     * @param args List view setup data
-     * @param section If section, reset list view to specified section
-     */
-    var makeListView = function($container, args, section) {
-        args.activeSection = section ? section : (
-            args.listView.id ? args.listView.id : args.id
-        );
-
-        // Clear out any existing list view
-        var $existingListView = $container.find('div.list-view');
-        if ($existingListView.length) {
-            $existingListView.remove();
-        }
-
-        var listViewData = args.listView;
-
-        if (section) {
-            listViewData = args.sections[section].listView;
-
-            var sectionTitle = _l(args.title);
-            var subsectionTitle = _l(args.sections[section].title);
-
-            // Show subsection in breadcrumb
-            if (args.$breadcrumb) {
-                if ((sectionTitle && subsectionTitle) &&
-                    (sectionTitle != subsectionTitle)) {
-                    args.$breadcrumb.find('span.subsection').html(' - ' + subsectionTitle);
-                    args.$breadcrumb.attr('title', sectionTitle + ' - ' + subsectionTitle);
-                } else {
-                    args.$breadcrumb.find('span.subsection').html('');
-                    args.$breadcrumb.attr('title', sectionTitle);
-                }
-            }
-        }
-
-        // Create table and other elems
-        var $listView = $('<div></div>')
-            .addClass('view list-view')
-            .addClass(listViewData.section);
-
-        $listView.data('view-args', args);
-
-        var $toolbar = $('<div>').addClass('toolbar').appendTo($listView);
-        var $table = $('<table>').appendTo($listView);
-        var infScrollTimer;
-        var actions = listViewData.actions;
-        var reorder = listViewData.reorder;
-        var multiSelect = listViewData.multiSelect;
-        var tableHeight = $table.height();
-
-        $listView.data('end-of-table', false);
-        $listView.data('page', 1);
-
-        var $switcher;
-        if (args.sections) {
-            $switcher = createSectionSwitcher(args);
-            if (section) {
-                $switcher
-                    .appendTo($toolbar)
-                    .find('a.' + section).addClass('active');
-                $switcher.find('div.section-select select').val(section);
-            }
-        }
-
-        if ($switcher && $switcher.find('option').length == 1) {
-            listViewData = args.sections[
-                $switcher.find('select').val()
-            ].listView;
-
-            args.activeSection = listViewData.id;
-        }
-
-        if (listViewData.hideToolbar) {
-            $toolbar.hide();
-        }
-
-        // Add panel controls
-        $('<div class="panel-controls">').append($('<div class="control expand">').attr({
-            'ui-id': 'toggle-expand-panel'
-        })).appendTo($toolbar);
-
-        if (listViewData.actions && listViewData.actions.add) {
-            var showAdd = listViewData.actions.add.preFilter ?
-                listViewData.actions.add.preFilter({
-                    context: listViewData.context ? listViewData.context : args.context
-                }) : true;
-
-            if (showAdd) {
-                $toolbar
-                    .append(
-                        $('<div>')
-                        .addClass('button action add reduced-hide')
-                        .data('list-view-action-id', 'add')
-                        .append(
-                            $('<span>').html(_l(listViewData.actions.add.label))
-                        )
-                );
-            }
-        }
-
-        // List view header actions
-        if (listViewData.actions) {
-            $.each(listViewData.actions, function(actionName, action) {
-                var preFilter = function(extendContext) {
-                    var context = $.extend(true, {},
-                        $listView.data('view-args').context ? $listView.data('view-args').context : cloudStack.context);
-
-                    if (extendContext) {
-                        $.extend(context, extendContext);
-                    }
-
-                    return action.preFilter ? action.preFilter({
-                        id: listViewData.id,
-                        context: context
-                    }) : null;
-                }
-
-                if (!action.isHeader || (action.preFilter && !preFilter())) return true;
-
-                var $action = $('<div>')
-                    .addClass('button action main-action reduced-hide').addClass(actionName)
-                    .data('list-view-action-id', actionName)
-                    .append($('<span>').addClass('icon'))
-                    .append($('<span>').html(_l(action.label)));
-
-                if (action.isMultiSelectAction) {
-                    $action.addClass('multiSelectAction');
-                    $action.hide();
-
-                    if (action.preFilter) {
-                        $action.data('list-view-action-prefilter', preFilter);
-                    }
-                }
-
-                $toolbar.append($action)
-
-                return true;
-            });
-        }
-
-        $('<tbody>').appendTo($table);
-
-        createHeader(listViewData.preFilter,
-            listViewData.fields,
-            $table,
-            listViewData.actions, {
-                reorder: reorder,
-                detailView: listViewData.detailView,
-                'multiSelect': multiSelect,
-                noActionCol: listViewData.noActionCol,
-                groupableColumns: listViewData.groupableColumns
-            });
-
-        if (listViewData.noSplit) {
-            $table.addClass('no-split');
-        }
-
-        if (listViewData.horizontalOverflow) {
-            $table.addClass('horizontal-overflow');
-            $table.parent().css({'overflow-x': 'auto'});
-        }
-
-        createFilters($toolbar, listViewData.filters);
-
-        if (listViewData.hideSearchBar != true) {
-        createSearchBar($toolbar, listViewData);
-        }
-
-        loadBody(
-            $table,
-            listViewData.dataProvider,
-            listViewData.preFilter,
-            listViewData.fields,
-            false, {
-                page: $listView.data('page'),
-                filterBy: {
-                    kind: $listView.find('select[id=filterBy]').val(),
-                    search: {
-                        value: $listView.find('input[type=text]').val(),
-                        by: 'name'
-                    }
-                },
-                ref: args.ref
-            },
-            listViewData.actions, {
-                context: args.context,
-                reorder: reorder,
-                detailView: listViewData.detailView,
-                'multiSelect': multiSelect,
-                noActionCol: listViewData.noActionCol
-            }
-        );
-
-        // Keyboard events
-        $listView.bind('keypress', function(event) {
-            var code = (event.keyCode ? event.keyCode : event.which);
-            var $input = $listView.find('input:focus');
-
-            if ($input.length && $input.hasClass('edit') && code === 13) {
-                uiActions.edit($input.closest('tr'), {
-                    callback: listViewData.actions.edit.action
-                });
-            }
-        });
-
-        // Setup item events
-        $listView.find('tbody').bind('click', function(event) {
-            var $target = $(event.target);
-            var listViewAction = $target.data('list-view-action');
-
-            if (!listViewAction) return true;
-
-            listViewData.fields[listViewAction].action();
-
-            return true;
-        });
-
-        //basic search
-        var basicSearch = function() {
-            $listView.removeData('advSearch');
-            advancedSearchData = {};
-
-            $listView.data('page', 1);
-            loadBody(
-                $table,
-                listViewData.dataProvider,
-                listViewData.preFilter,
-                listViewData.fields,
-                false, {
-                    page: $listView.data('page'),
-                    filterBy: {
-                        kind: $listView.find('select[id=filterBy]').val(),
-                        search: {
-                            value: $listView.find('input[type=text]').val(),
-                            by: 'name'
-                        }
-                    }
-                },
-                listViewData.actions, {
-                    context: $listView.data('view-args').context,
-                    reorder: listViewData.reorder,
-                    detailView: listViewData.detailView,
-                    'multiSelect': multiSelect,
-                    noActionCol: listViewData.noActionCol
-                }
-            );
-        };
-
-        $listView.find('.search-bar input[type=text]').keyup(function(event) {
-            if (event.keyCode == 13) //13 is keycode of Enter key
-                basicSearch();
-            return true;
-        });
-        $listView.find('.button.search#basic_search').bind('click', function(event) {
-            basicSearch();
-            return true;
-        });
-        $listView.find('select').bind('change', function(event) {
-            if ($(event.target).closest('.section-select').length) return true;
-            if ((event.type == 'click' ||
-                    event.type == 'mouseup') &&
-                ($(event.target).is('select') ||
-                    $(event.target).is('option') ||
-                    $(event.target).is('input')))
-                return true;
-
-            basicSearch();
-
-            return true;
-        });
-
-        //advanced search
-        var advancedSearch = function(args) {
-            $listView.data('advSearch', args.data);
-            $listView.data('page', 1);
-            loadBody(
-                $table,
-                listViewData.dataProvider,
-                listViewData.preFilter,
-                listViewData.fields,
-                false, {
-                    page: $listView.data('page'),
-                    filterBy: {
-                        kind: $listView.find('select[id=filterBy]').val(),
-                        advSearch: args.data
-                    }
-                },
-                listViewData.actions, {
-                    context: $listView.data('view-args').context,
-                    reorder: listViewData.reorder,
-                    detailView: listViewData.detailView,
-                    'multiSelect': multiSelect,
-                    noActionCol: listViewData.noActionCol
-                }
-            );
-        };
-
-        var advancedSearchData = {};
-
-        var closeAdvancedSearch = function() {
-            $listView.find('.advanced-search .form-container:visible').remove();
-        };
-
-        $listView.find('.advanced-search .icon').bind('click', function(event) {
-            if ($listView.find('.advanced-search .form-container:visible').length) {
-                closeAdvancedSearch();
-
-                return false;
-            }
-
-            // Setup advanced search default values, when existing data is present
-            $.each(listViewData.advSearchFields, function(fieldID, field) {
-                field.defaultValue = advancedSearchData[fieldID];
-            });
-
-            var form = cloudStack.dialog.createForm({
-                noDialog: true,
-                form: {
-                    title: 'label.advanced.search',
-                    fields: listViewData.advSearchFields
-                },
-                after: function(args) {
-                    advancedSearch(args);
-                    advancedSearchData = args.data;
-                    $listView.find('.button.search#basic_search').siblings('.search-bar').find('input').val(''); //clear basic search input field to avoid confusion of search result
-                    closeAdvancedSearch();
-                }
-            });
-            var $formContainer = form.$formContainer;
-            var $form = $formContainer.find('form');
-
-            $formContainer.hide().appendTo($listView.find('.advanced-search')).show();
-            $form.find('.form-item:first input').focus();
-            $form.find('input[type=submit]')
-                .show()
-                .appendTo($form)
-                .val(_l('label.search'));
-
-            // Cancel button
-            $form.append(
-                $('<div>').addClass('button cancel').html(_l('label.cancel'))
-                .click(function() {
-                    closeAdvancedSearch();
-                })
-            );
-
-            $form.submit(function() {
-                form.completeAction($formContainer);
-            });
-
-            return false;
-        });
-
-
-        // Infinite scrolling event
-        $listView.bind('scroll', function(event) {
-            var listView = args.listView;
-            if (!listView && args.sections && args.sections.hasOwnProperty(args.activeSection)) {
-                listView = args.sections[args.activeSection].listView;
-            }
-            if (listView && listView.disableInfiniteScrolling) return false;
-            if ($listView.find('tr.last, td.loading:visible').length) return false;
-
-            clearTimeout(infScrollTimer);
-            infScrollTimer = setTimeout(function() {
-                var loadMoreData = $listView.scrollTop() >= ($table.height() - $listView.height()) - $listView.height() / 4;
-                var context = $listView.data('view-args').context;
-
-                if (loadMoreData && !$listView.data('end-of-table')) {
-                    $listView.data('page', $listView.data('page') + 1);
-
-                    var filterBy = {
-                        kind: $listView.find('select[id=filterBy]').length > 0 ? $listView.find('select[id=filterBy]').val() : 'all'
-                    };
-                    if ($listView.data('advSearch') == null) {
-                        filterBy.search = {
-                            value: $listView.find('input[type=text]').length > 0 ? $listView.find('input[type=text]').val() : '',
-                            by: 'name'
-                        };
-                    } else {
-                        filterBy.advSearch = $listView.data('advSearch');
-                    }
-
-                    loadBody(
-                        $table,
-                        listViewData.dataProvider,
-                        listViewData.preFilter,
-                        listViewData.fields, true, {
-                            context: context,
-                            page: $listView.data('page'),
-                            filterBy: filterBy
-                        }, actions, {
-                            reorder: listViewData.reorder,
-                            detailView: listViewData.detailView,
-                            'multiSelect': multiSelect,
-                            noActionCol: listViewData.noActionCol
-                        });
-                    $table.height() == tableHeight ? endTable = true : tableHeight = $table.height();
-                }
-            }, 500);
-
-            return true;
-        });
-
-        // Action events
-        $(window).bind('cloudstack.view-item-action', function(event, data) {
-            var actionName = data.actionName;
-            var $tr = $listView.find('tr').filter(function() {
-                return $(this).data('list-view-item-id') == data.id;
-            });
-
-            if (actionName == 'destroy') {
-                $tr.animate({
-                    opacity: 0.5
-                });
-                $tr.bind('click', function() {
-                    return false;
-                });
-            }
-        });
-
-        $listView.bind('click change', function(event) {
-            var $target = $(event.target);
-            var id = $target.closest('tr').data('list-view-item-id');
-            var jsonObj = $target.closest('tr').data('jsonObj');
-            var detailViewArgs;
-            var detailViewPresent = ($target.closest('div.data-table tr td.first').length &&
-                listViewData.detailView && !$target.closest('div.edit').length) && !listViewData.detailView.noPanelView;
-            var uiCustom = args.uiCustom == true ? true : false;
-
-            // Click on first item will trigger detail view (if present)
-            if (detailViewPresent && !uiCustom && !$target.closest('.empty, .loading').length) {
-                var $loading = $('<div>').addClass('loading-overlay');
-                $target.closest('div.data-table').prepend($loading); //overlay the whole listView, so users can't click another row until click-handling for this row is done (e.g. API response is back)
-
-                listViewData.detailView.$browser = args.$browser;
-                detailViewArgs = {
-                    $panel: $target.closest('div.panel'),
-                    data: listViewData.detailView,
-                    title: $target.closest('td').find('span').html(),
-                    id: id,
-                    jsonObj: jsonObj,
-                    ref: jsonObj,
-                    context: $.extend(true, {}, $listView.data('view-args').context)
-                };
-
-                // Populate context object w/ instance data
-                var listViewActiveSection = $listView.data('view-args').activeSection;
-
-                // Create custom-generated detail view
-                if (listViewData.detailView.pageGenerator) {
-                    detailViewArgs.pageGenerator = listViewData.detailView.pageGenerator;
-                }
-
-                var listViewArgs = $listView.data('view-args');
-
-                var targetSection;
-
-                detailViewArgs.section = listViewArgs.activeSection ?
-                    listViewArgs.activeSection : listViewArgs.id;
-
-                if (listViewActiveSection != '_zone') {
-                    if (listViewArgs.sections &&
-                        listViewArgs.sections[listViewActiveSection] &&
-                        listViewArgs.sections[listViewActiveSection].id) {
-                        targetSection = listViewArgs.sections[listViewActiveSection].id;
-                    } else {
-                        targetSection = listViewActiveSection;
-                    }
-                } else {
-                    targetSection = detailViewArgs.section;
-                }
-
-                detailViewArgs.context[targetSection] = [jsonObj];
-
-                if ($.isFunction(detailViewArgs.data)) {
-                    detailViewArgs.data = detailViewArgs.data({
-                        context: detailViewArgs.context
-                    });
-                }
-
-                detailViewArgs.data.onActionComplete = listViewArgs.onActionComplete;
-
-                createDetailView(
-                    detailViewArgs,
-                    function($detailView) { //complete(), callback funcion
-                        $detailView.data('list-view', $listView);
-                        $loading.remove();
-                    },
-                    $target.closest('tr')
-                );
-
-                return false;
-            }
-
-            // Action icons
-            if (!$target.closest('td.actions').hasClass('reorder') &&
-                ($target.closest('td.actions').length ||
-                    $target.closest('.action.add').length ||
-                    $target.closest('.action.main-action').length)) {
-                var actionID = $target.closest('.action').data('list-view-action-id');
-                var $tr;
-
-                if ($target.closest('.action').is('.disabled')) {
-                    return false;
-                }
-
-                if ($target.closest('.action.add').length ||
-                    $target.closest('.action.main-action:not(.multiSelectAction)').length) {
-                    $tr = $target.closest('div.list-view').find('tr:first'); // Dummy row
-                } else {
-                    if (listViewData.actions[actionID].isMultiSelectAction) {
-                        $tr = $listView.find('input.multiSelectCheckbox:checked').parents('tr');
-                    } else {
-                        $tr = $target.closest('tr');
-                    }
-                }
-
-                var uiCallback = uiActions[actionID];
-
-                if (!uiCallback)
-                    uiCallback = uiActions['standard'];
-
-                uiCallback($tr, {
-                    action: listViewData.actions[actionID]
-                });
-
-                return true;
-            }
-
-            // Edit field action icons
-            if ($target.hasClass('action') && $target.parent().is('div.edit')) {
-                uiActions.edit($target.closest('tr'), {
-                    callback: listViewData.actions.edit.action,
-                    cancel: $target.hasClass('cancel')
-                });
-                return false;
-            }
-
-            // Section switcher
-            if ($target.is('a') && $target.closest('div.section-switcher').length) {
-                makeListView($container, args, $target.data('list-view-section-id'));
-
-                return false;
-            }
-
-            if ($target.is('div.section-switcher select') && event.type == 'change') {
-                makeListView($container, args, $target.val());
-
-                return false;
-            }
-
-            return true;
-        });
-
-        return $listView.appendTo($container);
-    };
-
-    var prependItem = function(listView, data, actionFilter, options) {
-        if (!options) options = {};
-
-        var viewArgs = listView.data('view-args');
-        var listViewArgs = $.isPlainObject(viewArgs.listView) ? viewArgs.listView : viewArgs;
-        var targetArgs = listViewArgs.activeSection ? listViewArgs.sections[
-            listViewArgs.activeSection
-        ].listView : listViewArgs;
-        var reorder = targetArgs.reorder;
-        var $tr = addTableRows(
-            targetArgs.preFilter,
-            targetArgs.fields,
-            data,
-            listView.find('table tbody'),
-            targetArgs.actions, {
-                prepend: true,
-                actionFilter: actionFilter,
-                reorder: reorder,
-                detailView: targetArgs.detailView,
-                'multiSelect': targetArgs.multiSelect,
-                noActionCol: targetArgs.noActionCol
-            }
-        )[0];
-        listView.find('table').dataTable('refresh');
-
-        $tr.addClass('loading').find('td:last').prepend($('<div>').addClass('loading'));
-        $tr.find('.action').remove();
-
-        return $tr;
-    };
-
-    var replaceItem = function($row, data, actionFilter, after) {
-        var $newRow;
-        var $listView = $row.closest('.list-view');
-        var viewArgs = $listView.data('view-args');
-        var listViewArgs = $.isPlainObject(viewArgs.listView) ? viewArgs.listView : viewArgs;
-        var targetArgs = listViewArgs.activeSection ? listViewArgs.sections[
-            listViewArgs.activeSection
-        ].listView : listViewArgs;
-        var reorder = targetArgs.reorder;
-        var multiSelect = targetArgs.multiSelect;
-        var $table = $row.closest('table');
-        var defaultActionFilter = $row.data('list-view-action-filter');
-
-        $newRow = addTableRows(
-            targetArgs.preFilter,
-            targetArgs.fields,
-            data,
-            $listView.find('table tbody'),
-            targetArgs.actions, {
-                actionFilter: actionFilter ? actionFilter : defaultActionFilter,
-                reorder: reorder,
-                detailView: targetArgs.detailView,
-                'multiSelect': multiSelect,
-                noActionCol: targetArgs.noActionCol
-            }
-        )[0];
-
-        $newRow.data('json-obj', data);
-        $row.replaceWith($newRow);
-        $table.dataTable('refresh');
-
-        if (after) after($newRow);
-
-        return $newRow;
-    };
-
-    var toggleMultiSelectActions = function($listView, enabled) {
-        var $multiSelectActions = $listView.find('div.main-action.multiSelectAction');
-
-        $listView.find('div.action.add').toggle(!enabled);
-        $listView.find('div.main-action:not(.multiSelectAction)').toggle(!enabled);
-        $multiSelectActions.hide();
-
-        if (enabled) {
-            $multiSelectActions.filter(function() {
-                var preFilter = $(this).data('list-view-action-prefilter');
-                var $selectedVMs;
-                var context = {};
-
-                if (preFilter) {
-                    $selectedVMs = $listView.find('tbody tr').filter(function() {
-                        return $(this).find('td.multiselect input[type=checkbox]:checked').length;
-                    });
-                    context[$listView.data('view-args').activeSection] = $selectedVMs.map(function(index, item) {
-                        return $(item).data('json-obj');
-                    });
-
-                    return preFilter(context);
-                }
-
-                return true;
-            }).show();
-        }
-    };
-
-    $.fn.listView = function(args, options) {
-        if (!options) options = {};
-        if (args == 'prependItem') {
-            return prependItem(this, options.data, options.actionFilter);
-        } else if (args == 'replaceItem') {
-            replaceItem(options.$row, options.data, options.actionFilter, options.after);
-        } else if (args.sections) {
-            var targetSection;
-            $.each(args.sections, function(key) {
-                targetSection = key;
-                return false;
-            });
-            makeListView(this, $.extend(true, {}, args, {
-                context: options.context
-            }), targetSection);
-        } else if (args == 'refresh') {
-            var activeSection = this.data('view-args').activeSection;
-            var listViewArgs = this.data('view-args').sections ?
-                this.data('view-args').sections[activeSection].listView :
-                this.data('view-args').listView;
-
-            toggleMultiSelectActions(this, false);
-
-            loadBody(
-                this.find('table:last'),
-                listViewArgs.dataProvider,
-                listViewArgs.preFilter,
-                listViewArgs.fields,
-                false,
-                null,
-                listViewArgs.actions, {
-                    clearEndTable: true,
-                    multiSelect: listViewArgs.multiSelect,
-                    context: this.data('view-args').context,
-                    detailView: listViewArgs.detailView
-                }
-            );
-        } else {
-            makeListView(
-                this,
-                $.extend(true, {}, args, {
-                    context: options.context ? options.context : cloudStack.context
-                }));
-        }
-
-        return this;
-    };
-
-    // List view refresh handler
-    $(window).bind('cloudStack.fullRefresh', function() {
-        var $listViews = $('.list-view');
-
-        $listViews.each(function() {
-            var $listView = $(this);
-
-            $listView.listView('refresh');
-        });
-    });
-})(window.jQuery, window.cloudStack, window._l, window._s);
diff --git a/ui/legacy/scripts/ui/widgets/multiEdit.js b/ui/legacy/scripts/ui/widgets/multiEdit.js
deleted file mode 100755
index 62ca231..0000000
--- a/ui/legacy/scripts/ui/widgets/multiEdit.js
+++ /dev/null
@@ -1,1327 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    var getMultiData = function($multi) {
-        return cloudStack.serializeForm($multi.find('form'));
-    };
-
-    var _medit = cloudStack.ui.widgets.multiEdit = {
-        /**
-         * Append item to list
-         */
-        addItem: function(data, fields, $multi, itemData, actions, options) {
-            if (!options) options = {};
-
-            var $tr;
-            var $item = $('<div>').addClass('data-item');
-            var multiRule = data;
-            var reorder = options.reorder;
-            var selectPermission = options.selectPermission;
-
-            $item.append($('<table>').append($('<tbody>')));
-            $tr = $('<tr>').appendTo($item.find('tbody'));
-            $item.data('json-obj', multiRule);
-
-            if (itemData) {
-                $tr.data('multi-edit-data', itemData);
-            }
-
-            // Add reorder actions
-            if (reorder) {
-                $('<td>').addClass('actions reorder').appendTo($tr).append(function() {
-                    var $td = $(this);
-
-                    $.each(reorder, function(actionName, action) {
-                        var fnLabel = {
-                            moveTop: _l('label.move.to.top'),
-                            moveBottom: _l('label.move.to.bottom'),
-                            moveUp: _l('label.move.up.row'),
-                            moveDown: _l('label.move.down.row'),
-                            moveDrag: _l('label.drag.new.position')
-                        };
-
-                        $('<div>')
-                            .addClass('action reorder')
-                            .addClass(actionName)
-                            .append(
-                                $('<span>').addClass('icon').html('&nbsp;')
-                        )
-                            .attr({
-                                title: _l(fnLabel[actionName])
-                            })
-                            .appendTo($td)
-                            .click(function() {
-                                if (actionName == 'moveDrag') return false;
-
-                                rowActions[actionName]($tr);
-                                $tr.closest('.data-body').find('.data-item').each(function() {
-                                    sort($(this), action);
-                                });
-
-                                return false;
-                            });
-                    });
-                });
-            }
-
-            var $actions = undefined;
-            if(options.editOptionsFirst){
-            	$actions = $('<td>').addClass('multi-actions').appendTo($item.find('tr'));
-            }
-            // Setup columns
-            $.each(fields, function(fieldName, field) {
-                if (!field || (options.ignoreEmptyFields && !data[fieldName])) {
-                    return true;
-                }
-
-                var isHidden = $multi.find('th.' + fieldName).hasClass('always-hide');
-
-                if (isHidden) {
-                    return true;
-                }
-
-                var $td = $('<td>').addClass(fieldName).appendTo($tr);
-                var $input, val;
-                var $addButton = $multi.find('form .button.add-vm:not(.custom-action)').clone();
-                var newItemRows = [];
-                var addItemAction = function(data) {
-                    var $loading = $('<div>').addClass('loading-overlay');
-                    var complete = function(args) {
-                        var $tbody = $item.find('.expandable-listing tbody');
-
-                        $loading.remove();
-                        $(data).each(function() {
-                            var item = this;
-                            var $itemRow = _medit.multiItem.itemRow(item, options.itemActions, multiRule, $tbody);
-                            $itemRow.data('json-obj', item);
-                            $itemRow.appendTo($tbody);
-                            newItemRows.push($itemRow);
-
-                            cloudStack.evenOdd($tbody, 'tr:visible', {
-                                even: function($elem) {
-                                    $elem.removeClass('odd');
-                                    $elem.addClass('even');
-                                },
-                                odd: function($elem) {
-                                    $elem.removeClass('even');
-                                    $elem.addClass('odd');
-                                }
-                            });
-                        });
-                    };
-                    var error = function() {
-                        $(newItemRows).each(function() {
-                            var $itemRow = this;
-
-                            $itemRow.remove();
-                        });
-                        $loading.remove();
-                    };
-
-                    $loading.prependTo($item);
-                    options.itemActions.add.action({
-                        context: options.context,
-                        data: data,
-                        multiRule: multiRule,
-                        response: {
-                            success: function(args) {
-                                var notificationError = function(args) {
-                                    error();
-                                };
-
-                                cloudStack.ui.notifications.add(args.notification,
-                                    complete, {},
-                                    notificationError, {});
-                            },
-                            error: error
-                        }
-                    });
-                };
-
-                if (!itemData) itemData = [{}];
-
-                if (!options.noSelect &&
-                    $multi.find('th,td').filter(function() {
-                        return $(this).attr('rel') == fieldName;
-                    }).is(':hidden')) {
-                    return true;
-                }
-
-                if (!field.isPassword) {
-                	$td.attr('title', data[fieldName]);
-                    if (field.edit) {
-                    	// Edit fields append value of data
-                        if (field.range) {
-                            var start = _s(data[field.range[0]]);
-                            var end = _s(data[field.range[1]]);
-
-                            $td.append($('<span>').html(start + ' - ' + end));
-                        } else {
-                            var maxLengths = data['_maxLength'];
-
-                            if (maxLengths &&
-                                maxLengths[fieldName] &&
-                                data[fieldName].length >= maxLengths[fieldName]) {
-                                $td.append($('<span>').html(_s(data[fieldName].toString().substr(0, maxLengths[fieldName] - 3).concat('...'))));
-                            } else {
-                                $td.append($('<span>').html(_s(data[fieldName])));
-                            }
-                        }
-                    } else if (field.isBoolean) {
-                        var $checkbox = $('<input>');
-                        $checkbox.attr({
-                            disabled: true,
-                            name: fieldName,
-                            type: 'checkbox'
-                        });
-                        if (_s(data[fieldName])) {
-                            $checkbox.attr({
-                                checked: true
-                            });
-                        }
-                        $checkbox.appendTo($td);
-                    } else if (field.select) {
-                        // Get matching option text
-                        var $matchingSelect = $multi.find('select')
-                            .filter(function() {
-                                return $(this).attr('name') == fieldName;
-                            });
-                        var $matchingOption = $matchingSelect.find('option')
-                            .filter(function() {
-                                return $(this).val() == data[fieldName];
-                            });
-
-                        if (selectPermission) {
-                            // Wrap div to get its html code
-                            selectedOptionHtml = $matchingOption.clone().wrap('<div>').parent().html();
-                            // Get html code from not matching option
-                            $matchingSelect.find('option').each(
-                                function() {
-                                    if ($(this).val() != data[fieldName]){
-                                        selectedOptionHtml += $(this).clone().wrap('<div>').parent().html();
-                                    }
-                                }
-                            );
-                            $select = $('<select>');
-                            $select.html(selectedOptionHtml);
-                            $select.change(function(event) {
-                                selectPermission.action({
-                                    roleid: data['roleid'],
-                                    ruleid: data['id'],
-                                    permission: $(this).val()
-                                });
-                            });
-                            $td.append($select);
-                        }
-                        else {
-                            var matchingValue = $matchingOption.length ?
-                                $matchingOption.html() : data[fieldName];
-
-                            $td.append($('<span>').html(_s(matchingValue)));
-                        }
-                    } else if (field.addButton && !options.noSelect) {
-                        if (options.multipleAdd) {
-                            $addButton.click(function() {
-                                var context = $.extend(true, {}, options.context);
-
-                                if ($td.hasClass('disabled')) return false;
-
-                                var $subItems = $td.closest('.data-item').find('.expandable-listing tr');
-
-                                if ($subItems.length) {
-                                    context.subItemData = $subItems.map(function() {
-                                        return $(this).data('json-obj');
-                                    });
-                                }
-
-                                _medit.vmList($multi,
-                                    options.listView,
-                                    context,
-                                    options.multipleAdd, _l('label.add.vms'),
-                                    addItemAction, {
-                                        multiRule: multiRule
-                                    });
-
-                                return true;
-                            });
-                            $td.append($addButton);
-                        } else {
-                            // Show VM data
-                            var itemName = data._itemName ? itemData[0][data._itemName] : itemData[0].name;
-                            $td.html(options.multipleAdd ?
-                                itemData.length + ' VMs' : itemName);
-                            $td.click(function() {
-                                var $browser = $(this).closest('.detail-view').data('view-args').$browser;
-
-                                if (options.multipleAdd) {
-                                    _medit.multiItem.details(itemData, $browser);
-                                } else {
-                                    _medit.details(itemData[0], $browser, {
-                                        context: options.context,
-                                        itemName: itemName
-                                    });
-                                }
-                            });
-                        }
-                    } else if (field.custom) {
-                        var $button = $('<div>').addClass('button add-vm custom-action');
-
-                        $td.data('multi-custom-data', data[fieldName]);
-                        $button.html(data && data[fieldName] && data[fieldName]['_buttonLabel'] ?
-                            _l(data[fieldName]['_buttonLabel']) : _l(field.custom.buttonLabel));
-                        $button.click(function() {
-                            if ($td.hasClass('disabled')) return false;
-
-                            var $button = $(this);
-                            var context = $.extend(true, {},
-                                options.context ?
-                                options.context : cloudStack.context, {
-                                    multiRules: [data]
-                                });
-
-                            field.custom.action({
-                                context: context,
-                                data: $td.data('multi-custom-data'),
-                                $item: $td,
-                                response: {
-                                    success: function(args) {
-                                        if (args.data['_buttonLabel']) {
-                                            $button.html(_l(args.data['_buttonLabel']));
-                                        }
-                                        $td.data('multi-custom-data', args.data);
-                                    }
-                                }
-                            });
-
-                            return true;
-                        });
-                        $button.appendTo($td);
-                    }
-                }
-
-                // Add blank styling for empty fields
-                if ($td.html() == '') {
-                    $td.addClass('blank');
-                }
-
-                if (data._hideFields &&
-                    $.inArray(fieldName, data._hideFields) > -1) {
-                    $td.addClass('disabled');
-                }
-
-                return true;
-            });
-
-            if(!options.editOptionsFirst){
-            	var $actions = $('<td>').addClass('multi-actions').appendTo($item.find('tr'));
-            }
-            // Align action column width
-            $actions.width($multi.find('th.multi-actions').width() + 4);
-
-            // Action filter
-            var allowedActions = options.preFilter ? options.preFilter({
-                actions: $.map(actions, function(value, key) {
-                    return key;
-                }),
-                context: $.extend(true, {}, options.context, {
-                    multiRule: [data],
-                    actions: $.map(actions, function(value, key) {
-                        return key;
-                    })
-                })
-            }) : null;
-
-            // Append actions
-            $.each(actions, function(actionID, action) {
-                if (allowedActions && $.inArray(actionID, allowedActions) == -1) return true;
-
-                $actions.append(
-                    $('<div>').addClass('action')
-                    .addClass(actionID)
-                    .append($('<span>').addClass('icon'))
-                    .attr({
-                        title: _l(action.label)
-                    })
-                    .click(function() {
-                        var performAction = function(actionOptions) {
-                            if (!actionOptions) actionOptions = {};
-
-                            action.action({
-                                context: $.extend(true, {}, options.context, {
-                                    multiRule: [data]
-                                }),
-                                data: actionOptions.data,
-                                response: {
-                                    success: function(args) {
-                                        var notification = args ? args.notification : null;
-                                        var _custom = args ? args._custom : null;
-                                        if (notification) {
-                                            $('.notifications').notifications('add', {
-                                                section: 'network',
-                                                desc: notification.label,
-                                                interval: 3000,
-                                                _custom: _custom,
-                                                poll: function(args) {
-                                                    var complete = args.complete;
-                                                    var error = args.error;
-
-                                                    notification.poll({
-                                                        _custom: args._custom,
-                                                        complete: function(args) {
-                                                            if (isDestroy) {
-                                                                $loading.remove();
-                                                                $dataItem.remove();
-                                                            } else {
-                                                                $multi.trigger('refresh');
-                                                            }
-
-                                                            complete();
-
-                                                            if (actionOptions.complete) actionOptions.complete();
-                                                        },
-                                                        error: function(args) {
-                                                            error(args);
-                                                            $multi.trigger('refresh');
-
-                                                            return cloudStack.dialog.error;
-                                                        }
-                                                    });
-                                                }
-                                            });
-                                        } else {
-                                            $loading.remove();
-                                            if (isDestroy) {
-                                                $dataItem.remove();
-                                            }
-                                        }
-                                    },
-                                    error: function(message) {
-                                        cloudStack.dialog.notice({
-                                            message: message
-                                        });
-                                        $item.show();
-                                        $dataItem.find('.loading-overlay').remove();
-                                    }
-                                }
-                            });
-                        };
-
-                        var $target = $(this);
-                        var $dataItem = $target.closest('.data-item');
-                        var $expandable = $dataItem.find('.expandable-listing');
-                        var isDestroy = $target.hasClass('destroy');
-                        var isEdit = $target.hasClass('edit');
-                        var createForm = action.createForm;
-                        var reorder = options.reorder;
-
-                        if (isDestroy) {
-                            var $loading = _medit.loadingItem($multi, _l('label.removing') + '...');
-
-                            if ($expandable.is(':visible')) {
-                                $expandable.slideToggle(function() {
-                                    $dataItem.hide();
-                                    $dataItem.after($loading);
-                                });
-                            } else {
-                                // Loading appearance
-                                $dataItem.hide();
-                                $dataItem.after($loading);
-                            }
-                        }
-
-                        if (!isEdit) {
-                            if (createForm) {
-                                cloudStack.dialog.createForm({
-                                    form: createForm,
-                                    after: function(args) {
-                                        var $loading = $('<div>').addClass('loading-overlay').prependTo($dataItem);
-                                        performAction({
-                                            data: args.data,
-                                            complete: function() {
-                                                $multi.trigger('refresh');
-                                            }
-                                        });
-                                    }
-                                });
-                            } else {
-                                performAction();
-                            }
-                        } else {
-                            // Get editable fields
-                            var editableFields = {};
-
-                            $.each(fields, function(key, field) {
-                                field.isDisabled = false;
-
-                                if (field && field.isEditable) editableFields[key] = $.extend(true, {}, field, {
-                                    defaultValue: data[key]
-                                });
-                            });
-
-                            cloudStack.dialog.createForm({
-                                form: {
-                                    title: 'label.edit.rule',
-                                    desc: '',
-                                    fields: editableFields
-                                },
-                                after: function(args) {
-                                    var $loading = $('<div>').addClass('loading-overlay').prependTo($dataItem);
-                                    performAction({
-                                        data: args.data,
-                                        complete: function() {
-                                            $multi.trigger('refresh');
-                                        }
-                                    });
-                                }
-                            });
-                        }
-                    })
-                );
-            });
-
-            // Add tagger action
-            if (options.tags) {
-                $actions.prepend(
-                    $('<div></div>')
-                    .addClass('action editTags')
-                    .attr('title', _l('label.edit.tags'))
-                    .append($('<span></span>').addClass('icon'))
-                    .click(function() {
-                        var $dialog = $('<div>').dialog({
-                                            dialogClass: 'editTags',
-                                            title: _l('label.edit.tags'),
-                                            width: 400,
-                                            buttons: [{
-                                                text: _l('label.done'),
-                                                'class': 'ok',
-                                                click: function() {
-                                                    $(this).dialog('destroy');
-                                                    $('div.overlay:last').remove();
-            
-                                                    return true;
-                                                }
-                                            }]
-                                        }).append(
-                                            $('<div></div>').addClass('multi-edit-tags').tagger($.extend(true, {}, options.tags, {
-                                                context: $.extend(true, {}, options.context, {
-                                                    multiRule: [multiRule]
-                                                })
-                                            }))
-                                        );
-                             cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dialog);
-                        return false;
-                    })
-                )
-            }
-
-            // Add expandable listing, for multiple-item
-            if (options.multipleAdd) {
-                // Create expandable box
-                _medit.multiItem.expandable($item.find('tr').data('multi-edit-data'),
-                    options.itemActions,
-                    multiRule).appendTo($item);
-
-                // Expandable icon/action
-                $item.find('td:first').prepend(
-                    $('<div>').addClass('expand').click(function() {
-                        $item.closest('.data-item').find('.expandable-listing').slideToggle();
-                    }));
-            }
-
-            return $item;
-        },
-
-        vmList: function($multi, listView, context, isMultipleAdd, label, complete, options) {
-            if (!options) options = {};
-
-            // Create a listing of instances, based on limited information
-            // from main instances list view
-            var $listView;
-            var instances = $.extend(true, {}, listView, {
-                context: $.extend(true, {}, context, {
-                    multiData: getMultiData($multi),
-                    multiRule: options.multiRule ? [options.multiRule] : null
-                }),
-                uiCustom: true
-            });
-
-            instances.listView.multiSelect = false;
-
-            instances.listView.actions = {
-                select: {
-                    label: 'label.select.instance',
-                    type: isMultipleAdd ? 'checkbox' : 'radio',
-                    action: {
-                        uiCustom: function(args) {
-                            var $item = args.$item;
-                            var $input = $item.find('td.actions input:visible');
-
-                            if ($input.attr('type') == 'checkbox') {
-                                if ($input.is(':checked'))
-                                    $item.addClass('multi-edit-selected');
-                                else
-                                    $item.removeClass('multi-edit-selected');
-                            } else {
-                                $item.siblings().removeClass('multi-edit-selected');
-                                $item.addClass('multi-edit-selected');
-                            }
-                        }
-                    }
-                }
-            };
-
-            $listView = $('<div>').listView(instances);
-
-            // Change action label
-            $listView.find('th.actions').html(_l('Select'));
-
-            var $dataList = $listView.addClass('multi-edit-add-list').dialog({
-                dialogClass: 'multi-edit-add-list panel',
-                width: 900,
-                title: label,
-                buttons: [{
-                    text: _l('label.apply'),
-                    'class': 'ok',
-                    click: function() {
-                        if (!$listView.find('input[type=radio]:checked, input[type=checkbox]:checked').length) {
-                            cloudStack.dialog.notice({
-                                message: _l('message.select.item')
-                            });
-
-                            return false;
-                        }
-
-                        $dataList.fadeOut(function() {
-                            complete($.map(
-                                $listView.find('tr.multi-edit-selected'),
-
-                                // Attach VM data to row
-
-                                function(elem) {
-                                    var itemData = $(elem).data('json-obj');
-                                    var $subselect = $(elem).find('.subselect select');
-
-                                    // Include subselect data
-                                    if ($subselect && $subselect.val()) {
-                                        return $.extend(itemData, {
-                                            _subselect: $subselect.val()
-                                        });
-                                    }
-
-                                    return itemData;
-                                }
-                            ));
-                            $dataList.remove();
-                        });
-
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-
-                        return true;
-                    }
-                }, {
-                    text: _l('label.cancel'),
-                    'class': 'cancel',
-                    click: function() {
-                        $dataList.fadeOut(function() {
-                            $dataList.remove();
-                        });
-                        $('div.overlay').fadeOut(function() {
-                            $('div.overlay').remove();
-                        });
-                    }
-                }]
-            });
-            cloudStack.applyDefaultZindexAndOverlayOnJqueryDialogAndRemoveCloseButton($dataList);
-        },
-
-        /**
-         * Align width of each data row to main header
-         */
-        refreshItemWidths: function($multi) {
-            $multi.find('.data-body').width(
-                $multi.find('form > table.multi-edit').width()
-            );
-
-            $multi.find('.data tr').filter(function() {
-                return !$(this).closest('.expandable-listing').length;
-            }).each(function() {
-                var $tr = $(this);
-
-                $tr.find('td').each(function() {
-                    var $td = $(this);
-
-                    $td.width($($multi.find('th:visible')[$td.index()]).width() + 5);
-                });
-            });
-        },
-
-        /**
-         * Create a fake 'loading' item box
-         */
-        loadingItem: function($multi, label) {
-            var $loading = $('<div>').addClass('data-item loading');
-
-            // Align height with existing items
-            var $row = $multi.find('.data-item:first');
-
-            // Set label
-            if (label) {
-                $loading.append(
-                    $('<div>').addClass('label').append(
-                        $('<span>').html(_l(label))
-                    )
-                );
-            }
-
-            return $loading;
-        },
-        details: function(data, $browser, options) {
-            if (!options) options = {};
-
-            var detailViewArgs, $detailView;
-
-            detailViewArgs = $.extend(true, {}, cloudStack.sections.instances.listView.detailView);
-            detailViewArgs.actions = null;
-            detailViewArgs.$browser = $browser;
-            detailViewArgs.id = data.id;
-            detailViewArgs.jsonObj = data;
-            detailViewArgs.context = options.context;
-
-            $browser.cloudBrowser('addPanel', {
-                title: options.itemName ? options.itemName : data.name,
-                maximizeIfSelected: true,
-                complete: function($newPanel) {
-                    $newPanel.detailView(detailViewArgs);
-                }
-            });
-        },
-        multiItem: {
-            /**
-             * Show listing of load balanced VMs
-             */
-            details: function(data, $browser) {
-                var listViewArgs, $listView;
-
-                // Setup list view
-                listViewArgs = $.extend(true, {}, cloudStack.sections.instances);
-                listViewArgs.listView.actions = null;
-                listViewArgs.listView.filters = null;
-                listViewArgs.$browser = $browser;
-                listViewArgs.listView.detailView.actions = null;
-                listViewArgs.listView.dataProvider = function(args) {
-                    setTimeout(function() {
-                        args.response.success({
-                            data: data
-                        });
-                    }, 50);
-                };
-                $listView = $('<div>').listView(listViewArgs);
-
-                // Show list view of selected VMs
-                $browser.cloudBrowser('addPanel', {
-                    title: _l('label.item.listing'),
-                    data: '',
-                    noSelectPanel: true,
-                    maximizeIfSelected: true,
-                    complete: function($newPanel) {
-                        return $newPanel.listView(listViewArgs);
-                    }
-                });
-            },
-
-            itemRow: function(item, itemActions, multiRule, $tbody) {
-                var $tr = $('<tr>');
-
-                var itemName = multiRule._itemName ? item[multiRule._itemName] : item.name;
-                var $itemName = $('<span>').html(_s(itemName));
-
-                $tr.append($('<td>').addClass('name').appendTo($tr).append($itemName));
-
-                $itemName.click(function() {
-                    _medit.details(item, $('#browser .container'), {
-                        itemName: itemName,
-                        context: {
-                            instances: [item]
-                        }
-                    });
-                });
-
-
-                var itemIp = multiRule._itemIp ? item[multiRule._itemIp] : null;
-                if (itemIp != null) {
-                     var $itemIp = $('<span>').html(_s(itemIp));
-                     $tr.append($('<td>').addClass('state').appendTo($tr).append($itemIp));
-                }
-
-
-                var itemState = item._itemState ? item._itemState : item.state;
-
-                $tr.append($('<td>').addClass('state').appendTo($tr).append(
-                    $('<span>').text(
-                        item._itemStateLabel ? _l(item._itemStateLabel) + ' - ' + itemState :
-                            _l('label.state') + ' - ' + itemState
-                    )
-                ));
-
-
-                if (itemActions) {
-                    var $itemActions = $('<td>').addClass('actions item-actions');
-
-                    $.each(itemActions, function(itemActionID, itemAction) {
-                        if (itemActionID == 'add')
-                            return true;
-
-                        if (item._hideActions != null && $.inArray(itemActionID, item._hideActions) > -1)
-                            return true;
-
-                        var $itemAction = $('<div>').addClass('action').addClass(itemActionID);
-
-                        $itemAction.click(function() {
-                            itemAction.action({
-                                item: item,
-                                multiRule: multiRule,
-                                response: {
-                                    success: function(args) {
-                                        if (itemActionID == 'destroy') {
-                                            var notification = args.notification;
-                                            var success = function(args) {
-                                                $tr.remove();
-                                            };
-                                            var successArgs = {};
-                                            var error = function(args) {
-                                                $tr.show();
-                                                cloudStack.evenOdd($tbody, 'tr:visible', {
-                                                    even: function($elem) {
-                                                        $elem.removeClass('odd');
-                                                        $elem.addClass('even');
-                                                    },
-                                                    odd: function($elem) {
-                                                        $elem.removeClass('even');
-                                                        $elem.addClass('odd');
-                                                    }
-                                                });
-                                            };
-                                            var errorArgs = {};
-
-                                            $tr.hide();
-                                            cloudStack.evenOdd($tbody, 'tr:visible', {
-                                                even: function($elem) {
-                                                    $elem.removeClass('odd');
-                                                    $elem.addClass('even');
-                                                },
-                                                odd: function($elem) {
-                                                    $elem.removeClass('even');
-                                                    $elem.addClass('odd');
-                                                }
-                                            });
-                                            cloudStack.ui.notifications.add(notification,
-                                                success, successArgs,
-                                                error, errorArgs);
-                                        }
-                                    },
-                                    error: function(message) {
-                                        if (message) {
-                                            cloudStack.dialog.notice({
-                                                message: message
-                                            });
-                                        }
-                                    }
-                                }
-                            });
-                        });
-                        $itemAction.append($('<span>').addClass('icon'));
-                        $itemAction.appendTo($itemActions);
-
-                        return true;
-                    });
-
-                    $itemActions.appendTo($tr);
-                }
-
-                return $tr;
-            },
-
-            expandable: function(data, itemActions, multiRule) {
-                var $expandable = $('<div>').addClass('expandable-listing');
-                var $tbody = $('<tbody>').appendTo($('<table>').appendTo($expandable));
-
-                $(data).each(function() {
-                    var field = this;
-                    var $tr = _medit.multiItem.itemRow(field, itemActions, multiRule, $tbody).appendTo($tbody);
-
-                    $tr.data('json-obj', field);
-
-                    cloudStack.evenOdd($tbody, 'tr', {
-                        even: function($elem) {
-                            $elem.addClass('even');
-                        },
-                        odd: function($elem) {
-                            $elem.addClass('odd');
-                        }
-                    });
-                });
-
-                return $expandable.hide();
-            }
-        }
-    };
-
-    $.fn.multiEdit = function(args) {
-        var dataProvider = args.dataProvider;
-        var multipleAdd = args.multipleAdd;
-        var tags = args.tags;
-        var $multi = $('<div>').addClass('multi-edit').appendTo(this);
-        var $multiForm = $('<form>').appendTo($multi);
-        var $inputTable = $('<table>').addClass('multi-edit').appendTo($multiForm);
-        var $dataTable = $('<div>').addClass('data').appendTo($multi);
-        var $addVM;
-        var fields = args.fields;
-        var actions = args.actions;
-        var itemActions = multipleAdd ? args.itemActions : null;
-        var noSelect = args.noSelect;
-        var context = args.context;
-        var ignoreEmptyFields = args.ignoreEmptyFields;
-        var actionPreFilter = args.actionPreFilter;
-        var readOnlyCheck = args.readOnlyCheck;
-        var reorder = args.reorder;
-        var selectPermission = args.selectPermission;
-
-        var $thead = $('<tr>').appendTo(
-            $('<thead>').appendTo($inputTable)
-        );
-        if (!args.doNotShowInputTable){
-	        var $inputForm = $('<tr>').appendTo(
-	            $('<tbody>').appendTo($inputTable)
-	        );
-        }
-        var $dataBody = $('<div>').addClass('data-body').appendTo($dataTable);
-
-        // Setup input table headers
-
-        if (reorder) {
-            $('<th>').addClass('reorder').appendTo($thead);
-            if (!args.doNotShowInputTable){
-            	$('<td>').addClass('reorder').appendTo($inputForm);
-            }
-            $multi.find('.data-body').sortable({
-                handle: '.action.moveDrag',
-
-                update: function(event, ui) {
-                    var $loading = $('<div>').addClass('loading-overlay');
-
-                    $loading.prependTo($multi);
-                    reorder.moveDrag.action({
-                        targetIndex: ui.item.index(),
-                        nextItem: ui.item.next().length ? ui.item.next().data('json-obj') : null,
-                        prevItem: ui.item.prev().length ? ui.item.prev().data('json-obj') : null,
-                        context: $.extend(true, {}, context, {
-                            // Passes all rules, so that each index can be updated
-                            multiRule: [ui.item.data('json-obj')]
-                        }),
-                        response: {
-                            success: function(args) {
-                                $multi.trigger('refresh');
-                                $loading.remove();
-                            },
-                            error: function(msg) {
-                                $multi.trigger('refresh');
-                                cloudStack.dialog.notice(msg);
-                                $loading.remove();
-                            }
-                        }
-                    });
-                }
-            });
-        }
-
-        if (args.editOptionsFirst && args.actions && !args.noHeaderActionsColumn) {
-            $thead.append($('<th></th>').html(_l('label.actions')).addClass('multi-actions'));
-            if (!args.doNotShowInputTable){
-            	$inputForm.append($('<td></td>').addClass('multi-actions'));
-            }
-        }
-        
-        $.each(args.fields, function(fieldName, field) {
-            if (!field) return true;
-
-            var $th = $('<th>').addClass(fieldName).html(_l(field.label.toString()));
-            $th.attr('rel', fieldName);
-            $th.appendTo($thead);
-            var $td = $('<td>').addClass(fieldName);
-            $td.attr('rel', fieldName);
-            
-            if (!args.doNotShowInputTable){
-            	$td.appendTo($inputForm);
-            }
-
-            var isHidden = $.isFunction(field.isHidden) ?
-                    field.isHidden({ context: context }) : field.isHidden;
-
-            if (isHidden) {
-                // return true == hide only header and form column
-                // return 2 == hide header and form, as well as returned item column
-                if (isHidden === 2) {
-                    $th.addClass('always-hide');
-                }
-
-                $th.hide();
-                $td.hide();
-            }
-
-            if (field.select) {
-                var $select = $('<select>');
-
-                $select.attr({
-                    name: fieldName
-                });
-                $select.appendTo($td);
-                field.select({
-                    context: context,
-                    $select: $select,
-                    $form: $multiForm,
-                    response: {
-                        success: function(args) {
-                            $(args.data).each(function() {
-                                $('<option>').val(this.name).html(_l(_s(this.description)))
-                                    .appendTo($select);
-                            });
-                            _medit.refreshItemWidths($multi);
-                        },
-
-                        error: function(args) {}
-                    }
-                });
-            } else if (field.isBoolean) {
-                var $input = $('<input>')
-                    .attr({
-                        name: fieldName,
-                        type: 'checkbox'
-                }).appendTo($td);
-            } else if (field.edit && field.edit != 'ignore') {
-                if (field.range) {
-                    var $range = $('<div>').addClass('range').appendTo($td);
-
-                    $(field.range).each(function() { //e.g. field.range = ['privateport', 'privateendport'];
-                        var $input = $('<input>')
-                            .addClass('disallowSpecialCharacters')
-                            .attr({
-                                name: this,
-                                type: 'text'
-                            })
-                        //.addClass(!field.isOptional ? 'required' : null)          //field.range[0] might be required while field.range[1] is optional (e.g. private start port is required while private end port is optional), so "isOptional" property should be on field.range level instead of field level.
-                        //.attr('disabled', field.isDisabled ? 'disabled' : false)  //field.range[0] might be enabled while field.range[1] is disabled  (e.g. private start port is enabled while private end port is disabled),  so "isDisabled" property should be on field.range level instead of field level.
-                        .appendTo(
-                            $('<div>').addClass('range-item').appendTo($range)
-                        );
-
-                        if (field.isDisabled) $input.hide();
-
-                        if (field.defaultValue) {
-                            $input.val(field.defaultValue);
-                            $input.data('multi-default-value', field.defaultValue);
-                        }
-                    });
-                } else {
-                    var $input = $('<input>')
-                        .attr({
-                            name: fieldName,
-                            type: field.isPassword ? 'password' : 'text'
-                        })
-                            .addClass(!field.isOptional ? 'required' : null)
-                            .addClass('disallowSpecialCharacters')
-                        .attr('disabled', field.isDisabled ? 'disabled' : false)
-                        .appendTo($td);
-
-                    if (field.validation) {
-                        $td.find('input').first().data("validation-settings",  field.validation );
-                    }
-
-                    if (field.isDisabled) $input.hide();
-                    if (field.defaultValue) {
-                        $input.val(field.defaultValue);
-                        $input.data('multi-default-value', field.defaultValue);
-                    }
-                }
-            } else if (field.custom) {
-                $('<div>').addClass('button add-vm custom-action')
-                    .html(_l(field.custom.buttonLabel))
-                    .click(function() {
-                        if (field.custom.requireValidation && !$multiForm.valid()) return false;
-
-                        var formData = getMultiData($multi);
-
-                        field.custom.action({
-                            formData: formData,
-                            context: context,
-                            data: $td.data('multi-custom-data'),
-                            response: {
-                                success: function(args) {
-                                    $td.data('multi-custom-data', args.data);
-                                }
-                            }
-                        });
-
-                        return false;
-                    }).appendTo($td);
-            } else if (field.addButton) {
-                $addVM = $('<div>').addClass('button add-vm').html(
-                    _l('label.add')
-                ).appendTo($td);
-            }
-
-            if (field.desc){ 
-            	$input.attr('title', field.desc);
-            	$th.attr('title', _l(field.desc));
-            }
-        });
-
-        // Setup header fields
-        var showHeaderFields = args.headerFields ? true : false;
-        var headerForm = showHeaderFields ? cloudStack.dialog.createForm({
-            context: context,
-            noDialog: true,
-            form: {
-                fields: args.headerFields
-            },
-            after: function(args) {
-                // Form fields are handled by main 'add' action
-            }
-        }) : null;
-        var $headerFields = $('<div>').addClass('header-fields').hide(); //make headerFields hidden as default
-
-        if (headerForm) {
-            $headerFields.append(headerForm.$formContainer)
-                .prependTo($multi);
-        }
-
-        if (!args.editOptionsFirst && args.actions && !args.noHeaderActionsColumn) {
-            $thead.append($('<th></th>').html(_l('label.actions')).addClass('multi-actions'));
-            if (!args.doNotShowInputTable){
-            	$inputForm.append($('<td></td>').addClass('multi-actions'));
-            }
-        }
-        if($addVM){
-	        $addVM.bind('click', function() {
-	            // Validate form first
-	            if (!$multiForm.valid()) {
-	                if ($multiForm.find('input.error:visible').length) {
-	                    return false;
-	                }
-	            }
-	
-	            var $dataList;
-	            var addItem = function(itemData) {
-	                var data = {};
-	
-	                $.each(getMultiData($multi), function(key, value) {
-	                    if (value != '') {
-	                        data[key] = value;
-	                    }
-	                });
-	
-	                // Append custom data
-	                var $customFields = $multi.find('tbody td').filter(function() {
-	                    return $(this).data('multi-custom-data');
-	                });
-	
-	                $customFields.each(function() {
-	                    var $field = $(this);
-	                    var fieldID = $field.attr('rel');
-	                    var fieldData = $field.data('multi-custom-data');
-	
-	                    data[fieldID] = fieldData;
-	                });
-	
-	                // Loading appearance
-	                var $loading = _medit.loadingItem($multi, _l('label.adding') + '...');
-	                $dataBody.prepend($loading);
-	
-	                // Clear out fields
-	                $multi.find('input').each(function() {
-	                    var $input = $(this);
-	
-	                    if ($input.is(":checkbox")) {
-	                        $input.attr({
-	                            checked: false
-	                        });
-	                    } else if ($input.data('multi-default-value')) {
-	                        $input.val($input.data('multi-default-value'));
-	                    } else {
-	                        $input.val('');
-	                    }
-	                });
-	                $multi.find('tbody td').each(function() {
-	                    var $item = $(this);
-	
-	                    if ($item.data('multi-custom-data')) {
-	                        $item.data('multi-custom-data', null);
-	                    }
-	                });
-	
-	                // Apply action
-	                args.add.action({
-	                    context: context,
-	                    data: data,
-	                    itemData: itemData,
-	                    $multi: $multi,
-	                    response: {
-	                        success: function(successArgs) {
-	                            var notification = successArgs ? successArgs.notification : null;
-	                            if (notification) {
-	                                $('.notifications').notifications('add', {
-	                                    section: 'network',
-	                                    desc: notification.label,
-	                                    interval: 3000,
-	                                    _custom: successArgs._custom,
-	                                    poll: function(pollArgs) {
-	                                        var complete = pollArgs.complete;
-	                                        var error = pollArgs.error;
-	
-	                                        notification.poll({
-	                                            _custom: pollArgs._custom,
-	                                            complete: function(completeArgs) {
-	                                                complete(args);
-	                                                $loading.remove();
-	                                                getData();
-	                                            },
-	
-	                                            error: function(args) {
-	                                                error(args);
-	                                                $loading.remove();
-	
-	                                                return cloudStack.dialog.error(args);
-	                                            }
-	                                        });
-	                                    }
-	                                });
-	                            } else {
-	                                $loading.remove();
-	                                getData();
-	                            }
-	                        },
-	
-	                        error: cloudStack.dialog.error(function() {
-	                            $loading.remove();
-	                        })
-	                    }
-	                });
-	            };
-	
-	            if (args.noSelect) {
-	                // Don't append instance data
-	                addItem([]);
-	
-	                return true;
-	            }
-	
-	            _medit.vmList($multi,
-	                args.listView,
-	                args.context,
-	                multipleAdd, _l('label.add.vms'),
-	                addItem);
-	
-	            return true;
-	        });
-        }
-        var listView = args.listView;
-        var editOptionsFirst = args.editOptionsFirst;
-        var getData = function() {
-            dataProvider({
-                context: context,
-                $multi: $multi,
-                response: {
-                    success: function(args) {
-                        $multi.find('.data-item').remove();
-                        $(args.data).each(function() {
-                            var data = this;
-                            var itemData = this._itemData;
-
-                            _medit.addItem(
-                                data,
-                                fields,
-                                $multi,
-                                itemData,
-                                actions, {
-                                    multipleAdd: multipleAdd,
-                                    itemActions: itemActions,
-                                    noSelect: noSelect,
-                                    context: $.extend(true, {}, context, this._context),
-                                    ignoreEmptyFields: ignoreEmptyFields,
-                                    preFilter: actionPreFilter,
-                                    listView: listView,
-                                    tags: tags,
-                                    reorder: reorder,
-                                    selectPermission: selectPermission,
-                                    editOptionsFirst: editOptionsFirst
-                                }
-                            ).appendTo($dataBody);
-                        });
-
-                        if (readOnlyCheck && !readOnlyCheck(args)) {
-                            $multi.find('th.add-user, td.add-user').detach();
-                            $multiForm.find('tbody').detach();
-                        }
-                        if (args.hideFields) {
-                            $(args.hideFields).each(function() {
-                                $multi.find('th.' + this + ',td.' + this).hide();
-                            });
-                        }
-
-                        _medit.refreshItemWidths($multi);
-                    },
-                    error: cloudStack.dialog.error
-                }
-            });
-        };
-
-        if (args.hideForm && args.hideForm()) {
-            $multiForm.find('tbody').detach();
-        }
-
-        // Get existing data
-        setTimeout(function() {
-            getData();
-        });
-
-        var fullRefreshEvent = function(event) {
-            if ($multi.is(':visible')) {
-                getData();
-            } else {
-                $(window).unbind('cloudStack.fullRefresh', fullRefreshEvent);
-            }
-        };
-        $(window).bind('cloudStack.fullRefresh', fullRefreshEvent);
-        $multi.bind('refresh', fullRefreshEvent);
-
-        $multi.bind('change select', function() {
-            _medit.refreshItemWidths($multi);
-        });
-
-        $multiForm.validate();
-
-        var inputs = $multiForm.find('input');
-        $.each(inputs, function() {
-            if ($(this).data && $(this).data('validation-settings'))
-                $(this).rules('add', $(this).data('validation-settings'));
-        });
-        return this;
-    };
-
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui/widgets/notifications.js b/ui/legacy/scripts/ui/widgets/notifications.js
deleted file mode 100644
index 6ff9e74..0000000
--- a/ui/legacy/scripts/ui/widgets/notifications.js
+++ /dev/null
@@ -1,385 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack, _l) {
-    /**
-     * Notification handling
-     */
-    var notifications = {
-        activeTasks: [],
-        cornerAlert: function(args, options) {
-            if (!options) options = {};
-
-            var $container = $('#main-area'); // Put in main container box
-            var $cornerAlert = $('<div>').addClass('notification corner-alert')
-                .hide()
-                .appendTo('html body')
-                .append(
-                    $('<div>').addClass('top-arrow'),
-                    $('<div>').addClass('title').append(
-                        $('<span>').html(
-                            options.error ? options.error : _l('label.task.completed')
-                        )
-                    )
-            )
-                .append(
-                    $('<div>').addClass('message')
-                    .append(
-                        $('<span>').html(_l(args.message))
-                    )
-            );
-
-            if (options.error) {
-                $cornerAlert.addClass('error');
-            }
-
-            return $cornerAlert
-                .css({
-                    opacity: 0,
-                    position: 'absolute',
-                    top: $('#header .notifications').offset().top,
-                    left: $('#header .notifications').offset().left
-                })
-                .animate({
-                    opacity: 1
-                }, {
-                    complete: function() {
-                        setTimeout(function() {
-                            $cornerAlert.fadeOut('fast', function() {
-                                $cornerAlert.remove();
-                            });
-                        }, 3000);
-                    }
-                })
-                .show();
-        },
-        add: function(args, $popup, $total) {
-            var currentTotal = parseInt($total.html());
-            var newTotal = currentTotal + 1;
-            var desc = args.desc;
-            var section = $('html body')
-                .find('[cloudStack-container]')
-                .data('cloudStack-args')
-                .sections[args.section];
-            var _custom = args._custom;
-
-            var $item = $('<li>')
-                .append(
-                    $('<span>').html(_l(args.desc))
-            )
-                .append(
-                    $('<div>').addClass('remove')
-            );
-            var additionalComplete = args.complete;
-
-            // Get information for specified section path
-            $item.data('notification-section', args.section);
-            $item.data('notification-custom', _custom);
-            $popup.find('ul').append($item);
-            $total.html(newTotal);
-            $total.parent().addClass('pending');
-            $item.addClass('pending');
-
-            // Setup timer
-            var pollTimer = setInterval(function() {
-                args.poll({
-                    _custom: _custom,
-                    pollTimer: pollTimer,
-                    complete: function(args) {
-                        clearInterval(pollTimer);
-
-                        notifications.cornerAlert({
-                            message: $item.html()
-                        });
-                        notifications.activeTasks.pop(pollTimer);
-                        $item.removeClass('pending');
-
-                        if (additionalComplete) additionalComplete();
-                    },
-                    incomplete: function(args) {},
-                    error: function(args) {
-                        if (args && args.message) {
-                            cloudStack.dialog.notice({
-                                message: _s(args.message)
-                            });
-                        }
-
-                        clearInterval(pollTimer);
-                        notifications.activeTasks.pop(pollTimer);
-                        notifications.cornerAlert({
-                            message: $item.html()
-                        }, {
-                            error: _l('label.error')
-                        });
-                        $item.removeClass('pending').addClass('error').append(
-                            $('<div>').addClass('subtitle').html(args && args.message ?
-                                                                 args.message : _l('label.error'))
-                        );
-                        $item.attr('title', args && args.message ? args.message : _l('label.error'));
-
-                        if (additionalComplete) additionalComplete();
-                    }
-                });
-            }, args.interval);
-            notifications.activeTasks.push(pollTimer);
-
-            return $total;
-        },
-
-        /**
-         * Set total to 0
-         */
-        resetTotal: function($popup) {
-            var $total = $popup.data('notifications-attach-to').find('div.total span');
-            var $items = $popup.find('ul li');
-            var total = $items.length;
-            var completed = $items.filter(':not(.pending)').length;
-            var newTotal = total - completed;
-
-            if (newTotal < 0) newTotal = completed;
-
-            $total.html(newTotal);
-
-            if (!newTotal)
-                $total.parent().removeClass('pending');
-        },
-
-        /**
-         * Remove item from notification list
-         */
-        removeItem: function($popup, $item) {
-            if ($item.closest('li').hasClass('pending')) return false;
-
-            $item.remove();
-
-            return true;
-        },
-
-        /**
-         * Remove all completed notifications
-         */
-        clear: function($popup) {
-            $popup.find('ul li').each(function() {
-                var $item = $(this);
-
-                if (!$item.hasClass('pending')) {
-                    notifications.removeItem($popup, $item);
-                }
-            });
-        },
-        popup: {
-            create: function($attachTo) {
-                var $popup = $('<div>')
-                    .addClass('notification-box')
-                    .append(
-                        // Header
-                        $('<h3>').html(_l('label.notifications'))
-                )
-                    .append(
-                        // Container
-                        $('<div>').addClass('container')
-                        .append(
-                            // Notification list
-                            $('<ul>')
-                        )
-                )
-                    .append(
-                        // Buttons
-                        $('<div>').addClass('buttons')
-                        .append(
-                            // Clear list
-                            $('<div>').addClass('button clear-list')
-                            .append(
-                                $('<span>').html(_l('label.clear.list'))
-                            )
-                        )
-                        .append(
-                            $('<div>').addClass('button close')
-                            .append(
-                                $('<span>').html(_l('label.close'))
-                            )
-                        )
-                )
-                    .css({
-                        position: 'absolute'
-                    })
-                    .data('notifications-attach-to', $attachTo)
-                    .hide();
-
-                if (!$attachTo.hasClass('notifications')) $attachTo.addClass('notifications');
-                $attachTo.data('notifications-popup', $popup);
-
-                return $popup;
-            },
-            show: function($popup, $attachTo) {
-                notifications.resetTotal($popup);
-                return notifications.popup.reposition($popup, $attachTo)
-                    .overlay({
-                        closeAction: function() {
-                            notifications.popup.hide($popup);
-                        }
-                    })
-                    .fadeIn();
-            },
-            hide: function($popup) {
-                $popup.fadeOut();
-            },
-            reposition: function($popup, $attachTo) {
-                return $popup
-                    .css({
-                        zIndex: 10000,
-                        top: $attachTo.offset().top + $attachTo.height() + 10,
-                        left: $attachTo.offset().left - $attachTo.width()
-                    });
-            }
-        }
-    };
-
-    /**
-     * Define notification widget -- this is basically represented in a
-     * notifications icon, that contains a pop-up list of notifications
-     */
-    $.fn.notifications = function(method, args) {
-        var $attachTo = this;
-        var $total = $attachTo.find('div.total span');
-        var $popup;
-
-        var init = function() {
-            $popup = notifications.popup.create($attachTo).appendTo('html body');
-        };
-
-        if (method == 'add')
-            notifications.add(args, $attachTo.data('notifications-popup'), $total);
-        else
-            init();
-
-        return this;
-    };
-
-    /**
-     * Notifications UI helpers
-     */
-    cloudStack.ui.notifications = {
-        add: function(notification, success, successArgs, error, errorArgs) {
-            if (!notification) {
-                success(successArgs);
-
-                return false;
-            };
-
-            var $notifications = $('div.notifications');
-
-            if (!notification.poll) {
-                cloudStack.ui.event.call('addNotification', {
-                    section: notification.section,
-                    desc: notification.desc,
-                    interval: 0,
-                    poll: function(args) {
-                        success(successArgs);
-                        args.complete();
-                    }
-                });
-            } else {
-                cloudStack.ui.event.call('addNotification', {
-                    section: notification.section,
-                    desc: notification.desc,
-                    interval: notification.interval ? notification.interval : g_queryAsyncJobResultInterval,
-                    _custom: notification._custom,
-                    poll: function(args) {
-                        var complete = args.complete;
-                        var notificationError = args.error;
-
-                        notification.poll({
-                            _custom: args._custom,
-                            complete: function(args) {
-                                success($.extend(successArgs, args));
-                                complete(args);
-                            },
-                            error: function(args) {
-                                error($.extend(errorArgs, args));
-                                notificationError(args);
-                            }
-                        });
-                    }
-                });
-            }
-
-            return true;
-        }
-    };
-
-    // Setup notification listener -- accepts same args as
-    $(window).bind('cloudStack.addNotification', function(event, data) {
-        $('.notifications').notifications('add', data);
-    });
-
-    $(document).click(function(event) {
-        var $target = $(event.target);
-        var $attachTo, $popup;
-
-        // Notifications header area
-        if ($target.closest('.notifications').length) {
-            $attachTo = $target.closest('.notifications');
-            $popup = $attachTo.data('notifications-popup');
-            notifications.popup.show($popup, $attachTo);
-
-            return false;
-        }
-
-        // Notification item
-        if ($target.is('.notification-box li span')) {
-            var $li = $target.closest('.notification-box li');
-
-            $('#navigation ul li').filter(function() {
-                return $(this).hasClass($li.data('notification-section'));
-            }).click();
-            $('div.overlay').click();
-
-            return false;
-        }
-
-        // Popup
-        if ($target.closest('div.notification-box').length) {
-            $popup = $target.closest('div.notification-box');
-
-            // Clear list
-            if ($target.closest('.button.clear-list').length) {
-                notifications.clear($popup);
-            }
-
-            // Remove instance item
-            else if ($target.hasClass('remove')) {
-                notifications.removeItem($popup, $target.closest('li'));
-            }
-
-            // Close button
-            else if ($target.closest('.button.close')) {
-                $('div.overlay').click();
-            }
-
-            return false;
-        }
-
-        return true;
-    });
-
-    $(window).resize(function(event) {
-        var $popup = $('div.notification-box:visible');
-
-        if ($popup.length)
-            notifications.popup.reposition($popup, $popup.data('notifications-attach-to'));
-    });
-})(window.jQuery, window.cloudStack, window._l);
diff --git a/ui/legacy/scripts/ui/widgets/overlay.js b/ui/legacy/scripts/ui/widgets/overlay.js
deleted file mode 100644
index 95db303..0000000
--- a/ui/legacy/scripts/ui/widgets/overlay.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($) {
-    /**
-     * Create a dark overlay, for modal dialogs, etc.
-     */
-    $.fn.overlay = function(args) {
-        var $topElem = this;
-        var $overlay = $('<div class="overlay">').hide().appendTo('html body').css({
-            position: 'absolute',
-            background: 'black',
-            opacity: 0.5,
-            width: '100%',
-            height: '100%',
-            top: $(window).scrollTop(),
-            left: 0,
-            zIndex: $topElem.css('z-index') - 1
-        }).show();
-
-        // Events
-        $overlay.click(function(event) {
-            if (!args || !args.closeAction) return false;
-
-            args.closeAction();
-            $overlay.fadeOut(function() {
-                $overlay.remove();
-            });
-        });
-
-        return this;
-    };
-
-    $(window).bind('resize scroll', function() {
-        $('.overlay').css('top', $(window).scrollTop());
-    });
-})(window.jQuery);
diff --git a/ui/legacy/scripts/ui/widgets/tagger.js b/ui/legacy/scripts/ui/widgets/tagger.js
deleted file mode 100644
index 7356dc0..0000000
--- a/ui/legacy/scripts/ui/widgets/tagger.js
+++ /dev/null
@@ -1,306 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function($, cloudStack) {
-    var isFormValid = function($form) {
-        var key = $form.find('input[name=key]').val();
-        var value = $form.find('input[name=value]').val();
-
-        if (!key || !value) {
-            cloudStack.dialog.notice({
-                message: 'message.specifiy.tag.key.value'
-            });
-            return false;
-        }
-
-        if ($form.find('div.field.key').find('label.error').css('display') == 'block' || $form.find('div.field.value').find('label.error').css('display') == 'block')
-            return false;
-
-        return true;
-    };
-
-    var elems = {
-        inputArea: function(args) {
-            var $form = $('<form>').addClass('tag-input');
-            var $keyField = $('<div>').addClass('field key');
-            var $keyLabel = $('<label>').attr('for', 'key').html(_l('label.key') + ':');
-            var $key = $('<input>').addClass('key disallowSpecialCharacters').attr('name', 'key');
-            var $valueField = $('<div>').addClass('field value');
-            var $valueLabel = $('<label>').attr('for', 'value').html(_l('label.value') + ':');
-            var $value = $('<input>').addClass('value disallowSpecialCharacters').attr('name', 'value');
-            var $submit = $('<input>').attr('type', 'submit').val(_l('label.add'));
-
-            $keyField.append($keyLabel, $key);
-            $valueField.append($valueLabel, $value);
-            $form.append($keyField, $valueField, $submit);
-
-            $form.validate();
-
-            $form.submit(
-                args.onSubmit ?
-                function() {
-                    if (!isFormValid($form)) return false;
-
-                    args.onSubmit({
-                        data: cloudStack.serializeForm($form),
-                        response: {
-                            success: function() {
-                                // Restore editing of input
-                                $key.attr('disabled', false);
-                                $value.attr('disabled', false);
-
-                                // Clear out old data
-                                $key.val('');
-                                $value.val('');
-                                $key.focus();
-                            },
-                            error: function() {
-                                // Restore editing of input
-                                $key.attr('disabled', false);
-                                $value.attr('disabled', false);
-                                $key.focus();
-                            }
-                        }
-                    });
-
-                    if (args.isAsyncSubmit) {
-                        // Prevent input during submission
-                        $key.attr('disabled', 'disabled');
-                        $value.attr('disabled', 'disabled');
-                    }
-
-                    return false;
-                } :
-                function() {
-                    return false;
-                }
-            );
-
-            return $form;
-        },
-        tagItem: function(title, onRemove, data) {
-            var $li = $('<li>');
-            var $label = $('<span>').addClass('label');
-            var $remove = $('<span>').addClass('remove').html('X');
-            var $key = $('<span>').addClass('key').html(_s(data.key));
-            var $value = $('<span>').addClass('value').html(_s(data.value));
-
-            $label.append($key, '<span>=</span>', $value);
-            $label.attr('title', title);
-            $label.attr('cloudstack_tag_key', _s(data.key));
-            $label.attr('cloudstack_tag_value', _s(data.value));
-            $remove.click(function() {
-                if (onRemove) onRemove($li, data);
-            });
-
-            $li.append($remove, $label);
-
-            return $li;
-        },
-
-        info: function(text) {
-            var $info = $('<div>').addClass('tag-info');
-            var $text = $('<span>').html(text);
-
-            $text.appendTo($info);
-
-            return $info;
-        }
-    };
-
-    $.widget('cloudStack.tagger', {
-        _init: function(args) {
-            var context = this.options.context;
-            var jsonObj = this.options.jsonObj;
-            var dataProvider = this.options.dataProvider;
-            var actions = this.options.actions;
-            var $container = this.element.addClass('tagger');
-            var $tagArea = $('<ul>').addClass('tags');
-            var $title = elems.info(_l('label.tags')).addClass('title');
-            var $loading = $('<div>').addClass('loading-overlay');
-
-            var onRemoveItem = function($item, data) {
-                $loading.appendTo($container);
-                actions.remove({
-                    context: $.extend(true, {}, context, {
-                        tagItems: [data]
-                    }),
-                    response: {
-                        success: function(args) {
-                            var notification = $.extend(true, {}, args.notification, {
-                                interval: 500,
-                                _custom: args._custom
-                            });
-
-                            cloudStack.ui.notifications.add(
-                                notification,
-
-                                // Success
-
-                                function() {
-                                    $loading.remove();
-                                    $item.remove();
-                                }, {},
-
-                                // Error
-
-                                function() {
-                                    $loading.remove();
-                                }, {}
-                            );
-                        },
-                        error: function(message) {
-                            $loading.remove();
-                            cloudStack.dialog.notice({
-                                message: message
-                            });
-                        }
-                    }
-                });
-            };
-
-            var $inputArea = elems.inputArea({
-                isAsyncSubmit: true,
-                onSubmit: function(args) {
-                    var data = args.data;
-                    var success = args.response.success;
-                    var error = args.response.error;
-                    var title = data.key + ' = ' + data.value;
-
-                    $loading.appendTo($container);
-                    actions.add({
-                        data: data,
-                        context: context,
-                        response: {
-                            success: function(args) {
-                                var notification = $.extend(true, {}, args.notification, {
-                                    interval: 500,
-                                    _custom: args._custom
-                                });
-
-                                cloudStack.ui.notifications.add(
-                                    notification,
-
-                                    // Success
-
-                                    function() {
-                                        $loading.remove();
-                                        elems.tagItem(title, onRemoveItem, data).appendTo($tagArea);
-                                        success();
-                                    }, {},
-
-                                    // Error
-
-                                    function() {
-                                        $loading.remove();
-                                        error();
-                                    }, {}
-                                );
-                            },
-                            error: function(message) {
-                                $loading.remove();
-                                error();
-                                cloudStack.dialog.notice({
-                                    message: message
-                                });
-                            }
-                        }
-                    });
-                }
-            });
-
-            $container.append($title, $inputArea, $tagArea);
-
-            // Get data
-            $loading.appendTo($container);
-            dataProvider({
-                context: context,
-                jsonObj: jsonObj,
-                response: {
-                    success: function(args) {
-                        var data = args.data;
-
-                        $loading.remove();
-                        $(data).map(function(index, item) {
-                            var key = item.key;
-                            var value = item.value;
-                            var data = {
-                                key: key,
-                                value: value
-                            };
-
-                            elems.tagItem(key + ' = ' + value, onRemoveItem, data).appendTo($tagArea);
-                        });
-                    },
-                    error: function(message) {
-                        $loading.remove();
-                        $container.find('ul').html(message);
-                    }
-                }
-            });
-        }
-    });
-
-    $.widget('cloudStack.taggerInForm', {
-        _init: function(args) {
-            var $container = this.element.addClass('tagger');
-            var $tagArea = $('<ul>').addClass('tags');
-            var $title = elems.info(_l('label.tags')).addClass('title inside-form');
-            var $loading = $('<div>').addClass('loading-overlay');
-            var $tags = {};
-
-            var onRemoveItem = function($item, data) {
-                $item.remove();
-                if ($tags[data.key]) delete $tags[data.key];
-                else {
-                    cloudStack.dialog.notice({
-                        message: "Unexpected error occured in attempting deletion"
-                    });
-                }
-            };
-
-            var $inputArea = elems.inputArea({
-                isAsyncSubmit: false,
-                onSubmit: function(args) {
-                    var data = args.data;
-                    if ($tags[data.key]) {
-                        cloudStack.dialog.notice({
-                            message: "Key already present. Please delete previous and add again."
-                        });
-                    } else {
-                        var success = args.response.success;
-                        var title = data.key + ' = ' + data.value;
-                        elems.tagItem(title, onRemoveItem, data).appendTo($tagArea);
-                        success();
-                        $tags[data.key] = data.value;
-                    }
-                }
-            });
-
-            $container.append($title, $inputArea, $tagArea);
-        }
-    });
-
-    cloudStack.getTagsFromForm = function($form) {
-        var tagLabels = $($form).find('.tagger .tags .label');
-        var tags = [];
-        $(tagLabels).each(function() {
-            tags.push({'key' : $(this).attr('cloudstack_tag_key'), 'value' : $(this).attr('cloudstack_tag_value')});
-        });
-        return tags;
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/ui/widgets/toolTip.js b/ui/legacy/scripts/ui/widgets/toolTip.js
deleted file mode 100644
index 65a0550..0000000
--- a/ui/legacy/scripts/ui/widgets/toolTip.js
+++ /dev/null
@@ -1,174 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    $.widget("cloudStack.toolTip", {
-        _init: function(args) {
-            var context = this.options.context;
-            var dataProvider = this.options.dataProvider;
-            var actions = this.options.actions;
-            var docID = this.options.docID;
-            var text = cloudStack.docs[docID].desc;
-            var $tooltip = $('<div>').addClass('tooltip-box');
-            var $text = $('<p>').html(text).appendTo($tooltip);
-            var $container = $('#cloudStack3-container');
-
-            $tooltip.appendTo($container);
-
-            if (this.options.mode == 'hover') {
-                $(this.element).hover(hoverHandler, outHandler);
-            } else if (this.options.mode == 'focus') {
-                $(this.element).focus(hoverHandler);
-                $(this.element).blur(outHandler);
-            } else if (this.options.mode == 'manual') {}
-            
-            $(this.element).data('toolTipOptions', this.options);
-            $(this.element).data('$tooltip', $tooltip);
-
-            // Add arrow
-            $tooltip.append($('<div></div>').addClass('arrow'));
-
-            $tooltip.hide();
-        },
-
-        show: function() {
-            var o = this.options;
-
-            if (o.mode == 'manual') {
-                prepare(this.element, o);
-            }
-
-            $(o.toolTip).show();
-        },
-
-        hide: function() {
-            var o = this.options;
-            $(o.toolTip).hide();
-        }
-    });
-
-    $.extend($.cloudStack.toolTip, {
-        defaults: {
-            toolTip: '',
-            onShow: function(sender) {
-                //Flipping arrow and text
-
-                var $tooltip = $('.tooltip-box');
-
-                //Switch styles based on how close to viewport border
-
-                if ($(window).width() - sender.target.offset().left <= $tooltip.width()) {
-
-                    $('.tooltiptextleft', $tooltip).removeClass('tooltiptextleft').addClass('tooltiptextright');
-                    $('.tooltiparrowleft', $tooltip).removeClass('tooltiparrowleft').addClass('tooltiparrowright');
-
-                } else {
-                    $('.tooltiptextright', $tooltip).removeClass('tooltiptextright').addClass('tooltiptextleft');
-                    $('.tooltiparrowright', $tooltip).removeClass('tooltiparrowright').addClass('tooltiparrowleft');
-                }
-
-            },
-            onHide: undefined,
-            mode: 'hover',
-            // provide a speed for the animation
-            speed: 1000,
-            // provide a period for the popup to keep showing
-            period: 2000,
-            // default the animation algorithm to the basic slide
-            animation: 'slide'
-        },
-        animations: {
-            slide: function(e, options) {
-
-            },
-            fade: function(e, options) {
-
-            }
-        }
-    });
-
-    function hoverHandler(event) {
-        //Element who raised the event
-        var $this = $(this);
-
-        var toolTipOptionObject = $this.data('toolTipOptions');
-        
-
-        //Helper functon for Positioning and Calling Callback function
-        prepare($this, toolTipOptionObject);
-
-        //Call Show method of the tooltip Widget,
-        //Show method should play on any required animations
-        $.data(this, '$tooltip').show();
-    };
-
-    function outHandler(event) {
-        //Element who raised the event
-        var $this = $(this);
-        
-        //Fetch Options
-        var toolTipOptionObject = $this.data('toolTipOptions');
-
-        //Get tooptip Element
-        var $tooltip = $(toolTipOptionObject.toolTip);
-
-        //If call back method defined, initiate the call
-        if (toolTipOptionObject.onHide) {
-            toolTipOptionObject.onHide.call(this, {
-                target: $(this)
-            });
-        }
-
-        //Call Hide method of the tooltip Widget,
-        //Hide method should play on any required animations
-        $.data(this, '$tooltip').hide();
-    };
-
-    function prepare(jObj, options) {
-        var $tooltip = $(options.tooltip);
-        var element = options.attachTo ?
-            jObj.closest(options.attachTo) : jObj;
-        var offset = element.offset();
-
-        var left = offset.left + element.width();
-        var top = offset.top - 5;
-
-        if (options.onShow) {
-            options.onShow.call(this, {
-                target: jObj
-            });
-        }
-
-        if ($(window).width() - offset.left <= $tooltip.width()) {
-            left = offset.left - $tooltip.width();
-        } else {
-            left += 35;
-        }
-        $tooltip.css({
-            position: 'absolute',
-            top: top + 'px',
-            left: left + 'px'
-        });
-
-        // Fix overlay
-        setTimeout(function() {
-            $('.tooltip-box').css( "zIndex", 10000);
-        });
-
-    };
-
-
-})(jQuery, cloudStack);
diff --git a/ui/legacy/scripts/ui/widgets/treeView.js b/ui/legacy/scripts/ui/widgets/treeView.js
deleted file mode 100644
index eb923a9..0000000
--- a/ui/legacy/scripts/ui/widgets/treeView.js
+++ /dev/null
@@ -1,172 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack, _s) {
-    /**
-     * Make <ul> of tree items
-     */
-    var makeTreeList = function(args) {
-        var $treeList = $('<ul>');
-        var $treeView = args.$treeView;
-
-        args.dataProvider({
-            context: $.extend(args.context, {
-                parentDomain: args.parent
-            }),
-            response: {
-                success: function(successArgs) {
-                    $(successArgs.data).each(function() {
-                        var itemData = this;
-
-                        var $li = $('<li>')
-                                .data('tree-view-item-id', this.id)
-                                .data('tree-view-item-obj', this)
-                                .append(
-                                    $('<div>')
-                                        .addClass('expand')
-                                )
-                                .append(
-                                    $('<div>').addClass('name')
-                                        .html(_s(this.name))
-                                )
-                                .appendTo($treeList);
-
-                        $treeView.trigger('cloudStack.treeView.addItem', {
-                            $li: $li,
-                            itemData: itemData
-                        });
-                    });
-                }
-            }
-        });
-
-        return $treeList;
-    };
-
-    /**
-     * Define an infinite 'tree' list
-     */
-    $.fn.treeView = function(args) {
-        var $treeView = $('<div>')
-            .appendTo(this)
-            .addClass('view tree-view');
-        var $toolbar = $('<div>')
-            .addClass('toolbar')
-            .append(
-                $('<div>')
-                .addClass('text-search')
-                .append(
-                    $('<div>')
-                    .addClass('search-bar').attr('style', 'display:none') //no place to show search result in a tree, so hide it for now
-                    .append(
-                        $('<input>').attr('type', 'text')
-                    )
-                )
-                .append(
-                    $('<div>').addClass('button search').attr('style', 'display:none') //no place to show search result in a tree, so hide it for now
-                )
-        )
-            .prependTo($treeView);
-        var treeViewArgs = args.treeView;
-        var $browser = args.$browser;
-
-        if(treeViewArgs.overflowScroll) {
-            $treeView.addClass('overflowScroll');
-        }
-
-        makeTreeList({
-            $treeView: $treeView,
-            parent: null,
-            dataProvider: treeViewArgs.dataProvider,
-            context: args.context
-        }).appendTo($treeView);
-
-        setTimeout(function() {
-            $treeView.find('li:first div.name').click();
-        }, 100);
-
-        this.click(function(event) {
-            var $target = $(event.target);
-            var $li = $target.closest('li');
-
-            if ($target.is('li div.expand') && $li.data('tree-view-item-obj')) {
-                if ($li.find('ul').length) {
-                    $li.find('ul').remove();
-                    $li.removeClass('expanded');
-
-                    $treeView.trigger('cloudStack.treeView.removeItem', {
-                        $li: $li
-                    });
-
-                    return false;
-                }
-
-                makeTreeList({
-                    $treeView: $treeView,
-                    parent: $li.data('tree-view-item-obj'),
-                    dataProvider: treeViewArgs.dataProvider
-                }).appendTo($li);
-                $li.addClass('expanded');
-
-                return false;
-            }
-
-            if ($target.is('li .name')) {
-                $treeView.find('li .name').removeClass('selected');
-                $target.addClass('selected');
-
-                if ($browser && $browser.length) {
-                    $browser.cloudBrowser('addPanel', {
-                        partial: true,
-                        title: $target.html(),
-                        data: '',
-                        parent: $treeView.closest('div.panel'),
-                        complete: function($panel) {
-                            $panel.detailView($.extend(treeViewArgs.detailView, {
-                                id: $li.data('tree-view-item-id'),
-                                $browser: $browser,
-                                context: {
-                                    domains: [$li.data('tree-view-item-obj')]
-                                }
-                            }));
-                        }
-                    });
-                }
-            }
-
-            return true;
-        });
-
-        // Action events
-        $(window).bind('cloudstack.view-item-action', function(event, data) {
-            var actionName = data.actionName;
-            var $li = $treeView.find('li').filter(function() {
-                return $(this).data('tree-view-item-id') == data.id;
-            });
-
-            if (actionName == 'destroy') {
-                $li.animate({
-                    opacity: 0.5
-                });
-                $li.bind('click', function() {
-                    return false;
-                });
-            }
-        });
-
-        return this;
-    };
-})(jQuery, cloudStack, cloudStack.sanitize);
diff --git a/ui/legacy/scripts/vpc.js b/ui/legacy/scripts/vpc.js
deleted file mode 100644
index e221cb4..0000000
--- a/ui/legacy/scripts/vpc.js
+++ /dev/null
@@ -1,4542 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-(function($, cloudStack) {
-    //The drag and drop function to order ACL rules does not have access to the whole ACL.
-    //Therefore, we store the "state-hash" of the list being displayed for use in the drag and drop function.
-    var accessControlListConsistentyHashForDragAndDropFunction = "";
-
-    var isNumeric = function (n) {
-        return !isNaN(parseFloat(n));
-    };
-    var createSafeCsvValue = function(value){
-        if(value){
-            return '"' + value + '"';
-        }
-        return "";
-    };
-    
-    var generateCsvForAclRules = function(aclRules){
-        var csv = createSafeCsvValue('id') + ',';
-        for(var field in aclRuleFields){
-            var fieldLabel = aclRuleFields[field].label;
-            var fieldLabelTranslated = _l(fieldLabel);
-            csv = csv + createSafeCsvValue(fieldLabelTranslated) + ',';
-        }
-        csv = csv.substr(0, csv.length - 1) + '\n';
-        if(!aclRules){
-            return csv;
-        }
-        aclRules.forEach(function(entry){
-            csv = csv + 
-            createSafeCsvValue(entry.id) + ',' + 
-            createSafeCsvValue(entry.number) + ',' +
-            createSafeCsvValue(entry.cidrlist) + ',' +
-            createSafeCsvValue(entry.action) + ',' ;
-            
-            if(isNumeric(entry.protocol)){
-                csv = csv +
-                createSafeCsvValue(_l('label.protocol.number')) + ',' +
-                createSafeCsvValue(entry.protocol) + ',';
-            }else{
-                csv = csv +
-                createSafeCsvValue(entry.protocol) + ',' +
-                createSafeCsvValue('') + ',';
-            }
-            csv = csv +
-            createSafeCsvValue(entry.startport) + ',' +
-            createSafeCsvValue(entry.endport) + ',' +
-            createSafeCsvValue(entry.icmptype) + ',' +
-            createSafeCsvValue(entry.icmpcode) + ',' +
-            createSafeCsvValue(entry.traffictype) + ',' +
-            createSafeCsvValue(entry.reason) + '\n';
-        });
-        return csv;
-    };
-    var assignVMAction = function() {
-        return {
-            label: 'label.assign.vms',
-            messages: {
-                notification: function(args) {
-                    return 'label.assign.vms';
-                }
-            },
-            needsRefresh: true,
-            listView: $.extend(true, {}, cloudStack.sections.instances.listView, {
-                type: 'checkbox',
-                filters: false,
-                multiSelect: false,
-                subselect: {
-                    isMultiple: true,
-                    label: 'label.use.vm.ip',
-                    dataProvider: function(args) {
-                        var instance = args.context.instances[0];
-                        var network = args.context.networks[0];
-
-                        $.ajax({
-                            url: createURL('listNics'),
-                            data: {
-                                virtualmachineid: instance.id,
-                                networkId: network.id
-                            },
-                            success: function(json) {
-                                var nic = json.listnicsresponse.nic[0];
-                                var primaryIp = nic.ipaddress;
-                                var secondaryIps = nic.secondaryip ? nic.secondaryip : [];
-                                var ipSelection = [];
-                                var existingIps = $(args.context.subItemData).map(
-                                    function(index, item) { return item.itemIp; }
-                                );
-
-                                // Add primary IP as default
-                                if ($.inArray(primaryIp, existingIps) == -1) {
-                                    ipSelection.push({
-                                        id: primaryIp,
-                                        description: primaryIp + ' (Primary)'
-                                    });
-                                }
-
-                                // Add secondary IPs
-                                $(secondaryIps).map(function(index, secondaryIp) {
-                                    if ($.inArray(secondaryIp.ipaddress, existingIps) == -1) {
-                                        ipSelection.push({
-                                            id: secondaryIp.ipaddress,
-                                            description: secondaryIp.ipaddress
-                                        });
-                                    }
-                                });
-
-                                args.response.success({
-                                    data: ipSelection
-                                });
-                            }
-                        });
-                    }
-                },
-                dataProvider: function(args) {
-                    var assignedInstances;
-                    $.ajax({
-                        url: createURL('listLoadBalancers'),
-                        data: {
-                            id: args.context.internalLoadBalancers[0].id
-                        },
-                        async: false,
-                        success: function(json) {
-                            assignedInstances = json.listloadbalancersresponse.loadbalancer[0].loadbalancerinstance;
-                            if (assignedInstances == null)
-                                assignedInstances = [];
-                        }
-                    });
-
-                    $.ajax({
-                        url: createURL('listVirtualMachines'),
-                        data: {
-                            networkid: args.context.networks[0].id,
-                            listAll: true
-                        },
-                        success: function(json) {
-                            var instances = json.listvirtualmachinesresponse.virtualmachine;
-
-                            // Pre-select existing instances in LB rule
-                            $(instances).map(function(index, instance) {
-                                instance._isSelected = $.grep(assignedInstances,
-                                                              function(assignedInstance) {
-                                                                  return assignedInstance.id == instance.id;
-                                                              }
-                                                             ).length ? true : false;
-                            });
-
-                            //remove assigned VMs (i.e. instance._isSelected == true)
-                            var items = [];
-                            if (instances != null) {
-                                for (var i = 0; i < instances.length; i++) {
-                                    if (instances[i]._isSelected == true)
-                                        continue;
-                                    else
-                                        items.push(instances[i]);
-                                }
-                            }
-
-                            args.response.success({
-                                data: items
-                            });
-                        }
-                    });
-                }
-            }),
-            action: function(args) {
-                /*
-                 * path 1: Network > VPC (list) > click "Configure" > pick an internal LB tier > click "Internal LB" (list) > click on a grid row (Details tab) > click "Assign VMs" tab > click Assign VMs" button on top of list
-                 * path 2: Network > VPC (list) > click "Configure" > pick an internal LB tier > click "Internal LB" (list) > "QuickView" on a grid row > click "Assign VMs" button in QuickView
-                 */
-                var $rows = $(':ui-dialog .list-view tbody tr');
-                var vms = args.context.instances;
-
-                // Assign subselect values
-                $(vms).each(function() {
-                    var vm = this;
-                    var $vmRow = $rows.filter(function() {
-                        return $(this).data('json-obj') === vm;
-                    });
-                    $.extend(vm, { _subselect: $vmRow.find('.subselect select').val() });
-                });
-
-                var inputData = {
-                    id: args.context.internalLoadBalancers[0].id
-                };
-                /*
-                 * e.g. first VM(xxx) has two IPs(10.1.1.~), second VM(yyy) has three IPs(10.2.2.~):
-                 * vmidipmap[0].vmid=xxx  vmidipmap[0].vmip=10.1.1.11
-                 * vmidipmap[1].vmid=xxx  vmidipmap[1].vmip=10.1.1.12
-                 * vmidipmap[2].vmid=yyy  vmidipmap[2].vmip=10.2.2.77
-                 * vmidipmap[3].vmid=yyy  vmidipmap[3].vmip=10.2.2.78
-                 * vmidipmap[4].vmid=yyy  vmidipmap[4].vmip=10.2.2.79
-                 */
-                var selectedVMs = vms;
-                if (selectedVMs != null) {
-                    var vmidipmapIndex = 0;
-                    for (var vmIndex = 0; vmIndex < selectedVMs.length; vmIndex++) {
-                        var selectedIPs = selectedVMs[vmIndex]._subselect;
-                        for (var ipIndex = 0; ipIndex < selectedIPs.length; ipIndex++) {
-                            inputData['vmidipmap[' + vmidipmapIndex + '].vmid'] = selectedVMs[vmIndex].id;
-
-                            inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex];
-
-                            vmidipmapIndex++;
-                        }
-                    }
-                }
-
-                $.ajax({
-                    url: createURL('assignToLoadBalancerRule'),
-                    data: inputData,
-                    dataType: 'json',
-                    async: true,
-                    success: function(data) {
-                        var jid = data.assigntoloadbalancerruleresponse.jobid;
-                        args.response.success({
-                            _custom: {
-                                jobId: jid
-                            }
-                        });
-                    }
-                });
-            },
-            notification: {
-                poll: pollAsyncJobResult
-            }
-        };
-    };
-
-    var aclRuleFields = {
-            'number': {
-                label: 'label.rule.number.short',
-                desc: 'label.rule.number',
-                edit: true,
-                isEditable: true
-
-            },
-            'cidrlist': {
-                edit: true,
-                label: 'label.cidr',
-                isEditable: true
-            },
-            action: {
-                label: 'label.action',
-                isEditable: true,
-                select: function(args) {
-                    args.response.success({
-                        data: [{
-                            name: 'Allow',
-                            description: 'Allow'
-                        }, {
-                            name: 'Deny',
-                            description: 'Deny'
-                        }]
-                    });
-                }
-            },
-            'protocol': {
-                label: 'label.protocol',
-                isEditable: true,
-                select: function(args) {
-                    var isEditDialog = args.type === 'createForm';
-
-                    args.$select.change(function() {
-                        var $inputs, $icmpFields, $otherFields, $portFields, $protocolFields, $protocolinput;
-
-                        //
-                        // Editing existing rules in createForm dialog
-                        //
-                        if (isEditDialog) {
-                            $inputs = args.$form.find('.form-item');
-                            $icmpFields = $inputs.filter(function() {
-                                var name = $(this).attr('rel');
-
-                                return $.inArray(name, [
-                                    'icmptype',
-                                    'icmpcode'
-                                ]) > -1;
-                            });
-                            $otherFields = $inputs.filter(function() {
-                                var name = $(this).attr('rel');
-
-                                return name != 'protocolnumber' &&
-                                    name != 'icmptype' &&
-                                    name != 'icmpcode' &&
-                                    name != 'cidrlist' &&
-                                    name != 'number';
-                            });
-                            $portFields = $inputs.filter(function() {
-                                var name = $(this).attr('rel');
-                                return $.inArray(name, [
-                                    'startport',
-                                    'endport'
-                                ]) > -1;
-                            });
-                            $protocolFields = $inputs.filter(function() {
-                                var name = $(this).attr('rel');
-
-                                return $.inArray(name, ['protocolnumber']) > -1;
-                            });
-
-                            if ($(this).val() == 'protocolnumber') {
-                                $icmpFields.show();
-                                $portFields.show();
-                                $protocolFields.show();
-                                $portFields.show();
-                            } else if ($(this).val() == 'icmp') {
-                                $icmpFields.show();
-                                $protocolFields.hide();
-                                $portFields.hide();
-                            } else if ($(this).val() == 'all') {
-                                $portFields.hide();
-                                $portFields.attr('disabled', 'disabled');
-                                
-                                $icmpFields.hide();
-                                $icmpFields.attr('disabled', 'disabled');
-                                
-                                $protocolFields.attr('disabled', 'disabled');
-                                $protocolFields.hide();
-                            } else {
-                                $otherFields.show();
-                                $icmpFields.hide();
-                                $protocolFields.hide();
-
-                            }
-                        } else {
-                            //
-                            // Add new form
-                            //
-                            $inputs = args.$form.find('input');
-                            $icmpFields = $inputs.filter(function() {
-                                var name = $(this).attr('name');
-
-                                return $.inArray(name, [
-                                    'icmptype',
-                                    'icmpcode'
-                                ]) > -1;
-                            });
-                            $otherFields = $inputs.filter(function() {
-                                var name = $(this).attr('name');
-
-                                return name != 'protocolnumber' &&
-                                    name != 'icmptype' &&
-                                    name != 'icmpcode' &&
-                                    name != 'cidrlist' &&
-                                    name != 'number';
-                            });
-                            $portFields = $inputs.filter(function() {
-                                var name = $(this).attr('name');
-                                return $.inArray(name, [
-                                    'startport',
-                                    'endport'
-                                ]) > -1;
-                            });
-
-                            $protocolinput = args.$form.find('td input');
-                            $protocolFields = $protocolinput.filter(function() {
-                                var name = $(this).attr('name');
-
-                                return $.inArray(name, ['protocolnumber']) > -1;
-                            });
-
-                            if ($(this).val() == 'protocolnumber') {
-                                $icmpFields.show();
-                                $otherFields.hide();
-                                $protocolFields.show().addClass('required');
-                                $inputs.filter('[name=startport],[name=endport]').show().attr('disabled', false);
-                            } else if ($(this).val() == 'icmp') {
-                                $icmpFields.show();
-                                $icmpFields.attr('disabled', false);
-                                $protocolFields.hide().removeClass('required');
-                                $otherFields.attr('disabled', 'disabled');
-                                $otherFields.hide();
-                                $otherFields.parent().find('label.error').hide();
-                            } else if ($(this).val() == 'all') {
-                                $portFields.hide();
-                                $portFields.attr('disabled', 'disabled');
-
-                                $icmpFields.hide();
-                                $icmpFields.attr('disabled', 'disabled');
-
-                                $protocolFields.hide();
-                                $protocolFields.attr('disabled', 'disabled');
-                            } else {
-                                $otherFields.show();
-                                $otherFields.parent().find('label.error').hide();
-                                $otherFields.attr('disabled', false);
-                                $icmpFields.attr('disabled', 'disabled');
-                                $icmpFields.hide();
-                                $icmpFields.parent().find('label.error').hide();
-                                $protocolFields.hide().removeClass('required');
-                            }
-                        }
-                    });
-
-                    args.response.success({
-                        data: [{
-                                name: 'tcp',
-                                description: 'TCP'
-                            }, {
-                                name: 'udp',
-                                description: 'UDP'
-                            }, {
-                                name: 'icmp',
-                                description: 'ICMP'
-                            }, {
-                                name: 'all',
-                                description: 'ALL'
-                            }, {
-                                name: 'protocolnumber',
-                                description: 'Protocol Number'
-                            }
-
-                        ]
-                    });
-
-                    setTimeout(function() {
-                        args.$select.trigger('change');
-                    }, 100);
-                }
-            },
-
-            'protocolnumber': {
-                label: 'label.protocol.number.short',
-                desc: 'label.protocol.number',
-                edit: true,
-                isEditable: true
-            },
-            'startport': {
-                edit: true,
-                label: 'label.start.port',
-                isOptional: true,
-                isEditable: true
-            },
-            'endport': {
-                edit: true,
-                label: 'label.end.port',
-                isOptional: true,
-                isEditable: true
-            },
-            'icmptype': {
-                edit: true,
-                label: 'ICMP.type',
-                desc: 'ICMP.type.desc',
-                defaultValue: '-1',
-                isEditable: true
-            },
-            'icmpcode': {
-                edit: true,
-                label: 'ICMP.code',
-                desc: 'ICMP.code.desc',
-                defaultValue: '-1',
-                isEditable: true
-            },
-            'traffictype': {
-                label: 'label.traffic.type',
-                isEditable: true,
-                select: function(args) {
-                    args.response.success({
-                        data: [{
-                            name: 'Ingress',
-                            description: 'Ingress'
-                        }, {
-                            name: 'Egress',
-                            description: 'Egress'
-                        }]
-                    });
-                }
-            },
-            'reason': {
-                edit: true,
-                label: 'label.acl.reason',
-                desc: 'label.acl.reason.description',
-                isEditable: true,
-                isTextarea: true
-           }
-    };
-    
-    var aclRuleFieldsForMultiEdit = {
-            'networkid': {
-                label: 'label.select.tier',
-                select: function(args) {
-                    var data = {
-                        listAll: true,
-                        vpcid: args.context.vpc[0].id
-                    };
-
-                    // Only show selected tier, if viewing from detail view
-                    if (args.context.networks &&
-                        args.context.networks[0] &&
-                        args.context.networks[0].vpcid) {
-                        $.extend(data, {
-                            id: args.context.networks[0].id
-                        });
-                    }
-
-                    //  Ajax Call to display the Tiers
-                    $.ajax({
-                        url: createURL('listNetworks'),
-                        data: data,
-                        success: function(json) {
-                            var networks = json.listnetworksresponse.network;
-
-                            args.response.success({
-                                data: $(networks).map(function(index, network) {
-                                    return {
-                                        name: network.id,
-                                        description: network.name
-                                    };
-                                })
-                            });
-                        }
-                    });
-                }
-            },
-    };
-    
-    jQuery.extend(aclRuleFieldsForMultiEdit, aclRuleFields);
-    
-    var aclMultiEdit = {
-    	doNotShowInputTable: true,
-    	editOptionsFirst: true,
-        noSelect: true,
-        reorder: {
-            moveDrag: {
-                action: function(args) {
-                    var rule = args.context.multiRule[0];
-                    
-                    var previousRuleId = args.prevItem ? args.prevItem.id : undefined;
-                    var nextRuleId = args.nextItem ? args.nextItem.id : undefined;
-                     
-                    $.ajax({
-                        url: createURL('moveNetworkAclItem'),
-                        data: {
-                            id: rule.id,
-                            previousaclruleid: previousRuleId, 
-                            nextaclruleid: nextRuleId,
-                            aclconsistencyhash: accessControlListConsistentyHashForDragAndDropFunction
-                        },
-                        success: function(json) {
-                            var pollTimer = setInterval(function() {
-                                pollAsyncJobResult({
-                                    _custom: {
-                                        jobId: json.moveNetworkAclItemResponse.jobid
-                                    },
-                                    complete: function() {
-                                        clearInterval(pollTimer);
-                                        args.response.success();
-                                    },
-                                    error: function(errorMsg) {
-                                        clearInterval(pollTimer);
-                                        args.response.error(errorMsg);
-                                    }
-                                });
-                            }, 1000);
-                        }
-                    });
-                }
-            }
-        },
-        fields: aclRuleFieldsForMultiEdit,
-        tags: cloudStack.api.tags({
-            resourceType: 'NetworkACL',
-            contextId: 'multiRule'
-        }),
-
-        add: {
-            label: 'label.add',
-            action: function(args) {
-                var $multi = args.$multi;
-                //Support for Protocol Number between 0 to 255
-                if (args.data.protocol === 'protocolnumber') {
-                    $.extend(args.data, {
-                        protocol: args.data.protocolnumber
-                    });
-                    delete args.data.protocolnumber;
-                    delete args.data.icmptype;
-                    delete args.data.icmpcode;
-                } else {
-                    delete args.data.protocolnumber;
-                }
-
-                if ((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.startport == "" || args.data.startport == undefined)) {
-                    cloudStack.dialog.notice({
-                        message: _l('Start Port or End Port value should not be blank')
-                    });
-                    $(window).trigger('cloudStack.fullRefresh');
-                } else if ((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.endport == "" || args.data.endport == undefined)) {
-                    cloudStack.dialog.notice({
-                        message: _l('Start Port or End Port value should not be blank')
-                    });
-                    $(window).trigger('cloudStack.fullRefresh');
-                } else {
-                    $.ajax({
-                        url: createURL('createNetworkACL'),
-                        data: $.extend(args.data, {
-                            aclid: args.context.aclLists[0].id
-                        }),
-                        dataType: 'json',
-                        success: function(data) {
-                            args.response.success({
-                                _custom: {
-                                    jobId: data.createnetworkaclresponse.jobid,
-                                    getUpdatedItem: function(json) {
-                                        $(window).trigger('cloudStack.fullRefresh');
-
-                                        return data;
-                                    }
-                                },
-                                notification: {
-                                    label: 'label.add.ACL',
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        },
-                        error: function(data) {
-                            args.response.error(parseXMLHttpResponse(data));
-                        }
-                    });
-                }
-            }
-        },
-        actions: {
-            edit: {
-                label: 'label.edit',
-                action: function(args) {
-                    var data = {
-                        id: args.context.multiRule[0].id,
-                        cidrlist: args.data.cidrlist,
-                        number: args.data.number,
-                        protocol: args.data.protocol,
-                        traffictype: args.data.traffictype,
-                        action: args.data.action,
-                        reason: args.data.reason
-                    };
-
-                    if (data.protocol === 'tcp' || data.protocol === 'udp') {
-                        $.extend(data, {
-                            startport: args.data.startport,
-                            endport: args.data.endport
-                        });
-                    } else if (data.protocol === 'icmp') {
-                        $.extend(data, {
-                            icmptype: args.data.icmptype,
-                            icmpcode: args.data.icmpcode
-                        });
-                    } else if (data.protocol === 'protocolnumber') {
-                        $.extend(data, {
-                            protocol: args.data.protocolnumber,
-                            startport: args.data.startport,
-                            endport: args.data.endport
-                        });
-
-                        delete args.data.protocolnumber;
-                    }
-                    data.partialupgrade = false;
-                    $.ajax({
-                        url: createURL('updateNetworkACLItem'),
-                        data: data,
-                        type: "POST",
-                        success: function(json) {
-                            args.response.success({
-                                _custom: {
-                                    jobId: json.createnetworkaclresponse.jobid
-                                }, // API response obj name needs to be fixed
-                                notification: {
-                                    label: 'label.edit.acl.rule',
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        },
-                        error: function(error) {
-                            args.response.error(parseXMLHttpResponse(error));
-                        }
-                    });
-                }
-            },
-            destroy: {
-                label: 'label.remove.ACL',
-                action: function(args) {
-                    $.ajax({
-                        url: createURL('deleteNetworkACL'),
-                        data: {
-                            id: args.context.multiRule[0].id
-                        },
-                        dataType: 'json',
-                        async: true,
-                        success: function(data) {
-                            var jobID = data.deletenetworkaclresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jobID,
-                                    getUpdatedItem: function() {
-                                        $(window).trigger('cloudStack.fullRefresh');
-                                    }
-                                },
-                                notification: {
-                                    label: 'label.remove.ACL',
-                                    poll: pollAsyncJobResult
-                                }
-                            });
-                        },
-                        error: function(data) {
-                            args.response.error(parseXMLHttpResponse(data));
-                        }
-                    });
-                }
-            }
-        },
-        dataProvider: function(args) {
-            var $multi = args.$multi;
-            var data = {
-                vpcid: args.context.vpc[0].id,
-                listAll: true
-            };
-
-            if (!$multi.data('acl-rules')) {
-                $multi.data('acl-rules', []);
-            }
-
-            if (args.context.networks &&
-                args.context.networks[0] &&
-                args.context.networks[0].vpcid) {
-                data.networkid = args.context.networks[0].id;
-
-                $.ajax({
-                    url: createURL('listNetworkACLs'),
-                    data: data,
-                    dataType: 'json',
-                    async: true,
-                    success: function(json) {
-                        args.response.success({
-                            data: $(json.listnetworkaclsresponse.networkacl).map(function(index, acl) {
-                                return $.extend(acl, {
-                                    networkid: args.context.networks[0].name
-                                });
-                            })
-                        });
-                    },
-                    error: function(XMLHttpResponse) {
-                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                    }
-                });
-            } else {
-                args.response.success({
-                    data: $multi.data('acl-rules')
-                });
-            }
-        }
-    };
-
-    cloudStack.vpc = {
-        // nTier sections
-        sections: {
-            tierVMs: function() {
-                var list = $.extend(true, {}, cloudStack.sections.instances);
-
-                list.listView.actions.add.action.custom = cloudStack.uiCustom.instanceWizard(
-                    $.extend(true, {}, cloudStack.instanceWizard, {
-                        pluginForm: {
-                            name: 'vpcTierInstanceWizard'
-                        }
-                    })
-                );
-
-                return list;
-            },
-
-            tierPortForwarders: function() {
-                return cloudStack.vpc.ipAddresses.listView();
-            },
-
-            tierStaticNATs: function() {
-                return cloudStack.vpc.staticNatIpAddresses.listView();
-            },
-
-            // Internal load balancers
-            internalLoadBalancers: {
-                title: 'label.internal.lb',
-                listView: {
-                    id: 'internalLoadBalancers',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        sourceipaddress: {
-                            label: 'label.source.ip.address'
-                        },
-                        sourceport: {
-                            label: 'label.source.port'
-                        },
-                        instanceport: {
-                            label: 'label.instance.port'
-                        },
-                        algorithm: {
-                            label: 'label.algorithm'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {
-                            page: args.page,
-                            pageSize: pageSize,
-                            networkid: args.context.networks[0].id,
-                            listAll: true
-                        };
-                        var keyword = (((args || {}).filterBy || {}).search || {}).value;
-                        if (keyword) {
-                            data.keyword = keyword;
-                        }
-                        $.ajax({
-                            url: createURL('listLoadBalancers'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listloadbalancersresponse.loadbalancer;
-                                if (items != null) {
-                                    for (var i = 0; i < items.length; i++) {
-                                        var item = items[i];
-                                        //there is only one element in loadbalancerrul array property.
-                                        item.sourceport = item.loadbalancerrule[0].sourceport;
-                                        item.instanceport = item.loadbalancerrule[0].instanceport;
-                                    }
-                                }
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-                    actions: {
-                        add: {
-                            label: 'label.add.internal.lb',
-                            createForm: {
-                                title: 'label.add.internal.lb',
-                                fields: {
-                                    name: {
-                                        label: 'label.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-                                    sourceipaddress: {
-                                        label: 'label.source.ip.address',
-                                        validation: {
-                                            required: false
-                                        }
-                                    },
-                                    sourceport: {
-                                        label: 'label.source.port',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    instanceport: {
-                                        label: 'label.instance.port',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    algorithm: {
-                                        label: 'label.algorithm',
-                                        validation: {
-                                            required: true
-                                        },
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    id: 'source',
-                                                    description: _l('label.lb.algorithm.source')
-                                                }, {
-                                                    id: 'roundrobin',
-                                                    description: _l('label.lb.algorithm.roundrobin')
-                                                }, {
-                                                    id: 'leastconn',
-                                                    description: _l('label.lb.algorithm.leastconn')
-                                                }]
-                                            });
-                                        }
-                                    }
-                                }
-                            },
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.internal.lb';
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.name,
-                                    sourceport: args.data.sourceport,
-                                    instanceport: args.data.instanceport,
-                                    algorithm: args.data.algorithm,
-                                    networkid: args.context.networks[0].id,
-                                    sourceipaddressnetworkid: args.context.networks[0].id,
-                                    scheme: 'Internal'
-                                };
-                                if (args.data.description != null && args.data.description.length > 0) {
-                                    $.extend(data, {
-                                        description: args.data.description
-                                    });
-                                }
-                                if (args.data.sourceipaddress != null && args.data.sourceipaddress.length > 0) {
-                                    $.extend(data, {
-                                        sourceipaddress: args.data.sourceipaddress
-                                    });
-                                }
-                                $.ajax({
-                                    url: createURL('createLoadBalancer'),
-                                    data: data,
-                                    success: function(json) {
-                                        var jid = json.createloadbalancerresponse.jobid;
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: jid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.loadbalancer;
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        isMaximized: true,
-                        name: 'label.internal.lb.details',
-                        actions: {
-                            assignVMs: assignVMAction(),
-
-                            remove: {
-                                label: 'label.delete.internal.lb',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.delete.internal.lb';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.delete.internal.lb';
-                                    }
-                                },
-                                action: function(args) {
-                                    var data = {
-                                        id: args.context.internalLoadBalancers[0].id
-                                    };
-                                    $.ajax({
-                                        url: createURL('deleteLoadBalancer'),
-                                        data: data,
-                                        async: true,
-                                        success: function(json) {
-                                            var jid = json.deleteloadbalancerresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid
-                                                }
-                                            });
-                                        },
-                                        error: function(data) {
-                                            args.response.error(parseXMLHttpResponse(data));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name'
-                                    }
-                                }, {
-                                    id: {
-                                        label: 'label.id'
-                                    },
-                                    description: {
-                                        label: 'label.description'
-                                    },
-                                    sourceipaddress: {
-                                        label: 'label.source.ip.address'
-                                    },
-                                    sourceport: {
-                                        label: 'label.source.port'
-                                    },
-                                    instanceport: {
-                                        label: 'label.instance.port'
-                                    },
-                                    algorithm: {
-                                        label: 'label.algorithm'
-                                    },
-                                    loadbalancerinstance: {
-                                        label: 'label.assigned.vms',
-                                        converter: function(objArray) {
-                                            var s = '';
-                                            if (objArray != null) {
-                                                for (var i = 0; i < objArray.length; i++) {
-                                                    if (i > 0) {
-                                                        s += ', ';
-                                                    }
-                                                    s += objArray[i].name + ' (' + objArray[i].ipaddress + ')';
-                                                }
-                                            }
-                                            return s;
-                                        }
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    $.ajax({
-                                        url: createURL('listLoadBalancers'),
-                                        data: {
-                                            id: args.context.internalLoadBalancers[0].id
-                                        },
-                                        success: function(json) {
-                                            var item = json.listloadbalancersresponse.loadbalancer[0];
-
-                                            //remove Rules tab and add sourceport, instanceport at Details tab because there is only one element in loadbalancerrul array property.
-                                            item.sourceport = item.loadbalancerrule[0].sourceport;
-                                            item.instanceport = item.loadbalancerrule[0].instanceport;
-
-                                            args.response.success({
-                                                data: item
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-                            assignedVms: {
-                                title: 'label.assigned.vms',
-                                listView: {
-                                    id: 'assignedVms',
-                                    fields: {
-                                        name: {
-                                            label: 'label.name'
-                                        },
-                                        ipaddress: {
-                                            label: 'label.ip.address'
-                                        }
-                                    },
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('listLoadBalancers'),
-                                            data: {
-                                                id: args.context.internalLoadBalancers[0].id
-                                            },
-                                            success: function(json) {
-                                                var item = json.listloadbalancersresponse.loadbalancer[0];
-                                                args.response.success({
-                                                    data: item.loadbalancerinstance
-                                                });
-                                            }
-                                        });
-                                    },
-                                    actions: {
-                                        add: assignVMAction()
-                                    },
-                                    detailView: {
-                                        actions: {
-                                            remove: {
-                                                label: 'label.remove.vm.load.balancer',
-                                                addRow: 'false',
-                                                messages: {
-                                                    confirm: function(args) {
-                                                        return 'message.confirm.remove.load.balancer';
-                                                    },
-                                                    notification: function(args) {
-                                                        return 'label.remove.vm.load.balancer';
-                                                    }
-                                                },
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('removeFromLoadBalancerRule'),
-                                                        data: {
-                                                            id: args.context.internalLoadBalancers[0].id,
-                                                            virtualmachineids: args.context.assignedVms[0].id
-                                                        },
-                                                        success: function(json) {
-                                                            var jid = json.removefromloadbalancerruleresponse.jobid;
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: jid
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                },
-                                                notification: {
-                                                    poll: pollAsyncJobResult
-                                                }
-                                            }
-                                        },
-                                        tabs: {
-                                            details: {
-                                                title: 'label.details',
-                                                fields: [{
-                                                    name: {
-                                                        label: 'label.name'
-                                                    }
-                                                }, {
-                                                    ipaddress: {
-                                                        label: 'label.ip.address'
-                                                    }
-                                                }],
-                                                dataProvider: function(args) {
-                                                    setTimeout(function() {
-                                                        args.response.success({
-                                                            data: args.context.assignedVms[0]
-                                                        });
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            publicLbIps: {
-                title: 'label.public.ip',
-                listView: {
-                    id: 'publicLbIps',
-                    fields: {
-                        ipaddress: {
-                            label: 'label.ips',
-                            converter: function(text, item) {
-                                if (item.issourcenat) {
-                                    return text + ' [' + _l('label.source.nat') + ']';
-                                }
-
-                                return text;
-                            }
-                        },
-                        zonename: {
-                            label: 'label.zone'
-                        },
-                        virtualmachinedisplayname: {
-                            label: 'label.vm.name'
-                        },
-                        state: {
-                            converter: function(str) {
-                                // For localization
-                                return str;
-                            },
-                            label: 'label.state',
-                            indicator: {
-                                'Allocated': 'on',
-                                'Released': 'off'
-                            }
-                        }
-                    },
-                    dataProvider: function(args) {
-                        $.ajax({
-                            url: createURL('listPublicIpAddresses'),
-                            async: false,
-                            data: {
-                                associatednetworkid: args.context.networks[0].id,
-                                forloadbalancing: true,
-                                listall: true
-                            },
-                            success: function(json) {
-                                var items = json.listpublicipaddressesresponse.publicipaddress;
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    }
-                }
-            },
-
-            // Private gateways
-            privateGateways: function() {
-                return cloudStack.vpc.gateways.listView()
-            },
-
-            // Public IP Addresses
-            publicIPs: function() {
-                return cloudStack.vpc.ipAddresses.listView()
-            },
-
-            // Network ACL lists
-            networkACLLists: {
-                listView: {
-                    id: 'aclLists',
-                    fields: {
-                        name: {
-                            label: 'label.name'
-                        },
-                        description: {
-                            label: 'label.description'
-                        },
-                        id: {
-                            label: 'label.id'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        var data = {
-                            vpcid: args.context.vpc[0].id
-                        };
-                        listViewDataProvider(args, data);
-
-                        $.ajax({
-                            url: createURL('listNetworkACLLists'),
-                            data: data,
-                            success: function(json) {
-                                var items = json.listnetworkacllistsresponse.networkacllist;
-
-                                args.response.success({
-                                    data: items
-                                });
-                            }
-                        });
-                    },
-
-                    actions: {
-                        add: {
-                            label: 'label.add.acl.list',
-                            createForm: {
-                                label: 'label.add.acl.list',
-                                fields: {
-                                    name: {
-                                        label: 'label.add.list.name',
-                                        validation: {
-                                            required: true
-                                        }
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        validation: {
-                                            required: true
-                                        }
-                                    }
-                                }
-                            },
-                            messages: {
-                                notification: function(args) {
-                                    return 'label.add.network.acl.list';
-                                }
-                            },
-                            action: function(args) {
-                                var data = {
-                                    name: args.data.name,
-                                    description: args.data.description
-
-                                };
-
-                                $.ajax({
-                                    url: createURL('createNetworkACLList&vpcid=' + args.context.vpc[0].id),
-                                    data: data,
-                                    success: function(json) {
-                                        args.response.success({
-                                            _custom: {
-                                                jobId: json.createnetworkacllistresponse.jobid,
-                                                getUpdatedItem: function(json) {
-                                                    return json.queryasyncjobresultresponse.jobresult.networkacllist;
-                                                }
-                                            }
-                                        });
-                                    }
-                                });
-                            },
-                            notification: {
-                                poll: pollAsyncJobResult
-                            }
-                        }
-                    },
-
-                    detailView: {
-                        isMaximized: true,
-                        actions: {
-                            remove: {
-                                label: 'label.delete.acl.list',
-                                messages: {
-                                    confirm: function(args) {
-                                        return 'message.confirm.delete.acl.list';
-                                    },
-                                    notification: function(args) {
-                                        return 'label.delete.acl.list';
-                                    }
-                                },
-                                action: function(args) {
-                                    $.ajax({
-                                        url: createURL('deleteNetworkACLList&id=' + args.context.aclLists[0].id),
-                                        success: function(json) {
-                                            var jid = json.deletenetworkacllistresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function() {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            },
-                            edit: {
-                                label: 'label.edit.acl.list',
-                                action: function(args) {
-                                    var data = args.data;
-                                    data.id = args.context.aclLists[0].id;
-                                    $.ajax({
-                                        url: createURL('updateNetworkACLList'),
-                                        type: "POST",
-                                        data: data,
-                                        success: function(json) {
-                                            var jid = json.updatenetworkacllistresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function() {
-                                                        $(window).trigger('cloudStack.fullRefresh');
-                                                        jQuery('div[id=breadcrumbs] ul:visible li span').last().html(data.name);
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult,
-                                    desc: 'label.edit.acl.list'
-                                }
-                            }
-                        },
-
-                        tabs: {
-                            details: {
-                                title: 'label.details',
-                                fields: [{
-                                    name: {
-                                        label: 'label.name',
-                                        isEditable: true
-                                    },
-                                    description: {
-                                        label: 'label.description',
-                                        isEditable: true  
-                                    },
-                                    id: {
-                                        label: 'label.id'
-                                    }
-                                }],
-                                dataProvider: function(args) {
-                                    var items = args.context.aclLists[0];
-                                    setTimeout(function() {
-                                        args.response.success({
-                                            data: items,
-                                            actionFilter: function(args) {
-                                                var allowedActions = [];
-                                                if (items.vpcid != null) {
-                                                    allowedActions.push("remove");
-                                                    allowedActions.push("edit");
-                                                }
-                                                return allowedActions;
-                                            }
-                                        });
-                                    });
-                                }
-                            },
-
-                            aclRules: {
-                                title: 'label.acl.list.rules',
-                                custom: function(args) {
-                                    return $('<div>').multiEdit($.extend(true, {}, aclMultiEdit, {
-                                        context: args.context,
-                                        fields: {
-                                            networkid: false
-                                        },
-                                        dataProvider: function(args) {
-                                            var aclListId = args.context.aclLists[0].id;
-                                            $.ajax({
-                                                url: createURL('listNetworkACLs&aclid=' + aclListId),
-                                                success: function(json) {
-                                                    var items = json.listnetworkaclsresponse.networkacl;
-
-                                                    if(items){
-                                                        items.sort(function(a, b) {
-                                                            return a.number - b.number;
-                                                        }).map(function(acl) {
-                                                            if (parseInt(acl.protocol)) { // protocol number
-                                                                acl.protocolnumber = acl.protocol;
-                                                                acl.protocol = "protocolnumber";
-                                                            }
-    
-                                                            return acl;
-                                                        });
-                                                        var allUuids = '';
-                                                        items.forEach(function(aclRule){
-                                                                            allUuids += aclRule.id;
-                                                                      });
-                                                        accessControlListConsistentyHashForDragAndDropFunction = $.md5(allUuids);
-                                                    }
-
-                                                    args.response.success({
-                                                        data: items
-                                                    });
-                                                    if(jQuery('#details-tab-aclRules').siblings('div.toolbar').children('div.add').length === 0){
-                                                        var $addAclRuleDivButton = jQuery('<div>').addClass('button add');
-                                                        var $spanAddAclRuleButtonMessage = jQuery('<span>').html(_l('label.add.ACL'));
-                                                        
-                                                        $addAclRuleDivButton.html($spanAddAclRuleButtonMessage);
-                                                        $addAclRuleDivButton.click(function(){
-                                                        	cloudStack.dialog.createForm({
-                                                        		 form: {
-                                                                     title: 'label.add.rule',
-                                                                     desc: 'label.add.rule.desc',
-                                                                     fields: aclRuleFields
-                                                                 },
-                                                                 after: function(argsLocal) {
-                                                                	 var data = argsLocal.data;
-                                                                	 data.aclid = argsLocal.context.aclLists[0].id;
-                                                                	 if(data.protocol != 'icmp'){
-                                                                		 data.icmpcode = undefined;
-                                                                		 data.icmptype  = undefined;
-                                                                	 }
-                                                                	 if(data.protocol != 'protocolnumber'){
-                                                                		 data.protocolnumber = undefined;
-                                                                	 }else{
-                                                                	     data.protocol = data.protocolnumber;
-                                                                	     data.protocolnumber = undefined;
-                                                                	 }
-                                                                	 if(data.protocol === 'all'){
-                                                                		 data.startport = undefined;
-                                                                		 data.endport = undefined;
-                                                                	 }
-                                                                     $.ajax({
-                                                                         url: createURL('createNetworkACL'),
-                                                                         data: argsLocal.data,
-                                                                         type: "POST",
-                                                                         success: function(json) {
-                                                                        	 jQuery('button.cancel:visible').click();
-                                                                        	 jQuery('div.toolbar:visible div.refresh').click();
-                                                                         }
-                                                                     });
-                                                                 },
-                                                                 context: args.context
-                                                        	});
-                                                        });
-                                                        jQuery('#details-tab-aclRules').siblings('div.toolbar').append($addAclRuleDivButton);
-                                                    }
-                                                    if(jQuery('#details-tab-aclRules').siblings('div.toolbar').children('div.export').length === 0){
-                                                        var $exportAclsDivButton = jQuery('<div>').addClass('button export');
-                                                        var $linkExportAclRulesButtonMessage = jQuery('<a>').html(_l('label.acl.export'));
-                                                        
-                                                        $exportAclsDivButton.html($linkExportAclRulesButtonMessage);
-                                                        $exportAclsDivButton.click(function(){
-                                                            
-                                                            $.ajax({
-                                                                url: createURL('listNetworkACLs&aclid=' + aclListId),
-                                                                type: "GET",
-                                                                async: false,
-                                                                success: function(json) {
-                                                                    var acls = json.listnetworkaclsresponse.networkacl;
-                                                                    var csv = generateCsvForAclRules(acls);
-                                                                    
-                                                                    window.URL = window.URL || window.webkiURL;
-                                                                    var blob = new Blob([csv]);
-                                                                    var blobURL = window.URL.createObjectURL(blob);
-                                                                    
-                                                                    $linkExportAclRulesButtonMessage.attr("href", blobURL);
-                                                                    $linkExportAclRulesButtonMessage.attr("download", "aclRules.csv");
-                                                                }
-                                                            });
-                                                        });
-                                                        jQuery('#details-tab-aclRules').siblings('div.toolbar').append($exportAclsDivButton);
-                                                    }
-                                                }
-                                            });
-                                        }
-                                    }));
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            siteToSiteVPNs: function() {
-                return $.extend(true, {}, cloudStack.vpc.siteToSiteVPN, {
-                    // siteToSiteVPN is multi-section so doesn't have an explicit
-                    // 'listView' block
-                    //
-                    // -- use this as a flag for VPC chart to render as a list view
-                    listView: true,
-                    before: {
-                        messages: {
-                            confirm: 'Please confirm that you would like to create a site-to-site VPN gateway for this VPC.',
-                            notification: 'Create site-to-site VPN gateway'
-                        },
-                        check: function(args) {
-                            var items;
-
-                            $.ajax({
-                                url: createURL('listVpnGateways&listAll=true'),
-                                data: {
-                                    vpcid: args.context.vpc[0].id
-                                },
-                                success: function(json) {
-                                    var items = json.listvpngatewaysresponse.vpngateway;
-
-                                    args.response.success(items && items.length);
-                                }
-                            });
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("createVpnGateway"),
-                                data: {
-                                    vpcid: args.context.vpc[0].id
-                                },
-                                success: function(json) {
-                                    var jid = json.createvpngatewayresponse.jobid;
-                                    var pollTimer = setInterval(function() {
-                                        pollAsyncJobResult({
-                                            _custom: {
-                                                jobId: jid
-                                            },
-                                            complete: function() {
-                                                clearInterval(pollTimer);
-                                                args.response.success();
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        }
-                    }
-                });
-            }
-        },
-
-        routerDetailView: function() {
-            return {
-                title: 'label.VPC.router.details',
-                updateContext: function(args) {
-                    var router;
-
-                    $.ajax({
-                        url: createURL("listRouters&listAll=true&vpcid=" + args.context.vpc[0].id),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            router = json.listroutersresponse.router[0];
-                        }
-                    });
-
-                    return {
-                        routers: [router]
-                    };
-                },
-                actions: cloudStack.sections.system.subsections.virtualRouters
-                    .listView.detailView.actions,
-                tabs: {
-                    routerDetails: cloudStack.sections.network.sections.vpc
-                        .listView.detailView.tabs.router
-                }
-            };
-        },
-        vmListView: {
-            id: 'vpcTierInstances',
-            listView: {
-                filters: {
-                    all: {
-                        label: 'label.menu.all.instances'
-                    },
-                    running: {
-                        label: 'label.menu.running.instances'
-                    },
-                    stopped: {
-                        label: 'label.menu.stopped.instances'
-                    },
-                    destroyed: {
-                        label: 'label.menu.destroyed.instances'
-                    }
-                },
-                fields: {
-                    name: {
-                        label: 'label.name',
-                        editable: true
-                    },
-                    account: {
-                        label: 'label.account'
-                    },
-                    zonename: {
-                        label: 'label.zone'
-                    },
-                    state: {
-                        label: 'label.status',
-                        indicator: {
-                            'Running': 'on',
-                            'Stopped': 'off',
-                            'Destroyed': 'off'
-                        }
-                    }
-                },
-
-                // List view actions
-                actions: {
-                    start: {
-                        label: 'label.action.start.instance',
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("startVirtualMachine&id=" + args.context.vpcTierInstances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.startvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return cloudStack.actionFilter.vmActionFilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.start.instance';
-                            },
-                            notification: function(args) {
-                                return 'label.action.start.instance';
-                            },
-                            complete: function(args) {
-                                if (args.password != null) {
-                                    cloudStack.dialog.notice({
-                                        message: 'Password of the VM is ' + args.password
-                                    });
-                                }
-                                return 'label.action.start.instance';
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    stop: {
-                        label: 'label.action.stop.instance',
-                        addRow: 'false',
-                        createForm: {
-                            title: 'label.action.stop.instance',
-                            desc: 'message.action.stop.instance',
-                            fields: {
-                                forced: {
-                                    label: 'force.stop',
-                                    isBoolean: true,
-                                    isChecked: false
-                                }
-                            }
-                        },
-                        action: function(args) {
-                            var array1 = [];
-                            array1.push("&forced=" + (args.data.forced == "on"));
-                            $.ajax({
-                                url: createURL("stopVirtualMachine&id=" + args.context.vpcTierInstances[0].id + array1.join("")),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.stopvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return cloudStack.actionFilter.vmActionFilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.stop.instance';
-                            },
-
-                            notification: function(args) {
-                                return 'label.action.stop.instance';
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    restart: {
-                        label: 'instances.actions.reboot.label',
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("rebootVirtualMachine&id=" + args.context.vpcTierInstances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.rebootvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return cloudStack.actionFilter.vmActionFilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.reboot.instance';
-                            },
-                            notification: function(args) {
-                                return 'instances.actions.reboot.label';
-                            }
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    destroy: {
-                        label: 'label.action.destroy.instance',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.destroy.instance';
-                            },
-                            notification: function(args) {
-                                return 'label.action.destroy.instance';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("destroyVirtualMachine&id=" + args.context.vpcTierInstances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.destroyvirtualmachineresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.virtualmachine;
-                                            },
-                                            getActionFilter: function() {
-                                                return cloudStack.actionFilter.vmActionFilter;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-                    restore: {
-                        label: 'label.action.restore.instance',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.restore.instance';
-                            },
-                            notification: function(args) {
-                                return 'label.action.restore.instance';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("recoverVirtualMachine&id=" + args.context.vpcTierInstances[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var item = json.recovervirtualmachineresponse.virtualmachine;
-                                    args.response.success({
-                                        data: item
-                                    });
-                                }
-                            });
-                        }
-                    },
-                    viewConsole: {
-                        label: 'label.view.console',
-                        action: {
-                            externalLink: {
-                                url: function(args) {
-                                    return clientConsoleUrl + '?cmd=access&vm=' + args.context.vpcTierInstances[0].id;
-                                },
-                                title: function(args) {
-                                    return args.context.vpcTierInstances[0].id.substr(0, 8); //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
-                                },
-                                width: 820,
-                                height: 640
-                            }
-                        }
-                    }
-                },
-                dataProvider: function(args) {
-                    var array1 = [];
-                    if (args.filterBy != null) {
-                        if (args.filterBy.kind != null) {
-                            switch (args.filterBy.kind) {
-                                case "all":
-                                    array1.push("&listAll=true");
-                                    break;
-                                case "mine":
-                                    if (!args.context.projects) array1.push("&domainid=" + g_domainid + "&account=" + g_account);
-                                    break;
-                                case "running":
-                                    array1.push("&listAll=true&state=Running");
-                                    break;
-                                case "stopped":
-                                    array1.push("&listAll=true&state=Stopped");
-                                    break;
-                                case "destroyed":
-                                    array1.push("&listAll=true&state=Destroyed");
-                                    break;
-                            }
-                        }
-                        if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                            switch (args.filterBy.search.by) {
-                                case "name":
-                                    if (args.filterBy.search.value.length > 0)
-                                        array1.push("&keyword=" + args.filterBy.search.value);
-                                    break;
-                            }
-                        }
-                    }
-
-                    $.ajax({
-                        url: createURL('listVirtualMachines' + array1.join("")),
-                        data: {
-                            networkid: args.context.networks[0].id
-                        },
-                        success: function(json) {
-                            args.response.success({
-                                data: json.listvirtualmachinesresponse.virtualmachine,
-                                actionFilter: cloudStack.actionFilter.vmActionFilter
-                            });
-                        }
-                    });
-                }
-            }
-        },
-        ipAddresses: {
-            listView: function() {
-                var listView = $.extend(true, {}, cloudStack.sections.network.sections.ipAddresses);
-
-                listView.listView.fields = {
-                    ipaddress: listView.listView.fields.ipaddress,
-                    zonename: listView.listView.fields.zonename,
-                    associatednetworkname: {
-                        label: 'label.network.name'
-                    },
-                    state: listView.listView.fields.state
-                };
-
-                return listView;
-            }
-        },
-        staticNatIpAddresses: {
-            listView: function() {
-                var listView = $.extend(true, {}, cloudStack.sections.network.sections.ipAddresses);
-
-                listView.listView.fields = {
-                    ipaddress: listView.listView.fields.ipaddress,
-                    zonename: listView.listView.fields.zonename,
-                    associatednetworkname: {
-                        label: 'label.network.name'
-                    },
-                    state: listView.listView.fields.state
-                };
-
-                listView.listView.dataProvider = function(args) {
-                    $.ajax({
-                        url: createURL('listPublicIpAddresses'),
-                        data: {
-                            associatednetworkid: args.context.networks[0].id,
-                            isstaticnat: true,
-                            listall: true
-                        },
-                        success: function(json) {
-                            args.response.success({
-                                data: json.listpublicipaddressesresponse.publicipaddress
-                            });
-                        },
-                        error: function(json) {
-                            args.response.error(parseXMLHttpResponse(json));
-                        }
-                    });
-                };
-
-                return listView;
-            }
-        },
-        acl: {
-            multiEdit: aclMultiEdit,
-
-            listView: {
-                listView: {
-                    id: 'networks',
-                    fields: {
-                        tierName: {
-                            label: 'label.tier'
-                        },
-                        aclTotal: {
-                            label: 'label.network.ACL.total'
-                        }
-                    },
-                    dataProvider: function(args) {
-                        $.ajax({
-                            url: createURL('listNetworks'),
-                            data: {
-                                listAll: true,
-                                vpcid: args.context.vpc[0].id
-                            },
-                            success: function(json) {
-                                var networks = json.listnetworksresponse.network ?
-                                    json.listnetworksresponse.network : [];
-
-                                args.response.success({
-                                    data: $.map(networks, function(tier) {
-                                        var aclTotal = 0;
-
-                                        // Get ACL total
-                                        $.ajax({
-                                            url: createURL('listNetworkACLs'),
-                                            async: false,
-                                            data: {
-                                                listAll: true,
-                                                networkid: tier.id
-                                            },
-                                            success: function(json) {
-                                                aclTotal = json.listnetworkaclsresponse.networkacl ?
-                                                    json.listnetworkaclsresponse.networkacl.length : 0;
-                                            }
-                                        });
-
-                                        return $.extend(tier, {
-                                            tierName: tier.name,
-                                            aclTotal: aclTotal
-                                        });
-                                    })
-                                });
-                            }
-                        });
-                    }
-                }
-            }
-        },
-        gateways: {
-
-            add: {
-                preCheck: function(args) {
-                    if (isAdmin()) { //root-admin
-                        var items;
-                        $.ajax({
-                            url: createURL('listPrivateGateways'),
-                            async: false,
-                            data: {
-                                vpcid: args.context.vpc[0].id,
-                                listAll: true
-                            },
-                            success: function(json) {
-                                items = json.listprivategatewaysresponse.privategateway;
-                            }
-                        });
-                        if (items && items.length) {
-                            return true; //show private gateway listView
-                        } else {
-                            return false; //show create private gateway dialog
-                        }
-                    } else { //regular-user, domain-admin
-                        return true; //show private gateway listView instead of create private gateway dialog because only root-admin is allowed to create private gateway
-                    }
-                },
-                label: 'label.add.new.gateway',
-                messages: {
-                    notification: function(args) {
-                        return 'label.add.new.gateway';
-                    }
-                },
-                createForm: {
-                    title: 'label.add.new.gateway',
-                    desc: 'message.add.new.gateway.to.vpc',
-                    fields: {
-                        physicalnetworkid: {
-                            docID: 'helpVPCGatewayPhysicalNetwork',
-                            label: 'label.physical.network',
-                            select: function(args) {
-                                $.ajax({
-                                    url: createURL("listPhysicalNetworks"),
-                                    data: {
-                                        zoneid: args.context.vpc[0].zoneid
-                                    },
-                                    success: function(json) {
-                                        var objs = json.listphysicalnetworksresponse.physicalnetwork;
-                                        var items = [];
-                                        $(objs).each(function() {
-                                            items.push({
-                                                id: this.id,
-                                                description: this.name
-                                            });
-                                        });
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    }
-                                });
-                            }
-                        },
-                        vlan: {
-                            label: 'label.vlan',
-                            validation: {
-                                required: true
-                            },
-                            docID: 'helpVPCGatewayVLAN'
-                        },
-                        bypassVlanOverlapCheck: {
-                            label: 'label.bypass.vlan.overlap.check',
-                            isBoolean: true
-                        },
-                        ipaddress: {
-                            label: 'label.ip.address',
-                            validation: {
-                                required: true
-                            },
-                            docID: 'helpVPCGatewayIP'
-                        },
-                        gateway: {
-                            label: 'label.gateway',
-                            validation: {
-                                required: true
-                            },
-                            docID: 'helpVPCGatewayGateway'
-                        },
-                        netmask: {
-                            label: 'label.netmask',
-                            validation: {
-                                required: true
-                            },
-                            docID: 'helpVPCGatewayNetmask'
-                        },
-                        sourceNat: {
-                            label: 'label.source.nat',
-                            isBoolean: true,
-                            isChecked: false
-
-                        },
-
-                        aclid: {
-                            label: 'label.acl',
-                            select: function(args) {
-                                $.ajax({
-                                    url: createURL('listNetworkACLLists'),
-                                    dataType: 'json',
-                                    async: true,
-                                    success: function(json) {
-                                        var objs = json.listnetworkacllistsresponse.networkacllist;
-                                        var items = [];
-                                        $(objs).each(function() {
-                                            if (this.name == "default_deny")
-                                                items.unshift({
-                                                    id: this.id,
-                                                    description: this.name
-                                                });
-                                            else
-                                                items.push({
-                                                    id: this.id,
-                                                    description: this.name
-                                                });
-
-
-                                        });
-                                        args.response.success({
-                                            data: items
-                                        });
-                                    }
-                                });
-
-                            }
-                        }
-                    }
-                },
-                action: function(args) {
-                    var array1 = [];
-                    if (args.$form.find('.form-item[rel=sourceNat]').find('input[type=checkbox]').is(':Checked') == true) {
-                        array1.push("&sourcenatsupported=true");
-                    } else
-                        array1.push("&sourcenatsupported=false");
-
-                    if (args.$form.find('.form-item[rel=bypassVlanOverlapCheck]').css("display") != "none") {
-                        array1.push("&bypassVlanOverlapCheck=" + encodeURIComponent((args.data.bypassVlanOverlapCheck == "on")));
-                    }
-
-                    $.ajax({
-                        url: createURL('createPrivateGateway' + array1.join("")),
-                        data: {
-                            physicalnetworkid: args.data.physicalnetworkid,
-                            vpcid: args.context.vpc[0].id,
-                            ipaddress: args.data.ipaddress,
-                            gateway: args.data.gateway,
-                            netmask: args.data.netmask,
-                            vlan: args.data.vlan,
-                            aclid: args.data.aclid
-
-                        },
-                        success: function(json) {
-                            var jid = json.createprivategatewayresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        return json.queryasyncjobresultresponse.jobresult.privategateway;
-                                    }
-                                }
-                            });
-                        },
-                        error: function(json) {
-                            args.response.error(parseXMLHttpResponse(json));
-                        }
-                    });
-                },
-                notification: {
-                    poll: pollAsyncJobResult
-                }
-            },
-            listView: function() {
-                return {
-                    listView: {
-                        id: 'vpcGateways',
-                        fields: {
-                            ipaddress: {
-                                label: 'label.ip.address',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            gateway: {
-                                label: 'label.gateway',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            netmask: {
-                                label: 'label.netmask',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            vlan: {
-                                label: 'label.vlan',
-                                validation: {
-                                    required: true
-                                }
-                            }
-                        },
-
-                        actions: {
-                            add: {
-                                label: 'label.add.private.gateway',
-                                preFilter: function(args) {
-                                    if (isAdmin() || isDomainAdmin())
-                                        return true;
-                                    else
-                                        return false;
-                                },
-                                createForm: {
-                                    title: 'label.add.new.gateway',
-                                    desc: 'message.add.new.gateway.to.vpc',
-                                    fields: {
-                                        physicalnetworkid: {
-                                            docID: 'helpVPCGatewayPhysicalNetwork',
-                                            label: 'label.physical.network',
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listPhysicalNetworks"),
-                                                    data: {
-                                                        zoneid: args.context.vpc[0].zoneid
-                                                    },
-                                                    success: function(json) {
-                                                        var objs = json.listphysicalnetworksresponse.physicalnetwork;
-                                                        var items = [];
-                                                        $(objs).each(function() {
-                                                            items.push({
-                                                                id: this.id,
-                                                                description: this.name
-                                                            });
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        vlan: {
-                                            label: 'label.vlan',
-                                            validation: {
-                                                required: true
-                                            },
-                                            docID: 'helpVPCGatewayVLAN'
-                                        },
-                                        bypassVlanOverlapCheck: {
-                                            label: 'label.bypass.vlan.overlap.check',
-                                            isBoolean: true
-                                        },
-                                        ipaddress: {
-                                            label: 'label.ip.address',
-                                            validation: {
-                                                required: true
-                                            },
-                                            docID: 'helpVPCGatewayIP'
-                                        },
-                                        gateway: {
-                                            label: 'label.gateway',
-                                            validation: {
-                                                required: true
-                                            },
-                                            docID: 'helpVPCGatewayGateway'
-                                        },
-                                        netmask: {
-                                            label: 'label.netmask',
-                                            validation: {
-                                                required: true
-                                            },
-                                            docID: 'helpVPCGatewayNetmask'
-                                        },
-
-                                        sourceNat: {
-                                            label: 'label.source.nat',
-                                            isBoolean: true,
-                                            isChecked: false
-
-                                        },
-
-                                        aclid: {
-                                            label: 'label.acl',
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL('listNetworkACLLists'),
-                                                    data: {
-                                                        vpcid: args.context.vpc[0].id
-                                                    },
-                                                    success: function(json) {
-                                                        var objs = json.listnetworkacllistsresponse.networkacllist;
-                                                        var items = [];
-                                                        $(objs).each(function() {
-                                                            if (this.name == "default_deny")
-                                                                items.unshift({
-                                                                    id: this.id,
-                                                                    description: this.name
-                                                                });
-                                                            else
-                                                                items.push({
-                                                                    id: this.id,
-                                                                    description: this.name
-                                                                });
-
-
-                                                        });
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-
-                                            }
-                                        }
-
-                                    }
-
-                                },
-                                action: function(args) {
-
-                                    var array1 = [];
-                                    if (args.$form.find('.form-item[rel=sourceNat]').find('input[type=checkbox]').is(':Checked') == true) {
-                                        array1.push("&sourcenatsupported=true");
-                                    } else
-                                        array1.push("&sourcenatsupported=false");
-
-                                    if (args.$form.find('.form-item[rel=bypassVlanOverlapCheck]').css("display") != "none") {
-                                        array1.push("&bypassVlanOverlapCheck=" + encodeURIComponent((args.data.bypassVlanOverlapCheck == "on")));
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('createPrivateGateway' + array1.join("")),
-                                        data: {
-                                            physicalnetworkid: args.data.physicalnetworkid,
-                                            vpcid: args.context.vpc[0].id,
-                                            ipaddress: args.data.ipaddress,
-                                            gateway: args.data.gateway,
-                                            netmask: args.data.netmask,
-                                            vlan: args.data.vlan,
-                                            aclid: args.data.aclid
-
-                                        },
-                                        success: function(json) {
-                                            var jid = json.createprivategatewayresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.privategateway;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(json) {
-                                            args.response.error(parseXMLHttpResponse(json));
-                                        }
-                                    });
-                                },
-
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-
-
-                            }
-                        },
-
-                        dataProvider: function(args) {
-                            $.ajax({
-                                url: createURL('listPrivateGateways'),
-                                data: {
-                                    vpcid: args.context.vpc[0].id,
-                                    listAll: true
-                                },
-                                success: function(json) {
-                                    var items = json.listprivategatewaysresponse.privategateway;
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            });
-                        },
-                        detailView: {
-                            name: 'label.details',
-                            actions: {
-                                remove: {
-                                    label: 'label.delete.gateway',
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.delete.gateway';
-                                        },
-                                        notification: function(args) {
-                                            return 'label.delete.gateway';
-                                        }
-                                    },
-                                    action: function(args) {
-                                        $.ajax({
-                                            url: createURL("deletePrivateGateway&id=" + args.context.vpcGateways[0].id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var jid = json.deleteprivategatewayresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                },
-
-                                replaceACL: {
-                                    label: 'label.replace.acl',
-                                    createForm: {
-                                        title: 'label.replace.acl',
-                                        label: 'label.replace.acl',
-                                        fields: {
-                                            aclid: {
-                                                label: 'label.acl',
-                                                select: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('listNetworkACLLists'),
-                                                        data: {
-                                                            vpcid: args.context.vpc[0].id
-                                                        },
-                                                        dataType: 'json',
-                                                        async: true,
-                                                        success: function(json) {
-                                                            var objs = json.listnetworkacllistsresponse.networkacllist;
-                                                            var items = [];
-
-                                                            $(objs).each(function() {
-                                                                if (this.id == args.context.vpcGateways[0].aclid) {
-                                                                    return true;
-                                                                }
-
-                                                                items.push({
-                                                                    id: this.id,
-                                                                    description: this.name
-                                                                });
-
-                                                                return true;
-                                                            });
-
-                                                            args.response.success({
-                                                                data: items
-                                                            });
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    },
-
-                                    action: function(args) {
-                                        $.ajax({
-                                            url: createURL("replaceNetworkACLList&gatewayid=" + args.context.vpcGateways[0].id + "&aclid=" + args.data.aclid),
-                                            dataType: "json",
-                                            success: function(json) {
-                                                var jid = json.replacenetworkacllistresponse.jobid;
-                                                args.response.success(
-
-                                                    {
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function(json) {
-                                                                var item = json.queryasyncjobresultresponse.jobresult.aclid;
-                                                                return {
-                                                                    aclid: args.data.aclid
-                                                                };
-                                                            }
-                                                        }
-                                                    }
-
-                                                )
-                                            },
-
-                                            error: function(json) {
-
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    },
-
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    },
-
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.confirm.replace.acl.new.one';
-                                        },
-                                        notification: function(args) {
-                                            return 'label.acl.replaced';
-                                        }
-                                    }
-                                }
-                            },
-                            tabs: {
-                                details: {
-                                    title: 'label.details',
-                                    fields: [{
-                                        ipaddress: {
-                                            label: 'label.ip.address'
-                                        }
-                                    }, {
-                                        gateway: {
-                                            label: 'label.gateway'
-                                        },
-                                        netmask: {
-                                            label: 'label.netmask'
-                                        },
-                                        vlan: {
-                                            label: 'label.vlan'
-                                        },
-                                        state: {
-                                            label: 'label.state'
-                                        },
-                                        id: {
-                                            label: 'label.id'
-                                        },
-                                        zonename: {
-                                            label: 'label.zone'
-                                        },
-                                        domain: {
-                                            label: 'label.domain'
-                                        },
-                                        account: {
-                                            label: 'label.account'
-                                        },
-                                        sourcenatsupported: {
-                                            label: 'label.source.nat.supported',
-                                            converter: function(str) {
-                                                return str ? 'Yes' : 'No';
-                                            }
-                                        },
-                                        aclName: {
-                                            label: 'label.acl.name'
-                                        },
-                                        aclid: {
-                                            label: 'label.acl.id'
-                                        }
-
-
-                                    }],
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL('listPrivateGateways'),
-                                            data: {
-                                                id: args.context.vpcGateways[0].id,
-                                                listAll: true
-                                            },
-                                            success: function(json) {
-                                                var item = json.listprivategatewaysresponse.privategateway[0];
-
-
-                                                // Get ACL name
-                                                $.ajax({
-                                                    url: createURL('listNetworkACLLists'),
-                                                    async: false,
-                                                    data: {
-                                                        vpcid: args.context.vpc[0].id
-                                                    },
-                                                    success: function(json) {
-                                                        var objs = json.listnetworkacllistsresponse.networkacllist;
-                                                        var acl = $.grep(objs, function(obj) {
-                                                            return obj.id === args.context.vpcGateways[0].aclid;
-                                                        });
-
-                                                        item.aclName = acl[0] ? acl[0].name : 'None';
-                                                    }
-                                                });
-
-                                                args.response.success({
-                                                    data: item,
-                                                    actionFilter: function(args) {
-                                                        var allowedActions = [];
-                                                        if (isAdmin()) {
-                                                            allowedActions.push("remove");
-                                                            allowedActions.push("replaceACL");
-
-                                                        }
-                                                        return allowedActions;
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    }
-                                },
-                                staticRoutes: {
-                                    title: 'label.static.routes',
-                                    custom: function(args) {
-                                        return $('<div>').multiEdit({
-                                            noSelect: true,
-                                            context: args.context,
-                                            fields: {
-                                                cidr: {
-                                                    edit: true,
-                                                    label: 'label.CIDR.of.destination.network'
-                                                },
-                                                'add-rule': {
-                                                    label: 'label.add.route',
-                                                    addButton: true
-                                                }
-                                            },
-
-                                            tags: cloudStack.api.tags({
-                                                resourceType: 'StaticRoute',
-                                                contextId: 'multiRule'
-                                            }),
-
-                                            add: {
-                                                label: 'label.add',
-                                                action: function(args) {
-                                                    $.ajax({
-                                                        url: createURL('createStaticRoute'),
-                                                        data: {
-                                                            gatewayid: args.context.vpcGateways[0].id,
-                                                            cidr: args.data.cidr
-                                                        },
-                                                        success: function(data) {
-                                                            args.response.success({
-                                                                _custom: {
-                                                                    jobId: data.createstaticrouteresponse.jobid
-                                                                },
-                                                                notification: {
-                                                                    label: 'label.add.static.route',
-                                                                    poll: pollAsyncJobResult
-                                                                }
-                                                            });
-                                                        },
-                                                        error: function(data) {
-                                                            args.response.error(parseXMLHttpResponse(data));
-                                                        }
-                                                    });
-                                                }
-                                            },
-                                            actions: {
-                                                destroy: {
-                                                    label: 'label.remove.static.route',
-                                                    action: function(args) {
-                                                        $.ajax({
-                                                            url: createURL('deleteStaticRoute'),
-                                                            data: {
-                                                                id: args.context.multiRule[0].id
-                                                            },
-                                                            dataType: 'json',
-                                                            async: true,
-                                                            success: function(data) {
-                                                                var jobID = data.deletestaticrouteresponse.jobid;
-
-                                                                args.response.success({
-                                                                    _custom: {
-                                                                        jobId: jobID
-                                                                    },
-                                                                    notification: {
-                                                                        label: 'label.remove.static.route',
-                                                                        poll: pollAsyncJobResult
-                                                                    }
-                                                                });
-                                                            }
-                                                        });
-                                                    }
-                                                }
-                                            },
-                                            dataProvider: function(args) {
-                                                $.ajax({
-                                                    url: createURL('listStaticRoutes'),
-                                                    data: {
-                                                        gatewayid: args.context.vpcGateways[0].id,
-                                                        listAll: true,
-                                                        state: "Active"
-                                                    },
-                                                    success: function(json) {
-                                                        var items = json.liststaticroutesresponse.staticroute;
-                                                        args.response.success({
-                                                            data: items
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        }
-                    }
-                };
-            }
-        },
-        siteToSiteVPN: {
-            title: 'label.site.to.site.VPN',
-            id: 'siteToSiteVpn',
-            sectionSelect: {
-                preFilter: function(args) {
-                    return ["vpnGateway", "vpnConnection"];
-                },
-                label: 'label.select-view'
-            },
-
-            // This is a custom add function -- does not show in list view
-            add: {
-                // Check if VPN gateways exist
-                // -- if false, don't show list view
-                preCheck: function(args) {
-                    var items;
-
-                    $.ajax({
-                        url: createURL('listVpnGateways&listAll=true'),
-                        data: {
-                            vpcid: args.context.vpc[0].id
-                        },
-                        async: false,
-                        success: function(json) {
-                            items = json.listvpngatewaysresponse.vpngateway;
-                        }
-                    });
-
-                    if (items && items.length) {
-                        return true;
-                    }
-
-                    return false;
-                },
-                label: 'label.add.VPN.gateway',
-                messages: {
-                    notification: function(args) {
-                        return 'label.add.VPN.gateway';
-                    }
-                },
-                createForm: {
-                    title: 'label.add.VPN.gateway',
-                    desc: 'message.add.VPN.gateway',
-                    fields: {}
-                },
-                action: function(args) {
-                    $.ajax({
-                        url: createURL("createVpnGateway"),
-                        data: {
-                            vpcid: args.context.vpc[0].id
-                        },
-                        success: function(json) {
-                            var jid = json.createvpngatewayresponse.jobid;
-                            args.response.success({
-                                _custom: {
-                                    jobId: jid,
-                                    getUpdatedItem: function(json) {
-                                        return json.queryasyncjobresultresponse.jobresult.vpngateway;
-                                    }
-                                }
-                            });
-                        }
-                    });
-                },
-                notification: {
-                    poll: pollAsyncJobResult
-                }
-            },
-
-            sections: {
-                vpnGateway: {
-                    type: 'select',
-                    title: 'label.VPN.gateway',
-                    listView: {
-                        id: 'vpnGateway',
-                        label: 'label.VPN.gateway',
-                        fields: {
-                            publicip: {
-                                label: 'label.ip.address'
-                            },
-                            account: {
-                                label: 'label.account'
-                            },
-                            domain: {
-                                label: 'label.domain'
-                            }
-                        },
-                        dataProvider: function(args) {
-                            var array1 = [];
-                            if (args.filterBy != null) {
-                                if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                    switch (args.filterBy.search.by) {
-                                        case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                                array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                    }
-                                }
-                            }
-                            $.ajax({
-                                url: createURL("listVpnGateways&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                data: {
-                                    vpcid: args.context.vpc[0].id
-                                },
-                                async: false,
-                                success: function(json) {
-                                    var items = json.listvpngatewaysresponse.vpngateway;
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            });
-                        },
-                        detailView: {
-                            name: 'label.details',
-                            actions: {
-                                remove: {
-                                    label: 'label.delete.VPN.gateway',
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.delete.VPN.gateway';
-                                        },
-                                        notification: function(args) {
-                                            return 'label.delete.VPN.gateway';
-                                        }
-                                    },
-                                    action: function(args) {
-                                        $.ajax({
-                                            url: createURL("deleteVpnGateway"),
-                                            data: {
-                                                id: args.context.vpnGateway[0].id
-                                            },
-                                            success: function(json) {
-                                                var jid = json.deletevpngatewayresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                }
-                            },
-                            tabs: {
-                                details: {
-                                    title: 'label.details',
-                                    fields: [{
-                                        publicip: {
-                                            label: 'label.ip.address'
-                                        }
-                                    }, {
-                                        id: {
-                                            label: 'label.id'
-                                        },
-                                        domain: {
-                                            label: 'label.domain'
-                                        },
-                                        account: {
-                                            label: 'label.account'
-                                        }
-                                    }],
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL("listVpnGateways"),
-                                            data: {
-                                                listAll: true,
-                                                id: args.context.vpnGateway[0].id
-                                            },
-                                            async: true,
-                                            success: function(json) {
-                                                var item = json.listvpngatewaysresponse.vpngateway[0];
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        }
-                    }
-                },
-                vpnConnection: {
-                    type: 'select',
-                    title: 'label.VPN.connection',
-                    listView: {
-                        id: 'vpnConnection',
-                        label: 'label.VPN.connection',
-                        fields: {
-                            publicip: {
-                                label: 'label.ip.address'
-                            },
-                            gateway: {
-                                label: 'label.gateway'
-                            },
-                            state: {
-                                label: 'label.state',
-                                indicator: {
-                                    'Connected': 'on',
-                                    'Disconnected': 'off',
-                                    'Error': 'off'
-                                }
-                            },
-                            ipsecpsk: {
-                                label: 'label.IPsec.preshared.key'
-                            },
-                            ikepolicy: {
-                                label: 'label.IKE.policy'
-                            },
-                            esppolicy: {
-                                label: 'label.ESP.policy'
-                            }
-                        },
-                        dataProvider: function(args) {
-                            var array1 = [];
-                            if (args.filterBy != null) {
-                                if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
-                                    switch (args.filterBy.search.by) {
-                                        case "name":
-                                            if (args.filterBy.search.value.length > 0)
-                                                array1.push("&keyword=" + args.filterBy.search.value);
-                                            break;
-                                    }
-                                }
-                            }
-                            $.ajax({
-                                url: createURL("listVpnConnections&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
-                                data: {
-                                    vpcid: args.context.vpc[0].id
-                                },
-                                success: function(json) {
-                                    var items = json.listvpnconnectionsresponse.vpnconnection;
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            });
-                        },
-
-                        actions: {
-                            add: {
-                                label: 'label.create.VPN.connection',
-                                messages: {
-                                    notification: function(args) {
-                                        return 'label.create.VPN.connection';
-                                    }
-                                },
-                                createForm: {
-                                    title: 'label.create.VPN.connection',
-                                    fields: {
-                                        vpncustomergatewayid: {
-                                            label: 'label.VPN.customer.gateway',
-                                            validation: {
-                                                required: true
-                                            },
-                                            select: function(args) {
-                                                $.ajax({
-                                                    url: createURL("listVpnCustomerGateways"),
-                                                    data: {
-                                                        listAll: true
-                                                    },
-                                                    success: function(json) {
-                                                        var items = json.listvpncustomergatewaysresponse.vpncustomergateway ? json.listvpncustomergatewaysresponse.vpncustomergateway : [];
-                                                        args.response.success({
-                                                            data: $.map(items, function(item) {
-                                                                return {
-                                                                    id: item.id,
-                                                                    description: item.name
-                                                                };
-                                                            })
-
-                                                        });
-                                                    }
-                                                });
-                                            }
-                                        },
-                                        passive: {
-                                            label: 'label.passive',
-                                            isBoolean: true,
-                                            isChecked: false
-                                        }
-                                    }
-                                },
-                                action: function(args) {
-                                    var vpngatewayid = null;
-                                    $.ajax({
-                                        url: createURL('listVpnGateways'),
-                                        data: {
-                                            listAll: true,
-                                            vpcid: args.context.vpc[0].id
-                                        },
-                                        async: false,
-                                        success: function(json) {
-                                            var items = json.listvpngatewaysresponse.vpngateway;
-                                            if (items != null && items.length > 0) {
-                                                vpngatewayid = items[0].id;
-                                            }
-                                        }
-                                    });
-                                    if (vpngatewayid == null) {
-                                        args.response.error('The selected VPC does not have a VPN gateway. Please create a VPN gateway for the VPC first.');
-                                        return;
-                                    }
-
-                                    $.ajax({
-                                        url: createURL('createVpnConnection'),
-                                        data: {
-                                            s2svpngatewayid: vpngatewayid,
-                                            s2scustomergatewayid: args.data.vpncustomergatewayid,
-                                            passive: (args.data.passive == 'on'? true: false)
-                                        },
-                                        success: function(json) {
-                                            var jid = json.createvpnconnectionresponse.jobid;
-                                            args.response.success({
-                                                _custom: {
-                                                    jobId: jid,
-                                                    getUpdatedItem: function(json) {
-                                                        return json.queryasyncjobresultresponse.jobresult.vpnconnection;
-                                                    }
-                                                }
-                                            });
-                                        },
-                                        error: function(xmlHttpResponse) {
-                                            args.response.error(parseXMLHttpResponse(xmlHttpResponse));
-                                        }
-                                    });
-                                },
-                                notification: {
-                                    poll: pollAsyncJobResult
-                                }
-                            }
-                        },
-
-                        detailView: {
-                            name: 'label.details',
-                            tabs: {
-                                details: {
-                                    title: 'label.details',
-                                    fields: [{
-                                        id: {
-                                            label: 'label.id'
-                                        },
-                                        passive: {
-                                            label: 'label.passive',
-                                            converter: cloudStack.converters.toBooleanText
-                                        },
-                                        publicip: {
-                                            label: 'label.ip.address'
-                                        },
-                                        gateway: {
-                                            label: 'label.gateway'
-                                        },
-                                        cidrlist: {
-                                            label: 'label.CIDR.list'
-                                        },
-                                        ipsecpsk: {
-                                            label: 'label.IPsec.preshared.key'
-                                        },
-                                        ikepolicy: {
-                                            label: 'label.IKE.policy'
-                                        },
-                                        esppolicy: {
-                                            label: 'label.ESP.policy'
-                                        },
-                                        ikelifetime: {
-                                            label: 'label.IKE.lifetime'
-                                        },
-                                        esplifetime: {
-                                            label: 'label.ESP.lifetime'
-                                        },
-                                        dpd: {
-                                            label: 'label.dead.peer.detection',
-                                            converter: function(str) {
-                                                return str ? 'Yes' : 'No';
-                                            }
-                                        },
-                                        forceencap: {
-                                            label: 'label.vpn.force.encapsulation',
-                                            converter: function(str) {
-                                                return str ? 'Yes' : 'No';
-                                            }
-                                        },
-                                        state: {
-                                            label: 'label.state'
-                                        },
-                                        created: {
-                                            label: 'label.date',
-                                            converter: cloudStack.converters.toLocalDate
-                                        }
-                                    }],
-
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL("listVpnConnections&id=" + args.context.vpnConnection[0].id),
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var item = json.listvpnconnectionsresponse.vpnconnection[0];
-                                                args.response.success({
-                                                    data: item
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            },
-                            actions: {
-                                restart: {
-                                    label: 'label.reset.VPN.connection',
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.reset.VPN.connection';
-                                        },
-                                        notification: function(args) {
-                                            return 'label.reset.VPN.connection';
-                                        }
-                                    },
-                                    action: function(args) {
-                                        $.ajax({
-                                            url: createURL("resetVpnConnection"),
-                                            data: {
-                                                id: args.context.vpnConnection[0].id
-                                            },
-                                            dataType: "json",
-                                            async: true,
-                                            success: function(json) {
-                                                var jid = json.resetvpnconnectionresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid,
-                                                        getUpdatedItem: function(json) {
-                                                            return json.queryasyncjobresultresponse.jobresult.vpnconnection;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                },
-
-                                remove: {
-                                    label: 'label.delete.VPN.connection',
-                                    messages: {
-                                        confirm: function(args) {
-                                            return 'message.delete.VPN.connection';
-                                        },
-                                        notification: function(args) {
-                                            return 'label.delete.VPN.connection';
-                                        }
-                                    },
-                                    action: function(args) {
-                                        $.ajax({
-                                            url: createURL("deleteVpnConnection"),
-                                            dataType: "json",
-                                            data: {
-                                                id: args.context.vpnConnection[0].id
-                                            },
-                                            async: true,
-                                            success: function(json) {
-                                                var jid = json.deletevpnconnectionresponse.jobid;
-                                                args.response.success({
-                                                    _custom: {
-                                                        jobId: jid,
-                                                        getUpdatedItem: function(json) {
-                                                            return json.queryasyncjobresultresponse.jobresult.vpnconnection;
-                                                        }
-                                                    }
-                                                });
-                                            }
-                                        });
-                                    },
-                                    notification: {
-                                        poll: pollAsyncJobResult
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        },
-
-        tiers: {
-            detailView: { //duplicate from cloudStack.sections.network.sections.networks.listView.detailView (begin)
-                name: 'Guest network details',
-                viewAll: {
-                    path: 'network.ipAddresses',
-                    label: 'label.menu.ipaddresses',
-                    preFilter: function(args) {
-                        return false;
-
-                        /// Disabled
-                        if (args.context.networks[0].state == 'Destroyed')
-                            return false;
-
-                        var services = args.context.networks[0].service;
-                        if (services == null)
-                            return false;
-
-                        if (args.context.networks[0].type == "Isolated") {
-                            for (var i = 0; i < services.length; i++) {
-                                var service = services[i];
-                                if (service.name == "SourceNat") {
-                                    return true;
-                                }
-                            }
-                        } else if (args.context.networks[0].type == "Shared") {
-                            var havingSecurityGroupService = false;
-                            var havingElasticIpCapability = false;
-                            var havingElasticLbCapability = false;
-
-                            for (var i = 0; i < services.length; i++) {
-                                var service = services[i];
-                                if (service.name == "SecurityGroup") {
-                                    havingSecurityGroupService = true;
-                                } else if (service.name == "StaticNat") {
-                                    $(service.capability).each(function() {
-                                        if (this.name == "ElasticIp" && this.value == "true") {
-                                            havingElasticIpCapability = true;
-                                            return false; //break $.each() loop
-                                        }
-                                    });
-                                } else if (service.name == "Lb") {
-                                    $(service.capability).each(function() {
-                                        if (this.name == "ElasticLb" && this.value == "true") {
-                                            havingElasticLbCapability = true;
-                                            return false; //break $.each() loop
-                                        }
-                                    });
-                                }
-                            }
-
-                            if (havingSecurityGroupService == true && havingElasticIpCapability == true && havingElasticLbCapability == true)
-                                return true;
-                            else
-                                return false;
-                        }
-
-                        return false;
-                    }
-                },
-                actions: {
-                    edit: {
-                        label: 'label.edit',
-                        messages: {
-                            notification: function(args) {
-                                return 'label.edit.network.details';
-                            }
-                        },
-                        action: function(args) {
-                            var array1 = [];
-                            array1.push("&name=" + encodeURIComponent(args.data.name));
-                            array1.push("&displaytext=" + encodeURIComponent(args.data.displaytext));
-
-                            //args.data.networkdomain is null when networkdomain field is hidden
-                            if (args.data.networkdomain != null && args.data.networkdomain != args.context.networks[0].networkdomain)
-                                array1.push("&networkdomain=" + encodeURIComponent(args.data.networkdomain));
-
-                            //args.data.networkofferingid is null when networkofferingid field is hidden
-                            if (args.data.networkofferingid != null && args.data.networkofferingid != args.context.networks[0].networkofferingid) {
-                                array1.push("&networkofferingid=" + encodeURIComponent(args.data.networkofferingid));
-
-                                if (args.context.networks[0].type == "Isolated") { //Isolated network
-                                    cloudStack.dialog.confirm({
-                                        message: 'message.confirm.current.guest.CIDR.unchanged',
-                                        action: function() { //"Yes"    button is clicked
-                                            array1.push("&changecidr=false");
-                                            $.ajax({
-                                                url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var jid = json.updatenetworkresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function(json) {
-                                                                var item = json.queryasyncjobresultresponse.jobresult.network;
-                                                                return {
-                                                                    data: item
-                                                                };
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function(json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        },
-                                        cancelAction: function() { //"Cancel" button is clicked
-                                            array1.push("&changecidr=true");
-                                            $.ajax({
-                                                url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var jid = json.updatenetworkresponse.jobid;
-                                                    args.response.success({
-                                                        _custom: {
-                                                            jobId: jid,
-                                                            getUpdatedItem: function(json) {
-                                                                var item = json.queryasyncjobresultresponse.jobresult.network;
-                                                                return {
-                                                                    data: item
-                                                                };
-                                                            }
-                                                        }
-                                                    });
-                                                },
-                                                error: function(json) {
-                                                    args.response.error(parseXMLHttpResponse(json));
-                                                }
-                                            });
-                                        }
-                                    });
-                                    return;
-                                }
-                            }
-
-                            $.ajax({
-                                url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
-                                dataType: "json",
-                                success: function(json) {
-                                    var jid = json.updatenetworkresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                var item = json.queryasyncjobresultresponse.jobresult.network;
-                                                return {
-                                                    data: item
-                                                };
-                                            }
-                                        }
-                                    });
-                                },
-                                error: function(json) {
-                                    args.response.error(parseXMLHttpResponse(json));
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    'restart': {
-                        label: 'label.restart.network',
-                        createForm: {
-                            title: 'label.restart.network',
-                            desc: 'message.restart.network',
-                            preFilter: function(args) {
-                                var zoneObj;
-                                $.ajax({
-                                    url: createURL("listZones&id=" + args.context.networks[0].zoneid),
-                                    dataType: "json",
-                                    async: false,
-                                    success: function(json) {
-                                        zoneObj = json.listzonesresponse.zone[0];
-                                    }
-                                });
-                                if (zoneObj.networktype == "Basic") {
-                                    args.$form.find('.form-item[rel=cleanup]').find('input').prop('checked', false); //unchecked
-                                    args.$form.find('.form-item[rel=cleanup]').hide(); //hidden
-                                } else {
-                                    args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 'checked'); //checked
-                                    args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block'); //shown
-                                }
-                            },
-                            fields: {
-                                cleanup: {
-                                    label: 'label.clean.up',
-                                    isBoolean: true
-                                }
-                            }
-                        },
-                        messages: {
-                            notification: function(args) {
-                                return 'label.restart.network';
-                            }
-                        },
-                        action: function(args) {
-                            var array1 = [];
-                            array1.push("&cleanup=" + (args.data.cleanup == "on"));
-                            $.ajax({
-                                url: createURL("restartNetwork&id=" + args.context.networks[0].id + array1.join("")),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.restartnetworkresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                return json.queryasyncjobresultresponse.jobresult.network;
-                                            }
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    remove: {
-                        label: 'label.action.delete.network',
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.action.delete.network';
-                            },
-                            notification: function(args) {
-                                return 'label.action.delete.network';
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("deleteNetwork&id=" + args.context.networks[0].id),
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jid = json.deletenetworkresponse.jobid;
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid
-                                        }
-                                    });
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        }
-                    },
-
-                    replaceacllist: {
-                        label: 'label.replace.acl.list',
-                        createForm: {
-                            title: 'label.replace.acl.list',
-                            label: 'label.replace.acl.list',
-                            fields: {
-                                aclid: {
-                                    label: 'label.acl',
-                                    select: function(args) {
-                                        $.ajax({
-                                            url: createURL('listNetworkACLLists&vpcid=' + args.context.vpc[0].id),
-                                            dataType: 'json',
-                                            async: true,
-                                            success: function(json) {
-                                                var objs = json.listnetworkacllistsresponse.networkacllist;
-                                                var items = [];
-
-                                                $(objs).each(function() {
-                                                    if (this.id == args.context.networks[0].aclid) {
-                                                        return true;
-                                                    }
-
-                                                    items.push({
-                                                        id: this.id,
-                                                        description: this.name
-                                                    });
-
-                                                    return true;
-                                                });
-                                                args.response.success({
-                                                    data: items
-                                                });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        },
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("replaceNetworkACLList&networkid=" + args.context.networks[0].id + "&aclid=" + args.data.aclid),
-                                dataType: "json",
-                                success: function(json) {
-                                    var jid = json.replacenetworkacllistresponse.jobid;
-
-                                    args.response.success({
-                                        _custom: {
-                                            jobId: jid,
-                                            getUpdatedItem: function(json) {
-                                                var network = args.context.networks[0];
-
-                                                network.aclid = args.data.aclid;
-
-                                                return {
-                                                    aclid: args.data.aclid
-                                                };
-                                            }
-                                        }
-                                    });
-                                },
-
-                                error: function(json) {
-
-                                    args.response.error(parseXMLHttpResponse(json));
-                                }
-                            });
-                        },
-                        notification: {
-                            poll: pollAsyncJobResult
-                        },
-
-                        messages: {
-                            confirm: function(args) {
-                                return 'message.confirm.replace.acl.new.one';
-                            },
-                            notification: function(args) {
-                                return 'label.acl.replaced';
-                            }
-                        }
-                    }
-                },
-
-                tabFilter: function(args) {
-                    var hiddenTabs = ['ipAddresses', 'acl']; // Disable IP address tab; it is redundant with 'view all' button
-
-                    var networkOfferingHavingELB = false;
-                    var services = args.context.networks[0].service;
-                    if(services != null) {
-                        for(var i = 0; i < services.length; i++) {
-                            if (services[i].name == "Lb") {
-                                var capabilities = services[i].capability;
-                                if(capabilities != null) {
-                                    for(var k = 0; k < capabilities.length; k++) {
-                                        if(capabilities[k].name == "ElasticLb") {
-                                            networkOfferingHavingELB = true;
-                                            break;
-                                        }
-                                    }
-                                }
-                                break;
-                            }
-                        }
-                    }
-                    if (networkOfferingHavingELB == false) {
-                        hiddenTabs.push("addloadBalancer");
-                    }
-
-                    return hiddenTabs;
-                },
-
-                isMaximized: true,
-                tabs: {
-                    details: {
-                        title: 'label.network.details',
-                        preFilter: function(args) {
-                            var hiddenFields = [];
-                            var zone;
-
-                            $.ajax({
-                                url: createURL('listZones'),
-                                data: {
-                                    id: args.context.networks[0].zoneid
-                                },
-                                async: false,
-                                success: function(json) {
-                                    zone = json.listzonesresponse.zone[0];
-                                }
-                            });
-
-                            if (zone.networktype == "Basic") {
-                                hiddenFields.push("account");
-                                hiddenFields.push("gateway");
-                                hiddenFields.push("vlan");
-                                hiddenFields.push("cidr");
-                                //hiddenFields.push("netmask");
-                            }
-
-                            if (args.context.networks[0].type == "Isolated") {
-                                hiddenFields.push("networkofferingdisplaytext");
-                                hiddenFields.push("networkdomaintext");
-                                hiddenFields.push("gateway");
-                                hiddenFields.push("networkofferingname");
-                                //hiddenFields.push("netmask");
-                            } else { //selectedGuestNetworkObj.type == "Shared"
-                                hiddenFields.push("networkofferingid");
-                                hiddenFields.push("networkdomain");
-                            }
-                            return hiddenFields;
-                        },
-                        fields: [{
-                            name: {
-                                label: 'label.name',
-                                isEditable: true
-                            }
-                        }, {
-                            id: {
-                                label: 'label.id'
-                            },
-                            zonename: {
-                                label: 'label.zone'
-                            },
-                            displaytext: {
-                                label: 'label.description',
-                                isEditable: true
-                            },
-                            type: {
-                                label: 'label.type'
-                            },
-                            state: {
-                                label: 'label.state'
-                            },
-
-                            ispersistent: {
-                                label: 'label.persistent',
-                                converter: cloudStack.converters.toBooleanText
-
-                            },
-
-                            restartrequired: {
-                                label: 'label.restart.required',
-                                converter: function(booleanValue) {
-                                    if (booleanValue == true)
-                                        return "<font color='red'>Yes</font>";
-                                    else if (booleanValue == false)
-                                        return "No";
-                                }
-                            },
-                            vlan: {
-                                label: 'label.vlan.id'
-                            },
-
-                            networkofferingname: {
-                                label: 'label.network.offering'
-                            },
-
-                            networkofferingid: {
-                                label: 'label.network.offering',
-                                isEditable: true,
-                                select: function(args) {
-                                    if (args.context.networks[0].state == 'Destroyed') {
-                                        args.response.success({
-                                            data: []
-                                        });
-                                        return;
-                                    }
-
-                                    var items = [];
-                                    $.ajax({
-                                        url: createURL("listNetworkOfferings&networkid=" + args.context.networks[0].id),
-                                        dataType: "json",
-                                        async: false,
-                                        success: function(json) {
-                                            var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                                            $(networkOfferingObjs).each(function() {
-                                                items.push({
-                                                    id: this.id,
-                                                    description: this.displaytext
-                                                });
-                                            });
-                                        }
-                                    });
-
-                                    //include currently selected network offeirng to dropdown
-                                    items.push({
-                                        id: args.context.networks[0].networkofferingid,
-                                        description: args.context.networks[0].networkofferingdisplaytext
-                                    });
-
-                                    args.response.success({
-                                        data: items
-                                    });
-                                }
-                            },
-
-                            gateway: {
-                                label: 'label.gateway'
-                            },
-
-                            //netmask: { label: 'Netmask' },
-                            cidr: {
-                                label: 'label.cidr'
-                            },
-
-                            networkdomaintext: {
-                                label: 'label.network.domain.text'
-                            },
-                            networkdomain: {
-                                label: 'label.network.domain',
-                                isEditable: true
-                            },
-
-                            aclname: {
-                                label: 'label.acl.name'
-                            },
-                            //aclid:{label:'ACL id'},
-
-                            domain: {
-                                label: 'label.domain'
-                            },
-                            account: {
-                                label: 'label.account'
-                            }
-                        }],
-                        dataProvider: function(args) {
-                            $.ajax({
-                                url: createURL("listNetworks&id=" + args.context.networks[0].id + "&listAll=true"), //pass "&listAll=true" to "listNetworks&id=xxxxxxxx" for now before API gets fixed.
-                                data: {
-                                    listAll: true
-                                },
-                                dataType: "json",
-                                async: true,
-                                success: function(json) {
-                                    var jsonObj = json.listnetworksresponse.network[0];
-                                    if (jsonObj.aclid != null) {
-
-                                        $.ajax({
-                                            url: createURL("listNetworkACLLists&id=" + jsonObj.aclid),
-                                            dataType: "json",
-                                            success: function(json) {
-                                                var aclObj = json.listnetworkacllistsresponse.networkacllist[0];
-                                                args.response.success({
-                                                    actionFilter: cloudStack.actionFilter.guestNetwork,
-                                                    data: $.extend(jsonObj, {
-                                                        aclname: aclObj.name
-                                                    })
-
-                                                });
-                                            },
-                                            error: function(json) {
-
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-                                    } else {
-                                        args.response.success({
-                                            actionFilter: cloudStack.actionFilter.guestNetwork,
-                                            data: $.extend(jsonObj, {
-                                                aclname: 'None'
-                                            })
-
-                                        });
-
-                                    }
-                                }
-                            });
-                        }
-                    },
-
-                    acl: {
-                        title: 'label.network.ACL',
-                        custom: function(args) {
-                            // Widget renders ACL multi-edit, overriding this fn
-                            return $('<div>');
-                        }
-                    },
-
-                    ipAddresses: {
-                        title: 'label.menu.ipaddresses',
-                        custom: function(args) {
-                            // Widget renders IP addresses, overriding this fn
-                            return $('<div>');
-                        }
-                    },
-
-                    addloadBalancer: {
-                        title: 'label.add.load.balancer',
-                        custom: function(args) {
-                            var context = args.context;
-
-                            return $('<div>').multiEdit({
-                                context: context,
-                                listView: $.extend(true, {}, cloudStack.sections.instances, {
-                                    listView: {
-                                        dataProvider: function(args) {
-                                            var networkid;
-                                            if ('vpc' in args.context)
-                                                networkid = args.context.multiData.tier;
-                                            else
-                                                networkid = args.context.ipAddresses[0].associatednetworkid;
-
-                                            var data = {
-                                                page: args.page,
-                                                pageSize: pageSize,
-                                                networkid: networkid,
-                                                listAll: true
-                                            };
-
-                                            $.ajax({
-                                                url: createURL('listVirtualMachines'),
-                                                data: data,
-                                                dataType: 'json',
-                                                async: true,
-                                                success: function(data) {
-                                                    args.response.success({
-                                                        data: $.grep(
-                                                            data.listvirtualmachinesresponse.virtualmachine ?
-                                                            data.listvirtualmachinesresponse.virtualmachine : [],
-                                                            function(instance) {
-                                                                return $.inArray(instance.state, [
-                                                                    'Destroyed'
-                                                                ]) == -1;
-                                                            }
-                                                        )
-                                                    });
-                                                },
-                                                error: function(data) {
-                                                    args.response.error(parseXMLHttpResponse(data));
-                                                }
-                                            });
-                                        }
-                                    }
-                                }),
-                                multipleAdd: true,
-                                fields: {
-                                    'name': {
-                                        edit: true,
-                                        label: 'label.name'
-                                    },
-                                    'publicport': {
-                                        edit: true,
-                                        label: 'label.public.port'
-                                    },
-                                    'privateport': {
-                                        edit: true,
-                                        label: 'label.private.port'
-                                    },
-                                    'algorithm': {
-                                        label: 'label.algorithm',
-                                        select: function(args) {
-                                            args.response.success({
-                                                data: [{
-                                                    name: 'roundrobin',
-                                                    description: _l('label.lb.algorithm.roundrobin')
-                                                }, {
-                                                    name: 'leastconn',
-                                                    description: _l('label.lb.algorithm.leastconn')
-                                                }, {
-                                                    name: 'source',
-                                                    description: _l('label.lb.algorithm.source')
-                                                }]
-                                            });
-                                        }
-                                    },
-                                    'sticky': {
-                                        label: 'label.stickiness',
-                                        custom: {
-                                            buttonLabel: 'label.configure',
-                                            action: cloudStack.lbStickyPolicy.dialog()
-                                        }
-                                    },
-                                    'add-vm': {
-                                        label: 'label.add.vm',
-                                        addButton: true
-                                    }
-                                },
-                                add: {
-                                    label: 'label.add.vm',
-                                    action: function(args) {
-                                        var data = {
-                                            algorithm: args.data.algorithm,
-                                            name: args.data.name,
-                                            privateport: args.data.privateport,
-                                            publicport: args.data.publicport,
-                                            openfirewall: false,
-                                            domainid: g_domainid,
-                                            account: g_account
-                                        };
-
-                                        if ('vpc' in args.context) { //from VPC section
-                                            if (args.data.tier == null) {
-                                                args.response.error('Tier is required');
-                                                return;
-                                            }
-                                            $.extend(data, {
-                                                networkid: args.data.tier
-                                            });
-                                        } else { //from Guest Network section
-                                            $.extend(data, {
-                                                networkid: args.context.networks[0].id
-                                            });
-                                        }
-
-                                        var stickyData = $.extend(true, {}, args.data.sticky);
-
-                                        $.ajax({
-                                            url: createURL('createLoadBalancerRule'),
-                                            data: data,
-                                            dataType: 'json',
-                                            async: true,
-                                            success: function(data) {
-                                                var itemData = args.itemData;
-                                                var jobID = data.createloadbalancerruleresponse.jobid;
-
-                                                $.ajax({
-                                                    url: createURL('assignToLoadBalancerRule'),
-                                                    data: {
-                                                        id: data.createloadbalancerruleresponse.id,
-                                                        virtualmachineids: $.map(itemData, function(elem) {
-                                                            return elem.id;
-                                                        }).join(',')
-                                                    },
-                                                    dataType: 'json',
-                                                    async: true,
-                                                    success: function(data) {
-                                                        var lbCreationComplete = false;
-
-                                                        args.response.success({
-                                                            _custom: {
-                                                                jobId: jobID
-                                                            },
-                                                            notification: {
-                                                                label: 'label.add.load.balancer',
-                                                                poll: function(args) {
-                                                                    var complete = args.complete;
-                                                                    var error = args.error;
-
-                                                                    pollAsyncJobResult({
-                                                                        _custom: args._custom,
-                                                                        complete: function(args) {
-                                                                            if (lbCreationComplete) {
-                                                                                return;
-                                                                            }
-
-                                                                            lbCreationComplete = true;
-                                                                            cloudStack.dialog.notice({
-                                                                                message: _l('message.add.load.balancer.under.ip') + args.data.loadbalancer.publicip
-                                                                            });
-
-                                                                            if (stickyData &&
-                                                                                stickyData.methodname &&
-                                                                                stickyData.methodname != 'None') {
-                                                                                cloudStack.lbStickyPolicy.actions.add(
-                                                                                    args.data.loadbalancer.id,
-                                                                                    stickyData,
-                                                                                    complete, // Complete
-                                                                                    complete // Error
-                                                                                );
-                                                                            } else {
-                                                                                complete();
-                                                                            }
-                                                                        },
-                                                                        error: error
-                                                                    });
-                                                                }
-                                                            }
-                                                        });
-                                                    },
-                                                    error: function(data) {
-                                                        args.response.error(parseXMLHttpResponse(data));
-                                                    }
-                                                });
-                                            },
-                                            error: function(data) {
-                                                args.response.error(parseXMLHttpResponse(data));
-                                            }
-                                        });
-                                    }
-                                },
-                                dataProvider: function(args) {
-                                    args.response.success({ //no LB listing in AddLoadBalancer tab
-                                        data: []
-                                    });
-                                }
-                            });
-                        }
-                    }
-                }
-            }, //duplicate from cloudStack.sections.network.sections.networks.listView.detailView (begin)
-
-            actionPreFilter: function(args) {
-                var tier = args.context.networks[0];
-                var state = tier.state;
-
-                return state == 'Running' ? ['start'] : ['stop'];
-            },
-            actions: {
-                add: {
-                    label: 'label.add.new.tier',
-                    createForm: {
-                        title: 'label.add.new.tier',
-                        fields: {
-                            name: {
-                                label: 'label.name',
-                                validation: {
-                                    required: true
-                                },
-                                docID: 'helpTierName'
-                            },
-                            networkOfferingId: {
-                                label: 'label.network.offering',
-                                docID: 'helpTierNetworkOffering',
-                                validation: {
-                                    required: true
-                                },
-                                dependsOn: 'zoneId',
-                                select: function(args) {
-                                    var publicLbNetworkExists = false;
-                                    $.ajax({
-                                        url: createURL('listNetworks'),
-                                        data: {
-                                            vpcid: args.context.vpc[0].id,
-                                            supportedservices: 'LB'
-                                        },
-                                        success: function(json) {
-                                            var publicLbNetworkExists = false;
-
-                                            var lbNetworks = json.listnetworksresponse.network;
-                                            if (lbNetworks != null) {
-                                                for (var i = 0; i < lbNetworks.length; i++) {
-                                                    var thisNetworkOfferingIncludesPublicLbService = false;
-                                                    $.ajax({
-                                                        url: createURL('listNetworkOfferings'),
-                                                        data: {
-                                                            id: lbNetworks[i].networkofferingid
-                                                        },
-                                                        async: false,
-                                                        success: function(json) {
-                                                            var networkOffering = json.listnetworkofferingsresponse.networkoffering[0];
-                                                            $(networkOffering.service).each(function() {
-                                                                var thisService = this;
-                                                                if (thisService.name == "Lb" && lbProviderMap.publicLb.vpc.indexOf(thisService.provider[0].name) != -1) {
-                                                                    thisNetworkOfferingIncludesPublicLbService = true;
-                                                                    return false; //break $.each() loop
-                                                                }
-                                                            });
-                                                        }
-                                                    });
-                                                    if (thisNetworkOfferingIncludesPublicLbService == true) {
-                                                        publicLbNetworkExists = true;
-                                                        break; //break for loop
-                                                    }
-                                                }
-                                            }
-
-                                            $.ajax({
-                                                url: createURL('listNetworkOfferings'),
-                                                data: {
-                                                    forvpc: true,
-                                                    zoneid: args.zoneId,
-                                                    guestiptype: 'Isolated',
-                                                    supportedServices: 'SourceNat',
-                                                    state: 'Enabled'
-                                                },
-                                                success: function(json) {
-                                                    var networkOfferings = json.listnetworkofferingsresponse.networkoffering;
-                                                    args.$select.change(function() {
-                                                        var $vlan = args.$select.closest('form').find('[rel=vlan]');
-                                                        var networkOffering = $.grep(
-                                                            networkOfferings, function(netoffer) {
-                                                                return netoffer.id == args.$select.val();
-                                                            }
-                                                        )[0];
-
-                                                        if (networkOffering.specifyvlan) {
-                                                            $vlan.css('display', 'inline-block');
-                                                        } else {
-                                                            $vlan.hide();
-                                                        }
-                                                    });
-
-                                                    //only one network(tier) is allowed to have PublicLb (i.e. provider is PublicLb provider like "VpcVirtualRouter", "Netscaler") in a VPC
-                                                    var items;
-                                                    if (publicLbNetworkExists == true) { //so, if a PublicLb network(tier) already exists in the vpc, exclude PublicLb network offerings from dropdown
-                                                        items = $.grep(networkOfferings, function(networkOffering) {
-                                                            var thisNetworkOfferingIncludesPublicLbService = false;
-                                                            $(networkOffering.service).each(function() {
-                                                                var thisService = this;
-                                                                if (thisService.name == "Lb" && lbProviderMap.publicLb.vpc.indexOf(thisService.provider[0].name) != -1) {
-                                                                    thisNetworkOfferingIncludesPublicLbService = true;
-                                                                    return false; //break $.each() loop
-                                                                }
-                                                            });
-                                                            return !thisNetworkOfferingIncludesPublicLbService;
-                                                        });
-                                                    } else {
-                                                        items = networkOfferings;
-                                                    }
-
-                                                    args.response.success({
-                                                        data: $.map(items, function(item) {
-                                                            return {
-                                                                id: item.id,
-                                                                description: item.name
-                                                            };
-                                                        })
-                                                    });
-                                                }
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-                            vlan: {
-                                label: 'label.vlan',
-                                validation: {
-                                    required: true
-                                },
-                                isHidden: true
-                            },
-                            gateway: {
-                                label: 'label.gateway',
-                                docID: 'helpTierGateway',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            netmask: {
-                                label: 'label.netmask',
-                                docID: 'helpTierNetmask',
-                                validation: {
-                                    required: true
-                                }
-                            },
-                            externalId: {
-                            label: 'label.guest.externalId'
-                            },
-                            aclid: {
-                                label: 'label.acl',
-                                select: function(args) {
-                                    $.ajax({
-                                        url: createURL('listNetworkACLLists&vpcid=' + args.context.vpc[0].id),
-                                        dataType: 'json',
-                                        async: true,
-                                        success: function(json) {
-                                            var objs = json.listnetworkacllistsresponse.networkacllist;
-                                            var items = [];
-                                            items.push({
-                                                id: '',
-                                                description: ''
-                                            });
-                                            $(objs).each(function() {
-
-                                                items.push({
-                                                    id: this.id,
-                                                    description: this.name
-                                                });
-                                            });
-                                            args.response.success({
-                                                data: items
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            zoneid: {
-                                label: 'label.zone',
-                                validation: {
-                                    required: true
-                                },
-                                isHidden: true,
-
-                                select: function(args) {
-                                    //var $zoneSelect = $(".ui-dialog-content").find('select.zoneid');
-                                    var $zoneSelect = args.$select.closest('form').find('[rel=zoneid]');
-                                    if (!args.context.regions) {
-                                        $zoneSelect.hide();
-
-                                        args.response.success({
-                                            data: []
-                                        });
-                                    }
-                                    else {
-                                        $zoneSelect.css('display', 'inline-block');
-                                        $.ajax({
-                                            url: createURL('listZones'),
-                                            success: function(json) {
-                                               var zones = $.grep(json.listzonesresponse.zone, function(zone) {
-                                                   return (zone.networktype == 'Advanced');
-                                               });
-
-                                               args.response.success({
-                                                   data: $.map(zones, function(zone) {
-                                                       return {
-                                                           id: zone.id,
-                                                           description: zone.name
-                                                       };
-                                                   })
-                                               });
-                                            }
-                                        });
-                                    }
-                                }
-                            }
-                        }
-                    },
-                    action: function(args) {
-                        var dataObj = {
-                            vpcid: args.context.vpc[0].id,
-                            domainid: args.context.vpc[0].domainid,
-                            account: args.context.vpc[0].account,
-                            networkOfferingId: args.data.networkOfferingId,
-                            name: args.data.name,
-                            displayText: args.data.name,
-                            gateway: args.data.gateway,
-                            netmask: args.data.netmask
-                        };
-
-                        if (args.context.regions)
-                            $.extend(dataObj, {
-                                zoneId: args.data.zoneid
-                        })
-                        else
-                            $.extend(dataObj, {
-                                zoneId: args.context.vpc[0].zoneid
-                        });
-
-                        if (args.data.externalId != null && args.data.externalId.length > 0) {
-                            $.extend(dataObj, {
-                                externalid: args.data.externalId
-                            });
-                        }
-
-                        if (args.data.aclid != '') {
-                            $.extend(dataObj, {
-                                aclid: args.data.aclid
-                            });
-                        }
-
-                        if (args.$form.find('.form-item[rel=vlan]').is(':visible')) {
-                            $.extend(dataObj, {
-                                vlan: args.data.vlan
-                            });
-                        }
-
-                        $.ajax({
-                            url: createURL('createNetwork'),
-                            dataType: 'json',
-                            data: dataObj,
-                            success: function(json) {
-                                args.response.success({
-                                    data: json.createnetworkresponse.network
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                            }
-                        });
-                    },
-                    messages: {
-                        notification: function() {
-                            return 'label.add.new.tier';
-                        }
-                    }
-                },
-
-                /*
-         start: {
-         label: 'Start tier',
-         shortLabel: 'Start',
-         action: function(args) {
-         args.response.success();
-         },
-         notification: {
-         poll: function(args) { args.complete({ data: { state: 'Running' } }); }
-         }
-         },
-         */
-
-                /*
-         stop: {
-         label: 'Stop tier',
-         shortLabel: 'Stop',
-         action: function(args) {
-         args.response.success();
-         },
-         notification: {
-         poll: function(args) { args.complete({ data: { state: 'Stopped' } }); }
-         }
-         },
-         */
-
-                addVM: {
-                    label: 'label.add.VM.to.tier',
-                    shortLabel: 'label.add.vm',
-                    action: cloudStack.uiCustom.instanceWizard(
-                        $.extend(true, {}, cloudStack.instanceWizard, {
-                            pluginForm: {
-                                name: 'vpcTierInstanceWizard'
-                            }
-                        })
-                    ),
-                    notification: {
-                        poll: pollAsyncJobResult
-                    }
-                },
-
-                // Removing ACL buttons from the tier chart
-                /* acl: {
-          label: 'Configure ACL for tier',
-          shortLabel: 'ACL',
-         multiEdit: aclMultiEdit
-        }, */
-
-                remove: {
-                    label: 'label.remove.tier',
-                    action: function(args) {
-                        $.ajax({
-                            url: createURL('deleteNetwork'),
-                            dataType: "json",
-                            data: {
-                                id: args.context.networks[0].id
-                            },
-                            success: function(json) {
-                                var jid = json.deletenetworkresponse.jobid;
-                                args.response.success({
-                                    _custom: {
-                                        jobId: jid
-                                    }
-                                });
-                            }
-                        });
-                    },
-                    notification: {
-                        poll: pollAsyncJobResult
-                    }
-                }
-            },
-
-            // Get tiers
-            dataProvider: function(args) {
-                $.ajax({
-                    url: createURL("listNetworks"),
-                    dataType: "json",
-                    data: {
-                        vpcid: args.context.vpc[0].id,
-                        //listAll: true,  //do not pass listAll to listNetworks under VPC
-                        domainid: args.context.vpc[0].domainid,
-                        account: args.context.vpc[0].account
-                    },
-                    async: true,
-                    success: function(json) {
-                        var networks = json.listnetworksresponse.network;
-                        var networkACLLists, publicIpAddresses, privateGateways, vpnGateways;
-                        var error = false;
-
-                        // Get network ACL lists
-                        $.ajax({
-                            url: createURL('listNetworkACLLists'),
-                            data: {
-                                'vpcid': args.context.vpc[0].id
-                            },
-                            async: false,
-                            success: function(json) {
-                                networkACLLists = json.listnetworkacllistsresponse;
-                            },
-                            error: function(json) {
-                                error = true;
-                            }
-                        });
-
-                        // Get public IPs
-                        $.ajax({
-                            url: createURL('listPublicIpAddresses'),
-                            async: false,
-                            data: {
-                                vpcid: args.context.vpc[0].id,
-                                listAll: true
-                            },
-                            success: function(json) {
-                                publicIpAddresses = json.listpublicipaddressesresponse;
-                            },
-                            error: function(json) {
-                                error = true;
-                            }
-                        });
-
-                        // Get private gateways
-                        $.ajax({
-                            url: createURL('listPrivateGateways'),
-                            async: false,
-                            data: {
-                                'vpcid': args.context.vpc[0].id,
-                                listAll: true
-                            },
-                            success: function(json) {
-                                privateGateways = json.listprivategatewaysresponse;
-                            },
-                            error: function(json) {
-                                error = true;
-                            }
-                        });
-
-                        // Get VPN gateways
-                        $.ajax({
-                            url: createURL('listVpnGateways'),
-                            async: false,
-                            data: {
-                                listAll: true,
-                                'vpcid': args.context.vpc[0].id
-                            },
-                            success: function(json) {
-                                vpnGateways = json.listvpngatewaysresponse;
-                            },
-                            error: function(json) {
-                                error = true;
-                            }
-                        });
-
-                        args.response.success({
-                            routerDashboard: [{
-                                id: 'privateGateways',
-                                name: 'Private gateways',
-                                total: privateGateways.count
-                            }, {
-                                id: 'publicIPs',
-                                name: 'Public IP addresses',
-                                total: publicIpAddresses.count
-                            }, {
-                                id: 'siteToSiteVPNs',
-                                name: 'Site-to-site VPNs',
-                                total: vpnGateways.count
-                            }, {
-                                id: 'networkACLLists',
-                                name: 'Network ACL lists',
-                                total: networkACLLists.count
-                            }],
-                            tiers: $(networks).map(function(index, tier) {
-                                var internalLoadBalancers, publicLbIps, virtualMachines, staticNatIps;
-
-                                // Get internal load balancers
-                                $.ajax({
-                                    url: createURL('listLoadBalancers&listAll=true'),
-                                    async: false,
-                                    data: {
-                                        networkid: tier.id
-                                    },
-                                    success: function(json) {
-                                        internalLoadBalancers = json.listloadbalancersresponse;
-                                    },
-                                    error: function(json) {
-                                        error = true;
-                                    }
-                                });
-
-                                // Get Public LB IPs
-                                $.ajax({
-                                    url: createURL('listPublicIpAddresses&listAll=true'),
-                                    async: false,
-                                    data: {
-                                        associatednetworkid: tier.id,
-                                        forloadbalancing: true
-                                    },
-                                    success: function(json) {
-                                        publicLbIps = json.listpublicipaddressesresponse;
-                                    },
-                                    error: function(json) {
-                                        error = true;
-                                    }
-                                });
-
-                                // Get static NAT IPs
-                                $.ajax({
-                                    url: createURL('listPublicIpAddresses&listAll=true'),
-                                    async: false,
-                                    data: {
-                                        associatednetworkid: tier.id,
-                                        isstaticnat: true
-                                    },
-                                    success: function(json) {
-                                        staticNatIps = json.listpublicipaddressesresponse;
-                                    },
-                                    error: function(json) {
-                                        error = true;
-                                    }
-                                });
-
-                                // Get VMs
-                                $.ajax({
-                                    url: createURL('listVirtualMachines&listAll=true'),
-                                    async: false,
-                                    data: {
-                                        networkid: tier.id
-                                    },
-                                    success: function(json) {
-                                        virtualMachines = json.listvirtualmachinesresponse;
-                                    },
-                                    error: function(json) {
-                                        error = true;
-                                    }
-                                });
-
-                                // Highlight if any tier VM contains guest network
-                                $.grep(
-                                    virtualMachines.virtualmachine ? virtualMachines.virtualmachine : [],
-                                    function(vm) {
-                                        return $.grep(vm.nic,
-                                            function(nic) {
-                                                return nic.type == 'Shared';
-                                            }).length;
-                                    }
-                                ).length ? tier._highlighted = true : tier._highlighted = false;
-
-                                // Get LB capabilities
-
-                                var lbSchemes = $.grep(
-                                    tier.service,
-                                    function(service) {
-                                        return service.name == 'Lb';
-                                    }
-                                ).length ? $.grep($.grep(
-                                    tier.service,
-                                    function(service) {
-                                        return service.name == 'Lb';
-                                    }
-                                )[0].capability, function(capability) {
-                                    return capability.name == 'LbSchemes';
-                                }) : [];
-
-                                var hasLbScheme = function(schemeVal) {
-                                    return $.grep(
-                                        lbSchemes,
-                                        function(scheme) {
-                                            return scheme.value == schemeVal;
-                                        }
-                                    ).length ? true : false;
-                                };
-
-                                return $.extend(tier, {
-                                    _dashboardItems: [{
-                                        id: 'internalLoadBalancers',
-                                        name: 'Internal LB',
-                                        total: internalLoadBalancers.count,
-                                        _disabled: !hasLbScheme('Internal')
-                                    }, {
-                                        id: 'publicLbIps',
-                                        name: 'Public LB IP',
-                                        total: publicLbIps.count,
-                                        _disabled: !hasLbScheme('Public')
-                                    }, {
-                                        id: 'tierStaticNATs',
-                                        name: 'Static NATs',
-                                        total: staticNatIps.count
-                                    }, {
-                                        id: 'tierVMs',
-                                        name: 'Virtual Machines',
-                                        total: virtualMachines.count
-                                    }]
-                                });
-                            })
-                        });
-                        if (error) {
-                            cloudStack.dialog.notice({
-                                message: 'Error loading dashboard data.'
-                            });
-                        }
-                    }
-                });
-            }
-        }
-    };
-}(jQuery, cloudStack));
diff --git a/ui/legacy/scripts/zoneWizard.js b/ui/legacy/scripts/zoneWizard.js
deleted file mode 100755
index b7e5d01..0000000
--- a/ui/legacy/scripts/zoneWizard.js
+++ /dev/null
@@ -1,4838 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function(cloudStack, $) {
-    var selectedNetworkOfferingHavingSG = false;
-    var selectedNetworkOfferingHavingEIP = false;
-    var selectedNetworkOfferingHavingELB = false;
-    var selectedNetworkOfferingHavingNetscaler = false;
-    var returnedPublicVlanIpRanges = []; //public VlanIpRanges returned by API
-    var configurationUseLocalStorage = false;
-    var skipGuestTrafficStep = false;
-    var selectedNetworkOfferingObj = {};
-    var baremetalProviders = ["BaremetalDhcpProvider", "BaremetalPxeProvider", "BaremetalUserdataProvider"];
-    var selectedBaremetalProviders = [];
-
-    // Makes URL string for traffic label
-    var trafficLabelParam = function(trafficTypeID, data, physicalNetworkID) {
-        var zoneType = data.zone.networkType;
-        var hypervisor = data.zone.hypervisor;
-        physicalNetworkID = zoneType == 'Advanced' ? physicalNetworkID : 0;
-        var physicalNetwork = data.physicalNetworks ? data.physicalNetworks[physicalNetworkID] : null;
-        var trafficConfig = physicalNetwork ? physicalNetwork.trafficTypeConfiguration[trafficTypeID] : null;
-
-        var trafficLabel;
-        if (trafficConfig != null) {
-            if ('label' in trafficConfig) {
-                trafficLabel = trafficConfig.label;
-            }
-            else {
-                trafficLabel = '';
-
-                if ('vSwitchName' in trafficConfig) {
-                    trafficLabel += trafficConfig.vSwitchName;
-                }
-                if ('vlanId' in trafficConfig) {
-                    if (trafficLabel.length > 0)
-                        trafficLabel += ',';
-                    trafficLabel += trafficConfig.vlanId;
-                }
-                if ('vSwitchType' in trafficConfig) {
-                    if (trafficLabel.length > 0)
-                        trafficLabel += ',';
-                    trafficLabel += trafficConfig.vSwitchType;
-                }
-
-                if (trafficLabel.length == 0) { //trafficLabel == ''
-                    trafficLabel = null;
-                } else if (trafficLabel.length >= 1) {
-                    if (trafficLabel.charAt(trafficLabel.length-1) == ',') { //if last character is comma
-                        trafficLabel = trafficLabel.substring(0, trafficLabel.length - 1); //remove the last character (which is comma)
-                    }
-                }
-            }
-        }
-
-        var hypervisorAttr, trafficLabelStr;
-
-        switch (hypervisor) {
-            case 'XenServer':
-                hypervisorAttr = 'xennetworklabel';
-                break;
-            case 'KVM':
-                hypervisorAttr = 'kvmnetworklabel';
-                break;
-            case 'VMware':
-                hypervisorAttr = 'vmwarenetworklabel';
-                break;
-            case 'Hyperv':
-                hypervisorAttr = 'hypervnetworklabel';
-                break;
-            case 'BareMetal':
-                hypervisorAttr = 'baremetalnetworklabel';
-                break;
-            case 'Ovm':
-                hypervisorAttr = 'ovmnetworklabel';
-                break;
-            case 'LXC':
-                hypervisorAttr = 'lxcnetworklabel';
-                break;
-            case 'Ovm3':
-                hypervisorAttr = 'ovm3networklabel';
-                break;
-        }
-
-        trafficLabelStr = trafficLabel ? '&' + hypervisorAttr + '=' + trafficLabel : '';
-
-        return trafficLabelStr;
-    };
-
-    cloudStack.zoneWizard = {
-        // Return required traffic types, for configure physical network screen
-        requiredTrafficTypes: function(args) {
-            if (args.data.zone.networkType == 'Basic') {
-                if (selectedNetworkOfferingHavingEIP || selectedNetworkOfferingHavingELB) {
-                    return [
-                        'management',
-                        'guest',
-                        'public'
-                    ];
-                } else {
-                    return [
-                        'management',
-                        'guest'
-                    ];
-                }
-            } else { // args.data.zone.networkType == 'Advanced'
-                if (args.data.zone.sgEnabled != true) {
-                    return [
-                        'management',
-                        'public',
-                        'guest'
-                    ];
-                } else {
-                    return [
-                        'management',
-                        'guest'
-                    ];
-                }
-            }
-        },
-
-        disabledTrafficTypes: function(args) {
-            if (args.data.zone.networkType == 'Basic') {
-                if (selectedNetworkOfferingHavingEIP || selectedNetworkOfferingHavingELB)
-                    return [];
-                else
-                    return ['public'];
-            } else { // args.data.zone.networkType == 'Advanced'
-                if (args.data.zone.sgEnabled != true) {
-                    return [];
-                } else {
-                    return ['public'];
-                }
-            }
-        },
-
-        cloneTrafficTypes: function(args) {
-            if (args.data.zone.networkType == 'Advanced') {
-                return ['guest'];
-            } else {
-                return [];
-            }
-        },
-
-        customUI: {
-            publicTrafficIPRange: function(args) {
-                var multiEditData = [];
-                var totalIndex = 0;
-
-                return $('<div>').multiEdit({
-                    context: args.context,
-                    noSelect: true,
-                    fields: {
-                        'gateway': {
-                            edit: true,
-                            label: 'label.gateway'
-                        },
-                        'netmask': {
-                            edit: true,
-                            label: 'label.netmask'
-                        },
-                        'vlanid': {
-                            edit: true,
-                            label: 'label.vlan',
-                            isOptional: true
-                        },
-                        'startip': {
-                            edit: true,
-                            label: 'label.start.IP',
-                            validation: {
-                                ipv4: true
-                            }
-                        },
-                        'endip': {
-                            edit: true,
-                            label: 'label.end.IP',
-                            validation: {
-                                ipv4: true
-                            }
-                        },
-                        'add-rule': {
-                            label: 'label.add',
-                            addButton: true
-                        }
-                    },
-                    add: {
-                        label: 'label.add',
-                        action: function(args) {
-                            multiEditData.push($.extend(args.data, {
-                                index: totalIndex
-                            }));
-
-                            totalIndex++;
-                            args.response.success();
-                        }
-                    },
-                    actions: {
-                        destroy: {
-                            label: 'label.remove.rule',
-                            action: function(args) {
-                                multiEditData = $.grep(multiEditData, function(item) {
-                                    return item.index != args.context.multiRule[0].index;
-                                });
-                                args.response.success();
-                            }
-                        }
-                    },
-                    dataProvider: function(args) {
-                        args.response.success({
-                            data: multiEditData
-                        });
-                    }
-                });
-            },
-
-            storageTrafficIPRange: function(args) {
-
-                var multiEditData = [];
-                var totalIndex = 0;
-
-                return $('<div>').multiEdit({
-                    context: args.context,
-                    noSelect: true,
-                    fields: {
-                        'gateway': {
-                            edit: true,
-                            label: 'label.gateway'
-                        },
-                        'netmask': {
-                            edit: true,
-                            label: 'label.netmask'
-                        },
-                        'vlan': {
-                            edit: true,
-                            label: 'label.vlan',
-                            isOptional: true
-                        },
-                        'startip': {
-                            edit: true,
-                            label: 'label.start.IP'
-                        },
-                        'endip': {
-                            edit: true,
-                            label: 'label.end.IP'
-                        },
-                        'add-rule': {
-                            label: 'label.add',
-                            addButton: true
-                        }
-                    },
-                    add: {
-                        label: 'label.add',
-                        action: function(args) {
-                            multiEditData.push($.extend(args.data, {
-                                index: totalIndex
-                            }));
-
-                            totalIndex++;
-                            args.response.success();
-                        }
-                    },
-                    actions: {
-                        destroy: {
-                            label: 'label.remove.rule',
-                            action: function(args) {
-                                multiEditData = $.grep(multiEditData, function(item) {
-                                    return item.index != args.context.multiRule[0].index;
-                                });
-                                args.response.success();
-                            }
-                        }
-                    },
-                    dataProvider: function(args) {
-                        args.response.success({
-                            data: multiEditData
-                        });
-                    }
-                });
-            }
-        },
-
-        preFilters: {
-            addNetscalerDevice: function(args) { //add Netscaler
-                var isShown;
-                if (selectedNetworkOfferingHavingNetscaler == true) {
-                    isShown = true;
-                    $('.conditional.netscaler').show();
-                } else {
-                    isShown = false;
-                    $('.conditional.netscaler').hide();
-                }
-                return isShown;
-            },
-
-            addPublicNetwork: function(args) {
-                var isShown;
-                var $publicTrafficDesc = $('.zone-wizard:visible').find('#add_zone_public_traffic_desc');
-                if (args.data['network-model'] == 'Basic') {
-                    if (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) {
-                        isShown = true;
-                    } else {
-                        isShown = false;
-                    }
-
-                    $publicTrafficDesc.find('#for_basic_zone').css('display', 'inline');
-                    $publicTrafficDesc.find('#for_advanced_zone').hide();
-                } else { //args.data['network-model'] == 'Advanced'
-                    if (args.data["zone-advanced-sg-enabled"] != "on")
-                        isShown = true;
-                    else
-                        isShown = false;
-
-                    $publicTrafficDesc.find('#for_advanced_zone').css('display', 'inline');
-                    $publicTrafficDesc.find('#for_basic_zone').hide();
-                }
-                return isShown;
-            },
-
-            setupPhysicalNetwork: function(args) {
-                if (args.data['network-model'] == 'Basic' && !(selectedNetworkOfferingHavingELB && selectedNetworkOfferingHavingEIP)) {
-                    $('.setup-physical-network .info-desc.conditional.basic').show();
-                    $('.setup-physical-network .info-desc.conditional.advanced').hide();
-                    $('.subnav li.public-network').hide();
-                } else {
-                    $('.setup-physical-network .info-desc.conditional.basic').hide();
-                    $('.setup-physical-network .info-desc.conditional.advanced').show();
-                    $('.subnav li.public-network').show();
-                }
-                return true; // Both basic & advanced zones show physical network UI
-            },
-
-            configureGuestTraffic: function(args) {
-                if ((args.data['network-model'] == 'Basic') || (args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] == "on")) {
-                    $('.setup-guest-traffic').addClass('basic');
-                    $('.setup-guest-traffic').removeClass('advanced');
-                    skipGuestTrafficStep = false; //set value
-                } else { //args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] !=    "on"
-                    $('.setup-guest-traffic').removeClass('basic');
-                    $('.setup-guest-traffic').addClass('advanced');
-
-                    //skip the step if OVS tunnel manager is enabled
-                    skipGuestTrafficStep = false; //reset it before ajax call
-                    $.ajax({
-                        url: createURL('listConfigurations'),
-                        data: {
-                            name: 'sdn.ovs.controller'
-                        },
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            var items = json.listconfigurationsresponse.configuration; //2 entries returned: 'sdn.ovs.controller', 'sdn.ovs.controller.default.label'
-                            $(items).each(function() {
-                                if (this.name == 'sdn.ovs.controller') {
-                                    if (this.value == 'true' || this.value == true) {
-                                        skipGuestTrafficStep = true;
-                                    }
-                                    return false; //break each loop
-                                }
-                            });
-                        }
-                    });
-                }
-                return !skipGuestTrafficStep;
-            },
-
-            configureStorageTraffic: function(args) {
-                return $.grep(args.groupedData.physicalNetworks, function(network) {
-                    return $.inArray('storage', network.trafficTypes) > -1;
-                }).length;
-            },
-
-            addHost: function(args) {
-                return (args.groupedData.zone.hypervisor != "VMware");
-            },
-
-            addPrimaryStorage: function(args) {
-                if(args.data.localstorageenabled == 'on' && args.data.localstorageenabledforsystemvm == 'on') {
-                    return false; //skip step only when both localstorage and localstorage for system vm are checked
-                }
-                return true;
-            }
-        },
-
-        forms: {
-            zone: {
-                preFilter: function(args) {
-                    var $form = args.$form;
-
-                    if (args.data['network-model'] == 'Basic') { //Basic zone
-                        args.$form.find('[rel=networkOfferingId]').show(); //will be used to create a guest network during zone creation
-                        args.$form.find('[rel=guestcidraddress]').hide();
-
-                        args.$form.find('[rel=ip6dns1]').hide();
-                        args.$form.find('[rel=ip6dns2]').hide();
-
-                        args.$form.find('[rel=ip6cidr]').hide();
-                        args.$form.find('[rel=ip6gateway]').hide();
-                    } else { //Advanced zone
-                        if (args.data["zone-advanced-sg-enabled"] != "on") { //Advanced SG-disabled zone
-                            args.$form.find('[rel=networkOfferingId]').hide();
-                            args.$form.find('[rel=guestcidraddress]').show();
-
-                            args.$form.find('[rel=ip6dns1]').show();
-                            args.$form.find('[rel=ip6dns2]').show();
-
-                            args.$form.find('[rel=ip6cidr]').hide();
-                            args.$form.find('[rel=ip6gateway]').hide();
-                        } else { //Advanced SG-enabled zone
-                            args.$form.find('[rel=networkOfferingId]').show(); //will be used to create a guest network during zone creation
-                            args.$form.find('[rel=guestcidraddress]').hide();
-
-                            args.$form.find('[rel=ip6dns1]').show();
-                            args.$form.find('[rel=ip6dns2]').show();
-
-                            args.$form.find('[rel=ip6cidr]').show();
-                            args.$form.find('[rel=ip6gateway]').show();
-                        }
-                    }
-                },
-                fields: {
-                    name: {
-                        label: 'label.name',
-                        validation: {
-                            required: true
-                        },
-                        desc: 'message.tooltip.zone.name'
-                    },
-                    ip4dns1: {
-                        label: 'label.ipv4.dns1',
-                        validation: {
-                            required: true,
-                            ipv4: true
-                        },
-                        desc: 'message.tooltip.dns.1'
-                    },
-                    ip4dns2: {
-                        label: 'label.ipv4.dns2',
-                        desc: 'message.tooltip.dns.2',
-                        validation: {
-                            ipv4: true
-                        }
-                    },
-
-                    ip6dns1: {
-                        label: 'label.ipv6.dns1',
-                        desc: 'message.tooltip.dns.1',
-                        validation: {
-                            ipv6: true
-                        }
-                    },
-                    ip6dns2: {
-                        label: 'label.ipv6.dns2',
-                        desc: 'message.tooltip.dns.2',
-                        validation: {
-                            ipv6: true
-                        }
-                   },
-
-                    ip6cidr: {
-                        label: 'label.ipv6.CIDR',
-                        validation: {
-                            required: false,
-                            ipv6cidr: true
-                        }
-                    },
-                    ip6gateway: {
-                        label: 'label.ipv6.gateway',
-                        validation: {
-                            required: false,
-                            ipv6: true
-                        }
-                    },
-
-                    internaldns1: {
-                        label: 'label.internal.dns.1',
-                        validation: {
-                            required: true,
-                            ipv4: true
-                        },
-                        desc: 'message.tooltip.internal.dns.1'
-                    },
-                    internaldns2: {
-                        label: 'label.internal.dns.2',
-                        desc: 'message.tooltip.internal.dns.2',
-                        validation: {
-                            ipv4: true
-                        }
-                    },
-                    hypervisor: {
-                        label: 'label.hypervisor',
-                        validation: {
-                            required: true
-                        },
-                        select: function(args) {
-                            $.ajax({
-                                url: createURL('listHypervisors'),
-                                async: false,
-                                data: {
-                                    listAll: true
-                                },
-                                success: function(json) {
-                                    var items = json.listhypervisorsresponse.hypervisor;
-                                    var array1 = [];
-
-                                    var firstOption = "XenServer";
-                                    var nonSupportedHypervisors = {};
-                                    if (args.context.zones[0]['network-model'] == "Advanced" && args.context.zones[0]['zone-advanced-sg-enabled'] == "on") {
-                                        firstOption = "KVM";
-                                        nonSupportedHypervisors["VMware"] = 1;
-                                        nonSupportedHypervisors["BareMetal"] = 1;
-                                        nonSupportedHypervisors["Hyperv"] = 1;
-                                        nonSupportedHypervisors["Ovm"] = 1;
-                                        nonSupportedHypervisors["Ovm3"] = 1;
-                                    }
-
-                                    if (args.context.zones[0]['network-model'] == "Advanced") { //CLOUDSTACK-7681: UI > zone wizard > Advanced zone > hypervisor => do not support BareMetal
-                                        nonSupportedHypervisors["BareMetal"] = 1;
-                                    }
-
-                                    if (items != null) {
-                                        for (var i = 0; i < items.length; i++) {
-                                            if (items[i].name in nonSupportedHypervisors)
-                                                continue;
-
-                                            if (items[i].name == firstOption)
-                                                array1.unshift({
-                                                    id: items[i].name,
-                                                    description: items[i].name
-                                                });
-                                            else
-                                                array1.push({
-                                                    id: items[i].name,
-                                                    description: items[i].name
-                                                });
-                                        }
-                                    }
-                                    args.response.success({
-                                        data: array1
-                                    });
-                                }
-                            });
-                        }
-                    },
-                    networkOfferingId: {
-                        label: 'label.network.offering',
-                        dependsOn: 'hypervisor',
-                        select: function(args) {
-                            var selectedNetworkOfferingObj = {};
-                            var networkOfferingObjs = [];
-
-                            args.$select.unbind("change").bind("change", function() {
-                                //reset when different network offering is selected
-                                selectedNetworkOfferingHavingSG = false;
-                                selectedNetworkOfferingHavingEIP = false;
-                                selectedNetworkOfferingHavingELB = false;
-                                selectedNetworkOfferingHavingNetscaler = false;
-
-                                var selectedNetworkOfferingId = $(this).val();
-                                $(networkOfferingObjs).each(function() {
-                                    if (this.id == selectedNetworkOfferingId) {
-                                        selectedNetworkOfferingObj = this;
-                                        return false; //break $.each() loop
-                                    }
-                                });
-
-                                if (selectedNetworkOfferingObj.havingNetscaler == true)
-                                    selectedNetworkOfferingHavingNetscaler = true;
-                                if (selectedNetworkOfferingObj.havingSG == true)
-                                    selectedNetworkOfferingHavingSG = true;
-                                if (selectedNetworkOfferingObj.havingEIP == true)
-                                    selectedNetworkOfferingHavingEIP = true;
-                                if (selectedNetworkOfferingObj.havingELB == true)
-                                    selectedNetworkOfferingHavingELB = true;
-                            });
-
-
-                            $.ajax({
-                                url: createURL("listNetworkOfferings&state=Enabled&guestiptype=Shared"),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
-                                    var availableNetworkOfferingObjs = [];
-                                    $(networkOfferingObjs).each(function() {
-                                        var thisNetworkOffering = this;
-                                        $(this.service).each(function() {
-                                            var thisService = this;
-
-                                            $(thisService.provider).each(function() {
-                                                if (this.name == "Netscaler") {
-                                                    thisNetworkOffering.havingNetscaler = true;
-                                                } else if ($.inArray(this.name, baremetalProviders) != -1) {
-                                                    selectedBaremetalProviders.push(this.name);
-                                                }
-                                            });
-
-                                            if (thisService.name == "SecurityGroup") {
-                                                thisNetworkOffering.havingSG = true;
-                                            } else if (thisService.name == "StaticNat") {
-                                                $(thisService.capability).each(function() {
-                                                    if (this.name == "ElasticIp" && this.value == "true") {
-                                                        thisNetworkOffering.havingEIP = true;
-                                                        return false; //break $.each() loop
-                                                    }
-                                                });
-                                            } else if (thisService.name == "Lb") {
-                                                $(thisService.capability).each(function() {
-                                                    if (this.name == "ElasticLb" && this.value == "true") {
-                                                        thisNetworkOffering.havingELB = true;
-                                                        return false; //break $.each() loop
-                                                    }
-                                                });
-                                            }
-                                        });
-
-                                        if (thisNetworkOffering.havingEIP == true && thisNetworkOffering.havingELB == true) { //EIP ELB
-                                            if (args.hypervisor == "VMware") { //VMware does not support EIP ELB
-                                                return true; //move to next item in $.each() loop
-                                            }
-                                            if (args.context.zones[0]["network-model"] == "Advanced" && args.context.zones[0]["zone-advanced-sg-enabled"] == "on") { // Advanced SG-enabled zone doesn't support EIP ELB
-                                                return true; //move to next item in $.each() loop
-                                            }
-                                        }
-
-                                        if (args.context.zones[0]["network-model"] == "Advanced" && args.context.zones[0]["zone-advanced-sg-enabled"] == "on") { // Advanced SG-enabled zone
-                                            if (thisNetworkOffering.havingSG != true) {
-                                                return true; //move to next item in $.each() loop
-                                            }
-                                        }
-
-                                        availableNetworkOfferingObjs.push(thisNetworkOffering);
-                                    });
-
-                                    args.response.success({
-                                        data: $.map(availableNetworkOfferingObjs, function(offering) {
-                                            return {
-                                                id: offering.id,
-                                                description: offering.name
-                                            };
-                                        })
-                                    });
-
-                                }
-                            });
-                        }
-                    },
-                    networkdomain: {
-                        label: 'label.network.domain',
-                        desc: 'message.tooltip.network.domain'
-                    },
-                    guestcidraddress: {
-                        label: 'label.guest.cidr',
-                        defaultValue: '10.1.1.0/24',
-                        validation: {
-                            required: false
-                        }
-                    },
-                    isdedicated: {
-                        isBoolean: true,
-                        label: 'label.dedicated',
-                        isChecked: false
-                    },
-                    domain: {
-                        label: 'label.domain',
-                        dependsOn: 'isdedicated',
-                        isHidden: true,
-                        select: function(args) {
-                            $.ajax({
-                                url: createURL("listDomains&listAll=true"),
-                                data: {
-                                    viewAll: true
-                                },
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    domainObjs = json.listdomainsresponse.domain;
-                                    args.response.success({
-                                        data: $.map(domainObjs, function(domain) {
-                                            return {
-                                                id: domain.id,
-                                                description: domain.path
-                                            };
-                                        })
-                                    });
-                                }
-                            });
-                        }
-                    },
-
-                    account: {
-                        label: 'label.account',
-                        isHidden: true,
-                        dependsOn: 'isdedicated',
-                        //docID:'helpAccountForDedication',
-                        validation: {
-                            required: false
-                        }
-
-                    },
-
-                    localstorageenabled: {
-                        label: 'label.local.storage.enabled',
-                        isBoolean: true,
-                        onChange: function(args) {
-
-                        }
-                    },
-
-                    localstorageenabledforsystemvm: {
-                        label: 'label.local.storage.enabled.system.vms',
-                        isBoolean: true,
-                        onChange: function(args) {
-
-                        }
-                    }
-                }
-            },
-
-            pod: {
-                fields: {
-                    name: {
-                        label: 'label.pod.name',
-                        validation: {
-                            required: true
-                        },
-                        desc: 'message.tooltip.pod.name'
-                    },
-                    reservedSystemGateway: {
-                        label: 'label.reserved.system.gateway',
-                        validation: {
-                            required: true
-                        },
-                        desc: 'message.tooltip.reserved.system.gateway'
-                    },
-                    reservedSystemNetmask: {
-                        label: 'label.reserved.system.netmask',
-                        validation: {
-                            required: true
-                        },
-                        desc: 'message.tooltip.reserved.system.netmask'
-                    },
-                    reservedSystemStartIp: {
-                        label: 'label.start.reserved.system.IP',
-                        validation: {
-                            required: true,
-                            ipv4: true
-                        }
-                    },
-                    reservedSystemEndIp: {
-                        label: 'label.end.reserved.system.IP',
-                        validation: {
-                            required: false,
-                            ipv4: true
-                        }
-                    }
-                }
-            },
-
-            basicPhysicalNetwork: { //"Netscaler" now
-                preFilter: function(args) {
-                    if (args.data['network-model'] == 'Basic' && (selectedNetworkOfferingHavingELB || selectedNetworkOfferingHavingEIP)) {
-                        args.$form.find('[rel=dedicated]').hide();
-                    } else {
-                        args.$form.find('[rel=dedicated]').show();
-                    };
-                    cloudStack.preFilter.addLoadBalancerDevice
-                },
-                fields: {
-                    ip: {
-                        label: 'label.ip.address'
-                    },
-                    username: {
-                        label: 'label.username'
-                    },
-                    password: {
-                        label: 'label.password',
-                        isPassword: true
-                    },
-                    networkdevicetype: {
-                        label: 'label.type',
-                        select: function(args) {
-                            var items = [];
-                            items.push({
-                                id: "NetscalerMPXLoadBalancer",
-                                description: "NetScaler MPX LoadBalancer"
-                            });
-                            items.push({
-                                id: "NetscalerVPXLoadBalancer",
-                                description: "NetScaler VPX LoadBalancer"
-                            });
-                            items.push({
-                                id: "NetscalerSDXLoadBalancer",
-                                description: "NetScaler SDX LoadBalancer"
-                            });
-                            args.response.success({
-                                data: items
-                            });
-                        }
-                    },
-                    publicinterface: {
-                        label: 'label.public.interface'
-                    },
-                    privateinterface: {
-                        label: 'label.private.interface'
-                    },
-                    gslbprovider: {
-                        label: 'label.gslb.service',
-                        isBoolean: true,
-                        isChecked: false
-                    },
-                    gslbproviderpublicip: {
-                        label: 'label.gslb.service.public.ip'
-                    },
-                    gslbproviderprivateip: {
-                        label: 'label.gslb.service.private.ip'
-                    },
-                    numretries: {
-                        label: 'label.numretries',
-                        defaultValue: '2'
-                    },
-                    dedicated: {
-                        label: 'label.dedicated',
-                        isBoolean: true,
-                        isChecked: false
-                    },
-                    capacity: {
-                        label: 'label.capacity',
-                        validation: {
-                            required: false,
-                            number: true
-                        }
-                    }
-                }
-            },
-
-            guestTraffic: {
-                preFilter: function(args) {
-                    var $guestTrafficDesc = $('.zone-wizard:visible').find('#add_zone_guest_traffic_desc');
-                    if ((args.data['network-model'] == 'Basic') || (args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] == "on")) {
-                        $guestTrafficDesc.find('#for_basic_zone').css('display', 'inline');
-                        $guestTrafficDesc.find('#for_advanced_zone').hide();
-                    } else { //args.data['network-model'] == 'Advanced' && args.data["zone-advanced-sg-enabled"] !=    "on"
-                        $guestTrafficDesc.find('#for_advanced_zone').css('display', 'inline');
-                        $guestTrafficDesc.find('#for_basic_zone').hide();
-                    }
-
-                    var selectedZoneObj = {
-                        networktype: args.data['network-model']
-                    };
-
-                    if (selectedZoneObj.networktype == 'Basic') {
-                        args.$form.find('[rel="guestGateway"]').show();
-                        args.$form.find('[rel="guestNetmask"]').show();
-                        args.$form.find('[rel="guestStartIp"]').show();
-                        args.$form.find('[rel="guestEndIp"]').show();
-                        args.$form.find('[rel="vlanId"]').hide();
-                        args.$form.find('[rel="vlanRange"]').hide();
-                    } else if (selectedZoneObj.networktype == 'Advanced' && args.data["zone-advanced-sg-enabled"] == "on") {
-                        args.$form.find('[rel="guestGateway"]').show();
-                        args.$form.find('[rel="guestNetmask"]').show();
-                        args.$form.find('[rel="guestStartIp"]').show();
-                        args.$form.find('[rel="guestEndIp"]').show();
-                        args.$form.find('[rel="vlanId"]').show();
-                        args.$form.find('[rel="vlanRange"]').hide();
-                    } else if (selectedZoneObj.networktype == 'Advanced' && args.data["zone-advanced-sg-enabled"] != "on") { //this conditional statement is useless because the div will be replaced with other div(multiple tabs in Advanced zone without SG) later
-                        args.$form.find('[rel="guestGateway"]').hide();
-                        args.$form.find('[rel="guestNetmask"]').hide();
-                        args.$form.find('[rel="guestStartIp"]').hide();
-                        args.$form.find('[rel="guestEndIp"]').hide();
-                        args.$form.find('[rel="vlanId"]').hide();
-                        args.$form.find('[rel="vlanRange"]').show();
-                    }
-                },
-
-                fields: {
-                    guestGateway: {
-                        label: 'label.guest.gateway'
-                    }, //Basic, Advanced with SG
-                    guestNetmask: {
-                        label: 'label.guest.netmask'
-                    }, //Basic, Advanced with SG
-                    guestStartIp: {
-                        label: 'label.guest.start.ip'
-                    }, //Basic, Advanced with SG
-                    guestEndIp: {
-                        label: 'label.guest.end.ip'
-                    }, //Basic, Advanced with SG
-                    vlanId: {
-                        label: 'label.vlan.id'
-                    }, //Advanced with SG
-
-                    vlanRange: { //in multiple tabs (tabs is as many as Guest Traffic types in multiple physical networks in Advanced Zone without SG)
-                        label: 'label.vlan.range',
-                        range: ['vlanRangeStart', 'vlanRangeEnd'],
-                        validation: {
-                            required: false,
-                            digits: true
-                        } //Bug 13517 - AddZone wizard->Configure guest traffic: Vlan Range is optional
-                    }
-                }
-            },
-            cluster: {
-                fields: {
-                    hypervisor: {
-                        label: 'label.hypervisor',
-                        select: function(args) {
-                            // Disable select -- selection is made on zone setup step
-                            args.$select.attr('disabled', 'disabled');
-
-                            $.ajax({
-                                url: createURL("listHypervisors"),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var hypervisors = json.listhypervisorsresponse.hypervisor;
-                                    var items = [];
-                                    $(hypervisors).each(function() {
-                                        items.push({
-                                            id: this.name,
-                                            description: this.name
-                                        })
-                                    });
-                                    args.response.success({
-                                        data: items
-                                    });
-                                    args.$select.val(args.context.zones[0].hypervisor);
-                                    args.$select.change();
-                                }
-                            });
-
-                            var vSwitchEnabled = false;
-                            var dvSwitchEnabled = false;
-                            // Check whether vSwitch capability is enabled
-                            $.ajax({
-                                url: createURL('listConfigurations'),
-                                data: {
-                                    name: 'vmware.use.nexus.vswitch'
-                                },
-                                async: false,
-                                success: function(json) {
-                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                        vSwitchEnabled = true;
-                                    }
-                                }
-                            });
-
-                            //Check whether dvSwitch is enabled or not
-                            $.ajax({
-                                url: createURL('listConfigurations'),
-                                data: {
-                                    name: 'vmware.use.dvswitch'
-                                },
-                                async: false,
-                                success: function(json) {
-                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
-                                        dvSwitchEnabled = true;
-                                    }
-                                }
-                            });
-
-                            args.$select.bind("change", function(event) {
-                                var $form = $(this).closest('form');
-                                var $vsmFields = $form.find('[rel]').filter(function() {
-                                    var vsmFields = [
-                                        'vsmipaddress',
-                                        'vsmusername',
-                                        'vsmpassword'
-                                    ];
-
-                                    return $.inArray($(this).attr('rel'), vsmFields) > -1;
-                                });
-
-                                if ($(this).val() == "VMware") {
-                                    if (dvSwitchEnabled) {
-                                        $form.find('.form-item[rel=overridepublictraffic]').css('display', 'inline-block');
-                                        $form.find('.form-item[rel=overridepublictraffic]').find('input[type=checkbox]').prop('checked', false);
-
-                                        $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'inline-block');
-                                        $form.find('.form-item[rel=overrideguesttraffic]').find('input[type=checkbox]').prop('checked', false);
-                                    } else {
-                                        $form.find('.form-item[rel=overridepublictraffic]').css('display', 'none');
-                                        $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'none');
-                                    }
-
-                                    $form.find('[rel=vCenterHost]').css('display', 'block');
-                                    $form.find('[rel=vCenterUsername]').css('display', 'block');
-                                    $form.find('[rel=vCenterPassword]').css('display', 'block');
-                                    $form.find('[rel=vCenterDatacenter]').css('display', 'block');
-
-                                    if (vSwitchEnabled) {
-                                        $vsmFields.css('display', 'block');
-                                    } else {
-                                        $vsmFields.css('display', 'none');
-                                    }
-                                } else if ($(this).val() == "Ovm3") {
-                                    $form.find('.form-item[rel=ovm3pool]').css('display', 'inline-block');
-                                    $form.find('.form-item[rel=ovm3pool]').find('input[type=checkbox]').prop('checked', false);
-
-                                    $form.find('.form-item[rel=ovm3cluster]').css('display', 'inline-block');
-                                    $form.find('.form-item[rel=ovm3cluster]').find('input[type=checkbox]').prop('checked', false);
-                                    $form.find('[rel=ovm3vip]').css('display', 'block');
-                                } else {
-                                    $form.find('.form-item[rel=overridepublictraffic]').css('display', 'none');
-                                    $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'none');
-
-                                    $form.find('[rel=vCenterHost]').css('display', 'none');
-                                    $form.find('[rel=vCenterUsername]').css('display', 'none');
-                                    $form.find('[rel=vCenterPassword]').css('display', 'none');
-                                    $form.find('[rel=vCenterDatacenter]').css('display', 'none');
-                                }
-                            });
-                        }
-                    },
-                    name: {
-                        label: 'label.cluster.name',
-                        validation: {
-                            required: true
-                        }
-                    },
-
-                    //hypervisor==VMWare begins here
-
-                    vCenterHost: {
-                        label: 'label.vcenter.host',
-                        validation: {
-                            required: true
-                        } //required, for firing addVmwareDc API
-                    },
-                    vCenterUsername: {
-                        label: 'label.vcenter.username',
-                        validation: {
-                            required: true
-                        } //required, for firing addVmwareDc API
-                    },
-                    vCenterPassword: {
-                        label: 'label.vcenter.password',
-                        isPassword: true,
-                        validation: {
-                            required: true
-                        } //required, for firing addVmwareDc API
-                    },
-                    vCenterDatacenter: {
-                        label: 'label.vcenter.datacenter',
-                        validation: {
-                            required: true
-                        } //required, for firing addVmwareDc API
-                    },
-
-                    overridepublictraffic: {
-                        label: 'label.override.public.traffic',
-                        isBoolean: true,
-                        isHidden: true
-
-                    },
-
-                    overrideguesttraffic: {
-                        label: 'label.override.guest.traffic',
-                        isBoolean: true,
-                        isHidden: true
-
-                    },
-
-                    //Cisco Nexus Vswitch
-                    vsmipaddress: {
-                        label: 'label.cisco.nexus1000v.ip.address',
-                        validation: {
-                            required: false
-                        },
-                        isHidden: true
-                    },
-                    vsmusername: {
-                        label: 'label.cisco.nexus1000v.username',
-                        validation: {
-                            required: false
-                        },
-                        isHidden: true
-                    },
-                    vsmpassword: {
-                        label: 'label.cisco.nexus1000v.password',
-                        validation: {
-                            required: false
-                        },
-                        isPassword: true,
-                        isHidden: true
-                    }
-                    //hypervisor==VMWare ends here
-                }
-            },
-            host: {
-                preFilter: function(args) {
-                    var selectedClusterObj = {
-                        hypervisortype: args.data.hypervisor
-                    };
-
-                    var $form = args.$form;
-
-                    if (selectedClusterObj.hypervisortype == "VMware") {
-                        $form.find('[rel=hostname]').hide();
-                        $form.find('[rel=username]').hide();
-                        $form.find('[rel=password]').hide();
-
-                        $form.find('[rel=vcenterHost]').css('display', 'block');
-
-                        $form.find('[rel=baremetalCpuCores]').hide();
-                        $form.find('[rel=baremetalCpu]').hide();
-                        $form.find('[rel=baremetalMemory]').hide();
-                        $form.find('[rel=baremetalMAC]').hide();
-
-                        $form.find('[rel=agentUsername]').hide();
-                        $form.find('[rel=agentPassword]').hide();
-
-                        $form.find('.form-item[rel=agentUsername]').hide();
-                        $form.find('.form-item[rel=agentPassword]').hide();
-                        $form.find('.form-item[rel=agentPort]').hide();
-                        $form.find('.form-item[rel=ovm3vip]').hide();
-                        $form.find('.form-item[rel=ovm3pool]').hide();
-                        $form.find('.form-item[rel=ovm3cluster]').hide();
-                    } else if (selectedClusterObj.hypervisortype == "BareMetal") {
-                        $form.find('[rel=hostname]').css('display', 'block');
-                        $form.find('[rel=username]').css('display', 'block');
-                        $form.find('[rel=password]').css('display', 'block');
-
-                        $form.find('[rel=baremetalCpuCores]').css('display', 'block');
-                        $form.find('[rel=baremetalCpu]').css('display', 'block');
-                        $form.find('[rel=baremetalMemory]').css('display', 'block');
-                        $form.find('[rel=baremetalMAC]').css('display', 'block');
-
-                        $form.find('[rel=vcenterHost]').hide();
-
-                        $form.find('[rel=agentUsername]').hide();
-                        $form.find('[rel=agentPassword]').hide();
-
-                        $form.find('.form-item[rel=agentUsername]').hide();
-                        $form.find('.form-item[rel=agentPassword]').hide();
-                        $form.find('.form-item[rel=agentPort]').hide();
-                        $form.find('.form-item[rel=ovm3vip]').hide();
-                        $form.find('.form-item[rel=ovm3pool]').hide();
-                        $form.find('.form-item[rel=ovm3cluster]').hide();
-                    } else if (selectedClusterObj.hypervisortype == "Ovm") {
-                        $form.find('[rel=hostname]').css('display', 'block');
-                        $form.find('[rel=username]').css('display', 'block');
-                        $form.find('[rel=password]').css('display', 'block');
-
-                        $form.find('[rel=vcenterHost]').hide();
-
-                        $form.find('[rel=baremetalCpuCores]').hide();
-                        $form.find('[rel=baremetalCpu]').hide();
-                        $form.find('[rel=baremetalMemory]').hide();
-                        $form.find('[rel=baremetalMAC]').hide();
-
-                        $form.find('[rel=agentUsername]').css('display', 'block');
-                        $form.find('[rel=agentUsername]').find('input').val("oracle");
-                        $form.find('[rel=agentPassword]').css('display', 'block');
-
-                        $form.find('.form-item[rel=agentPort]').hide();
-                        $form.find('.form-item[rel=ovm3vip]').hide();
-                        $form.find('.form-item[rel=ovm3pool]').hide();
-                        $form.find('.form-item[rel=ovm3cluster]').hide();
-                   } else if (selectedClusterObj.hypervisortype == "Ovm3") {
-                        $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
-                        $form.find('.form-item[rel=username]').css('display', 'inline-block');
-                        $form.find('.form-item[rel=password]').css('display', 'inline-block');
-
-                        $form.find('.form-item[rel=vcenterHost]').hide();
-
-                        $form.find('.form-item[rel=baremetalCpuCores]').hide();
-                        $form.find('.form-item[rel=baremetalCpu]').hide();
-                        $form.find('.form-item[rel=baremetalMemory]').hide();
-                        $form.find('.form-item[rel=baremetalMAC]').hide();
-
-                        $form.find('.form-item[rel=agentUsername]').css('display', 'inline-block');
-                        $form.find('.form-item[rel=agentUsername]').find('input').val("oracle");
-                        $form.find('.form-item[rel=agentPassword]').css('display', 'inline-block');
-                        $form.find('.form-item[rel=agentPort]').css('display', 'inline-block');
-                        $form.find('.form-item[rel=agentPort]').find('input').val("8899");
-                        $form.find('.form-item[rel=ovm3vip]').css('display', 'inline-block');
-                        $form.find('.form-item[rel=ovm3pool]').css('display', 'inline-block');
-                        $form.find('.form-item[rel=ovm3cluster]').css('display', 'inline-block');
-                    } else {
-                        $form.find('[rel=hostname]').css('display', 'block');
-                        $form.find('[rel=username]').css('display', 'block');
-                        $form.find('[rel=password]').css('display', 'block');
-
-                        $form.find('[rel=vcenterHost]').hide();
-
-                        $form.find('[rel=baremetalCpuCores]').hide();
-                        $form.find('[rel=baremetalCpu]').hide();
-                        $form.find('[rel=baremetalMemory]').hide();
-                        $form.find('[rel=baremetalMAC]').hide();
-
-                        $form.find('[rel=agentUsername]').hide();
-                        $form.find('[rel=agentPassword]').hide();
-
-                        $form.find('.form-item[rel=agentPort]').hide();
-                        $form.find('.form-item[rel=ovm3vip]').hide();
-                        $form.find('.form-item[rel=ovm3pool]').hide();
-                        $form.find('.form-item[rel=ovm3cluster]').hide();
-                    }
-                },
-                fields: {
-                    hostname: {
-                        label: 'label.host.name',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    username: {
-                        label: 'label.username',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    password: {
-                        label: 'label.password',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true,
-                        isPassword: true
-                    },
-                    //input_group="general" ends here
-
-                    //input_group="VMWare" starts here
-                    vcenterHost: {
-                        label: 'label.esx.host',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    //input_group="VMWare" ends here
-
-                    //input_group="BareMetal" starts here
-                    baremetalCpuCores: {
-                        label: 'label.num.cpu.cores',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    baremetalCpu: {
-                        label: 'label.cpu.mhz',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    baremetalMemory: {
-                        label: 'label.memory.mb',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    baremetalMAC: {
-                        label: 'label.host.MAC',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    //input_group="BareMetal" ends here
-
-                    //input_group="OVM" starts here
-                    agentUsername: {
-                        label: 'label.agent.username',
-                        validation: {
-                            required: false
-                        },
-                        isHidden: true
-                    },
-                    agentPassword: {
-                        label: 'label.agent.password',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true,
-                        isPassword: true
-                    },
-                    //input_group="OVM" ends here
-
-                    //input_group="OVM3" starts here
-                    agentPort: {
-                        label: 'label.agent.port',
-                        validation: {
-                            required: false
-                        },
-                        isHidden: true
-                    },
-                    //input_group="OVM3" ends here
-
-                    //always appear (begin)
-                    hosttags: {
-                        label: 'label.host.tags',
-                        validation: {
-                            required: false
-                        }
-                    }
-                    //always appear (end)
-                }
-            },
-            primaryStorage: {
-                preFilter: function(args) {},
-
-                fields: {
-                    name: {
-                        label: 'label.name',
-                        validation: {
-                            required: true
-                        }
-                    },
-
-                    scope: {
-                        label: 'label.scope',
-                        select: function(args) {
-
-                            var selectedHypervisorObj = {
-                                hypervisortype: $.isArray(args.context.zones[0].hypervisor) ?
-                                // We want the cluster's hypervisor type
-                                args.context.zones[0].hypervisor[1] : args.context.zones[0].hypervisor
-                            };
-
-                            if (selectedHypervisorObj == null) {
-                                return;
-                            }
-
-                            //zone-wide-primary-storage is supported only for KVM and VMWare and Hyperv
-                            if (selectedHypervisorObj.hypervisortype == "KVM" || selectedHypervisorObj.hypervisortype == "VMware" || selectedHypervisorObj.hypervisortype == "Hyperv") {
-                                var scope = [];
-                                scope.push({
-                                    id: 'zone',
-                                    description: _l('label.zone.wide')
-                                });
-                                scope.push({
-                                    id: 'cluster',
-                                    description: _l('label.cluster')
-                                });
-                                args.response.success({
-                                    data: scope
-                                });
-                            } else {
-                                var scope = [];
-                                scope.push({
-                                    id: 'cluster',
-                                    description: _l('label.cluster')
-                                });
-                                args.response.success({
-                                    data: scope
-                                });
-                            }
-                        }
-                    },
-
-                    protocol: {
-                        label: 'label.protocol',
-                        validation: {
-                            required: true
-                        },
-                        select: function(args) {
-                            var selectedClusterObj = {
-                                hypervisortype: $.isArray(args.context.zones[0].hypervisor) ?
-                                // We want the cluster's hypervisor type
-                                args.context.zones[0].hypervisor[1] : args.context.zones[0].hypervisor
-                            };
-
-                            if (selectedClusterObj == null) {
-                                return;
-                            }
-
-                            if (selectedClusterObj.hypervisortype == "KVM") {
-                                var items = [];
-                                items.push({
-                                    id: "nfs",
-                                    description: "nfs"
-                                });
-                                items.push({
-                                    id: "SharedMountPoint",
-                                    description: "SharedMountPoint"
-                                });
-                                items.push({
-                                    id: "rbd",
-                                    description: "RBD"
-                                });
-                                items.push({
-                                    id: "clvm",
-                                    description: "CLVM"
-                                });
-                                items.push({
-                                    id: "gluster",
-                                    description: "Gluster"
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            } else if (selectedClusterObj.hypervisortype == "XenServer") {
-                                var items = [];
-                                items.push({
-                                    id: "nfs",
-                                    description: "nfs"
-                                });
-                                items.push({
-                                    id: "PreSetup",
-                                    description: "PreSetup"
-                                });
-                                items.push({
-                                    id: "iscsi",
-                                    description: "iscsi"
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            } else if (selectedClusterObj.hypervisortype == "VMware") {
-                                var items = [];
-                                items.push({
-                                    id: "nfs",
-                                    description: "nfs"
-                                });
-                                items.push({
-                                    id: "presetup",
-                                    description: "presetup"
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            } else if (selectedClusterObj.hypervisortype == "Hyperv") {
-                                var items = [];
-                                items.push({
-                                    id: "SMB",
-                                    description: "SMB/CIFS"
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            } else if (selectedClusterObj.hypervisortype == "Ovm") {
-                                var items = [];
-                                items.push({
-                                    id: "nfs",
-                                    description: "nfs"
-                                });
-                                items.push({
-                                    id: "ocfs2",
-                                    description: "ocfs2"
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            } else if (selectedClusterObj.hypervisortype == "LXC") {
-                                var items = [];
-                                items.push({
-                                    id: "nfs",
-                                    description: "nfs"
-                                });
-                                items.push({
-                                    id: "SharedMountPoint",
-                                    description: "SharedMountPoint"
-                                });
-                                items.push({
-                                    id: "rbd",
-                                    description: "RBD"
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            } else if (selectedClusterObj.hypervisortype == "Ovm3") {
-                                var items = [];
-                                items.push({
-                                    id: "nfs",
-                                    description: "nfs"
-                                });
-                                args.response.success({
-                                    data: items
-                                });
-                            } else {
-                                args.response.success({
-                                    data: []
-                                });
-                            }
-
-                            args.$select.change(function() {
-                                var $form = $(this).closest('form');
-
-                                var protocol = $(this).val();
-
-                                $form.find('[rel=path]').find(".name").find("label").html('<span class=\"field-required\">*</span>' + _l('label.path') + ':');
-
-                                if (protocol == null)
-                                    return;
-
-                                if (protocol == "nfs") {
-                                    $form.find('[rel=server]').css('display', 'block');
-                                    $form.find('[rel=server]').find(".value").find("input").val("");
-
-                                    $form.find('[rel=path]').css('display', 'block');
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if (protocol == "SMB") { //"SMB" show almost the same fields as "nfs" does, except 3 more SMB-specific fields.
-                                    $form.find('[rel=server]').css('display', 'block');
-                                    $form.find('[rel=server]').find(".value").find("input").val("");
-
-                                    $form.find('[rel=path]').css('display', 'block');
-
-                                    $form.find('[rel=smbUsername]').css('display', 'block');
-                                    $form.find('[rel=smbPassword]').css('display', 'block');
-                                    $form.find('[rel=smbDomain]').css('display', 'block');
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if (protocol == "ocfs2") { //ocfs2 is the same as nfs, except no server field.
-                                    $form.find('[rel=server]').hide();
-                                    $form.find('[rel=server]').find(".value").find("input").val("");
-
-                                    $form.find('[rel=path]').css('display', 'block');
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if (protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") {
-                                    $form.find('[rel=server]').hide();
-                                    $form.find('[rel=server]').find(".value").find("input").val("localhost");
-
-                                    $form.find('[rel=path]').css('display', 'block');
-                                    $form.find('[rel=path]').find(".name").find("label").html('<span class=\"field-required\">*</span>'+_l('label.SR.name')+':');
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if (protocol == "iscsi") {
-                                    $form.find('[rel=server]').css('display', 'block');
-                                    $form.find('[rel=server]').find(".value").find("input").val("");
-
-                                    $form.find('[rel=path]').hide();
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').css('display', 'block');
-                                    $form.find('[rel=lun]').css('display', 'block');
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if ($(this).val() == "clvm") {
-                                    $form.find('[rel=server]').hide();
-                                    $form.find('[rel=server]').find(".value").find("input").val("localhost");
-
-                                    $form.find('[rel=path]').hide();
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').css('display', 'inline-block');
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if (protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") {
-                                    $form.find('[rel=server]').css('display', 'block');
-                                    $form.find('[rel=server]').find(".value").find("input").val("");
-
-                                    $form.find('[rel=path]').hide();
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').css('display', 'block');
-                                    $form.find('[rel=vCenterDataStore]').css('display', 'block');
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if (protocol == "SharedMountPoint") { //"SharedMountPoint" show the same fields as "nfs" does.
-                                    $form.find('[rel=server]').hide();
-                                    $form.find('[rel=server]').find(".value").find("input").val("localhost");
-
-                                    $form.find('[rel=path]').css('display', 'block');
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else if (protocol == "gluster") {
-                                    $form.find('[rel=server]').css('display', 'block');
-                                    $form.find('[rel=server]').find(".value").find("input").val("");
-
-                                    $form.find('[rel=path]').hide();
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').css('display', 'block');
-                                } else if (protocol == "rbd") {
-                                    $form.find('[rel=rbdmonitor]').css('display', 'inline-block');
-                                    $form.find('[rel=rbdmonitor]').find(".name").find("label").text("RADOS Monitor:");
-
-                                    $form.find('[rel=rbdpool]').css('display', 'inline-block');
-                                    $form.find('[rel=rbdpool]').find(".name").find("label").text("RADOS Pool:");
-
-                                    $form.find('[rel=rbdid]').css('display', 'inline-block');
-                                    $form.find('[rel=rbdid]').find(".name").find("label").text("RADOS User:");
-
-                                    $form.find('[rel=rbdsecret]').css('display', 'inline-block');
-                                    $form.find('[rel=rbdsecret]').find(".name").find("label").text("RADOS Secret:");
-
-                                    $form.find('[rel=server]').hide();
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-                                    $form.find('[rel=volumegroup]').hide();
-                                    $form.find('[rel=path]').hide();
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                } else {
-                                    $form.find('[rel=server]').css('display', 'block');
-                                    $form.find('[rel=server]').find(".value").find("input").val("");
-
-                                    $form.find('[rel=smbUsername]').hide();
-                                    $form.find('[rel=smbPassword]').hide();
-                                    $form.find('[rel=smbDomain]').hide();
-
-                                    $form.find('[rel=iqn]').hide();
-                                    $form.find('[rel=lun]').hide();
-
-                                    $form.find('[rel=volumegroup]').hide();
-
-                                    $form.find('[rel=vCenterDataCenter]').hide();
-                                    $form.find('[rel=vCenterDataStore]').hide();
-
-                                    $form.find('[rel=rbdmonitor]').hide();
-                                    $form.find('[rel=rbdpool]').hide();
-                                    $form.find('[rel=rbdid]').hide();
-                                    $form.find('[rel=rbdsecret]').hide();
-
-                                    $form.find('[rel=glustervolume]').hide();
-                                }
-                            });
-
-                            args.$select.trigger("change");
-                        }
-                    },
-                    server: {
-                        label: 'label.server',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    //nfs
-                    path: {
-                        label: 'label.path',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    //SMB
-                    smbDomain: {
-                        label: 'label.smb.domain',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    smbUsername: {
-                        label: 'label.smb.username',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    smbPassword: {
-                        label: 'label.smb.password',
-                        isPassword: true,
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-
-                    //iscsi
-                    iqn: {
-                        label: 'label.target.iqn',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    lun: {
-                        label: 'label.LUN.number',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    //clvm
-                    volumegroup: {
-                        label: 'label.volgroup',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    //vmfs
-                    vCenterDataCenter: {
-                        label: 'label.vcenter.datacenter',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    vCenterDataStore: {
-                        label: 'label.vcenter.datastore',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    //gluster
-                    glustervolume: {
-                        label: 'label.gluster.volume',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-
-                    // RBD
-                    rbdmonitor: {
-                        label: 'label.rbd.monitor',
-                        docID: 'helpPrimaryStorageRBDMonitor',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    rbdpool: {
-                        label: 'label.rbd.pool',
-                        docID: 'helpPrimaryStorageRBDPool',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    rbdid: {
-                        label: 'label.rbd.id',
-                        docID: 'helpPrimaryStorageRBDId',
-                        validation: {
-                            required: false
-                        },
-                        isHidden: true
-                    },
-                    rbdsecret: {
-                        label: 'label.rbd.secret',
-                        docID: 'helpPrimaryStorageRBDSecret',
-                        validation: {
-                            required: false
-                        },
-                        isHidden: true
-                    },
-
-                    //always appear (begin)
-                    storageTags: {
-                        label: 'label.storage.tags',
-                        validation: {
-                            required: false
-                        }
-                    }
-                    //always appear (end)
-                }
-            },
-            secondaryStorage: {
-                fields: {
-                    provider: {
-                        label: 'label.provider',
-                        select: function(args) {
-                            var storageproviders = [];
-                            storageproviders.push({ id: '', description: ''});
-
-                            $.ajax({
-                                url: createURL('listImageStores'),
-                                data: {
-                                    provider: 'S3'
-                                },
-                                async: true,
-                                success: function(json) {
-                                    var s3stores = json.listimagestoresresponse.imagestore;
-                                    if(s3stores != null && s3stores.length > 0) {
-                                        storageproviders.push({ id: 'S3', description: 'S3'}); //if (region-wide) S3 store exists already, only "S3" option should be included here. Any other type of store is not allowed to be created since cloudstack doesn't support multiple types of store at this point.
-                                    } else {
-                                        /*
-                                        UI no longer gets providers from "listStorageProviders&type=image" because:
-                                        (1) Not all of returned values are handled by UI.
-                                        (2) Provider "SMB" which is handled by UI is not returned from "listStorageProviders&type=image"
-                                        */
-                                        storageproviders.push({ id: 'NFS', description: 'NFS'});
-                                        storageproviders.push({ id: 'SMB', description: 'SMB/CIFS'});
-                                        storageproviders.push({ id: 'S3', description: 'S3'});
-                                        storageproviders.push({ id: 'Swift', description: 'Swift'});
-                                    }
-                                    args.response.success({
-                                        data: storageproviders
-                                    });
-
-                                    args.$select.change(function() {
-                                        var $form = $(this).closest('form');
-                                        var $fields = $form.find('.field');
-
-                                        if ($(this).val() == "") {
-                                            $fields.filter('[rel=name]').hide();
-
-                                            //NFS
-                                            $fields.filter('[rel=zoneid]').hide();
-                                            $fields.filter('[rel=nfsServer]').hide();
-                                            $fields.filter('[rel=path]').hide();
-
-                                            //SMB
-                                            $fields.filter('[rel=smbUsername]').hide();
-                                            $fields.filter('[rel=smbPassword]').hide();
-                                            $fields.filter('[rel=smbDomain]').hide();
-
-                                            //S3
-                                            $fields.filter('[rel=accesskey]').hide();
-                                            $fields.filter('[rel=secretkey]').hide();
-                                            $fields.filter('[rel=bucket]').hide();
-                                            $fields.filter('[rel=endpoint]').hide();
-                                            $fields.filter('[rel=usehttps]').hide();
-                                            $fields.filter('[rel=connectiontimeout]').hide();
-                                            $fields.filter('[rel=maxerrorretry]').hide();
-                                            $fields.filter('[rel=sockettimeout]').hide();
-
-                                            $fields.filter('[rel=createNfsCache]').hide();
-                                            $fields.filter('[rel=createNfsCache]').find('input').prop('checked', false);
-                                            $fields.filter('[rel=nfsCacheNfsServer]').hide();
-                                            $fields.filter('[rel=nfsCachePath]').hide();
-
-                                            //Swift
-                                            $fields.filter('[rel=url]').hide();
-                                            $fields.filter('[rel=account]').hide();
-                                            $fields.filter('[rel=username]').hide();
-                                            $fields.filter('[rel=key]').hide();
-                                        } else if ($(this).val() == "NFS") {
-                                            $fields.filter('[rel=name]').css('display', 'inline-block');
-
-                                            //NFS
-                                            $fields.filter('[rel=zoneid]').css('display', 'inline-block');
-                                            $fields.filter('[rel=nfsServer]').css('display', 'inline-block');
-                                            $fields.filter('[rel=path]').css('display', 'inline-block');
-
-                                            //SMB
-                                            $fields.filter('[rel=smbUsername]').hide();
-                                            $fields.filter('[rel=smbPassword]').hide();
-                                            $fields.filter('[rel=smbDomain]').hide();
-
-                                            //S3
-                                            $fields.filter('[rel=accesskey]').hide();
-                                            $fields.filter('[rel=secretkey]').hide();
-                                            $fields.filter('[rel=bucket]').hide();
-                                            $fields.filter('[rel=endpoint]').hide();
-                                            $fields.filter('[rel=usehttps]').hide();
-                                            $fields.filter('[rel=connectiontimeout]').hide();
-                                            $fields.filter('[rel=maxerrorretry]').hide();
-                                            $fields.filter('[rel=sockettimeout]').hide();
-
-                                            $fields.filter('[rel=createNfsCache]').hide();
-                                            $fields.filter('[rel=createNfsCache]').find('input').prop('checked', false);
-                                            $fields.filter('[rel=nfsCacheNfsServer]').hide();
-                                            $fields.filter('[rel=nfsCachePath]').hide();
-
-                                            //Swift
-                                            $fields.filter('[rel=url]').hide();
-                                            $fields.filter('[rel=account]').hide();
-                                            $fields.filter('[rel=username]').hide();
-                                            $fields.filter('[rel=key]').hide();
-                                        } else if ($(this).val() == "SMB") {
-                                            $fields.filter('[rel=name]').css('display', 'inline-block');
-
-                                            //NFS
-                                            $fields.filter('[rel=zoneid]').css('display', 'inline-block');
-                                            $fields.filter('[rel=nfsServer]').css('display', 'inline-block');
-                                            $fields.filter('[rel=path]').css('display', 'inline-block');
-
-                                            //SMB
-                                            $fields.filter('[rel=smbUsername]').css('display', 'inline-block');
-                                            $fields.filter('[rel=smbPassword]').css('display', 'inline-block');
-                                            $fields.filter('[rel=smbDomain]').css('display', 'inline-block');
-
-                                            //S3
-                                            $fields.filter('[rel=accesskey]').hide();
-                                            $fields.filter('[rel=secretkey]').hide();
-                                            $fields.filter('[rel=bucket]').hide();
-                                            $fields.filter('[rel=endpoint]').hide();
-                                            $fields.filter('[rel=usehttps]').hide();
-                                            $fields.filter('[rel=connectiontimeout]').hide();
-                                            $fields.filter('[rel=maxerrorretry]').hide();
-                                            $fields.filter('[rel=sockettimeout]').hide();
-
-                                            $fields.filter('[rel=createNfsCache]').hide();
-                                            $fields.filter('[rel=createNfsCache]').find('input').prop('checked', false);
-                                            $fields.filter('[rel=nfsCacheNfsServer]').hide();
-                                            $fields.filter('[rel=nfsCachePath]').hide();
-
-                                            //Swift
-                                            $fields.filter('[rel=url]').hide();
-                                            $fields.filter('[rel=account]').hide();
-                                            $fields.filter('[rel=username]').hide();
-                                            $fields.filter('[rel=key]').hide();
-                                        } else if ($(this).val() == "S3") {
-                                            $fields.filter('[rel=name]').css('display', 'inline-block');
-
-                                            if(s3stores != null && s3stores.length > 0) {
-                                                $fields.filter('[rel=name]').find('input').val(s3stores[0].name);
-                                                $fields.filter('[rel=name]').find('input').attr("disabled", "disabled");
-                                            } else {
-                                                //$fields.filter('[rel=name]').find('input').val("");
-                                                $fields.filter('[rel=name]').find('input').removeAttr("disabled");
-                                            }
-
-                                            //NFS
-                                            $fields.filter('[rel=zoneid]').hide();
-                                            $fields.filter('[rel=nfsServer]').hide();
-                                            $fields.filter('[rel=path]').hide();
-
-                                            //SMB
-                                            $fields.filter('[rel=smbUsername]').hide();
-                                            $fields.filter('[rel=smbPassword]').hide();
-                                            $fields.filter('[rel=smbDomain]').hide();
-
-                                            //S3
-                                            if(s3stores != null && s3stores.length > 0) {
-                                                 $fields.filter('[rel=accesskey]').hide();
-                                                 $fields.filter('[rel=secretkey]').hide();
-                                                 $fields.filter('[rel=bucket]').hide();
-                                                 $fields.filter('[rel=endpoint]').hide();
-                                                 $fields.filter('[rel=usehttps]').hide();
-                                                 $fields.filter('[rel=connectiontimeout]').hide();
-                                                 $fields.filter('[rel=maxerrorretry]').hide();
-                                                 $fields.filter('[rel=sockettimeout]').hide();
-                                            } else {
-                                                 $fields.filter('[rel=accesskey]').css('display', 'inline-block');
-                                                 $fields.filter('[rel=secretkey]').css('display', 'inline-block');
-                                                 $fields.filter('[rel=bucket]').css('display', 'inline-block');
-                                                 $fields.filter('[rel=endpoint]').css('display', 'inline-block');
-                                                 $fields.filter('[rel=usehttps]').css('display', 'inline-block');
-                                                 $fields.filter('[rel=connectiontimeout]').css('display', 'inline-block');
-                                                 $fields.filter('[rel=maxerrorretry]').css('display', 'inline-block');
-                                                 $fields.filter('[rel=sockettimeout]').css('display', 'inline-block');
-                                            }
-                                            $fields.filter('[rel=createNfsCache]').find('input').attr('checked', 'checked');
-                                            $fields.filter('[rel=createNfsCache]').find('input').attr("disabled", "disabled");  //Create NFS staging is required for S3 at this moment. So, disallow user to uncheck "Create NFS Secondary Staging" checkbox
-                                            $fields.filter('[rel=createNfsCache]').css('display', 'inline-block');
-                                            $fields.filter('[rel=nfsCacheNfsServer]').css('display', 'inline-block');
-                                            $fields.filter('[rel=nfsCachePath]').css('display', 'inline-block');
-
-                                            //Swift
-                                            $fields.filter('[rel=url]').hide();
-                                            $fields.filter('[rel=account]').hide();
-                                            $fields.filter('[rel=username]').hide();
-                                            $fields.filter('[rel=key]').hide();
-                                        } else if ($(this).val() == "Swift") {
-                                            $fields.filter('[rel=name]').css('display', 'inline-block');
-
-                                            //NFS
-                                            $fields.filter('[rel=zoneid]').hide();
-                                            $fields.filter('[rel=nfsServer]').hide();
-                                            $fields.filter('[rel=path]').hide();
-
-                                            //SMB
-                                            $fields.filter('[rel=smbUsername]').hide();
-                                            $fields.filter('[rel=smbPassword]').hide();
-                                            $fields.filter('[rel=smbDomain]').hide();
-
-                                            //S3
-                                            $fields.filter('[rel=accesskey]').hide();
-                                            $fields.filter('[rel=secretkey]').hide();
-                                            $fields.filter('[rel=bucket]').hide();
-                                            $fields.filter('[rel=endpoint]').hide();
-                                            $fields.filter('[rel=usehttps]').hide();
-                                            $fields.filter('[rel=connectiontimeout]').hide();
-                                            $fields.filter('[rel=maxerrorretry]').hide();
-                                            $fields.filter('[rel=sockettimeout]').hide();
-
-                                            $fields.filter('[rel=createNfsCache]').hide();
-                                            $fields.filter('[rel=createNfsCache]').find('input').prop('checked', false);
-                                            $fields.filter('[rel=nfsCacheNfsServer]').hide();
-                                            $fields.filter('[rel=nfsCachePath]').hide();
-
-                                            //Swift
-                                            $fields.filter('[rel=url]').css('display', 'inline-block');
-                                            $fields.filter('[rel=account]').css('display', 'inline-block');
-                                            $fields.filter('[rel=username]').css('display', 'inline-block');
-                                            $fields.filter('[rel=key]').css('display', 'inline-block');
-                                        }
-                                    });
-                                    args.$select.change();
-                                }
-                            });
-                        }
-                    },
-
-                    name: {
-                        label: 'label.name',
-                        isHidden: true
-                    },
-
-                    //NFS, SMB (begin)
-                    nfsServer: {
-                        label: 'label.server', //change label from "NFS Server" to "Server" since this field is also shown when provider "SMB/CIFS" is elected.
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    path: {
-                        label: 'label.path',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    //NFS, SMB (end)
-
-                    //SMB (begin)
-                    smbDomain: {
-                        label: 'label.smb.domain',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    smbUsername: {
-                        label: 'label.smb.username',
-                        validation: {
-                            required: true
-                        }
-                    },
-                    smbPassword: {
-                        label: 'label.smb.password',
-                        isPassword: true,
-                        validation: {
-                            required: true
-                        }
-                    },
-                    //SMB (end)
-
-                    //S3 (begin)
-                    accesskey: {
-                        label: 'label.s3.access_key',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    secretkey: {
-                        label: 'label.s3.secret_key',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    bucket: {
-                        label: 'label.s3.bucket',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    endpoint: {
-                        label: 'label.s3.endpoint',
-                        isHidden: true
-                    },
-                    usehttps: {
-                        label: 'label.s3.use_https',
-                        isBoolean: true,
-                        isChecked: true,
-                        isHidden: true
-                    },
-                    connectiontimeout: {
-                        label: 'label.s3.connection_timeout',
-                        isHidden: true
-                    },
-                    maxerrorretry: {
-                        label: 'label.s3.max_error_retry',
-                        isHidden: true
-                    },
-                    sockettimeout: {
-                        label: 'label.s3.socket_timeout',
-                        isHidden: true
-                    },
-
-                    createNfsCache: {
-                        label: 'label.create.nfs.secondary.staging.storage',
-                        isBoolean: true,
-                        isChecked: true,
-                        isHidden: true
-                    },
-                    nfsCacheNfsServer: {
-                        dependsOn: 'createNfsCache',
-                        label: 'label.s3.nfs.server',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    nfsCachePath: {
-                        dependsOn: 'createNfsCache',
-                        label: 'label.s3.nfs.path',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    //S3 (end)
-
-                    //Swift (begin)
-                    url: {
-                        label: 'label.url',
-                        validation: {
-                            required: true
-                        },
-                        isHidden: true
-                    },
-                    account: {
-                        label: 'label.account',
-                        isHidden: true
-                    },
-                    username: {
-                        label: 'label.username',
-                        isHidden: true
-                    },
-                    key: {
-                        label: 'label.key',
-                        isHidden: true
-                    }
-                    //Swift (end)
-                }
-            }
-        },
-
-        action: function(args) {
-            var $wizard = args.wizard;
-            var formData = args.data;
-            var advZoneConfiguredVirtualRouterCount = 0; //for multiple physical networks in advanced zone. Each physical network has 2 virtual routers: regular one and VPC one.
-
-            var success = args.response.success;
-            var error = args.response.error;
-            var message = args.response.message;
-            //var data = args.data;
-            var startFn = args.startFn;
-            var data = args.data;
-
-            var stepFns = {
-                addZone: function() {
-                    message(dictionary['message.creating.zone']);
-
-                    var array1 = [];
-                    var networkType = args.data.zone.networkType; //"Basic", "Advanced"
-                    array1.push("&networktype=" + encodeURIComponent(networkType));
-
-                    if (networkType == "Basic") {
-                        if (selectedNetworkOfferingHavingSG == true)
-                            array1.push("&securitygroupenabled=true");
-                        else
-                            array1.push("&securitygroupenabled=false");
-                    } else { // networkType == "Advanced"
-                        if (args.data.zone.sgEnabled != true) {
-                            array1.push("&securitygroupenabled=false");
-
-                            if (args.data.zone.guestcidraddress != null && args.data.zone.guestcidraddress.length > 0)
-                                array1.push("&guestcidraddress=" + encodeURIComponent(args.data.zone.guestcidraddress));
-                        } else { // args.data.zone.sgEnabled    == true
-                            array1.push("&securitygroupenabled=true");
-                        }
-                    }
-
-                    array1.push("&name=" + encodeURIComponent(args.data.zone.name));
-
-                    if (args.data.zone.localstorageenabled == 'on') {
-                        array1.push("&localstorageenabled=true");
-                    }
-
-                    //IPv4
-                    if (args.data.zone.ip4dns1 != null && args.data.zone.ip4dns1.length > 0)
-                        array1.push("&dns1=" + encodeURIComponent(args.data.zone.ip4dns1));
-                    if (args.data.zone.ip4dns2 != null && args.data.zone.ip4dns2.length > 0)
-                        array1.push("&dns2=" + encodeURIComponent(args.data.zone.ip4dns2));
-
-                    //IPv6
-                    if (args.data.zone.ip6dns1 != null && args.data.zone.ip6dns1.length > 0)
-                        array1.push("&ip6dns1=" + encodeURIComponent(args.data.zone.ip6dns1));
-                    if (args.data.zone.ip6dns2 != null && args.data.zone.ip6dns2.length > 0)
-                        array1.push("&ip6dns2=" + encodeURIComponent(args.data.zone.ip6dns2));
-
-
-                    array1.push("&internaldns1=" + encodeURIComponent(args.data.zone.internaldns1));
-
-                    var internaldns2 = args.data.zone.internaldns2;
-                    if (internaldns2 != null && internaldns2.length > 0)
-                        array1.push("&internaldns2=" + encodeURIComponent(internaldns2));
-
-                    if (args.data.zone.networkdomain != null && args.data.zone.networkdomain.length > 0)
-                        array1.push("&domain=" + encodeURIComponent(args.data.zone.networkdomain));
-
-                    $.ajax({
-                        url: createURL("createZone" + array1.join("")),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            if (args.data.pluginFrom == null) { //from zone wizard, not from quick instsaller(args.data.pluginFrom != null && args.data.pluginFrom.name == 'installWizard') who doesn't have public checkbox
-                                if(args.data.zone.isdedicated == 'on'){ //dedicated checkbox in zone wizard is checked
-                                    message(dictionary['message.dedicate.zone']);
-                                    var data = {
-                                        zoneid: json.createzoneresponse.zone.id
-                                    };
-                                    if (args.data.zone.domain != null)
-                                        $.extend(data, {
-                                            domainid: args.data.zone.domain
-                                        });
-                                    if (args.data.zone.account != "")
-                                        $.extend(data, {
-                                            account: args.data.zone.account
-                                        });
-                                    $.ajax({
-                                        url: createURL('dedicateZone'),
-                                        data: data,
-                                        success: function(json) {}
-                                    });
-                                }
-                            }
-
-                            stepFns.addPhysicalNetworks({
-                                data: $.extend(args.data, {
-                                    returnedZone: json.createzoneresponse.zone
-                                })
-                            });
-                        },
-                        error: function(XMLHttpResponse) {
-                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                            error('addZone', errorMsg, {
-                                fn: 'addZone',
-                                args: args
-                            });
-                        }
-                    });
-                },
-
-                addPhysicalNetworks: function(args) {
-                    message(_l('message.creating.physical.networks'));
-
-                    var returnedPhysicalNetworks = [];
-
-                    if (args.data.zone.networkType == "Basic") { //Basic zone ***
-                        var requestedTrafficTypeCount = 2; //request guest traffic type, management traffic type
-                        if (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true)
-                            requestedTrafficTypeCount++; //request public traffic type
-
-                        //Basic zone has only one physical network
-                        var array1 = [];
-                        if ("physicalNetworks" in args.data) { //from add-zone-wizard
-                            array1.push("&name=" + encodeURIComponent(args.data.physicalNetworks[0].name));
-                        } else { //from quick-install-wizard
-                            array1.push("&name=PhysicalNetworkInBasicZone");
-                        }
-
-                        $.ajax({
-                            url: createURL("createPhysicalNetwork&zoneid=" + args.data.returnedZone.id + array1.join("")),
-                            dataType: "json",
-                            success: function(json) {
-                                var jobId = json.createphysicalnetworkresponse.jobid;
-                                var createPhysicalNetworkIntervalID = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(createPhysicalNetworkIntervalID);
-
-                                                if (result.jobstatus == 1) {
-                                                    var returnedBasicPhysicalNetwork = result.jobresult.physicalnetwork;
-                                                    var label = returnedBasicPhysicalNetwork.id + trafficLabelParam('guest', data);
-                                                    var returnedTrafficTypes = [];
-
-                                                    $.ajax({
-                                                        url: createURL("addTrafficType&trafficType=Guest&physicalnetworkid=" + label),
-                                                        dataType: "json",
-                                                        success: function(json) {
-                                                            var jobId = json.addtraffictyperesponse.jobid;
-                                                            var addGuestTrafficTypeIntervalID = setInterval(function() {
-                                                                $.ajax({
-                                                                    url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                                    dataType: "json",
-                                                                    success: function(json) {
-                                                                        var result = json.queryasyncjobresultresponse;
-                                                                        if (result.jobstatus == 0) {
-                                                                            return; //Job has not completed
-                                                                        } else {
-                                                                            clearInterval(addGuestTrafficTypeIntervalID);
-
-                                                                            if (result.jobstatus == 1) {
-                                                                                returnedTrafficTypes.push(result.jobresult.traffictype);
-
-                                                                                if (returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
-                                                                                    returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
-
-                                                                                    stepFns.configurePhysicalNetwork({
-                                                                                        data: $.extend(args.data, {
-                                                                                            returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
-                                                                                        })
-                                                                                    });
-                                                                                }
-                                                                            } else if (result.jobstatus == 2) {
-                                                                                alert("Failed to add Guest traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
-                                                                            }
-                                                                        }
-                                                                    },
-                                                                    error: function(XMLHttpResponse) {
-                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                        alert("Failed to add Guest traffic type to basic zone. Error: " + errorMsg);
-                                                                    }
-                                                                });
-                                                            }, g_queryAsyncJobResultInterval);
-                                                        }
-                                                    });
-
-                                                    label = trafficLabelParam('management', data);
-
-                                                    $.ajax({
-                                                        url: createURL("addTrafficType&trafficType=Management&physicalnetworkid=" + returnedBasicPhysicalNetwork.id + label),
-                                                        dataType: "json",
-                                                        success: function(json) {
-                                                            var jobId = json.addtraffictyperesponse.jobid;
-                                                            var addManagementTrafficTypeIntervalID = setInterval(function() {
-                                                                $.ajax({
-                                                                    url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                                    dataType: "json",
-                                                                    success: function(json) {
-                                                                        var result = json.queryasyncjobresultresponse;
-                                                                        if (result.jobstatus == 0) {
-                                                                            return; //Job has not completed
-                                                                        } else {
-                                                                            clearInterval(addManagementTrafficTypeIntervalID);
-
-                                                                            if (result.jobstatus == 1) {
-                                                                                returnedTrafficTypes.push(result.jobresult.traffictype);
-
-                                                                                if (returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
-                                                                                    returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
-
-                                                                                    stepFns.configurePhysicalNetwork({
-                                                                                        data: $.extend(args.data, {
-                                                                                            returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
-                                                                                        })
-                                                                                    });
-                                                                                }
-                                                                            } else if (result.jobstatus == 2) {
-                                                                                alert("Failed to add Management traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
-                                                                            }
-                                                                        }
-                                                                    },
-                                                                    error: function(XMLHttpResponse) {
-                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                        alert("Failed to add Management traffic type to basic zone. Error: " + errorMsg);
-                                                                    }
-                                                                });
-                                                            }, g_queryAsyncJobResultInterval);
-                                                        }
-                                                    });
-
-                                                    // Storage traffic
-                                                    if (data.physicalNetworks &&
-                                                        $.inArray('storage', data.physicalNetworks[0].trafficTypes) > -1) {
-                                                        label = trafficLabelParam('storage', data);
-                                                        $.ajax({
-                                                            url: createURL('addTrafficType&physicalnetworkid=' + returnedBasicPhysicalNetwork.id + '&trafficType=Storage' + label),
-                                                            dataType: "json",
-                                                            success: function(json) {
-                                                                var jobId = json.addtraffictyperesponse.jobid;
-                                                                var addStorageTrafficTypeIntervalID = setInterval(function() {
-                                                                    $.ajax({
-                                                                        url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                                        dataType: "json",
-                                                                        success: function(json) {
-                                                                            var result = json.queryasyncjobresultresponse;
-                                                                            if (result.jobstatus == 0) {
-                                                                                return; //Job has not completed
-                                                                            } else {
-                                                                                clearInterval(addStorageTrafficTypeIntervalID);
-
-                                                                                if (result.jobstatus == 1) {
-                                                                                    returnedTrafficTypes.push(result.jobresult.traffictype);
-
-                                                                                    if (returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
-                                                                                        returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
-
-                                                                                        stepFns.configurePhysicalNetwork({
-                                                                                            data: $.extend(args.data, {
-                                                                                                returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
-                                                                                            })
-                                                                                        });
-                                                                                    }
-                                                                                } else if (result.jobstatus == 2) {
-                                                                                    alert("Failed to add Management traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
-                                                                                }
-                                                                            }
-                                                                        },
-                                                                        error: function(XMLHttpResponse) {
-                                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                            alert("Failed to add Management traffic type to basic zone. Error: " + errorMsg);
-                                                                        }
-                                                                    });
-                                                                }, g_queryAsyncJobResultInterval);
-                                                            }
-                                                        });
-                                                    }
-
-                                                    if (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) {
-                                                        label = trafficLabelParam('public', data);
-                                                        $.ajax({
-                                                            url: createURL("addTrafficType&trafficType=Public&physicalnetworkid=" + returnedBasicPhysicalNetwork.id + label),
-                                                            dataType: "json",
-                                                            success: function(json) {
-                                                                var jobId = json.addtraffictyperesponse.jobid;
-                                                                var addPublicTrafficTypeIntervalID = setInterval(function() {
-                                                                    $.ajax({
-                                                                        url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                                        dataType: "json",
-                                                                        success: function(json) {
-                                                                            var result = json.queryasyncjobresultresponse;
-                                                                            if (result.jobstatus == 0) {
-                                                                                return; //Job has not completed
-                                                                            } else {
-                                                                                clearInterval(addPublicTrafficTypeIntervalID);
-
-                                                                                if (result.jobstatus == 1) {
-                                                                                    returnedTrafficTypes.push(result.jobresult.traffictype);
-
-                                                                                    if (returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added
-                                                                                        returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
-
-                                                                                        stepFns.configurePhysicalNetwork({
-                                                                                            data: $.extend(args.data, {
-                                                                                                returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork
-                                                                                            })
-                                                                                        });
-                                                                                    }
-                                                                                } else if (result.jobstatus == 2) {
-                                                                                    alert("Failed to add Public traffic type to basic zone. Error: " + _s(result.jobresult.errortext));
-                                                                                }
-                                                                            }
-                                                                        },
-                                                                        error: function(XMLHttpResponse) {
-                                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                            alert("Failed to add Public traffic type to basic zone. Error: " + errorMsg);
-                                                                        }
-                                                                    });
-                                                                }, g_queryAsyncJobResultInterval);
-                                                            }
-                                                        });
-                                                    }
-                                                } else if (result.jobstatus == 2) {
-                                                    alert("createPhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            alert("createPhysicalNetwork failed. Error: " + errorMsg);
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-
-                            }
-                        });
-                    } else if (args.data.zone.networkType == "Advanced") {
-                        $(args.data.physicalNetworks).each(function(index) {
-                            var thisPhysicalNetwork = this;
-                            var array1 = [];
-                            array1.push("&name=" + encodeURIComponent(thisPhysicalNetwork.name));
-                            if (thisPhysicalNetwork.isolationMethod != null && thisPhysicalNetwork.isolationMethod.length > 0)
-                                array1.push("&isolationmethods=" + encodeURIComponent(thisPhysicalNetwork.isolationMethod));
-                            $.ajax({
-                                url: createURL("createPhysicalNetwork&zoneid=" + args.data.returnedZone.id + array1.join("")),
-                                dataType: "json",
-                                success: function(json) {
-                                    var jobId = json.createphysicalnetworkresponse.jobid;
-                                    var createPhysicalNetworkIntervalID = setInterval(function() {
-                                        $.ajax({
-                                            url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                            dataType: "json",
-                                            success: function(json) {
-                                                var result = json.queryasyncjobresultresponse;
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                    clearInterval(createPhysicalNetworkIntervalID);
-
-                                                    if (result.jobstatus == 1) {
-                                                        var returnedPhysicalNetwork = result.jobresult.physicalnetwork;
-                                                        returnedPhysicalNetwork.originalId = thisPhysicalNetwork.id;
-
-                                                        var returnedTrafficTypes = [];
-                                                        var label; // Traffic type label
-                                                        $(thisPhysicalNetwork.trafficTypes).each(function() {
-                                                            var thisTrafficType = this;
-                                                            var apiCmd = "addTrafficType&physicalnetworkid=" + returnedPhysicalNetwork.id;
-                                                            if (thisTrafficType == "public") {
-                                                                apiCmd += "&trafficType=Public";
-                                                                label = trafficLabelParam('public', data, index);
-                                                            } else if (thisTrafficType == "management") {
-                                                                apiCmd += "&trafficType=Management";
-                                                                label = trafficLabelParam('management', data, index);
-                                                            } else if (thisTrafficType == "guest") {
-                                                                apiCmd += "&trafficType=Guest";
-                                                                label = trafficLabelParam('guest', data, index);
-                                                            } else if (thisTrafficType == "storage") {
-                                                                apiCmd += "&trafficType=Storage";
-                                                                label = trafficLabelParam('storage', data, index);
-                                                            }
-
-                                                            $.ajax({
-                                                                url: createURL(apiCmd + label),
-                                                                dataType: "json",
-                                                                success: function(json) {
-                                                                    var jobId = json.addtraffictyperesponse.jobid;
-                                                                    var addTrafficTypeIntervalID = setInterval(function() {
-                                                                        $.ajax({
-                                                                            url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                                            dataType: "json",
-                                                                            success: function(json) {
-                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                if (result.jobstatus == 0) {
-                                                                                    return; //Job has not completed
-                                                                                } else {
-                                                                                    clearInterval(addTrafficTypeIntervalID);
-
-                                                                                    if (result.jobstatus == 1) {
-                                                                                        returnedTrafficTypes.push(result.jobresult.traffictype);
-
-                                                                                        if (returnedTrafficTypes.length == thisPhysicalNetwork.trafficTypes.length) { //this physical network is complete (specified traffic types are added)
-                                                                                            returnedPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes;
-                                                                                            returnedPhysicalNetworks.push(returnedPhysicalNetwork);
-
-                                                                                            if (returnedPhysicalNetworks.length == args.data.physicalNetworks.length) { //all physical networks are complete
-                                                                                                stepFns.configurePhysicalNetwork({
-                                                                                                    data: $.extend(args.data, {
-                                                                                                        returnedPhysicalNetworks: returnedPhysicalNetworks
-                                                                                                    })
-                                                                                                });
-                                                                                            }
-                                                                                        }
-                                                                                    } else if (result.jobstatus == 2) {
-                                                                                        alert(apiCmd + " failed. Error: " + _s(result.jobresult.errortext));
-                                                                                    }
-                                                                                }
-                                                                            },
-                                                                            error: function(XMLHttpResponse) {
-                                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                alert(apiCmd + " failed. Error: " + errorMsg);
-                                                                            }
-                                                                        });
-                                                                    }, g_queryAsyncJobResultInterval);
-                                                                }
-                                                            });
-                                                        });
-                                                    } else if (result.jobstatus == 2) {
-                                                        alert("createPhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
-                                                    }
-                                                }
-                                            },
-                                            error: function(XMLHttpResponse) {
-                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                alert("createPhysicalNetwork failed. Error: " + errorMsg);
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        });
-                    }
-                },
-
-                //afterCreateZonePhysicalNetworkTrafficTypes: enable physical network, enable virtual router element, enable network service provider
-                configurePhysicalNetwork: function(args) {
-                    message(_l('message.configuring.physical.networks'));
-
-                    if (args.data.zone.networkType == "Basic") {
-                        $.ajax({
-                            url: createURL("updatePhysicalNetwork&state=Enabled&id=" + args.data.returnedBasicPhysicalNetwork.id),
-                            dataType: "json",
-                            success: function(json) {
-                                var enablePhysicalNetworkIntervalID = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + json.updatephysicalnetworkresponse.jobid),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(enablePhysicalNetworkIntervalID);
-
-                                                if (result.jobstatus == 1) {
-                                                    //alert("updatePhysicalNetwork succeeded.");
-
-                                                    // get network service provider ID of Virtual Router
-                                                    var virtualRouterProviderId;
-                                                    $.ajax({
-                                                        url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + args.data.returnedBasicPhysicalNetwork.id),
-                                                        dataType: "json",
-                                                        async: false,
-                                                        success: function(json) {
-                                                            var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                            if (items != null && items.length > 0) {
-                                                                virtualRouterProviderId = items[0].id;
-                                                            }
-                                                        }
-                                                    });
-                                                    if (virtualRouterProviderId == null) {
-                                                        alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID");
-                                                        return;
-                                                    }
-
-                                                    var virtualRouterElementId;
-                                                    $.ajax({
-                                                        url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId),
-                                                        dataType: "json",
-                                                        async: false,
-                                                        success: function(json) {
-                                                            var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
-                                                            if (items != null && items.length > 0) {
-                                                                virtualRouterElementId = items[0].id;
-                                                            }
-                                                        }
-                                                    });
-                                                    if (virtualRouterElementId == null) {
-                                                        alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id");
-                                                        return;
-                                                    }
-
-                                                    $.ajax({
-                                                        url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId),
-                                                        dataType: "json",
-                                                        async: false,
-                                                        success: function(json) {
-                                                            var enableVirtualRouterElementIntervalID = setInterval(function() {
-                                                                $.ajax({
-                                                                    url: createURL("queryAsyncJobResult&jobId=" + json.configurevirtualrouterelementresponse.jobid),
-                                                                    dataType: "json",
-                                                                    success: function(json) {
-                                                                        var result = json.queryasyncjobresultresponse;
-                                                                        if (result.jobstatus == 0) {
-                                                                            return; //Job has not completed
-                                                                        } else {
-                                                                            clearInterval(enableVirtualRouterElementIntervalID);
-
-                                                                            if (result.jobstatus == 1) {
-                                                                                //alert("configureVirtualRouterElement succeeded.");
-
-                                                                                if (args.data.pluginFrom != null && args.data.pluginFrom.name == "installWizard") {
-                                                                                    selectedNetworkOfferingObj = args.data.pluginFrom.selectedNetworkOffering;
-                                                                                }
-
-                                                                                var data = {
-                                                                                    id: virtualRouterProviderId,
-                                                                                    state: 'Enabled'
-                                                                                };
-
-                                                                                $.ajax({
-                                                                                    url: createURL("updateNetworkServiceProvider"),
-                                                                                    data: data,
-                                                                                    async: false,
-                                                                                    success: function(json) {
-                                                                                        var enableVirtualRouterProviderIntervalID = setInterval(function() {
-                                                                                            $.ajax({
-                                                                                                url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
-                                                                                                dataType: "json",
-                                                                                                success: function(json) {
-                                                                                                    var result = json.queryasyncjobresultresponse;
-                                                                                                    if (result.jobstatus == 0) {
-                                                                                                        return; //Job has not completed
-                                                                                                    } else {
-                                                                                                        clearInterval(enableVirtualRouterProviderIntervalID);
-
-                                                                                                        if (result.jobstatus == 1) {
-                                                                                                            //alert("Virtual Router Provider is enabled");
-                                                                                                            for (var i = 0; i < selectedBaremetalProviders.length; i++) {
-                                                                                                                $.ajax({
-                                                                                                                    url: createURL("listNetworkServiceProviders"),
-                                                                                                                    data: {
-                                                                                                                        name: selectedBaremetalProviders[i],
-                                                                                                                        physicalNetworkId: args.data.returnedBasicPhysicalNetwork.id
-                                                                                                                    },
-                                                                                                                    async: false,
-                                                                                                                    success: function(json) {
-                                                                                                                        var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                                                                        if (items != null && items.length > 0) {
-                                                                                                                            var providerId = items[0].id;
-                                                                                                                            $.ajax({
-                                                                                                                                url: createURL("updateNetworkServiceProvider"),
-                                                                                                                                data: {
-                                                                                                                                    id: providerId,
-                                                                                                                                    state: 'Enabled'
-                                                                                                                                },
-                                                                                                                                async: false,
-                                                                                                                                success: function(json) {
-                                                                                                                                    var updateNetworkServiceProviderIntervalID = setInterval(function() {
-                                                                                                                                        $.ajax({
-                                                                                                                                            url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
-                                                                                                                                            dataType: "json",
-                                                                                                                                            success: function(json) {
-                                                                                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                                                                                if (result.jobstatus == 0) {
-                                                                                                                                                    return; //Job has not completed
-                                                                                                                                                } else {
-                                                                                                                                                    clearInterval(updateNetworkServiceProviderIntervalID);
-                                                                                                                                                    if (result.jobstatus == 1) { //baremetal provider has been enabled successfully
-
-                                                                                                                                                    } else if (result.jobstatus == 2) {
-                                                                                                                                                        alert(_s(result.jobresult.errortext));
-                                                                                                                                                    }
-                                                                                                                                                }
-                                                                                                                                            },
-                                                                                                                                            error: function(XMLHttpResponse) {
-                                                                                                                                                alert(parseXMLHttpResponse(XMLHttpResponse));
-                                                                                                                                            }
-                                                                                                                                        });
-                                                                                                                                    }, g_queryAsyncJobResultInterval);
-                                                                                                                                }
-                                                                                                                            });
-                                                                                                                        }
-                                                                                                                    }
-                                                                                                                });
-                                                                                                            }
-
-                                                                                                            if (args.data.pluginFrom != null && args.data.pluginFrom.name == "installWizard") {
-                                                                                                                selectedNetworkOfferingHavingSG = args.data.pluginFrom.selectedNetworkOfferingHavingSG;
-                                                                                                            }
-                                                                                                            if (selectedNetworkOfferingHavingSG == true) { //need to Enable security group provider first
-                                                                                                                message(_l('message.enabling.security.group.provider'));
-
-                                                                                                                // get network service provider ID of Security Group
-                                                                                                                var securityGroupProviderId;
-                                                                                                                $.ajax({
-                                                                                                                    url: createURL("listNetworkServiceProviders&name=SecurityGroupProvider&physicalNetworkId=" + args.data.returnedBasicPhysicalNetwork.id),
-                                                                                                                    dataType: "json",
-                                                                                                                    async: false,
-                                                                                                                    success: function(json) {
-                                                                                                                        var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                                                                        if (items != null && items.length > 0) {
-                                                                                                                            securityGroupProviderId = items[0].id;
-                                                                                                                        }
-                                                                                                                    }
-                                                                                                                });
-                                                                                                                if (securityGroupProviderId == null) {
-                                                                                                                    alert("error: listNetworkServiceProviders API doesn't return security group provider ID");
-                                                                                                                    return;
-                                                                                                                }
-
-                                                                                                                $.ajax({
-                                                                                                                    url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + securityGroupProviderId),
-                                                                                                                    dataType: "json",
-                                                                                                                    async: false,
-                                                                                                                    success: function(json) {
-                                                                                                                        var enableSecurityGroupProviderIntervalID = setInterval(function() {
-                                                                                                                            $.ajax({
-                                                                                                                                url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
-                                                                                                                                dataType: "json",
-                                                                                                                                success: function(json) {
-                                                                                                                                    var result = json.queryasyncjobresultresponse;
-                                                                                                                                    if (result.jobstatus == 0) {
-                                                                                                                                        return; //Job has not completed
-                                                                                                                                    } else {
-                                                                                                                                        clearInterval(enableSecurityGroupProviderIntervalID);
-
-                                                                                                                                        if (result.jobstatus == 1) { //Security group provider has been enabled successfully
-                                                                                                                                            stepFns.addNetscalerProvider({
-                                                                                                                                                data: args.data
-                                                                                                                                            });
-                                                                                                                                        } else if (result.jobstatus == 2) {
-                                                                                                                                            alert("failed to enable security group provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                                                        }
-                                                                                                                                    }
-                                                                                                                                },
-                                                                                                                                error: function(XMLHttpResponse) {
-                                                                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                                                    alert("failed to enable security group provider. Error: " + errorMsg);
-                                                                                                                                }
-                                                                                                                            });
-                                                                                                                        }, g_queryAsyncJobResultInterval);
-                                                                                                                    }
-                                                                                                                });
-                                                                                                            } else { //selectedNetworkOfferingHavingSG == false
-                                                                                                                stepFns.addNetscalerProvider({
-                                                                                                                    data: args.data
-                                                                                                                });
-                                                                                                            }
-                                                                                                        } else if (result.jobstatus == 2) {
-                                                                                                            alert("failed to enable Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                        }
-                                                                                                    }
-                                                                                                },
-                                                                                                error: function(XMLHttpResponse) {
-                                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                    alert("failed to enable Virtual Router Provider. Error: " + errorMsg);
-                                                                                                }
-                                                                                            });
-                                                                                        }, g_queryAsyncJobResultInterval);
-                                                                                    }
-                                                                                });
-                                                                            } else if (result.jobstatus == 2) {
-                                                                                alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
-                                                                            }
-                                                                        }
-                                                                    },
-                                                                    error: function(XMLHttpResponse) {
-                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                        alert("configureVirtualRouterElement failed. Error: " + errorMsg);
-                                                                    }
-                                                                });
-                                                            }, g_queryAsyncJobResultInterval);
-                                                        }
-                                                    });
-                                                } else if (result.jobstatus == 2) {
-                                                    alert("updatePhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            alert("updatePhysicalNetwork failed. Error: " + errorMsg);
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            }
-                        });
-                    } else if (args.data.zone.networkType == "Advanced") {
-                        $(args.data.returnedPhysicalNetworks).each(function() {
-                            var thisPhysicalNetwork = this;
-                            $.ajax({
-                                url: createURL("updatePhysicalNetwork&state=Enabled&id=" + thisPhysicalNetwork.id),
-                                dataType: "json",
-                                success: function(json) {
-                                    var jobId = json.updatephysicalnetworkresponse.jobid;
-                                    var enablePhysicalNetworkIntervalID = setInterval(function() {
-                                        $.ajax({
-                                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                            dataType: "json",
-                                            success: function(json) {
-                                                var result = json.queryasyncjobresultresponse;
-                                                if (result.jobstatus == 0) {
-                                                    return; //Job has not completed
-                                                } else {
-                                                    clearInterval(enablePhysicalNetworkIntervalID);
-
-                                                    if (result.jobstatus == 1) {
-                                                        //alert("enable physical network succeeded.");
-
-                                                        // ***** Virtual Router ***** (begin) *****
-                                                        var virtualRouterProviderId;
-                                                        $.ajax({
-                                                            url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + thisPhysicalNetwork.id),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                if (items != null && items.length > 0) {
-                                                                    virtualRouterProviderId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (virtualRouterProviderId == null) {
-                                                            alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID");
-                                                            return;
-                                                        }
-
-                                                        var virtualRouterElementId;
-                                                        $.ajax({
-                                                            url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
-                                                                if (items != null && items.length > 0) {
-                                                                    virtualRouterElementId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (virtualRouterElementId == null) {
-                                                            alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id");
-                                                            return;
-                                                        }
-
-                                                        $.ajax({
-                                                            url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var jobId = json.configurevirtualrouterelementresponse.jobid;
-                                                                var enableVirtualRouterElementIntervalID = setInterval(function() {
-                                                                    $.ajax({
-                                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                        dataType: "json",
-                                                                        success: function(json) {
-                                                                            var result = json.queryasyncjobresultresponse;
-                                                                            if (result.jobstatus == 0) {
-                                                                                return; //Job has not completed
-                                                                            } else {
-                                                                                clearInterval(enableVirtualRouterElementIntervalID);
-
-                                                                                if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
-                                                                                    $.ajax({
-                                                                                        url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + virtualRouterProviderId),
-                                                                                        dataType: "json",
-                                                                                        async: false,
-                                                                                        success: function(json) {
-                                                                                            var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                                            var enableVirtualRouterProviderIntervalID = setInterval(function() {
-                                                                                                $.ajax({
-                                                                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                                    dataType: "json",
-                                                                                                    success: function(json) {
-                                                                                                        var result = json.queryasyncjobresultresponse;
-                                                                                                        if (result.jobstatus == 0) {
-                                                                                                            return; //Job has not completed
-                                                                                                        } else {
-                                                                                                            clearInterval(enableVirtualRouterProviderIntervalID);
-
-                                                                                                            if (result.jobstatus == 1) { //Virtual Router Provider has been enabled successfully
-                                                                                                                advZoneConfiguredVirtualRouterCount++;
-
-                                                                                                                if (advZoneConfiguredVirtualRouterCount == args.data.returnedPhysicalNetworks.length) { //not call next stepFns.addXXX() until virtualRouter of all physical networks get configured
-                                                                                                                    if (args.data.zone.sgEnabled != true) { //Advanced SG-disabled zone
-                                                                                                                        stepFns.addPod({
-                                                                                                                            data: args.data
-                                                                                                                        });
-                                                                                                                    } else { //args.data.zone.sgEnabled    == true  //Advanced SG-enabled zone
-                                                                                                                        stepFns.addGuestNetwork({
-                                                                                                                            data: args.data
-                                                                                                                        });
-                                                                                                                    }
-                                                                                                                }
-                                                                                                            } else if (result.jobstatus == 2) {
-                                                                                                                alert("failed to enable Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                            }
-                                                                                                        }
-                                                                                                    },
-                                                                                                    error: function(XMLHttpResponse) {
-                                                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                        alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
-                                                                                                    }
-                                                                                                });
-                                                                                            }, g_queryAsyncJobResultInterval);
-                                                                                        }
-                                                                                    });
-                                                                                } else if (result.jobstatus == 2) {
-                                                                                    alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
-                                                                                }
-                                                                            }
-                                                                        },
-                                                                        error: function(XMLHttpResponse) {
-                                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                            alert("configureVirtualRouterElement failed. Error: " + errorMsg);
-                                                                        }
-                                                                    });
-                                                                }, g_queryAsyncJobResultInterval);
-                                                            }
-                                                        });
-                                                        // ***** Virtual Router ***** (end) *****
-
-                                                         // ***** Ovs ***** (begin) *****
-                                                        var ovsProviderId =  null;
-                                                        $.ajax({
-                                                            url: createURL("listNetworkServiceProviders&name=Ovs&physicalNetworkId=" + thisPhysicalNetwork.id),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function (json) {
-                                                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                if (items != null && items.length > 0) {
-                                                                    ovsProviderId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (ovsProviderId != null) {
-                                                            var ovsElementId = null;
-                                                            $.ajax({
-                                                                url: createURL("listOvsElements&nspid=" + ovsProviderId),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var items = json.listovselementsresponse.ovselement;
-                                                                    if (items != null && items.length > 0) {
-                                                                        ovsElementId = items[0].id;
-                                                                    }
-                                                                }
-                                                            });
-                                                            if (ovsElementId != null) {
-                                                                $.ajax({
-                                                                    url: createURL("configureOvsElement&enabled=true&id=" + ovsElementId),
-                                                                    dataType: "json",
-                                                                    async: false,
-                                                                    success: function (json) {
-                                                                        var jobId = json.configureovselementresponse.jobid;
-                                                                        var enableOvsElementIntervalID = setInterval(function () {
-                                                                            $.ajax({
-                                                                                url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                dataType: "json",
-                                                                                success: function (json) {
-                                                                                    var result = json.queryasyncjobresultresponse;
-                                                                                    if (result.jobstatus == 0) {
-                                                                                        return; //Job has not completed
-                                                                                    } else {
-                                                                                        clearInterval(enableOvsElementIntervalID);
-
-                                                                                        if (result.jobstatus == 1) { //configureOvsElement succeeded
-                                                                                            $.ajax({
-                                                                                                url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + ovsProviderId),
-                                                                                                dataType: "json",
-                                                                                                async: false,
-                                                                                                success: function (json) {
-                                                                                                    var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                                                    var enableOvsProviderIntervalID = setInterval(function () {
-                                                                                                        $.ajax({
-                                                                                                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                                            dataType: "json",
-                                                                                                            success: function (json) {
-                                                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                                                if (result.jobstatus == 0) {
-                                                                                                                    return; //Job has not completed
-                                                                                                                } else {
-                                                                                                                    clearInterval(enableOvsProviderIntervalID);
-
-                                                                                                                    if (result.jobstatus == 2) {
-                                                                                                                        alert("failed to enable Ovs Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                                    }
-                                                                                                                }
-                                                                                                            },
-                                                                                                            error: function (XMLHttpResponse) {
-                                                                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                                alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
-                                                                                                            }
-                                                                                                        });
-                                                                                                    }, g_queryAsyncJobResultInterval);
-                                                                                                }
-                                                                                            });
-                                                                                        } else if (result.jobstatus == 2) {
-                                                                                            alert("configureOvsElement failed. Error: " + _s(result.jobresult.errortext));
-                                                                                        }
-                                                                                    }
-                                                                                },
-                                                                                error: function (XMLHttpResponse) {
-                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                    alert("configureOvsElement failed. Error: " + errorMsg);
-                                                                                }
-                                                                            });
-                                                                        }, g_queryAsyncJobResultInterval);
-                                                                    }
-                                                                });
-                                                            }
-
-
-                                                        }
-                                                        // ***** Ovs ***** (end) *****
-
-                                                        // ***** Internal LB ***** (begin) *****
-                                                        var internalLbProviderId;
-                                                        $.ajax({
-                                                            url: createURL("listNetworkServiceProviders&name=Internallbvm&physicalNetworkId=" + thisPhysicalNetwork.id),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                if (items != null && items.length > 0) {
-                                                                    internalLbProviderId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (internalLbProviderId == null) {
-                                                            alert("error: listNetworkServiceProviders API doesn't return internalLb provider ID");
-                                                            return;
-                                                        }
-
-                                                        var internalLbElementId;
-                                                        $.ajax({
-                                                            url: createURL("listInternalLoadBalancerElements&nspid=" + internalLbProviderId),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var items = json.listinternalloadbalancerelementsresponse.internalloadbalancerelement;
-                                                                if (items != null && items.length > 0) {
-                                                                    internalLbElementId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (internalLbElementId == null) {
-                                                            alert("error: listInternalLoadBalancerElements API doesn't return Internal LB Element Id");
-                                                            return;
-                                                        }
-
-                                                        var virtualRouterElementId;
-                                                        $.ajax({
-                                                            url: createURL("configureInternalLoadBalancerElement&enabled=true&id=" + internalLbElementId),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function(json) {
-                                                                var jobId = json.configureinternalloadbalancerelementresponse.jobid;
-                                                                var enableInternalLbElementIntervalID = setInterval(function() {
-                                                                    $.ajax({
-                                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                        dataType: "json",
-                                                                        success: function(json) {
-                                                                            var result = json.queryasyncjobresultresponse;
-                                                                            if (result.jobstatus == 0) {
-                                                                                return; //Job has not completed
-                                                                            } else {
-                                                                                clearInterval(enableInternalLbElementIntervalID);
-
-                                                                                if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
-                                                                                    $.ajax({
-                                                                                        url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + internalLbProviderId),
-                                                                                        dataType: "json",
-                                                                                        async: false,
-                                                                                        success: function(json) {
-                                                                                            var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                                            var enableInternalLbProviderIntervalID = setInterval(function() {
-                                                                                                $.ajax({
-                                                                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                                    dataType: "json",
-                                                                                                    success: function(json) {
-                                                                                                        var result = json.queryasyncjobresultresponse;
-                                                                                                        if (result.jobstatus == 0) {
-                                                                                                            return; //Job has not completed
-                                                                                                        } else {
-                                                                                                            clearInterval(enableInternalLbProviderIntervalID);
-
-                                                                                                            if (result.jobstatus == 1) { //Internal LB has been enabled successfully
-                                                                                                                //don't need to do anything here
-                                                                                                            } else if (result.jobstatus == 2) {
-                                                                                                                alert("failed to enable Internal LB Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                            }
-                                                                                                        }
-                                                                                                    },
-                                                                                                    error: function(XMLHttpResponse) {
-                                                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                        alert("failed to enable Internal LB Provider. Error: " + errorMsg);
-                                                                                                    }
-                                                                                                });
-                                                                                            }, g_queryAsyncJobResultInterval);
-                                                                                        }
-                                                                                    });
-                                                                                } else if (result.jobstatus == 2) {
-                                                                                    alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
-                                                                                }
-                                                                            }
-                                                                        },
-                                                                        error: function(XMLHttpResponse) {
-                                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                            alert("configureVirtualRouterElement failed. Error: " + errorMsg);
-                                                                        }
-                                                                    });
-                                                                }, g_queryAsyncJobResultInterval);
-                                                            }
-                                                        });
-                                                        // ***** Virtual Router ***** (end) *****
-
-                                                        // ***** Ovs ***** (begin) *****
-                                                        var ovsProviderId =  null;
-                                                        $.ajax({
-                                                            url: createURL("listNetworkServiceProviders&name=Ovs&physicalNetworkId=" + thisPhysicalNetwork.id),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function (json) {
-                                                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                if (items != null && items.length > 0) {
-                                                                    ovsProviderId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (ovsProviderId != null) {
-                                                            var ovsElementId = null;
-                                                            $.ajax({
-                                                                url: createURL("listOvsElements&nspid=" + ovsProviderId),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var items = json.listovselementsresponse.ovselement;
-                                                                    if (items != null && items.length > 0) {
-                                                                        ovsElementId = items[0].id;
-                                                                    }
-                                                                }
-                                                            });
-                                                            if (ovsElementId != null) {
-                                                                $.ajax({
-                                                                    url: createURL("configureOvsElement&enabled=true&id=" + ovsElementId),
-                                                                    dataType: "json",
-                                                                    async: false,
-                                                                    success: function (json) {
-                                                                        var jobId = json.configureovselementresponse.jobid;
-                                                                        var enableOvsElementIntervalID = setInterval(function () {
-                                                                            $.ajax({
-                                                                                url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                dataType: "json",
-                                                                                success: function (json) {
-                                                                                    var result = json.queryasyncjobresultresponse;
-                                                                                    if (result.jobstatus == 0) {
-                                                                                        return; //Job has not completed
-                                                                                    } else {
-                                                                                        clearInterval(enableOvsElementIntervalID);
-
-                                                                                        if (result.jobstatus == 1) { //configureOvsElement succeeded
-                                                                                            $.ajax({
-                                                                                                url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + ovsProviderId),
-                                                                                                dataType: "json",
-                                                                                                async: false,
-                                                                                                success: function (json) {
-                                                                                                    var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                                                    var enableOvsProviderIntervalID = setInterval(function () {
-                                                                                                        $.ajax({
-                                                                                                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                                            dataType: "json",
-                                                                                                            success: function (json) {
-                                                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                                                if (result.jobstatus == 0) {
-                                                                                                                    return; //Job has not completed
-                                                                                                                } else {
-                                                                                                                    clearInterval(enableOvsProviderIntervalID);
-
-                                                                                                                    if (result.jobstatus == 2) {
-                                                                                                                        alert("failed to enable Ovs Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                                    }
-                                                                                                                }
-                                                                                                            },
-                                                                                                            error: function (XMLHttpResponse) {
-                                                                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                                alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
-                                                                                                            }
-                                                                                                        });
-                                                                                                    }, g_queryAsyncJobResultInterval);
-                                                                                                }
-                                                                                            });
-                                                                                        } else if (result.jobstatus == 2) {
-                                                                                            alert("configureOvsElement failed. Error: " + _s(result.jobresult.errortext));
-                                                                                        }
-                                                                                    }
-                                                                                },
-                                                                                error: function (XMLHttpResponse) {
-                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                    alert("configureOvsElement failed. Error: " + errorMsg);
-                                                                                }
-                                                                            });
-                                                                        }, g_queryAsyncJobResultInterval);
-                                                                    }
-                                                                });
-                                                            }
-
-
-                                                        }
-
-
-                                                        // ***** Ovs ***** (end) *****
-
-                                                        // ***** Internal LB ***** (begin) *****
-                                                        var internalLbProviderId;
-                                                        $.ajax({
-                                                            url: createURL("listNetworkServiceProviders&name=Internallbvm&physicalNetworkId=" + thisPhysicalNetwork.id),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function (json) {
-                                                                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                if (items != null && items.length > 0) {
-                                                                    internalLbProviderId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (internalLbProviderId == null) {
-                                                            alert("error: listNetworkServiceProviders API doesn't return internalLb provider ID");
-                                                            return;
-                                                        }
-
-                                                        var internalLbElementId;
-                                                        $.ajax({
-                                                            url: createURL("listInternalLoadBalancerElements&nspid=" + internalLbProviderId),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function (json) {
-                                                                var items = json.listinternalloadbalancerelementsresponse.internalloadbalancerelement;
-                                                                if (items != null && items.length > 0) {
-                                                                    internalLbElementId = items[0].id;
-                                                                }
-                                                            }
-                                                        });
-                                                        if (internalLbElementId == null) {
-                                                            alert("error: listInternalLoadBalancerElements API doesn't return Internal LB Element Id");
-                                                            return;
-                                                        }
-
-                                                        $.ajax({
-                                                            url: createURL("configureInternalLoadBalancerElement&enabled=true&id=" + internalLbElementId),
-                                                            dataType: "json",
-                                                            async: false,
-                                                            success: function (json) {
-                                                                var jobId = json.configureinternalloadbalancerelementresponse.jobid;
-                                                                var enableInternalLbElementIntervalID = setInterval(function () {
-                                                                    $.ajax({
-                                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                        dataType: "json",
-                                                                        success: function (json) {
-                                                                            var result = json.queryasyncjobresultresponse;
-                                                                            if (result.jobstatus == 0) {
-                                                                                return; //Job has not completed
-                                                                            } else {
-                                                                                clearInterval(enableInternalLbElementIntervalID);
-
-                                                                                if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
-                                                                                    $.ajax({
-                                                                                        url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + internalLbProviderId),
-                                                                                        dataType: "json",
-                                                                                        async: false,
-                                                                                        success: function (json) {
-                                                                                            var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                                            var enableInternalLbProviderIntervalID = setInterval(function () {
-                                                                                                $.ajax({
-                                                                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                                    dataType: "json",
-                                                                                                    success: function (json) {
-                                                                                                        var result = json.queryasyncjobresultresponse;
-                                                                                                        if (result.jobstatus == 0) {
-                                                                                                            return; //Job has not completed
-                                                                                                        } else {
-                                                                                                            clearInterval(enableInternalLbProviderIntervalID);
-
-                                                                                                            if (result.jobstatus == 1) { //Internal LB has been enabled successfully
-                                                                                                                //don't need to do anything here
-                                                                                                            } else if (result.jobstatus == 2) {
-                                                                                                                alert("failed to enable Internal LB Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                            }
-                                                                                                        }
-                                                                                                    },
-                                                                                                    error: function (XMLHttpResponse) {
-                                                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                        alert("failed to enable Internal LB Provider. Error: " + errorMsg);
-                                                                                                    }
-                                                                                                });
-                                                                                            }, g_queryAsyncJobResultInterval);
-                                                                                        }
-                                                                                    });
-                                                                                } else if (result.jobstatus == 2) {
-                                                                                    alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
-                                                                                }
-                                                                            }
-                                                                        },
-                                                                        error: function (XMLHttpResponse) {
-                                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                            alert("configureVirtualRouterElement failed. Error: " + errorMsg);
-                                                                        }
-                                                                    });
-                                                                }, g_queryAsyncJobResultInterval);
-                                                            }
-                                                        });
-                                                        // ***** Internal LB ***** (end) *****
-
-                                                        if (args.data.zone.sgEnabled != true) { //Advanced SG-disabled zone
-                                                            // ***** VPC Virtual Router ***** (begin) *****
-                                                            var vpcVirtualRouterProviderId;
-                                                            $.ajax({
-                                                                url: createURL("listNetworkServiceProviders&name=VpcVirtualRouter&physicalNetworkId=" + thisPhysicalNetwork.id),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                    if (items != null && items.length > 0) {
-                                                                        vpcVirtualRouterProviderId = items[0].id;
-                                                                    }
-                                                                }
-                                                            });
-                                                            if (vpcVirtualRouterProviderId == null) {
-                                                                alert("error: listNetworkServiceProviders API doesn't return VpcVirtualRouter provider ID");
-                                                                return;
-                                                            }
-
-                                                            var vpcVirtualRouterElementId;
-                                                            $.ajax({
-                                                                url: createURL("listVirtualRouterElements&nspid=" + vpcVirtualRouterProviderId),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
-                                                                    if (items != null && items.length > 0) {
-                                                                        vpcVirtualRouterElementId = items[0].id;
-                                                                    }
-                                                                }
-                                                            });
-                                                            if (vpcVirtualRouterElementId == null) {
-                                                                alert("error: listVirtualRouterElements API doesn't return VPC Virtual Router Element Id");
-                                                                return;
-                                                            }
-
-                                                            $.ajax({
-                                                                url: createURL("configureVirtualRouterElement&enabled=true&id=" + vpcVirtualRouterElementId),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var jobId = json.configurevirtualrouterelementresponse.jobid;
-                                                                    var enableVpcVirtualRouterElementIntervalID = setInterval(function () {
-                                                                        $.ajax({
-                                                                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                            dataType: "json",
-                                                                            success: function (json) {
-                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                if (result.jobstatus == 0) {
-                                                                                    return; //Job has not completed
-                                                                                } else {
-                                                                                    clearInterval(enableVpcVirtualRouterElementIntervalID);
-
-                                                                                    if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
-                                                                                        $.ajax({
-                                                                                            url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + vpcVirtualRouterProviderId),
-                                                                                            dataType: "json",
-                                                                                            async: false,
-                                                                                            success: function (json) {
-                                                                                                var jobId = json.updatenetworkserviceproviderresponse.jobid;
-                                                                                                var enableVpcVirtualRouterProviderIntervalID = setInterval(function () {
-                                                                                                    $.ajax({
-                                                                                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
-                                                                                                        dataType: "json",
-                                                                                                        success: function (json) {
-                                                                                                            var result = json.queryasyncjobresultresponse;
-                                                                                                            if (result.jobstatus == 0) {
-                                                                                                                return; //Job has not completed
-                                                                                                            } else {
-                                                                                                                clearInterval(enableVpcVirtualRouterProviderIntervalID);
-
-                                                                                                                if (result.jobstatus == 1) { //VPC Virtual Router has been enabled successfully
-                                                                                                                    //don't need to do anything here
-                                                                                                                } else if (result.jobstatus == 2) {
-                                                                                                                    alert("failed to enable VPC Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
-                                                                                                                }
-                                                                                                            }
-                                                                                                        },
-                                                                                                        error: function (XMLHttpResponse) {
-                                                                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                                            alert("failed to enable VPC Virtual Router Provider. Error: " + errorMsg);
-                                                                                                        }
-                                                                                                    });
-                                                                                                }, g_queryAsyncJobResultInterval);
-                                                                                            }
-                                                                                        });
-                                                                                    } else if (result.jobstatus == 2) {
-                                                                                        alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
-                                                                                    }
-                                                                                }
-                                                                            },
-                                                                            error: function (XMLHttpResponse) {
-                                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                alert("configureVirtualRouterElement failed. Error: " + errorMsg);
-                                                                            }
-                                                                        });
-                                                                    }, g_queryAsyncJobResultInterval);
-                                                                }
-                                                            });
-                                                            // ***** VPC Virtual Router ***** (end) *****
-                                                        } else { //args.data.zone.sgEnabled == true  //Advanced SG-enabled zone
-                                                            message(_l('message.enabling.security.group.provider'));
-
-                                                            // get network service provider ID of Security Group
-                                                            var securityGroupProviderId;
-                                                            $.ajax({
-                                                                url: createURL("listNetworkServiceProviders&name=SecurityGroupProvider&physicalNetworkId=" + thisPhysicalNetwork.id),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function (json) {
-                                                                    var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
-                                                                    if (items != null && items.length > 0) {
-                                                                        securityGroupProviderId = items[0].id;
-                                                                    }
-                                                                }
-                                                            });
-                                                            if (securityGroupProviderId == null) {
-                                                                alert("error: listNetworkServiceProviders API doesn't return security group provider ID");
-                                                                return;
-                                                            }
-
-                                                            $.ajax({
-                                                                url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + securityGroupProviderId),
-                                                                dataType: "json",
-                                                                async: false,
-                                                                success: function(json) {
-                                                                    var enableSecurityGroupProviderIntervalID = setInterval(function() {
-                                                                        $.ajax({
-                                                                            url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid),
-                                                                            dataType: "json",
-                                                                            success: function(json) {
-                                                                                var result = json.queryasyncjobresultresponse;
-                                                                                if (result.jobstatus == 0) {
-                                                                                    return; //Job has not completed
-                                                                                } else {
-                                                                                    clearInterval(enableSecurityGroupProviderIntervalID);
-
-                                                                                    if (result.jobstatus == 1) { //Security group provider has been enabled successfully
-                                                                                        //don't need to do anything here
-                                                                                    } else if (result.jobstatus == 2) {
-                                                                                        alert("failed to enable security group provider. Error: " + _s(result.jobresult.errortext));
-                                                                                    }
-                                                                                }
-                                                                            },
-                                                                            error: function(XMLHttpResponse) {
-                                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                                                alert("failed to enable security group provider. Error: " + errorMsg);
-                                                                            }
-                                                                        });
-                                                                    }, g_queryAsyncJobResultInterval);
-                                                                }
-                                                            });
-                                                        }
-                                                    } else if (result.jobstatus == 2) {
-                                                        alert("failed to enable physical network. Error: " + _s(result.jobresult.errortext));
-                                                    }
-                                                }
-                                            },
-                                            error: function(XMLHttpResponse) {
-                                                alert("failed to enable physical network. Error: " + parseXMLHttpResponse(XMLHttpResponse));
-                                            }
-                                        });
-                                    }, g_queryAsyncJobResultInterval);
-                                }
-                            });
-                        });
-                    }
-                },
-
-                addNetscalerProvider: function(args) {
-
-                    if (selectedNetworkOfferingHavingNetscaler == true) {
-                        message(_l('message.adding.Netscaler.provider'));
-
-                        $.ajax({
-                            url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + args.data.returnedBasicPhysicalNetwork.id),
-                            dataType: "json",
-                            async: false,
-                            success: function(json) {
-                                var addNetscalerProviderIntervalID = setInterval(function() {
-                                    $.ajax({
-                                        url: createURL("queryAsyncJobResult&jobId=" + json.addnetworkserviceproviderresponse.jobid),
-                                        dataType: "json",
-                                        success: function(json) {
-                                            var result = json.queryasyncjobresultresponse;
-                                            if (result.jobstatus == 0) {
-                                                return; //Job has not completed
-                                            } else {
-                                                clearInterval(addNetscalerProviderIntervalID);
-
-                                                if (result.jobstatus == 1) {
-                                                    args.data.returnedNetscalerProvider = result.jobresult.networkserviceprovider;
-                                                    stepFns.addNetscalerDevice({
-                                                        data: args.data
-                                                    });
-                                                } else if (result.jobstatus == 2) {
-                                                    alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + _s(result.jobresult.errortext));
-                                                }
-                                            }
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg);
-                                        }
-                                    });
-                                }, g_queryAsyncJobResultInterval);
-                            }
-                        });
-                        //add netscaler provider (end)
-                    } else { //selectedNetworkOfferingHavingNetscaler == false
-                        //create a guest network for basic zone
-                        stepFns.addGuestNetwork({
-                            data: args.data
-                        });
-                    }
-                },
-
-
-                addNetscalerDevice: function(args) {
-                    message(_l('message.adding.Netscaler.device'));
-
-                    var array1 = [];
-                    array1.push("&physicalnetworkid=" + args.data.returnedBasicPhysicalNetwork.id);
-                    cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.basicPhysicalNetwork.username, args.data.basicPhysicalNetwork.password);
-                    array1.push("&networkdevicetype=" + encodeURIComponent(args.data.basicPhysicalNetwork.networkdevicetype));
-                    array1.push("&gslbprovider=" + (args.data.basicPhysicalNetwork.gslbprovider == "on"));
-                    array1.push("&gslbproviderpublicip=" + encodeURIComponent(args.data.basicPhysicalNetwork.gslbproviderpublicip));
-                    array1.push("&gslbproviderprivateip=" + encodeURIComponent(args.data.basicPhysicalNetwork.gslbproviderprivateip));
-
-                    //construct URL starts here
-                    var url = [];
-
-                    var ip = args.data.basicPhysicalNetwork.ip;
-                    url.push("https://" + ip);
-
-                    var isQuestionMarkAdded = false;
-
-                    var publicInterface = args.data.basicPhysicalNetwork.publicinterface;
-                    if (publicInterface != null && publicInterface.length > 0) {
-                        if (isQuestionMarkAdded == false) {
-                            url.push("?");
-                            isQuestionMarkAdded = true;
-                        } else {
-                            url.push("&");
-                        }
-                        url.push("publicinterface=" + publicInterface);
-                    }
-
-                    var privateInterface = args.data.basicPhysicalNetwork.privateinterface;
-                    if (privateInterface != null && privateInterface.length > 0) {
-                        if (isQuestionMarkAdded == false) {
-                            url.push("?");
-                            isQuestionMarkAdded = true;
-                        } else {
-                            url.push("&");
-                        }
-                        url.push("privateinterface=" + privateInterface);
-                    }
-
-                    var numretries = args.data.basicPhysicalNetwork.numretries;
-                    if (numretries != null && numretries.length > 0) {
-                        if (isQuestionMarkAdded == false) {
-                            url.push("?");
-                            isQuestionMarkAdded = true;
-                        } else {
-                            url.push("&");
-                        }
-                        url.push("numretries=" + numretries);
-                    }
-
-                    var isInline = args.data.basicPhysicalNetwork.inline;
-                    if (isInline != null && isInline.length > 0) {
-                        if (isQuestionMarkAdded == false) {
-                            url.push("?");
-                            isQuestionMarkAdded = true;
-                        } else {
-                            url.push("&");
-                        }
-                        url.push("inline=" + isInline);
-                    }
-
-                    var capacity = args.data.basicPhysicalNetwork.capacity;
-                    if (capacity != null && capacity.length > 0) {
-                        if (isQuestionMarkAdded == false) {
-                            url.push("?");
-                            isQuestionMarkAdded = true;
-                        } else {
-                            url.push("&");
-                        }
-                        url.push("lbdevicecapacity=" + capacity);
-                    }
-
-                    var dedicated = (args.data.basicPhysicalNetwork.dedicated == "on"); //boolean    (true/false)
-                    if (isQuestionMarkAdded == false) {
-                        url.push("?");
-                        isQuestionMarkAdded = true;
-                    } else {
-                        url.push("&");
-                    }
-                    url.push("lbdevicededicated=" + dedicated.toString());
-
-
-                    array1.push("&url=" + encodeURIComponent(url.join("")));
-                    //construct URL ends here
-
-                    $.ajax({
-                        url: createURL("addNetscalerLoadBalancer" + array1.join("")),
-                        type: "POST",
-                        dataType: "json",
-                        success: function(json) {
-                            var addNetscalerLoadBalancerIntervalID = setInterval(function() {
-                                $.ajax({
-                                    url: createURL("queryAsyncJobResult&jobid=" + json.addnetscalerloadbalancerresponse.jobid),
-                                    dataType: "json",
-                                    success: function(json) {
-                                        var result = json.queryasyncjobresultresponse;
-                                        if (result.jobstatus == 0) {
-                                            return;
-                                        } else {
-                                            clearInterval(addNetscalerLoadBalancerIntervalID);
-
-                                            if (result.jobstatus == 1) {
-                                                args.data.returnedNetscalerProvider.returnedNetscalerloadbalancer = result.jobresult.netscalerloadbalancer;
-
-                                                $.ajax({
-                                                    url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + args.data.returnedNetscalerProvider.id),
-                                                    dataType: "json",
-                                                    success: function(json) {
-                                                        var enableNetscalerProviderIntervalID = setInterval(function() {
-                                                            $.ajax({
-                                                                url: createURL("queryAsyncJobResult&jobid=" + json.updatenetworkserviceproviderresponse.jobid),
-                                                                dataType: "json",
-                                                                success: function(json) {
-                                                                    var result = json.queryasyncjobresultresponse;
-                                                                    if (result.jobstatus == 0) {
-                                                                        return;
-                                                                    } else {
-                                                                        clearInterval(enableNetscalerProviderIntervalID);
-
-                                                                        if (result.jobstatus == 1) {
-                                                                            stepFns.addGuestNetwork({
-                                                                                data: args.data
-                                                                            });
-                                                                        } else if (result.jobstatus == 2) {
-                                                                            alert("failed to enable Netscaler provider. Error: " + _s(result.jobresult.errortext));
-                                                                        }
-                                                                    }
-                                                                }
-                                                            });
-                                                        }, g_queryAsyncJobResultInterval);
-                                                    },
-                                                    error: function(XMLHttpResponse) {
-                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                        alert("failed to enable Netscaler provider. Error: " + errorMsg);
-                                                    }
-                                                });
-                                            } else if (result.jobstatus == 2) { //addNetscalerLoadBalancer failed
-                                                error('addNetscalerDevice', _s(result.jobresult.errortext), {
-                                                    fn: 'addNetscalerDevice',
-                                                    args: args
-                                                });
-                                            }
-                                        }
-                                    }
-                                });
-                            }, g_queryAsyncJobResultInterval);
-                        },
-                        error: function(XMLHttpResponse) {
-                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                            error('addNetscalerDevice', errorMsg, {
-                                fn: 'addNetscalerDevice',
-                                args: args
-                            });
-                        }
-                    });
-                },
-
-                addGuestNetwork: function(args) { //create a guest network for Basic zone or Advanced zone with SG
-                    message(_l('message.creating.guest.network'));
-
-                    var data = {
-                        zoneid: args.data.returnedZone.id,
-                        name: 'defaultGuestNetwork',
-                        displaytext: 'defaultGuestNetwork',
-                        networkofferingid: args.data.zone.networkOfferingId
-                    };
-
-                    //Advanced zone with SG
-                    if (args.data.zone.networkType == "Advanced" && args.data.zone.sgEnabled == true) {
-                        $.extend(data, {
-                            gateway: args.data.guestTraffic.guestGateway,
-                            netmask: args.data.guestTraffic.guestNetmask,
-                            startip: args.data.guestTraffic.guestStartIp,
-                            vlan: args.data.guestTraffic.vlanId
-                        });
-                        if (args.data.guestTraffic.guestEndIp != null && args.data.guestTraffic.guestEndIp.length > 0) {
-                            $.extend(data, {
-                                endip: args.data.guestTraffic.guestEndIp
-                            });
-                        }
-                        if (args.data.zone.ip6cidr != null && args.data.zone.ip6cidr.length > 0) {
-                            $.extend(data, {
-                                ip6cidr: args.data.zone.ip6cidr
-                            });
-                        }
-                        if (args.data.zone.ip6gateway != null && args.data.zone.ip6gateway.length > 0) {
-                            $.extend(data, {
-                                ip6gateway: args.data.zone.ip6gateway
-                            });
-                        }
-                    }
-
-                    $.ajax({
-                        url: createURL('createNetwork'),
-                        data: data,
-                        async: false,
-                        success: function(json) {
-                            //basic zone has only one physical network => addPod() will be called only once => so don't need to double-check before calling addPod()
-                            stepFns.addPod({
-                                data: $.extend(args.data, {
-                                    returnedGuestNetwork: json.createnetworkresponse.network
-                                })
-                            });
-                        },
-                        error: function(XMLHttpResponse) {
-                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                            alert("failed to create a guest network for basic zone. Error: " + errorMsg);
-                        }
-                    });
-                },
-
-                addPod: function(args) {
-                    message(_l('message.creating.pod'));
-
-                    var array3 = [];
-                    array3.push("&zoneId=" + args.data.returnedZone.id);
-                    array3.push("&name=" + encodeURIComponent(args.data.pod.name));
-                    array3.push("&gateway=" + encodeURIComponent(args.data.pod.reservedSystemGateway));
-                    array3.push("&netmask=" + encodeURIComponent(args.data.pod.reservedSystemNetmask));
-                    array3.push("&startIp=" + encodeURIComponent(args.data.pod.reservedSystemStartIp));
-
-                    var endip = args.data.pod.reservedSystemEndIp; //optional
-                    if (endip != null && endip.length > 0)
-                        array3.push("&endIp=" + encodeURIComponent(endip));
-
-                    $.ajax({
-                        url: createURL("createPod" + array3.join("")),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            stepFns.configurePublicTraffic({
-                                data: $.extend(args.data, {
-                                    returnedPod: json.createpodresponse.pod
-                                })
-                            });
-                        },
-                        error: function(XMLHttpResponse) {
-                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                            error('addPod', errorMsg, {
-                                fn: 'addPod',
-                                args: args
-                            });
-                        }
-                    });
-                },
-
-                configurePublicTraffic: function(args) {
-                    if ((args.data.zone.networkType == "Basic" && (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true)) || (args.data.zone.networkType == "Advanced" && args.data.zone.sgEnabled != true)) {
-
-                        message(_l('message.configuring.public.traffic'));
-
-                        var stopNow = false;
-
-                        $(args.data.publicTraffic).each(function() {
-                            var thisPublicVlanIpRange = this;
-
-                            //check whether the VlanIpRange exists or not (begin)
-                            var isExisting = false;
-                            $(returnedPublicVlanIpRanges).each(function() {
-                                if (this.vlan == thisPublicVlanIpRange.vlanid && this.startip == thisPublicVlanIpRange.startip && this.netmask == thisPublicVlanIpRange.netmask && this.gateway == thisPublicVlanIpRange.gateway) {
-                                    isExisting = true;
-                                    return false; //break each loop
-                                }
-                            });
-                            if (isExisting == true)
-                                return; //skip current item to next item (continue each loop)
-
-                            //check whether the VlanIpRange exists or not (end)
-
-                            var array1 = [];
-                            array1.push("&zoneId=" + args.data.returnedZone.id);
-
-                            if (this.vlanid != null && this.vlanid.length > 0)
-                                array1.push("&vlan=" + encodeURIComponent(this.vlanid));
-                            else
-                                array1.push("&vlan=untagged");
-
-                            array1.push("&gateway=" + this.gateway);
-                            array1.push("&netmask=" + this.netmask);
-                            array1.push("&startip=" + this.startip);
-                            if (this.endip != null && this.endip.length > 0)
-                                array1.push("&endip=" + this.endip);
-
-                            if (args.data.zone.networkType == "Basic") {
-                                array1.push("&forVirtualNetwork=true");
-                            } else if (args.data.zone.networkType == "Advanced") {
-                                if (args.data.zone.sgEnabled != true) {
-                                    array1.push("&forVirtualNetwork=true");
-                                } else { //args.data.zone.sgEnabled    == true
-                                    array1.push("&forVirtualNetwork=false");
-                                }
-                            }
-
-                            $.ajax({
-                                url: createURL("createVlanIpRange" + array1.join("")),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    var item = json.createvlaniprangeresponse.vlan;
-                                    returnedPublicVlanIpRanges.push(item);
-                                },
-                                error: function(XMLHttpResponse) {
-                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                    error('configurePublicTraffic', errorMsg, {
-                                        fn: 'configurePublicTraffic',
-                                        args: args
-                                    });
-                                    stopNow = true;
-                                }
-                            });
-
-                            if (stopNow == true)
-                                return false; //break each loop, don't create next VlanIpRange
-                        });
-
-                        if (stopNow == true)
-                            return; //stop the whole process
-
-                        stepFns.configureStorageTraffic({
-                            data: $.extend(args.data, {
-                                returnedPublicTraffic: returnedPublicVlanIpRanges
-                            })
-                        });
-                    } else if (args.data.zone.networkType == "Advanced" && args.data.zone.sgEnabled == true) { // Advanced SG-enabled zone doesn't have public traffic type
-                        stepFns.configureStorageTraffic({
-                            data: args.data
-                        });
-                    } else { //basic zone without public traffic type , skip to next step
-                        if (data.physicalNetworks && $.inArray('storage', data.physicalNetworks[0].trafficTypes) > -1) {
-                            stepFns.configureStorageTraffic({
-                                data: args.data
-                            });
-                        } else {
-                            stepFns.configureGuestTraffic({
-                                data: args.data
-                            });
-                        }
-                    }
-                },
-
-                configureStorageTraffic: function(args) {
-                    var complete = function(data) {
-                        stepFns.configureGuestTraffic({
-                            data: $.extend(args.data, data)
-                        });
-                    };
-
-                    var targetNetwork = $.grep(args.data.physicalNetworks, function(net) {
-                        return $.inArray('storage', net.trafficTypes) > -1;
-                    });
-
-                    if (!targetNetwork.length) {
-                        return complete({});
-                    }
-
-                    message(_l('message.configuring.storage.traffic'));
-
-                    var storageIPRanges = args.data.storageTraffic;
-                    var tasks = [];
-                    var taskTimer;
-
-                    $(storageIPRanges).each(function() {
-                        var item = this;
-                        if ('vlan' in item && (item.vlan == null || item.vlan.length == 0))
-                            delete item.vlan;
-                        $.ajax({
-                            url: createURL('createStorageNetworkIpRange'),
-                            data: $.extend(true, {}, item, {
-                                zoneid: args.data.returnedZone.id,
-                                podid: args.data.returnedPod.id
-                            }),
-                            success: function(json) {
-                                tasks.push({
-                                    jobid: json.createstoragenetworkiprangeresponse.jobid,
-                                    complete: false
-                                });
-                            },
-                            error: function(json) {
-                                tasks.push({
-                                    error: true,
-                                    message: parseXMLHttpResponse(json)
-                                });
-                            }
-                        });
-                    });
-
-                    taskTimer = setInterval(function() {
-                        var completedTasks = $.grep(tasks, function(task) {
-                            return task.complete || task.error;
-                        });
-
-                        var errorTasks = $.grep(tasks, function(task) {
-                            return task.error;
-                        });
-
-                        if (completedTasks.length == storageIPRanges.length) {
-                            clearInterval(taskTimer);
-
-                            if (errorTasks.length) {
-                                return error('configureStorageTraffic', errorTasks[0].message, {
-                                    fn: 'configureStorageTraffic',
-                                    args: args
-                                });
-                            }
-
-                            return complete({});
-                        }
-
-                        if (tasks.length == storageIPRanges.length) {
-                            $(tasks).each(function() {
-                                var task = this;
-
-                                if (task.error) return true;
-
-                                pollAsyncJobResult({
-                                    _custom: {
-                                        jobId: task.jobid
-                                    },
-                                    complete: function() {
-                                        task.complete = true;
-                                    },
-                                    error: function(args) {
-                                        task.error = true;
-                                        task.message = args.message;
-                                    }
-                                });
-
-                                return true;
-                            });
-                        }
-
-                        return true;
-                    }, 1000);
-
-                    return true;
-                },
-
-                configureGuestTraffic: function(args) {
-                    if (skipGuestTrafficStep == true) {
-                        stepFns.addCluster({
-                            data: args.data
-                        });
-                        return;
-                    }
-
-                    message(_l('message.configuring.guest.traffic'));
-
-                    if (args.data.returnedZone.networktype == "Basic") { //create an VlanIpRange for guest network in basic zone
-                        var array1 = [];
-                        array1.push("&podid=" + args.data.returnedPod.id);
-                        array1.push("&networkid=" + args.data.returnedGuestNetwork.id);
-                        array1.push("&gateway=" + args.data.guestTraffic.guestGateway);
-                        array1.push("&netmask=" + args.data.guestTraffic.guestNetmask);
-                        array1.push("&startip=" + args.data.guestTraffic.guestStartIp);
-                        if (args.data.guestTraffic.guestEndIp != null && args.data.guestTraffic.guestEndIp.length > 0)
-                            array1.push("&endip=" + args.data.guestTraffic.guestEndIp);
-                        array1.push("&forVirtualNetwork=false"); //indicates this new IP range is for guest network, not public network
-
-                        $.ajax({
-                            url: createURL("createVlanIpRange" + array1.join("")),
-                            dataType: "json",
-                            success: function(json) {
-                                args.data.returnedGuestNetwork.returnedVlanIpRange = json.createvlaniprangeresponse.vlan;
-
-                                if (args.data.zone.hypervisor == "BareMetal") { //if hypervisor is BareMetal, zone creation is completed at this point.
-                                    complete({
-                                        data: args.data
-                                    });
-                                } else {
-                                    stepFns.addCluster({
-                                        data: args.data
-                                    });
-                                }
-                            },
-                            error: function(XMLHttpResponse) {
-                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                error('configureGuestTraffic', errorMsg, {
-                                    fn: 'configureGuestTraffic',
-                                    args: args
-                                });
-                            }
-                        });
-                    } else if (args.data.returnedZone.networktype == "Advanced") { //update VLAN in physical network(s) in advanced zone
-                        var physicalNetworksHavingGuestIncludingVlan = [];
-                        $(args.data.physicalNetworks).each(function() {
-                            if (args.data.guestTraffic != null && args.data.guestTraffic.vlanRangeStart != null && args.data.guestTraffic.vlanRangeStart.length > 0) {
-                                physicalNetworksHavingGuestIncludingVlan.push(this);
-                            }
-                        });
-
-                        if (physicalNetworksHavingGuestIncludingVlan.length == 0) {
-                            stepFns.addCluster({
-                                data: args.data
-                            });
-                        } else {
-                            var updatedCount = 0;
-                            $(physicalNetworksHavingGuestIncludingVlan).each(function() {
-                                var vlan;
-                                if (args.data.guestTraffic.vlanRangeEnd == null || args.data.guestTraffic.vlanRangeEnd.length == 0)
-                                    vlan = args.data.guestTraffic.vlanRangeStart;
-                                else
-                                    vlan = args.data.guestTraffic.vlanRangeStart + "-" + args.data.guestTraffic.vlanRangeEnd;
-
-                                var originalId = this.id;
-                                var returnedId;
-                                $(args.data.returnedPhysicalNetworks).each(function() {
-                                    if (this.originalId == originalId) {
-                                        returnedId = this.id;
-                                        return false; //break the loop
-                                    }
-                                });
-
-                                $.ajax({
-                                    url: createURL("updatePhysicalNetwork&id=" + returnedId + "&vlan=" + encodeURIComponent(vlan)),
-                                    dataType: "json",
-                                    success: function(json) {
-                                        var jobId = json.updatephysicalnetworkresponse.jobid;
-                                        var updatePhysicalNetworkVlanIntervalID = setInterval(function() {
-                                            $.ajax({
-                                                url: createURL("queryAsyncJobResult&jobid=" + jobId),
-                                                dataType: "json",
-                                                success: function(json) {
-                                                    var result = json.queryasyncjobresultresponse;
-                                                    if (result.jobstatus == 0) {
-                                                        return;
-                                                    } else {
-                                                        clearInterval(updatePhysicalNetworkVlanIntervalID);
-
-                                                        if (result.jobstatus == 1) {
-                                                            updatedCount++;
-                                                            if (updatedCount == physicalNetworksHavingGuestIncludingVlan.length) {
-                                                                stepFns.addCluster({
-                                                                    data: args.data
-                                                                });
-                                                            }
-                                                        } else if (result.jobstatus == 2) {
-                                                            alert("error: " + _s(result.jobresult.errortext));
-                                                            error('configureGuestTraffic', result.jobresult.errortext, {
-                                                                fn: 'configureGuestTraffic',
-                                                                args: args
-                                                            });
-
-                                                        }
-                                                    }
-                                                },
-                                                error: function(XMLHttpResponse) {
-                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                                    error('configureGuestTraffic', errorMsg, {
-                                                        fn: 'configureGuestTraffic',
-                                                        args: args
-                                                    });
-                                                }
-                                            });
-                                        }, g_queryAsyncJobResultInterval);
-                                    }
-                                });
-                            });
-                        }
-                    }
-                },
-
-                addCluster: function(args) {
-                    message(_l('message.creating.cluster'));
-
-                    // Have cluster use zone's hypervisor
-                    args.data.cluster.hypervisor = args.data.zone.hypervisor ?
-                        args.data.zone.hypervisor : args.data.cluster.hypervisor;
-
-                    var array1 = [];
-                    array1.push("&zoneId=" + args.data.returnedZone.id);
-                    array1.push("&hypervisor=" + args.data.cluster.hypervisor);
-
-                    var clusterType;
-                    if (args.data.cluster.hypervisor == "VMware")
-                        clusterType = "ExternalManaged";
-                    else
-                        clusterType = "CloudManaged";
-                    array1.push("&clustertype=" + clusterType);
-
-                    array1.push("&podId=" + args.data.returnedPod.id);
-
-                    var clusterName = args.data.cluster.name;
-
-                    if (args.data.cluster.hypervisor == "VMware") {
-                        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.cluster.vCenterUsername, args.data.cluster.vCenterPassword);
-
-                        if (args.data.cluster.vsmipaddress != null && args.data.cluster.vsmipaddress.length > 0) {
-                            array1.push('&vsmipaddress=' + args.data.cluster.vsmipaddress);
-                        }
-
-                        if(args.data.cluster.vsmusername != null && args.data.cluster.vsmusername.length > 0) {
-                            array1.push('&vsmusername=' + args.data.cluster.vsmusername);
-                        }
-
-                        if(args.data.cluster.vsmpassword != null && args.data.cluster.vsmpassword.length > 0) {
-                            array1.push('&vsmpassword=' + args.data.cluster.vsmpassword);
-                        }
-
-                        var hostname = args.data.cluster.vCenterHost;
-                        var dcName = args.data.cluster.vCenterDatacenter;
-
-                        var url;
-                        if (hostname.indexOf("http://") == -1)
-                            url = "http://" + hostname;
-                        else
-                            url = hostname;
-                        url += "/" + dcName + "/" + clusterName;
-                        array1.push("&url=" + encodeURIComponent(url));
-                        clusterName = hostname + "/" + dcName + "/" + clusterName; //override clusterName
-                    }
-                    array1.push("&clustername=" + encodeURIComponent(clusterName));
-
-                    if (args.data.cluster.hypervisor == "VMware") {
-                        var vmwareData = {
-                            zoneId: args.data.returnedZone.id,
-                            username: args.data.cluster.vCenterUsername,
-                            password: args.data.cluster.vCenterPassword,
-                            name: args.data.cluster.vCenterDatacenter,
-                            vcenter: args.data.cluster.vCenterHost
-                        };
-                        $.ajax({
-                            url: createURL('addVmwareDc'),
-                            data: vmwareData,
-                            type: "POST",
-                            success: function(json) {
-                                var item = json.addvmwaredcresponse.vmwaredc;
-                                if (item.id != null) {
-                                    $.ajax({
-                                        url: createURL("addCluster" + array1.join("")),
-                                        dataType: "json",
-                                        async: true,
-                                        success: function(json) {
-                                            stepFns.addPrimaryStorage({ //skip "add host step" when hypervisor is VMware
-                                                data: $.extend(args.data, {
-                                                    returnedCluster: json.addclusterresponse.cluster[0]
-                                                })
-                                            });
-                                        },
-                                        error: function(XMLHttpResponse) {
-                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                            error('addCluster', errorMsg, {
-                                                fn: 'addCluster',
-                                                args: args
-                                            });
-                                        }
-                                    });
-                                }
-                            },
-
-                            error: function(XMLHttpResponse) {
-                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                error('addCluster', errorMsg, {
-                                    fn: 'addCluster',
-                                    args: args
-                                });
-                            }
-
-                        });
-                    } else {
-                        $.ajax({
-                            url: createURL("addCluster" + array1.join("")),
-                            dataType: "json",
-                            type: "POST",
-                            success: function(json) {
-                                stepFns.addHost({
-                                    data: $.extend(args.data, {
-                                        returnedCluster: json.addclusterresponse.cluster[0]
-                                    })
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                error('addCluster', errorMsg, {
-                                    fn: 'addCluster',
-                                    args: args
-                                });
-                            }
-                        });
-                    }
-                },
-
-                addHost: function(args) {
-                    message(_l('message.adding.host'));
-
-                    var data = {
-                        zoneid: args.data.returnedZone.id,
-                        podid: args.data.returnedPod.id,
-                        clusterid: args.data.returnedCluster.id,
-                        hypervisor: args.data.returnedCluster.hypervisortype,
-                        clustertype: args.data.returnedCluster.clustertype,
-                        hosttags: args.data.host.hosttags,
-                        username: args.data.host.username,
-                        password: args.data.host.password
-                    };
-
-                    var hostname = args.data.host.hostname;
-                    var url;
-                    if (hostname.indexOf("http://") == -1) {
-                        url = "http://" + hostname;
-                    } else {
-                        url = hostname;
-                    }
-                    $.extend(data, {
-                        url: url
-                    });
-
-                    if (args.data.cluster.hypervisor == "BareMetal") {
-                        $.extend(data, {
-                            cpunumber: args.data.host.baremetalCpuCores,
-                            cpuspeed: args.data.host.baremetalCpu,
-                            memory: args.data.host.baremetalMemory,
-                            hostmac: args.data.host.baremetalMAC
-                        });
-                    } else if (args.data.cluster.hypervisor == "Ovm") {
-                        $.extend(data, {
-                            agentusername: args.data.host.agentUsername,
-                            agentpassword: args.data.host.agentPassword
-                        });
-                    }
-
-                    var addHostAjax = function() {
-                        $.ajax({
-                            url: createURL("addHost"),
-                            type: "POST",
-                            data: data,
-                            success: function(json) {
-                                stepFns.addPrimaryStorage({
-                                    data: $.extend(args.data, {
-                                        returnedHost: json.addhostresponse.host[0]
-                                    })
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                error('addHost', errorMsg, {
-                                    fn: 'addHost',
-                                    args: args
-                                });
-                            }
-                        });
-                    };
-
-                    if(args.data.zone.localstorageenabledforsystemvm == 'on') {
-                        $.ajax({
-                            url: createURL("updateConfiguration&name=system.vm.use.local.storage&value=true&zoneid=" + args.data.returnedZone.id),
-                            dataType: "json",
-                            success: function(json) {
-                                addHostAjax();
-                            },
-                            error: function(XMLHttpResponse) {
-                               var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                               error('addHost', errorMsg, {
-                                   fn: 'addHost',
-                                   args: args
-                               });
-                            }
-                        });
-                    } else {
-                        addHostAjax();
-                    }
-                },
-
-                addPrimaryStorage: function(args) {
-                    if (args.data.zone.localstorageenabled == 'on' && args.data.zone.localstorageenabledforsystemvm == 'on') { //use local storage, don't need primary storage. So, skip this step.
-                        stepFns.addSecondaryStorage({
-                            data: args.data
-                        });
-                        return;
-                    }
-
-                    message(_l('message.creating.primary.storage'));
-
-                    var array1 = [];
-                    array1.push("&zoneid=" + args.data.returnedZone.id);
-                    array1.push("&podId=" + args.data.returnedPod.id);
-                    array1.push("&clusterid=" + args.data.returnedCluster.id);
-                    array1.push("&name=" + encodeURIComponent(args.data.primaryStorage.name));
-                    array1.push("&scope=" + encodeURIComponent(args.data.primaryStorage.scope));
-
-                    //zone-wide-primary-storage is supported only for KVM and VMWare
-                    if (args.data.primaryStorage.scope == "zone") { //hypervisor type of the hosts in zone that will be attached to this storage pool. KVM, VMware supported as of now.
-                        if(args.data.cluster.hypervisor != undefined) {
-                            array1.push("&hypervisor=" + encodeURIComponent(args.data.cluster.hypervisor));
-                        } else if(args.data.returnedCluster.hypervisortype != undefined) {
-                            array1.push("&hypervisor=" + encodeURIComponent(args.data.returnedCluster.hypervisortype));
-                        } else {
-                            cloudStack.dialog.notice({
-                                message: "Error: args.data.cluster.hypervisor is undefined. So is args.data.returnedCluster.hypervisortype (zone-wide-primary-storage)"
-                            });
-                        }
-                    }
-
-                    var server = args.data.primaryStorage.server;
-                    var url = null;
-                    if (args.data.primaryStorage.protocol == "nfs") {
-                        var path = args.data.primaryStorage.path;
-                        if (path.substring(0, 1) != "/")
-                            path = "/" + path;
-                        url = nfsURL(server, path);
-                    } else if (args.data.primaryStorage.protocol == "SMB") {
-                        var path = args.data.primaryStorage.path;
-                        if (path.substring(0, 1) != "/")
-                            path = "/" + path;
-                        url = smbURL(server, path);
-                        array1.push("&details[0].user=" + args.data.primaryStorage.smbUsername);
-                        array1.push("&details[1].password=" + encodeURIComponent(args.data.primaryStorage.smbPassword));
-                        array1.push("&details[2].domain=" + args.data.primaryStorage.smbDomain);
-                    } else if (args.data.primaryStorage.protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") {
-                        var path = args.data.primaryStorage.path;
-                        if (path.substring(0, 1) != "/")
-                            path = "/" + path;
-                        url = presetupURL(server, path);
-                    } else if (args.data.primaryStorage.protocol == "ocfs2") {
-                        var path = args.data.primaryStorage.path;
-                        if (path.substring(0, 1) != "/")
-                            path = "/" + path;
-                        url = ocfs2URL(server, path);
-                    } else if (args.data.primaryStorage.protocol == "SharedMountPoint") {
-                        var path = args.data.primaryStorage.path;
-                        if (path.substring(0, 1) != "/")
-                            path = "/" + path;
-                        url = SharedMountPointURL(server, path);
-                    } else if (args.data.primaryStorage.protocol == "clvm") {
-                        var vg = args.data.primaryStorage.volumegroup;
-                        if (vg.substring(0, 1) != "/")
-                            vg = "/" + vg;
-                        url = clvmURL(vg);
-                    } else if (args.data.primaryStorage.protocol == "rbd") {
-                        var rbdmonitor = args.data.primaryStorage.rbdmonitor;
-                        var rbdpool = args.data.primaryStorage.rbdpool;
-                        var rbdid = args.data.primaryStorage.rbdid;
-                        var rbdsecret = args.data.primaryStorage.rbdsecret;
-                        url = rbdURL(rbdmonitor, rbdpool, rbdid, rbdsecret);
-                    } else if (args.data.primaryStorage.protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") {
-                        var path = args.data.primaryStorage.vCenterDataCenter;
-                        if (path.substring(0, 1) != "/")
-                            path = "/" + path;
-                        path += "/" + args.data.primaryStorage.vCenterDataStore;
-                        url = presetupURL("dummy", path);
-                    } else {
-                        var iqn = args.data.primaryStorage.iqn;
-                        if (iqn.substring(0, 1) != "/")
-                            iqn = "/" + iqn;
-                        var lun = args.data.primaryStorage.lun;
-                        url = iscsiURL(server, iqn, lun);
-                    }
-                    array1.push("&url=" + encodeURIComponent(url));
-
-                    if (args.data.primaryStorage.storageTags != null && args.data.primaryStorage.storageTags.length > 0)
-                        array1.push("&tags=" + encodeURIComponent(args.data.primaryStorage.storageTags));
-
-                    $.ajax({
-                        url: createURL("createStoragePool" + array1.join("")),
-                        dataType: "json",
-                        success: function(json) {
-                            stepFns.addSecondaryStorage({
-                                data: $.extend(args.data, {
-                                    returnedPrimaryStorage: json.createstoragepoolresponse.storagepool
-                                })
-                            });
-                        },
-                        error: function(XMLHttpResponse) {
-                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                            error('addPrimaryStorage', errorMsg, {
-                                fn: 'addPrimaryStorage',
-                                args: args
-                            });
-                        }
-                    });
-                },
-
-                addSecondaryStorage: function(args) {
-                    if (args.data.secondaryStorage.provider == '') {
-                        complete({
-                            data: args.data
-                        });
-                        return; //skip addSecondaryStorage if provider dropdown is blank
-                    }
-
-
-                    message(_l('message.creating.secondary.storage'));
-
-                    var data = {};
-                    if (args.data.secondaryStorage.name != null && args.data.secondaryStorage.name.length > 0) {
-                        $.extend(data, {
-                            name: args.data.secondaryStorage.name
-                        });
-                    }
-
-                    if (args.data.secondaryStorage.provider == 'NFS') {
-                        var nfs_server = args.data.secondaryStorage.nfsServer;
-                        var path = args.data.secondaryStorage.path;
-                        var url = nfsURL(nfs_server, path);
-
-                        $.extend(data, {
-                            provider: args.data.secondaryStorage.provider,
-                            zoneid: args.data.returnedZone.id,
-                            url: url
-                        });
-
-                        $.ajax({
-                            url: createURL('addImageStore'),
-                            data: data,
-                            success: function(json) {
-                                complete({
-                                    data: $.extend(args.data, {
-                                        returnedSecondaryStorage: json.addimagestoreresponse.secondarystorage
-                                    })
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                error('addSecondaryStorage', errorMsg, {
-                                    fn: 'addSecondaryStorage',
-                                    args: args
-                                });
-                            }
-                        });
-                    } else if (args.data.secondaryStorage.provider == 'SMB') {
-                        var nfs_server = args.data.secondaryStorage.nfsServer;
-                        var path = args.data.secondaryStorage.path;
-                        var url = smbURL(nfs_server, path);
-
-                        $.extend(data, {
-                            provider: args.data.secondaryStorage.provider,
-                            zoneid: args.data.returnedZone.id,
-                            url: url,
-                            'details[0].key': 'user',
-                            'details[0].value': args.data.secondaryStorage.smbUsername,
-                            'details[1].key': 'password',
-                            'details[1].value': args.data.secondaryStorage.smbPassword,
-                            'details[2].key': 'domain',
-                            'details[2].value': args.data.secondaryStorage.smbDomain
-                        });
-
-                        $.ajax({
-                            url: createURL('addImageStore'),
-                            data: data,
-                            success: function(json) {
-                                complete({
-                                    data: $.extend(args.data, {
-                                        returnedSecondaryStorage: json.addimagestoreresponse.secondarystorage
-                                    })
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                error('addSecondaryStorage', errorMsg, {
-                                    fn: 'addSecondaryStorage',
-                                    args: args
-                                });
-                            }
-                        });
-                    } else if (args.data.secondaryStorage.provider == 'S3') {
-                        if($wizard.find('form[rel=secondaryStorage]').find('div[rel=name]').find('input').attr("disabled") == "disabled") { //Name textbox is disabled (and populated with S3 image setore name) when S3 image store exists. In this case, do not call addImageStore to create S3 image store.
-                            complete({
-                                data: args.data
-                            });
-                        } else { //Name textbox is not disabled when S3 image store does not exist. In this case, call addImageStore to create S3 image store.
-                            $.extend(data, {
-                                provider: args.data.secondaryStorage.provider,
-                                'details[0].key': 'accesskey',
-                                'details[0].value': args.data.secondaryStorage.accesskey,
-                                'details[1].key': 'secretkey',
-                                'details[1].value': args.data.secondaryStorage.secretkey,
-                                'details[2].key': 'bucket',
-                                'details[2].value': args.data.secondaryStorage.bucket,
-                                'details[3].key': 'usehttps',
-                                'details[3].value': (args.data.secondaryStorage.usehttps != null && args.data.secondaryStorage.usehttps == 'on' ? 'true' : 'false')
-                            });
-
-                            var index = 4;
-                            if (args.data.secondaryStorage.endpoint != null && args.data.secondaryStorage.endpoint.length > 0) {
-                                data['details[' + index.toString() + '].key'] = 'endpoint';
-                                data['details[' + index.toString() + '].value'] = args.data.secondaryStorage.endpoint;
-                                index++;
-                            }
-                            if (args.data.secondaryStorage.connectiontimeout != null && args.data.secondaryStorage.connectiontimeout.length > 0) {
-                                data['details[' + index.toString() + '].key'] = 'connectiontimeout';
-                                data['details[' + index.toString() + '].value'] = args.data.secondaryStorage.connectiontimeout;
-                                index++;
-                            }
-                            if (args.data.secondaryStorage.maxerrorretry != null && args.data.secondaryStorage.maxerrorretry.length > 0) {
-                                data['details[' + index.toString() + '].key'] = 'maxerrorretry';
-                                data['details[' + index.toString() + '].value'] = args.data.secondaryStorage.maxerrorretry;
-                                index++;
-                            }
-                            if (args.data.secondaryStorage.sockettimeout != null && args.data.secondaryStorage.sockettimeout.length > 0) {
-                                data['details[' + index.toString() + '].key'] = 'sockettimeout';
-                                data['details[' + index.toString() + '].value'] = args.data.secondaryStorage.sockettimeout;
-                                index++;
-                            }
-                            $.ajax({
-                                url: createURL('addImageStore'),
-                                data: data,
-                                success: function(json) {
-                                    g_regionsecondaryenabled = true;
-
-                                    complete({
-                                        data: $.extend(args.data, {
-                                            returnedSecondaryStorage: json.addimagestoreresponse.secondarystorage
-                                        })
-                                    });
-                                },
-                                error: function(XMLHttpResponse) {
-                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                    error('addSecondaryStorage', errorMsg, {
-                                        fn: 'addSecondaryStorage',
-                                        args: args
-                                    });
-                                }
-                            });
-                        }
-
-                        //NFS Cache
-                        if ($wizard.find('form[rel=secondaryStorage]').find('div[rel=createNfsCache]').find("input[type=checkbox]").is(':checked') == true) {
-                            var zoneid = args.data.secondaryStorage.nfsCacheZoneid;
-                            var nfs_server = args.data.secondaryStorage.nfsCacheNfsServer;
-                            var path = args.data.secondaryStorage.nfsCachePath;
-                            var url = nfsURL(nfs_server, path);
-
-                            var nfsCacheData = {
-                                provider: 'NFS',
-                                zoneid: args.data.returnedZone.id,
-                                url: url
-                            };
-
-                            $.ajax({
-                                url: createURL('createSecondaryStagingStore'),
-                                data: nfsCacheData,
-                                success: function(json) {
-                                    //do nothing
-                                },
-                                error: function(XMLHttpResponse) {
-                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                    error('addSecondaryStorage', errorMsg, {
-                                        fn: 'addSecondaryStorage',
-                                        args: args
-                                    });
-                                }
-                            });
-                        }
-                    } else if (args.data.secondaryStorage.provider == 'Swift') {
-                        $.extend(data, {
-                            provider: args.data.secondaryStorage.provider,
-                            url: args.data.secondaryStorage.url
-                        });
-
-                        var index = 0;
-                        if (args.data.secondaryStorage.account != null && args.data.secondaryStorage.account.length > 0) {
-                            data['details[' + index.toString() + '].key'] = 'account';
-                            data['details[' + index.toString() + '].value'] = args.data.secondaryStorage.account;
-                            index++;
-                        }
-                        if (args.data.secondaryStorage.username != null && args.data.secondaryStorage.username.length > 0) {
-                            data['details[' + index.toString() + '].key'] = 'username';
-                            data['details[' + index.toString() + '].value'] = args.data.secondaryStorage.username;
-                            index++;
-                        }
-                        if (args.data.secondaryStorage.key != null && args.data.secondaryStorage.key.length > 0) {
-                            data['details[' + index.toString() + '].key'] = 'key';
-                            data['details[' + index.toString() + '].value'] = args.data.secondaryStorage.key;
-                            index++;
-                        }
-                        $.ajax({
-                            url: createURL('addImageStore'),
-                            data: data,
-                            success: function(json) {
-                                g_regionsecondaryenabled = true;
-
-                                complete({
-                                    data: $.extend(args.data, {
-                                        returnedSecondaryStorage: json.addimagestoreresponse.secondarystorage
-                                    })
-                                });
-                            },
-                            error: function(XMLHttpResponse) {
-                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
-                                error('addSecondaryStorage', errorMsg, {
-                                    fn: 'addSecondaryStorage',
-                                    args: args
-                                });
-                            }
-                        });
-                    }
-                }
-            };
-
-            var complete = function(args) {
-                message(_l('message.Zone.creation.complete'));
-                success(args);
-            };
-
-            if (startFn) {
-                stepFns[startFn.fn]({
-                    data: $.extend(startFn.args.data, data)
-                });
-            } else {
-                stepFns.addZone({});
-            }
-        },
-
-        enableZoneAction: function(args) {
-            $.ajax({
-                url: createURL("updateZone&allocationstate=Enabled&id=" + args.launchData.returnedZone.id),
-                dataType: "json",
-                success: function(json) {
-                    args.formData.returnedZone = json.updatezoneresponse.zone;
-                    args.response.success();
-                }
-            });
-        }
-    };
-}(cloudStack, jQuery));
diff --git a/ui/legacy/tests/index.html b/ui/legacy/tests/index.html
deleted file mode 100644
index d44985c..0000000
--- a/ui/legacy/tests/index.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <title>CloudStack UI Tests</title>
-    <link rel="stylesheet" href="../lib/qunit/qunit.css" type="text/css" media="screen" />
-    <link rel="stylesheet" href="../css/cloudStack3.css" type="text/css" media="screen" />
-  </head>
-  <body>
-    <h1 id="qunit-header">CloudStack UI Tests</h1>
-    <h2 id="qunit-banner"></h2>
-    <div id="qunit-testrunner-toolbar"></div>
-    <h2 id="qunit-userAgent"></h2>
-    <ol id="qunit-tests"></ol>
-    <div id="qunit-fixture">test markup, will be hidden</div>
-
-    <!-- Required libs -->
-    <script src="../lib/jquery.js" type="text/javascript"></script>
-    <script src="../lib/jquery.easing.js" type="text/javascript"></script>
-    <script src="../lib/jquery.validate.js" type="text/javascript"></script>
-    <script src="../lib/jquery-ui/js/jquery-ui.js" type="text/javascript"></script>
-    <script src="../lib/date.js" type="text/javascript"></script>
-    <script src="../lib/jquery.cookies.js" type="text/javascript"></script>
-    <script src="../lib/jquery.md5.js" type="text/javascript" ></script>
-    <script src="../lib/require.js" type="text/javascript"></script>
-    <script src="../lib/excanvas.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.colorhelpers.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.crosshair.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.fillbetween.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.image.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.navigate.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.pie.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.resize.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.selection.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.stack.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.symbol.js" type="text/javascript"></script>
-    <script src="../lib/flot/jquery.flot.threshold.js" type="text/javascript"></script>
-    <script src="../lib/qunit/qunit.js" type="text/javascript"></script>
-
-    <!-- UI -->
-    <script type="text/javascript" src="../scripts/ui/core.js"></script>
-    <script type="text/javascript" src="../scripts/ui/utils.js"></script>
-    <script type="text/javascript" src="../scripts/ui/events.js"></script>
-    <script type="text/javascript" src="../scripts/ui/dialog.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/multiEdit.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/overlay.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/dataTable.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/cloudBrowser.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/listView.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/detailView.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/treeView.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/notifications.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/tagger.js"></script>
-    <script type="text/javascript" src="../scripts/ui/widgets/toolTip.js"></script>
-
-    <!-- Tests -->
-    <script src="test.widget.listView.js" type="text/javascript"></script>
-  </body>
-</html> 
diff --git a/ui/legacy/tests/test.widget.listView.js b/ui/legacy/tests/test.widget.listView.js
deleted file mode 100644
index 059b152..0000000
--- a/ui/legacy/tests/test.widget.listView.js
+++ /dev/null
@@ -1,245 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-(function() {
-    var listView = function(args) {
-        var basicArgs = {
-            listView: {
-                fields: {},
-                dataProvider: function() {}
-            }
-        };
-
-        return $('<div>').listView(
-            $.extend(true, {}, basicArgs, args)
-        ).find('.list-view');
-    };
-
-    module('List view', {
-        setup: function() {
-            window.pageSize = 20;
-        },
-        teardown: function() {
-            delete window.pageSize;
-        }
-    });
-
-    test('Basic', function() {
-        var $listView = listView();
-        var $toolbar = $listView.find('> .toolbar');
-        var $table = $listView.find('> .data-table');
-
-        equal($listView.length, 1, 'List view present');
-        equal($toolbar.length, 1, 'Toolbar present');
-        equal($table.length, 1, 'Data table div present');
-        equal($table.find('> .fixed-header table thead tr').length, 1, 'Fixed header present');
-        equal($table.find('> table.body tbody').length, 1, 'Body table present');
-    });
-
-    test('Fields: basic', function() {
-        var $listView = listView({
-            listView: {
-                fields: {
-                    fieldA: { label: 'TestFieldA' }
-                }
-            }
-        });
-        var $fields = $listView.find('.fixed-header table thead tr th');
-
-        equal($fields.length, 1, 'Column present');
-        ok($fields.hasClass('fieldA'), 'Has ID as classname');
-        equal($fields.html(), 'TestFieldA', 'Has correct label');
-    });
-
-    test('Fields: n columns', function() {
-        var testFields = {
-            fieldA: { label: 'TestFieldA' },
-            fieldB: { label: 'TestFieldB' },
-            fieldC: { label: 'TestFieldC' }
-        };
-
-        var $listView = listView({
-            listView: {
-                fields: testFields
-            }
-        });
-        var $fields = $listView.find('.fixed-header table thead tr th');
-
-        $.each(testFields, function(k, v) {
-            var $field = $fields.filter('.' + k);
-
-            equal($field.length, 1, k + '-> Column present');
-            equal($field.html(), v.label, k + '-> Has correct label');
-        });
-    });
-
-    test('Data loading state', function() {
-        var $listView = listView();
-
-        equal($listView.find('table.body tr.loading').length, 1, 'Row has loading state');
-        equal($listView.find('table.body tr.loading td.loading.icon').length, 1, 'Row cell has loading icon');
-    });
-
-    asyncTest('Data provider: basic', function() {
-        expect(3);
-        var $listView = listView({
-            listView: {
-                fields: {
-                    fieldA: { label: 'TestFieldA' },
-                    fieldB: { label: 'TestFieldB' }
-                },
-                dataProvider: function(args) {
-                    args.response.success({ data: [] });
-
-                    ok(true, 'Data provider called');
-                    start();
-                }
-            }
-        });
-
-        equal($listView.find('.data-table table.body tbody tr.empty td').length, 1, 'Body table has empty table row');
-        equal($listView.find('.data-table table.body tbody tr.empty td').html(), 'label.no.data', 'Empty contents notice displayed');
-    });
-
-    asyncTest('Data provider: load data', function() {
-        var $listView = listView({
-            listView: {
-                fields: {
-                    fieldA: { label: 'TestFieldA' },
-                    fieldB: { label: 'TestFieldB' }
-                },
-                dataProvider: function(args) {
-                    args.response.success({
-                        data: [
-                            { fieldA: 'FieldDataA', fieldB: 'FieldDataB' }
-                        ]
-                    });
-
-                    start();
-                }
-            }
-        });
-
-        equal($listView.find('table.body tbody tr').length, 1, 'Body table has table row');
-        equal($listView.find('table.body tbody tr td').length, 2, 'Body table has table cells');
-        equal($listView.find('table.body tbody tr td.fieldA > span').html(), 'FieldDataA', 'FieldDataA content present');
-        equal($listView.find('table.body tbody tr td.fieldB > span').html(), 'FieldDataB', 'FieldDataB content present');
-    });
-
-    asyncTest('Data provider: multiple rows of data', function() {
-        var testData = [
-            { fieldA: 'FieldDataA1', fieldB: 'FieldDataB1' },
-            { fieldA: 'FieldDataA2', fieldB: 'FieldDataB2' },
-            { fieldA: 'FieldDataA3', fieldB: 'FieldDataB3' }
-        ];
-
-        var $listView = listView({
-            listView: {
-                fields: {
-                    fieldA: { label: 'TestFieldA' },
-                    fieldB: { label: 'TestFieldB' }
-                },
-                dataProvider: function(args) {
-                    args.response.success({
-                        data: testData
-                    });
-
-                    start();
-                }
-            }
-        });
-
-        equal($listView.find('table.body tbody tr').length, 3, 'Body table has correct # of table rows');
-
-        $(testData).map(function(index, data) {
-            var $tr = $listView.find('table.body tbody tr').filter(function() {
-                return $(this).index() === index;
-            });
-
-            equal($tr.find('td.fieldA > span').html(), 'FieldDataA' + (index + 1), 'FieldDataA' + (index + 1) + ' present');
-            equal($tr.find('td.fieldB > span').html(), 'FieldDataB' + (index + 1), 'FieldDataB' + (index + 1) + ' present');
-        });
-    });
-
-    test('Field pre-filter', function() {
-        var $listView = listView({
-            listView: {
-                fields: {
-                    fieldA: { label: 'TestFieldA' },
-                    fieldB: { label: 'TestFieldB' },
-                    fieldHidden: { label: 'TestFieldHidden' }
-                },
-                preFilter: function(args) {
-                    return ['fieldHidden'];
-                },
-                dataProvider: function(args) {
-                    args.response.success({
-                        data: [
-                            { fieldA: 'FieldDataA', fieldB: 'FieldDataB', fieldHidden: 'FieldDataHidden' }
-                        ]
-                    });
-
-                    start();
-                }
-            }
-        });
-
-        equal($listView.find('table tr th').length, 2, 'Correct number of header columns present');
-        equal($listView.find('table.body tbody tr td').length, 2, 'Correct number of data body columns present');
-        ok(!$listView.find('table.body tbody td.fieldHidden').length, 'Hidden field not present');
-    });
-
-    test('Filter dropdown', function() {
-        var $listView = listView({
-            listView: {
-                fields: {
-                    state: { label: 'State' }
-                },
-                filters: {
-                    on: { label: 'FilterOnLabel' },
-                    off: { label: 'FilterOffLabel' }
-                },
-                dataProvider: function(args) {
-                    var filterBy = args.filterBy.kind;
-                    var data = filterBy === 'on' ? [{ state: 'on' }] : [{ state: 'off' }];
-
-                    args.response.success({
-                        data: data
-                    });
-
-                    start();
-                }
-            }
-        });
-        
-        var $filters = $listView.find('.filters select');
-
-        var testFilterDropdownContent = function() {
-            equal($filters.find('option').length, 2, 'Correct # of filters present');
-            equal($filters.find('option:first').html(), 'FilterOnLabel', 'Filter on label present');
-            equal($filters.find('option:last').html(), 'FilterOffLabel', 'Filter off label present');
-        };
-
-        testFilterDropdownContent();
-        equal($filters.find('option').val(), 'on', 'Correct default filter active');
-        equal($listView.find('tbody td.state span').html(), 'on', '"on" data item visible');
-        ok($filters.val('off').trigger('change'), 'Change filter to "off"');
-        equal($listView.find('tbody td.state span').html(), 'off', '"off" data item visible');
-        equal($filters.val(), 'off', 'Correct filter active');
-        testFilterDropdownContent();
-    });
-}());
diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
index 5b1cc6a..39d2136 100644
--- a/ui/public/locales/en.json
+++ b/ui/public/locales/en.json
@@ -213,8 +213,10 @@
 "label.action.migrate.instance.processing": "Migrating Instance....",
 "label.action.migrate.router": "Migrate Router",
 "label.action.migrate.router.processing": "Migrating Router....",
+"label.action.migrate.router.to.ps": "Migrate router to another primary storage",
 "label.action.migrate.systemvm": "Migrate System VM",
 "label.action.migrate.systemvm.processing": "Migrating System VM....",
+"label.action.migrate.systemvm.to.ps": "Migrate system VM to another primary storage",
 "label.action.project.add.account": "Add Account to Project",
 "label.action.project.add.user": "Add User to Project",
 "label.action.reboot.instance": "Reboot Instance",
@@ -1358,6 +1360,7 @@
 "label.migrate.instance.to.host": "Migrate instance to another host",
 "label.migrate.instance.to.ps": "Migrate instance to another primary storage",
 "label.migrate.lb.vm": "Migrate LB VM",
+"label.migrate.lb.vm.to.ps": "Migrate LB VM to another primary storage",
 "label.migrate.router.to": "Migrate Router to",
 "label.migrate.systemvm.to": "Migrate System VM to",
 "label.migrate.to.host": "Migrate to host",
@@ -1592,6 +1595,10 @@
 "label.portable.ip.ranges": "Portable IP Ranges",
 "label.portableipaddress": "Portable IPs",
 "label.portforwarding": "Port Forwarding",
+"label.powerflex.gateway": "Gateway",
+"label.powerflex.gateway.username": "Gateway Username",
+"label.powerflex.gateway.password": "Gateway Password",
+"label.powerflex.storage.pool": "Storage Pool",
 "label.powerstate": "Power State",
 "label.preferred": "Prefered",
 "label.presetup": "PreSetup",
@@ -1812,6 +1819,8 @@
 "label.root.disk.size": "Root disk size (GB)",
 "label.rootdiskcontrollertype": "Root disk controller",
 "label.rootdiskcontrollertypekvm": "Root disk controller",
+"label.routerip": "IPv4 address for Router in Shared Network",
+"label.routeripv6": "IPv6 address for Router in Shared Network",
 "label.router.health.check.last.updated": "Last updated",
 "label.router.health.check.name": "Check name",
 "label.router.health.check.success": "Success",
@@ -2030,6 +2039,7 @@
 "label.storage.tags": "Storage Tags",
 "label.storage.traffic": "Storage Traffic",
 "label.storageid": "Primary Storage",
+"label.storage.migration.required": "Storage Migration Required",
 "label.storagemotionenabled": "Storage Motion Enabled",
 "label.storagepolicy": "Storage policy",
 "label.storagepool": "Storage Pool",
@@ -2931,12 +2941,16 @@
 "message.migrate.instance.to.ps": "Please confirm that you want to migrate instance to another primary storage.",
 "message.migrate.router.confirm": "Please confirm the host you wish to migrate the router to:",
 "message.migrate.systemvm.confirm": "Please confirm the host you wish to migrate the system VM to:",
+"message.migrate.lb.vm.to.ps": "Please confirm that you want to migrate LB VM to another primary storage.",
+"message.migrate.router.to.ps": "Please confirm that you want to migrate router to another primary storage.",
+"message.migrate.system.vm.to.ps": "Please confirm that you want to migrate system VM to another primary storage.",
 "message.migrate.volume": "Please confirm that you want to migrate volume to another primary storage.",
 "message.migrate.volume.failed": "Migrating volume failed",
 "message.migrate.volume.processing": "Migrating volume...",
 "message.migrating.failed": "Migration failed",
 "message.migrating.processing": "Migration in progress for",
 "message.migrating.vm.to.host.failed": "Failed to migrate VM to host",
+"message.migrating.vm.to.storage.failed": "Failed to migrate VM to storage",
 "message.move.acl.order": "Move ACL rule order",
 "message.move.acl.order.failed": "Failed to move ACL rule",
 "message.move.acl.order.processing": "Moving ACL rule...",
diff --git a/ui/src/config/section/account.js b/ui/src/config/section/account.js
index 1fce57a..86c88fc 100644
--- a/ui/src/config/section/account.js
+++ b/ui/src/config/section/account.js
@@ -22,7 +22,7 @@
   docHelp: 'adminguide/accounts.html',
   permission: ['listAccounts'],
   columns: ['name', 'state', 'rolename', 'roletype', 'domainpath'],
-  details: ['name', 'id', 'rolename', 'roletype', 'domainpath', 'networkdomain', 'iptotal', 'vmtotal', 'volumetotal', 'receivedbytes', 'sentbytes'],
+  details: ['name', 'id', 'rolename', 'roletype', 'domainpath', 'networkdomain', 'iptotal', 'vmtotal', 'volumetotal', 'receivedbytes', 'sentbytes', 'created'],
   related: [{
     name: 'accountuser',
     title: 'label.users',
diff --git a/ui/src/config/section/compute.js b/ui/src/config/section/compute.js
index 8950140..6acebf6 100644
--- a/ui/src/config/section/compute.js
+++ b/ui/src/config/section/compute.js
@@ -156,7 +156,8 @@
           args: ['virtualmachineid', 'name', 'description', 'snapshotmemory', 'quiescevm'],
           show: (record) => {
             return ((['Running'].includes(record.state) && record.hypervisor !== 'LXC') ||
-              (['Stopped'].includes(record.state) && record.hypervisor !== 'KVM' && record.hypervisor !== 'LXC'))
+              (['Stopped'].includes(record.state) && ((record.hypervisor !== 'KVM' && record.hypervisor !== 'LXC') ||
+              (record.hypervisor === 'KVM' && record.pooltype === 'PowerFlex'))))
           },
           mapping: {
             virtualmachineid: {
@@ -299,16 +300,8 @@
           docHelp: 'adminguide/virtual_machines.html#moving-vms-between-hosts-manual-live-migration',
           dataView: true,
           show: (record, store) => { return ['Stopped'].includes(record.state) && ['Admin'].includes(store.userInfo.roletype) },
-          args: ['storageid', 'virtualmachineid'],
-          mapping: {
-            storageid: {
-              api: 'listStoragePools',
-              params: (record) => { return { zoneid: record.zoneid } }
-            },
-            virtualmachineid: {
-              value: (record) => { return record.id }
-            }
-          }
+          component: () => import('@/views/compute/MigrateVMStorage'),
+          popup: true
         },
         {
           api: 'resetPasswordForVirtualMachine',
diff --git a/ui/src/config/section/domain.js b/ui/src/config/section/domain.js
index 7fbd263..92c038b 100644
--- a/ui/src/config/section/domain.js
+++ b/ui/src/config/section/domain.js
@@ -23,7 +23,7 @@
   permission: ['listDomains', 'listDomainChildren'],
   resourceType: 'Domain',
   columns: ['name', 'state', 'path', 'parentdomainname', 'level'],
-  details: ['name', 'id', 'path', 'parentdomainname', 'level', 'networkdomain'],
+  details: ['name', 'id', 'path', 'parentdomainname', 'level', 'networkdomain', 'created'],
   component: () => import('@/views/iam/DomainView.vue'),
   related: [{
     name: 'account',
diff --git a/ui/src/config/section/infra/ilbvms.js b/ui/src/config/section/infra/ilbvms.js
index 8b2434e..393a769 100644
--- a/ui/src/config/section/infra/ilbvms.js
+++ b/ui/src/config/section/infra/ilbvms.js
@@ -45,13 +45,18 @@
       icon: 'drag',
       label: 'label.action.migrate.router',
       dataView: true,
-      show: (record) => { return record.state === 'Running' },
-      args: ['virtualmachineid', 'hostid'],
-      mapping: {
-        virtualmachineid: {
-          value: (record) => { return record.id }
-        }
-      }
+      show: (record, store) => { return record.state === 'Running' && ['Admin'].includes(store.userInfo.roletype) },
+      component: () => import('@/views/compute/MigrateWizard'),
+      popup: true
+    },
+    {
+      api: 'migrateSystemVm',
+      icon: 'drag',
+      label: 'label.action.migrate.systemvm.to.ps',
+      dataView: true,
+      show: (record, store) => { return ['Stopped'].includes(record.state) && ['VMware'].includes(record.hypervisor) },
+      component: () => import('@/views/compute/MigrateVMStorage'),
+      popup: true
     }
   ]
 }
diff --git a/ui/src/config/section/infra/routers.js b/ui/src/config/section/infra/routers.js
index b109914..6ffa468 100644
--- a/ui/src/config/section/infra/routers.js
+++ b/ui/src/config/section/infra/routers.js
@@ -104,17 +104,18 @@
       icon: 'drag',
       label: 'label.action.migrate.router',
       dataView: true,
-      show: (record, store) => { return ['Running'].includes(record.state) && ['Admin'].includes(store.userInfo.roletype) },
-      args: ['virtualmachineid', 'hostid'],
-      mapping: {
-        virtualmachineid: {
-          value: (record) => { return record.id }
-        },
-        hostid: {
-          api: 'findHostsForMigration',
-          params: (record) => { return { virtualmachineid: record.id } }
-        }
-      }
+      show: (record, store) => { return record.state === 'Running' && ['Admin'].includes(store.userInfo.roletype) },
+      component: () => import('@/views/compute/MigrateWizard'),
+      popup: true
+    },
+    {
+      api: 'migrateSystemVm',
+      icon: 'drag',
+      label: 'label.action.migrate.systemvm.to.ps',
+      dataView: true,
+      show: (record, store) => { return ['Stopped'].includes(record.state) && ['VMware'].includes(record.hypervisor) },
+      component: () => import('@/views/compute/MigrateVMStorage'),
+      popup: true
     },
     {
       api: 'runDiagnostics',
diff --git a/ui/src/config/section/infra/systemVms.js b/ui/src/config/section/infra/systemVms.js
index 8b3c66a..bc20b90 100644
--- a/ui/src/config/section/infra/systemVms.js
+++ b/ui/src/config/section/infra/systemVms.js
@@ -69,17 +69,18 @@
       icon: 'drag',
       label: 'label.action.migrate.systemvm',
       dataView: true,
-      show: (record) => { return record.state === 'Running' },
-      args: ['virtualmachineid', 'hostid'],
-      mapping: {
-        virtualmachineid: {
-          value: (record) => { return record.id }
-        },
-        hostid: {
-          api: 'findHostsForMigration',
-          params: (record) => { return { virtualmachineid: record.id } }
-        }
-      }
+      show: (record, store) => { return record.state === 'Running' && ['Admin'].includes(store.userInfo.roletype) },
+      component: () => import('@/views/compute/MigrateWizard'),
+      popup: true
+    },
+    {
+      api: 'migrateSystemVm',
+      icon: 'drag',
+      label: 'label.action.migrate.systemvm.to.ps',
+      dataView: true,
+      show: (record, store) => { return ['Stopped'].includes(record.state) && ['VMware'].includes(record.hypervisor) },
+      component: () => import('@/views/compute/MigrateVMStorage'),
+      popup: true
     },
     {
       api: 'runDiagnostics',
diff --git a/ui/src/views/compute/CreateSnapshotWizard.vue b/ui/src/views/compute/CreateSnapshotWizard.vue
index bf9d9dd..eb58cee 100644
--- a/ui/src/views/compute/CreateSnapshotWizard.vue
+++ b/ui/src/views/compute/CreateSnapshotWizard.vue
@@ -64,7 +64,7 @@
           </span>
           <a-switch v-decorator="['quiescevm', { initialValue: false }]"/>
         </a-form-item>
-        <a-form-item>
+        <a-form-item v-if="!supportsStorageSnapshot">
           <span slot="label" :title="apiParams.asyncbackup.description">
             {{ $t('label.asyncbackup') }}
             <a-tooltip>
@@ -97,6 +97,7 @@
     return {
       loading: false,
       isQuiesceVm: false,
+      supportsStorageSnapshot: false,
       listVolumes: []
     }
   },
@@ -131,7 +132,10 @@
         const params = {}
         params.volumeid = values.volumeid
         params.name = values.name
-        params.asyncbackup = values.asyncbackup
+        params.asyncbackup = false
+        if (values.asyncbackup) {
+          params.asyncbackup = values.asyncbackup
+        }
         params.quiescevm = values.quiescevm
 
         const title = this.$t('label.action.vmstoragesnapshot.create')
@@ -176,6 +180,7 @@
       const volumeFilter = this.listVolumes.filter(volume => volume.id === volumeId)
       if (volumeFilter && volumeFilter.length > 0) {
         this.isQuiesceVm = volumeFilter[0].quiescevm
+        this.supportsStorageSnapshot = volumeFilter[0].supportsstoragesnapshot
       }
     },
     closeAction () {
diff --git a/ui/src/views/compute/MigrateVMStorage.vue b/ui/src/views/compute/MigrateVMStorage.vue
new file mode 100644
index 0000000..7744c57
--- /dev/null
+++ b/ui/src/views/compute/MigrateVMStorage.vue
@@ -0,0 +1,228 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+<template>
+  <div class="form-layout">
+    <a-spin :spinning="loading">
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.storageid') }}
+            <a-tooltip :title="apiParams.storageid.description" v-if="!(apiParams.hostid && apiParams.hostid.required === false)">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            :loading="loading"
+            v-decorator="['storageid', {
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+            }]">
+            <a-select-option v-for="storagePool in storagePools" :key="storagePool.id">
+              {{ storagePool.name || storagePool.id }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <div :span="24" class="action-button">
+          <a-button @click="closeAction">{{ this.$t('label.cancel') }}</a-button>
+          <a-button :loading="loading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
+        </div>
+      </a-form>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'MigrateVMStorage',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      storagePools: []
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    if (this.$route.meta.name === 'vm') {
+      this.apiConfig = this.$store.getters.apis.migrateVirtualMachineWithVolume || {}
+      this.apiConfig.params.forEach(param => {
+        this.apiParams[param.name] = param
+      })
+      this.apiConfig = this.$store.getters.apis.migrateVirtualMachine || {}
+      this.apiConfig.params.forEach(param => {
+        if (!(param.name in this.apiParams)) {
+          this.apiParams[param.name] = param
+        }
+      })
+    } else {
+      this.apiConfig = this.$store.getters.apis.migrateSystemVm || {}
+      this.apiConfig.params.forEach(param => {
+        if (!(param.name in this.apiParams)) {
+          this.apiParams[param.name] = param
+        }
+      })
+    }
+  },
+  created () {
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listStoragePools', {
+        zoneid: this.resource.zoneid
+      }).then(response => {
+        if (this.arrayHasItems(response.liststoragepoolsresponse.storagepool)) {
+          this.storagePools = response.liststoragepoolsresponse.storagepool
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    isObjectEmpty (obj) {
+      return !(obj !== null && obj !== undefined && Object.keys(obj).length > 0 && obj.constructor === Object)
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        var isUserVm = true
+        if (this.$route.meta.name !== 'vm') {
+          isUserVm = false
+        }
+        var migrateApi = isUserVm ? 'migrateVirtualMachine' : 'migrateSystemVm'
+        if (isUserVm && this.apiParams.hostid && this.apiParams.hostid.required === false) {
+          migrateApi = 'migrateVirtualMachineWithVolume'
+          var rootVolume = null
+          api('listVolumes', {
+            listAll: true,
+            virtualmachineid: this.resource.id
+          }).then(response => {
+            var volumes = response.listvolumesresponse.volume
+            if (volumes && volumes.length > 0) {
+              volumes = volumes.filter(item => item.type === 'ROOT')
+              if (volumes && volumes.length > 0) {
+                rootVolume = volumes[0]
+              }
+              if (rootVolume == null) {
+                this.$message.error('Failed to find ROOT volume for the VM ' + this.resource.id)
+                this.closeAction()
+              }
+              this.migrateVm(migrateApi, values.storageid, rootVolume.id)
+            }
+          })
+          return
+        }
+        this.migrateVm(migrateApi, values.storageid, null)
+      })
+    },
+    migrateVm (migrateApi, storageId, rootVolumeId) {
+      var params = {
+        virtualmachineid: this.resource.id,
+        storageid: storageId
+      }
+      if (rootVolumeId !== null) {
+        params = {
+          virtualmachineid: this.resource.id,
+          'migrateto[0].volume': rootVolumeId,
+          'migrateto[0].pool': storageId
+        }
+      }
+      api(migrateApi, params).then(response => {
+        var jobId = ''
+        if (migrateApi === 'migrateVirtualMachineWithVolume') {
+          jobId = response.migratevirtualmachinewithvolumeresponse.jobid
+        } else if (migrateApi === 'migrateSystemVm') {
+          jobId = response.migratesystemvmresponse.jobid
+        } else {
+          jobId = response.migratevirtualmachine.jobid
+        }
+        this.$store.dispatch('AddAsyncJob', {
+          title: `${this.$t('label.migrating')} ${this.resource.name}`,
+          jobid: jobId,
+          description: this.resource.name,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: jobId,
+          successMessage: `${this.$t('message.success.migrating')} ${this.resource.name}`,
+          successMethod: () => {
+            this.$parent.$parent.close()
+          },
+          errorMessage: this.$t('message.migrating.failed'),
+          errorMethod: () => {
+            this.$parent.$parent.close()
+          },
+          loadingMessage: `${this.$t('message.migrating.processing')} ${this.resource.name}`,
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.$parent.$parent.close()
+          }
+        })
+        this.$parent.$parent.close()
+      }).catch(error => {
+        console.error(error)
+        this.$message.error(`${this.$t('message.migrating.vm.to.storage.failed')} ${storageId}`)
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 60vw;
+
+    @media (min-width: 500px) {
+      width: 450px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/compute/MigrateWizard.vue b/ui/src/views/compute/MigrateWizard.vue
index 46346e9..f5082e9 100644
--- a/ui/src/views/compute/MigrateWizard.vue
+++ b/ui/src/views/compute/MigrateWizard.vue
@@ -47,6 +47,15 @@
       <div slot="memused" slot-scope="record">
         {{ record.memoryused | byteToGigabyte }} GB
       </div>
+      <div slot="cluster" slot-scope="record">
+        {{ record.clustername }}
+      </div>
+      <div slot="pod" slot-scope="record">
+        {{ record.podname }}
+      </div>
+      <div slot="requiresstoragemigration" slot-scope="record">
+        {{ record.requiresStorageMotion ? $t('label.yes') : $t('label.no') }}
+      </div>
       <template slot="select" slot-scope="record">
         <a-radio
           class="host-item__radio"
@@ -118,6 +127,18 @@
           scopedSlots: { customRender: 'memused' }
         },
         {
+          title: this.$t('label.cluster'),
+          scopedSlots: { customRender: 'cluster' }
+        },
+        {
+          title: this.$t('label.pod'),
+          scopedSlots: { customRender: 'pod' }
+        },
+        {
+          title: this.$t('label.storage.migration.required'),
+          scopedSlots: { customRender: 'requiresstoragemigration' }
+        },
+        {
           title: this.$t('label.select'),
           scopedSlots: { customRender: 'select' }
         }
@@ -149,19 +170,28 @@
     },
     submitForm () {
       this.loading = true
-      api(this.selectedHost.requiresStorageMotion ? 'migrateVirtualMachineWithVolume' : 'migrateVirtualMachine', {
+      var isUserVm = true
+      if (this.$route.meta.name !== 'vm') {
+        isUserVm = false
+      }
+      var migrateApi = isUserVm
+        ? this.selectedHost.requiresStorageMotion ? 'migrateVirtualMachineWithVolume' : 'migrateVirtualMachine'
+        : 'migrateSystemVm'
+      api(migrateApi, {
         hostid: this.selectedHost.id,
         virtualmachineid: this.resource.id
       }).then(response => {
-        const jobid = this.selectedHost.requiresStorageMotion ? response.migratevirtualmachinewithvolumeresponse.jobid : response.migratevirtualmachineresponse.jobid
+        var migrateResponse = isUserVm
+          ? this.selectedHost.requiresStorageMotion ? response.migratevirtualmachinewithvolumeresponse : response.migratevirtualmachineresponse
+          : response.migratesystemvmresponse
         this.$store.dispatch('AddAsyncJob', {
           title: `${this.$t('label.migrating')} ${this.resource.name}`,
-          jobid: jobid,
+          jobid: migrateResponse.jobid,
           description: this.resource.name,
           status: 'progress'
         })
         this.$pollJob({
-          jobId: jobid,
+          jobId: migrateResponse.jobid,
           successMessage: `${this.$t('message.success.migrating')} ${this.resource.name}`,
           successMethod: () => {
             this.$emit('close-action')
@@ -209,9 +239,9 @@
 <style scoped lang="scss">
 
   .form {
-    width: 85vw;
-    @media (min-width: 800px) {
-      width: 750px;
+    width: 95vw;
+    @media (min-width: 900px) {
+      width: 850px;
     }
   }
 
diff --git a/ui/src/views/infra/AddPrimaryStorage.vue b/ui/src/views/infra/AddPrimaryStorage.vue
index 8229abe..c5ee839 100644
--- a/ui/src/views/infra/AddPrimaryStorage.vue
+++ b/ui/src/views/infra/AddPrimaryStorage.vue
@@ -202,13 +202,13 @@
           </span>
           <a-select
             v-decorator="['provider', { initialValue: providerSelected, rules: [{ required: true, message: `${$t('label.required')}`}] }]"
-            @change="val => this.providerSelected = val">
+            @change="updateProviderAndProtocol">
             <a-select-option :value="provider" v-for="(provider,idx) in providers" :key="idx">
               {{ provider }}
             </a-select-option>
           </a-select>
         </a-form-item>
-        <div v-if="this.providerSelected !== 'DefaultPrimary'">
+        <div v-if="this.providerSelected !== 'DefaultPrimary' && this.providerSelected !== 'PowerFlex'">
           <a-form-item>
             <span slot="label">
               {{ $t('label.ismanaged') }}
@@ -248,6 +248,44 @@
             <a-input v-decorator="['url']" />
           </a-form-item>
         </div>
+        <div v-if="this.providerSelected === 'PowerFlex'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.powerflex.gateway') }}
+              <a-tooltip :title="$t('label.powerflex.gateway')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['powerflexGateway', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.powerflex.gateway.username') }}
+              <a-tooltip :title="$t('label.powerflex.gateway.username')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['powerflexGatewayUsername', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.powerflex.gateway.password') }}
+              <a-tooltip :title="$t('label.powerflex.gateway.password')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input-password v-decorator="['powerflexGatewayPassword', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.powerflex.storage.pool') }}
+              <a-tooltip :title="$t('label.powerflex.storage.pool')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['powerflexStoragePool', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+        </div>
         <div v-if="this.protocolSelected === 'RBD'">
           <a-form-item :label="$t('label.rados.monitor')">
             <a-input v-decorator="['radosmonitor']" />
@@ -557,6 +595,23 @@
       }
       return url
     },
+    powerflexURL (gateway, username, password, pool) {
+      var url = 'powerflex://' + encodeURIComponent(username) + ':' + encodeURIComponent(password) + '@' +
+       gateway + '/' + encodeURIComponent(pool)
+      return url
+    },
+    updateProviderAndProtocol (value) {
+      if (value === 'PowerFlex') {
+        this.protocols = ['custom']
+        this.protocolSelected = 'custom'
+        this.form.setFieldsValue({
+          protocol: 'custom'
+        })
+      } else {
+        this.fetchHypervisor(null)
+      }
+      this.providerSelected = value
+    },
     closeModal () {
       this.$parent.$parent.close()
     },
@@ -649,7 +704,7 @@
           url = this.iscsiURL(server, iqn, lun)
         }
         params.url = url
-        if (values.provider !== 'DefaultPrimary') {
+        if (values.provider !== 'DefaultPrimary' && values.provider !== 'PowerFlex') {
           if (values.managed) {
             params.managed = true
           } else {
@@ -665,6 +720,12 @@
             params.url = values.url
           }
         }
+
+        if (values.provider === 'PowerFlex') {
+          params.url = this.powerflexURL(values.powerflexGateway, values.powerflexGatewayUsername,
+            values.powerflexGatewayPassword, values.powerflexStoragePool)
+        }
+
         if (this.selectedTags.length > 0) {
           params.tags = this.selectedTags.join()
         }
diff --git a/ui/src/views/network/CreateSharedNetworkForm.vue b/ui/src/views/network/CreateSharedNetworkForm.vue
index e91a563..7e9ddd8 100644
--- a/ui/src/views/network/CreateSharedNetworkForm.vue
+++ b/ui/src/views/network/CreateSharedNetworkForm.vue
@@ -332,6 +332,17 @@
               v-decorator="['endipv4', {}]"
               :placeholder="this.$t('label.endipv4')"/>
           </a-form-item>
+          <a-form-item v-if="isVirtualRouterForAtLeastOneService">
+            <span slot="label">
+              {{ $t('label.routerip') }}
+              <a-tooltip :title="apiParams.routerip.description" v-if="'routerip' in apiParams">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['routerip', {}]"
+              :placeholder="this.$t('label.routerip')"/>
+          </a-form-item>
           <a-form-item>
             <span slot="label">
               {{ $t('label.ip6gateway') }}
@@ -376,6 +387,17 @@
               v-decorator="['endipv6', {}]"
               :placeholder="this.$t('label.endipv6')"/>
           </a-form-item>
+          <a-form-item v-if="isVirtualRouterForAtLeastOneService">
+            <span slot="label">
+              {{ $t('label.routeripv6') }}
+              <a-tooltip :title="apiParams.routeripv6.description" v-if="'routeripv6' in apiParams">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['routeripv6', {}]"
+              :placeholder="this.$t('label.routeripv6')"/>
+          </a-form-item>
           <a-form-item>
             <span slot="label">
               {{ $t('label.networkdomain') }}
@@ -457,7 +479,9 @@
       selectedNetworkOffering: {},
       projects: [],
       projectLoading: false,
-      selectedProject: {}
+      selectedProject: {},
+      isVirtualRouterForAtLeastOneService: false,
+      selectedServiceProviderMap: {}
     }
   },
   watch: {
@@ -654,6 +678,7 @@
       this.networkOfferings = []
       api('listNetworkOfferings', params).then(json => {
         this.networkOfferings = json.listnetworkofferingsresponse.networkoffering
+        this.handleNetworkOfferingChange(this.networkOfferings[0])
       }).catch(error => {
         this.$notifyError(error)
       }).finally(() => {
@@ -662,7 +687,6 @@
           this.form.setFieldsValue({
             networkofferingid: 0
           })
-          this.handleNetworkOfferingChange(this.networkOfferings[0])
         } else {
           this.form.setFieldsValue({
             networkofferingid: null
@@ -672,6 +696,27 @@
     },
     handleNetworkOfferingChange (networkOffering) {
       this.selectedNetworkOffering = networkOffering
+      if (networkOffering) {
+        this.networkServiceProviderMap(this.selectedNetworkOffering.id)
+      }
+    },
+    networkServiceProviderMap (id) {
+      api('listNetworkOfferings', { id: id }).then(json => {
+        var networkOffering = json.listnetworkofferingsresponse.networkoffering[0]
+        const services = networkOffering.service
+        this.selectedServiceProviderMap = {}
+        for (const svc of services) {
+          this.selectedServiceProviderMap[svc.name] = svc.provider[0].name
+        }
+        var providers = Object.values(this.selectedServiceProviderMap)
+        this.isVirtualRouterForAtLeastOneService = false
+        var self = this
+        providers.forEach(function (prvdr, idx) {
+          if (prvdr === 'VirtualRouter') {
+            self.isVirtualRouterForAtLeastOneService = true
+          }
+        })
+      })
     },
     fetchDomainData () {
       const params = {}
@@ -791,6 +836,9 @@
         if (this.isValidTextValueForKey(values, 'ip4gateway')) {
           params.ip6gateway = values.ip6gateway
         }
+        if (this.isValidTextValueForKey(values, 'routerip')) {
+          params.routerip = values.routerip
+        }
         if (this.isValidTextValueForKey(values, 'ip6cidr')) {
           params.ip6cidr = values.ip6cidr
         }
@@ -800,6 +848,9 @@
         if (this.isValidTextValueForKey(values, 'endipv6')) {
           params.endipv6 = values.endipv6
         }
+        if (this.isValidTextValueForKey(values, 'routeripv6')) {
+          params.routeripv6 = values.routeripv6
+        }
         // IPv6 (end)
 
         if (this.isValidTextValueForKey(values, 'networkdomain')) {
diff --git a/ui/src/views/storage/TakeSnapshot.vue b/ui/src/views/storage/TakeSnapshot.vue
index 8aec236..782df43 100644
--- a/ui/src/views/storage/TakeSnapshot.vue
+++ b/ui/src/views/storage/TakeSnapshot.vue
@@ -34,7 +34,7 @@
                 :placeholder="apiParams.name.description" />
             </a-form-item>
           </a-col>
-          <a-col :md="24" :lg="24">
+          <a-col :md="24" :lg="24" v-if="!supportsStorageSnapshot">
             <a-form-item :label="$t('label.asyncbackup')">
               <a-switch v-decorator="['asyncbackup']" />
             </a-form-item>
@@ -113,6 +113,7 @@
     return {
       actionLoading: false,
       quiescevm: false,
+      supportsStorageSnapshot: false,
       inputValue: '',
       inputKey: '',
       inputVisible: '',
@@ -130,6 +131,7 @@
   },
   mounted () {
     this.quiescevm = this.resource.quiescevm
+    this.supportsStorageSnapshot = this.resource.supportsstoragesnapshot
   },
   methods: {
     handleSubmit (e) {
diff --git a/ui/tests/unit/views/compute/MigrateWizard.spec.js b/ui/tests/unit/views/compute/MigrateWizard.spec.js
index 14c8a89..eef8722 100644
--- a/ui/tests/unit/views/compute/MigrateWizard.spec.js
+++ b/ui/tests/unit/views/compute/MigrateWizard.spec.js
@@ -22,7 +22,7 @@
 
 jest.mock('axios', () => mockAxios)
 
-let wrapper, i18n, store, mocks
+let wrapper, i18n, store, mocks, router
 
 const state = {}
 const actions = {
@@ -62,8 +62,10 @@
   i18n = opts.i18n || i18n
   store = opts.store || store
   mocks = opts.mocks || mocks
+  router = opts.router || router
 
   return common.createFactory(MigrateWizard, {
+    router,
     i18n,
     store,
     mocks,
@@ -81,6 +83,9 @@
     if (wrapper) {
       wrapper.destroy()
     }
+    if (router && router.currentRoute.name !== 'home') {
+      router.replace({ name: 'home' })
+    }
 
     if (i18n.locale !== 'en') {
       i18n.locale = 'en'
@@ -331,7 +336,7 @@
     })
 
     describe('submitForm()', () => {
-      it('check api is called when selectedHost.requiresStorageMotion is true', async (done) => {
+      it('check api is called when selectedHost.requiresStorageMotion is true and isUserVm=true', async (done) => {
         const mockData = {
           migratevirtualmachineresponse: {
             jobid: 'test-job-id'
@@ -344,7 +349,15 @@
           }
         }
 
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/test-router-1',
+          meta: {
+            name: 'vm'
+          }
+        }])
         wrapper = factory({
+          router: router,
           props: {
             resource: {
               id: 'test-resource-id',
@@ -359,6 +372,8 @@
             }
           }
         })
+        router.push({ name: 'testRouter1' })
+
         jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
         mockAxios.mockResolvedValue(mockData)
         await wrapper.vm.$nextTick()
@@ -382,7 +397,7 @@
         })
       })
 
-      it('check api is called when selectedHost.requiresStorageMotion is false', async (done) => {
+      it('check api is called when selectedHost.requiresStorageMotion is false and isUserVm=true', async (done) => {
         const mockData = {
           migratevirtualmachineresponse: {
             jobid: 'test-job-id'
@@ -394,6 +409,14 @@
             }
           }
         }
+
+        router = common.createMockRouter([{
+          name: 'testRouter2',
+          path: '/test-router-2',
+          meta: {
+            name: 'vm'
+          }
+        }])
         wrapper = factory({
           props: {
             resource: {
@@ -409,6 +432,7 @@
             }
           }
         })
+        router.push({ name: 'testRouter2' })
         jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
 
         mockAxios.mockResolvedValue(mockData)
@@ -434,10 +458,10 @@
         })
       })
 
-      it('check store dispatch `AddAsyncJob` and $pollJob have successMethod() is called with requiresStorageMotion is true', async (done) => {
+      it('check api is called when isUserVm=false', async (done) => {
         const mockData = {
-          migratevirtualmachinewithvolumeresponse: {
-            jobid: 'test-job-id-case-1'
+          migratesystemvmresponse: {
+            jobid: 'test-job-id'
           },
           queryasyncjobresultresponse: {
             jobstatus: 1,
@@ -446,7 +470,16 @@
             }
           }
         }
+
+        router = common.createMockRouter([{
+          name: 'testRouter3',
+          path: '/test-router-3',
+          meta: {
+            name: 'test'
+          }
+        }])
         wrapper = factory({
+          router: router,
           props: {
             resource: {
               id: 'test-resource-id',
@@ -461,8 +494,70 @@
             }
           }
         })
-        jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
+        router.push({ name: 'testRouter3' })
 
+        jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
+        mockAxios.mockResolvedValue(mockData)
+        await wrapper.vm.$nextTick()
+        await wrapper.vm.submitForm()
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'migrateSystemVm',
+              hostid: 'test-host-id',
+              virtualmachineid: 'test-resource-id',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check store dispatch `AddAsyncJob` and $pollJob have successMethod() is called with requiresStorageMotion is true', async (done) => {
+        const mockData = {
+          migratevirtualmachinewithvolumeresponse: {
+            jobid: 'test-job-id-case-1'
+          },
+          queryasyncjobresultresponse: {
+            jobstatus: 1,
+            jobresult: {
+              name: 'test-name-value'
+            }
+          }
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter4',
+          path: '/test-router-4',
+          meta: {
+            name: 'vm'
+          }
+        }])
+        wrapper = factory({
+          router: router,
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: true,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        router.push({ name: 'testRouter4' })
+
+        jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
         mockAxios.mockResolvedValue(mockData)
 
         await wrapper.vm.$nextTick()
@@ -489,7 +584,16 @@
             }
           }
         }
+
+        router = common.createMockRouter([{
+          name: 'testRouter5',
+          path: '/test-router-5',
+          meta: {
+            name: 'vm'
+          }
+        }])
         wrapper = factory({
+          router: router,
           props: {
             resource: {
               id: 'test-resource-id',
@@ -504,8 +608,62 @@
             }
           }
         })
-        jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
+        router.push({ name: 'testRouter5' })
 
+        jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
+        mockAxios.mockResolvedValue(mockData)
+
+        await wrapper.vm.$nextTick()
+        await wrapper.vm.submitForm()
+
+        setTimeout(() => {
+          expect(actions.AddAsyncJob).toHaveBeenCalled()
+          expect(mocks.$pollJob).toHaveBeenCalled()
+          expect(wrapper.emitted()['close-action'][0]).toEqual([])
+
+          done()
+        })
+      })
+
+      it('check store dispatch `AddAsyncJob` and $pollJob have successMethod() is called with isUserVm is false', async (done) => {
+        const mockData = {
+          migratesystemvmresponse: {
+            jobid: 'test-job-id-case-2'
+          },
+          queryasyncjobresultresponse: {
+            jobstatus: 1,
+            jobresult: {
+              name: 'test-name-value'
+            }
+          }
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter6',
+          path: '/test-router-6',
+          meta: {
+            name: 'test'
+          }
+        }])
+        wrapper = factory({
+          router: router,
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: false,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        router.push({ name: 'testRouter6' })
+
+        jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
         mockAxios.mockResolvedValue(mockData)
 
         await wrapper.vm.$nextTick()
@@ -522,7 +680,7 @@
 
       it('check store dispatch `AddAsyncJob` and $pollJob have errorMethod() is called', async (done) => {
         const mockData = {
-          migratevirtualmachinewithvolumeresponse: {
+          migratesystemvmresponse: {
             jobid: 'test-job-id-case-3'
           },
           queryasyncjobresultresponse: {
@@ -565,7 +723,7 @@
 
       it('check store dispatch `AddAsyncJob` and $pollJob have catchMethod() is called', async (done) => {
         const mockData = {
-          migratevirtualmachinewithvolumeresponse: {
+          migratesystemvmresponse: {
             jobid: 'test-job-id-case-4'
           }
         }
diff --git a/usage/pom.xml b/usage/pom.xml
index 853828c..9c303da 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/utils/pom.xml b/utils/pom.xml
index 8612e8a..4eee66d 100755
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -181,6 +181,7 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-compress</artifactId>
+            <version>${cs.commons-compress.version}</version>
         </dependency>
     </dependencies>
     <build>
diff --git a/utils/src/main/java/com/cloud/utils/SerialVersionUID.java b/utils/src/main/java/com/cloud/utils/SerialVersionUID.java
index 21fdbb4..363248c 100644
--- a/utils/src/main/java/com/cloud/utils/SerialVersionUID.java
+++ b/utils/src/main/java/com/cloud/utils/SerialVersionUID.java
@@ -70,4 +70,5 @@
     public static final long SnapshotBackupException = Base | 0x2e;
     public static final long UnavailableCommandException = Base | 0x2f;
     public static final long OriginDeniedException = Base | 0x30;
+    public static final long StorageAccessException = Base | 0x31;
 }
diff --git a/utils/src/main/java/com/cloud/utils/storage/QCOW2Utils.java b/utils/src/main/java/com/cloud/utils/storage/QCOW2Utils.java
index 3e08bd6..b45d5b4 100644
--- a/utils/src/main/java/com/cloud/utils/storage/QCOW2Utils.java
+++ b/utils/src/main/java/com/cloud/utils/storage/QCOW2Utils.java
@@ -19,14 +19,27 @@
 
 package com.cloud.utils.storage;
 
+import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+import org.apache.commons.compress.compressors.CompressorException;
+import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.compressors.CompressorStreamFactory;
+import org.apache.log4j.Logger;
 
 import com.cloud.utils.NumbersUtil;
 
 public final class QCOW2Utils {
+    public static final Logger LOGGER = Logger.getLogger(QCOW2Utils.class.getName());
+
     private static final int VIRTUALSIZE_HEADER_LOCATION = 24;
     private static final int VIRTUALSIZE_HEADER_LENGTH = 8;
+    private static final int MAGIC_HEADER_LENGTH = 4;
 
     /**
      * Private constructor ->  This utility class cannot be instantiated.
@@ -57,4 +70,55 @@
 
         return NumbersUtil.bytesToLong(bytes);
     }
+
+    public static long getVirtualSize(String urlStr) {
+        InputStream inputStream = null;
+
+        try {
+            URL url = new URL(urlStr);
+            BufferedInputStream bufferedInputStream = new BufferedInputStream(url.openStream());
+            inputStream = bufferedInputStream;
+
+            try {
+                CompressorInputStream compressorInputStream = new CompressorStreamFactory().createCompressorInputStream(bufferedInputStream);
+                inputStream = compressorInputStream;
+            } catch (CompressorException e) {
+                LOGGER.warn(e.getMessage());
+                inputStream = bufferedInputStream;
+            }
+
+            byte[] inputBytes = inputStream.readNBytes(VIRTUALSIZE_HEADER_LOCATION + VIRTUALSIZE_HEADER_LENGTH);
+
+            ByteBuffer inputMagicBytes = ByteBuffer.allocate(MAGIC_HEADER_LENGTH);
+            inputMagicBytes.put(inputBytes, 0, MAGIC_HEADER_LENGTH);
+
+            ByteBuffer qcow2MagicBytes = ByteBuffer.allocate(MAGIC_HEADER_LENGTH);
+            qcow2MagicBytes.put("QFI".getBytes(Charset.forName("UTF-8")));
+            qcow2MagicBytes.put((byte)0xfb);
+
+            long virtualSize = 0L;
+            // Validate the header magic bytes
+            if (qcow2MagicBytes.compareTo(inputMagicBytes) == 0) {
+                ByteBuffer virtualSizeBytes = ByteBuffer.allocate(VIRTUALSIZE_HEADER_LENGTH);
+                virtualSizeBytes.put(inputBytes, VIRTUALSIZE_HEADER_LOCATION, VIRTUALSIZE_HEADER_LENGTH);
+                virtualSize = virtualSizeBytes.getLong(0);
+            }
+
+            return virtualSize;
+        } catch (MalformedURLException e) {
+            LOGGER.warn("Failed to validate for qcow2, malformed URL: " + urlStr + ", error: " + e.getMessage());
+            throw new IllegalArgumentException("Invalid URL: " + urlStr);
+        }  catch (IOException e) {
+            LOGGER.warn("Failed to validate for qcow2, error: " + e.getMessage());
+            throw new IllegalArgumentException("Failed to connect URL: " + urlStr);
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (final IOException e) {
+                    LOGGER.warn("Failed to close input stream due to: " + e.getMessage());
+                }
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/vmware-base/pom.xml b/vmware-base/pom.xml
index 8cc7272..38bb62b 100644
--- a/vmware-base/pom.xml
+++ b/vmware-base/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.15.1.0-SNAPSHOT</version>
+        <version>4.16.0.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java
index 804af62..432a1de 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java
@@ -16,6 +16,13 @@
 // under the License.
 package com.cloud.hypervisor.vmware.mo;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
 import com.cloud.exception.CloudException;
 import com.cloud.hypervisor.vmware.util.VmwareContext;
 import com.cloud.utils.Pair;
@@ -34,12 +41,6 @@
 import com.vmware.vim25.PropertySpec;
 import com.vmware.vim25.SelectionSpec;
 import com.vmware.vim25.TraversalSpec;
-import org.apache.log4j.Logger;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
 
 public class DatastoreMO extends BaseMO {
     private static final Logger s_logger = Logger.getLogger(DatastoreMO.class);
@@ -459,6 +460,6 @@
 
     public String getDatastoreType() throws Exception {
         DatastoreSummary summary = _context.getVimClient().getDynamicProperty(getMor(), "summary");
-        return summary.getType();
+        return summary.getType() == null ? "" : summary.getType();
     }
 }
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
index 1b94ca8..7774645 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -18,6 +18,7 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.net.URI;
@@ -28,6 +29,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
@@ -37,17 +39,6 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import com.vmware.vim25.ConcurrentAccessFaultMsg;
-import com.vmware.vim25.DuplicateNameFaultMsg;
-import com.vmware.vim25.FileFaultFaultMsg;
-import com.vmware.vim25.InsufficientResourcesFaultFaultMsg;
-import com.vmware.vim25.InvalidDatastoreFaultMsg;
-import com.vmware.vim25.InvalidNameFaultMsg;
-import com.vmware.vim25.InvalidStateFaultMsg;
-import com.vmware.vim25.OutOfBoundsFaultMsg;
-import com.vmware.vim25.RuntimeFaultFaultMsg;
-import com.vmware.vim25.TaskInProgressFaultMsg;
-import com.vmware.vim25.VmConfigFaultFaultMsg;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
@@ -80,19 +71,20 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.utils.nicira.nvp.plugin.NiciraNvpApiVersion;
-import com.vmware.vim25.OvfCreateDescriptorParams;
-import com.vmware.vim25.OvfCreateDescriptorResult;
 import com.vmware.vim25.AlreadyExistsFaultMsg;
 import com.vmware.vim25.BoolPolicy;
-import com.vmware.vim25.CustomFieldStringValue;
 import com.vmware.vim25.ClusterConfigInfoEx;
-import com.vmware.vim25.DatacenterConfigInfo;
+import com.vmware.vim25.ConcurrentAccessFaultMsg;
+import com.vmware.vim25.CustomFieldStringValue;
 import com.vmware.vim25.DVPortSetting;
 import com.vmware.vim25.DVPortgroupConfigInfo;
 import com.vmware.vim25.DVPortgroupConfigSpec;
 import com.vmware.vim25.DVSSecurityPolicy;
 import com.vmware.vim25.DVSTrafficShapingPolicy;
+import com.vmware.vim25.DatacenterConfigInfo;
+import com.vmware.vim25.DuplicateNameFaultMsg;
 import com.vmware.vim25.DynamicProperty;
+import com.vmware.vim25.FileFaultFaultMsg;
 import com.vmware.vim25.HostNetworkSecurityPolicy;
 import com.vmware.vim25.HostNetworkTrafficShapingPolicy;
 import com.vmware.vim25.HostPortGroup;
@@ -101,6 +93,10 @@
 import com.vmware.vim25.HttpNfcLeaseDeviceUrl;
 import com.vmware.vim25.HttpNfcLeaseInfo;
 import com.vmware.vim25.HttpNfcLeaseState;
+import com.vmware.vim25.InsufficientResourcesFaultFaultMsg;
+import com.vmware.vim25.InvalidDatastoreFaultMsg;
+import com.vmware.vim25.InvalidNameFaultMsg;
+import com.vmware.vim25.InvalidStateFaultMsg;
 import com.vmware.vim25.LocalizedMethodFault;
 import com.vmware.vim25.LongPolicy;
 import com.vmware.vim25.ManagedObjectReference;
@@ -108,11 +104,16 @@
 import com.vmware.vim25.NumericRange;
 import com.vmware.vim25.ObjectContent;
 import com.vmware.vim25.OptionValue;
+import com.vmware.vim25.OutOfBoundsFaultMsg;
+import com.vmware.vim25.OvfCreateDescriptorParams;
+import com.vmware.vim25.OvfCreateDescriptorResult;
 import com.vmware.vim25.OvfCreateImportSpecParams;
 import com.vmware.vim25.OvfCreateImportSpecResult;
-import com.vmware.vim25.OvfFileItem;
 import com.vmware.vim25.OvfFile;
+import com.vmware.vim25.OvfFileItem;
 import com.vmware.vim25.ParaVirtualSCSIController;
+import com.vmware.vim25.RuntimeFaultFaultMsg;
+import com.vmware.vim25.TaskInProgressFaultMsg;
 import com.vmware.vim25.VMwareDVSConfigSpec;
 import com.vmware.vim25.VMwareDVSPortSetting;
 import com.vmware.vim25.VMwareDVSPortgroupPolicy;
@@ -121,25 +122,24 @@
 import com.vmware.vim25.VirtualBusLogicController;
 import com.vmware.vim25.VirtualController;
 import com.vmware.vim25.VirtualDevice;
-import com.vmware.vim25.VirtualDisk;
 import com.vmware.vim25.VirtualDeviceConfigSpec;
 import com.vmware.vim25.VirtualDeviceConfigSpecOperation;
+import com.vmware.vim25.VirtualDisk;
 import com.vmware.vim25.VirtualIDEController;
 import com.vmware.vim25.VirtualLsiLogicController;
 import com.vmware.vim25.VirtualLsiLogicSASController;
 import com.vmware.vim25.VirtualMachineConfigSpec;
 import com.vmware.vim25.VirtualMachineFileInfo;
 import com.vmware.vim25.VirtualMachineGuestOsIdentifier;
+import com.vmware.vim25.VirtualMachineImportSpec;
 import com.vmware.vim25.VirtualMachineVideoCard;
 import com.vmware.vim25.VirtualSCSIController;
 import com.vmware.vim25.VirtualSCSISharing;
-import com.vmware.vim25.VirtualMachineImportSpec;
+import com.vmware.vim25.VmConfigFaultFaultMsg;
 import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec;
 import com.vmware.vim25.VmwareDistributedVirtualSwitchTrunkVlanSpec;
 import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec;
 import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanSpec;
-import java.io.FileWriter;
-import java.util.UUID;
 
 public class HypervisorHostHelper {
     private static final Logger s_logger = Logger.getLogger(HypervisorHostHelper.class);
@@ -153,6 +153,48 @@
     public static final String VSPHERE_DATASTORE_BASE_FOLDER = "fcd";
     public static final String VSPHERE_DATASTORE_HIDDEN_FOLDER = ".hidden";
 
+    protected final static Map<String, Integer> apiVersionHardwareVersionMap;
+
+    static {
+        apiVersionHardwareVersionMap = new HashMap<String, Integer>();
+        apiVersionHardwareVersionMap.put("3.5", 4);
+        apiVersionHardwareVersionMap.put("3.6", 4);
+        apiVersionHardwareVersionMap.put("3.7", 4);
+        apiVersionHardwareVersionMap.put("3.8", 4);
+        apiVersionHardwareVersionMap.put("3.9", 4);
+        apiVersionHardwareVersionMap.put("4.0", 7);
+        apiVersionHardwareVersionMap.put("4.1", 7);
+        apiVersionHardwareVersionMap.put("4.2", 7);
+        apiVersionHardwareVersionMap.put("4.3", 7);
+        apiVersionHardwareVersionMap.put("4.4", 7);
+        apiVersionHardwareVersionMap.put("4.5", 7);
+        apiVersionHardwareVersionMap.put("4.6", 7);
+        apiVersionHardwareVersionMap.put("4.7", 7);
+        apiVersionHardwareVersionMap.put("4.8", 7);
+        apiVersionHardwareVersionMap.put("4.9", 7);
+        apiVersionHardwareVersionMap.put("5.0", 8);
+        apiVersionHardwareVersionMap.put("5.1", 9);
+        apiVersionHardwareVersionMap.put("5.2", 9);
+        apiVersionHardwareVersionMap.put("5.3", 9);
+        apiVersionHardwareVersionMap.put("5.4", 9);
+        apiVersionHardwareVersionMap.put("5.5", 10);
+        apiVersionHardwareVersionMap.put("5.6", 10);
+        apiVersionHardwareVersionMap.put("5.7", 10);
+        apiVersionHardwareVersionMap.put("5.8", 10);
+        apiVersionHardwareVersionMap.put("5.9", 10);
+        apiVersionHardwareVersionMap.put("6.0", 11);
+        apiVersionHardwareVersionMap.put("6.1", 11);
+        apiVersionHardwareVersionMap.put("6.2", 11);
+        apiVersionHardwareVersionMap.put("6.3", 11);
+        apiVersionHardwareVersionMap.put("6.4", 11);
+        apiVersionHardwareVersionMap.put("6.5", 13);
+        apiVersionHardwareVersionMap.put("6.6", 13);
+        apiVersionHardwareVersionMap.put("6.7", 14);
+        apiVersionHardwareVersionMap.put("6.8", 14);
+        apiVersionHardwareVersionMap.put("6.9", 14);
+        apiVersionHardwareVersionMap.put("7.0", 17);
+    }
+
     public static VirtualMachineMO findVmFromObjectContent(VmwareContext context, ObjectContent[] ocs, String name, String instanceNameCustomField) {
 
         if (ocs != null && ocs.length > 0) {
@@ -2211,4 +2253,18 @@
             dsMo.makeDirectory(hiddenFolderPath, hyperHost.getHyperHostDatacenter());
         }
     }
+
+    public static Integer getHostHardwareVersion(VmwareHypervisorHost host) {
+        Integer version = null;
+        HostMO hostMo = new HostMO(host.getContext(), host.getMor());
+        String hostApiVersion = "";
+        try {
+            hostApiVersion = hostMo.getHostAboutInfo().getApiVersion();
+        } catch (Exception ignored) {}
+        if (hostApiVersion == null) {
+            hostApiVersion = "";
+        }
+        version = apiVersionHardwareVersionMap.get(hostApiVersion);
+        return version;
+    }
 }
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java
index 424027b..ff0120c 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java
@@ -744,4 +744,18 @@
         return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
     }
 
+    public static HostMO getHostMOFromHostName(final VmwareContext context, final String hostName) {
+        HostMO host = null;
+        if (com.cloud.utils.StringUtils.isNotBlank(hostName) && hostName.contains("@")) {
+            String hostMorInfo = hostName.split("@")[0];
+            if (hostMorInfo.contains(":")) {
+                ManagedObjectReference morHost = new ManagedObjectReference();
+                morHost.setType(hostMorInfo.split(":")[0]);
+                morHost.setValue(hostMorInfo.split(":")[1]);
+                host = new HostMO(context, morHost);
+            }
+        }
+        return host;
+    }
+
 }